/** * v1.8.0 — resolveCodeMeta(code, ctx?) 上下文派生回归测试 * * 覆盖: * - 17 条历史拒收样本 (来自 Edge rejected_messages 真实数据, 2026-05-16) * - R1: messageType=PROGRESS_UPDATE 终态降级 * - R2: parentCommandType=BATCH/COMPLEX + subCommandType=SIMPLE 子项降级 * - R3: EDGE_CACHE_* phase + sourceType !== EDGE → invariant 破坏标记 * - R4/R5/R7: PROGRAM_* / DETECT_* / SYNC_EXPORT 命名空间合规 (WARN, 不改 META) * - R6: EXPLICIT_META 终态 code 在 PROGRESS_UPDATE 中降级 (R1 覆盖) * - Q5: QUICK_DETECTION_ALL_OFFLINE status COMPLETED → FAILED * - Q8: R3 严格 reject 例外 * - Q9: _STEP_OK / _STEP_FAIL 显式 suffix * - 向后兼容: ctx=undefined 行为与 v1.7.8 完全一致 * * 设计文档: claude-docs/discussions/upgrade-guide-v1.8.0.md §3 * Round 协商: protocol-team-reply-to-consumer-v1.8.0.md + reply-2-to-consumer-v1.8.0.md */ import { resolveCodeMeta, MessageStatus, CodeMetaContext } from '../code-meta'; import { MessageType, CommandType } from '../index'; describe('v1.8.0 — resolveCodeMeta(code, ctx?) 上下文派生', () => { // ============================================================ // 1. 向后兼容: ctx=undefined 行为与 v1.7.8 完全一致 // ============================================================ describe('1. 向后兼容 (ctx=undefined)', () => { test('单参数调用与 v1.7.8 行为同 — SIMPLE 终态 _READ_SUCCESS', () => { const meta = resolveCodeMeta('SYNC_FUNCTIONS_SWITCH_READ_SUCCESS'); expect(meta.isTerminal).toBe(true); expect(meta.status).toBe(MessageStatus.COMPLETED); expect(meta.level).toBe('INFO'); expect(meta.appliedRules).toBeUndefined(); }); test('单参数调用 — EXPLICIT_META PROGRAM_COMPLETED', () => { const meta = resolveCodeMeta('PROGRAM_COMPLETED'); expect(meta.isTerminal).toBe(true); expect(meta.status).toBe(MessageStatus.COMPLETED); }); test('单参数调用 — 未知 code 返回 FALLBACK', () => { const meta = resolveCodeMeta('UNKNOWN_CODE_XYZ'); expect(meta.isTerminal).toBe(false); expect(meta.semantic).toBe('step_progress'); }); }); // ============================================================ // 2. R1: messageType=PROGRESS_UPDATE 终态降级 // ============================================================ describe('2. R1 — messageType=PROGRESS_UPDATE 终态降级', () => { test('SIMPLE 终态 _WRITE_SUCCESS 在 PROGRESS_UPDATE 中降级', () => { const ctx: CodeMetaContext = { messageType: MessageType.PROGRESS_UPDATE }; const meta = resolveCodeMeta('BARGRAPH_MISALIGNMENT_WRITE_SUCCESS', ctx); expect(meta.isTerminal).toBe(false); expect(meta.status).toBe(MessageStatus.IN_PROGRESS); expect(meta.semantic).toBe('step_success'); expect(meta.level).toBe('INFO'); expect(meta.appliedRules).toContain('R1'); }); test('SIMPLE 终态 _WRITE_FAILED 在 PROGRESS_UPDATE 中降级 (level + reqErr 保留)', () => { const ctx: CodeMetaContext = { messageType: MessageType.PROGRESS_UPDATE }; const meta = resolveCodeMeta('BARGRAPH_MISALIGNMENT_WRITE_FAILED', ctx); expect(meta.isTerminal).toBe(false); expect(meta.status).toBe(MessageStatus.IN_PROGRESS); expect(meta.semantic).toBe('step_failed'); expect(meta.level).toBe('ERROR'); // level 保留 expect(meta.requiresErrorBlock).toBe(true); // reqErr 保留 expect(meta.appliedRules).toContain('R1'); }); test('EXPLICIT_META PROGRAM_UPLOAD_FAILED 在 PROGRESS_UPDATE 中降级 (R6/R1 覆盖)', () => { const ctx: CodeMetaContext = { messageType: MessageType.PROGRESS_UPDATE }; const meta = resolveCodeMeta('PROGRAM_UPLOAD_FAILED', ctx); expect(meta.isTerminal).toBe(false); expect(meta.status).toBe(MessageStatus.IN_PROGRESS); expect(meta.semantic).toBe('step_failed'); expect(meta.level).toBe('ERROR'); expect(meta.requiresErrorBlock).toBe(true); }); test('COMMAND_RESPONSE 不触发 R1 — 终态保持', () => { const ctx: CodeMetaContext = { messageType: MessageType.COMMAND_RESPONSE }; const meta = resolveCodeMeta('BARGRAPH_MISALIGNMENT_WRITE_SUCCESS', ctx); expect(meta.isTerminal).toBe(true); expect(meta.status).toBe(MessageStatus.COMPLETED); expect(meta.appliedRules).toBeUndefined(); }); }); // ============================================================ // 3. R2: parentCommandType=BATCH/COMPLEX + subCommandType=SIMPLE 双保险 // ============================================================ describe('3. R2 — parentCommandType=BATCH/COMPLEX 子项降级', () => { test('父=BATCH 子=SIMPLE 终态 _READ_SUCCESS 即使无 messageType 也降级', () => { const ctx: CodeMetaContext = { parentCommandType: CommandType.BATCH, subCommandType: CommandType.SIMPLE, }; const meta = resolveCodeMeta('SYNC_FUNCTIONS_SWITCH_READ_SUCCESS', ctx); expect(meta.isTerminal).toBe(false); expect(meta.semantic).toBe('step_success'); expect(meta.appliedRules).toContain('R2'); }); test('父=COMPLEX 子=SIMPLE 终态 _WRITE_FAILED 降级', () => { const ctx: CodeMetaContext = { parentCommandType: CommandType.COMPLEX, subCommandType: CommandType.SIMPLE, }; const meta = resolveCodeMeta('BARGRAPH_MISALIGNMENT_WRITE_FAILED', ctx); expect(meta.isTerminal).toBe(false); expect(meta.semantic).toBe('step_failed'); expect(meta.requiresErrorBlock).toBe(true); }); test('父=SIMPLE 子=SIMPLE 不触发 R2 (SIMPLE 不是 BATCH/COMPLEX)', () => { const ctx: CodeMetaContext = { parentCommandType: CommandType.SIMPLE, subCommandType: CommandType.SIMPLE, }; const meta = resolveCodeMeta('SYNC_FUNCTIONS_SWITCH_READ_SUCCESS', ctx); expect(meta.isTerminal).toBe(true); expect(meta.appliedRules).toBeUndefined(); }); test('R2 不限 phase — phase=PROGRAM_UPLOAD 也触发 (Q13 设备端反馈)', () => { const ctx: CodeMetaContext = { parentCommandType: CommandType.BATCH, subCommandType: CommandType.SIMPLE, phase: 'PROGRAM_UPLOAD', }; const meta = resolveCodeMeta('BARGRAPH_MISALIGNMENT_WRITE_SUCCESS', ctx); expect(meta.isTerminal).toBe(false); expect(meta.appliedRules).toContain('R2'); }); }); // ============================================================ // 4. R3: EDGE_CACHE_* + sourceType !== EDGE → invariant 破坏 // ============================================================ describe('4. R3 — EDGE_CACHE invariant 严格 reject (Q8)', () => { test('phase=EDGE_CACHE_FETCH + sourceType=COMMAND → violationReason 标记', () => { const ctx: CodeMetaContext = { phase: 'EDGE_CACHE_FETCH', sourceType: 'COMMAND', }; const meta = resolveCodeMeta('EDGE_CACHE_FETCH_PROGRESS', ctx); expect(meta.violationReason).toBeDefined(); expect(meta.violationReason).toContain('EDGE_CACHE'); expect(meta.status).toBe(MessageStatus.FAILED); expect(meta.level).toBe('ERROR'); expect(meta.appliedRules).toContain('R3'); }); test('phase=EDGE_CACHE_READY + sourceType=EDGE → 合规 (不触发 R3)', () => { const ctx: CodeMetaContext = { phase: 'EDGE_CACHE_READY', sourceType: 'EDGE', }; const meta = resolveCodeMeta('EDGE_CACHE_READY_SUCCESS', ctx); expect(meta.violationReason).toBeUndefined(); }); }); // ============================================================ // 5. R4/R5/R7 命名空间合规 (WARN, 不改 META) // ============================================================ describe('5. R4/R5/R7 — 命名空间合规 (WARN 标记)', () => { test('R4: phase=PROGRAM_UPLOAD + code 不以 PROGRAM_ 开头 → R4-violation 标记', () => { const ctx: CodeMetaContext = { phase: 'PROGRAM_UPLOAD' }; const meta = resolveCodeMeta('FOREIGN_UPLOAD_COMPLETED', ctx); expect(meta.appliedRules).toContain('R4-violation'); }); test('R4: phase=PROGRAM_UPLOAD + code 以 PROGRAM_ 开头 → 合规', () => { const ctx: CodeMetaContext = { phase: 'PROGRAM_UPLOAD' }; const meta = resolveCodeMeta('PROGRAM_UPLOAD_PROGRESS', ctx); expect(meta.appliedRules ?? []).not.toContain('R4-violation'); }); test('R5: phase=QUICK_DETECTION_BARGRAPH_DETECT + code 不以 QUICK_DETECTION_ 开头 → R5-violation', () => { const ctx: CodeMetaContext = { phase: 'QUICK_DETECTION_BARGRAPH_DETECT' }; const meta = resolveCodeMeta('SOMETHING_ELSE_PROGRESS', ctx); expect(meta.appliedRules).toContain('R5-violation'); }); test('R7: phase=SYNC_EXPORT + code 不以 SYNC_MONITORING_ 开头 → R7-violation (Q11)', () => { const ctx: CodeMetaContext = { phase: 'SYNC_EXPORT' }; const meta = resolveCodeMeta('MONITORING_EXPORT_STARTED', ctx); expect(meta.appliedRules).toContain('R7-violation'); }); test('R7: phase=SYNC_EXPORT + code 以 SYNC_MONITORING_ 开头 → 合规', () => { const ctx: CodeMetaContext = { phase: 'SYNC_EXPORT' }; const meta = resolveCodeMeta('SYNC_MONITORING_EXPORT_STARTED', ctx); expect(meta.appliedRules ?? []).not.toContain('R7-violation'); }); }); // ============================================================ // 6. Q5: QUICK_DETECTION_ALL_OFFLINE status COMPLETED → FAILED // ============================================================ describe('6. Q5 — QUICK_DETECTION_ALL_OFFLINE 语义打架修复', () => { test('单维 base META 已修正为 FAILED+ERROR', () => { const meta = resolveCodeMeta('QUICK_DETECTION_ALL_OFFLINE'); expect(meta.isTerminal).toBe(true); expect(meta.status).toBe(MessageStatus.FAILED); expect(meta.level).toBe('ERROR'); expect(meta.semantic).toBe('failure'); expect(meta.requiresErrorBlock).toBe(true); }); }); // ============================================================ // 7. Q9: _STEP_OK / _STEP_FAIL 显式 suffix // ============================================================ describe('7. Q9 — _STEP_OK / _STEP_FAIL 显式 suffix', () => { test('_STEP_OK suffix 派生 step_success/INFO/IN_PROGRESS', () => { const meta = resolveCodeMeta('BARGRAPH_MISALIGNMENT_WRITE_STEP_OK'); expect(meta.isTerminal).toBe(false); expect(meta.semantic).toBe('step_success'); expect(meta.level).toBe('INFO'); expect(meta.status).toBe(MessageStatus.IN_PROGRESS); expect(meta.requiresErrorBlock).toBe(false); }); test('_STEP_FAIL suffix 派生 phase_failed/WARNING/IN_PROGRESS/无 errBlock', () => { const meta = resolveCodeMeta('BARGRAPH_MISALIGNMENT_WRITE_STEP_FAIL'); expect(meta.isTerminal).toBe(false); expect(meta.semantic).toBe('phase_failed'); expect(meta.level).toBe('WARNING'); expect(meta.requiresErrorBlock).toBe(false); // 与 _FAILED (req=true) 区别 }); }); // ============================================================ // 8. 17 条历史拒收样本完整覆盖 (来自 Edge rejected_messages 2026-05-16) // ============================================================ describe('8. 17 条历史拒收样本 — v1.8.0 应全部 0 reject', () => { // 模式 ① — BATCH 子项 PROGRESS_UPDATE 用 SIMPLE 终态 code (4 条) test('#1 BATCH 子项 BARGRAPH_MISALIGNMENT_WRITE_SUCCESS → step_success', () => { const ctx: CodeMetaContext = { messageType: MessageType.PROGRESS_UPDATE, parentCommandType: CommandType.BATCH, subCommandType: CommandType.SIMPLE, phase: 'BATCH_EXECUTE', }; const meta = resolveCodeMeta('BARGRAPH_MISALIGNMENT_WRITE_SUCCESS', ctx); expect(meta.status).toBe(MessageStatus.IN_PROGRESS); // wire status=IN_PROGRESS 一致 ✓ }); test('#2 BATCH 子项 BARGRAPH_MISALIGNMENT_WRITE_FAILED → step_failed (要 errBlock)', () => { const ctx: CodeMetaContext = { messageType: MessageType.PROGRESS_UPDATE, parentCommandType: CommandType.BATCH, subCommandType: CommandType.SIMPLE, phase: 'BATCH_EXECUTE', }; const meta = resolveCodeMeta('BARGRAPH_MISALIGNMENT_WRITE_FAILED', ctx); expect(meta.status).toBe(MessageStatus.IN_PROGRESS); expect(meta.requiresErrorBlock).toBe(true); }); test('#3 BATCH 子项 BARGRAPH_MISALIGNMENT_READ_SUCCESS → step_success', () => { const ctx: CodeMetaContext = { messageType: MessageType.PROGRESS_UPDATE, parentCommandType: CommandType.BATCH, subCommandType: CommandType.SIMPLE, phase: 'BATCH_EXECUTE', }; const meta = resolveCodeMeta('BARGRAPH_MISALIGNMENT_READ_SUCCESS', ctx); expect(meta.status).toBe(MessageStatus.IN_PROGRESS); }); test('#4 BATCH 子项 BARGRAPH_MISALIGNMENT_READ_FAILED → step_failed', () => { const ctx: CodeMetaContext = { messageType: MessageType.PROGRESS_UPDATE, parentCommandType: CommandType.BATCH, subCommandType: CommandType.SIMPLE, phase: 'BATCH_EXECUTE', }; const meta = resolveCodeMeta('BARGRAPH_MISALIGNMENT_READ_FAILED', ctx); expect(meta.status).toBe(MessageStatus.IN_PROGRESS); }); // 模式 ② — PROGRAM phase 中间事件 (10 条 — 主要 *_SKIPPED ×8 + UPLOAD_COMPLETED/FAILED ×2) test('#5 PROGRAM_UPLOAD_COMPLETED 在 PROGRESS_UPDATE 中 → step_success (R1)', () => { const ctx: CodeMetaContext = { messageType: MessageType.PROGRESS_UPDATE, phase: 'PROGRAM_UPLOAD', }; const meta = resolveCodeMeta('PROGRAM_UPLOAD_COMPLETED', ctx); // PROGRAM_UPLOAD_COMPLETED 不在 EXPLICIT_META, 走 SUFFIX `_COMPLETED` (phase_end / IN_PROGRESS) // 已经是 step META, R1 不需要进一步降级 expect(meta.status).toBe(MessageStatus.IN_PROGRESS); }); test('#6 PROGRAM_UPLOAD_FAILED 在 PROGRESS_UPDATE 中 → step_failed (R1+R6)', () => { const ctx: CodeMetaContext = { messageType: MessageType.PROGRESS_UPDATE, phase: 'PROGRAM_UPLOAD', }; const meta = resolveCodeMeta('PROGRAM_UPLOAD_FAILED', ctx); expect(meta.status).toBe(MessageStatus.IN_PROGRESS); expect(meta.semantic).toBe('step_failed'); }); test('#7-10 PROGRAM_PREPROCESS_RGB_SKIPPED → step_skipped (base SUFFIX)', () => { const ctx: CodeMetaContext = { messageType: MessageType.PROGRESS_UPDATE, phase: 'PROGRAM_PREPROCESS', }; const meta = resolveCodeMeta('PROGRAM_PREPROCESS_RGB_SKIPPED', ctx); expect(meta.semantic).toBe('step_skipped'); expect(meta.status).toBe(MessageStatus.IN_PROGRESS); }); test('#11-14 PROGRAM_PREPROCESS_HISTOGRAM_SKIPPED → step_skipped', () => { const ctx: CodeMetaContext = { messageType: MessageType.PROGRESS_UPDATE, phase: 'PROGRAM_PREPROCESS', }; const meta = resolveCodeMeta('PROGRAM_PREPROCESS_HISTOGRAM_SKIPPED', ctx); expect(meta.semantic).toBe('step_skipped'); }); // 模式 ③ — QUICK_DETECTION 子阶段 _COMPLETED level mismatch (3 条) test('#15-17 QUICK_DETECTION_BARGRAPH_DETECT_COMPLETED → phase_end (R5 合规, v1.9.0 phase 加 QUICK_DETECTION_ 前缀)', () => { const ctx: CodeMetaContext = { messageType: MessageType.PROGRESS_UPDATE, phase: 'QUICK_DETECTION_BARGRAPH_DETECT', }; const meta = resolveCodeMeta('QUICK_DETECTION_BARGRAPH_DETECT_COMPLETED', ctx); expect(meta.semantic).toBe('phase_end'); expect(meta.status).toBe(MessageStatus.IN_PROGRESS); expect(meta.appliedRules ?? []).not.toContain('R5-violation'); }); }); // ============================================================ // 9. PROGRAM_RESPONSE messageType 触发 R1 (Q12) // ============================================================ describe('9. Q12 — PROGRAM_RESPONSE 独立 wire messageType', () => { test('PROGRAM_RESPONSE 是终态消息, 不触发 R1 (与 COMMAND_RESPONSE 同行为)', () => { const ctx: CodeMetaContext = { messageType: MessageType.PROGRAM_RESPONSE }; const meta = resolveCodeMeta('PROGRAM_COMPLETED', ctx); expect(meta.isTerminal).toBe(true); // 终态保持 expect(meta.status).toBe(MessageStatus.COMPLETED); }); }); // ============================================================ // 10. DEVICE_LOG_RETRIEVE 设备日志获取 (v1.12.3) // ============================================================ describe('10. DEVICE_LOG_RETRIEVE — SIMPLE READ 终态', () => { test('DEVICE_LOG_RETRIEVE_SUCCESS → 终态 COMPLETED', () => { const meta = resolveCodeMeta('DEVICE_LOG_RETRIEVE_SUCCESS'); expect(meta.isTerminal).toBe(true); expect(meta.status).toBe(MessageStatus.COMPLETED); expect(meta.level).toBe('INFO'); expect(meta.semantic).toBe('success'); expect(meta.requiresErrorBlock).toBe(false); }); test('DEVICE_LOG_RETRIEVE_FAILED → 终态 FAILED + 需 error block', () => { const meta = resolveCodeMeta('DEVICE_LOG_RETRIEVE_FAILED'); expect(meta.isTerminal).toBe(true); expect(meta.status).toBe(MessageStatus.FAILED); expect(meta.level).toBe('ERROR'); expect(meta.semantic).toBe('failure'); expect(meta.requiresErrorBlock).toBe(true); }); test('COMMAND_RESPONSE 中 status=COMPLETED 与 SUCCESS code 一致 (Edge 校验通过)', () => { const ctx: CodeMetaContext = { messageType: MessageType.COMMAND_RESPONSE }; const meta = resolveCodeMeta('DEVICE_LOG_RETRIEVE_SUCCESS', ctx); expect(meta.status).toBe(MessageStatus.COMPLETED); }); }); });