Files
linuxcncWebWASM/doc-rtcp/xyzac-trt-web-wasm-implementation-plan.md

573 lines
25 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# `xyzac-trt.ini` Web/WASM 控制面板实施计划
文档状态:实施基线 v1.0
本计划完全以 [`xyzac-trt-control-panel-web-wasm-design.md`](xyzac-trt-control-panel-web-wasm-design.md) 为设计契约,目标是把以下 LinuxCNC 原生案例的控制面板、数据流和控制流迁移为 Worker/WASM/React/Three.js Web 控制台:
```text
linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini
```
它不是 AXIS 的截图复刻计划,而是面向行为、状态、错误、资源、轨迹、RTCP 和恢复结果的 Web-equivalent 实施计划。任何视觉实现都必须服从 Worker/WASM authoritative state。
“完全对标 LinuxCNC 源码”和“全部功能唯一来自 LinuxCNC WASM”定义为唯一权威合同,强制定义见 [`xyzac-trt-web-wasm-source-parity-contract.md`](xyzac-trt-web-wasm-source-parity-contract.md)。若本计划与该合同冲突,以源码对标合同的禁止项、source slice、WASM authority、first divergent tick 和 parity gate 为准。
## 1. 目标与不可变约束
### 1.1 交付目标
完成一个可在浏览器中运行的 XYZAC 五轴 TRT 控制台,覆盖:
1. exact-path 案例解析、资源闭包和启动诊断。
2. Dedicated Worker 中的 WASM 任务、解释器、TP、motion、XYZAC kinematics、HAL/IO 虚拟设备和固定 tick。
3. AXIS 等价的程序、MDI、Manual/Jog、Home、limit、override、spindle、coolant、tool 和 alarm 工作流。
4. `M428/M429/M430` switchkins/RTCP 切换、拒绝边界、状态确认和恢复。
5. XYZAC Cartesian pose、A/C 姿态、五个 joints、tool offset、rotation/axis offsets 和 canonical toolpath 的 Three.js 可视化。
6. protocol.v1 command/result/snapshot/event/stream、operation ledger、checkpoint、Worker 重启和 offline recovery。
7. native/Worker/WASM/React/Three.js 之间的确定性 parity 报告、错误样本和首个 divergent tick。
### 1.2 不可变约束
| 约束 | 实施要求 |
|---|---|
| WASM/Worker 权威 | React 不创建第二份 task、motion、kinematics 或 program authority;本地状态只能是 draft/pending |
| 固定 tick | 解释器、TP、motion、HAL、IO、kinematics、event、journal 以 logical tick 串行执行,不使用墙钟决定结果 |
| exact path | `xyzac-trt.ini` 中的 `HALFILE`、`POSTGUI_HALFILE`、`OPEN_FILE`、`SUBROUTINE_PATH`、`TOOL_TABLE` 和 `PYVCP` 按 exact path 解析,不按 basename 猜文件 |
| RTCP 原语 | `M428/M429/M430` 必须保留 remap 语义和 `motion.switchkins-type` 的确认,禁止前端直接写一个近似值 |
| 一致 gate | UI gate 只是 projection;Worker/runtime 必须再次检查 ESTOP/OFF/ON/HOME/IDLE/RUNNING/PAUSED/limit/fault/kinematics 条件 |
| 轨迹权威 | 预览和 Three.js 使用 canonical WASM trajectory/pose/joints;JS 不能重算 RTCP 结果冒充通过 |
| 单写者 | 一个 session 只有一个 Worker 写入 task/WASM/OPFS journal;多标签页只能观察或持有租约 |
| 幂等恢复 | 每个副作用命令有 operation id、ledger prepare/commit 和结果重查;超时不能盲目重发 |
| 能力拒绝 | 宿主路径、shell、真实硬件、socket、动态库和未授权 Python/HAL 能力稳定返回拒绝码 |
| 发布边界 | 没有官方 oracle、真实硬件、Safari/Firefox、OPFS crash 或许可证输入时保持 blocked,不升级为全 LinuxCNC parity |
## 2. 设计契约追溯
| 设计文档章节 | 本计划对应实施面 |
|---|---|
| §1 范围与版本边界 | `RTCP-00` source/runtime/version lock |
| §2 总体架构 | `RTCP-01` Worker topology、authority boundary |
| §3 启动与初始化 | `RTCP-02` exact case resolver/startup state machine |
| §4 AXIS 主控制面板 | `RTCP-05` UI domain、controls、status projection |
| §5 G-code 加载流 | `RTCP-04` PROGRAM_LOAD/preview/program ledger |
| §6 AUTO 运行流 | `RTCP-06` run/pause/resume/step/abort/restart |
| §7 MDI/Jog/Home/Tool/Offset | `RTCP-07` manual and device workflows |
| §8 SWITCHKINS/RTCP | `RTCP-08` M428/M429/M430/XYZAC kinematics |
| §9 状态真值 | `RTCP-03` snapshot/axis_state/gates |
| §10 Web/WASM mapping | `RTCP-09` protocol and frontend integration |
| §11 测试与限制 | `RTCP-10` parity/recovery/browser gates |
## 3. 功能范围矩阵
### 3.1 P0:必须先闭合的主链
| ID | 功能 | 原生来源/对照 | Web 结果 |
|---|---|---|---|
| P0-01 | 案例选择与启动 | `xyzac-trt.ini`、`run-5axis-rtcp.sh` | `TASK_READY` 或可定位 `BLOCKED_*` |
| P0-02 | 配置/资源图 | INI/HAL/XML/TBL/VAR/NGC/remap | exact path、source hash、missing edge |
| P0-03 | Task/ESTOP/OFF/ON | AXIS `stat.task_state` | axis_state + gate matrix |
| P0-04 | Mode MANUAL/MDI/AUTO | AXIS `ensure_mode`、`on_hal_status_mode_auto` | state transition + command result |
| P0-05 | Program load/open | AXIS `open_file_guts`、`c.program_open` | program hash、line count、preview |
| P0-06 | Canonical preview | AXIS canon/preview | stable segments/source lines |
| P0-07 | Program run | AXIS `task_run` | RUNNING、tick、active line |
| P0-08 | Pause/resume/step | AXIS `task_pause/resume/step` | PAUSED/RESUMED/step endpoint |
| P0-09 | Abort/restart | AXIS `task_stop/reload` | STOPPED/loaded、no duplicate side effect |
| P0-10 | MDI | AXIS `send_mdi_command` | parser result、queue gate、error |
| P0-11 | XYZAC kinematics | `xyzac-trt-kins.c`、`trtfuncs.c` | forward/inverse pose/joints |
| P0-12 | M428/M429/M430 | `428remap.ngc`、`429remap.ngc`、HAL net | active type + verified transition |
| P0-13 | Vismach pose/joints | `xyzac-trt-gui.py` | Three.js pose/joints/toolpath |
### 3.2 P1:操作完整性
| ID | 功能 | 关键边界 |
|---|---|---|
| P1-01 | XYZAC jog | X/Y/Z linear units,A/C angular units,按下/释放 stop |
| P1-02 | Home/unhome | 五 joint homing、共享开关、home sequence、重复 homing |
| P1-03 | Soft/hard limits | limit active、override limit、following error |
| P1-04 | Feed/rapid/spindle override | 范围、非有限值、暂停/ESTOP |
| P1-05 | Spindle/coolant | command/actual/at-speed、冷却状态、fault |
| P1-06 | Tool table/offset | `xyzac-trt.tbl`、tool offset、G43/G49/G43.1 |
| P1-07 | HAL/PyVCP | `type0/1/2-button`、legend、vismach-clear、HAL read |
| P1-08 | Alarm/event timeline | source、severity、operation id、acknowledge |
| P1-09 | Configuration diagnostics | startup/resource/HAL/remap errors |
### 3.3 P2:交付和恢复完整性
| ID | 功能 | 退出要求 |
|---|---|---|
| P2-01 | Checkpoint/journal | tick、program line、kinematics type、pose/joints、hash 可恢复 |
| P2-02 | Worker restart | 无重复 M428/M429、无重复 segment/IO/tool side effect |
| P2-03 | Offline project | 缓存资源、OPFS journal、配额和冲突可诊断 |
| P2-04 | Stream/backpressure | trajectory/HAL/log drop 有 cursor/gap/最终快照 |
| P2-05 | Browser matrix | Chromium/Firefox/Safari 逐项证据;缺环境保持 blocked |
| P2-06 | Native/WASM parity | normal/boundary/error/recovery + deterministic self-hash |
## 4. 目标架构
```text
React/Web UI
├── XyzacCaseView / ProgramView / ManualView / RtccpView / DiagnosticsView
├── Domain store: task/program/motion/kinematics/hal/devices/recovery
├── Pure gate selectors and source control IDs
└── WorkerClient only
│ protocol.v1 MessageEnvelope
▼
Dedicated sim.worker
├── ProtocolGateway + runtime schema validator
├── Session/Liveness/Lease manager
├── CommandLedger (prepare/ack/result/commit/reconcile)
├── XyzacCaseResolver + resource graph
├── SimScheduler (fixed logical tick)
├── WASM LinuxCncCompat
│ ├── Task/RS274/TP/Motion
│ ├── xyzac-trt forward/inverse
│ ├── remap M428/M429/M430
│ └── HAL/IO/tool/probe virtual devices
├── SnapshotPublisher + StateHash
├── OPFS journal/checkpoint/recovery
└── trajectory/HAL/log stream backpressure
│ authoritative snapshots/events
▼
React projection + Three.js XYZAC Vismach adapter
```
### 4.1 Authority ownership
| 数据 | 唯一 authority | React 是否可写 |
|---|---|---:|
| task state/mode/interp | WASM Task/Interpreter | 否 |
| program parsed state/line | WASM Interpreter/Task | 否 |
| TP queue/active segment | WASM TP | 否 |
| Cartesian pose/XYZAC joints | WASM Kinematics/Motion | 否 |
| switchkins type | WASM/HAL compatibility layer | 只能发请求 |
| homed/limit/following error | WASM Motion/Home/HAL | 否 |
| tool/offset/spindle/coolant | virtual IO/tool runtime | 只能发命令 |
| UI draft/selection | React local store | 是,但不等于运行态 |
| Three.js camera/layer toggle | React/renderer | 是,不影响 motion |
## 5. 实施任务队列
任务状态使用:`queued → in_progress → verified` 或 `in_progress → blocked`。每个任务完成时必须生成报告、自哈希、输入哈希、命令记录、错误边界和下一任务依赖。
### RTCP-00:源码、版本和案例锁定
**目标**:冻结 `xyzac-trt.ini`、所有引用资源、系统运行时和 source symbol 映射。
**直接输入**:
- `xyzac-trt.ini`
- `xyzac-trt.xml`
- `switchkins_postgui.hal`
- `demos/*.ngc`
- `remap_subs/*.ngc`
- `xyzac-trt-kins.c`、`trtfuncs.c`
- `xyzac-trt-gui.py`
- `context-lock.json`
**产物**:
- `coverage/xyzac-trt-web-source-lock.report.json`
- `web/workspace/xyzac-trt-source-contract.mjs`
- exact resource graph、source hash、runtime version record
**验收**:每个 INI path、HAL edge、PyVCP pin、remap、G-code 入口可追溯;缺失资源为明确 blocker。
### RTCP-01:Worker 拓扑和 LinuxCncCompat 外壳
**目标**:建立单 Worker/session/ledger/scheduler 边界,不实现五轴细节。
**产物**:
- `web/worker/xyzac-session.mjs`
- `web/worker/xyzac-scheduler.mjs`
- `web/worker/xyzac-command-ledger.mjs`
- `web/worker/test_xyzac_session.mjs`
**验收**:HELLO/CAPABILITIES/SESSION_ATTACH/SESSION_READY、seq、operation_id、取消、超时重查和重复命令测试通过;Worker 之外不能写 runtime。
### RTCP-02:Exact case resolver 和启动状态机
**目标**:把 `xyzac-trt.ini` 解析到 `TASK_NEW → CONFIG_RESOLVED → HAL_READY → RUNTIME_READY → TASK_READY`。
**要求**:
- 解析 `DISPLAY/TASK/HAL/RS274NGC/KINS/TRAJ/EMCIO`。
- 解析 `LIB:basic_sim.tcl` 的虚拟 HAL 边界。
- exact resolve `OPEN_FILE`、`SUBROUTINE_PATH`、`xyzac-trt.tbl`、`xyzac.var`、`xyzac-trt.xml` 和 `xyzac-trt-gui.py`。
- 识别 `BLOCKED_RESOURCE`、`BLOCKED_HAL`、`BLOCKED_INI`、`BLOCKED_STARTUP`。
**产物**:`web/workspace/xyzac-trt-case-loader.mjs`、startup snapshot、diagnostic report。
### RTCP-03:Authoritative snapshot、axis_state 和 gate matrix
**目标**:将 native task/motion/interp/home/limit/kinematics 状态统一为 Worker snapshot。
**产物**:
- additive `axis_state`
- `kinematics.active_type`
- `configuration.coordinates/joints/topology`
- `gates`(action/enabled/reason)
- `web/worker/test_xyzac_gate_matrix.mjs`
**验收**:ESTOP/OFF/ON/HOME/IDLE/RUNNING/PAUSED、limit/fault/tool/no-file/no-highlight 每项都有 gate reason 和状态哈希。
### RTCP-04:程序加载、canonical preview 和 program ledger
**目标**:实现 AXIS `open_file_guts → program_open → canon/preview → stat.file` 的 Worker/WASM 等价流程。
**要求**:
- source/path/hash/line count 固化。
- preview segment 带 id/source_line/start/end/motion_type/center/normal/turn。
- 解析错误、超限、非有限值、空文件和缺资源 fail closed。
- load/reload/restart 与 ledger/recovery 可重放。
**验收**:native 与 Worker 首个 segment、line count、preview hash、loaded file、invalid G-code 错误码一致。
### RTCP-05:程序运行控制和 AXIS workflow
**目标**:覆盖 Run/Pause/Resume/Step/Abort/Restart/Run-from-line。
**按钮约束**:
```text
RUN = machine_on && interp_idle && task_file
PAUSE = machine_on && interp_reading_or_waiting
RESUME = machine_on && interp_paused
STEP = machine_on && task_file
ABORT = machine_on && interp_running
RESTART = machine_on && interp_idle && task_file
RUN_LINE = RUN && highlight_line != null
```
**验收**:固定 tick 下 pause/resume 不重复 segment,abort 无重复副作用,restart 重置 program state 但保留正确 source hash。
### RTCP-06:MDI、Jog、Home 和 limit
**目标**:实现 XYZAC 手动控制。
**要求**:
- X/Y/Z 线性单位和 A/C 角度单位分离。
- pointerdown/keydown 只发一个 JOG_START;pointerup/keyup/blur/visibilitychange 必须发 JOG_STOP。
- MDI queue limit、running/paused/ESTOP gate 与 native 一致。
- home all、单 joint home、unhome、共享 home switch 和 limit override。
- following error、非有限速度、超范围轴拒绝。
**验收**:每个 X/Y/Z/A/C 轴有 normal/boundary/stop/fault/recovery 样本;A/C 不得被当作 linear mm。
### RTCP-07:HAL、PyVCP、tool、spindle、coolant 和 alarm
**目标**:把 `xyzac-trt.xml` 和 `switchkins_postgui.hal` 中的控件接入 Worker capability。
**功能**:
- type0/type1/type2 button 状态和 `kinstype.is-*` legend。
- `vismach-clear` 只清 visual plot。
- tool table、tool offset、G43/G49/G43.1、tool prepare/change。
- spindle command/actual/at-speed/direction、coolant、manual tool change。
- HAL pin read/write 白名单、类型和权限。
- alarm/event timeline、acknowledge、source file/line。
**验收**:HAL command 不能越权写任意 pin;tool/IO ack、timeout、abort、recovery 和 `REAL-EXCLUDED` 分类都有报告。
### RTCP-08:XYZAC kinematics 和 RTCP
**目标**:实现 `xyzac-trt-kins` 的 forward/inverse、tool offset、rotation/axis offset 和 switchkins。
**阶段拆分**:
1. K0:XYZAC 坐标/joint mapping、单位、limits、finite-value 校验。
2. K1:identity type 0,forward/inverse identity golden。
3. K2:TRT type 1,`trtKinematicsSetup`、XYZAC forward/inverse、`y-offset/z-offset`、tool-offset。
4. K3:userk type 2 capability boundary;无 userk 时稳定拒绝。
5. K4:M428/M429/M430 remap 与 `motion.switchkins-type` handshake。
6. K5:helix_ac/helix_bc、姿态变化、G93/arc、奇异/限位/非有限值。
7. K6:pause/resume/abort/restart/recovery 时 active kinematics type 和 pose/joints 保持一致。
**必须保存**:Cartesian pose、XYZAC joints、A/C angle、tool offset、rotation point、axis offsets、kinematics type、首个 divergent tick、state hash。
### RTCP-09:Protocol v1 和 React 控制台
**目标**:把现有 `axis-contract.mjs`、`AxisOperationController`、`PanelSnapshotV1` 扩展到 XYZAC。
**产物**:
- `KINEMATICS_SELECT`、`VISUAL_CLEAR`、`POWER` 等 additive commands。
- `xyzac-panel-snapshot.v1` additive view 或兼容扩展。
- React `XyzacTrtPanel`、`XyzacProgramPane`、`XyzacKinematicsControl`、`XyzacManualPanel`、`XyzacDiagnostics`。
- gate-aware controls、operation trace、alarm/recovery view。
**验收**:React 不直接调用 WASM/OPFS;所有 controls 只通过 WorkerClient;gate reason、pending、ack、result、error 状态可见。
### RTCP-10:Three.js XYZAC Vismach adapter
**目标**:使用 authoritative `visual.pose/joints/toolpath` 实现五轴模型。
**要求**:
- 机床结构对应 `xyzac-trt-gui.py`:table-x、saddle-y、spindle-z、tilt-a、rotate-c、tool-offset。
- pose/joints 与 toolpath 来自同一 `state_hash`/tick。
- camera/layer/clear 不改变 task/motion/program。
- canvas nonblank、A/C 旋转方向、tool offset、轨迹 active segment 和 resize/mobile 通过。
### RTCP-11:Journal、checkpoint、Worker restart 和 offline recovery
**目标**:恢复完整 XYZAC 运行态。
**checkpoint 最小字段**:
```text
context_id, case_id, source_hashes
simulation_tick, seq, state_hash
task_state, task_mode, interp_state, program_hash, current_line
kinematics_type, kinematics_transition, pose, joints
tool_offset, y_offset, z_offset, rotation_points
TP queue/active segment, HAL/IO/tool pending commands
```
**验收**:
- M428 在 checkpoint 前后不重复执行。
- 暂停程序恢复不重复 segment。
- tool/spindle/coolant/IO side effect 不重复。
- 损坏 checkpoint、缺资源、schema mismatch fail closed。
- Worker 重启后 endpoint pose/joints/program/kinematics/state hash 一致。
### RTCP-12:Native/Worker/Browser parity 和验收闭环
**目标**:形成 selected-case parity report,不冒充全 LinuxCNC release。
**矩阵**:
- Chromium desktop/mobile。
- Firefox/Safari 可用时运行;不可用保留 `HOST_EXCLUDED`/`blocked`。
- native AXIS + xyzac-trt-gui。
- Worker/WASM + React + Three.js。
- normal/boundary/error/limit/pause/abort/restart/recovery。
**产物**:
- `coverage/xyzac-trt-web-wasm-parity.report.json`
- native/worker command golden
- snapshot/trajectory/kinematics self-hash
- failure samples and first divergence report
## 6. 里程碑设计
### M0:Source and Case Contract
**包含**:RTCP-00。
**退出条件**:
- 所有直接引用资源均 exact-path indexed(不以抽样替代)。
- `xyzac-trt.ini` 的 INI/HAL/NGC/XML/Python/C source graph 自哈希稳定。
- 版本、context、运行时和能力边界记录完成。
- 缺失/未索引/宿主资源明确 blocked。
### M1:Worker Startup and State Authority
**包含**:RTCP-01、RTCP-02、RTCP-03。
**退出条件**:
- Worker session handshake、TASK_READY、CAPABILITIES 通过。
- snapshot 包含 task/motion/home/limit/program/kinematics/gates/configuration。
- ESTOP/OFF/ON/HOME/IDLE gate matrix 和 deterministic state hash 通过。
- React 尚未接入前,Worker 测试可独立验证 authority。
### M2:Program and AXIS Operation Workflow
**包含**:RTCP-04、RTCP-05、RTCP-06。
**退出条件**:
- load/preview/run/pause/resume/step/abort/restart/MDI/jog/home 全部有 native/Worker 对照。
- 每个操作的 gate reason、operation id、command result 和 state hash 可追溯。
- running/paused/ESTOP/limit/tool missing 的拒绝不被 UI 绕过。
### M3:HAL/IO/PyVCP and Device Closure
**包含**:RTCP-07。
**退出条件**:
- SWITCHKINS PyVCP 三个按钮和 vismach-clear 的 HAL 图可解析。
- spindle/coolant/tool/probe/hal read/write/ack/error 边界通过。
- 未授权 pin、外部进程、真实硬件被稳定拒绝。
### M4:XYZAC Kinematics and RTCP
**包含**:RTCP-08。
**退出条件**:
- type 0/1/2 切换和 M428/M429/M430 handshake 与 native 一致。
- XYZAC pose/joints/tool offset/axis offset/rotation point 的 forward/inverse golden 通过。
- helix/姿态变化、奇异、limits、non-finite、pause/abort/recovery 样本齐全。
- 首个 divergent tick 可定位;没有 JS kinematics fallback。
### M5:React/Protocol/Three.js Console
**包含**:RTCP-09、RTCP-10。
**退出条件**:
- React 所有按钮只通过 WorkerClient/OperationController。
- Three.js 使用 authoritative snapshot,A/C 方向、tool offset 和 active segment 正确。
- desktop/mobile DOM、canvas nonblank、keyboard/touch、错误/pending/gate UI 通过。
### M6:Recovery and Offline Runtime
**包含**:RTCP-11。
**退出条件**:
- checkpoint/restart/reconcile/replay 无重复副作用。
- OPFS journal、配额、schema mismatch、坏数据和离线重新打开可诊断。
- recovery endpoint state hash 与连续运行一致。
### M7:Selected-Case Parity Acceptance
**包含**:RTCP-12。
**退出条件**:
- native/Worker/WASM/React/Three.js 的选定案例完整矩阵通过。
- 结果报告有 source/input/output hash、命令、状态、首个差异 tick 和失败样本。
- Chromium/Firefox/Safari、官方 oracle、实时硬件、OPFS crash 和许可证边界按真实环境记录。
- 只能声明 `selected_case_verified`;任何外部 blocker 存在时保持 `STOP_RELEASE`。
## 7. 任务依赖图
```text
RTCP-00 source lock
│
▼
RTCP-01 session/ledger ── RTCP-02 case startup ── RTCP-03 snapshot/gates
│ │ │
└─────────────────────────┴──────────────────────┘
▼
RTCP-04 program/preview
│
┌──────────────┴──────────────┐
▼ ▼
RTCP-05 run/control RTCP-06 manual
│ │
└──────────────┬──────────────┘
▼
RTCP-07 HAL/IO/PyVCP
│
▼
RTCP-08 XYZAC/RTCP
│
┌───────────┴───────────┐
▼ ▼
RTCP-09 React/protocol RTCP-10 Three.js
│ │
└───────────┬───────────┘
▼
RTCP-11 recovery
│
▼
RTCP-12 parity gate
```
不得跳过 RTCP-03 的 authority/gate、RTCP-04 的 canonical program 或 RTCP-08 的 kinematics 就先做“漂亮界面”。
## 8. 统一任务报告格式
每个 `RTCP-*` 任务必须生成 JSON 报告,至少包含:
```json
{
"schema": "xyzac-trt-web-wasm-task-report.v1",
"task_id": "RTCP-08",
"milestone": "M4",
"status": "verified",
"context_id": "...",
"case_path": ".../xyzac-trt.ini",
"inputs": [{"path": "...", "sha256": "..."}],
"outputs": [{"path": "...", "sha256": "..."}],
"commands": [{"name": "...", "status": "passed", "stdout_sha256": "..."}],
"normal": {},
"boundaries": [],
"errors": [],
"first_divergent_tick": null,
"known_blockers": [],
"report_sha256": "..."
}
```
失败样本必须保留,不得删除失败、降低 gate、把资源缺失改成通过或用 JS preview/姿态镜像冒充 native/WASM parity。
## 9. 最低测试命令集合
任务开发期间按范围运行:
```bash
python3 scripts/validate_baseline.py
python3 scripts/validate_download_index.py
python3 scripts/validate_task_pointer.py nextTask1.md --lock context-lock.json
scripts/build-wasm.sh
ctest --test-dir build-native --output-on-failure
```
五轴专属命令:
```bash
./run-5axis-rtcp.sh
./run-5axis-rtcp.sh xyzbc-trt.ini
node web/worker/test_xyzac_trt_case.mjs
node web/worker/test_xyzac_program.mjs
node web/worker/test_xyzac_switchkins.mjs
node web/worker/test_xyzac_rtcp.mjs
node web/worker/test_xyzac_recovery.mjs
npm --prefix web/react run typecheck
npm --prefix web/react run build
```
命令名称在对应任务开始前必须实际创建并纳入报告;不存在的测试命令不能写成已通过。
## 10. 停止条件和阻塞处理
以下任一情况必须将当前任务标记为 blocked,并保留证据:
- `xyzac-trt.ini` 的 source/resource/hal/remap graph 不完整。
- native 运行时版本、锁定 source 或 ABI/protocol/schema 不一致。
- M428/M429 状态切换没有确认、重复执行或首个差异 tick 未定位。
- A/C 角度、tool offset、rotation point、joint pose 由 JS/React 生成。
- ESTOP、limit、following error、pause、abort、recovery 语义不可解释。
- 真实 HAL、动态 loader、宿主 Python、外部进程或真实硬件被错误标记为 Web-equivalent。
- Worker 重启造成重复 G-code、重复 tool/IO side effect 或 checkpoint hash 不一致。
- 只有 Chromium 截图而缺 Firefox/Safari/OPFS/oracle 证据,却要求全量 release。
- 缺少 owner/source/oracle/resource/browser/license 外部输入。
阻塞转移规则:
```text
技术缺陷 → 保留最小复现/错误码/首个 divergent tick → 修复同一任务
源码/ABI/protocol/schema 输入缺失 → SOURCE_BLOCKED → 等待审查输入
宿主/浏览器/硬件缺失 → HOST_EXCLUDED 或 REAL-EXCLUDED → 不伪造通过
发布/owner 决策缺失 → STOP_RELEASE → 不自动刷新 gate
```
## 11. 里程碑交付顺序
后续实施按以下顺序推进,不能在任务依赖未 verified 时跳级:
```text
M0 Source/Case Contract
→ M1 Worker Startup/Authority
→ M2 Program/AXIS Workflow
→ M3 HAL/IO/PyVCP
→ M4 XYZAC/RTCP Kinematics
→ M5 React/Protocol/Three.js
→ M6 Recovery/Offline
→ M7 Selected-Case Parity
```
每个里程碑完成后生成独立报告和自哈希,并将下一里程碑的直接输入、完成门禁、外部 blocker 和停止边界写入任务记录。完成单元测试或界面截图不等于该里程碑完成;必须同时满足 authority、数据流、控制流、错误、恢复和确定性要求。