Validate AXIS task state flow

This commit is contained in:
wangdequan
2026-07-09 18:12:01 -04:00
parent f99ba2bbe8
commit f4b9911d45
57 changed files with 195248 additions and 647 deletions

View File

@@ -1,5 +1,295 @@
# 03-推进台账
## 2026-07-08 17:26 EDT - 全功能与全按钮测试
### 本轮目标
按用户要求“全面完整执行测试项目功能,每个按钮都要全面测试”,在原有 browser smoke 的基础上补齐可重复执行的全按钮自动化验证,并重新跑完整功能测试链路。
### 已做事项
- 新增全按钮浏览器测试:
- `tests/browser/xyzbc_trt_all_buttons.html`:启动真实页面,读取 `api.getButtonParity()`,对 63 个 `AXIS_BUTTON_PARITY` 按钮/动作逐项确认 DOM 控件、LinuxCNC 来源元数据和点击后状态效果。
- `tests/browser/verify_xyzbc_trt_all_buttons.mjs`:使用 Playwright 和临时 HTTP server 执行真实浏览器测试。
- `tests/browser/verify_xyzbc_trt_all_buttons.sh`:命令行入口。
- `app/package.json` 新增 `smoke:buttons`
- 全按钮测试覆盖内容:
- 菜单Stage、Save session、Restore session、Reload、View X/Y/Z/P、Clear Live Plot、Audit。
- 工具栏ESTOP/RESET、Power on/off、AUTO/MANUAL、Reload、Run、Pause/Resume、Step、Stop、视图和清轨迹。
- 手动区Manual/MDI tab、joint 选择、jog increment、Jog +/、Touch Off、Tool Touch Off。
- MDI/PyVCPMDI submit、MDI history、M428 TCP、M429 identity、M430 userk、vismach-clear。
- Override/冷却/主轴feed/rapid/spindle override +/、spindle reverse/stop/forward、flood、mist、block delete、optional stop、ignore limits。
- 修复全按钮测试发现的真实状态问题:
- `app/src/state/store.js` 中 MDI M428/M429/M430 已经解析出的 `kinsType`/`rtcpState`,在随后 task/HAL 状态回写时会被旧的 runtime status 覆盖回 identity。
- 修复为 MDI task/HAL 命令回写时通过 `preserveMachine.kinsType` 保留当前 MDI switchkins 结果。
- 修正旧测试口径:
- `verify_five_axis_session.mjs` 更新为当前目标项目默认 `xyzbc-trt``xyzbc-trt-web-session`
- `verify_gmoccapy_trt_project_sidebar.mjs` 更新 power ESTOP 文案与当前项目 OPFS 根。
- `verify_linuxcnc_parity_matrix.mjs` 更新默认 active profile 为 `xyzbc-trt`
- `verify_machine_file_staging.mjs``verify_tool_db_web_simulation.mjs` 对仍验证 `xyzac-trt` 的场景先显式 `SET_PROFILE`,避免拿当前默认 `xyzbc-trt` 状态和旧 profile 预期比较。
### 执行命令
```text
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run build
for test_file in web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/*.mjs; do node "$test_file"; done
node wasm-port/tests/wasm/node/verify_task_status_json_contract.mjs
node wasm-port/tests/wasm/node/verify_task_hal_sdk.mjs
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run smoke:buttons
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run smoke:browser
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:web
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:compare
git diff --check -- web-rtcp-5axis-xyzbc-trt-sim-plan/app/src web-rtcp-5axis-xyzbc-trt-sim-plan/app/package.json web-rtcp-5axis-xyzbc-trt-sim-plan/app/dist/src web-rtcp-5axis-xyzbc-trt-sim-plan/tests web-rtcp-5axis-xyzbc-trt-sim-plan/working web-rtcp-5axis-xyzbc-trt-sim-plan/tools
```
### 关键结果
```text
gmoccapy_static_build=ok
全部 tests/node/*.mjs 通过
task_status_json_contract=ok
linuxcnc_task_hal_sdk=ok
xyzbc_trt_all_buttons=ok checked=63
xyzbc_trt_browser_smoke=ok
compare_xyzbc_trt_status=pass
git diff --check 无输出
```
最新 evidence 摘要:
```text
web.status=ready-for-wasm-runtime
web.collectedAt=2026-07-08T21:25:01.630Z
web.blockers=[]
web.taskHalEquivalence.ready=true
web.executionPath.status=ok
web.executionPath.sampleCount=228
compare.status=pass
compare.comparedAt=2026-07-08T21:25:02.164Z
compare.surfaceSummary.passCount=60
compare.surfaceSummary.failCount=0
compare.functionalSummary.status=pass
compare.functionalSummary.passCount=8
compare.functionalSummary.failCount=0
compare.requiredImprovements=[]
```
### 结论
T-084 完成。目标项目已新增可重复的 63 项全按钮浏览器测试,并完成完整功能测试链路。全按钮测试暴露并修复了 MDI switchkins 后 `kinsType` 被 task/HAL 状态回写覆盖的问题;全量 Node、WASM、browser、buttons、evidence/compare 均通过。
## 2026-07-08 10:42 EDT - 目标项目删除顶层旧字段
### 本轮目标
按用户要求“`wasm-port` 中已经删除旧字段,目标项目也要删除旧字段,使用新方法”,将 Web 项目从“拒绝旧输入但仍可能生成内部顶层旧视图”进一步收敛为:正常 `taskHalStatus` 只保留新版 `emcStatus` 和面向 UI 的 `ui`,不再输出或消费顶层 `task`/`motionStatus`
### 已做事项
- 修改 `app/src/runtime/linuxcnc-task-hal-runtime.js`
- `normalizeTaskHalStatus()` 继续拒绝旧 `task``motionStatus``rcsStatus``taskTopLevelStatus`、顶层 `servoCycle`
- 正常返回对象不再生成顶层 `task``motionStatus`,所有 task/motion 事实来自 `emcStatus.task``emcStatus.motion`
- 修改 `app/src/state/linuxcnc-task-policy.js``app/src/state/store.js`
- policy、状态循环、暂停/继续、jog、runtime feedback 均改为读取 `emcStatus`/`ui`
- `TASK_HAL_STATUS_APPLIED` 入口对旧字段直接失败,不再兼容旧形态。
- 修改 `tools/collect-web-xyzbc-trt-evidence.mjs`
- Web evidence 的执行采样、轴值和主轴状态改为读取 `emcStatus`/`ui`,不再读取 `motionStatus` 或顶层 `task`
- 修改 Node 测试:
- 增加正常 `taskHalStatus` 中不存在 `task`/`motionStatus` 的断言。
- 将手工状态夹具改为新版 `emcStatus`/`ui` 结构。
### 执行命令
```text
node web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_xyzbc_trt_web_app.mjs
node web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs
node web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_run_feedback_loop.mjs
node web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_rtcp_store.mjs
node wasm-port/tests/wasm/node/verify_task_status_json_contract.mjs
node wasm-port/tests/wasm/node/verify_task_hal_sdk.mjs
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run build
bash web-rtcp-5axis-xyzbc-trt-sim-plan/tests/browser/verify_xyzbc_trt_browser.sh
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:web
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:compare
```
### 关键结果
```text
xyzbc_trt_web_app_smoke=ok
linuxcnc_task_hal_runtime_smoke=ok
run_feedback_status_loop_smoke=ok
rtcp_store_smoke=ok
task_status_json_contract=ok
linuxcnc_task_hal_sdk=ok
gmoccapy_static_build=ok
xyzbc_trt_browser_smoke=ok
compare_xyzbc_trt_status=pass
```
最新 evidence 摘要:
```text
web.status=ready-for-wasm-runtime
web.collectedAt=2026-07-08T14:41:49.397Z
web.blockers=[]
web.taskHalEquivalence.ready=true
web.executionPath.status=ok
web.executionPath.sampleCount=228
compare.status=pass
compare.comparedAt=2026-07-08T14:41:49.928Z
compare.surfaceSummary.passCount=60
compare.surfaceSummary.failCount=0
compare.functionalSummary.status=pass
compare.functionalSummary.passCount=8
compare.functionalSummary.failCount=0
compare.requiredImprovements=[]
```
### 结论
T-083 完成。目标 Web 项目已跟随新版 `wasm-port` 删除顶层旧字段:正常状态对象不再输出 `task`/`motionStatus`,程序内部也不再消费这些旧字段;旧字段仅作为无效输入被拒绝。
## 2026-07-08 10:01 EDT - 移除旧 task/motionStatus 输入兼容
### 本轮目标
按用户要求“不保留旧字段兼容,修改程序”,将上一轮状态适配从“以 `emcStatus` 为主并兼容旧输入”改为“只接受新版 `StandaloneEmcStatus`/`emcStatus` 输入”。
### 已做事项
- 修改 `app/src/runtime/linuxcnc-task-hal-runtime.js`
- `normalizeTaskHalStatus()` 现在要求 `status.emcStatus.task``status.emcStatus.motion` 存在,缺失时直接抛错。
- 移除从旧 `status.task``status.motionStatus.motion``status.motionStatus.axis``status.motionStatus.joint0` 的回退读取。
- 本轮完成后继续在 T-083 删除 Web 顶层 `task`/`motionStatus` 派生输出,当前正常状态只保留 `emcStatus``ui`
- `activeLineSource` 改为 `emc-status`
- 修改测试:
- `verify_xyzbc_trt_web_app.mjs` 增加旧 `task`/`motionStatus` 输入拒绝断言。
- `verify_linuxcnc_task_hal_runtime.mjs` 不再断言旧 `teleopMode`/`aborted` 字段,改为断言新版 `emcStatus` 有效性和可观察运行结果。
- `verify_run_feedback_loop.mjs` 将 active line 来源断言更新为 `emc-status`
- 重新构建静态产物并刷新 Web evidence/compare。
### 执行命令
```text
node web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_xyzbc_trt_web_app.mjs
node web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs
node web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_run_feedback_loop.mjs
node web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_rtcp_store.mjs
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run build
bash web-rtcp-5axis-xyzbc-trt-sim-plan/tests/browser/verify_xyzbc_trt_browser.sh
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:web
node wasm-port/tests/wasm/node/verify_task_status_json_contract.mjs
node wasm-port/tests/wasm/node/verify_task_hal_sdk.mjs
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:compare
```
### 关键结果
```text
xyzbc_trt_web_app_smoke=ok
linuxcnc_task_hal_runtime_smoke=ok
run_feedback_status_loop_smoke=ok
rtcp_store_smoke=ok
gmoccapy_static_build=ok
xyzbc_trt_browser_smoke=ok
legacy_task_motion_status_rejected=ok
task_status_json_contract=ok
linuxcnc_task_hal_sdk=ok
compare_xyzbc_trt_status=pass
```
最新 evidence 摘要:
```text
web.status=ready-for-wasm-runtime
web.collectedAt=2026-07-08T14:00:44.425Z
web.blockers=[]
web.taskHalEquivalence.ready=true
web.executionPath.status=ok
web.executionPath.sampleCount=228
compare.status=pass
compare.comparedAt=2026-07-08T14:00:58.972Z
compare.surfaceSummary.passCount=60
compare.surfaceSummary.failCount=0
compare.functionalSummary.status=pass
compare.functionalSummary.passCount=8
compare.functionalSummary.failCount=0
compare.requiredImprovements=[]
```
### 结论
`task`/`motionStatus` 输入兼容已移除T-082 完成。当前 Web task/HAL runtime 只接受新版 `StandaloneEmcStatus`/`emcStatus` 合同;后续 T-083 已进一步删除 Web 顶层 `task`/`motionStatus` 输出。
## 2026-07-08 09:50 EDT - 新版 WASM 状态合同适配收口
### 本轮目标
继续完成新版 `/home/mes123456/cnc_wams/wasm-port` 完善后目标项目剩余适配工作:将 task/HAL status 主状态来源收敛到新版 `StandaloneEmcStatus`/`emcStatus`,并刷新 Web evidence/compare 确认无新增缺口。
### 已做事项
- 复核 `working/README.md``04-任务矩阵.md``05-验收证据.md` 和当前 evidence 摘要,确认旧任务 T-001 到 T-080 已完成,本轮需要把新版 WASM 状态合同适配作为新增闭环任务记录。
- 完成 `app/src/runtime/linuxcnc-task-hal-runtime.js` 适配:以 `emcStatus.task``emcStatus.motion``emcStatus.motion.traj``emcStatus.motion.axisByName``emcStatus.motion.joint0` 作为唯一输入生成 Web UI 消费字段,旧 `task`/`motionStatus` 输入会被拒绝。
-`tests/node/verify_xyzbc_trt_web_app.mjs` 增加真实新版 status contract 断言和纯 `emcStatus` 输入归一化断言。
- 重新构建静态产物,同步 `app/dist/src/runtime/linuxcnc-task-hal-runtime.js``app/dist/wasm-port/build/wasm/task-hal/linuxcnc_task_hal.js/.wasm`
- 刷新 Web evidence 和 compare evidence。
### 执行命令
```text
node web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_xyzbc_trt_web_app.mjs
node web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs
node web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_run_feedback_loop.mjs
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run build
bash web-rtcp-5axis-xyzbc-trt-sim-plan/tests/browser/verify_xyzbc_trt_browser.sh
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:web
node wasm-port/tests/wasm/node/verify_task_status_json_contract.mjs
node wasm-port/tests/wasm/node/verify_task_hal_sdk.mjs
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:compare
```
### 关键结果
```text
xyzbc_trt_web_app_smoke=ok
linuxcnc_task_hal_runtime_smoke=ok
run_feedback_status_loop_smoke=ok
gmoccapy_static_build=ok
xyzbc_trt_browser_smoke=ok
task_status_json_contract=ok
linuxcnc_task_hal_sdk=ok
compare_xyzbc_trt_status=pass
```
最新 evidence 摘要:
```text
web.status=ready-for-wasm-runtime
web.collectedAt=2026-07-08T13:50:12.039Z
web.blockers=[]
web.taskHalEquivalence.ready=true
web.executionPath.status=ok
web.executionPath.sampleCount=228
compare.status=pass
compare.comparedAt=2026-07-08T13:50:23.202Z
compare.surfaceSummary.passCount=60
compare.surfaceSummary.failCount=0
compare.functionalSummary.status=pass
compare.functionalSummary.passCount=8
compare.functionalSummary.failCount=0
compare.requiredImprovements=[]
```
### 结论
新版 WASM 状态合同适配已闭合T-081 完成。当前目标项目对新版 `StandaloneEmcStatus`/`emcStatus` 可直接消费,且不再接受旧 `task`/`motionStatus` 输入;刷新后的 Web evidence 和 compare 没有新增 fail、blocker 或 required improvement。
## 2026-07-07 19:03 EDT - working 全部工作收口复验
### 本轮目标