573 lines
25 KiB
Markdown
573 lines
25 KiB
Markdown
# `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、数据流、控制流、错误、恢复和确定性要求。
|