# 03-推进台账

## 2026-06-26 R1：启动 working5 对标推进

做了什么：

- 创建 working5 工作文件结构。
- 建立与 `gmoccapy_XYZAB.ini` 执行流程对齐的任务矩阵和验收记录模板。
- 开始读取 LinuxCNC 执行分析和 Web 项目结构。

改了哪些文件：

- `/home/meswork/cnc_wams/work/working5/README.md`
- `/home/meswork/cnc_wams/work/working5/01-项目功能内容.md`
- `/home/meswork/cnc_wams/work/working5/02-项目程序开发详细步骤.md`
- `/home/meswork/cnc_wams/work/working5/03-推进台账.md`
- `/home/meswork/cnc_wams/work/working5/04-任务矩阵.md`
- `/home/meswork/cnc_wams/work/working5/05-验收证据.md`
- `/home/meswork/cnc_wams/work/working5/06-决策记录.md`

验证了什么：

- 待执行现有 Node、构建和浏览器冒烟测试。

下一步是什么：

- 执行 `npm run smoke:node`，根据失败项定位 LinuxCNC 行为差异。

## 2026-06-26 R2：基线验证与 gmoccapy 模式互锁修复

做了什么：

- 执行现有 Node、构建、浏览器冒烟测试，确认项目基线可运行。
- 对照 `gmoccapy_XYZAB_execution_analysis.md` 和 `gmoccapy.py` 的 `STATE_OFF`、`STATE_ON`、`all_homed` 逻辑，发现 Web 侧允许提前点击 Manual/MDI/Auto 模式按钮，store 虽能拦截部分运行动作，但 UI 敏感状态不完全等同 gmoccapy。
- 修改 task policy：`SET_MODE` 在机床未上电时禁止 Manual/MDI/Auto/Jog；机床上电但未回零时只允许 Manual/Jog，禁止 MDI/Auto；Auto 运行中仍禁止离开 Auto。
- 修改 gmoccapy Web shell：右侧 Manual/Jog/Auto/MDI 模式按钮统一使用 `gateLinuxCncTaskAction`，以 `disabled`、`data-command-ready`、`aria-disabled` 和 title 展示互锁原因。
- 补充 Node 和浏览器测试，锁定下电、上电未回零、回零后三个阶段的模式按钮行为。

改了哪些文件：

- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/state/linuxcnc-task-policy.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_xyzab_gates.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_run_preconditions.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html`
- `/home/meswork/cnc_wams/work/working5/03-推进台账.md`
- `/home/meswork/cnc_wams/work/working5/04-任务矩阵.md`
- `/home/meswork/cnc_wams/work/working5/05-验收证据.md`
- `/home/meswork/cnc_wams/work/working5/06-决策记录.md`

验证了什么：

- `node ../tests/node/verify_gmoccapy_xyzab_gates.mjs && node ../tests/node/verify_run_preconditions.mjs && bash ../tests/browser/verify_gmoccapy_shell_browser.sh` 通过。
- `npm run smoke:node` 通过。
- `npm run build && npm run smoke` 通过。

下一步是什么：

- 下一轮可继续按任务矩阵深入核对 Tool/M6/M61 手动换刀对话框、限位 override、optional stop/block delete HAL pin 交叉行为等更细粒度 gmoccapy 行为。

## 2026-06-26 R3：细化 gmoccapy XYZAB 换刀 HAL 语义

做了什么：

- 对照 `gmoccapy_postgui.hal`，确认该 XYZAB 仿真配置在 GUI ready 后执行 `unlinkp iocontrol.0.tool-change`、`unlinkp iocontrol.0.tool-changed`、`unlinkp iocontrol.0.tool-prep-number`，并将 `gmoccapy.toolchange-*` 手动换刀 GUI nets 保持注释状态。
- 在 Web profile 和 HAL 诊断模型中显式记录换刀策略为 `iocontrol-loopback`，手动 gmoccapy 换刀 GUI pins 未连接，活动回环为 `iocontrol.0.tool-change -> iocontrol.0.tool-changed`。
- 在 gmoccapy UI 诊断页新增 `Tool change` 行，显示换刀策略、手动 GUI pin 连接状态、POSTGUI `unlinkp` 数量和注释掉的手动换刀 nets 数量。
- 补充 Node 与浏览器断言，防止后续误把此配置表述为需要 gmoccapy 手动换刀确认对话框。

改了哪些文件：

- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/profiles/gmoccapy-xyzab.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/runtime/gmoccapy-hal-model.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_hal_model.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_xyzab_profile.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_profile_boundary.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html`
- `/home/meswork/cnc_wams/work/working5/03-推进台账.md`
- `/home/meswork/cnc_wams/work/working5/04-任务矩阵.md`
- `/home/meswork/cnc_wams/work/working5/05-验收证据.md`
- `/home/meswork/cnc_wams/work/working5/06-决策记录.md`

验证了什么：

- `node ../tests/node/verify_gmoccapy_hal_model.mjs && node ../tests/node/verify_gmoccapy_xyzab_profile.mjs && node ../tests/node/verify_profile_boundary.mjs` 通过。
- `npm run smoke:node` 通过。
- `npm run build && npm run smoke` 通过。

下一步是什么：

- 可继续核对限位 override、optional stop/block delete、外部 HAL hard-button pin 与 UI action 的交叉行为。

## 2026-06-26 R4：细化外部 HAL hard-button pin 与 Web UI action 映射

做了什么：

- 对照 `gmoccapy.py` 的 `_make_hal_pins()`、`_button_pin_changed()`、`_get_child_button()` 和 `gmoccapy.glade` 的 `vbtb_main` 顺序，确认外部硬按钮 pin 只响应 rising edge，并按当前可见且敏感的 GTK 按钮位置触发；目标隐藏或不敏感时忽略。
- 修正 `gmoccapy-xyzab` panel schema 中右侧主按钮 HAL pin 顺序：`tbtn_estop`/`tbtn_on`/`rbt_manual`/`rbt_mdi`/`rbt_auto` 对应 `gmoccapy.v-button.button-0..4`，不再把 Estop/Power 误列为 `h-button`。
- 在 HAL model 和 communication model 中增加 hard-button 结构化映射，记录 7 个右侧 `v-button` pin、底部主页面 `h-button` 引用、rising-edge 语义、insensitive ignored 语义和 Web selector/action 对应关系。
- 在 store 中新增 `GMOCAPY_HARDWARE_BUTTON` action，用同一套 Web action/gate 模拟外部 HAL hard-button pin；falling edge、未映射 pin 和诊断-only pin 均给出明确 operator message。
- 在 UI 按钮 DOM 上新增 `data-gmoccapy-hal-pin`、`data-gmoccapy-native-panel`、`data-gmoccapy-native-button-index`，并在 gmoccapy HAL 诊断中显示 hard-button 摘要。
- 补充 Node 和浏览器断言，覆盖 hard-button 模型、通信路径、profile pin 顺序、store gate 行为和 DOM 映射。

改了哪些文件：

- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/profiles/gmoccapy-xyzab.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/runtime/gmoccapy-communication-model.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/runtime/gmoccapy-hal-model.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/state/store.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_communication_model.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_hal_model.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_xyzab_gates.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_xyzab_profile.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html`
- `/home/meswork/cnc_wams/work/working5/03-推进台账.md`
- `/home/meswork/cnc_wams/work/working5/04-任务矩阵.md`
- `/home/meswork/cnc_wams/work/working5/05-验收证据.md`
- `/home/meswork/cnc_wams/work/working5/06-决策记录.md`

验证了什么：

- `node ../tests/node/verify_gmoccapy_hal_model.mjs && node ../tests/node/verify_gmoccapy_communication_model.mjs && node ../tests/node/verify_gmoccapy_xyzab_profile.mjs && node ../tests/node/verify_gmoccapy_xyzab_gates.mjs` 通过。
- `npm run smoke:node` 通过。
- `npm run build && npm run smoke` 通过。

下一步是什么：

- 可继续核对 `gmoccapy.ignore-limits`、`gmoccapy.optional-stop`、`gmoccapy.blockdelete`、override analog/count/reset pins 与 Web 状态的交叉行为。

## 2026-06-27 R5：细化 gmoccapy HAL 输入 pin 与倍率 pin 语义

做了什么：

- 对照 `gmoccapy.py` 的 `_ignore_limits()`、`_optional_blocks()`、`_blockdelete()`、`_on_counts_changed()`、`_on_analog_value_changed()`、`_reset_override()` 和 `gmoccapy_XYZAB.pref`，确认本轮应保留 `optional-stop`/`blockdelete` 的交叉语义，以及 counts/direct-value/reset 的 enable 和 rising-edge 规则。
- 在 Web store 中新增 `GMOCAPY_HAL_PIN` action，统一模拟 `gmoccapy.ignore-limits`、`gmoccapy.optional-stop`、`gmoccapy.blockdelete`、feed/rapid/spindle/jog override counts、analog direct-value 和 reset pins。
- 在 `gmoccapyGui` 状态中记录 ignore limits、block delete、optional stop、override enable/counts、jog velocity 和最后一次 HAL pin 效果。
- 扩展 profile、HAL model、communication model 和 UI 诊断，明确 `optional-stop -> block delete`、`blockdelete -> optional stop`、counts 需要 count-enable、direct-value 需要 analog-enable、reset 只响应 rising edge。
- 在 override 面板增加 ignore limits、block delete、optional stop 和 100% override reset 控件，并补充浏览器 DOM/状态断言。

改了哪些文件：

- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/profiles/gmoccapy-xyzab.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/runtime/gmoccapy-communication-model.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/runtime/gmoccapy-hal-model.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/state/store.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/styles/gmoccapy.css`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_communication_model.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_hal_model.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_xyzab_gates.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_xyzab_profile.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html`
- `/home/meswork/cnc_wams/work/working5/03-推进台账.md`
- `/home/meswork/cnc_wams/work/working5/04-任务矩阵.md`
- `/home/meswork/cnc_wams/work/working5/05-验收证据.md`
- `/home/meswork/cnc_wams/work/working5/06-决策记录.md`

验证了什么：

- `node ../tests/node/verify_gmoccapy_hal_model.mjs && node ../tests/node/verify_gmoccapy_communication_model.mjs && node ../tests/node/verify_gmoccapy_xyzab_profile.mjs && node ../tests/node/verify_gmoccapy_xyzab_gates.mjs && bash ../tests/browser/verify_gmoccapy_shell_browser.sh` 通过。
- `npm run smoke:node` 通过。
- `npm run build && npm run smoke` 通过。

下一步是什么：

- 可继续核对 `gmoccapy.jog.axis.*`、`gmoccapy.jog.jog-inc-*`、`gmoccapy.delete-message`、`gmoccapy.warning-confirm` 等剩余 HAL pin 与 Web 状态/消息系统的映射。

## 2026-06-27 R6：细化 gmoccapy jog 与消息 HAL pin 语义

做了什么：

- 对照 `gmoccapy.py` 的 `_on_pin_jog_changed()`、`_on_pin_incr_changed()`、`_on_pin_turtle_jog()`、`_del_message_changed()` 和 `dialogs.warning_dialog()`，确认 jog axis pin 是按下/释放电平语义，jog increment pin 只响应 true/rising edge，`jog-inc-0` 为连续点动，`delete-message` 只在 true 时删除消息，`warning-confirm` 是活动 warning dialog 的轮询确认 pin。
- 在 `gmoccapy-xyzab` profile 中补齐 XYZAB 的 10 个 axis jog pins、`jog-inc-0..5`、`jog.jog-increment`、`jog.turtle-jog`、`delete-message` 和 `warning-confirm`。
- 扩展 HAL model 和 communication model，记录 jog axis、jog increment、turtle jog、message pins 的源码回调、summary 数量和 Web 映射。
- 扩展 `GMOCAPY_HAL_PIN`：模拟 jog axis press/release、jog increment rising-edge 选择、turtle jog level、delete-message falling-edge 忽略和 warning-confirm level 状态。
- 在 gmoccapy UI 诊断中新增 `HAL jog` 和 `HAL messages` 行，并补充 Node/浏览器断言。

改了哪些文件：

- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/profiles/gmoccapy-xyzab.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/runtime/gmoccapy-communication-model.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/runtime/gmoccapy-hal-model.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/state/store.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_communication_model.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_hal_model.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_xyzab_gates.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_xyzab_profile.mjs`
- `/home/meswork/cnc_wams/work/working5/03-推进台账.md`
- `/home/meswork/cnc_wams/work/working5/04-任务矩阵.md`
- `/home/meswork/cnc_wams/work/working5/05-验收证据.md`
- `/home/meswork/cnc_wams/work/working5/06-决策记录.md`

验证了什么：

- `node ../tests/node/verify_gmoccapy_hal_model.mjs && node ../tests/node/verify_gmoccapy_communication_model.mjs` 通过。
- `node ../tests/node/verify_gmoccapy_xyzab_profile.mjs && node ../tests/node/verify_gmoccapy_xyzab_gates.mjs` 通过。
- `bash ../tests/browser/verify_gmoccapy_shell_browser.sh` 通过。
- `npm run smoke:node` 通过。
- `npm run build && npm run smoke` 通过。

下一步是什么：

- 可继续核对 `gmoccapy.unlock-settings`、tool measurement/blockheight/probeheight、INI user messages 等更低频 HAL pins；本轮 W5-190 已完成。

## 2026-06-27 R7：细化 gmoccapy 设置解锁、测刀输出和 INI user message 边界

做了什么：

- 对照 `gmoccapy.py` 的 `_on_unlock_settings_changed()`、`_check_toolmeasurement()`、`on_chk_use_tool_measurement_toggled()`、`on_btn_block_height_clicked()`、`_init_user_messages()` 和 `_show_user_message()`，确认 `unlock-settings` 只在设置页选择 HAL unlock 时控制 `tbtn_setup` 敏感性；tool measurement 相关 pin 是 HAL_OUT；INI user messages 只在配置 `MESSAGE_*` 后动态创建 `messages.*` pins。
- 对照 `gmoccapy_XYZAB.ini` 和 `gmoccapy_XYZAB.pref`，确认本配置没有 `[TOOLSENSOR]`、没有 `[DISPLAY] MESSAGE_*`，且默认 `unlock_way=use`、`use_toolmeasurement=False`、`blockheight=0.0`。
- 在 `gmoccapy-xyzab` profile 中补齐 `gmoccapy.unlock-settings`、`gmoccapy.probeheight`、`gmoccapy.blockheight`、`gmoccapy.toolmeasurement`、`gmoccapy.searchvel`、`gmoccapy.probevel`、`gmoccapy.toolchange-number`、`gmoccapy.toolchange-confirm`，并记录 toolsensor/user messages 默认未配置原因。
- 扩展 HAL model 和 communication model，记录 settings pin、tool measurement HAL_OUT pins、动态 user message pins、XYZAB no `[TOOLSENSOR]` 和 no `MESSAGE_*` 边界。
- 扩展 `GMOCAPY_HAL_PIN`：模拟 `unlock-settings` 在默认 `unlock_way=use` 下忽略、在 HAL unlock 模式下按 level 控制 setup；tool measurement pins 作为诊断输出记录；`messages.*` 在当前 XYZAB 无配置时返回明确 operator message。
- 在 gmoccapy UI 诊断中新增 `HAL settings` 和 `HAL tool/user` 行，并补充 Node/浏览器断言。

改了哪些文件：

- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/profiles/gmoccapy-xyzab.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/runtime/gmoccapy-communication-model.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/runtime/gmoccapy-hal-model.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/state/store.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_communication_model.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_hal_model.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_xyzab_gates.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_xyzab_profile.mjs`
- `/home/meswork/cnc_wams/work/working5/03-推进台账.md`
- `/home/meswork/cnc_wams/work/working5/04-任务矩阵.md`
- `/home/meswork/cnc_wams/work/working5/05-验收证据.md`
- `/home/meswork/cnc_wams/work/working5/06-决策记录.md`

验证了什么：

- `node ../tests/node/verify_gmoccapy_hal_model.mjs && node ../tests/node/verify_gmoccapy_communication_model.mjs && node ../tests/node/verify_gmoccapy_xyzab_profile.mjs && node ../tests/node/verify_gmoccapy_xyzab_gates.mjs` 通过。
- `bash ../tests/browser/verify_gmoccapy_shell_browser.sh` 通过。
- `npm run smoke:node` 通过。
- `npm run build && npm run smoke` 通过。
- `git diff --check -- web-rtcp-5axis-sim-plan work/working5` 通过，无输出。

下一步是什么：

- W5-200 已完成。后续如继续深化，可转向 gmoccapy 文件/宏页面、tool editor 页面或 native GTK 未实现页面的诊断边界，但当前任务矩阵内 HAL 输入细化项已闭环。

## 2026-06-27 R8：working5 最终复核与验收收口

做了什么：

- 重新读取 `working5` README、功能内容、开发步骤、推进台账、任务矩阵、验收证据和决策记录，确认 W5-001 到 W5-900 均已闭环。
- 核对当前工作区改动范围，确认源码和测试改动仍集中在 gmoccapy XYZAB profile、HAL/communication model、store、UI shell 和对应 Node/browser 验收。
- 在当前工作区重新执行完整 Node 冒烟、静态构建和浏览器冒烟，确认历史记录对应的实现仍可通过。

改了哪些文件：

- `/home/meswork/cnc_wams/work/working5/03-推进台账.md`
- `/home/meswork/cnc_wams/work/working5/05-验收证据.md`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/gptlog-process/gpdlog.md`

验证了什么：

- `npm run smoke:node` 通过，关键输出包含 `gmoccapy_xyzab_profile_smoke=ok`、`gmoccapy_communication_model_smoke=ok`、`gmoccapy_hal_model_smoke=ok`、`gmoccapy_xyzab_gates_smoke=ok`、`linear_unit_conversion_smoke=ok`。
- `npm run build` 通过，输出 `gmoccapy_static_build=ok`。
- `npm run smoke` 通过，输出 `gmoccapy_shell_smoke=ok`、`gmoccapy_dist_smoke=ok`。

下一步是什么：

- `working5` 已按当前任务矩阵完成并复核通过；本轮不新增后续实现任务。
