fix(desktop-client): treat title-length validation as definitive publish failure

Extract the definitive-failure regex into a named constant and add title
length/count validation patterns so submit-phase failures like
"标题长度应该在2-30字之间" stay non-retryable instead of being classified
as uncertain.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-08 22:31:56 +08:00
parent 25e706fb14
commit 9dd26145b3
2 changed files with 18 additions and 3 deletions
@@ -2,6 +2,9 @@ import type { JsonValue } from '@geo/shared-types'
import type { AdapterExecutionResult } from './adapters/base'
const definitivePublishFailurePattern =
/(?:csrf|forbidden|\b403\b|not_logged_in|login_required|token_missing|cookie_missing|challenge_required|risk_control|captcha|验证码|滑块|人机验证|安全验证|风控|风险|参数错误|内容为空|标题.{0,12}(?:长度|字数|过长|太长|超过|不能超过)|title[_\s-]*(?:length|too[_\s-]*long|too[_\s-]*short|max)|image_fetch_failed|cover_fetch_failed|upload_failed|signature_failed)/i
export function markAuthorizationFailureNonRetryable(
error: Record<string, JsonValue>,
category: 'ai_platform_authorization' | 'media_account_authorization',
@@ -49,9 +52,7 @@ export function isDefinitivePublishFailure(result: AdapterExecutionResult): bool
return true
}
return /(?:csrf|forbidden|\b403\b|not_logged_in|login_required|token_missing|cookie_missing|challenge_required|risk_control|captcha|验证码|滑块|人机验证|安全验证|风控|风险|参数错误|内容为空|image_fetch_failed|cover_fetch_failed|upload_failed|signature_failed)/i.test(
combined,
)
return definitivePublishFailurePattern.test(combined)
}
export function asSubmitUncertainExecution(result: AdapterExecutionResult): AdapterExecutionResult {
@@ -21,6 +21,20 @@ describe('publish retry result classification', () => {
expect(asSubmitUncertainExecution(result).status).toBe('failed')
})
it('keeps title length validation failures definitive after submit started', () => {
const result: AdapterExecutionResult = {
status: 'failed',
summary: '标题长度应该在2-30字之间',
error: {
code: 'toutiaohao_publish_failed',
message: '标题长度应该在2-30字之间',
},
}
expect(isDefinitivePublishFailure(result)).toBe(true)
expect(asSubmitUncertainExecution(result).status).toBe('failed')
})
it('marks ambiguous submit-phase publish failures as unknown', () => {
const result: AdapterExecutionResult = {
status: 'failed',