Files
cnc_wams/wasm-port/working/03-推进台账.md
2026-07-09 18:12:01 -04:00

2120 lines
133 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.
# 03-推进台账
## 2026-07-08 10:18 EDT
### 本轮目标
按用户要求从源头 `/home/mes123456/cnc_wams/wasm-port` 取消旧字段输入兼容,不再让 task status JSON 输出旧顶层字段。
### 本轮做了什么
1. 修改 `linuxcnc_task_hal_wasm.cpp``status_json()`,移除 `taskTopLevelStatus``rcsStatus`、顶层 `task``servoCycle` 和顶层 `motionStatus` 输出。
2. 将旧 `task``motionStatus.motion` 中仍需要的字段收拢到 `emcStatus.task``emcStatus.motion`
3. 更新 WASM、SDK、status contract 和 state matrix 测试,所有 task status 读取路径均只消费 `emcStatus`,并对旧顶层字段做负向断言。
4. 同步更新 `01``02``04``11``12` 文档口径,新增 T-056源头取消旧 status 字段兼容输出。
5. 重建 `task-hal` wasm并运行四个直接相关 Node 验证。
### 影响文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_status_json_contract.mjs`
- `wasm-port/tests/wasm/node/verify_task_hal_sdk.mjs`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tests/wasm/node/verify_task_state_matrix.mjs`
- `wasm-port/working/01-项目功能内容.md`
- `wasm-port/working/02-项目程序开发详细步骤.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/11-WASM核心状态机边界与后续完善路线.md`
- `wasm-port/working/12-status-json-LinuxCNC对标方案.md`
### 当前结论
T-056 已完成。`lctask_read_status_json()` 的 task/motion/io/top 状态入口收口为 `emcStatus`,旧顶层字段不再输出;直接相关 Node 验证均通过。
## 2026-07-08 09:30 EDT
### 本轮目标
按用户明确指定的两个文件完成并复核:
- `/home/mes123456/cnc_wams/wasm-port/working/11-WASM核心状态机边界与后续完善路线.md`
- `/home/mes123456/cnc_wams/wasm-port/working/12-status-json-LinuxCNC对标方案.md`
### 本轮做了什么
1. 读取两个目标文档,确认 `12-status-json-LinuxCNC对标方案.md` 中 SJ-1 到 SJ-5 已进入 `04-任务矩阵.md` 的 T-051 到 T-055`11-WASM核心状态机边界与后续完善路线.md` 已记录这些批次闭合。
2. 复核 `04-任务矩阵.md`,确认 T-001 到 T-055 均为完成,当前推进指针为“下一条优先任务:无”。
3. 检查 `tools/verify_task_status_json_contract.sh``tools/verify_task_full_closure.sh`,确认 status JSON contract gate 已纳入 full closure。
4. 扫描 working、docs、tools、runtime、tests 中的 `StandaloneEmcStatus``emcStatus`、SJ/T 编号和 contract gate 锚点,确认 runtime、测试、文档均有对应覆盖。
5. 执行 `./tools/verify_task_full_closure.sh`,验证 task-HAL WASM build、WASM smoke、SDK smoke、state matrix、motion sync、StandaloneEmcStatus、no-JSON 主路径、status JSON contract、working closure、source reuse/drift docs 和 readiness contract。
6. 执行 `git diff --check`,确认当前差异无 whitespace error。
### 影响文件
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/05-验收证据.md`
### 当前结论
目标文件 `11``12` 中定义的当前全部工作已完成并通过复核SJ-1 到 SJ-5 对应 T-051 到 T-055status JSON contract gate 已纳入 full closure全量闭合脚本最终输出 `task_full_closure_status=ok``git diff --check` 无输出。
## 2026-07-08 09:26 EDT
### 本轮目标
按用户要求复核并完成 `/home/mes123456/cnc_wams/wasm-port/working` 全部工作,确认当前任务矩阵、闭合 gate 和执行证据均无未闭合项。
### 本轮做了什么
1. 读取 `wasm-port/working/README.md``04-任务矩阵.md``03-推进台账.md``05-验收证据.md`,确认当前文档声明 T-001 到 T-055 均为完成,下一条优先任务为“无”。
2. 检查仓库根目录和 `wasm-port/AGENTS.md`,确认本轮同时受根目录中文日志规则和 `wasm-port` LinuxCNC source reuse / 额外日志规则约束。
3. 扫描 `wasm-port/working``tools``docs``runtime``tests` 中的开放标记,确认出现的“后续”主要是已文档化的保守边界或新增任务入口,不是当前矩阵未完成任务;矩阵任务行均为“完成”。
4. 执行 `./tools/verify_task_full_closure.sh`,完成 task-HAL WASM 构建、WASM smoke、SDK smoke、state matrix、motion sync、StandaloneEmcStatus、no-JSON 主路径、status JSON contract、working closure、source reuse/drift docs 和 readiness contract 验证。
5. 全量闭合脚本通过,最终输出 `task_full_closure_status=ok`
### 影响文件
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/05-验收证据.md`
### 当前结论
`wasm-port/working` 当前全部工作已完成并复核通过。任务矩阵无待办、进行中或阻塞项T-051 到 T-055 的 status JSON contract 已纳入 full closure全量闭合 gate 输出 `task_full_closure_status=ok`
## 2026-07-08 09:12 EDT
### 本轮目标
修正上一轮误判:`11-WASM核心状态机边界与后续完善路线.md``12-status-json-LinuxCNC对标方案.md` 中的 SJ-1 到 SJ-5 是实际后续任务,不能只因 `04-任务矩阵.md` 显示“无”就判定全部完成。本轮将 SJ-1 到 SJ-5 补入矩阵并闭合。
### 本轮做了什么
1. 重新读取 `11-WASM核心状态机边界与后续完善路线.md``12-status-json-LinuxCNC对标方案.md`,确认 SJ-1 到 SJ-5 均有明确目标和验收标准。
2. 更新 `04-任务矩阵.md`,新增并闭合 T-051 到 T-055
- T-051 / SJ-1规范 `emcStatus.motion.traj`
- T-052 / SJ-2规范 task current/read/motion line 和 callLevel。
- T-053 / SJ-3规范 `emcStatus.motion.axis[]``joint[]`
- T-054 / SJ-4规范 IO/aux/tool/coolant 边界。
- T-055 / SJ-5引入 status JSON contract gate。
3. 修改 `linuxcnc_task_hal_wasm.cpp`
- `StandaloneEmcTaskStatus` 新增 currentLine/readLine/motionLine/callLevel。
- `StandaloneEmcMotionStatus` 新增 axis command/feedback 和 joint command/feedback 数组。
- `StandaloneEmcIoStatus` 新增 reason。
- `status_json()` 新增 `schemaVersion=1``emcStatus.motion.traj``emcStatus.motion.axis[]``emcStatus.motion.joint[]``emcStatus.io.aux/tool/coolant`
4. 更新 WASM、SDK 和 state matrix 测试,断言新 `emcStatus` 字段与旧兼容字段同源。
5. 新增 `tests/wasm/node/verify_task_status_json_contract.mjs``tools/verify_task_status_json_contract.sh`,并将该 gate 纳入 `tools/verify_task_full_closure.sh`
6. 更新 `11``12`、source reuse、drift、compatibility 文档和对应文档一致性 gate让 T-051 到 T-055 不再只是“后续路线”。
7. 确认 direct `./tools/build_task_hal_wasm.sh` 在未加载 emsdk 的 shell 中会因 `emcc: command not found` 失败;使用 `source /home/mes123456/emsdk/emsdk_env.sh` 后构建通过。
8. 运行新增 contract gate、WASM smoke、SDK smoke、state matrix均通过。
9. 运行 `./tools/verify_task_full_closure.sh`,确认新增 status JSON contract gate 已纳入全量闭合链,最终输出 `task_full_closure_status=ok`
### 影响文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tests/wasm/node/verify_task_hal_sdk.mjs`
- `wasm-port/tests/wasm/node/verify_task_state_matrix.mjs`
- `wasm-port/tests/wasm/node/verify_task_status_json_contract.mjs`
- `wasm-port/tools/verify_task_status_json_contract.sh`
- `wasm-port/tools/verify_task_full_closure.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/tools/verify_task_working_closure.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
- `wasm-port/working/11-WASM核心状态机边界与后续完善路线.md`
- `wasm-port/working/12-status-json-LinuxCNC对标方案.md`
### 当前结论
T-051、T-052、T-053、T-054、T-055 已完成。上一轮“全部完成”的判断漏掉了 `11``12` 中的 SJ 批次;本轮已将这些批次纳入矩阵、实现、测试、文档和 full closure gate且全量闭合通过。active G/M code、active settings、offsets 仍按 `12` 的字段映射表保留为后续 source-anchored 扩展,不在本轮 SJ-1 到 SJ-5 验收范围内。
## 2026-07-08 09:00 EDT
### 本轮目标
按用户要求完成 `/home/mes123456/cnc_wams/wasm-port/working` 全部工作,复核当前任务矩阵、闭合文档和全量 gate确认没有待办、进行中或阻塞项残留。
### 本轮做了什么
1. 读取仓库和 `wasm-port` 的 AGENTS 规则,确认本轮需遵守 `wasm-port` 的 LinuxCNC source reuse 边界,并在结束后追加中文执行日志。
2. 检查 `wasm-port/working/README.md``04-任务矩阵.md``03-推进台账.md``05-验收证据.md`,确认当前文档声明 T-001 到 T-050 均已完成,下一条优先任务为“无”。
3. 使用 `rg` 扫描 `working``docs``tools``runtime``tests` 中的开放标记;结果只包含历史台账/决策记录中的旧记录、矩阵状态说明、vendor three.js TODO 和文档化的保守边界,没有当前矩阵开放任务。
4. 执行 `./tools/verify_task_full_closure.sh`,完成 task-HAL WASM 构建、WASM smoke、SDK smoke、state matrix、motion/HAL sync、StandaloneEmcStatus、no-JSON 主路径、working closure、source reuse/drift docs 和 readiness contract 验证。
5. 执行 `git diff --check -- wasm-port/working wasm-port/tools wasm-port/docs wasm-port/runtime wasm-port/tests`,确认当前相关差异没有 whitespace error。
### 影响文件
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/05-验收证据.md`
### 当前结论
`wasm-port/working` 当前全部工作已闭合:任务矩阵无待办/进行中/阻塞项,下一条优先任务为“无”,全量闭合验证通过并输出 `task_full_closure_status=ok`。本轮没有修改 runtime 行为,只追加最终复核台账和验收证据。
## 2026-07-08 08:55 EDT
### 本轮目标
对标 `/home/mes123456/cnc_wams/linuxcnc`,完善 WASM 中解决 `status JSON` 的方案,明确 LinuxCNC `EMC_STAT` / status buffer 到 WASM `StandaloneEmcStatus -> status JSON` 的映射路线。
### 本轮做了什么
1. 查阅上游 `linuxcnc/src/emc/nml_intf/emc.hh`,确认 task mode/state、exec/interp、traj mode 和 NML status type 等枚举来源。
2. 查阅上游 `linuxcnc/src/emc/nml_intf/emc_nml.hh`,确认 `EMC_STAT` 聚合 `EMC_TASK_STAT``EMC_MOTION_STAT``EMC_IO_STAT`,其中 motion 再聚合 `EMC_TRAJ_STAT`、joint、axis、spindle、synch IO 等。
3. 查阅当前 `linuxcnc_task_hal_wasm.cpp` 中的 `StandaloneEmcStatus``sync_standalone_emc_status()``status_json()``write_status_snapshot()``lctask_read_status_json()`
4. 新增 `12-status-json-LinuxCNC对标方案.md`
- 固定 `status JSON` 是 status buffer 的 host/browser 序列化格式。
- 明确禁止 motion JSON/status JSON 反向驱动 task/motion 状态机。
- 定义 `emcStatus` 作为新增 LinuxCNC 对标字段的主对象。
- 定义 LinuxCNC 字段到 WASM 事实源和 JSON 位置的映射表。
- 拆分 SJ-1 到 SJ-5 后续实施批次。
5. 更新 `README.md``01-项目功能内容.md``02-项目程序开发详细步骤.md``07-emctaskmain周期对标蓝图.md``11-WASM核心状态机边界与后续完善路线.md`,接入该方案。
6. 更新 `04-任务矩阵.md`,新增并闭合 T-050。
7. 更新 `05-验收证据.md``06-决策记录.md`,记录本轮方案和验证。
### 影响文件
- `wasm-port/working/README.md`
- `wasm-port/working/01-项目功能内容.md`
- `wasm-port/working/02-项目程序开发详细步骤.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
- `wasm-port/working/07-emctaskmain周期对标蓝图.md`
- `wasm-port/working/11-WASM核心状态机边界与后续完善路线.md`
- `wasm-port/working/12-status-json-LinuxCNC对标方案.md`
### 当前结论
T-050 已完成。后续在 WASM 中解决 status JSON 时,应先扩展 C/C++ `StandaloneEmcStatus` 或后续 `EMC_STAT` 等价容器,再从最后一次 status write 导出 `emcStatus` JSON`task``motionStatus` 字段只作为兼容视图。后续实现按 SJ-1 到 SJ-5 拆任务推进。
## 2026-07-08 08:18 EDT
### 本轮目标
按用户要求完善 `wasm-port/working` 文档固定“WASM 程序作为核心状态机实现运行载体JSON 只作为边界通信格式”的后续开发口径。
### 本轮做了什么
1. 新增 `11-WASM核心状态机边界与后续完善路线.md`,明确 WASM/C++、JS/SDK、JSON 三层职责。
2. 更新 `README.md`,把新文档加入索引和使用规则,并记录后续 WASM 完善的默认边界。
3. 更新 `01-项目功能内容.md`,新增 WASM 核心状态机边界表,明确 status JSON 不作为事实源。
4. 更新 `02-项目程序开发详细步骤.md`,新增“阶段 7后续 WASM 核心状态机完善”。
5. 更新 `06-决策记录.md`,新增 D-043记录该边界决策。
6. 更新 `05-验收证据.md`,记录本轮文档验收命令。
### 影响文件
- `wasm-port/working/README.md`
- `wasm-port/working/01-项目功能内容.md`
- `wasm-port/working/02-项目程序开发详细步骤.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
- `wasm-port/working/11-WASM核心状态机边界与后续完善路线.md`
### 当前结论
文档已明确后续 WASM 程序完善方向:核心状态机在 WASM/C++JS/SDK 只做 host 边界JSON 只做输入/输出通信格式。当前 T-001 到 T-049 闭合状态不变;后续代码任务需先补入任务矩阵再实施。
## 2026-07-08 08:08 EDT
### 本轮目标
完成后续全部工作,推进 T-049建立 task-HAL 全量闭合验证入口,让后续验收不再依赖人工记忆多条命令组合。
### 本轮做了什么
1. 确认前面中断后没有残留的 task-HAL 验证后台进程。
2. 复核任务矩阵,确认 T-001 到 T-048 均完成,下一条优先任务为“无”。
3. 新增 `tools/verify_task_full_closure.sh`
- 自动加载 emsdk。
- 构建 task-HAL WASM。
-`SKIP_TASK_HAL_BUILD=1` 运行 `verify_task_hal_wasm.sh``verify_task_hal_sdk.sh`
- 运行 state matrix、motion/HAL sync、T-007 StandaloneEmcStatus、T-046 no-JSON 主路径、T-047/T-048 working closure、source reuse/drift docs 和 readiness contract gates。
- 通过后输出 `task_full_closure_status=ok`
4. 更新 `docs/source-reuse-map.md`,将 `tools/verify_task_full_closure.sh` 加入 Task/motion/HAL simulation runtime 的 validation list。
5. 更新 `docs/compatibility-validation.md`,新增 `tools/verify_task_full_closure.sh` 行,记录它覆盖 build、WASM smoke、SDK、state matrix、motion sync、T-007/T-046/T-047/T-048/docs/readiness gates。
6. 更新 `tools/verify_task_source_reuse_drift_docs.sh`,要求 source reuse、compatibility 和任务矩阵都记录 T-049/full closure gate。
7. 更新 `working/04-任务矩阵.md`,新增并闭合 T-049。
8. 运行 `./tools/verify_task_source_reuse_drift_docs.sh`,确认文档一致性 gate 已识别 full closure。
9. 运行 `./tools/verify_task_full_closure.sh`,全量闭合验证通过,输出 `task_full_closure_status=ok`
### 影响文件
- `wasm-port/tools/verify_task_full_closure.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/working/04-任务矩阵.md`
### 当前结论
T-049 已完成。task-HAL 对标工作已有一个统一全量闭合入口,可一次性验证 build、核心 WASM/SDK/state matrix/motion sync、T-007/T-046/T-047/T-048/docs/readiness gates。本轮未改变 runtime 行为。
## 2026-07-08 05:51 EDT
### 本轮目标
继续完成对标工作,推进 T-048`verify_task_working_closure.sh` 纳入全局文档一致性验证,避免 T-047 的 working closure gate 只存在于 working 文档而不受总文档 gate 保护。
### 本轮做了什么
1. 检查 `docs/source-reuse-map.md``docs/compatibility-validation.md``tools/verify_task_source_reuse_drift_docs.sh`,确认 T-047 新增的 `verify_task_working_closure.sh` 尚未纳入 source reuse / compatibility 的总验证链。
2. 更新 `docs/source-reuse-map.md`,在 Task/motion/HAL simulation runtime 的 validation 列加入 `tools/verify_task_working_closure.sh`
3. 更新 `docs/compatibility-validation.md`
-`verify_task_source_reuse_drift_docs.sh` 的说明扩展为包含 working closure gate。
- 新增 `tools/verify_task_working_closure.sh` 行,说明它验证 T-047/T-048 working closure anchors。
4. 更新 `tools/verify_task_source_reuse_drift_docs.sh`
- 要求 source reuse map 包含 `tools/verify_task_working_closure.sh`
- 要求 compatibility 文档包含 `tools/verify_task_working_closure.sh` 和 working closure gate 文案。
- 要求任务矩阵包含 T-048 完成。
5. 更新 `working/04-任务矩阵.md`,新增并闭合 T-048。
6. 运行 `./tools/verify_task_source_reuse_drift_docs.sh`,确认总文档一致性 gate 已覆盖 working closure。
7. 运行 `./tools/verify_task_working_closure.sh``./tools/verify_task_standalone_emc_status.sh`,确认 T-047/T-007 gate 不回退。
### 影响文件
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/working/04-任务矩阵.md`
### 当前结论
T-048 已完成。`verify_task_working_closure.sh` 已进入 source reuse / compatibility 文档和 `verify_task_source_reuse_drift_docs.sh` 总 gateworking closure 状态现在由全局文档一致性验证保护。本轮未改变 runtime 行为。
## 2026-07-08 05:46 EDT
### 本轮目标
继续完成对标工作。由于 T-007 已完成且任务矩阵显示“下一条优先任务:无”,本轮推进 T-047收口 working 索引与闭合 gate修正过期现状描述固定当前矩阵已闭合状态。
### 本轮做了什么
1. 扫描 `wasm-port/working``docs``tools` 中的 `待办``进行中``阻塞``未完成` 等标记,确认任务矩阵没有未闭合任务,但 working README 和功能内容文档仍保留早期 Phase 3/4 minimal adapter 口径。
2. 更新 `working/README.md`
- 将当前基线改为:`lctask_run_cycles()` 已具备 command read、plan、execute、motion update、subordinate sync、task update、status write 周期骨架。
- 记录 task status 已由 `LcmotStatusSnapshot``StandaloneEmcStatus` 导出。
- 记录 host JSON motion plan 只保留为 timed-plan 兼容/调试入口。
- 新增“当前闭合状态”,说明矩阵所有任务完成,后续扩展需先补矩阵。
3. 更新 `working/01-项目功能内容.md`
- 将“现状差距”改为“当前闭合状态”与“当前保守边界”。
- 记录 `StandaloneEmcStatus`、no-JSON RUN path、周期 snapshot、state matrix、readiness contract 等当前事实。
4. 更新 `working/09-emc_nml复用评估.md`
- 将“还没有 T-007 的集中容器”修正为 T-007 已建立 `StandaloneEmcStatus`
- 保持完整 `emc_nml.hh` 不直接 include 的决策不变。
5. 更新 `working/04-任务矩阵.md`
- 新增并闭合 T-047收口 working 索引与闭合 gate。
- 保持下一条优先任务为“无”。
6. 新增 `tools/verify_task_working_closure.sh`,验证:
- T-007 和 T-047 均完成。
- 矩阵没有 `待办``进行中``阻塞` 任务。
- README、功能内容、NML 评估、台账、验收证据和决策记录均包含当前闭合口径。
7. 给新脚本赋权并运行 closure gate。首次并行运行时脚本抢在 `chmod` 前执行,出现一次 `Permission denied`;随后单独重跑通过。
### 影响文件
- `wasm-port/working/README.md`
- `wasm-port/working/01-项目功能内容.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/09-emc_nml复用评估.md`
- `wasm-port/tools/verify_task_working_closure.sh`
### 当前结论
T-047 已完成。working 索引、功能内容和 NML 评估文档已与 T-007/T-046 当前实现一致;新增 closure gate 固定“矩阵全完成、下一条为无”的收口状态。本轮未改变 runtime 行为。
## 2026-07-08 05:40 EDT
### 本轮目标
继续完成对标工作,推进 T-007建立 `EMC_STAT` 等价状态容器,让 task/motion/io 必需字段集中管理JSON status 从该状态导出。
### 本轮做了什么
1. 读取任务矩阵,确认当前推进指针为 T-007T-008 到 T-046 已完成,因此 T-007 是当前矩阵最后一项待办。
2. 复核 `linuxcnc_task_hal_wasm.cpp` 的既有状态结构,确认 `TaskRuntime` 中 task、motion snapshot、io、top-level RCS 字段仍分散保存,`status_json()` 直接从这些字段拼接兼容 JSON。
3.`linuxcnc_task_hal_wasm.cpp` 新增当前阶段的 `EMC_STAT` 等价容器:
- `StandaloneEmcTaskStatus`
- `StandaloneEmcMotionStatus`
- `StandaloneEmcIoStatus`
- `StandaloneEmcStatus`
4. 新增 `sync_standalone_emc_status()`,在每次 `write_status_snapshot()` 前集中同步:
- task state/mode/interp/exec/status、cycle、program、plan、pending command、home/error 字段。
- motion snapshot 的 program line、motion id、status、queue、axis、joint0、error/soft-limit、switchkins 字段。
- io error/estop latch 和 top/task/motion/io RCS 聚合字段。
5. 修改 `status_json()`
- 新增顶层 `statusSource=StandaloneEmcStatus`
- 新增 `emcStatus` JSON 对象,导出 top/task/motion/io 的集中状态。
- 兼容字段 `taskTopLevelStatus``rcsStatus``task``motionStatus` 改为从 `StandaloneEmcStatus` 容器读取。
6. 修改 `verify_task_hal_wasm.mjs`,断言:
- `statusSource``emcStatus.source``StandaloneEmcStatus`
- `emcStatus.top/task/motion/io` 与既有 `taskTopLevelStatus``rcsStatus``task``motionStatus` 一致。
- 新增输出 `standalone_emc_status_container=ok`
7. 修改 `verify_task_hal_sdk.mjs`,让 SDK smoke 也验证 `emcStatus` 与兼容字段一致,并新增输出 `task_hal_sdk_standalone_emc_status=ok`
8. 修改 `verify_task_state_matrix.mjs`,新增 `assertStandaloneEmcStatus()` helper验证 state matrix 中 `emcStatus` 与兼容字段一致,并新增输出 `standalone_emc_status_matrix=ok`
9. 新增 `tools/verify_task_standalone_emc_status.sh`,固定 T-007 代码结构、测试输出、文档和矩阵状态。
10. 更新 `tools/verify_task_no_json_motion_plan_main_path.sh`,让 T-046 gate 在 T-007 完成后检查 T-007 已完成。
11. 更新 source reuse、drift、compatibility 文档和 `verify_task_source_reuse_drift_docs.sh`,记录 T-007 `StandaloneEmcStatus` 边界。
12. 更新任务矩阵T-007 标为完成;当前矩阵所有任务已闭合,下一条优先任务改为“无”。
### 影响文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tests/wasm/node/verify_task_hal_sdk.mjs`
- `wasm-port/tests/wasm/node/verify_task_state_matrix.mjs`
- `wasm-port/tools/verify_task_standalone_emc_status.sh`
- `wasm-port/tools/verify_task_no_json_motion_plan_main_path.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/04-任务矩阵.md`
### 当前结论
T-007 已完成。task/motion/io/top 必需状态已集中到 `StandaloneEmcStatus`JSON status 的 `task``motionStatus``rcsStatus``taskTopLevelStatus` 和新增 `emcStatus` 均由该容器导出。当前任务矩阵已全部闭合readiness 仍保持未提升。
## 2026-07-08 05:28 EDT
### 本轮目标
继续完成对标工作,推进 T-046移除主路径 JSON motion plan 依赖,让 RUN 文件主路径由 staged program、`emcTaskPlanRead()` / `emcTaskPlanCommand()` / `emcTaskPlanExecute()``emccanon.cc` command envelope 和 `taskintf.cc` motion issue 驱动。
### 本轮做了什么
1. 复核任务矩阵,确认 T-046 的验收边界是主 RUN 路径不再依赖 `lctask_load_program_motion_plan_json()`,但 `loadProgramMotionPlan()` 可以保留为调试/兼容入口。
2. 修改 `tests/wasm/node/verify_task_hal_wasm.mjs`
- 删除主 smoke 中对 `lctask_load_program_motion_plan_json()` 的预加载。
- 删除不再需要的 `callJson()` helper。
- 将主 RUN 断言改为 `motionPlanLoaded=false``planId=0`,并要求 `planReadCount``planExecuteCount``planCommandCount` 等 staged-program 计数递增。
- 根据无 JSON 主路径完成速度,放宽 pause/resume/step 中 `READING` / `IDLE` 的完成态断言。
- 新增输出 `task_hal_no_json_main_path_status=ok`
3. 修改 `tests/wasm/node/verify_task_hal_sdk.mjs`
- 删除默认 status snapshot 前的 `sdk.loadProgramMotionPlan()` 调用。
- 默认 SDK smoke 改为断言 `motionPlanLoaded=false``planId=0``planReadCount>0`
- 保留后续 timed motion plan 场景作为兼容/调试覆盖,并将输出改为 `task_hal_timed_motion_plan_compat=ok`
4. 修改 `tests/wasm/node/verify_task_state_matrix.mjs`
- `stageAndOpenProgram()` 默认 `loadPlan=false`
- homed/open RUN gate 改为接受 staged-program 无 JSON 路径。
- 新增显式 `loadPlan: true` 兼容场景,证明 JSON timed-plan 入口仍可用。
- 新增输出 `run_gate_staged_program_executes_without_json_plan=ok``run_gate_json_motion_plan_compat=ok`
5. 新增 `tools/verify_task_no_json_motion_plan_main_path.sh`,固定:
-`verify_task_hal_wasm.mjs` 不包含 `lctask_load_program_motion_plan_json()`
- SDK/state-matrix 中 `loadProgramMotionPlan()` 仅作为兼容入口存在。
- T-046 已完成且下一条任务指向 T-007。
6. 更新 `tools/verify_task_emccanon_motion_output.sh` 的矩阵期望,让 T-045 gate 接受 T-046 已完成。
7. 更新 source reuse、drift、compatibility 文档和 `verify_task_source_reuse_drift_docs.sh`,记录 T-046 no-JSON main RUN path。
8. 更新任务矩阵T-046 标为完成,下一条优先任务改为 T-007。
### 影响文件
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tests/wasm/node/verify_task_hal_sdk.mjs`
- `wasm-port/tests/wasm/node/verify_task_state_matrix.mjs`
- `wasm-port/tools/verify_task_no_json_motion_plan_main_path.sh`
- `wasm-port/tools/verify_task_emccanon_motion_output.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/04-任务矩阵.md`
### 当前结论
T-046 已完成。主 RUN 文件路径已不再依赖 host JSON motion plan默认验证通过 staged program 的 plan read/command/execute、emccanon command envelope 和 taskintf motion issue`loadProgramMotionPlan()` 仍保留为 timed-plan 兼容/调试入口。下一步进入 T-007建立 `EMC_STAT` 等价状态容器。
## 2026-07-08 05:06 EDT
### 本轮目标
继续完成对标工作,推进 T-045实现 `emccanon.cc` motion output/switchkins 子集,让 M62-M68/M428-M430 通过 canon motion output 到 `emcMotionSetAout()`,移除字符串 special-case。
### 本轮做了什么
1. 读取任务矩阵,确认当前推进指针为 T-045下一条为 T-046 移除主路径 JSON motion plan 依赖。
2. 复核上游 `linuxcnc/src/emc/task/emccanon.cc`,确认:
- `SET_MOTION_OUTPUT_BIT()``CLEAR_MOTION_OUTPUT_BIT()``SET_AUX_OUTPUT_BIT()``CLEAR_AUX_OUTPUT_BIT()` 进入 `EMC_MOTION_SET_DOUT` / `interp_list`
- `SET_MOTION_OUTPUT_VALUE()``SET_AUX_OUTPUT_VALUE()` 进入 `EMC_MOTION_SET_AOUT` / `interp_list`
- `WAIT()` 进入 `EMC_AUX_INPUT_WAIT` / `interp_list`
3. 扩展 `emccanon_wasm_subset.hh/.cc`
- 新增 `LcEmcCanonSubsetOutputCommandType``LcEmcCanonSubsetInputType``LcEmcCanonSubsetOutputCommand`
- 新增 motion/aux digital output、motion/aux analog output 和 wait input 的 subset API。
- 新增 `lc_emccanon_subset_motion_output_anchor_list()`,固定 output/wait message 和 `interp_list` anchors。
4. 修改 `linuxcnc_task_hal_wasm.cpp`
- `TaskRuntime` 新增 T-045 evidence 字段:`motionOutputCount``motionOutputAppendCount``motionOutputTaskintfAoutCount``waitInputCount`、last output/wait 详情和 `motionOutputAnchors`
- 新增 `issue_motion_output_from_line()`,识别精确 `M62``M63``M64``M65``M66``M67``M68``M428``M429``M430`
- 删除 `enqueue_mdi()` 中旧的 `mdi.find("M428/M429/M430")` 字符串 special-case。
- M428/M429/M430 现在先通过 canon `SET_AUX_OUTPUT_VALUE()` 记录 evidence再桥接到既有 `taskintf.cc` `emcMotionSetAout()` / `lcmot_write_aout()` 路径。
5. 修改 `tests/wasm/node/verify_task_hal_wasm.mjs`
- 更新 emccanon anchor 期望,纳入 output/wait 函数。
- 验证 M428/M429/M430 仍能切换 switchkins。
- 新增 M62/M63/M64/M65/M67/M68/M66 smoke断言 DOUT/AOUT/WAIT evidence。
- 新增输出 `emccanon_motion_output_status=ok`
6. 修改 `tests/wasm/node/verify_task_hal_sdk.mjs`
- 将旧事件 `task_mdi_switchkins:M429` 断言替换为新的 canon output 事件。
- 增加 SDK 可见的 motion output status evidence 断言。
7. 新增 `tools/verify_task_emccanon_motion_output.sh`验证上游锚点、subset API、wrapper status、移除旧 M428 special-case、WASM smoke 和 T-045/T-046 矩阵状态。
8. 更新 `tools/verify_task_emccanon_spindle_tool.sh`,让 T-044 gate 在 T-045 完成后检查 T-045 已完成。
9. 更新 source reuse、drift、compatibility 文档和 `verify_task_source_reuse_drift_docs.sh`,固定 T-045 文档口径。
10. 更新任务矩阵T-045 标为完成,下一条优先任务改为 T-046。
### 影响文件
- `wasm-port/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.hh`
- `wasm-port/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.cc`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tests/wasm/node/verify_task_hal_sdk.mjs`
- `wasm-port/tools/verify_task_emccanon_motion_output.sh`
- `wasm-port/tools/verify_task_emccanon_spindle_tool.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/04-任务矩阵.md`
### 当前结论
T-045 已完成。M62-M68/M66 已有 `EMC_MOTION_SET_DOUT` / `EMC_MOTION_SET_AOUT` / `EMC_AUX_INPUT_WAIT` / `interp_list` evidenceM428-M430 已移除旧字符串 special-case改走 canon `SET_AUX_OUTPUT_VALUE()` 到 taskintf AOUT 路径。下一步进入 T-046移除主路径 JSON motion plan 依赖。
## 2026-07-08 04:50 EDT
### 本轮目标
继续完成对标工作,推进 T-044实现 `emccanon.cc` spindle/tool command 子集,让 spindle/tool commands append 到 `interp_list`runtime boundary 和 readiness 保守记录。
### 本轮做了什么
1. 读取任务矩阵,确认当前推进指针为 T-044下一条为 T-045 motion output/switchkins。
2. 复核上游 `linuxcnc/src/emc/task/emccanon.cc` 的 spindle/tool command 锚点,确认 `SET_SPINDLE_SPEED()``START_SPINDLE_CLOCKWISE()``START_SPINDLE_COUNTERCLOCKWISE()``STOP_SPINDLE_TURNING()``SELECT_TOOL()``CHANGE_TOOL()``CHANGE_TOOL_NUMBER()``RELOAD_TOOLDATA()` 分别生成 `EMC_SPINDLE_*``EMC_TOOL_*` command 并 append 到 `interp_list`
3. 扩展 `emccanon_wasm_subset.hh/.cc`
- 新增 `LcEmcCanonSubsetSpindleCommandType``LcEmcCanonSubsetToolCommandType`
- 新增 `LcEmcCanonSubsetSpindleCommand``LcEmcCanonSubsetToolCommand`
- 新增 spindle/tool command envelope API。
- 新增 `lc_emccanon_subset_spindle_tool_anchor_list()`,固定 spindle/tool command、message 和 `interp_list` anchors。
4. 修改 `linuxcnc_task_hal_wasm.cpp`
- `TaskRuntime` 新增 T-044 evidence 字段:`spindleCommandCount``spindleAppendCount``lastSpindleCommand``lastSpindle``lastSpindleSpeed``lastSpindleWait``toolCommandCount``toolAppendCount``lastToolCommand``lastTool``spindleToolAnchors`
- 新增精确 `M` code 解析,避免 `M428/M429/M430` 被误判为 `M4`
- 在 staged program line 和 MDI 进入 dwell/path-control 与 straight motion 前识别 `S...``M3``M4``M5``T...``M6``M61 Q...`
- 该分支只记录 canonical command envelope 和 `interp_list` evidence不提升真实 spindle control、tool DB、IO 或 NML readiness。
5. 修改 `tests/wasm/node/verify_task_hal_wasm.mjs`
- 更新 emccanon anchor 期望,纳入 spindle/tool command 锚点。
- 新增 MDI smoke`S1200 M3``M5``T7 M6``M61 Q8`
- 断言 `spindleAppendCount``toolAppendCount`、last command/tool/speed 和 `spindleToolAnchors`
- 新增输出 `emccanon_spindle_tool_status=ok`
6. 新增 `tools/verify_task_emccanon_spindle_tool.sh`验证上游锚点、subset API、wrapper evidence、WASM smoke 和 T-044/T-045 矩阵状态。
7. 更新 `tools/verify_task_emccanon_dwell_path_control.sh`,让 T-043 gate 在 T-044 完成后检查 T-044 已完成。
8. 更新 source reuse、drift、compatibility 文档和 `verify_task_source_reuse_drift_docs.sh`,固定 T-044 文档口径。
9. 更新任务矩阵T-044 标为完成,下一条优先任务改为 T-045。
### 影响文件
- `wasm-port/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.hh`
- `wasm-port/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.cc`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tools/verify_task_emccanon_spindle_tool.sh`
- `wasm-port/tools/verify_task_emccanon_dwell_path_control.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/04-任务矩阵.md`
### 当前结论
T-044 已完成。spindle/tool command 子集已有 `EMC_SPINDLE_*` / `EMC_TOOL_*` / `interp_list` status evidencereadiness 仍保持未提升。下一步进入 T-045motion output/switchkins 子集。
## 2026-07-08 04:34 EDT
### 本轮目标
继续完成对标工作,推进 T-043实现 `emccanon.cc` dwell/path-control 子集,让 `DWELL()``SET_MOTION_CONTROL_MODE()` 进入 task delay/path mode 语义。
### 本轮做了什么
1. 读取任务矩阵,确认当前推进指针为 T-043下一条为 T-044 spindle/tool command。
2. 读取上游 `linuxcnc/src/emc/task/emccanon.cc`,确认:
- `DWELL()` 构造 `EMC_TRAJ_DELAY`,设置 delay 秒数,并 append 到 `interp_list`
- `SET_MOTION_CONTROL_MODE()` 构造 `EMC_TRAJ_SET_TERM_COND`,将 `CANON_CONTINUOUS` 映射为 blend`CANON_EXACT_PATH` 映射为 exact`CANON_EXACT_STOP` 映射为 stop并 append 到 `interp_list`
3. 扩展 `emccanon_wasm_subset.hh/.cc`
- 新增 path mode 和 term condition 枚举。
- 新增 `LcEmcCanonSubsetDelay``LcEmcCanonSubsetTermCond`
- 新增 `lc_emccanon_subset_dwell()`
- 新增 `lc_emccanon_subset_set_motion_control_mode()`
- 新增 `lc_emccanon_subset_dwell_path_control_anchor_list()`,固定 `DWELL,EMC_TRAJ_DELAY,SET_MOTION_CONTROL_MODE,EMC_TRAJ_SET_TERM_COND,interp_list`
4. 修改 `linuxcnc_task_hal_wasm.cpp`
- `TaskRuntime` 新增 T-043 evidence 字段:`dwellCount``delayAppendCount``lastDwellSeconds``pathControlCount``termCondAppendCount``lastPathMode``lastTermCondition``lastPathTolerance``dwellPathControlAnchors`
- 新增 G-code helper大小写无关匹配和字母参数读取。
- 新增 `issue_dwell_or_path_control_from_line()`,识别 `G4``G61``G61.1``G64`
- 在 staged program line 和 MDI 进入 straight motion 前拦截上述 non-motion canon command。
- status JSON 的 `emccanonSourceReuse` 输出 T-043 evidence 字段。
5. 修改 `tests/wasm/node/verify_task_hal_wasm.mjs`
- 更新 emccanon anchor 期望,纳入 `DWELL``SET_MOTION_CONTROL_MODE`
- 通过 MDI `G64 P0.01``G4 P0.02` 验证 path-control 和 dwell evidence。
- 新增输出 `emccanon_dwell_path_control_status=ok`
6. 新增 `tools/verify_task_emccanon_dwell_path_control.sh`验证上游锚点、subset API、wrapper evidence、WASM smoke 和 T-043/T-044 矩阵状态。
7. 更新 `tools/verify_task_emccanon_straight_motion.sh`,让 T-042 gate 在 T-043 完成后检查 T-043 已完成。
8. 更新 source reuse、drift、compatibility 文档和 `verify_task_source_reuse_drift_docs.sh`,固定 T-043 文档口径。
9. 更新任务矩阵T-043 标为完成,下一条优先任务改为 T-044。
10. 受当前沙箱影响,首次 task-HAL 构建失败在 Emscripten cache 只读;随后使用提升权限加载 emsdk 后完成 `linuxcnc_task_hal_wasm_build=ok`
### 影响文件
- `wasm-port/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.hh`
- `wasm-port/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.cc`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tools/verify_task_emccanon_dwell_path_control.sh`
- `wasm-port/tools/verify_task_emccanon_straight_motion.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/04-任务矩阵.md`
### 当前结论
T-043 已完成。`DWELL()``SET_MOTION_CONTROL_MODE()` 已通过 `emccanon_wasm_subset` 进入 task-HAL status evidence并保留 unpromoted readiness 合同。下一步进入 T-044spindle/tool command 子集。
## 2026-07-08 03:52 EDT
### 本轮目标
继续完成对标工作,推进 T-042实现 `emccanon.cc` straight traverse/feed 子集,让 `STRAIGHT_TRAVERSE()``STRAIGHT_FEED()` 生成 LinuxCNC `EMC_TRAJ_LINEAR_MOVE``interp_list`
### 本轮做了什么
1. 读取任务矩阵,确认当前推进指针为 T-042下一条为 T-043 dwell/path-control。
2. 读取上游 `linuxcnc/src/emc/task/emccanon.cc`,确认:
- `generate_fast_move()` 构造 `EMC_TRAJ_LINEAR_MOVE` 并 append 到 `interp_list`
- `generate_move()` 构造 feed `EMC_TRAJ_LINEAR_MOVE` 并 append 到 `interp_list`
- `STRAIGHT_TRAVERSE()` 设置 line number 并通过 `tag_and_send()` 进入 linear move / interp_list 路径。
- `STRAIGHT_FEED()` 进入 segment/feed linear move 路径。
3. 扩展 `emccanon_wasm_subset.hh/.cc`
- 新增 `lc_emccanon_subset_straight_motion_anchor_list()`
- anchor 明确包含 `generate_fast_move,generate_move,STRAIGHT_TRAVERSE,STRAIGHT_FEED,EMC_TRAJ_LINEAR_MOVE,interp_list`
4. 修改 `linuxcnc_task_hal_wasm.cpp`
- `TaskRuntime` 新增 T-042 evidence 字段:`straightTraverseCount``straightFeedCount``linearMoveAppendCount``lastLinearMoveLine``lastLinearMoveType``lastInterpListCommand``straightMotionAnchors`
- 新增 `mark_emccanon_straight_linear_move()`
-`taskintf_command_from_canon()` 中记录 canon straight move 到 `EMC_TRAJ_LINEAR_MOVE` / `interp_list` 的证据。
- status JSON 的 `emccanonSourceReuse` 输出上述字段。
5. 修改 `tests/wasm/node/verify_task_hal_wasm.mjs`
- 主 smoke 断言 straight traverse/feed 计数、linear move append、last line、`lastInterpListCommand=EMC_TRAJ_LINEAR_MOVE` 和 T-042 anchors。
- no-json staged program RUN 断言 `STRAIGHT_FEED``EMC_TRAJ_LINEAR_MOVE` 证据。
- 新增输出 `emccanon_straight_motion_status=ok`
6. 新增 `tools/verify_task_emccanon_straight_motion.sh`验证上游锚点、subset API、wrapper evidence、WASM smoke 和 T-042/T-043 矩阵状态。
7. 更新 `tools/verify_task_emccanon_init_finish_unit.sh`,让 T-041 gate 在 T-042 完成后检查 T-042 已完成,而不是旧的下一条指针。
8. 更新 source reuse、drift、compatibility 文档和 `verify_task_source_reuse_drift_docs.sh`,固定 T-042 文档口径。
9. 更新任务矩阵T-042 标为完成,下一条优先任务改为 T-043。
### 影响文件
- `wasm-port/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.hh`
- `wasm-port/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.cc`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tools/verify_task_emccanon_straight_motion.sh`
- `wasm-port/tools/verify_task_emccanon_init_finish_unit.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/04-任务矩阵.md`
### 当前结论
T-042 已完成。`emccanon.cc` straight traverse/feed 已有明确 `EMC_TRAJ_LINEAR_MOVE` / `interp_list` evidence并继续通过 `taskintf.cc` structured linear move 边界进入 motion runtime。下一步进入 T-043`DWELL()``SET_MOTION_CONTROL_MODE()` 对标。
## 2026-07-08 03:36 EDT
### 本轮目标
继续完成对标工作,推进 T-041实现 `emccanon.cc` canon init/finish/unit 子集,让 `INIT_CANON()``ON_RESET()``FINISH()`、单位/endpoint getter 接入 `EMC_STAT` 等价状态边界。
### 本轮做了什么
1. 读取任务矩阵,确认 T-041 是当前推进目标T-042 为下一条 straight traverse/feed 子集。
2. 扩展 `emccanon_wasm_subset.hh/.cc`
- 新增 `LcEmcCanonSubsetState` 和长度单位枚举。
- 新增 `lc_emccanon_subset_init()``lc_emccanon_subset_on_reset()``lc_emccanon_subset_finish()`
- 新增 `lc_emccanon_subset_use_length_units()` 和 external length/angle/unit getter。
- 新增 `lc_emccanon_subset_update_endpoint()``lc_emccanon_subset_get_external_position()`
- anchor list 纳入 `INIT_CANON/ON_RESET/FINISH/USE_LENGTH_UNITS/GET_EXTERNAL_*`
3. 修改 `linuxcnc_task_hal_wasm.cpp`
- `TaskRuntime` 新增 `emccanon_state` 以及 init/finish/reset/unit/position/endpoint evidence 计数。
- session init 使用 motion config linear/angular units 初始化 canon subset。
- motion snapshot 和 canon move issue 路径更新 external endpoint。
- plan reset 调用 `lc_emccanon_subset_on_reset()`
- status JSON 的 `emccanonSourceReuse` 输出 units、endpoint 和 `initFinishUnitAnchors`
4. 修改 `tests/wasm/node/verify_task_hal_wasm.mjs`
- 断言 T-041 anchors、init/finish/unit/position/endpoint/reset evidence。
- 新增 smoke 输出 `emccanon_init_finish_unit_status=ok`
5. 新增 `tools/verify_task_emccanon_init_finish_unit.sh`验证上游锚点、subset API、wrapper 使用、status JSON、WASM smoke 和 T-041/T-042 矩阵状态。
6. 更新 source reuse、drift、compatibility 文档和 `verify_task_source_reuse_drift_docs.sh`,固定 T-041 文档口径。
7. 修正两个跟推进指针老化有关的 gate
- `verify_task_emctask_plan_read_execute.sh` 改为检查 T-041 已完成。
- `verify_task_taskintf_jog_home_switchkins.sh` 改为检查 T-037 已完成。
8. 更新任务矩阵T-041 标为完成,下一条优先任务改为 T-042。
### 影响文件
- `wasm-port/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.hh`
- `wasm-port/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.cc`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tools/verify_task_emccanon_init_finish_unit.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/tools/verify_task_emctask_plan_read_execute.sh`
- `wasm-port/tools/verify_task_taskintf_jog_home_switchkins.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/04-任务矩阵.md`
### 当前结论
T-041 已完成。`emccanon.cc` 的 canon init/reset/finish/unit/external position getter 已进入 source-anchored subsettask-HAL status 可观测 T-041 evidencereadiness 仍保持未提升。下一步进入 T-042实现 `STRAIGHT_TRAVERSE()``STRAIGHT_FEED()``EMC_TRAJ_LINEAR_MOVE`/`interp_list` 的对标。
## 2026-07-08 03:14 EDT
### 本轮目标
继续完成对标工作,推进 T-040实现 `emctask.cc` plan read/execute 子集,让 `PlanRead/Execute/Line/Level/Command` 驱动 staged program 到 `interp_list`/taskintf 路径,并移除 RUN 对 host JSON motion plan 的硬依赖。
### 本轮做了什么
1. 读取任务矩阵,确认当前推进指针为 T-040。
2. 读取上游 `linuxcnc/src/emc/task/emctask.cc``emctaskmain.cc`
- `emcTaskPlanRead()` 调用 `interp.read()`
- `emcTaskPlanExecute()` 调用 `interp.execute()`MDI 时可先 synch之后 `FINISH()`
- `emcTaskPlanLine()``emcTaskPlanLevel()``emcTaskPlanCommand()` 暴露 read line、call level 和 command 文本。
- `readahead_reading()` 通过 `PlanRead -> PlanLine/Command -> PlanExecute -> interp_list` 推进 interpreter。
3. 扩展 `emctask_wasm_subset.hh/.cc`
- 新增 `LcEmcTaskSubsetPlanIoResult`
- 新增 `lc_emctask_subset_plan_read()`
- 新增 `lc_emctask_subset_plan_execute()`
- 新增 `lc_emctask_subset_plan_line()`
- 新增 `lc_emctask_subset_plan_level()`
- 新增 `lc_emctask_subset_plan_command()`
- 新增 `lc_emctask_subset_plan_read_execute_anchor_list()`
- `lc_emctask_subset_anchor_list()` 纳入 `emcTaskPlanRead/Execute/Line/Level/Command`
4. 修改 `linuxcnc_task_hal_wasm.cpp`
- `TaskRuntime` 新增 T-040 evidence 字段read/execute/line/level/command 计数、`interpListAppendCount`、last line/level/command、read/execute anchors。
- 新增 `mark_emctask_plan_read_execute()`
- 新增 `emctask_plan_execute_command()`
- 新增 `emctask_plan_read_execute_program_line()`
- 拆出 `issue_linear_move_from_line()`,让 PlanRead 返回的 line number 驱动 canon/taskintf motion issue。
- `task_accepts_plan_run()` 不再要求 `motion_plan_loaded`,改为要求 staged program lines 存在。
- `wasm_emcTaskExecute()` 的 program work 判断改为支持 staged program lines。
- no-json path 通过 `PlanRead/Line/Level/Command/Execute` 读取 staged program line并 append 到当前 `pending_execute_motion_commands`/taskintf issue 等价路径。
- MDI `EMC_TASK_PLAN_EXECUTE` 也进入 `PlanExecute` evidence 路径。
- RUN 起点不再立即 set wait避免阻塞 `PlanRead()`staged program 行读完后记录并清理 wait。
5. 修改 `tests/wasm/node/verify_task_hal_wasm.mjs`
- 更新 emctask anchors。
- 新增 no-json staged program smoke不调用 `lctask_load_program_motion_plan_json()`
- 断言 `planReadCount``planExecuteCount``planLineCount``planLevelCount``planCommandCount``interpListAppendCount``planReadExecuteAnchors`
- 新增输出 `emctask_plan_read_execute_status=ok`
6. 修改 `tests/wasm/node/verify_task_state_matrix.mjs`
- 将旧的 loadPlan:false 拒绝用例改为 staged program 可执行用例。
- 输出改为 `run_gate_staged_program_executes_without_json_plan=ok`
7. 新增 `tools/verify_task_emctask_plan_read_execute.sh`验证上游锚点、subset API、wrapper no-json RUN、WASM smoke、state matrix 和 T-040/T-041 矩阵状态。
8. 更新 `tools/verify_task_emctask_plan_open_wait.sh`,适配 T-040 已完成后的矩阵状态。
9. 更新 `tools/verify_task_source_reuse_drift_docs.sh`,把 T-040 文档和 gate 纳入 source reuse/drift/compatibility 检查。
10. 更新 `docs/source-reuse-map.md``docs/drift-report.md``docs/compatibility-validation.md`,记录 T-040 plan read/execute/line/level/command 映射。
11. 更新任务矩阵T-040 标为完成,下一推进指针改为 T-041。
12. 新增决策 D-032记录 staged program 主路径接管、RUN wait 调整和 JSON motion plan 兼容入口保留。
### 改了哪些文件
- `wasm-port/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.hh`
- `wasm-port/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.cc`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tests/wasm/node/verify_task_state_matrix.mjs`
- `wasm-port/tools/verify_task_emctask_plan_read_execute.sh`
- `wasm-port/tools/verify_task_emctask_plan_open_wait.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过。
- `./tools/verify_task_emctask_plan_read_execute.sh`:通过,验证 T-040 plan read/execute/line/level/command 和 no-json staged program RUN。
- `./tools/verify_task_source_reuse_drift_docs.sh`:通过。
- `./tools/verify_task_emctask_plan_open_wait.sh`:通过,确认 T-039 gate 适配 T-040 已完成后的矩阵状态。
- `node ./tests/wasm/node/verify_task_state_matrix.mjs`:通过,确认 staged program 不依赖 JSON motion plan。
- `./tools/verify_task_emctask_update_snapshot.sh`:通过。
- `./tools/verify_task_emctask_state_mode.sh`:通过。
- `./tools/verify_task_emctask_subset.sh`:通过。
- `./tests/wasm/node/verify_task_hal_sdk.sh`:通过。
- `SKIP_TASK_HAL_BUILD=1 ./tests/wasm/node/verify_motion_hal_sync.sh`:通过。
- `./tools/verify_task_hal_readiness_contract.sh`:通过,确认 readiness 不提升。
- `git diff --check -- ...`:通过。
### 下一步
推进 T-041实现 `emccanon.cc` canon init/finish/unit 子集,让 `INIT_CANON()``ON_RESET()``FINISH()`、单位/endpoint getter 接入 `EMC_STAT` 等价状态边界。
## 2026-07-08 02:30 EDT
### 本轮目标
继续完成对标工作,推进 T-039实现 `emctask.cc` plan wait/synch/open/close 子集,让 `PlanSetWait/IsWait/ClearWait/Synch/Open/Close/Reset` 接入 vendored `emctask_wasm_subset` 和 staged FS 边界。
### 本轮做了什么
1. 读取任务矩阵,确认当前推进指针为 T-039。
2. 读取上游 `linuxcnc/src/emc/task/emctask.cc`
- `emcTaskPlanSetWait()` / `emcTaskPlanIsWait()` / `emcTaskPlanClearWait()` 操作 `waitFlag`
- `emcTaskPlanSynch()` 调用 `interp.synch()`,错误时触发 abort。
- `emcTaskPlanOpen()` 清零 motion/current/read line调用 `interp.open(file)`,成功后设置 `taskplanopen=1`
- `emcTaskPlanClose()` 调用 `interp.close()` 并清 `taskplanopen`
- `emcTaskPlanReset()` 调用 `interp.reset()`
3. 扩展 `emctask_wasm_subset.hh/.cc`
- 新增 `LcEmcTaskSubsetPlanState`
- 新增 `LcEmcTaskSubsetPlanResult`
- 新增 `lc_emctask_subset_plan_set_wait()``lc_emctask_subset_plan_is_wait()``lc_emctask_subset_plan_clear_wait()`
- 新增 `lc_emctask_subset_plan_synch()``lc_emctask_subset_plan_open()``lc_emctask_subset_plan_close()``lc_emctask_subset_plan_reset()`
- 新增 `lc_emctask_subset_plan_anchor_list()`
4. 修改 `linuxcnc_task_hal_wasm.cpp`
- `TaskRuntime` 新增 plan wait/open 状态和 T-039 evidence 计数字段。
- 新增 `emctask_plan_state_from_runtime()``apply_emctask_plan_result()``emctask_plan_set_wait()``emctask_plan_clear_wait()``emctask_plan_synch()``emctask_plan_close()``emctask_plan_reset()`
- `apply_emctask_command_result()``should_plan_synch` 调用 `emctask_plan_synch()`
- `lctask_open_program()` 改为通过 `lc_emctask_subset_plan_open()` 处理 open 决策,并继续由 wrapper 管理 staged FS 文本。
- `EMC_TASK_PLAN_RUN` 接受前要求 `task_plan_open=true`,开始 RUN 时通过 `PlanSetWait` 设置 wait flag。
- 程序完成和 motion wait done 路径通过 `PlanClearWait` 清 wait flag。
- 新增 `EMC_TASK_PLAN_CLOSE``EMC_TASK_PLAN_RESET` 的 task-cycle command 分支。
- status JSON 的 `task` 新增 `taskPlanOpen``taskPlanWait``emctaskSourceReuse` 新增 plan evidence 字段。
5. 修改 `tests/wasm/node/verify_task_hal_wasm.mjs`,断言 T-039 plan anchors、plan open、plan wait set、plan synch 等 evidence。
6. 新增 `tools/verify_task_emctask_plan_open_wait.sh`验证上游锚点、subset plan state/result、wrapper staged FS/open/wait/synch/close/reset 使用、WASM smoke 断言和 T-039/T-040 矩阵状态。
7. 更新 `tools/verify_task_emctask_update_snapshot.sh`,适配 T-039 已完成后的矩阵状态。
8. 更新 `tools/verify_task_source_reuse_drift_docs.sh`,把 T-039 文档和 gate 纳入 source reuse/drift/compatibility 检查。
9. 更新 `docs/source-reuse-map.md``docs/drift-report.md``docs/compatibility-validation.md`,记录 T-039 plan wait/open/synch/reset 映射。
10. 更新任务矩阵T-039 标为完成,下一推进指针改为 T-040。
11. 新增决策 D-031记录 plan wait/open/synch/reset 采用窄 plan-result 子集readiness 不提升。
### 改了哪些文件
- `wasm-port/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.hh`
- `wasm-port/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.cc`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tools/verify_task_emctask_plan_open_wait.sh`
- `wasm-port/tools/verify_task_emctask_update_snapshot.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过。
- `./tools/verify_task_emctask_plan_open_wait.sh`:通过,验证 T-039 plan wait/open/synch/reset 输入边界。
- `./tools/verify_task_source_reuse_drift_docs.sh`:通过,确认 source reuse / drift / compatibility 文档已记录 T-039。
- `./tools/verify_task_emctask_update_snapshot.sh`:通过,确认 T-038 gate 适配 T-039 已完成后的矩阵状态。
- `./tools/verify_task_emctask_state_mode.sh`:通过。
- `./tools/verify_task_emctask_subset.sh`:通过。
- `node ./tests/wasm/node/verify_task_state_matrix.mjs`:通过,确认 command 仍由 task cycle 消费。
- `./tests/wasm/node/verify_task_hal_sdk.sh`:通过。
- `SKIP_TASK_HAL_BUILD=1 ./tests/wasm/node/verify_motion_hal_sync.sh`:通过。
- `./tools/verify_task_hal_readiness_contract.sh`:通过,确认 readiness 不提升。
- `git diff --check -- ...`:通过。
### 下一步
推进 T-040实现 `emctask.cc` plan read/execute 子集,让 `PlanRead/Execute/Line/Level/Command` 驱动 `interp_list`,继续减少 JSON motion plan 主路径依赖。
## 2026-07-08 01:57 EDT
### 本轮目标
继续完成对标工作,推进 T-038实现 `emctask.cc` determine/update 子集,让 `determineMode()``determineState()``emcTaskUpdate()` 从 motion/io snapshot 推导 task status减少 task wrapper 自有状态字符串推导。
### 本轮做了什么
1. 读取任务矩阵,确认当前推进指针为 T-038。
2. 复核上游 `linuxcnc/src/emc/task/emctask.cc``determineMode()``determineState()``emcTaskUpdate()` 的输入边界:
- task mode 由 traj mode/teleop/free 状态推导。
- task state 由 traj enabled 和 IO estop 推导。
- status update 汇总 motion id、task mode、task state 等字段。
3. 修改 `linuxcnc_task_hal_wasm.cpp`
- `emctask_subset_traj_mode()` 优先读取 `LcmotStatusSnapshot.coord_mode``teleop_mode`
- 新增 `emctask_subset_traj_enabled()`,优先读取 `LcmotStatusSnapshot.motion_enabled`
- 新增 `emctask_subset_io_estop()`,聚合 ESTOP latch 与 IO error。
- `wasm_emcTaskUpdate()` 改为用 motion/io snapshot 构造 `LcEmcTaskSubsetUpdateInput`
- `emctaskSourceReuse` 新增 `snapshotUpdateCount``updateInputSource`,记录正常路径为 `motionSnapshot,ioSnapshot`
4. 修改 `tests/wasm/node/verify_task_hal_wasm.mjs`,断言 task-HAL smoke 中 snapshot-fed update 已执行。
5. 新增 `tools/verify_task_emctask_update_snapshot.sh`验证上游锚点、wrapper snapshot 输入、status evidence、WASM smoke 断言和 T-038/T-039 矩阵状态。
6. 更新 `tools/verify_task_source_reuse_drift_docs.sh`,把 T-038 文档和 gate 纳入 source reuse/drift/compatibility 检查。
7. 更新 `docs/source-reuse-map.md``docs/drift-report.md``docs/compatibility-validation.md`,记录 T-038 determine/update snapshot mapping。
8. 更新 `tools/verify_task_emctask_state_mode.sh`,将矩阵检查从“下一步 T-038”调整为“T-038 已完成”,避免 T-037 gate 在矩阵推进后误报。
9. 更新任务矩阵T-038 标为完成,下一推进指针改为 T-039。
10. 新增决策 D-030记录 update 输入改由 motion/io snapshot 提供readiness 不提升。
### 改了哪些文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tools/verify_task_emctask_update_snapshot.sh`
- `wasm-port/tools/verify_task_emctask_state_mode.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过。
- `./tools/verify_task_emctask_update_snapshot.sh`:通过,验证 T-038 determine/update snapshot 输入边界。
- `./tools/verify_task_source_reuse_drift_docs.sh`:通过,确认 source reuse / drift / compatibility 文档已记录 T-038。
- `./tools/verify_task_emctask_state_mode.sh`:通过,确认 T-037 gate 适配 T-038 已完成后的矩阵状态。
- `./tools/verify_task_emctask_subset.sh`:通过,确认 emctask subset source reuse 不回退。
- `node ./tests/wasm/node/verify_task_state_matrix.mjs`:通过,确认 command 仍由 task cycle 消费。
- `./tests/wasm/node/verify_task_hal_sdk.sh`:通过,确认 SDK wrapper 不回退。
- `SKIP_TASK_HAL_BUILD=1 ./tests/wasm/node/verify_motion_hal_sync.sh`:通过,确认 low-level motion/HAL sync 不回退。
- `./tools/verify_task_hal_readiness_contract.sh`:通过,确认 readiness 不提升。
- `git diff --check -- ...`:通过。
### 下一步
推进 T-039实现 `emctask.cc` plan wait/synch/open/close 子集,让 `PlanSetWait/IsWait/ClearWait/Synch/Open/Close/Reset` 接入 vendored interpreter 和 staged FS。
## 2026-07-08 01:49 EDT
### 本轮目标
继续完成对标工作,推进 T-037实现 `emctask.cc` abort/state/mode 子集,让 `emcTaskAbort()``emcTaskSetMode()``emcTaskSetState()` 替换当前 wrapper 自有逻辑,并保持语义由 task cycle 触发。
### 本轮做了什么
1. 读取任务矩阵,确认当前推进指针为 T-037。
2. 读取上游 `linuxcnc/src/emc/task/emctask.cc`
- `emcTaskAbort()` 清理 interpreter/task execution 状态并 plan synch。
- `emcTaskSetMode()` 切换 MANUAL/MDI/AUTO并按模式同步 traj mode。
- `emcTaskSetState()` 切换 OFF/ON/ESTOP_RESET/ESTOP并触发 traj enable/disable、motion abort、unhome、cleanup、plan synch。
3. 扩展 `emctask_wasm_subset.hh/.cc`
- 新增 `LC_EMC_TASK_SUBSET_STATE_OFF`
- 新增 `LcEmcTaskSubsetCommandResult`
- 新增 `lc_emctask_subset_abort()`
- 新增 `lc_emctask_subset_set_mode()`
- 新增 `lc_emctask_subset_set_state()`
- 新增 `lc_emctask_subset_state_mode_anchor_list()`
- `lc_emctask_subset_anchor_list()` 扩展为 `emcTaskAbort,emcTaskSetMode,emcTaskSetState,determineMode,determineState,emcTaskUpdate`
4. 修改 `linuxcnc_task_hal_wasm.cpp`
- 新增 mode/state 字符串与 emctask subset enum 的转换。
- 新增 `apply_emctask_command_result()`,统一执行 clear interpreter、traj enable/disable、unhome、motion abort、homing reset 等 wrapper 动作。
- `TaskCommandType::SetState` 改为调用 `lc_emctask_subset_set_state()`
- `TaskCommandType::SetMode` 改为调用 `lc_emctask_subset_set_mode()`
- `TaskCommandType::Abort` 改为调用 `lc_emctask_subset_abort()`
- status JSON 的 `emctaskSourceReuse` 新增 `stateModeIssueCount``abortIssueCount``stateModeAnchors`
5. 更新 `tests/wasm/node/verify_task_hal_wasm.mjs`,断言新的 emctask anchors 和 state/mode/abort 状态字段。
6. 更新 `tools/verify_task_emctask_subset.sh`,把 abort/set-mode/set-state 纳入 source reuse 检查。
7. 新增 `tools/verify_task_emctask_state_mode.sh`,验证 T-037 的上游锚点、subset command-result、wrapper 使用、state matrix gate 和矩阵状态。
8. 更新 `tools/verify_task_source_reuse_drift_docs.sh`
9. 更新 `docs/source-reuse-map.md``docs/drift-report.md``docs/compatibility-validation.md`,记录 T-037 abort/state/mode command-result 映射和验证 gate。
10. 更新任务矩阵T-037 标为完成,下一推进指针改为 T-038。
11. 新增决策 D-029记录 T-037 采用窄 command-result 子集,以及 set-mode 不直接下发 motion abort 的 runtime-edge 降级理由。
### 改了哪些文件
- `wasm-port/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.hh`
- `wasm-port/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.cc`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tools/verify_task_emctask_subset.sh`
- `wasm-port/tools/verify_task_emctask_state_mode.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过。
- `./tools/verify_task_emctask_state_mode.sh`:通过,验证 T-037 abort/state/mode 实现和矩阵状态。
- `./tools/verify_task_emctask_subset.sh`:通过,确认 emctask subset source reuse 不回退。
- `./tools/verify_task_source_reuse_drift_docs.sh`:通过,确认 source reuse / drift / compatibility 文档已记录 T-037。
- `node ./tests/wasm/node/verify_task_state_matrix.mjs`:通过,确认 command 仍由 task cycle 消费。
- `./tests/wasm/node/verify_task_hal_sdk.sh`:通过,确认 SDK wrapper 不回退。
- `SKIP_TASK_HAL_BUILD=1 ./tests/wasm/node/verify_motion_hal_sync.sh`:通过,确认 low-level motion/HAL sync 不回退。
- `./tools/verify_task_hal_readiness_contract.sh`:通过,确认 readiness 不提升。
- `git diff --check -- ...`:通过。
### 下一步
推进 T-038实现 `emctask.cc` determine/update 子集,让 `determineMode()``determineState()``emcTaskUpdate()` 从 motion/io snapshot 推导 task status并进一步收敛当前 wrapper 推导逻辑。
## 2026-07-08 01:39 EDT
### 本轮目标
继续完成对标工作,推进 T-036实现 `taskintf.cc` jog/home/switchkins 子集,让 `emcJogIncr()``emcJointHome/Unhome()``emcMotionSetAout()` 接入结构化 taskintf/lcmot bridge并保持 Home/Jog/M428-M430 验收通过。
### 本轮做了什么
1. 读取任务矩阵,确认当前推进指针为 T-036。
2. 读取上游 `linuxcnc/src/emc/task/taskintf.cc`
- `emcJogIncr()` 填充 `EMCMOT_JOG_INCR`、axis/joint、vel、offset。
- `emcJointHome()` 填充 `EMCMOT_JOINT_HOME` 和 joint。
- `emcJointUnhome()` 填充 `EMCMOT_JOINT_UNHOME` 和 joint。
- `emcMotionSetAout()` 填充 `EMCMOT_SET_AOUT`、index、now、start/end。
3. 扩展 `linuxcnc_motion_runtime.h/.c`
- 新增 `lcmot_write_jog_incr()`
- 新增 `lcmot_write_joint_home()`
- 新增 `lcmot_write_joint_unhome()`
- 新增 `lcmot_write_aout()`
- 新增 `LCMOT_CMD_JOINT_HOME``LCMOT_CMD_JOINT_UNHOME`,并扩展 `LcmotCommand` 的 joint/aout 字段。
- 保留 JSON 兼容解析,但 taskintf 主路径改走结构化 ABI。
4. 扩展 `taskintf_wasm_subset.hh/.cc`
- 新增 `LC_TASKINTF_SUBSET_COMMAND_JOINT_UNHOME`
- 新增 `lc_taskintf_subset_joint_unhome()`
- 新增 `lc_taskintf_subset_jog_incr_ex()`,保留 axis/joint jog mode 和 motion id。
- 新增 `lc_taskintf_subset_jog_home_switchkins_anchor_list()`
- anchor list 纳入 `emcJointUnhome()`
5. 修改 `linuxcnc_task_hal_wasm.cpp`
- `issue_taskintf_motion_command()` 对 jog/home/unhome/aout 分别调用结构化 `lcmot_write_*`
- `taskintfSourceReuse` 新增 `jogHomeSwitchkinsIssueCount``jogHomeSwitchkinsStructuredIssueCount``jogHomeSwitchkinsAnchors`
6. 修改 `tools/build_task_hal_wasm.sh`,导出 `_lcmot_write_jog_incr``_lcmot_write_joint_home``_lcmot_write_joint_unhome``_lcmot_write_aout`
7. 更新 `tests/wasm/node/verify_task_hal_wasm.mjs`
- taskintf anchors 增加 `emcJointUnhome`
- 断言 `jogHomeSwitchkins*` 状态字段。
- MDI smoke 覆盖 M428、M429、M430。
- 直接 ABI smoke 覆盖 `lcmot_write_aout()``lcmot_write_jog_incr()``lcmot_write_joint_home()``lcmot_write_joint_unhome()`
- 新增输出 `taskintf_jog_home_switchkins_status=ok`
8. 新增 `tools/verify_task_taskintf_jog_home_switchkins.sh`,验证 T-036 的上游锚点、subset envelope、结构化 lcmot ABI、WASM export、smoke 输出和矩阵状态。
9. 更新 `tools/verify_task_taskintf_subset.sh``tools/verify_task_taskintf_linear_move.sh``tools/verify_task_source_reuse_drift_docs.sh`
10. 更新 `docs/source-reuse-map.md``docs/drift-report.md``docs/compatibility-validation.md`,记录 T-036 jog/home/switchkins 映射和验证 gate。
11. 更新任务矩阵T-036 标为完成,下一推进指针改为 T-037。
12. 新增决策 D-028记录 jog/home/switchkins 采用结构化 `lcmot_write_*` 下发readiness 不提升。
### 改了哪些文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.h`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `wasm-port/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.hh`
- `wasm-port/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.cc`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tools/build_task_hal_wasm.sh`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tools/verify_task_taskintf_jog_home_switchkins.sh`
- `wasm-port/tools/verify_task_taskintf_subset.sh`
- `wasm-port/tools/verify_task_taskintf_linear_move.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过,输出 `taskintf_jog_home_switchkins_status=ok`
- `./tools/verify_task_taskintf_jog_home_switchkins.sh`:通过,验证 T-036 jog/home/switchkins 实现和矩阵状态。
- `./tools/verify_task_taskintf_subset.sh`:通过,确认 taskintf subset source reuse 不回退。
- `./tools/verify_task_source_reuse_drift_docs.sh`:通过,确认 source reuse / drift / compatibility 文档已记录 T-036。
- `./tools/verify_task_taskintf_linear_move.sh`:通过,确认 T-035 gate 按当前矩阵口径不回退。
- `./tools/verify_task_taskintf_traj_control.sh`:通过,确认 T-034 gate 不回退。
- `./tools/verify_task_taskintf_motion_bridge.sh`:通过,确认 T-033 bridge gate 不回退。
- `./tools/verify_task_hal_readiness_contract.sh`:通过,确认 readiness 不提升。
- `./tests/wasm/node/verify_task_hal_sdk.sh`:通过,确认 SDK wrapper 不回退。
- `SKIP_TASK_HAL_BUILD=1 ./tests/wasm/node/verify_motion_hal_sync.sh`:通过,确认 low-level motion/HAL sync 不回退。
- `git diff --check -- ...`:通过。
### 下一步
推进 T-037实现 `emctask.cc` abort/state/mode 子集,让 `emcTaskAbort()``emcTaskSetMode()``emcTaskSetState()` 替换当前自有逻辑,并保持语义由 task cycle 触发。
## 2026-07-08 01:27 EDT
### 本轮目标
继续完成对标工作,推进 T-035实现 `taskintf.cc` linear move issue 子集,让 `emcTrajLinearMove()` 替换 task JSON linear move 拼接,并保持 G0/G1 smoke 通过。
### 本轮做了什么
1. 读取任务矩阵,确认当前推进指针为 T-035。
2. 读取上游 `linuxcnc/src/emc/task/taskintf.cc``emcTrajLinearMove()`,确认上游行为是填充 `EMCMOT_SET_LINE`、目标 pose、motion id、motion type、vel、ini maxvel、acc、ini maxjerk并通过 `usrmotWriteEmcmotCommand()` 写给 motion。
3. 扩展 `linuxcnc_motion_runtime.h/.c`
- 新增结构化 ABI `lcmot_write_linear_move()`
- `LcmotCommand` 增加 `motion_id``motion_type``ini_maxvel``acceleration``ini_maxjerk`
- linear/circular/jog issue 时优先使用 command motion id其次消费 `SET_MOTION_ID` 的 next id否则递增。
- 保留 `lcmot_write_command_json()` 兼容路径,并补充解析 `motionType``iniMaxVel``acceleration``iniMaxJerk`
4. 扩展 `taskintf_wasm_subset.hh/.cc`
- 新增 `lc_taskintf_subset_linear_move_ex()`
- linear command envelope 保留 line、motion type、motion id、velocity、ini maxvel、acceleration、ini maxjerk 和 pose。
- 新增 `lc_taskintf_subset_linear_move_anchor_list()`,固定 `emcTrajLinearMove,EMCMOT_SET_LINE,usrmotWriteEmcmotCommand`
5. 修改 `linuxcnc_task_hal_wasm.cpp`
- `pending_execute_motion_commands` 从纯 JSON 字符串改为 `PendingMotionCommand`
- linear move 主路径和 pending execute flush 都调用 `lcmot_write_linear_move()`
- 非 linear 的 jog/home/switchkins/traj control 暂保留现有 JSON 兼容路径,留给 T-036。
- status JSON 新增 `linearMoveIssueCount``linearMoveStructuredIssueCount``linearMoveAnchors`
6. 更新 `tools/build_task_hal_wasm.sh`,导出 `_lcmot_write_linear_move`
7. 更新 `tests/wasm/node/verify_task_hal_wasm.mjs`
- 第一段 motion plan 改为 `STRAIGHT_TRAVERSE`,后续仍覆盖 `STRAIGHT_FEED`
- 断言 `linearMoveIssueCount``linearMoveStructuredIssueCount``linearMoveAnchors`
- 增加直接 `_lcmot_write_linear_move()` smoke。
- 新增输出 `taskintf_linear_move_status=ok`
8. 新增 `tools/verify_task_taskintf_linear_move.sh`,验证 T-035 的上游锚点、subset envelope、结构化 `lcmot` ABI、WASM export、smoke 输出和矩阵状态。
9. 更新 `tools/verify_task_taskintf_subset.sh``tools/verify_task_taskintf_traj_control.sh``tools/verify_task_source_reuse_drift_docs.sh`
10. 更新 `docs/source-reuse-map.md``docs/drift-report.md``docs/compatibility-validation.md`,记录 T-035 linear move 映射和验证 gate。
11. 更新任务矩阵T-035 标为完成,下一推进指针改为 T-036。
12. 新增决策 D-027记录 linear move 采用结构化 `lcmot_write_linear_move()` 下发readiness 不提升。
### 改了哪些文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.h`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `wasm-port/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.hh`
- `wasm-port/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.cc`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tools/build_task_hal_wasm.sh`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tools/verify_task_taskintf_linear_move.sh`
- `wasm-port/tools/verify_task_taskintf_subset.sh`
- `wasm-port/tools/verify_task_taskintf_traj_control.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过,输出 `taskintf_linear_move_status=ok`
- `./tools/verify_task_taskintf_linear_move.sh`:通过,验证 T-035 linear move 实现和矩阵状态。
- `./tools/verify_task_taskintf_subset.sh`:通过,确认 taskintf subset source reuse 不回退。
- `./tools/verify_task_source_reuse_drift_docs.sh`:通过,确认 source reuse / drift / compatibility 文档已记录 T-035。
- `./tools/verify_task_taskintf_traj_control.sh`:通过,确认 T-034 gate 按当前矩阵口径不回退。
- `./tools/verify_task_hal_readiness_contract.sh`:通过,确认 readiness 不提升。
- `./tools/verify_task_taskintf_motion_bridge.sh`:通过,确认 T-033 bridge gate 不回退。
- `./tests/wasm/node/verify_task_hal_sdk.sh`:通过,确认 SDK wrapper 不回退。
- `SKIP_TASK_HAL_BUILD=1 ./tests/wasm/node/verify_motion_hal_sync.sh`:通过,确认 low-level motion/HAL sync 不回退。
- `git diff --check -- ...`:通过。
### 下一步
推进 T-036实现 `taskintf.cc` jog/home/switchkins 子集,让 `emcJogIncr()``emcJointHome/Unhome()``emcMotionSetAout()` 从现有 JSON 兼容路径继续收拢到结构化 taskintf/lcmot bridge。
## 2026-07-08 01:13 EDT
### 本轮目标
继续完成对标工作,推进 T-034实现 `taskintf.cc` traj control 子集,让 `emcTrajEnable/Disable/Abort/Pause/Step/Resume/SetMotionId` 接入 `lcmot`,并保持 pause/step/resume smoke 不回退。
### 本轮做了什么
1. 读取任务矩阵,确认当前推进指针为 T-034。
2. 读取上游 `linuxcnc/src/emc/task/taskintf.cc``emcTrajSetMotionId()``emcTrajEnable()``emcTrajDisable()``emcTrajAbort()``emcTrajPause()``emcTrajStep()``emcTrajResume()`
3. 读取上游 `linuxcnc/src/emc/motion/motion.h``command.c`,确认 `EMCMOT_ENABLE` / `EMCMOT_DISABLE` / `EMCMOT_ABORT` / `EMCMOT_PAUSE` / `EMCMOT_STEP` / `EMCMOT_RESUME` 的 motion command 边界。
4. 扩展 `LcmotStatusSnapshot`,在结构尾部追加 `motion_enabled``next_motion_id`,不改变既有字段偏移。
5. 扩展 `linuxcnc_motion_runtime.c`
- 新增 `LCMOT_CMD_ENABLE``LCMOT_CMD_DISABLE``LCMOT_CMD_SET_MOTION_ID`
- 新增 runtime 状态 `motion_enabled``next_motion_id``has_next_motion_id`
- `EMC_TRAJ_ENABLE` / `EMCMOT_ENABLE` 设置 enabled。
- `EMC_TRAJ_DISABLE` / `EMCMOT_DISABLE` 清 enabled 并清 current velocity。
- `EMC_TRAJ_SET_MOTION_ID` / `EMCMOT_SET_MOTION_ID` 设置下一条 motion id。
- linear/jog motion issue 时优先使用已设置 motion id否则保持原有递增行为。
6. 扩展 `taskintf_wasm_subset.hh/.cc`
- 新增 `LC_TASKINTF_SUBSET_COMMAND_TRAJ_ENABLE`
- 新增 `LC_TASKINTF_SUBSET_COMMAND_TRAJ_DISABLE`
- 新增 `LC_TASKINTF_SUBSET_COMMAND_TRAJ_SET_MOTION_ID`
- 新增 `lc_taskintf_subset_traj_enable()``lc_taskintf_subset_traj_disable()``lc_taskintf_subset_traj_set_motion_id()`
- 新增 `lc_taskintf_subset_traj_control_anchor_list()`
7. 修改 `linuxcnc_task_hal_wasm.cpp`
- `taskintf_motion_json()` 支持 enable/disable/set-motion-id command JSON。
- 新增 `taskintf_traj_control_issue_count``taskintf_traj_control_anchors`
- state ON 时通过 taskintf traj enable 接入 `lcmot`
- state OFF/ESTOP 时通过 taskintf traj disable 和 abort 接入 `lcmot`
- program line、timed motion sample、MDI linear move issue 前先通过 `lc_taskintf_subset_traj_set_motion_id()` 设置 motion id。
- status JSON 导出 `trajControlIssueCount``trajControlAnchors`、motion `enabled``nextMotionId`
8. 更新 `tests/wasm/node/verify_task_hal_wasm.mjs`
- 更新 taskintf source reuse anchors。
- 断言 `trajControlIssueCount``trajControlAnchors`
- 断言 motion `enabled``nextMotionId`
- 新增输出 `taskintf_traj_control_status=ok`
9. 更新 `tools/verify_task_taskintf_subset.sh`,把 SetMotionId/Enable/Disable 纳入 source reuse 验证。
10. 新增 `tools/verify_task_taskintf_traj_control.sh`,验证 T-034 的上游锚点、subset command envelope、`lcmot` 状态、wrapper JSON、smoke 输出和矩阵状态。
11. 更新 `docs/source-reuse-map.md``docs/drift-report.md``docs/compatibility-validation.md`,记录 T-034 traj control 映射和验证 gate。
12. 更新任务矩阵T-034 标为完成,下一推进指针改为 T-035。
### 改了哪些文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.h`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `wasm-port/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.hh`
- `wasm-port/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.cc`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tools/verify_task_taskintf_subset.sh`
- `wasm-port/tools/verify_task_taskintf_traj_control.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过,输出 `taskintf_traj_control_status=ok`
- `./tools/verify_task_taskintf_traj_control.sh`:验证 T-034 traj control 实现和矩阵状态。
- `./tools/verify_task_taskintf_subset.sh`:验证 taskintf subset source reuse 不回退。
- `./tools/verify_task_source_reuse_drift_docs.sh`:验证 source reuse / drift / compatibility 文档已记录 T-034。
- `./tools/verify_task_hal_readiness_contract.sh`:通过,确认 readiness 不提升。
- `./tools/verify_task_taskintf_motion_bridge.sh`:通过,确认 T-033 bridge gate 在 T-034 后仍稳定。
- `./tests/wasm/node/verify_task_hal_sdk.sh`:通过,确认 SDK wrapper 不回退。
- `SKIP_TASK_HAL_BUILD=1 ./tests/wasm/node/verify_motion_hal_sync.sh`:通过,确认 low-level motion/HAL sync 不回退。
- `git diff --check -- ...`:通过。
### 下一步
推进 T-035实现 `taskintf.cc` linear move issue 子集,让 `emcTrajLinearMove()` 替换 task JSON linear move 拼接。
## 2026-07-08 01:00 EDT
### 本轮目标
继续完成对标工作,推进 T-033实现 `taskintf.cc` motion init/update/abort 子集,让 `emcMotionInit()``emcMotionUpdate()``emcMotionAbort()` 通过 WASM usrmot/lcmot bridge 工作。
### 本轮做了什么
1. 读取任务矩阵,确认当前推进指针为 T-033。
2. 读取上游 `linuxcnc/src/emc/task/taskintf.cc`
- `emcMotionInit()` 调用 traj/joint/axis/spindle init并由 usrmot 初始化 motion edge。
- `emcMotionAbort()` 对 joint jog abort 和 traj abort 发 command。
- `emcMotionUpdate()` 依次读取 usrmot status、config、internal、error再更新 traj/joint/axis/spindle status。
3. 读取上游 `linuxcnc/src/emc/motion/usrmotintf.cc`,确认 status/config/internal 是 split-read shared-memory copyerror read 是 motion error queue 消费。
4. 扩展 `runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.h/.c`
- 新增 `LcmotConfigSnapshot`
- 新增 `lcmot_read_config_snapshot()`
- 新增 `lcmot_read_error_message()`
- 在 abort、motion error、soft-limit 注入时写入窄 error message queue。
- 从 staged INI 的 `COORDINATES` 计算 axes/joints供 config snapshot 使用。
5. 扩展 `vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.hh/.cc`
- 新增 `lc_taskintf_subset_motion_init()`
- 新增 `lc_taskintf_subset_motion_update()`,通过 `lcmot_read_status_snapshot()``lcmot_read_config_snapshot()``lcmot_read_error_message()` 获取 motion 状态。
- 新增 `lc_taskintf_subset_motion_abort()`
- 新增 motion bridge anchor list`emcMotionInit,emcMotionUpdate,emcMotionAbort,usrmotReadEmcmotStatus,usrmotReadEmcmotConfig,usrmotReadEmcmotError`
6. 修改 `runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `lctask_init_session()` 改为通过 `lc_taskintf_subset_motion_init()` 初始化 motion。
- `wasm_emcMotionUpdate()` 改为通过 `lc_taskintf_subset_motion_update()` 读取 status/config/error。
- task abort 路径改为通过 `lc_taskintf_subset_motion_abort()` 生成 abort command。
- status JSON 新增 `taskintfMotionBridge`,暴露 source path、anchors、init/update/abort count、config snapshot 和 last error text。
7. 更新 `tools/build_task_hal_wasm.sh`,导出 `_lcmot_read_config_snapshot``_lcmot_read_error_message`
8. 更新 `tests/wasm/node/verify_task_hal_wasm.mjs`
- 断言 `taskintfMotionBridge` 的 source path、anchors、init/update count、config snapshot。
- 断言 task abort、motion error、soft-limit 的 last error text。
- 新增输出 `taskintf_motion_bridge_status=ok`
9. 更新 `tools/verify_task_taskintf_subset.sh`,把 `emcMotionInit()``emcMotionUpdate()``emcMotionAbort()` 纳入上游/source subset 检查。
10. 新增 `tools/verify_task_taskintf_motion_bridge.sh`,验证 T-033 的上游锚点、subset bridge、`lcmot` config/error ABI、WASM export、status JSON、smoke 输出和任务矩阵状态。
11. 更新 `docs/source-reuse-map.md``docs/drift-report.md``docs/compatibility-validation.md`,记录 T-033 窄 motion bridge 和验证 gate同时保持 readiness false。
12. 更新 `10-taskintf-usrmot-shim设计.md`,把 config/error read 从 T-032 缺口更新为 T-033 窄 ABI 已实现。
13. 更新任务矩阵T-033 标为完成,下一推进指针改为 T-034。
### 改了哪些文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.h`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `wasm-port/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.hh`
- `wasm-port/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.cc`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tools/build_task_hal_wasm.sh`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tools/verify_task_taskintf_subset.sh`
- `wasm-port/tools/verify_task_taskintf_motion_bridge.sh`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
- `wasm-port/working/10-taskintf-usrmot-shim设计.md`
### 验证了什么
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过,输出 `taskintf_motion_bridge_status=ok`
- `./tools/verify_task_taskintf_motion_bridge.sh`:验证 T-033 motion bridge 实现和矩阵状态。
- `./tools/verify_task_taskintf_subset.sh`:验证 taskintf subset 上游锚点不回退。
- `./tools/verify_task_source_reuse_drift_docs.sh`:验证 source reuse / drift / compatibility 文档已记录 T-033。
- `./tools/verify_task_hal_readiness_contract.sh`:通过,确认 readiness 仍不提升。
- `./tools/verify_task_usrmot_shim_design.sh`:通过,确认 T-032 usrmot shim 设计仍一致。
- `./tests/wasm/node/verify_task_hal_sdk.sh`:通过,确认 SDK wrapper 不受新增 export/bridge 影响。
- `git diff --check -- ...`:通过。
### 下一步
推进 T-034实现 `taskintf.cc` traj control 子集,让 `emcTrajEnable/Disable/Abort/Pause/Step/Resume/SetMotionId` 接入 `lcmot`
## 2026-07-08 00:52 EDT
### 本轮目标
继续完成对标工作,推进 T-032设计 `taskintf.cc` usrmot shim明确 `usrmot*``lcmot_*` 的 command write、status read、config read、error read 映射。
### 本轮做了什么
1. 读取任务矩阵,确认当前推进指针为 T-032。
2. 读取上游 `linuxcnc/src/emc/motion/usrmotintf.h``usrmotintf.cc``linuxcnc/src/emc/task/taskintf.cc`
- `usrmotWriteEmcmotCommand()` 写 command slot 并等待 `commandNumEcho` / `commandStatus`
- `usrmotReadEmcmotStatus()``usrmotReadEmcmotConfig()``usrmotReadEmcmotInternal()` 都是 shared-memory copy + split-read 稳定性检查。
- `usrmotReadEmcmotError()` 从 motion error ring 取最早错误字符串。
- `emcMotionUpdate()` 按 status、config、internal、error 顺序读取 motion 侧数据。
3. 读取当前 WASM `lcmot_*` C ABI确认已有
- `lcmot_init_from_ini()`
- `lcmot_write_command_json()`
- `lcmot_read_status_snapshot()`
- `lcmot_read_status_json()`
- `lcmot_read_hal_snapshot_json()`
- `lcmot_reset()`
4. 确认当前没有 `lcmot_read_config_snapshot()``lcmot_read_error_message()`,因此 config read/error read 不能被声明为已实现。
5. 新增 `10-taskintf-usrmot-shim设计.md`
- 明确不直接复用完整 `usrmotintf.cc`
- 明确 `usrmotIniLoad()``usrmotInit()``usrmotExit()``lcmot_init_from_ini()` / `lcmot_reset()` 的初始化映射。
- 明确 command write 到 `lcmot_write_command_json()` 的映射和返回值降级策略。
- 明确 status read 到 `lcmot_read_status_snapshot()`,且不得推进 servo、不得消费队列、不得反解析 JSON。
- 明确 config read 需要新增 `lcmot_read_config_snapshot()`
- 明确 error read 需要新增 `lcmot_read_error_message()`
6. 新增 `tools/verify_task_usrmot_shim_design.sh`
- 校验上游 usrmot/taskintf 锚点存在。
- 校验现有 `lcmot_*` ABI 能覆盖 init、reset、command write、status snapshot。
- 校验设计文档包含 command/status/config/error 四类映射和禁止路线。
- 校验任务矩阵 T-032 已完成且下一推进指针为 T-033。
7. 更新 `README.md`,把 `09-emc_nml复用评估.md``10-taskintf-usrmot-shim设计.md` 加入工作文档索引。
8. 更新任务矩阵T-032 标为完成,下一推进指针改为 T-033。
### 改了哪些文件
- `wasm-port/working/10-taskintf-usrmot-shim设计.md`
- `wasm-port/tools/verify_task_usrmot_shim_design.sh`
- `wasm-port/working/README.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tools/verify_task_usrmot_shim_design.sh`:验证 T-032 usrmot shim 设计、上游锚点、`lcmot_*` ABI 和矩阵状态。
- `./tools/verify_task_taskintf_subset.sh`:验证既有 `taskintf_wasm_subset` 仍锚定上游 `taskintf.cc`
- `./tools/verify_task_source_reuse_drift_docs.sh`:验证 T-030 文档一致性不回退。
- `./tools/verify_task_hal_readiness_contract.sh`:通过,确认 T-032 设计没有提升 readiness 口径。
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过,确认 task-HAL smoke 不回退。
- `git diff --check -- ...`:通过。
### 下一步
推进 T-033实现 `taskintf.cc` motion init/update/abort 子集,让 `emcMotionInit()``emcMotionUpdate()``emcMotionAbort()` 经 WASM usrmot/lcmot bridge 工作。
## 2026-07-08 00:43 EDT
### 本轮目标
继续完成对标工作,推进 T-030更新 source reuse map 与 drift/compatibility 文档,反映 task 主循环迁移阶段和 readiness 真实状态。
### 本轮做了什么
1. 更新 `docs/source-reuse-map.md`
- 将 phase0 行中“Web simulation promotion”改为“Web simulation validation”避免误读为 readiness 提升。
- 扩展 Task/motion/HAL simulation runtime 行,记录 T-027 motion ERROR/soft-limit、T-028 top/task/motion/io RCS DONE/EXEC/ERROR 聚合、T-029 `emc_nml.hh` 不直接 include 的决策。
- 保持 readiness contract`task_hal_runtime_promoted=0``nativeTaskReady=false``nativeHalSyncReady=false``fullLinuxCncProgramExecutionReady=false`
- 增加 `tools/verify_task_emc_nml_reuse_plan.sh``tools/verify_task_source_reuse_drift_docs.sh` 为 validation gate。
2. 更新 `docs/drift-report.md`
- 新增 Task/motion/HAL WASM runtime runtime-edge boundary。
- 新增 `emc_nml.hh` status container boundary明确完整上游头文件只评估、不 vendored、不直接 include。
- Known Gaps 中补充 task-cycle motion snapshot、motion abort/error/soft-limit、RCS 聚合和 readiness 不提升口径。
3. 更新 `docs/compatibility-validation.md`
- 在 WASM harness 列表中新增 `verify_task_hal_wasm.sh``verify_task_hal_sdk.sh`
- 新增 readiness、`emc_nml` 复用评估和 source/drift 文档一致性 gate。
4. 新增 `tools/verify_task_source_reuse_drift_docs.sh`
- 验证 source reuse、drift、compatibility 三份文档都包含 readiness false、RCS 聚合、`emc_nml.hh` 决策和验证脚本。
- 拒绝 source reuse 中重新出现 `nativeTaskReady=true``nativeHalSyncReady=true`
- 验证任务矩阵 T-030 已完成。
5. 更新任务矩阵T-030 标为完成,下一推进指针改为 T-032。
### 改了哪些文件
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/docs/drift-report.md`
- `wasm-port/docs/compatibility-validation.md`
- `wasm-port/tools/verify_task_source_reuse_drift_docs.sh`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tools/verify_task_source_reuse_drift_docs.sh`:验证 source reuse、drift、compatibility 文档一致性。
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过,确认 task-HAL smoke 不回退。
- `./tools/verify_task_hal_readiness_contract.sh`:通过,确认 readiness 口径不回退。
- `./tools/verify_task_emc_nml_reuse_plan.sh`:通过,确认 T-029 复用评估仍一致。
- `git diff --check -- ...`:通过。
- `./tests/docs/node/verify_project_release_handoff_docs.sh`:未完成,失败原因是工作树缺失 `/home/mes123456/cnc_wams/PROJECT_COMPLETION_TRACKER.md`,不是本轮文档断言失败。
### 下一步
推进 T-032设计 `taskintf.cc` usrmot shim明确 `usrmot*``lcmot_*` 的 command write、status read、config read、error read 映射。
## 2026-07-08 00:36 EDT
### 本轮目标
继续完成对标工作,推进 T-029评估 vendored `emc_nml.hh` 直接复用可行性,形成直接 include、窄 shim或分阶段 typedef 的选择记录。
### 本轮做了什么
1. 读取当前 `runtime/core/shims/nml_intf/emc.hh`,确认现有 shim 只覆盖 `EmcJointType``EMC_STAT.motion.traj.linearUnits``extern EMC_STAT *emcStatus`
2. 检查 `wasm-port/vendor/linuxcnc/src/emc/nml_intf/`,确认当前未 vendored `emc_nml.hh`
3. 读取上游 `linuxcnc/src/emc/nml_intf/emc_nml.hh`,确认完整头文件会拉入:
- `linuxcnc.h`
- `emcpos.h`
- `emc.hh`
- `libnml/rcs/rcs.hh`
- `libnml/nml/cmd_msg.hh`
- `libnml/nml/stat_msg.hh`
- `rs274ngc/modal_state.hh`
- `canon.hh`
- `rs274ngc/rs274ngc.hh`
4. 确认 `emc_nml.hh` 中的 `EMC_TRAJ_STAT``EMC_MOTION_STAT``EMC_TASK_STAT``EMC_IO_STAT``EMC_STAT` 都继承 NML/RCS message 基类,并包含 `update(CMS *)` hooks。
5. 形成 T-029 结论:当前不直接 include 完整 `emc_nml.hh`;先采用分阶段 typedef / 窄 `StandaloneEmcStatus` 路线。
6. 新增 `09-emc_nml复用评估.md`,记录:
- 直接 include 依赖清单。
- 阻塞项。
- 当前需要的状态子集。
- 采用分阶段 typedef / 窄 status 容器的原因。
- 后续 T-007/T-030/T-032/T-033/T-038 入口。
7. 新增 `tools/verify_task_emc_nml_reuse_plan.sh`,固定 T-029 结论和验收:
- 上游 `emc_nml.hh` 存在。
- 当前 vendor tree 未声称完整 `emc_nml.hh` 已 vendored。
- 文档包含直接 include 依赖、选择、阻塞和后续入口。
- 任务矩阵将 T-029 标为完成。
8. 更新任务矩阵T-029 标为完成,下一推进指针改为 T-030。
### 改了哪些文件
- `wasm-port/working/09-emc_nml复用评估.md`
- `wasm-port/tools/verify_task_emc_nml_reuse_plan.sh`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tools/verify_task_emc_nml_reuse_plan.sh`:验证 T-029 复用评估记录和矩阵状态。
### 下一步
推进 T-030更新 source reuse map 与 drift 文档,反映 task 主循环迁移阶段和 readiness 真实状态。
## 2026-07-08 00:33 EDT
### 本轮目标
继续完成对标工作,推进 T-028对齐 top-level `RCS_STATUS` 聚合,让 task/motion/io 三方 DONE/EXEC/ERROR 聚合逻辑与 `emctaskmain.cc` 更接近。
### 本轮做了什么
1. 读取上游 `linuxcnc/src/emc/task/emctaskmain.cc`
- `WAITING_FOR_MOTION` / `WAITING_FOR_IO` / `WAITING_FOR_MOTION_AND_IO` 分支中motion/io `RCS_STATUS::ERROR` 会驱动 task exec errormotion/io `DONE` 会驱动等待完成。
- 顶层 status write 前的聚合逻辑task exec error、motion error、io error 任一存在则 top/task `ERROR`task exec done、motion done、io done、command/list 为空且 interp idle 则 top/task `DONE`;否则 top/task `EXEC`
2. 将 T-027 的临时 `taskTopLevelStatus` helper 升级为显式聚合字段:
- `task_rcs_status`
- `motion_rcs_status`
- `io_rcs_status`
- `top_level_rcs_status`
3. 实现 `update_top_level_status()`
- motion snapshot status `2` -> `ERROR``0` -> `DONE`,其它 -> `EXEC`
- IO error shim -> `ERROR`,否则 `DONE`
- task exec `ERROR`、motion `ERROR`、io `ERROR` 任一存在 -> top/task `ERROR`
- task exec `DONE`、interp `IDLE`、pending command 为空、pending execute motion 为空、motion `DONE`、io `DONE` -> top/task `DONE`
- 其它状态 -> top/task `EXEC`
4. 修改 `write_status_snapshot()`,每次写 status buffer 前都调用 `update_top_level_status()`,保证 send/status/read path 不绕过聚合。
5. 更新 status JSON
- 顶层 `taskTopLevelStatus` 来自 `top_level_rcs_status`
- 新增 `rcsStatus.top/task/motion/io`
- task 对象新增 `task.status`
6. 更新 `verify_task_hal_wasm.mjs`
- RUN 后 interp 仍未 idle 时断言 top/task 为 `EXEC`motion 为 `DONE`io 为 `DONE`
- motion queue 完成后断言 top/task/motion/io 全部为 `DONE`
- motion abort、motion ERROR、soft-limit、IO error 均断言聚合为 `ERROR`,并区分 motion/io 子状态。
- 新增输出 `task_top_level_rcs_status_aggregation=ok`
7. 更新任务矩阵T-028 标为完成,下一推进指针改为 T-029。
### 改了哪些文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过,新增 `task_top_level_rcs_status_aggregation=ok`
### 下一步
推进 T-029评估 vendored `emc_nml.hh` 直接复用可行性,形成直接 include、窄 shim 或分阶段 typedef 的选择记录。
## 2026-07-08 00:22 EDT
### 本轮目标
继续完成对标工作,推进 T-027新增 motion error/soft-limit 注入测试,让 subordinate sync 对 motion ERROR 和 soft-limit 的 task 状态影响有专门覆盖。
### 本轮做了什么
1. 复核 `linuxcnc_motion_runtime.c/.h`,确认当前 motion snapshot 只有 `aborted` 和聚合 `status`,没有独立 motion error 或 soft-limit 字段。
2.`LcmotRuntime` 中新增、在 `LcmotStatusSnapshot` 尾部追加:
- `motion_error`
- `on_soft_limit`
3. 在 motion command parser 中新增两个测试注入命令:
- `EMCMOT_INJECT_ERROR`
- `EMCMOT_INJECT_SOFT_LIMIT`
4. 在 motion runtime 中将上述两个注入命令作为即时 control 命令处理,并在 error/soft-limit 后停止继续消费 motion queue。
5. 更新 `lcmot_read_status_snapshot()`,当 aborted、motion error 或 soft-limit 任一存在时输出 `status=2`
6. 更新 motion JSON 和 task status JSON暴露 `status``motionError``onSoftLimit`
7. 更新 `sync_subordinate_states()`
- `on_soft_limit` 驱动 task `execState=ERROR``errorText=MOTION_SOFT_LIMIT`
- `motion_error` 或 motion `status=2` 驱动 task `execState=ERROR``errorText=MOTION_ERROR`
- 保留 task 自己发起 abort 的 cleanup 分支,避免用户主动 abort 被误报。
8. 新增最小 `taskTopLevelStatus` 导出T-027 先覆盖 ERROR/DONE/EXEC 的保守状态表面,完整 RCS 聚合仍留给 T-028。
9. 更新 `verify_task_hal_wasm.mjs`
- 新增 motion ERROR 注入断言。
- 新增 soft-limit 注入断言。
- 断言 motion abort、motion ERROR、soft-limit、IO error 均驱动 `taskTopLevelStatus=ERROR`
- 新增输出 `motion_error_drives_task_error=ok``motion_soft_limit_drives_task_error=ok`
10. 初次回归 `verify_motion_hal_sync.sh` 时发现 `LcmotStatusSnapshot` 是 C ABI 固定 offset 结构;新增字段插入中间会破坏现有 Node struct 读取。随后将新增字段移动到结构尾部,保留已有字段 offset 不变。
11. 更新任务矩阵T-027 标为完成,下一推进指针改为 T-028。
### 改了哪些文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.h`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过,新增 `motion_error_drives_task_error=ok``motion_soft_limit_drives_task_error=ok`
- `SKIP_TASK_HAL_BUILD=1 ./tests/wasm/node/verify_motion_hal_sync.sh`:通过,确认 snapshot struct 固定 offset 不回退。
- `SKIP_TASK_HAL_BUILD=1 ./tests/wasm/node/verify_task_hal_sdk.sh`:通过。
- `node tests/wasm/node/verify_task_state_matrix.mjs`:通过。
- `./tests/native/verify_task_hal_phase0.sh`:通过。
- `./tools/verify_task_hal_readiness_contract.sh`:通过。
- `git diff --check -- ...`:通过。
### 下一步
推进 T-028对齐 top-level `RCS_STATUS` 聚合,让 task/motion/io 三方 DONE/EXEC/ERROR 聚合逻辑与 `emctaskmain.cc` 更接近。
## 2026-07-08 00:13 EDT
### 本轮目标
继续完成对标工作,推进 T-015修正 readiness 文档和实现口径,确保 `nativeTaskReady``nativeHalSyncReady``fullLinuxCncProgramExecutionReady` 与当前能力边界一致。
### 本轮做了什么
1. 复核 `docs/source-reuse-map.md`,确认其中仍有旧口径:声称 Task/motion/HAL simulation runtime 已 promoted并把 native task/HAL readiness 误写为 true。
2. 更新 `docs/source-reuse-map.md`
- 将 Task/motion/HAL simulation runtime classification 改为 runtime-edge adapter明确不是 full native task/HAL promotion。
- 记录当前 readiness contract`task_hal_runtime_promoted=0``nativeTaskReady=false``nativeHalSyncReady=false``fullLinuxCncProgramExecutionReady=false`
- 将 Known Gaps 中“task/motion/HAL sync 已完整覆盖 deterministic Web simulation”的旧表述改为 partial Web simulation adapter。
3. 更新 `tests/wasm/node/verify_task_hal_wasm.mjs`,增加 `fullLinuxCncProgramExecutionReady=false` 断言,并输出 `task_hal_readiness_status_contract=ok`
4. 新增 `tools/verify_task_hal_readiness_contract.sh`
- 调用 `verify_task_hal_source_manifest.sh` 验证 manifest readiness 仍为未 promoted。
- 检查 `source-reuse-map.md` 包含 false readiness contract。
- 检查文档中不再包含 native task/HAL readiness true 或 full boundary promoted claim。
- 检查 runtime 和 WASM test 均固定 `fullLinuxCncProgramExecutionReady=false`
5. 更新任务矩阵T-015 标为完成,下一推进指针改为 T-027。
### 改了哪些文件
- `wasm-port/docs/source-reuse-map.md`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tools/verify_task_hal_readiness_contract.sh`
- `wasm-port/working/02-项目程序开发详细步骤.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tools/verify_task_hal_readiness_contract.sh`:通过,输出 `task_hal_readiness_contract_status=ok`
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过,新增输出 `task_hal_readiness_status_contract=ok`
- `./tests/native/verify_task_hal_phase0.sh`:通过,输出 `task_hal_phase0_native_probe_gate=ok`
- `SKIP_TASK_HAL_BUILD=1 ./tests/wasm/node/verify_task_hal_sdk.sh`:通过。
- `SKIP_TASK_HAL_BUILD=1 ./tests/wasm/node/verify_motion_hal_sync.sh`:通过。
- `git diff --check -- ...`:通过。
- `rg` 检查 `source-reuse-map.md``working` 文档中不再存在 native task/HAL readiness true 或 full boundary promoted 旧表述。
### 下一步
推进 T-027新增 motion error/soft-limit 注入测试,让 subordinate sync 对 motion ERROR 和 soft-limit 的 task/top-level 状态影响有专门覆盖。
## 2026-07-07 23:59 EDT
### 本轮目标
继续完成对标工作,推进 T-014引入 vendored/upstream `emccanon.cc` 的可编译 canonical linear motion 子集,让 linear motion command 生成继续减少 standalone 自有语义。
### 本轮做了什么
1. 读取上游 `/home/mes123456/cnc_wams/linuxcnc/src/emc/task/emccanon.cc` 中的 canonical motion 函数:
- `generate_fast_move()`
- `generate_move()`
- `STRAIGHT_TRAVERSE()`
- `STRAIGHT_FEED()`
2. 确认完整 `emccanon.cc` 依赖 `CanonConfig_t`、offset/unit conversion、`interp_list`、state tags、NURBS、spindle/tool/coolant 等大量 canonical callback 边界,不适合在 T-014 直接完整编译。
3. 新增 `vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.hh``emccanon_wasm_subset.cc`
- 定义 `LcEmcCanonSubsetPose``LcEmcCanonSubsetLinearMove`
- 实现 `lc_emccanon_subset_straight_traverse()``lc_emccanon_subset_straight_feed()`
- 保留 source path 和 anchor list`src/emc/task/emccanon.cc``generate_fast_move,generate_move,STRAIGHT_TRAVERSE,STRAIGHT_FEED`
4. 更新 `tools/build_task_hal_wasm.sh`,将 `emccanon_wasm_subset.cc` 纳入 task-HAL WASM 构建。
5. 更新 `linuxcnc_task_hal_wasm.cpp`
- 新增 canonical pose/linear move helper。
- 将 program line move、timed motion sample、MDI linear move 改为先经 emccanon subset 生成 canonical linear move envelope再交给 taskintf subset 生成 task-to-motion command envelope。
- 在 status JSON 中新增 `emccanonSourceReuse`,暴露 source path、anchors 和 issue count。
6. 更新 `verify_task_hal_wasm.mjs`,断言 `emccanonSourceReuse` 字段来自 `src/emc/task/emccanon.cc`,并新增输出 `emccanon_subset_source_reuse_status=ok`
7. 新增 `tools/verify_task_emccanon_subset.sh`,验证上游 anchors、vendor subset、build script inclusion。
8. 更新任务矩阵T-014 标为完成,下一推进指针改为 T-015。
### 改了哪些文件
- `wasm-port/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.hh`
- `wasm-port/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.cc`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tools/build_task_hal_wasm.sh`
- `wasm-port/tools/verify_task_emccanon_subset.sh`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tools/verify_task_emccanon_subset.sh`:通过,输出 `task_emccanon_subset_source_reuse=ok`
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过,新增 `emccanon_subset_source_reuse_status=ok`
### 下一步
推进 T-015修正 readiness 文档和实现口径,确保 `nativeTaskReady``nativeHalSyncReady``fullLinuxCncProgramExecutionReady` 与当前能力边界一致。
## 2026-07-07 23:51 EDT
### 本轮目标
继续完成对标工作,推进 T-013引入 vendored/upstream `taskintf.cc` 的可编译 motion command issuing 子集,让 task-to-motion command 边界更接近上游。
### 本轮做了什么
1. 读取上游 `/home/mes123456/cnc_wams/linuxcnc/src/emc/task/taskintf.cc` 中的 motion bridge 函数:
- `emcTrajAbort/Pause/Step/Resume()`
- `emcTrajLinearMove()`
- `emcJogIncr()`
- `emcJointHome()`
- `emcMotionSetAout()`
2. 确认完整 `taskintf.cc` 直接依赖 `usrmot`、NML、INI config 和 native motion process edge不适合在 T-013 直接完整编译。
3. 新增 `vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.hh``taskintf_wasm_subset.cc`
- 定义 `LcTaskIntfSubsetMotionCommand` 作为 task-to-motion command envelope。
- 实现 traj control、linear move、jog incr、joint home、set aout 的最小 command envelope 生成函数。
- 保留 source path 和 anchor list`src/emc/task/taskintf.cc` 及对应函数族。
4. 更新 `tools/build_task_hal_wasm.sh`,将 `taskintf_wasm_subset.cc` 纳入 task-HAL WASM 构建。
5. 更新 `linuxcnc_task_hal_wasm.cpp`
- 新增 `taskintf_motion_json()`,把 `LcTaskIntfSubsetMotionCommand` 序列化为现有 `lcmot_*` 可接受的 motion JSON。
- 新增 `queue_taskintf_motion_command()` / `forward_taskintf_motion_command()`
- 将 pause/resume/step/abort、MDI switchkins、MDI linear move、JOG、HOME、program linear move 和 timed motion sample 的 issue 边界改为经 taskintf subset 生成 command envelope。
- 在 status JSON 中新增 `taskintfSourceReuse`,暴露 source path、anchors 和 issue count。
6. 修正 JOG axis index 到轴字母的映射,避免 A/B/C 被错误映射为 ASCII 连续字符。
7. 更新 `verify_task_hal_wasm.mjs`,断言 `taskintfSourceReuse` 字段来自 `src/emc/task/taskintf.cc`,并新增输出 `taskintf_subset_source_reuse_status=ok`
8. 新增 `tools/verify_task_taskintf_subset.sh`,验证上游 anchors、vendor subset、build script inclusion。
9. 更新任务矩阵T-013 标为完成,下一推进指针改为 T-014。
### 改了哪些文件
- `wasm-port/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.hh`
- `wasm-port/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.cc`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tools/build_task_hal_wasm.sh`
- `wasm-port/tools/verify_task_taskintf_subset.sh`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tools/verify_task_taskintf_subset.sh`:通过,输出 `task_taskintf_subset_source_reuse=ok`
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过,新增 `taskintf_subset_source_reuse_status=ok`
### 下一步
推进 T-014引入 vendored/upstream `emccanon.cc` 可编译子集,让 canonical motion command 生成继续向 LinuxCNC 源码锚点收敛。
## 2026-07-07 23:42 EDT
### 本轮目标
继续完成对标工作,推进 T-012引入 vendored/upstream `emctask.cc` 的可编译子集,并新增 source reuse 验证。
### 本轮做了什么
1. 复核 T-012 要求,确认当前 `wasm-port/vendor/linuxcnc/src/emc/task` 尚不存在完整 task 源码,`verify_task_hal_source_manifest.sh` 仍显示 task 源码 vendor-ready 为 false。
2. 读取上游 `/home/mes123456/cnc_wams/linuxcnc/src/emc/task/emctask.cc``determineMode()``determineState()``emcTaskUpdate()` 锚点,确认这组状态推导逻辑可以先做窄子集,不拉入 interpreter、NML、dlopen、IO/native process 边界。
3. 新增 `wasm-port/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.hh``emctask_wasm_subset.cc`
- 暴露 `LcEmcTaskSubsetUpdateInput` / `LcEmcTaskSubsetUpdateResult`
- 实现上游 `determineMode()``determineState()``emcTaskUpdate()` 的最小状态推导子集。
- 保留 source path 和 anchor list`src/emc/task/emctask.cc``determineMode,determineState,emcTaskUpdate`
4. 更新 `tools/build_task_hal_wasm.sh`
- 增加 `vendor/linuxcnc/src` include。
-`vendor/linuxcnc/src/emc/task/emctask_wasm_subset.cc` 纳入 task-HAL WASM 构建。
5. 更新 `linuxcnc_task_hal_wasm.cpp`
-`wasm_emcTaskUpdate()` 阶段调用 `lc_emctask_subset_update()`
- 在 status JSON 中新增 `emctaskSourceReuse`,暴露 `emctaskSubsetCompiled`、source path、anchors、derived mode/state、motion line 等证据。
6. 更新 `verify_task_hal_wasm.mjs`,断言 `emctaskSourceReuse` 字段来自 `src/emc/task/emctask.cc` 锚点,并新增输出 `emctask_subset_source_reuse_status=ok`
7. 新增 `tools/verify_task_emctask_subset.sh`
- 验证上游 `emctask.cc` 存在。
- 验证上游 anchor 存在。
- 验证 vendor subset 文件存在并记录同一 source path/anchors。
- 验证 build script 已纳入 `emctask_wasm_subset.cc`
8. 更新任务矩阵T-012 标为完成,下一推进指针改为 T-013。
### 改了哪些文件
- `wasm-port/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.hh`
- `wasm-port/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.cc`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tools/build_task_hal_wasm.sh`
- `wasm-port/tools/verify_task_emctask_subset.sh`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tools/verify_task_emctask_subset.sh`:通过,输出 `task_emctask_subset_source_reuse=ok`
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过,新增 `emctask_subset_source_reuse_status=ok`
- `node tests/wasm/node/verify_task_state_matrix.mjs`:通过。
### 下一步
推进 T-013引入 vendored/upstream `taskintf.cc` 可编译子集,优先把 motion command issuing 的边界从 JSON 拼接继续迁向 LinuxCNC 式 task-to-motion bridge。
## 2026-07-07 23:34 EDT
### 本轮目标
继续完成对标工作,推进 T-011收缩 JSON command 自有状态机,使 `lctask_send_command_json()` 只作为 C ABI host 边界task 语义继续转入 LinuxCNC 式 plan/execute 周期层。
### 本轮做了什么
1. 复核当前 `linuxcnc_task_hal_wasm.cpp`,确认 `wasm_emcTaskPlan()` 仍通过重新调用 `lctask_send_command_json()` 消费 pending command。
2. 新增内部 `TaskCommandType``TaskCommand`,把 `TaskRuntime.pending_commands``std::vector<std::string>` 改为 `std::vector<TaskCommand>`
3. 新增 `parse_task_command()`:在 C ABI host 边界把 JSON command envelope 解析为内部 command 类型;未知 command 直接返回 `-1`,不进入队列。
4. 新增 `apply_task_command()`:把原先 `lctask_send_command_json()` 中的 state/mode/run/pause/resume/step/abort/MDI/JOG/HOME/IO shim 语义迁入 task plan 阶段。
5. 修改 `wasm_emcTaskPlan()`:直接遍历内部 `TaskCommand` 并调用 `apply_task_command()`,不再回调 `lctask_send_command_json()`
6. 简化 `lctask_send_command_json()`:只负责解析 host JSON、入队 `TaskCommand`、记录 `task_command_queued`、写 status buffer。
7. 保持已有语义兼容run gate/home gate 等被拒绝时写 `errorText`,但 task cycle 本身不失败。
8. 更新 `verify_task_state_matrix.mjs`:新增未知 host command 被拒绝且不增加 pending queue 的断言,输出 `task_command_json_host_boundary=ok`
9. 更新任务矩阵T-011 标为完成,下一推进指针改为 T-012。
### 改了哪些文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_state_matrix.mjs`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过。
- `node tests/wasm/node/verify_task_state_matrix.mjs`:通过,新增 `task_command_json_host_boundary=ok`
- `./tests/native/verify_task_hal_phase0.sh`:通过,确认 phase0 gate 不回退。
### 下一步
推进 T-012引入 vendored/upstream `emctask.cc` 可编译子集,先做可编译边界和 source reuse 验证,再继续替换 standalone task 语义。
## 2026-07-07 23:10 EDT
### 本轮目标
先解决 `verify_task_hal_phase0.sh` 因缺失 `xyzac-trt_cmds.hal` 失败的问题,再继续推进对标工作中的 T-010把 pause/resume/step 的 motion issue 放到 execute 阶段,并用周期 snapshot 断言其行为。
### 本轮做了什么
1. 复核 `verify_task_hal_phase0.sh` 调用链,确认失败来自 `probe_trt_task_hal_runtime.sh` 检查 TRT 机器目录时找不到 `xyzac-trt_cmds.hal`
2. 确认 `../linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/` 是只读上游输入,不直接补文件。
3.`probe_trt_task_hal_runtime.sh` 中新增 `RUN_DIR/machine` overlay
- 优先把上游 `../linuxcnc` 机器目录的条目 symlink 到 overlay。
- 对上游缺失的顶层条目,从 `wasm-port/vendor/linuxcnc/.../table-rotary-tilting/` 补 symlink。
- 输出 `trt_task_hal_vendor_overlay_*` 证据,标明哪些文件来自 vendor fallback。
4. 运行 native probe 和 phase0 gate确认 `xyzac-trt_cmds.hal` 缺失问题闭合,`./tests/native/verify_task_hal_phase0.sh` 通过。
5. 继续推进 T-010`EMC_TASK_PLAN_PAUSE``EMC_TASK_PLAN_STEP``EMC_TASK_PLAN_RESUME` 从直接 `forward_motion_command()` 改为 `queue_execute_motion_command()`
6. 更新 `verify_task_hal_wasm.mjs`
- pause/resume/step 发送后,先断言 `pendingCommandDepth` 增加且 motion snapshot 尚未变化。
- task cycle 执行后,再断言 motion paused、resume、step 等状态变化。
- 新增输出 `pause_resume_step_motion_issue_from_execute=ok`
7. 更新任务矩阵T-016、T-010 标为完成,下一推进指针改为 T-011。
### 改了哪些文件
- `wasm-port/tests/native/probe_trt_task_hal_runtime.sh`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tests/native/probe_trt_task_hal_runtime.sh`:通过,输出 `trt_task_hal_source_proof_ready=1``trt_task_hal_probe_result=ready_disabled_by_default`
- `./tests/native/verify_task_hal_phase0.sh`:通过,输出 `task_hal_phase0_native_probe_gate=ok`
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过,包含新增 `pause_resume_step_motion_issue_from_execute=ok`
- `node tests/wasm/node/verify_task_state_matrix.mjs`:通过。
- `./tests/wasm/node/verify_task_hal_sdk.sh`:通过。
- `./tests/wasm/node/verify_motion_hal_sync.sh`:通过。
- `./tools/verify_task_hal_source_manifest.sh`通过readiness 仍保持保守 false。
### 下一步
推进 T-011继续收缩 JSON command 自有状态机,把 host JSON 进一步限制为 C ABI 边界task 语义继续向 LinuxCNC 式 plan/execute 层迁移。
## 2026-07-07 21:32 EDT
### 本轮目标
继续完成对标工作,推进 T-008`WAITING_FOR_MOTION``WAITING_FOR_MOTION_QUEUE` 和 queueFull 语义迁移为依赖周期 motion snapshot。
### 本轮做了什么
1.`wasm_emcTaskExecute()` 中读取上一周期 `state.motion_snapshot.queue_full`
2. 当 motion queue full 且存在待发 execute motion command 时,不再继续 forward motion而是保留 `pending_execute_motion_commands` 并将 `exec_state` 置为 `WAITING_FOR_MOTION_QUEUE`
3. 当 AUTO/program work 仍需 issue motion 但上一周期 motion queue full 时,将 `exec_state` 置为 `WAITING_FOR_MOTION_QUEUE` 并等待下一周期。
4.`sync_subordinate_states()` 中使用本周期 `motion_snapshot` 完成状态收敛:
- `WAITING_FOR_MOTION_QUEUE` 且 queue 不再 full 时切回 `WAITING_FOR_MOTION`
- `WAITING_FOR_MOTION` 且 motion queue/active depth 清空、in-position 为 true 时切到 `DONE`
- MDI motion 完成后同步把 interpreter 状态收敛到 `IDLE`
5. 更新 `verify_task_hal_wasm.mjs`
- 断言 MDI/JOG motion 完成后 `execState``WAITING_FOR_MOTION` 收敛到 `DONE`
- 构造 paused motion queue 填满 64 条命令的场景,证明 task 进入 `WAITING_FOR_MOTION_QUEUE`
- resume 后证明 queueFull 解除时 task 回到 `WAITING_FOR_MOTION`,最终 motion drain 后进入 `DONE`
- 新增输出 `task_waits_on_motion_snapshot_queue=ok`
6. 更新任务矩阵T-008 标为完成。
7. 继续推进 T-009`TaskRuntime` 中新增 `task_abort_requested`,区分 task 自己发起的 abort cleanup 与外部 motion abort/error。
8.`sync_subordinate_states()` 中处理外部 motion abort如果 motion snapshot 显示 aborted 且不是 task 发起的 abort则将 `exec_state` 置为 `ERROR``error_text` 置为 `MOTION_ABORTED`
9. 为 standalone IO runtime edge 增加窄测试 shim支持 `EMC_IO_INJECT_ERROR` command进入周期后由 subordinate sync 将 task 置为 `ERROR``error_text` 置为 `IO_ERROR`
10. 更新 `verify_task_hal_wasm.mjs`,新增 `motion_abort_drives_task_error=ok``io_error_drives_task_error=ok`
11. 更新任务矩阵T-009 标为完成,下一推进指针改为 T-010。
### 改了哪些文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过,新增 `task_waits_on_motion_snapshot_queue=ok`
- `./tests/wasm/node/verify_task_hal_wasm.sh` 继续新增 `motion_abort_drives_task_error=ok``io_error_drives_task_error=ok`
- `node tests/wasm/node/verify_task_state_matrix.mjs`:通过。
- `./tests/wasm/node/verify_task_hal_sdk.sh`:通过。
- `./tests/wasm/node/verify_motion_hal_sync.sh`:通过。
- `./tools/verify_task_hal_source_manifest.sh`通过readiness 仍保持保守 false。
- `git diff --check -- ...`:无输出,通过。
### 下一步
推进 T-010迁移 pause/resume/step 到 snapshot 驱动,并保持现有 pause/step/resume smoke 不回退。
## 2026-07-07 21:21 EDT
### 本轮目标
继续完成对标工作,从当前推进指针 T-023 开始,把 `lctask_run_cycles()` 拆成 LinuxCNC `emctaskmain.cc` 式周期阶段,并让 state/mode/home/run gate 在 task cycle 的 plan 阶段触发。
### 本轮做了什么
1. 复核 `04-任务矩阵.md`,确认 T-023 为当前推进指针T-025 仍要求后续把 MDI/JOG/HOME motion issue 拆到 execute 阶段。
2.`linuxcnc_task_hal_wasm.cpp` 中新增周期阶段函数:
- `task_cycle_begin()`
- `task_read_commands()`
- `wasm_emcTaskPlan()`
- `wasm_emcTaskExecute()`
- `sync_subordinate_states()`
- `wasm_emcTaskUpdate()`
- `update_top_level_status()`
- 复用既有 `wasm_emcMotionUpdate()``write_status_snapshot()`
3. 重排 `lctask_run_cycles()`,使每个周期按 cycle begin、command read、plan、execute、standalone servo step、motion update、subordinate sync、task update、top-level status、status write 的顺序执行。
4. 保留当前 command handler 作为 Phase 4 adapter`wasm_emcTaskPlan()` 在 task cycle 内通过 processing 标志调用;这样 state/mode/home/run gate 已由 cycle 触发,而不是 send API 直接触发。
5. 明确 T-025 尚未完成MDI/JOG/HOME motion issue 仍在 plan command handler 中 forward motion后续需要拆到 execute 阶段。
6. 更新任务矩阵T-006、T-023、T-024 标为完成。
7. 继续推进 T-025`TaskRuntime` 中新增 `pending_execute_motion_commands`
8. 将 MDI switchkins、普通 MDI linear move、JOG、HOME 的 motion command 改为排入 execute motion queue。
9.`wasm_emcTaskExecute()` 开头统一 flush `pending_execute_motion_commands`,并记录 `task_execute_motion_issue:<count>` 事件。
10. 在 task status 中新增 `pendingExecuteMotionDepth`,用于证明 plan 阶段只是排队execute 阶段负责 issue motion。
11. 更新 `verify_task_hal_wasm.mjs`,断言 MDI/JOG send 后 motion 不立即变化run cycle 后 execute issue 生效,并新增 `mdi_jog_home_motion_issue_from_execute=ok`
12. 更新任务矩阵T-025 标为完成,下一推进指针改为 T-008。
### 改了哪些文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过。
- `./tests/wasm/node/verify_task_hal_wasm.sh` 新增输出 `mdi_jog_home_motion_issue_from_execute=ok`
- `node tests/wasm/node/verify_task_state_matrix.mjs`:通过,继续覆盖 command send 入队、run cycle 后才改变状态。
- `./tests/wasm/node/verify_task_hal_sdk.sh`:通过。
- `./tests/wasm/node/verify_motion_hal_sync.sh`:通过。
### 下一步
推进 T-008`WAITING_FOR_MOTION``WAITING_FOR_MOTION_QUEUE` 和 queueFull 语义迁移为依赖周期 motion snapshot。随后继续 T-027/T-028 的 subordinate error sync 和 top-level `RCS_STATUS` 聚合。
## 2026-07-07 21:01 EDT
### 本轮目标
执行 T-002 基线固定,并完成 task 周期内结构化 motion snapshot、`wasm_emcMotionUpdate()`、task status buffer 和对应验证,避免 `lctask_read_status_json()` 继续把 motion JSON 当作 task 事实源。
### 本轮做了什么
1. 运行 T-002 要求的四个基线命令:
- `./tools/verify_task_hal_source_manifest.sh`
- `./tests/wasm/node/verify_motion_hal_sync.sh`
- `./tests/wasm/node/verify_task_hal_wasm.sh`
- `./tests/wasm/node/verify_task_hal_sdk.sh`
2. 额外运行 `./tests/native/verify_task_hal_phase0.sh`,确认 native probe 仍因缺失 `xyzac-trt_cmds.hal` 保持阻塞。
3.`linuxcnc_motion_runtime.h` 定义 `LcmotStatusSnapshot` 和 queue/axis 常量,字段覆盖 cycle、program line、motion id、status、in-position、paused、stepping、aborted、queue、axis/joint、velocity、switchkins/analog output。
4.`linuxcnc_motion_runtime.c` 实现 `lcmot_read_status_snapshot()`,该函数只复制 motion runtime 状态,不 step servo、不消费队列`lcmot_read_status_json()` 改为从同一 snapshot 派生。
5.`linuxcnc_task_hal_wasm.cpp` 增加 task 持有的 `motion_snapshot``motion_snapshot_valid``status_buffer`
6. 实现 `wasm_emcMotionUpdate()`,由 task 周期读取 `LcmotStatusSnapshot` 并写入 task runtime。
7.`lctask_read_status_json()` 改为导出最后一次 `write_status_snapshot()` 写出的 status buffer读取 status 不再调用 motion runtime 同步最新 motion。
8.`lctask_run_cycles()` 每个 task cycle 的 servo step 后执行 `wasm_emcMotionUpdate()``write_status_snapshot()`,形成 WASM standalone 边界下的周期 snapshot。
9. 更新 `build_task_hal_wasm.sh`,导出 `_lcmot_read_status_snapshot`
10. 更新 `verify_motion_hal_sync.mjs`,直接调用 `_lcmot_read_status_snapshot` 并断言结构字段。
11. 更新 `verify_task_hal_wasm.mjs`新增测试low-level `lcmot_step_servo()` 后 task status 不自动同步,直到下一次 `lctask_run_cycles()`
12. 更新任务矩阵,把 T-002、T-003、T-004、T-005、T-018、T-019、T-020、T-021、T-026 标为完成。
13. 继续推进 T-022`TaskRuntime` 中新增 `pending_commands`,把 `lctask_send_command_json()` 改为默认只验证并入队;`lctask_run_cycles()` 在每个 task cycle 开始消费 command queue。
14. 在 task status 中新增 `pendingCommandDepth`,用于证明 command send 后状态不立即变化。
15. 更新 `verify_task_state_matrix.mjs`,新增 `task_command_send_queues_until_cycle=ok`,并把 run gate 测试改为 send 后 run cycle 再读取拒绝结果。
16. 将任务矩阵 T-022 标为完成,并把下一推进指针移到 T-023。
### 改了哪些文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.h`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/tools/build_task_hal_wasm.sh`
- `wasm-port/tests/wasm/node/verify_motion_hal_sync.mjs`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tests/wasm/node/verify_task_state_matrix.mjs`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
- `./tools/verify_task_hal_source_manifest.sh`:通过;仍显示 `task_hal_runtime_promoted=0``nativeTaskReady=false``nativeHalSyncReady=false`
- `./tests/wasm/node/verify_motion_hal_sync.sh`:通过;新增 `motion_status_snapshot_struct=ok`
- `./tests/wasm/node/verify_task_hal_wasm.sh`:通过;新增 `task_status_updates_from_cycle_snapshot=ok`
- `./tests/wasm/node/verify_task_hal_sdk.sh`:通过。
- `node tests/wasm/node/verify_task_state_matrix.mjs`:通过;新增 `task_command_send_queues_until_cycle=ok`
- `./tests/native/verify_task_hal_phase0.sh`:仍失败,原因保持为缺失 `xyzac-trt_cmds.hal`,属于既有 T-016 阻塞。
### 下一步
推进 T-023/T-024/T-025把当前 command queue 消费逻辑继续拆成明确的 command read、plan、execute 阶段,并将 state/mode/home/run/MDI/JOG/HOME 语义逐步迁入对应阶段。
## 2026-07-07 19:45 EDT
### 本轮目标
继续分解 `emctask.cc``taskintf.cc``emccanon.cc` 的具体实施步骤,保证后续不是只搭 `lctask_run_cycles()` 骨架,而是逐步用上游 task 源码替换当前 JSON 自有状态机。
### 本轮做了什么
1. 使用 `rg` 提取 `linuxcnc/src/emc/task/emctask.cc``taskintf.cc``emccanon.cc` 中的函数列表。
2. 阅读 `emctask.cc``emcTaskAbort()``emcTaskSetMode()``emcTaskSetState()``determineMode()``determineState()``emcTaskPlan*()``emcTaskUpdate()`,确认其负责 task 状态、interpreter plan wrapper 和 status update。
3. 阅读 `taskintf.cc``emcTrajSetMotionId()``emcTrajEnable/Disable/Abort/Pause/Step/Resume()``emcTrajLinearMove()``emcTrajCircularMove()``emcMotionInit()``emcMotionAbort()``emcMotionUpdate()`,确认其负责 task 到 motion 的 command/status 边界。
4. 阅读 `emccanon.cc``FINISH()``ON_RESET()``generate_fast_move()``generate_move()``STRAIGHT_TRAVERSE()``STRAIGHT_FEED()``DWELL()`、spindle/tool canonical functions确认其负责 canon API 到 `interp_list` 的 command 生成。
5. 新增 `08-上游task源码替换分解.md`,按 `emctask.cc``taskintf.cc``emccanon.cc` 分别拆出优先函数、WASM 实施、依赖 shim、验收要求、迁移批次和禁止路线。
6. 更新 README将 08 文档加入索引和使用规则。
7. 更新 `02-项目程序开发详细步骤.md`,把阶段 5 的替换顺序细化为 taskintf bridge、emctask state/update、emctask plan wrapper、emccanon straight motion、emctask execute、emccanon spindle/tool/io。
8. 更新 `04-任务矩阵.md`,新增 T-031 到 T-046覆盖三份上游 task 源码的函数族迁移任务。
9. 更新 `05-验收证据.md`,新增本轮文档细化证据。
10. 更新 `06-决策记录.md`,新增 D-007明确先迁 `taskintf.cc` minimal bridge再迁 `emctask.cc``emccanon.cc`
### 改了哪些文件
- `wasm-port/working/README.md`
- `wasm-port/working/02-项目程序开发详细步骤.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
- `wasm-port/working/08-上游task源码替换分解.md`
### 验证了什么
本轮是文档分解轮,未修改 runtime 源码。验证重点:
- `find wasm-port/working -maxdepth 1 -type f | sort`
- `rg -n "T-031|D-007|emctask.cc|taskintf.cc|emccanon.cc|B1|B6" wasm-port/working`
- `git diff --check -- wasm-port/working`
### 下一步
先执行 T-002 固定最新基线证据;代码实施时按 T-018/T-019/T-020/T-021/T-022/T-023 建立周期基础,然后进入 T-031/T-034 的 `taskintf.cc` minimal bridge。
## 2026-07-07 19:29 EDT
### 本轮目标
继续完善 `wasm-port/working` 实施文档,使其完全围绕“把 `emctaskmain.cc` 周期结构迁到 `wasm-port`”展开,并达到后续可以按任务矩阵实施的粒度。
### 本轮做了什么
1. 复核现有 01、02、04、06 文档,确认已有方向但缺少上游代码锚点、字段映射和可验收子任务。
2. 重新对照上游:
- `linuxcnc/src/emc/task/emctaskmain.cc` 主循环 `3296-3484`
- `emcTaskExecute()` motion/io wait 分支 `2551-2700`
- `emctask_startup()` motion 初始化与首次 `emcMotionUpdate()` `2992-3054`
- `linuxcnc/src/emc/nml_intf/emc_nml.hh``EMC_TRAJ_STAT``EMC_MOTION_STAT``EMC_TASK_STAT``EMC_STAT` 字段定义。
3. 新增 `07-emctaskmain周期对标蓝图.md`写入上游周期锚点、WASM 周期骨架、`EMC_STAT` 字段映射、command read/plan/execute/motion update/subordinate sync/status write 对标要求和源码替换路线。
4. 更新 README将 07 蓝图加入索引,并要求涉及 task 主循环实现时同步查看该蓝图。
5. 更新 `01-项目功能内容.md`,补充 `emc_nml.hh` 为状态字段对标源,增加最小字段闭环和 status/command 行为完成定义。
6. 更新 `02-项目程序开发详细步骤.md`,把 motion snapshot、周期函数拆分、`EMC_STAT` 容器、JSON command 收缩等步骤细化。
7. 更新 `04-任务矩阵.md`,新增 T-017 到 T-030把设计、实现、测试、status buffer、command buffer、plan/execute/subordinate sync、上游源码替换等工作拆成可验收任务。
8. 更新 `05-验收证据.md`,记录本轮文档完善的验证命令、预期输出和 T-017 通过结论。
9. 更新 `06-决策记录.md`,新增 D-005 和 D-006固定 status read 不同步 motion、command send 不直接改变 task 语义。
### 改了哪些文件
- `wasm-port/working/README.md`
- `wasm-port/working/01-项目功能内容.md`
- `wasm-port/working/02-项目程序开发详细步骤.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
- `wasm-port/working/07-emctaskmain周期对标蓝图.md`
### 验证了什么
本轮仍是文档完善轮,未修改 runtime 源码。验证重点:
- `find wasm-port/working -maxdepth 1 -type f | sort`
- `rg -n "T-017|D-005|emctaskmain 周期对标蓝图|LcmotStatusSnapshot|command read" wasm-port/working`
- `git status --short wasm-port/working`
### 下一步
执行 `T-002` 固定最新 task/motion/HAL 基线证据,然后进入 `T-003/T-018/T-019`:设计并实现结构化 `LcmotStatusSnapshot`,为 task 周期内 `wasm_emcMotionUpdate()` 做准备。
## 2026-07-07 19:17 EDT
### 本轮目标
创建 `wasm-port/working` 推进文档,支撑后续按任务矩阵推进 LinuxCNC `emctaskmain.cc` task 主循环完全对标。
### 本轮做了什么
1. 确认 `wasm-port/working` 目录已存在且暂无推进文档。
2. 创建 README 索引和 01-06 号文档。
3. 将当前差距固化为文档基线:
- 上游 `emctaskmain.cc` 每周期调用 `emcMotionUpdate(&emcStatus->motion)`
- 当前 `wasm-port` `lctask_run_cycles()` 只推进 minimal `TaskRuntime``lcmot_step_servo()`
- 当前 motion 状态主要在 status API 拼接输出,不是 task 周期控制输入。
4. 制定阶段化开发路线:
- 建立 task 周期内 motion snapshot。
- 重排 `lctask_run_cycles()` 为 LinuxCNC 式周期顺序。
- 建立 `EMC_STAT` 等价状态容器。
- 迁移 wait/execute 语义。
- 逐步替换自有状态机。
- 收口 readiness 和文档。
### 改了哪些文件
- `wasm-port/working/README.md`
- `wasm-port/working/01-项目功能内容.md`
- `wasm-port/working/02-项目程序开发详细步骤.md`
- `wasm-port/working/03-推进台账.md`
- `wasm-port/working/04-任务矩阵.md`
- `wasm-port/working/05-验收证据.md`
- `wasm-port/working/06-决策记录.md`
### 验证了什么
本轮是文档创建轮,未修改 runtime 源码,验证方式为:
- `find wasm-port/working -maxdepth 1 -type f | sort`
- 抽查新建文档内容。
- `git status --short wasm-port/working`
### 下一步
`T-002` 开始,新增 task 周期内 motion snapshot 设计和测试,先证明每个 `lctask_run_cycles()` 周期读取 motion而不是只在 `lctask_read_status_json()` 时拼接 motion。