review.js
1.44 KB
/**
* 验收格式校验(平台只校验格式,判断由发布方做):checks 必须恰好覆盖全部清单项;
* 任一条不通过时动作必须是 reject,全部通过时必须是 accept / select_winner。
*
* @param {{ action: 'accept'|'reject'|'select_winner', checks: Array<{ id: string, pass: boolean, reason: string }>, item_keys: string[] }} input
* @returns {string|null} 违反规则时返回给调用方的提示;合规返回 null
*/
export function reviewViolation({ action, checks, item_keys }) {
const seen = new Set(checks.map((check) => check.id))
if (seen.size !== checks.length) return 'checks contains the same acceptance item more than once.'
const missing = item_keys.filter((key) => !seen.has(key))
if (missing.length > 0) return `checks must cover every acceptance item; missing: ${missing.join(', ')}.`
const unknown = checks.filter((check) => !item_keys.includes(check.id)).map((check) => check.id)
if (unknown.length > 0) return `checks contains unknown acceptance items: ${unknown.join(', ')}.`
const allPass = checks.every((check) => check.pass)
switch (action) {
case 'accept':
case 'select_winner':
return allPass ? null : `${action} requires every acceptance item to pass; reject instead.`
case 'reject':
return allPass ? 'reject requires at least one failed acceptance item; accept instead.' : null
default:
throw new Error(`Unhandled review action: ${action}`)
}
}