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:
@@ -2,6 +2,9 @@ import type { JsonValue } from '@geo/shared-types'
|
|||||||
|
|
||||||
import type { AdapterExecutionResult } from './adapters/base'
|
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(
|
export function markAuthorizationFailureNonRetryable(
|
||||||
error: Record<string, JsonValue>,
|
error: Record<string, JsonValue>,
|
||||||
category: 'ai_platform_authorization' | 'media_account_authorization',
|
category: 'ai_platform_authorization' | 'media_account_authorization',
|
||||||
@@ -49,9 +52,7 @@ export function isDefinitivePublishFailure(result: AdapterExecutionResult): bool
|
|||||||
return true
|
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(
|
return definitivePublishFailurePattern.test(combined)
|
||||||
combined,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function asSubmitUncertainExecution(result: AdapterExecutionResult): AdapterExecutionResult {
|
export function asSubmitUncertainExecution(result: AdapterExecutionResult): AdapterExecutionResult {
|
||||||
|
|||||||
@@ -21,6 +21,20 @@ describe('publish retry result classification', () => {
|
|||||||
expect(asSubmitUncertainExecution(result).status).toBe('failed')
|
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', () => {
|
it('marks ambiguous submit-phase publish failures as unknown', () => {
|
||||||
const result: AdapterExecutionResult = {
|
const result: AdapterExecutionResult = {
|
||||||
status: 'failed',
|
status: 'failed',
|
||||||
|
|||||||
Reference in New Issue
Block a user