/** * v1.7.8 — _BROADCAST_SUCCESS / _BROADCAST_FAILED ECAN 广播 WRITE 终态后缀回归测试 * * 触发:v1.7.7 wire 联调 req_1778824943659_4gaxtv (BARGRAPH_MISALIGNMENT_WRITE_BROADCAST_SUCCESS) * 命中 _SUCCESS → IN_PROGRESS step_success → 与 wire COMPLETED 终态不符 → 30s 假 timeout * * 修复:SUFFIX_RULES 新增 2 条规则(对称侧补完,v1.7.7 漏) * - _BROADCAST_FAILED → 终态 FAILED(优先级 > _FAILED,与 _READ_FAILED / _WRITE_FAILED / _ALL_FAILED 同层) * - _BROADCAST_SUCCESS → 终态 COMPLETED(优先级 > _SUCCESS,与 _READ_SUCCESS / _WRITE_SUCCESS / _ALL_SUCCESS / _PARTIAL_SUCCESS 同层) * * 设备端 wire-emit-codes.md §2 catalog:5 个光柱命令 × 2 终态 = 10 wire code 全部受 v1.7.7 误判 */ import { resolveCodeMeta, isKnownCode, MessageStatus, EXPLICIT_META } from '../code-meta'; describe('v1.7.8 — _BROADCAST_SUCCESS 终态后缀(5 命令家族 SUCCESS)', () => { test('BARGRAPH_MISALIGNMENT_WRITE_BROADCAST_SUCCESS 终态成功(修复真实联调)', () => { const meta = resolveCodeMeta('BARGRAPH_MISALIGNMENT_WRITE_BROADCAST_SUCCESS'); expect(meta.isTerminal).toBe(true); expect(meta.status).toBe(MessageStatus.COMPLETED); expect(meta.semantic).toBe('success'); // v1.10.4: level 扩展为 array (INFO | WARNING) 支持 Q4-v2 partial-success 路径 expect(meta.level).toEqual(['INFO', 'WARNING']); expect(meta.requiresErrorBlock).toBe(false); }); // v1.10.4 — _BROADCAST_SUCCESS level array (compressed cycle 第 4 次实证, 镜像 v1.10.3 Bug #3 修法) test('v1.10.4: SUFFIX_RULES._BROADCAST_SUCCESS level 支持 array (INFO|WARNING)', () => { // 5 个 BARGRAPH BROADCAST 命令家族 SUCCESS 都受益 const cmds = [ 'BARGRAPH_LED_SWITCH_WRITE_BROADCAST_SUCCESS', 'BARGRAPH_MISALIGNMENT_WRITE_BROADCAST_SUCCESS', 'BARGRAPH_TRAIN_LENGTH_WRITE_BROADCAST_SUCCESS', 'BARGRAPH_PLAYBACK_FORBID_WRITE_BROADCAST_SUCCESS', 'BARGRAPH_PROGRAM_PLAY_IMMEDIATELY_WRITE_BROADCAST_SUCCESS', ]; for (const code of cmds) { const meta = resolveCodeMeta(code); expect(Array.isArray(meta.level)).toBe(true); expect(meta.level).toContain('INFO'); // 全成功 path expect(meta.level).toContain('WARNING'); // partial-success path (Q4-v2 三阶段对齐) } }); test('BARGRAPH_LED_SWITCH_WRITE_BROADCAST_SUCCESS 终态', () => { const meta = resolveCodeMeta('BARGRAPH_LED_SWITCH_WRITE_BROADCAST_SUCCESS'); expect(meta.isTerminal).toBe(true); expect(meta.status).toBe(MessageStatus.COMPLETED); }); test('BARGRAPH_PLAYBACK_FORBID_WRITE_BROADCAST_SUCCESS 终态', () => { const meta = resolveCodeMeta('BARGRAPH_PLAYBACK_FORBID_WRITE_BROADCAST_SUCCESS'); expect(meta.isTerminal).toBe(true); expect(meta.status).toBe(MessageStatus.COMPLETED); }); test('BARGRAPH_TRAIN_LENGTH_WRITE_BROADCAST_SUCCESS 终态 (v1.10.0 §2 路径 b: PLAY_FRAMES_NUMBER → TRAIN_LENGTH)', () => { const meta = resolveCodeMeta('BARGRAPH_TRAIN_LENGTH_WRITE_BROADCAST_SUCCESS'); expect(meta.isTerminal).toBe(true); expect(meta.status).toBe(MessageStatus.COMPLETED); }); test('v1.10.1 §1: _FINAL 后缀派生 phase_end (非 fallback step_progress)', () => { // PROGRAM_COMPLETE_FINAL (v1.10.0 §1) + QUICK_DETECTION_COMPLETE_FINAL (v1.9.0 §B) // 都经 _FINAL SUFFIX_RULES 派生 semantic='phase_end' (v1.10.1 前 fallback step_progress) const meta1 = resolveCodeMeta('PROGRAM_COMPLETE_FINAL'); expect(meta1.isTerminal).toBe(false); expect(meta1.status).toBe(MessageStatus.IN_PROGRESS); expect(meta1.semantic).toBe('phase_end'); // ← v1.10.1 显式派生 const meta2 = resolveCodeMeta('QUICK_DETECTION_COMPLETE_FINAL'); expect(meta2.semantic).toBe('phase_end'); }); test('BARGRAPH_PROGRAM_PLAY_IMMEDIATELY_WRITE_BROADCAST_SUCCESS 终态', () => { const meta = resolveCodeMeta('BARGRAPH_PROGRAM_PLAY_IMMEDIATELY_WRITE_BROADCAST_SUCCESS'); expect(meta.isTerminal).toBe(true); expect(meta.status).toBe(MessageStatus.COMPLETED); }); test('v1.10.2 §1 + v1.10.3 §1: _COMPLETE_FINAL EXPLICIT_META 允许 partial-failure 语义 (level array)', () => { // v1.10.2 升级: 从 SUFFIX_RULES 派生 → EXPLICIT_META 显式 entry, requiresErrorBlock=false 放行 optional error block // v1.10.3 升级: level 从 'INFO' 单值锁死 → ['INFO','WARNING','ERROR'] array (修真 Self-reflection #12) // Edge validator 改 strict equality → array includes, 允许 partial-failure emit level=WARNING/ERROR const program = EXPLICIT_META['PROGRAM_COMPLETE_FINAL']; expect(program).toBeDefined(); expect(program.isTerminal).toBe(false); expect(program.status).toBe(MessageStatus.IN_PROGRESS); expect(program.semantic).toBe('phase_end'); expect(program.requiresErrorBlock).toBe(false); expect(Array.isArray(program.level)).toBe(true); expect(program.level).toEqual(['INFO', 'WARNING', 'ERROR']); const detect = EXPLICIT_META['QUICK_DETECTION_COMPLETE_FINAL']; expect(detect).toBeDefined(); expect(detect.isTerminal).toBe(false); expect(detect.status).toBe(MessageStatus.IN_PROGRESS); expect(detect.semantic).toBe('phase_end'); expect(detect.requiresErrorBlock).toBe(false); expect(Array.isArray(detect.level)).toBe(true); expect(detect.level).toEqual(['INFO', 'WARNING', 'ERROR']); }); test('v1.10.3 §1: 其他 EXPLICIT_META.level 仍为 string (向后兼容, type union 默认 string)', () => { const completed = EXPLICIT_META['PROGRAM_COMPLETED']; expect(completed).toBeDefined(); expect(typeof completed.level).toBe('string'); expect(completed.level).toBe('INFO'); }); test('v1.10.2 §1: PROGRAM ↔ QUICK_DETECTION _COMPLETE_FINAL EXPLICIT_META 镜像 invariant', () => { // 镜像设计: v1.10.0 §1 EmitProgramCompletePhase 来自 v1.9.0 §B EmitDetectCompletePhase // 双 entry 必须完全相同, 否则 spec drift expect(EXPLICIT_META['PROGRAM_COMPLETE_FINAL']).toEqual(EXPLICIT_META['QUICK_DETECTION_COMPLETE_FINAL']); }); }); describe('v1.7.8 — _BROADCAST_FAILED 终态后缀', () => { test('BARGRAPH_MISALIGNMENT_WRITE_BROADCAST_FAILED 终态失败 + requiresErrorBlock', () => { const meta = resolveCodeMeta('BARGRAPH_MISALIGNMENT_WRITE_BROADCAST_FAILED'); expect(meta.isTerminal).toBe(true); expect(meta.status).toBe(MessageStatus.FAILED); expect(meta.semantic).toBe('failure'); expect(meta.level).toBe('ERROR'); expect(meta.requiresErrorBlock).toBe(true); }); }); describe('v1.7.8 — 优先级回归', () => { test('_BROADCAST_SUCCESS > _SUCCESS(不掉到 step_success)', () => { const broadcast = resolveCodeMeta('XYZ_BROADCAST_SUCCESS'); expect(broadcast.isTerminal).toBe(true); expect(broadcast.semantic).toBe('success'); // 阶段成功(不含 BROADCAST/READ/WRITE/ALL/PARTIAL 后缀)仍走 _SUCCESS const step = resolveCodeMeta('PROGRAM_DOWNLOAD_HEADER_SUCCESS'); expect(step.isTerminal).toBe(false); expect(step.semantic).toBe('step_success'); }); test('_BROADCAST_FAILED > _FAILED(不掉到 phase_failed)', () => { const broadcast = resolveCodeMeta('XYZ_BROADCAST_FAILED'); expect(broadcast.isTerminal).toBe(true); expect(broadcast.semantic).toBe('failure'); // 阶段失败(不含 BROADCAST/READ/WRITE/ALL 后缀)仍走 _FAILED const phase = resolveCodeMeta('PROGRAM_DOWNLOAD_HEADER_FAILED'); expect(phase.isTerminal).toBe(false); expect(phase.semantic).toBe('phase_failed'); }); test('回归:v1.7.6/v1.7.7 已修的 SIMPLE / BATCH 不受影响', () => { // SIMPLE READ_SUCCESS 仍终态 const readSuccess = resolveCodeMeta('SYNC_FUNCTIONS_SWITCH_READ_SUCCESS'); expect(readSuccess.isTerminal).toBe(true); expect(readSuccess.semantic).toBe('success'); // SIMPLE READ_FAILED 仍终态 const readFailed = resolveCodeMeta('BARGRAPH_MISALIGNMENT_READ_FAILED'); expect(readFailed.isTerminal).toBe(true); expect(readFailed.semantic).toBe('failure'); // BATCH PARTIAL_SUCCESS 仍终态 const partial = resolveCodeMeta('BATCH_BARGRAPH_MISALIGNMENT_READ_PARTIAL_SUCCESS'); expect(partial.isTerminal).toBe(true); expect(partial.semantic).toBe('partial'); }); test('EXPLICIT_META 仍优先于所有 SUFFIX_RULES', () => { const explicit = resolveCodeMeta('SYNC_MONITORING_TABLE_READ_FAILED'); expect(explicit.isTerminal).toBe(true); expect(explicit.status).toBe(MessageStatus.FAILED); }); }); describe('v1.7.8 — isKnownCode 含反向 case', () => { test('BARGRAPH_MISALIGNMENT_WRITE_BROADCAST_SUCCESS is known', () => { expect(isKnownCode('BARGRAPH_MISALIGNMENT_WRITE_BROADCAST_SUCCESS')).toBe(true); }); test('BARGRAPH_MISALIGNMENT_WRITE_BROADCAST_FAILED is known', () => { expect(isKnownCode('BARGRAPH_MISALIGNMENT_WRITE_BROADCAST_FAILED')).toBe(true); }); test('反向:完全陌生的 code 不是已知(兜底验证)', () => { expect(isKnownCode('TOTALLY_UNRELATED_GARBAGE_XYZ')).toBe(false); }); });