# 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-055,status 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` 总 gate,working 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-007,T-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` evidence;M428-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 evidence,readiness 仍保持未提升。下一步进入 T-045:motion 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-044:spindle/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 subset,task-HAL status 可观测 T-041 evidence;readiness 仍保持未提升。下一步进入 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 copy,error 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 error,motion/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::vector`。 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:` 事件。 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。