# Device-side Wire Emit Codes Catalog

> **目的**: 协议方（`@thejrsoft/subway-protocol`）SUFFIX_RULES / EXPLICIT_META 设计的 cross-check ground truth
> **维护方**: 设备端（sg7-31-win）
> **首版**: 2026-05-15（v1.7.7 ack + v1.7.8 cycle 副产物）
> **触发**: protocol-team `protocol-team-reply-to-broadcast-gap-v1.7.8.md` §5.2 NEGOTIATE 长期路径 + 设备端 ack §4.2 承诺
> **相关**: `docs/device-command-reference-20260513.md` 是面向第三方的命令 spec；本文档是设备端**实际 wire emit** 的命名 catalog

---

## 0. 使用说明

### 0.1 对协议方的价值

协议方 SUFFIX_RULES / EXPLICIT_META 设计依赖对设备端实际 wire emit 命名的认知。v1.7.5 / v1.7.6 / v1.7.7 cycle 反复出现"对称侧补完"漏洞（修 SUCCESS 漏 FAILED；修 SIMPLE 漏 BROADCAST），根因是协议方仓库不含设备端代码、无法 grep ground truth。

本文档作为**单点权威**回答以下问题：
- 设备端实际有哪些 wire `report.code` emit pattern？
- 每个 pattern 是否 terminal？
- 每个 pattern 当前在 v1.7.x SUFFIX_RULES / EXPLICIT_META 中如何派生？是否正确？

### 0.2 维护节奏

- 设备端每次新增 wire emit pattern 时更新本文档
- 设备端在 protocol release cycle 中作为 **Phase 5 release notice 配套交付物**
- 协议方在 SUFFIX_RULES / EXPLICIT_META 任何改动前应当 cross-check 本文档

### 0.3 表头约定

每个 emit pattern 表格列：

| 字段 | 含义 |
|------|------|
| Pattern | code 的字符串模板（含占位符）|
| Source | 设备端代码 file:line 锚点 |
| Terminal? | wire 上 `COMMAND_RESPONSE.status` 是否终态（COMPLETED/FAILED），决定 META 应当 `isTerminal: true` 还是 `false` |
| v1.7.8 META 派生 | 当前 v1.7.8 协议 SUFFIX_RULES / EXPLICIT_META 是否正确派生此 pattern |
| 备注 | 历史/陷阱/对称侧 |

---

## 1. SIMPLE 命令终态（READ / WRITE）

设备端单设备 READ/WRITE 命令的最终响应 code。wire 上是 `COMMAND_RESPONSE.status = COMPLETED` 或 `FAILED`。

### 1.1 命名 pattern

```
<COMMAND_CODE>_<OPERATION>_SUCCESS
<COMMAND_CODE>_<OPERATION>_FAILED

其中：
  COMMAND_CODE = canonical doc 第 4-7 章的 SIMPLE 命令代码（约 40+）
  OPERATION    = READ | WRITE
```

### 1.2 派生表

| Pattern | Terminal? | v1.7.8 META 派生 | 备注 |
|---------|-----------|-----------------|------|
| `<X>_READ_SUCCESS` | ✅ COMPLETED | SUFFIX `_READ_SUCCESS` → terminal COMPLETED INFO | v1.7.6 加 |
| `<X>_WRITE_SUCCESS` | ✅ COMPLETED | SUFFIX `_WRITE_SUCCESS` → terminal COMPLETED INFO | v1.7.6 加 |
| `<X>_READ_FAILED` | ✅ FAILED | SUFFIX `_READ_FAILED` → terminal FAILED ERROR | v1.7.7 加 |
| `<X>_WRITE_FAILED` | ✅ FAILED | SUFFIX `_WRITE_FAILED` → terminal FAILED ERROR | v1.7.7 加 |

### 1.3 Emit sources（部分举例，不完全）

| Emit point | Pattern 实例 |
|------------|-------------|
| `RaterDeviceAction.cs` 多处 | `RATER_LASER_SPACING_SETTING_READ_SUCCESS` 等 |
| `SyncDeviceAction.cs` 多处 | `SYNC_FUNCTIONS_SWITCH_READ_SUCCESS` 等 |
| `SyncProgramSwitchCommand` 等专用 Translator | `SYNC_PROGRAM_SWITCH_READ_SUCCESS` 等 |
| `BargraphDeviceAction.cs` (EthernetAction) | `BARGRAPH_LED_SWITCH_READ_SUCCESS` 等 |
| `FailureReportCodeBuilder.Build(commandCode, isReadOp)` | 动态生成 `<X>_<R|W>_FAILED`，被 `CommonDeviceAction.cs:236` / `NetworkToSerialDeviceAction.cs:103` 使用 |

### 1.4 ⚠️ 协议方注意事项

- **`_SUCCESS` SUFFIX_RULE 通用规则** 设计为 step_success / IN_PROGRESS（用于阶段进度，如 `PROGRAM_FETCH_DOWNLOAD_SUCCESS`）
- **`_READ_SUCCESS` / `_WRITE_SUCCESS` 长后缀**必须**在 `_SUCCESS` 之前**才能 shadow 命中
- 同理 `_READ_FAILED` / `_WRITE_FAILED` 必须在 `_FAILED` 之前

---

## 2. SIMPLE 命令广播终态（仅 WRITE）

某些 SIMPLE 命令支持广播（`deviceId=0`）。物理上只 WRITE 可广播——READ 广播会产生 CAN 总线多设备并发响应冲突，由 [`IndependentEcanActionProvider.cs:1156`](../jrsoft-csharp-sg7-31-win/JRSoft.Architecture/JRSoft.EcanAction/Factories/IndependentEcanActionProvider.cs#L1156) 拒收。

### 2.1 命名 pattern（**设备端当前两 pattern 并存**）

**Pattern A**（新架构 IndependentEcanActionProvider）:
```
<COMMAND_CODE>_WRITE_BROADCAST_SUCCESS
<COMMAND_CODE>_WRITE_BROADCAST_FAILED
```

**Pattern B**（旧架构 SG7DriverBridge + MainForm 兜底，**当前 runtime 不可达**）:
```
BROADCAST_<COMMAND_CODE>_WRITE_SUCCESS
BROADCAST_<COMMAND_CODE>_WRITE_FAILED
```

### 2.2 派生表

| Pattern | Terminal? | v1.7.8 META 派生 | 备注 |
|---------|-----------|-----------------|------|
| Pattern A SUCCESS `<X>_WRITE_BROADCAST_SUCCESS` | ✅ COMPLETED | SUFFIX `_BROADCAST_SUCCESS` → terminal COMPLETED INFO | v1.7.8 加（**正在 cycle 中**） |
| Pattern A FAILED `<X>_WRITE_BROADCAST_FAILED` | ✅ FAILED | SUFFIX `_BROADCAST_FAILED` → terminal FAILED ERROR | v1.7.8 加 |
| Pattern B SUCCESS `BROADCAST_<X>_WRITE_SUCCESS` | ✅ COMPLETED | SUFFIX `_WRITE_SUCCESS`（v1.7.6 已加）→ terminal COMPLETED INFO | dead code 候选，见 §2.4 |
| Pattern B FAILED `BROADCAST_<X>_WRITE_FAILED` | ✅ FAILED | SUFFIX `_WRITE_FAILED`（v1.7.7 已加）→ terminal FAILED ERROR | dead code 候选 |

### 2.3 Emit sources

| Pattern | Emit point | 受影响命令 |
|---------|------------|-----------|
| Pattern A | [`IndependentEcanActionProvider.cs:459,513`](../jrsoft-csharp-sg7-31-win/JRSoft.Architecture/JRSoft.EcanAction/Factories/IndependentEcanActionProvider.cs#L459) | 5 个：`BARGRAPH_LED_SWITCH` / `BARGRAPH_PLAYBACK_FORBID` / `BARGRAPH_MISALIGNMENT` / `BARGRAPH_TRAIN_LENGTH` / `BARGRAPH_PROGRAM_PLAY_IMMEDIATELY` (v1.10.0 §2: 删 raw `BARGRAPH_PLAY_FRAMES_NUMBER` dead spec, 统一公开命名 TRAIN_LENGTH) |
| Pattern B | [`SG7DriverBridge.cs:1307`](../jrsoft-csharp-sg7-31-win/JRSoft.Architecture/JRSoft.EcanAction/Adapters/SG7DriverBridge.cs#L1307) + [`MainForm.MessageBus.cs:1365`](../jrsoft-csharp-sg7-31-win/JRSoftSG7/MainForm.MessageBus.cs#L1365) | 同 Pattern A 5 命令 |

### 2.4 ⚠️ 设备端 backlog: Pattern B dead code 清理

Pattern B 触发路径 = 默认 `ECAN` adapter（不带 line 后缀） → EcanActionProvider → SG7DriverBridge.BuildBroadcastWriteResponse → IsBroadcast=true 标记 → MainForm.MessageBus.cs:1365 后处理。

当前 runtime 所有线路都注册了 `ECAN_<lineName>` (IndependentEcanActionProvider)，**默认 ECAN adapter 无 fallback 触发场景**。Pattern B 是 dead branch。

设备端 backlog：清理 dead code（与协议无关，不影响 SUFFIX_RULES 设计）。**清理完成后本文档将移除 Pattern B 行**。

---

## 3. BATCH 命令终态

`<COMMAND>` 命令支持 BATCH（多设备 deviceRange 如 `1-10`）时，最终响应汇总结果。

### 3.1 命名 pattern

```
BATCH_<COMMAND_CODE>_<OPERATION>_<RESULT>

其中：
  COMMAND_CODE = SIMPLE 命令代码
  OPERATION    = READ | WRITE
  RESULT       = ALL_SUCCESS | PARTIAL_SUCCESS | ALL_FAILED
```

### 3.2 派生表

| Pattern | Terminal? | v1.7.8 META 派生 | 备注 |
|---------|-----------|-----------------|------|
| `BATCH_<X>_<R\|W>_ALL_SUCCESS` | ✅ COMPLETED | SUFFIX `_ALL_SUCCESS` → terminal COMPLETED INFO | v1.7.7 加 |
| `BATCH_<X>_<R\|W>_PARTIAL_SUCCESS` | ✅ COMPLETED (WARNING) | SUFFIX `_PARTIAL_SUCCESS` → terminal COMPLETED WARNING | v1.7.7 加 |
| `BATCH_<X>_<R\|W>_ALL_FAILED` | ✅ FAILED | SUFFIX `_ALL_FAILED` → terminal FAILED ERROR | v1.7.7 加 |

### 3.3 Emit sources

| Emit point | 备注 |
|------------|------|
| `EcanHardwareAdapter` BATCH 汇总（line 1305+ 附近）| 动态根据 success/failed count 构造 |
| `EthernetHardwareAdapter` BATCH 路径 | 同上 |
| `MainForm.MessageBus.cs:1280-1327` | wire 发送前的最终构造（含 `commandCode` 拼接）|

### 3.4 Wire 实证

最近联调（2026-05-15 commit `c80f09f` 后）：
```
code: "BATCH_BARGRAPH_MISALIGNMENT_READ_PARTIAL_SUCCESS"  ← Success=1, Failed=1
code: "BATCH_BARGRAPH_MISALIGNMENT_WRITE_PARTIAL_SUCCESS"
```

---

## 4. CURED 复合操作进度（PROGRESS_UPDATE）

`SYNC_MONITORING_TABLE` 监播表导出、`SYNC_STARTING_SPEED_LIMIT` 启动速度限制 等 CURED 操作的中间进度。

### 4.1 命名 pattern

```
MONITORING_EXPORT_<STAGE>     (sub-stage progress)
MONITORING_EXPORT_DAY_PROGRESS
MONITORING_EXPORT_STARTED
```

### 4.2 派生表

| Pattern | Terminal? | v1.7.8 META 派生 | 备注 |
|---------|-----------|-----------------|------|
| `MONITORING_EXPORT_STARTED` | ❌ IN_PROGRESS | FALLBACK_META → IN_PROGRESS step_progress | sub-stage marker |
| `MONITORING_EXPORT_DAY_PROGRESS` | ❌ IN_PROGRESS | SUFFIX `_PROGRESS` → IN_PROGRESS step_progress | 正确 |
| `SYNC_MONITORING_TABLE_READ_SUCCESS` | ✅ COMPLETED | EXPLICIT_META → terminal COMPLETED INFO | v1.7.4 加 |
| `SYNC_MONITORING_TABLE_READ_PARTIAL_SUCCESS` | ✅ COMPLETED (WARNING) | EXPLICIT_META → terminal COMPLETED WARNING | v1.7.4 加 |
| `SYNC_MONITORING_TABLE_READ_FAILED` | ✅ FAILED | EXPLICIT_META → terminal FAILED ERROR | v1.7.4 加 |

### 4.3 Emit source

[`SyncDeviceAction.cs:670-920`](../jrsoft-csharp-sg7-31-win/JRSoft.Architecture/JRSoft.EthernetAction/DeviceAction/SyncDeviceAction.cs#L670) 监播表导出 CURED 操作 + [`DeviceResponseExtensions.cs:SendCuredProgressUpdate`](../jrsoft-csharp-sg7-31-win/JRSoft.Architecture/JRSoft.EthernetAction/DeviceAction/DeviceResponseExtensions.cs)。

---

## 5. PROGRAM 节目部署 phase 进度（PROGRESS_UPDATE）

节目上传 6 阶段 pipeline 的 phase 进度 code。

### 5.1 命名 pattern

```
PROGRAM_<PHASE>_<SUB_STAGE>_<EVENT>

PHASE       = FETCH | EXTRACT | PREPROCESS | COMPILE | UPLOAD | STATS | DEVICE_CHECK
SUB_STAGE   = DOWNLOAD / PACKAGE / VERIFY / FRAME / MOVE / GAMMA / RGB / HISTOGRAM / RESIZE / ADJUST_COLOR / ...
EVENT       = START | PROGRESS | SUCCESS | FAILED | SKIPPED | COMPLETED | RETRY | RETRY_PENDING | SLOW_WARN
```

实际 51 个 phase code（v1.7.x cycle 已实施），位于 [`ProgressPhases.cs`](../jrsoft-csharp-sg7-31-win/JRSoft.Architecture/JRSoft.EthernetAction/Utils/ProgressPhases.cs)。

### 5.2 派生表

| Pattern (举例) | Terminal? | v1.7.8 META 派生 | 备注 |
|----------------|-----------|-----------------|------|
| `PROGRAM_FETCH_START` | ❌ IN_PROGRESS | SUFFIX `_START` → IN_PROGRESS phase_start | 正确 |
| `PROGRAM_FETCH_PROGRESS` | ❌ IN_PROGRESS | SUFFIX `_PROGRESS` → IN_PROGRESS step_progress | 正确 |
| `PROGRAM_FETCH_DOWNLOAD_SUCCESS` | ❌ IN_PROGRESS | SUFFIX `_SUCCESS` → IN_PROGRESS step_success | 正确（sub-stage success，**不是** SIMPLE 终态） |
| `PROGRAM_FETCH_DOWNLOAD_FAILED` | ❌ IN_PROGRESS | SUFFIX `_FAILED` → IN_PROGRESS phase_failed | 正确 |
| `PROGRAM_FETCH_COMPLETED` | ❌ IN_PROGRESS | SUFFIX `_COMPLETED` → IN_PROGRESS phase_end | 正确 |
| `PROGRAM_FETCH_RETRY_PENDING` | ❌ IN_PROGRESS | SUFFIX `_RETRY_PENDING` | 正确 |
| `PROGRAM_FETCH_RETRY` | ❌ IN_PROGRESS | SUFFIX `_RETRY` | 正确 |
| `PROGRAM_FETCH_SLOW_WARN` | ❌ IN_PROGRESS | SUFFIX `_WARN` | 正确 |
| `PROGRAM_PREPROCESS_GAMMA_SKIPPED` | ❌ IN_PROGRESS | SUFFIX `_SKIPPED` | 正确 |

### 5.3 ⚠️ 协议方注意事项

- **PROGRAM 系列 `_SUCCESS` / `_FAILED` 是阶段事件**，不是命令终态
- v1.7.6/v1.7.7 加的 `_READ_SUCCESS` / `_WRITE_SUCCESS` / `_READ_FAILED` / `_WRITE_FAILED` 长后缀**不影响** PROGRAM 系列（因 PROGRAM 命令本身的 PHASE 名称不含 `READ` / `WRITE`）
- 验证回归测试：`PROGRAM_FETCH_FAILED` 仍命中 `_FAILED` → IN_PROGRESS phase_failed

---

## 6. PROGRAM 节目部署最终终态（COMMAND_RESPONSE）

### 6.1 EXPLICIT_META 覆盖

| Pattern | Terminal? | v1.7.8 META 派生 | 备注 |
|---------|-----------|-----------------|------|
| `PROGRAM_COMPLETED` | ✅ COMPLETED | EXPLICIT_META → terminal COMPLETED INFO | |
| `PROGRAM_PARTIAL_SUCCESS` | ✅ COMPLETED (WARNING) | EXPLICIT_META → terminal COMPLETED WARNING | v1.7.4 rename from PROGRAM_PARTIALLY_SUCCEEDED |
| `PROGRAM_ALL_FAILED` | ✅ FAILED | EXPLICIT_META → terminal FAILED ERROR | |
| `PROGRAM_NO_PROGRAMS` | ✅ COMPLETED | EXPLICIT_META → terminal COMPLETED INFO | |
| `PROGRAM_UPLOAD_FAILED` | ✅ FAILED | EXPLICIT_META → terminal FAILED ERROR | |
| `PROGRAM_UPLOAD_BUSY` | ✅ FAILED | EXPLICIT_META → terminal FAILED WARNING busy | |
| `PROGRAM_UPLOAD_CANCELLED` | ✅ FAILED | EXPLICIT_META → terminal FAILED INFO cancelled | |

### 6.2 Emit source

[`ProgramUploadOrchestrator.cs`](../jrsoft-csharp-sg7-31-win/JRSoft.Architecture/JRSoft.CompositeAction/Orchestrators/ProgramUploadOrchestrator.cs) 最终 EmitFinalReport。

---

## 7. QUICK_DETECTION 一键检测

### 7.1 阶段进度（PROGRESS_UPDATE）

```
QUICK_DETECTION_<PHASE>_<STAGE>_<EVENT>
```

举例：`QUICK_DETECTION_INIT_START`, `QUICK_DETECTION_NETWORK_SWITCH_PING`, `QUICK_DETECTION_BARGRAPH_TOPOLOGY_BUILT`, `QUICK_DETECTION_SYNC_DETECT_COMPLETED`...

| Pattern (举例) | Terminal? | v1.7.8 META 派生 | 备注 |
|----------------|-----------|-----------------|------|
| `QUICK_DETECTION_INIT_START` | ❌ IN_PROGRESS | SUFFIX `_START` → phase_start | 正确 |
| `QUICK_DETECTION_SWITCH_DETECT_COMPLETED` | ❌ IN_PROGRESS | SUFFIX `_COMPLETED` → phase_end | 正确 |
| `QUICK_DETECTION_BARGRAPH_DIAGNOSTICS` | ❌ IN_PROGRESS | FALLBACK_META → step_progress | 正确（无后缀匹配，兜底）|
| `QUICK_DETECTION_BARGRAPH_BOARD_RESULT` | ❌ IN_PROGRESS | FALLBACK_META → step_progress | 同上 |
| `QUICK_DETECTION_SYNC_RECOVER_PROGRESS` | ❌ IN_PROGRESS | SUFFIX `_PROGRESS` → step_progress | 正确 |

### 7.2 最终终态（COMMAND_RESPONSE）

| Pattern | Terminal? | v1.7.8 META 派生 | 备注 |
|---------|-----------|-----------------|------|
| `QUICK_DETECTION_ALL_ONLINE` | ✅ COMPLETED | EXPLICIT_META → terminal COMPLETED INFO | |
| `QUICK_DETECTION_PARTIAL_ONLINE` | ✅ COMPLETED (WARNING) | EXPLICIT_META → terminal COMPLETED WARNING | |
| `QUICK_DETECTION_ALL_OFFLINE` | ✅ COMPLETED (ERROR) | EXPLICIT_META → terminal COMPLETED ERROR | |
| `QUICK_DETECTION_FAILED` | ✅ FAILED | EXPLICIT_META → terminal FAILED ERROR | |
| `QUICK_DETECTION_BUSY` | ✅ FAILED (WARNING) | EXPLICIT_META → terminal FAILED WARNING busy | |
| `QUICK_DETECTION_FINAL` | ❌ IN_PROGRESS | FALLBACK_META → step_progress | DETECT_COMPLETE phase 的 progress 标记（**非**最终终态；最终终态由上面 5 个 EXPLICIT_META 给出）|

### 7.3 Emit sources

- 阶段进度：[`QuickDetectionOrchestrator.cs`](../jrsoft-csharp-sg7-31-win/JRSoft.Architecture/JRSoft.CompositeAction/Orchestrators/QuickDetectionOrchestrator.cs) 各 ReportPhaseStart / EmitStageCompleted
- 最终终态：[`MainForm.CompositeAction.cs:896 BuildQuickDetectionReport`](../jrsoft-csharp-sg7-31-win/JRSoftSG7/MainForm.CompositeAction.cs#L896)

---

## 8. 通用兜底 code（罕用 / 应优化）

某些场景设备端没有专门 emit 详细 code，使用通用兜底。

| Pattern | Terminal? | v1.7.8 META 派生 | 备注 |
|---------|-----------|-----------------|------|
| `OPERATION_SUCCESS` | ✅ COMPLETED | SUFFIX `_SUCCESS` → IN_PROGRESS step_success ⚠️ | **mismatch**：wire 是 COMPLETED，META 是 IN_PROGRESS。本是 wire 兜底，理想情况设备端应改用 `<COMMAND>_<OP>_SUCCESS` |
| `FAILURE` | ✅ FAILED | FALLBACK_META → IN_PROGRESS step_progress ⚠️ | **mismatch**：同上 |

### 8.1 设备端 backlog

- [`MainForm.MessageBus.cs:1340`](../jrsoft-csharp-sg7-31-win/JRSoftSG7/MainForm.MessageBus.cs#L1340) 当 result 未填 Report.code 时兜底为 `OPERATION_SUCCESS`，理想路径应改为命中下面"细分 commandCode + isReadOp" 路径（与 line 1345 `FailureReportCodeBuilder.Build` 对称）
- 设备端收敛这两个兜底后，本文档移除本节

---

## 9. AUTHORIZATION / REGISTRATION 消息（**不走 report.code**）

设备首次注册的几种 wire 消息：

| MessageType | 含义 |
|-------------|------|
| `REGISTER` (设备发) | 携带 licenseToken=DAK（已有）或不带（首次）|
| `REGISTER_ACK` | 携带 DAK 鉴权通过 |
| `REGISTER_PENDING` | 进入审批队列 |
| `AUTHORIZATION_GRANTED` | 审批通过 + 颁发 DAK |
| `AUTHORIZATION_REJECTED` | 审批拒收 |

### 9.1 ⚠️ 协议方注意事项

这 5 个**是 `BaseMessage.type` 字段值（MessageType enum）**，**不是 `report.code`**。不经过 SUFFIX_RULES / EXPLICIT_META 派生，走独立的 MessageValidator 校验。

[`ProtocolEnums.cs:59-74`](../jrsoft-csharp-sg7-31-win/JRSoft.Architecture/JRSoft.Model/Enums/ProtocolEnums.cs#L59) `MessageType` 枚举定义。

---

## 10. v1.7.8 SUFFIX_RULES 优先级总览

为了让协议方 cross-check 时不犯优先级错误，列出 v1.7.8 后 18 条 SUFFIX_RULES 完整顺序（长后缀优先）：

| 位置 | Suffix | Terminal | Status | 备注 |
|------|--------|---------|--------|------|
| 0 | `_READ_FAILED` | ✅ | FAILED | v1.7.7 |
| 1 | `_WRITE_FAILED` | ✅ | FAILED | v1.7.7 |
| 2 | `_ALL_FAILED` | ✅ | FAILED | v1.7.7 |
| **新 3** | **`_BROADCAST_FAILED`** | ✅ | **FAILED** | **v1.7.8（cycle 中）** |
| 4 | `_FAILED` | ❌ | IN_PROGRESS | phase_failed（原 v1.7.5 前）|
| 5 | `_RETRY_PENDING` | ❌ | IN_PROGRESS | retry_pending |
| 6 | `_RETRY` | ❌ | IN_PROGRESS | retry |
| 7 | `_WARN` | ❌ | IN_PROGRESS | v1.7.1 |
| 8 | `_SKIPPED` | ❌ | IN_PROGRESS | step_skipped |
| 9 | `_COMPLETED` | ❌ | IN_PROGRESS | phase_end |
| 10 | `_START` | ❌ | IN_PROGRESS | phase_start |
| 11 | `_PROGRESS` | ❌ | IN_PROGRESS | step_progress |
| 12 | `_READ_SUCCESS` | ✅ | COMPLETED | v1.7.6 |
| 13 | `_WRITE_SUCCESS` | ✅ | COMPLETED | v1.7.6 |
| 14 | `_ALL_SUCCESS` | ✅ | COMPLETED | v1.7.7 |
| 15 | `_PARTIAL_SUCCESS` | ✅ | COMPLETED (WARNING) | v1.7.7 partial |
| **新 16** | **`_BROADCAST_SUCCESS`** | ✅ | **COMPLETED** | **v1.7.8（cycle 中）** |
| 17 | `_SUCCESS` | ❌ | IN_PROGRESS | step_success（原）|

---

## 11. 历史教训汇总（协议方避免重蹈）

| Version | 漏掉 | Wire 真实终态 | META 错判 | 联调暴露 |
|---------|------|--------------|----------|---------|
| v1.7.0–v1.7.5 | SIMPLE `_READ_SUCCESS` / `_WRITE_SUCCESS` | COMPLETED | IN_PROGRESS step_success | req_1778811285514_oan6qa |
| v1.7.6 | SIMPLE `_READ_FAILED` / `_WRITE_FAILED` + BATCH 三态 | FAILED / COMPLETED | IN_PROGRESS phase_failed / step_success | req_1778824929909_jlvome / req_1778824891155_4rlb7b |
| v1.7.7 | SIMPLE 广播 `_BROADCAST_SUCCESS` / `_BROADCAST_FAILED` | COMPLETED / FAILED | IN_PROGRESS step_success / phase_failed | req_1778824943659_4gaxtv |

**根因模式**：每次"对称侧补完"都只修一侧，留新对称侧。

**改进路径**：本文档 + 协议方 prepublishOnly hook cross-check 本文档（reply §5.2 长期路径）。

---

— 设备端 @ 2026-05-15（v1.7.7 ack + v1.7.8 broadcast-gap ack 周期副产物 / 首版 / 后续每次设备端新增 wire emit pattern 时更新）
