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 全部工作收口复验
### 本轮目标

View File

@@ -82,6 +82,10 @@
| T-078 | 2026-07-07 AXIS 主控制按钮状态链路收敛 | 完成 | 按 `18-20260707-AXIS主控制按钮调用链与Web完善指南.md` 完成 ESTOP、Power、Home、Run、Pause/Resume、Step 的 LinuxCNC task/motion/home 状态收敛Task/HAL WASM 暴露 `motionEnabled``homed[]``singleStepping``motionStepping`policy 统一门禁build、Node/WASM/browser smoke、Web evidence 和 compare 均通过,最新 `compare.status=pass``60/60 pass``blockers=[]``requiredImprovements=[]` |
| T-079 | 2026-07-07 AXIS 按钮 LinuxCNC C++ 功能级 compare 硬验收 | 完成 | 按 `20-20260707-AXIS按钮LinuxCNC真实C++对标实施步骤.md``21-20260707-AXIS按钮LinuxCNC真实C++对标验收测试.md` 增强 `tools/compare-xyzbc-trt-evidence.mjs`compare 输出 `surfaceSummary``functionalSummary`,并硬检查 `cppTaskStateMachineParity``cppModeGateParity``cppHomingParity``cppRunGateParity``cppPauseResumeParity``cppStepParity``illegalCommandParity``realProgramExecutionParity`;最新 `surfaceSummary=60/60 pass``functionalSummary=8/8 pass``requiredImprovements=[]` |
| T-080 | 2026-07-07 19:03 EDT working 全部工作收口复验 | 完成 | 重新执行 native LinuxCNC evidence、Web evidence、compare、Node smoke、build、Task/HAL 状态矩阵、Task/HAL WASM/SDK smoke、browser smoke最新 `compare.status=pass``surfaceSummary=60/60 pass``functionalSummary=8/8 pass``requiredImprovements=[]` |
| T-081 | 2026-07-08 新版 WASM `StandaloneEmcStatus` 状态合同适配 | 完成 | Web task/HAL runtime 以新版 `emcStatus` 为唯一输入状态来源,旧 `task`/`motionStatus` 输入会被拒绝;目标 Node smoke、WASM `verify_task_status_json_contract.mjs`、Task/HAL SDK smoke、build、browser smoke、Web evidence 和 compare 均通过;最新 `compare.status=pass``surfaceSummary=60/60 pass``functionalSummary=8/8 pass``requiredImprovements=[]` |
| T-082 | 2026-07-08 移除旧 `task`/`motionStatus` 输入兼容 | 完成 | `normalizeTaskHalStatus()` 缺少 `StandaloneEmcStatus`/`emcStatus.task`/`emcStatus.motion` 时直接失败,不再读取旧 `status.task``status.motionStatus`;旧格式拒绝检查、目标 Node smoke、build、browser smoke、Web evidence 和 compare 均通过;最新 `compare.status=pass``surfaceSummary=60/60 pass``functionalSummary=8/8 pass``requiredImprovements=[]` |
| T-083 | 2026-07-08 目标项目删除顶层旧字段 | 完成 | Web 正常 `taskHalStatus` 不再输出或消费顶层 `task`/`motionStatus`runtime、store、policy、feedback、Web evidence 统一读取 `emcStatus`/`ui`;旧字段只作为无效输入被拒绝;目标 Node smoke、WASM status JSON contract、Task/HAL SDK、build、browser smoke、Web evidence 和 compare 均通过;最新 `compare.status=pass``surfaceSummary=60/60 pass``functionalSummary=8/8 pass``requiredImprovements=[]` |
| T-084 | 2026-07-08 全功能与全按钮测试 | 完成 | 新增 `npm run smoke:buttons`,真实浏览器逐项测试 `AXIS_BUTTON_PARITY` 63 个按钮/动作;修复 M428/M429/M430 后 task/HAL 状态回写覆盖 `kinsType` 的问题;完整 `tests/node/*.mjs`、WASM status contract、Task/HAL SDK、build、browser smoke、全按钮 smoke、Web evidence 和 compare 均通过;最新 `compare.status=pass``surfaceSummary=60/60 pass``functionalSummary=8/8 pass``requiredImprovements=[]` |
状态说明:
@@ -89,7 +93,7 @@
- 待前置:代码已接入,但仍依赖未完成的外部或运行环境步骤。
- 待实现:已记录验收要求,仍需修改采集或对比脚本。
当前 T-001 到 T-080 均已完成T-047/T-048/T-049/T-050 是用户指出 `working/screenshots/web-simulation-full-process-20260703T051258Z` 截图问题后的页面/截图层真实执行闭环项。
当前 T-001 到 T-084 均已完成T-047/T-048/T-049/T-050 是用户指出 `working/screenshots/web-simulation-full-process-20260703T051258Z` 截图问题后的页面/截图层真实执行闭环项。
T-051 到 T-075 是 2026-07-04 新增的严格完整对标任务:以 `/home/mes123456/cnc_wams/linuxcnc` 源树和 LinuxCNC `xyzbc-trt` 真实执行为唯一 native 权威基线,当前已完成,最新 compare 为 60/60 passblockers=[]。
@@ -102,3 +106,11 @@ T-078 是 2026-07-07 按 AXIS 主控制按钮调用链完善指南完成的状
T-079 是 2026-07-07 按 20/21 号文档完成的功能级硬验收任务:旧 `summary/checks` 保持 60 项表面兼容检查,新增 `functionalChecks/functionalSummary` 作为真实通过判定;最新 compare 为 `surfaceSummary=60/60 pass``functionalSummary=8/8 pass`
T-080 是 2026-07-07 19:03 EDT 针对用户“完成 working 中全部工作”的收口复验任务:重新采集 native/Web evidence 并重跑 compare、smoke、build、Task/HAL 状态矩阵和浏览器验证,确认所有 working 任务仍处于完成状态。
T-081 是 2026-07-08 针对新版 `wasm-port` task/HAL WASM 完善后的适配任务:目标项目 runtime 以 `StandaloneEmcStatus`/`emcStatus` 为主合同,测试覆盖纯 `emcStatus` 输入和真实 WASM status刷新后的 Web evidence/compare 仍为通过。
T-082 是 2026-07-08 按用户要求移除旧字段兼容的任务:目标项目 runtime 不再接受旧 `task`/`motionStatus` 输入。
T-083 是 2026-07-08 按用户要求跟随 `wasm-port` 删除旧字段的任务:目标项目正常状态对象不再输出顶层 `task`/`motionStatus`,内部代码和 evidence 采集改为使用 `emcStatus`/`ui`
T-084 是 2026-07-08 按用户要求全面测试功能和每个按钮的任务:新增 63 项全按钮浏览器测试入口,修复 MDI switchkins 后 task/HAL 状态回写覆盖问题,并完成全量 Node/WASM/browser/evidence/compare 验收。

View File

@@ -1,5 +1,339 @@
# 05-验收证据
## 2026-07-08 17:26 EDT - 全功能与全按钮测试验收证据
本轮按用户要求全面执行目标项目功能测试,并补齐“每个按钮都要全面测试”的自动化入口。新增全按钮浏览器测试覆盖 `AXIS_BUTTON_PARITY` 63 个按钮/动作条目,逐项验证 DOM 控件、LinuxCNC 来源元数据和点击后的状态效果。
关键实现证据:
```text
app/package.json
app/src/state/store.js
tests/browser/xyzbc_trt_all_buttons.html
tests/browser/verify_xyzbc_trt_all_buttons.mjs
tests/browser/verify_xyzbc_trt_all_buttons.sh
tests/node/verify_five_axis_session.mjs
tests/node/verify_gmoccapy_trt_project_sidebar.mjs
tests/node/verify_linuxcnc_parity_matrix.mjs
tests/node/verify_machine_file_staging.mjs
tests/node/verify_tool_db_web_simulation.mjs
working/evidence/web-xyzbc-trt-evidence.json
working/evidence/compare-xyzbc-trt-evidence.json
```
执行命令:
```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
five_axis_session_smoke=ok
full_execution_boundary_smoke=ok
full_linuxcnc_5axis_source_node_smoke=ok
gmoccapy_communication_model_smoke=ok
gmoccapy_hal_model_smoke=ok
gmoccapy_icon_manifest_smoke=ok
gmoccapy_icon_registry_smoke=ok
gmoccapy_trt_project_sidebar_smoke=ok
gmoccapy_xyzab_gates_smoke=ok
gmoccapy_xyzab_profile_smoke=ok
gmoccapy_xyzac_trt_parity_smoke=ok
impeller_feed_task_hal_run=ok
linear_unit_conversion_smoke=ok
linuxcnc_ini_runtime_smoke=ok
linuxcnc_interpreter_runtime_smoke=ok
linuxcnc_kinematics_runtime_smoke=ok
linuxcnc_parity_matrix_smoke=ok
linuxcnc_task_hal_runtime_smoke=ok
machine_file_staging_smoke=ok
native_task_hal_source_artifact_audit=ok
profile_boundary_smoke=ok
real_linuxcnc_5axis_program_cases_smoke=ok
rtcp_store_smoke=ok
run_feedback_status_loop_smoke=ok
run_preconditions_machine_file_smoke=ok
tool_db_user_m_simulation_smoke=ok
tool_db_web_simulation_smoke=ok
xyzbc_trt_web_app_smoke=ok
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
```
最新 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
surfaceSummary.checkCount=60
surfaceSummary.passCount=60
surfaceSummary.failCount=0
functionalSummary.status=pass
functionalSummary.checkCount=8
functionalSummary.passCount=8
functionalSummary.failCount=0
functionalSummary.requiredImprovements=[]
compare.requiredImprovements=[]
```
结论:全功能和全按钮测试已完成。新增 `smoke:buttons` 覆盖 63 个按钮/动作;本轮发现并修复 M428/M429/M430 MDI 后 `kinsType` 被 task/HAL 状态回写覆盖的问题。当前完整 Node、WASM、browser、buttons、evidence/compare 验收均通过。
## 2026-07-08 10:42 EDT - 目标项目删除顶层旧字段验收证据
本轮按用户要求让目标 Web 项目跟随 `/home/mes123456/cnc_wams/wasm-port` 删除旧字段。当前正常 `taskHalStatus` 不再输出或消费顶层 `task`/`motionStatus`runtime、store、policy、feedback 和 Web evidence 均使用 `emcStatus`/`ui`
关键实现证据:
```text
app/src/runtime/linuxcnc-task-hal-runtime.js
app/src/state/linuxcnc-task-policy.js
app/src/state/store.js
tools/collect-web-xyzbc-trt-evidence.mjs
tests/node/verify_xyzbc_trt_web_app.mjs
tests/node/verify_run_feedback_loop.mjs
tests/node/verify_rtcp_store.mjs
app/dist/src/runtime/linuxcnc-task-hal-runtime.js
working/evidence/web-xyzbc-trt-evidence.json
working/evidence/compare-xyzbc-trt-evidence.json
```
执行命令:
```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
task_hal_machine_file_smoke=ok
switchkins_remap_hal_sync_smoke=ok
browser_task_hal_worker_smoke=ok
run_feedback_status_loop_smoke=ok
run_ready_sequence_smoke=ok
pause_uses_motion_paused_gate=ok
pause_freezes_task_hal_status_loop=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
surfaceSummary.checkCount=60
surfaceSummary.passCount=60
surfaceSummary.failCount=0
functionalSummary.status=pass
functionalSummary.checkCount=8
functionalSummary.passCount=8
functionalSummary.failCount=0
functionalSummary.requiredImprovements=[]
compare.requiredImprovements=[]
```
结论:目标 Web 项目已删除顶层旧字段。旧 `task`/`motionStatus` 只在拒绝输入的负向测试和错误提示中出现,正常运行数据以 `emcStatus`/`ui` 为准。
## 2026-07-08 10:01 EDT - 移除旧字段兼容验收证据
本轮按用户要求“不保留旧字段兼容,修改程序”,将 Web task/HAL runtime 改为只接受新版 `StandaloneEmcStatus`/`emcStatus` 输入。旧 `task`/`motionStatus` 输入不再被兼容归一化。
关键实现证据:
```text
app/src/runtime/linuxcnc-task-hal-runtime.js
tests/node/verify_xyzbc_trt_web_app.mjs
tests/node/verify_linuxcnc_task_hal_runtime.mjs
tests/node/verify_run_feedback_loop.mjs
app/dist/src/runtime/linuxcnc-task-hal-runtime.js
working/evidence/web-xyzbc-trt-evidence.json
working/evidence/compare-xyzbc-trt-evidence.json
```
执行命令:
```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
task_hal_machine_file_smoke=ok
switchkins_remap_hal_sync_smoke=ok
browser_task_hal_worker_smoke=ok
run_feedback_status_loop_smoke=ok
run_ready_sequence_smoke=ok
pause_uses_motion_paused_gate=ok
pause_freezes_task_hal_status_loop=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
surfaceSummary.checkCount=60
surfaceSummary.passCount=60
surfaceSummary.failCount=0
functionalSummary.status=pass
functionalSummary.checkCount=8
functionalSummary.passCount=8
functionalSummary.failCount=0
functionalSummary.requiredImprovements=[]
compare.requiredImprovements=[]
```
结论:旧字段输入兼容已移除并通过验证。后续 T-083 已进一步删除 Web 正常状态对象里的顶层 `task`/`motionStatus`,仅保留新版 `emcStatus` 与 UI 所需 `ui`
## 2026-07-08 09:50 EDT - 新版 WASM 状态合同适配验收证据
本轮继续完成新版 `/home/mes123456/cnc_wams/wasm-port` task/HAL WASM 完善后的目标项目适配。关键目标是让 Web runtime 直接消费新版 `StandaloneEmcStatus`/`emcStatus` 状态结构,并拒绝旧 `task`/`motionStatus` 输入;后续 T-083 已删除 Web 顶层 `task`/`motionStatus` 派生视图,正常状态只保留 `emcStatus``ui`
关键实现证据:
```text
app/src/runtime/linuxcnc-task-hal-runtime.js
tests/node/verify_xyzbc_trt_web_app.mjs
app/dist/src/runtime/linuxcnc-task-hal-runtime.js
app/dist/wasm-port/build/wasm/task-hal/linuxcnc_task_hal.js
app/dist/wasm-port/build/wasm/task-hal/linuxcnc_task_hal.wasm
working/evidence/web-xyzbc-trt-evidence.json
working/evidence/compare-xyzbc-trt-evidence.json
```
执行命令:
```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
task_hal_machine_file_smoke=ok
switchkins_remap_hal_sync_smoke=ok
browser_task_hal_worker_smoke=ok
run_feedback_status_loop_smoke=ok
run_ready_sequence_smoke=ok
pause_uses_motion_paused_gate=ok
pause_freezes_task_hal_status_loop=ok
gmoccapy_static_build=ok
xyzbc_trt_browser_smoke=ok
task_status_json_contract_runtime=ok
task_status_json_contract_schema=ok
task_status_json_contract=ok
linuxcnc_task_hal_sdk=ok
task_hal_sdk_status_snapshot=ok
task_hal_sdk_standalone_emc_status=ok
task_hal_sdk_status_json_contract=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
surfaceSummary.checkCount=60
surfaceSummary.passCount=60
surfaceSummary.failCount=0
functionalSummary.status=pass
functionalSummary.checkCount=8
functionalSummary.passCount=8
functionalSummary.failCount=0
functionalSummary.requiredImprovements=[]
compare.requiredImprovements=[]
```
结论:新版 WASM 状态合同适配完成。目标项目可以直接从 `emcStatus.task``emcStatus.motion``emcStatus.motion.traj``axisByName``joint0` 生成 Web UI 状态,并且刷新后的 compare 仍为表面检查 60/60、功能级检查 8/8 通过。
## 2026-07-07 19:03 EDT - working 全部工作收口复验证据
本轮按用户要求完成 `working` 中全部工作,并重新执行收口复验。

View File

@@ -22,6 +22,10 @@
当前新增关注点:
- 2026-07-08 17:26 EDT 已按用户要求全面执行目标项目功能测试,并新增 `npm run smoke:buttons` 全按钮浏览器测试入口:覆盖 `AXIS_BUTTON_PARITY` 的 63 个按钮/动作条目,逐项检查 DOM 控件、LinuxCNC 来源元数据和点击后的状态效果;本轮同时修复 M428/M429/M430 MDI 后 task/HAL 状态回写覆盖 `kinsType` 的问题,并修正旧默认机型/旧项目根测试口径。完整 Node 测试集、WASM status contract、Task/HAL SDK、build、browser smoke、全按钮 smoke、Web evidence 和 compare 均通过;最新 `compare.status=pass``surfaceSummary=60/60 pass``functionalSummary=8/8 pass``requiredImprovements=[]`
- 2026-07-08 10:42 EDT 已按用户要求在目标 Web 项目中删除顶层旧字段:`taskHalStatus` 正常形态不再输出或消费 `task`/`motionStatus`store、policy、feedback、evidence 采集统一读取 `emcStatus``ui`旧字段只保留在拒绝输入的负向测试和错误提示中。Node smoke、WASM status JSON contract、Task/HAL SDK、build、browser smoke、Web evidence 和 compare 均通过;最新 `compare.status=pass``surfaceSummary=60/60 pass``functionalSummary=8/8 pass``requiredImprovements=[]`
- 2026-07-08 10:01 EDT 已按用户要求移除旧字段兼容:`normalizeTaskHalStatus()` 现在缺少 `StandaloneEmcStatus`/`emcStatus.task`/`emcStatus.motion` 时直接失败,不再从旧 `status.task``status.motionStatus` 回退旧格式拒绝检查、Node smoke、browser smoke、WASM status JSON contract、Task/HAL SDK、Web evidence 和 compare 均通过。
- 2026-07-08 09:50 EDT 已完成新版 `wasm-port` task/HAL WASM 状态合同适配Web runtime 以 `StandaloneEmcStatus`/`emcStatus` 为唯一输入合同,拒绝旧 `task`/`motionStatus` 输入字段;目标 Node smoke、WASM status JSON contract、SDK smoke、Web evidence 和 compare 均通过;最新 `compare.status=pass``surfaceSummary=60/60 pass``functionalSummary=8/8 pass``requiredImprovements=[]`
- 2026-07-07 19:03 EDT 已按“完成 working 中全部工作”重新执行当前收口复验native LinuxCNC evidence、Web evidence、compare、Node smoke、build、Task/HAL 状态矩阵、Task/HAL WASM/SDK smoke、browser smoke 均通过;最新 `compare.status=pass``surfaceSummary=60/60 pass``functionalSummary=8/8 pass``requiredImprovements=[]`
- 2026-07-07 18:57 EDT 已完成 20/21 号文档要求的功能级 compare 增强:`compare-xyzbc-trt-evidence.json` 现在同时输出 `surfaceSummary``functionalSummary`;最新结果为 `surfaceSummary=60/60 pass``functionalSummary=8/8 pass``requiredImprovements=[]`,硬规则覆盖 `cppTaskStateMachineParity``cppModeGateParity``cppHomingParity``cppRunGateParity``cppPauseResumeParity``cppStepParity``illegalCommandParity``realProgramExecutionParity`
- 2026-07-07 18:35 EDT 已将 19 号源码分析拆分为 20 号实施步骤和 21 号验收测试。后续结论必须区分 `surfaceSummary``functionalSummary``compare 60/60 pass` 只代表表面规则通过,真实通过必须证明 Web 行为符合 LinuxCNC C++ `emctaskmain.cc``emctask.cc``taskintf.cc``motion/command.c``control.c``homing.c` 的状态机和真实程序执行结果。

View File

@@ -1,7 +1,7 @@
{
"apiName": "xyzbc-trt-native-web-evidence-comparison",
"status": "pass",
"comparedAt": "2026-07-07T23:03:43.547Z",
"comparedAt": "2026-07-08T21:25:02.164Z",
"nativePath": "/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/native-xyzbc-trt-evidence.json",
"webPath": "/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/web-xyzbc-trt-evidence.json",
"summary": {
@@ -567,7 +567,7 @@
"execution": {
"completed": true,
"sampleCount": 228,
"taskHalEventCount": 30
"taskHalEventCount": 35
},
"semanticBoundary": "web_basic_sim_joint_home_spindle_manualtoolchange_feedback"
},
@@ -578,7 +578,7 @@
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzbc_switchkins.ngc",
"completed": true,
"eventCount": 30
"eventCount": 35
},
"taskPolicy": {
"taskState": "estop-reset",
@@ -619,7 +619,7 @@
"execution": {
"completed": true,
"sampleCount": 228,
"taskHalEventCount": 30
"taskHalEventCount": 35
},
"semanticBoundary": "web_basic_sim_joint_home_spindle_manualtoolchange_feedback"
},
@@ -2469,7 +2469,7 @@
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzbc_switchkins.ngc",
"completed": true,
"eventCount": 30
"eventCount": 35
},
"executionPath": {
"nativeSampleCount": 4,

View File

@@ -1,7 +1,7 @@
{
"apiName": "xyzbc-trt-web-opfs-wasm-evidence",
"status": "ready-for-wasm-runtime",
"collectedAt": "2026-07-07T23:03:42.947Z",
"collectedAt": "2026-07-08T21:25:01.630Z",
"profile": {
"id": "xyzbc-trt",
"machineName": "sim-xyzbc-trt-kins (switchkins)",
@@ -102296,7 +102296,7 @@
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzbc_switchkins.ngc",
"completed": true,
"eventCount": 30
"eventCount": 35
}
},
"semanticExecutionPath": {
@@ -227512,7 +227512,7 @@
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzbc_switchkins.ngc",
"completed": true,
"eventCount": 30
"eventCount": 35
},
"taskPolicy": {
"taskState": "estop-reset",
@@ -227553,7 +227553,7 @@
"execution": {
"completed": true,
"sampleCount": 228,
"taskHalEventCount": 30
"taskHalEventCount": 35
},
"semanticBoundary": "web_basic_sim_joint_home_spindle_manualtoolchange_feedback"
},
@@ -227584,7 +227584,7 @@
"execution": {
"completed": true,
"sampleCount": 228,
"taskHalEventCount": 30
"taskHalEventCount": 35
},
"semanticBoundary": "web_basic_sim_joint_home_spindle_manualtoolchange_feedback"
},
@@ -229820,16 +229820,16 @@
{
"rel": "wasm-port/build/wasm/task-hal/linuxcnc_task_hal.js",
"absolutePath": "/home/mes123456/cnc_wams/wasm-port/build/wasm/task-hal/linuxcnc_task_hal.js",
"bytes": 19878,
"mtime": "2026-07-07T22:01:17.840Z",
"sha256": "b5f5caa1a898acea8280dfba6dae7b723d775e54e9d769bdb4d21ac6ac2ac358"
"bytes": 20858,
"mtime": "2026-07-08T14:15:38.726Z",
"sha256": "31a4b38ab6c92d5524c80414a159ae874f72bcbe4d3744019cefd18bb224c8f6"
},
{
"rel": "wasm-port/build/wasm/task-hal/linuxcnc_task_hal.wasm",
"absolutePath": "/home/mes123456/cnc_wams/wasm-port/build/wasm/task-hal/linuxcnc_task_hal.wasm",
"bytes": 215042,
"mtime": "2026-07-07T22:01:17.596Z",
"sha256": "b456ffb64e5a32bc4a425343b5539dea9cf064b1804c4c6b53dea3661ea37fa8"
"bytes": 281624,
"mtime": "2026-07-08T14:15:38.526Z",
"sha256": "ed62ea4a6138c3bde51fa6071fcdd41119e57aba65d4b4edee47665921d595df"
}
],
"buildCommands": [
@@ -230621,7 +230621,7 @@
"execution": {
"completed": true,
"sampleCount": 228,
"taskHalEventCount": 30
"taskHalEventCount": 35
}
},
"semanticBoundary": "web_task_hal_full_state"
@@ -231679,16 +231679,16 @@
{
"rel": "wasm-port/build/wasm/task-hal/linuxcnc_task_hal.js",
"absolutePath": "/home/mes123456/cnc_wams/wasm-port/build/wasm/task-hal/linuxcnc_task_hal.js",
"bytes": 19878,
"mtime": "2026-07-07T22:01:17.840Z",
"sha256": "b5f5caa1a898acea8280dfba6dae7b723d775e54e9d769bdb4d21ac6ac2ac358"
"bytes": 20858,
"mtime": "2026-07-08T14:15:38.726Z",
"sha256": "31a4b38ab6c92d5524c80414a159ae874f72bcbe4d3744019cefd18bb224c8f6"
},
{
"rel": "wasm-port/build/wasm/task-hal/linuxcnc_task_hal.wasm",
"absolutePath": "/home/mes123456/cnc_wams/wasm-port/build/wasm/task-hal/linuxcnc_task_hal.wasm",
"bytes": 215042,
"mtime": "2026-07-07T22:01:17.596Z",
"sha256": "b456ffb64e5a32bc4a425343b5539dea9cf064b1804c4c6b53dea3661ea37fa8"
"bytes": 281624,
"mtime": "2026-07-08T14:15:38.526Z",
"sha256": "ed62ea4a6138c3bde51fa6071fcdd41119e57aba65d4b4edee47665921d595df"
}
],
"missing": [],