Files
linuxcncWebWASM/docs/linuxcnc-web-wasm-system-flow-and-execution-baseline.md

264 lines
23 KiB
Markdown
Raw 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.
# LinuxCNC Web/WASM 系统流程与后续执行基线
更新时间:2026-08-21
本文件把现有代码、LinuxCNC 源程序、仿真配置和测试程序放在同一条可执行链上。它的目的不是再次定义产品范围,而是回答三个问题:当前代码究竟完成到哪一层、一个 LinuxCNC 仿真入口如何穿过前端/Worker/WASM、后续任务应从哪里开始以及如何验收。
规范入口仍然是 [`nextTask.md`](../nextTask.md)。本文件是工程梳理和任务分解,不替换 `context-lock.json`、协议 schema、覆盖矩阵或 release gate。
## 1. 先给结论
### 1.1 当前正式任务起点
当前正式指针是 `WAIT-OWNER-01`,状态为 `blocked`。它等待六项 owner decision 或新的 locked context input;`coverage/owner-decision-intake.report.json` 在输入缺失时只能生成 blocked report。此期间不能刷新 K8 release gate、创建新 context、把 `partial` 改成 `accepted`,也不能重复执行已完成的实现矩阵。
这与技术路线中的“实现任务已完成”并不矛盾:
| 层次 | 当前结论 | 证据 | 含义 |
|---|---|---|---|
| 基线 | LinuxCNC `2.10.0~pre0`,source SHA 已冻结 | `context-lock.json` | 源码变化必须重新建 context |
| WASM 单元能力 | posemath、解释器切片、motion queue、HAL、运动学、IO 均有 C ABI 和 native/WASM 测试 | `wasm-core/CMakeLists.txt`、`build-native`、`build-wasm` | 证明模块边界,不证明完整 Task 链 |
| Worker/存储适配 | 协议、配置/HAL preflight、虚拟设备、事件重放、workspace package、Python bridge 已有测试 | `web/worker`、`web/workspace`、`coverage/*report.json` | 证明适配器和错误边界 |
| 前端 | AppShell、WorkerClient、控制、状态、恢复、设备/HAL/机床视图已有 smoke | `web/app`、`coverage/frontend-m*.report.json` | 证明 UI 垂直切片,不证明所有真实命令已经驱动核心 |
| 配置矩阵 | 264 个注册配置条目、233 个入口;56 个 ready,208 个 blocked | `coverage/full-configuration-startup-matrix.report.json` | 入口闭包仍未完成 |
| 资源闭包 | 16,093 条资源边,15,112 resolved,981 blocked | `coverage/configuration-startup-closure.report.json` | 缺失资源不能被静默忽略 |
| 发布 | `candidate_eligible=false`、`STOP_RELEASE` | `coverage/release-candidate-gate.report.json` | 当前不是发布候选 |
### 1.2 代码上的真实边界
目前最容易误判的地方是:模块测试都通过,但完整 LinuxCNC 行为还没有贯通。具体表现为:
1. [`wasm-core/src/sim_api.c`](../wasm-core/src/sim_api.c) 仍是生命周期、加载标志、tick 和 pending event 的 bootstrap 状态;`sim_command` 不解析命令,`sim_step` 不调用解释器、TP、HAL、运动学或 IO。
2. [`web/worker/sim-session.mjs`](../web/worker/sim-session.mjs) 已经把协议、幂等、配置/HAL preflight、虚拟设备、Python 和恢复接起来,但 `PROGRAM_*`、`COMMAND` 等未知于设备的命令目前会落入通用 `COMMAND_RESULT`,不能视为已经执行了 LinuxCNC Task。
3. [`web/app/project-workflow.mjs`](../web/app/project-workflow.mjs) 默认使用 `MemoryStorage`;workspace package/migration/recovery 契约已验证,真实浏览器 OPFS、Service Worker 离线启动和崩溃后的实际恢复仍需浏览器矩阵验证。
4. 解释器、motion、kinematics、IO 的 C API 是可用的模块边界,但尚缺一个统一的 `sim_task`/session runtime,把“程序行 -> canonical -> TP -> IK -> joint motion -> feedback -> HAL/IO -> snapshot”作为一个原子固定 tick 执行。
因此,当前状态应写成“适配器和核心切片已验证,端到端仿真 Task 尚未完成”,不能写成“LinuxCNC 已完整移植”。
## 2. 一次仿真入口的实际流程
下面的流程区分了已经存在的代码路径和必须补齐的目标路径。
```text
浏览器 UI
-> WorkerClient 生成 protocol.v1 envelope
-> sim-worker.mjs 单 Worker 接收消息
-> SimSession 校验 schema/context/session/seq/tick
-> sim_protocol_accept (WASM C ABI)
-> HELLO/ATTACH 或 LOAD_WORKSPACE
-> configuration preflight (INI/HAL/资源图)
-> HAL preflight (component/pin/thread/function 图)
-> sim_load_workspace (当前仍为 bootstrap load flag)
-> command / program / step
-> [应补] sim_task: interpreter -> canonical -> TP -> motion/IK -> HAL/IO/Python
-> event log + replay timeline + state hash
-> snapshot/checkpoint/recovery
-> Worker envelope 返回
-> WorkerClient promise + domain reducer
-> 状态面板、设备面板、HAL 诊断、Three.js/Canvas 视图
-> workspace journal/package/OPFS 持久化
```
### 2.1 前端到 Worker
入口是 [`web/app/app.mjs`](../web/app/app.mjs) 和 [`web/app/worker-client.mjs`](../web/app/worker-client.mjs)。前端只发送带 `schema_version`、`context_id`、`session_id`、单调 `seq`、可选 `operation_id` 和 `payload` 的消息;前端不得读取 WASM 指针或直接写 Worker 内部状态。
`WorkerClient` 的主要调用对应关系如下:
| UI 操作 | Worker 消息 | 当前实现 |
|---|---|---|
| 连接/能力协商 | `HELLO` | 返回 capabilities |
| 建立会话 | `SESSION_ATTACH` | 调用 `sim_create`,进入 ready |
| 加载工程 | `LOAD_WORKSPACE` | 运行配置/HAL preflight,再调用 `sim_load_workspace` |
| 推进仿真 | `SIM_STEP` | 调用 `sim_step`,更新 tick 和 timeline |
| 读取状态 | `SNAPSHOT_REQUEST` | 返回 snapshot/checkpoint 摘要 |
| 控制命令 | `PROGRAM_*`、`HOME`、`ESTOP` 等 | 设备命令进入 `VirtualDevices`;程序/Task 命令仍待接入 |
| 恢复 | `CHECKPOINT`、`RECOVER` | 事件重放和 workspace 状态恢复已覆盖 |
### 2.2 Worker 到 WASM
[`web/worker/sim-session.mjs`](../web/worker/sim-session.mjs) 是唯一的 Worker 编排边界。它先调用 `_sim_protocol_accept`,再把能改变仿真结果的事件写入 `ReplayTimeline` 和 C event log。所有操作必须串行执行;相同 `operation_id` 的重复请求返回原结果并写入 `OPERATION_REPLAY`。
WASM 导出列表在 [`wasm-core/CMakeLists.txt`](../wasm-core/CMakeLists.txt) 中冻结,当前可以分为四类:
- 协议/生命周期:`sim_create`、`sim_load_workspace`、`sim_command`、`sim_step`、状态导入导出。
- 核心模块:`sim_interpreter_*`、`sim_motion_*`、`sim_kinematics_*`、`sim_posemath_*`。
- 运行时对象:`sim_hal_*`、`sim_io_*`、event log。
- 运动集成:`sim_kinematics_motion_*`、feedback、home/limit、switchkins、userk 和 registry。
后续不能继续增加孤立导出函数;应先把这些函数收拢进一个有明确状态、错误回滚和 snapshot 字段的 `sim_task` runtime,再由 Worker 调用。
### 2.3 固定 tick 的目标顺序
固定 tick 顺序属于行为契约,建议按以下顺序实现并为每一步保留前后状态 hash:
1. 接收本 tick 的 Task/MDI/jog/设备输入,检查命令权限、模式和 abort/estop。
2. 解释器读取一行 G-code/O-code/M-code,更新 modal、参数、当前行和 canonical queue。
3. 执行 canonical queue 的 TP:前瞻、速度/加速度限制、blend/exact stop、pause/abort。
4. 将笛卡尔 pose 送入 inverse kinematics,生成 joint command;奇异、越界和非有限值必须事务性失败。
5. 推进 joint/motion queue,执行正解 feedback,更新 axis/joint/pose/velocity/following error。
6. 按固定线程顺序执行 HAL component graph;组件失败不应推进半个 tick。
7. 推进 spindle/tool/probe/limit/estop 等虚拟 IO 和 Python callback;Python 只能使用 allowlist API。
8. 生成事件、报警、canonical、snapshot 和状态 hash;提交 checkpoint 或 journal 时才写持久层。
## 3. LinuxCNC 源程序、案例和测试的对应关系
LinuxCNC 的 `configs/sim` 不是文档附件,而是启动闭包和功能来源。下面先用少量代表性案例建立可跑的纵向切片,再扩展到全部 233 个入口。
| 功能域 | LinuxCNC 源程序 | 代表性仿真案例 | 代表性测试程序 | WASM/Worker 目标 | 前端工作流 |
|---|---|---|---|---|---|
| 启动、INI、资源 | `src/emc/ini/emcIniFile.cc`、`iniaxis.cc`、`inijoint.cc`、`initraj.cc` | `configs/sim/axis/minimal_xyz.ini`、`ini_with_includes/includes_demo.ini` | `tests/rs274ngc-startup`、`tests/startup-state`、`tests/io-startup` | 解析 section/include/变量、坐标和资源;构造 `sim_task_config` | 工程选择、预检错误定位、启动/重启 |
| 解释器、canonical | `src/emc/rs274ngc/*`、`src/emc/task/emccanon.cc`、`src/emc/nml_intf/interpl.cc` | `axis/minimal_xyz.ini` 的 `G0/G1`、`axis/iocontrolv2/owordm6-ui.ini` | `tests/interp/good`、`g52`、`m98m99`、`remap/oword-pycall`、`unit_tests/interp/*` | 从文件/MDI 读行,输出 canonical 和当前行;错误回到协议 | 程序编辑器、MDI、当前行、语法/运行错误 |
| TP、运动 | `src/emc/tp/tp.c`、`tc.c`、`tcq.c`、`blendmath.c`;`src/emc/motion/*` | `axis/minimal_xyz.ini`、`axis/gantry/gantry.ini` | `unit_tests/tp/test_blendmath.c`、`tests/motion/g0`、`tests/trajectory-planner/circular-arcs`、`tests/abort/*` | 固定 tick TP -> motion queue,支持 pause/abort/queue-buster | 运行/暂停/单步/轨迹预览/倍率 |
| 运动学 | `src/emc/kinematics/*kins.c`、`kins_util.c`、`switchkins.c` | `axis/gantry/gantry.ini`、`axis/ldelta.ini`、`axis/pentapod/pentapod.ini`、`axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini` | `tests/matrixkins`、运动学配置案例;官方 `unit_tests/kinematics/**` 在锁定来源中缺失 | registry + FK/IK + branch/singularity + feedback/home/limit | 轴/关节/姿态、3D 模型、故障和奇异性 |
| HAL | `src/hal/hal_lib.c`、`halmodule.cc`、`utils/halcmd*`、`src/hal/components/*.comp` | `axis/gantry/gantrysim.hal`、`axis/ini_hal_demo.ini` | `tests/hal-*`、`tests/basic`、`tests/edge/*`、`tests/module-loading/*`、`tests/hal-link-unlink` | 类型化 pin/signal/thread/function 图,固定顺序执行 | HAL browser、pin 值、连接图、波形 |
| IO、主轴、换刀、探针 | `src/emc/iotask/ioControl*.cc`、`src/emc/tooldata/*` | `axis/iocontrolv2/*`、`axis/lathe.ini`、`axis/gladevcp/probe.ini` | `tests/io-startup/*`、`tests/toolchanger/*`、`tests/tool-info/*`、`tests/t0/*` | 虚拟主轴/工具/探针状态机,故障、互锁和事件 | 主轴、工具、探针、报警和恢复 |
| Python/remap/filter | `src/emc/rs274ngc/interp_python.cc`、`interp_remap.cc`、`lib/python/*` | `axis/remap/*`、`axis/plasma/*`、`axis/ngcgui/*` | `tests/remap/*`、`tests/interp/python*`、`tests/interp/pymove` | Worker-only allowlist,异常和资源限额映射为 Task 错误 | remap 参数、宏、材料表、插件状态 |
| UI/VCP/可视化 | `src/emc/usr_intf/*`、`lib/python/rs274/glcanon.py`、`hal/user_comps/vismach/*` | `axis/gladevcp/*`、`axis/qtvcp/*`、`axis/vismach/*`、`qtplasmac/*` | UI test scripts、对应配置的启动测试和浏览器 E2E | descriptor -> Web component;轨迹/姿态只读 snapshot | 控制台、VCP、3D、示波器、配置编辑 |
| 持久化/恢复 | LinuxCNC 参数、tool table、日志语义 + 本项目 `web/workspace/*` | `sim.var`、`*.tbl`、工程 package | `tests/save.*`、`tests/source.0`,本项目 `test_recovery.mjs`、`test_migration.mjs` | checkpoint/event/journal/package 双向迁移、fail-closed | 工程导入导出、离线、刷新、恢复 |
### 3.1 第一批必须跑通的案例
先不要从最复杂的 QtVCP/PlasmaC/机器人界面开始。建议按以下顺序建立可重复的端到端样例:
1. `minimal_xyz.ini`:`HELLO -> ATTACH -> LOAD -> home -> PROGRAM_LOAD -> G0 X1 -> step -> snapshot`。它验证最小启动、解释器、trivkins、motion、snapshot 和前端状态。
2. `gantry/gantry.ini`:验证 `XYZY` 重复坐标、四关节映射、`HOME_SEQUENCE=-1` 同步回零和 CoreXY/gantry HAL。
3. `iocontrolv2/axis-iocontrolv2-demo.ini`:验证 `T/M6` 的 prepare/change、主轴停止互锁、tool table、IO pin 和失败恢复。
4. `vismach/5axis/table-rotary-tilting/xyzac-trt.ini`:验证姿态、TRT kinematics、tool orientation、FK feedback 和 3D 轨迹。
5. `remap/oword-pycall`:验证 O-word、Python remap、虚拟 API、异常、参数和 checkpoint/replay。
6. `hard-limits` + `abort/*`:验证 soft/hard limit、estop、abort、following error 和恢复后状态 hash。
7. `plasma/metric.ini` 或 `gladevcp/probe.ini`:验证虚拟探针/torch/材料表以及 UI/设备交互。
每个案例都必须保留原始配置资源边、native 运行结果、WASM 结果、首个 divergent tick、字段路径、错误码和状态 hash;只看页面截图不算通过。
## 4. 按技术路线的任务分层
下面把路线图的 M0-M5 和代码实际状态对齐。`verified` 表示该任务的实现证据已生成,不等于 release `accepted`。
| 阶段 | 目标 | 已有结果 | 未完成的关键闭环 | 退出条件 |
|---|---|---|---|---|
| M0 基线 | 来源、manifest、依赖、context lock | 8,053 source entries,321 test entries,清单生成器稳定 | 6,249 seed 仍未分配 feature owner | source/manifest/context hash 可重建 |
| M1 会话骨架 | protocol、create/load/step/snapshot/recover | C ABI、Worker session、event/replay、Python manifest 已验证 | `sim_load_workspace` 尚未真正构造核心 runtime;无完整 task state | 真实 WASM Worker 可加载最小工程并恢复 |
| M2 核心行为 | interpreter、canonical、TP、motion、kinematics | C 模块和 15 项 native CTest 通过;K0-K6 运动学切片已有 | 模块未在 `sim_task` 内按固定 tick 串联;完整 G/M/O 不全 | native/WASM golden 逐 tick 对照 |
| M3 虚拟设备 | HAL/PLC/IO、Python、恢复和故障 | M3-CFG/RT/FS/PY 报告均有 verified implementation evidence | 981 资源阻断,HAL 动态组件和真实 Python remap 未全执行 | 故障矩阵、配额、重启、离线全通过 |
| M4 Web 工作流 | 控制台、工程、3D、VCP、诊断 | FE-M1..M4 smoke 已通过 | UI 目前没有完整真实 G-code/Task 状态源;OPFS/跨浏览器不足 | 关键 UI workflow 与核心状态一致 |
| M5 发布 | 全配置、兼容、oracle、浏览器、许可证、回滚 | REG-01/03/04 证据已生成但 partial | 六项 release blocker 未解除 | 全部可计入条目 accepted,`STOP_RELEASE` 清除 |
## 5. 后续任务和依赖图
### 5.1 正式 release 轨道
```text
WAIT-OWNER-01 (当前 blocked)
-> OWNER-INPUT-01: 校验六项 blocker decision
-> CONTEXT-REFRESH-01: 审查并生成新 context lock
-> K8-REL-17: 重新生成 closure/audit/gate
-> 仅在 blocker 有证据解除后进入 release candidate
```
六项 decision 是:manifest ownership、accepted entries、official oracle、configuration resources、browser matrix、implementation license。没有外部输入时,正确动作是等待,不是自动重跑报告。
### 5.2 文档冲突的处理顺序
仓库中部分路线文档是在前端和 REG 任务完成前生成的,存在历史状态描述。例如 `docs/linuxcnc-web-wasm-next-work.md` 仍写着“没有前端应用壳”和“当前任务是 REG-01”,但 `web/app`、`coverage/frontend-m1..m4.report.json`、`coverage/full-configuration-startup-matrix.report.json` 已给出后续实现证据。执行时按以下优先级判断:
1. `nextTask.md` 的 Current/Task/Verify/Stop 是唯一接续指针;
2. `context-lock.json` 是源码、工具链、schema 和版本基线;
3. `coverage/*.report.json`、native/WASM/Worker 测试是实际状态证据;
4. 路线图、task map 和 next-work 用于理解目标和依赖,若与前三者冲突必须修正文档,而不是回退代码或重复任务。
本文件已经按这个顺序梳理;它不把旧文档中的 `REG-01`、FE-M1..M4 再次认领为当前任务。
### 5.3 技术实现轨道:第一个可执行起点
在 owner 输入和新 context 审查完成后,技术实现不应从运动学重写开始,而应从 `INT-01 sim_task 固定 tick 集成` 开始。它是前端、WASM 和后端融合的真正缺口。
| ID | 任务 | 主要变更 | 直接测试/产物 | 依赖 |
|---|---|---|---|---|
| INT-01 | 建立 `sim_task` 状态对象和 C ABI | 统一 interpreter/TP/motion/kinematics/feedback/HAL/IO/Python 引用;定义 mode、program、line、pause、abort、alarm、state hash | `wasm-core/include/sim_task.h`、native/WASM task test、ABI report | M1 ABI、protocol v1 |
| INT-02 | `PROGRAM_LOAD/RUN/PAUSE/RESUME/ABORT/STEP` 真正执行 | Worker workspace 文件 -> G-code 行流 -> `sim_interpreter_execute`;未知命令和非法模式 fail-closed,不再通用 `verified` | `minimal_xyz` E2E、`tests/interp/*` 迁移结果、command golden | INT-01、configuration resolver |
| INT-03 | TP -> IK -> motion -> FK 固定 tick | 复用 `sim_kinematics_motion`、feedback 和 `sim_motion_queue`;实现事务回滚、queue-buster、奇异/限位错误 | `motion/g0`、`trajectory-planner`、gantry/TRT scenarios;首个差异 tick report | INT-01/02、K0-K6 |
| INT-04 | HAL/IO/Python 进入同一 tick | 配置图实例化 HAL;设备命令由 `sim_io` 作为权威源;M6、主轴、探针、estop 与 Task 状态互锁 | `io-startup`、`toolchanger`、`hard-limits`、`remap/oword-pycall` | INT-03、M3 RT/PY |
| INT-05 | 配置资源到 runtime 的启动闭包 | 将 resolver 的 resolved rows 转成可加载 workspace;对 981 blocked rows 给出 source/line/code;处理 `.var/.tbl/.ngc/.py/.xml/.hal` | `REG-01` 每入口 ready/blocked/error;configuration startup report | M3-CFG、INT-01 |
| INT-06 | Python/remap/filter 真执行 | Pyodide Worker bridge 加入 session/task callback、参数、异常、时间/内存限额;宿主能力一律拒绝 | `tests/remap/*`、python session/replay、bridge report | INT-02、M3-PY |
| INT-07 | 真实 OPFS 与 Worker 重启恢复 | 实现 OPFS adapter、journal commit、checkpoint、lease 和 offline cache;MemoryStorage 仅保留测试替身 | browser reload/crash/quota/offline matrix、migration/rollback report | M3-FS、INT-01 |
| INT-08 | 前端改为权威 Task snapshot | `WorkerClient` 增加 program/MDI/jog/override/subscribe;reducer 消费真实 snapshot/event,不用本地假状态 | 浏览器 E2E:运行/暂停/单步/报警/恢复;FE report 升级 | INT-02/04、FE-M1..M4 |
| INT-09 | 3D 轨迹和机床模型 | 由 snapshot 的 pose/joints/toolpath 驱动 Three.js;支持 axis/gantry/TRT/机器人姿态和故障可视化 | vismach samples、canvas/WebGL pixel/nonblank、性能矩阵 | INT-03、INT-08 |
| INT-10 | 全量配置启动和差异闭环 | 运行 233 entrypoints;按 ready/blocked/error 分类,不删样本;逐个关联 source/resource/component | `coverage/full-configuration-startup-matrix.report.json`、native/WASM/Worker summaries | INT-05/06/07/08 |
任务顺序中,INT-01 至 INT-04 是功能主链,INT-05 至 INT-07 是运行时闭环,INT-08/09 是前端融合,INT-10 是规模化回归。任何任务都不能通过降低检查、删除 blocked 样本或把资源缺失标为 `REAL-EXCLUDED` 来“完成”。
## 6. 测试和验收办法
### 6.1 四层测试
| 层 | 测试内容 | 当前命令/来源 | 作用 |
|---|---|---|---|
| L0 基线 | context、source、manifest、pointer、下载索引 | `validate_baseline.py`、`validate_task_pointer.py`、脚本 unittest | 防止在错误源码或错误任务上工作 |
| L1 native C | `sim_*` ABI、posemath、interpreter、motion、kinematics、HAL、IO | `ctest --test-dir build-native --output-on-failure`,15 项 | 算法和错误码的快速反馈 |
| L2 WASM/Worker | Emscripten exports、协议、配置/HAL preflight、设备、Python、replay/recovery | `node web/worker/test_*.mjs`、WASM tests | 验证浏览器运行时边界 |
| L3 浏览器/E2E | WorkerClient、命令幂等、UI 状态、OPFS、离线、3D、跨浏览器 | `web/app/test_*.mjs`、后续 Playwright/浏览器矩阵 | 验证用户可见工作流和恢复 |
### 6.2 每个功能切片的最小验收包
每个 INT/REG 任务必须同时包含:
- 一个正常案例,例如 `G0 X1` 或 spindle start/stop;
- 一个边界案例,例如重复 modal、queue full、奇异点、超速或缺资源;
- 一个错误/报警案例,例如 syntax、limit、estop、Python capability denied;
- 一个 pause/resume/abort/recovery 案例;
- 一个持久化或 Worker 重启案例(适用时);
- native 结果、WASM 结果、事件顺序、当前行、错误码、状态 hash 和首个 divergent tick。
### 6.3 参考命令
开始任何实现任务前执行:
```bash
python3 scripts/validate_baseline.py
python3 scripts/validate_download_index.py
python3 scripts/validate_task_pointer.py
python3 -m unittest discover -s scripts -p 'test_*.py' -v
ctest --test-dir build-native --output-on-failure
```
完成一个核心垂直切片后至少执行:
```bash
node web/worker/test_wasm_session.mjs
node web/worker/test_sim_session.mjs
node web/worker/test_configuration_preflight.mjs
node web/worker/test_hal_preflight.mjs
node web/worker/test_virtual_devices.mjs
node web/worker/test_workspace_session_integration.mjs
node web/app/test_frontend_m1.mjs
node web/app/test_frontend_m2.mjs
node web/app/test_frontend_m3.mjs
node web/app/test_frontend_m4.mjs
```
## 7. 当前阻塞和处理原则
| 阻塞 | 数量/现象 | 正确处理 |
|---|---:|---|
| manifest seed 无 owner | 6,249 | owner assignment;不能本地猜测并升级 accepted |
| 资源闭包 | 997 missing、91 unresolved、59 unindexed、3 unregistered startup | 按 source/line 逐项补资源或经审查明确阻断;不能 basename 猜测覆盖 |
| 官方 oracle | 锁定来源缺少 `linuxcnc/unit_tests/kinematics/**` 和 recovery roots | 补充真实官方输入并新建 context,或由 owner 批准替代 oracle;不能把 matrixkins 冒充官方 |
| 浏览器矩阵 | context 中 Chromium/Firefox/Safari minimum 为 TBD;当前只测 Chromium | owner 锁定最低版本,执行三浏览器 workflow/offline/fault/performance |
| 实现许可证 | 57 个 Web/WASM 条目 `blocked_unassigned` | 完成 SPDX/NOTICE 决策;上游 LinuxCNC 许可证不能自动覆盖新实现 |
| 端到端 Task | `sim_api` bootstrap,Worker 未串联 interpreter/TP/IK/HAL/IO | 以 INT-01 为技术起点,先固定状态/ABI/错误回滚,再扩展功能 |
## 8. 任务完成定义
一个任务只有在以下条件全部满足时才能标记 `verified`:
1. 代码、manifest/source map 和协议/ABI 变更互相可追溯;
2. 正常、边界、错误、恢复测试均存在,且测试不依赖删除样本或静默降级;
3. native/WASM(适用时)和 Worker/browser(适用时)结果可重复;
4. snapshot、event、checkpoint、operation ledger 的状态 hash 能重建;
5. 性能、内存、OPFS 配额和离线影响有记录;
6. 失败时有明确 error code、source path/line、rollback point 和下一任务;
7. 仍然受发布 blocker 影响的任务保持 `partial`/`blocked`,不得伪装为 `accepted`。
项目最终完成不是“页面能点”或“15 个 CTest 全绿”,而是:任意纳入范围的 `configs/sim` 入口都能进入 `READY` 或给出可诊断的 fail-closed 错误;典型 G-code/IO/运动学/恢复场景在 native、WASM 和浏览器状态上可复现;所有来源、资源、测试、oracle、许可证和排除项都有闭合证据。