项目接续文件：tool DB 解锁步骤与方法

生成时间：2026-06-18 CST

本文件接替 `text19.txt` 中关于 blocked runtime family 的后续推进说明，专门规划
`L4-TOOL-DB` / `axis/db_demo/base.ngc` 的解锁路径。当前目标不是绕过 tool DB，
而是在已有 source-derived evidence、transaction contract、native readiness gate 和
promotion lock 框架基础上，把 tool database process protocol 证明补齐，然后再允许
真实 inventory promotion。

重要状态说明：本文件是未来解锁研究计划，不是当前阶段实施范围。当前阶段铁律仍是
“virtual HAL 成果作为 sim config promotion 证据基础”，同时明确不解锁
`L4-PYTHON-REMAP`、`L4-TOOL-DB`、`L4-USER-M-PROCESS` 这些 hard block。
因此在当前交付中，`axis/db_demo/base.ngc` 必须继续保持 `SKIP L4-TOOL-DB`，
`promotion_allowed=0`，`promotion_lock_active=1`。

一、当前已完成条件

当前项目已经具备以下基础，不需要重做：

1. source/config ownership 已明确。

- `axis/db_demo/base.ngc` 当前 blocked kind 为 `L4-TOOL-DB`；
- owning INI 为 `axis/db_demo/db_nonran.ini`；
- INI 声明：

```text
[EMCIO]
DB_PROGRAM = ./db_nonran.py
```

- LinuxCNC source owner 已记录：
  - `configs/sim/axis/db_demo/db_nonran.ini`
  - `configs/sim/axis/db_demo/db.py`
  - `src/emc/task/taskclass.cc`
  - `src/emc/tooldata/tooldata_db.cc`
  - `lib/python/tooldb.py`

2. machine-readable artifacts 已有。

当前已有并通过 inventory gate 的 tool DB 相关 artifact：

```text
wasm-port/build/wasm/sim-configs-inventory/tool-db-process-boundary-summary.tsv
wasm-port/build/wasm/sim-configs-inventory/tool-db-process-protocol-gates.tsv
wasm-port/build/wasm/sim-configs-inventory/tool-db-process-transaction-plan.tsv
wasm-port/build/wasm/sim-configs-inventory/tool-db-process-native-protocol-alignment.tsv
wasm-port/build/wasm/sim-configs-inventory/tool-db-process-native-runtime-readiness.tsv
wasm-port/build/wasm/sim-configs-inventory/tool-db-process-native-runtime-probe-gate.tsv
```

3. transaction contract 已明确。

`tool-db-process-transaction-plan.tsv` 已把 DB protocol 拆成以下 pending proof：

- `startup_handshake`：启动后返回 `v2.1`；
- `initial_get_all`：发送 `g`，读取直到 `FINI`；
- `spindle_load_notify`：发送/验证 `l`；
- `tool_offset_notify`：发送/验证 `p`；
- `spindle_unload_notify`：发送/验证 `u`。

4. 当前 readiness 状态已明确。

当前 `tool-db-process-native-runtime-readiness.tsv` / probe gate 显示：

```text
python3=1
axis/db_demo/db_nonran.py=1
linuxcnc.so=1
tooldb.py=1
linuxcnc=0
milltask=0
halcmd=0
runtime_ready=0
source_proof_ready=1
gate_status=blocked_missing_host_runtime
proof_status=pending
execution_enabled=0
promotion_allowed=0
```

这说明当前缺的不是 source evidence，也不是 Python 文件本身，而是完整 LinuxCNC
task/tooldata DB host runtime。

二、解锁原则

tool DB 解锁必须遵守以下规则：

1. 不允许用 `.tbl` fallback 解锁。

`DB_PROGRAM` 模式明确替代普通 tool table path。用 `.tbl` 让程序跑通会绕过
LinuxCNC tool database process protocol，属于错误 promotion。

2. 不允许用 JS/virtual HAL 重新实现 tool DB 语义。

virtual HAL 可以继续作为 HAL/motion/browser diagnostics evidence，但不能替代：

- `DB_PROGRAM` 子进程启动；
- `tooldb.py` protocol loop；
- `v2.1` / `g` / `l` / `u` / `p` protocol；
- nonrandom DB state mutation；
- flat-file persistence。

3. native proof 必须先于 Node/browser promotion。

只有 native runtime probe 明确通过以后，才允许更新 Node/browser promotion gate。

4. promotion lock 必须手动更新。

即使 native probe 通过，也不能自动把 `axis/db_demo/base.ngc` 从 skipped 改为 executed。
必须明确更新 promotion readiness、blockers、post-native-pass gate 和 lock artifact。

三、第一阶段：准备 host runtime

目标：让 tool DB runtime readiness 从：

```text
runtime_ready=0
missing_requirements=linuxcnc,milltask,halcmd
```

变为：

```text
runtime_ready=1
missing_requirements=-
```

需要准备的命令/模块：

```text
python3
linuxcnc
milltask
halcmd
axis/db_demo/db_nonran.py
linuxcnc.so
tooldb.py
```

当前已有：

```text
python3
axis/db_demo/db_nonran.py
linuxcnc.so
tooldb.py
```

当前缺失：

```text
linuxcnc
milltask
halcmd
```

建议方法：

1. 在具备完整 LinuxCNC userspace runtime 的 host / container 中执行。
2. 确保 `linuxcnc`、`milltask`、`halcmd` 在 `PATH` 上。
3. 确保 LinuxCNC Python 模块路径能被 `db_nonran.py` import：

```text
python3 -c "import linuxcnc; import tooldb; print('linuxcnc_tooldb_python_modules=ok')"
```

4. 重新运行 native probes / inventory gate 以刷新 readiness artifacts：

```text
wasm-port/tests/native/probe_tool_db_runtime.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
```

预期中间状态：

- 如果 host runtime 仍缺失：

```text
tool_db_runtime_probe_status=skipped_missing_host_runtime
```

- 如果 host runtime 已满足但未显式启用 probe：

```text
tool_db_runtime_probe_status=ready_disabled_by_default
```

四、第二阶段：执行 native DB protocol probe

目标：证明 LinuxCNC-owned DB process protocol 真实可运行。

执行命令：

```text
ENABLE_TOOL_DB_RUNTIME_PROBE=1 wasm-port/tests/native/probe_tool_db_runtime.sh
```

该 probe 必须证明：

1. `db_nonran.py` 按 `DB_PROGRAM` 配置启动；
2. startup handshake 返回 `v2.1`；
3. `g` get-all 返回 expected nonrandom startup tools；
4. startup state 覆盖 `T10..T19` / `tno+100` pockets；
5. `l` load notify 触发 spindle load state；
6. `p` tool offset notify 触发 DB update path；
7. `u` unload notify 触发 spindle unload state；
8. flat-file persistence 能反映 state mutation；
9. probe 输出：

```text
tool_db_runtime_probe_status=runtime_protocol_probe_passed
```

失败处理：

- 如果失败在 import `linuxcnc` / `tooldb`：修 Python module path，不改项目语义；
- 如果失败在 `linuxcnc` / `milltask` / `halcmd`：修 host runtime，不改 Node/browser fallback；
- 如果失败在 protocol message：先对齐 native `db_nonran.py` / `tooldb.py` 行为和
  `tool-db-process-transaction-plan.tsv`，不允许用简化协议绕过；
- 如果失败在 persistence：修 probe 环境的临时 DB 文件隔离和 cleanup，不把 persistence
  检查删除。

五、第三阶段：刷新 native/runtime artifacts

native probe pass 后，重新生成并验证 artifacts：

```text
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
```

预期变化方向：

```text
tool-db-process-native-runtime-readiness.tsv:
  runtime_ready=1
  missing_requirements=-

tool-db-process-native-runtime-probe-gate.tsv:
  gate_status=native_probe_passed_waiting_for_node_browser_promotion_proof
  proof_status=passed
  source_proof_ready=1
```

注意：这个阶段仍不应直接让 `promotion_allowed=1`。native pass 只是打开下一步
Node/browser proof 的条件。

六、第四阶段：更新 promotion readiness / blocker / lock

native pass 后，需要更新以下 gate 的逻辑和 fixtures：

```text
runtime-boundary-promotion-readiness.tsv
runtime-boundary-promotion-blockers.tsv
runtime-boundary-post-native-pass-gates.tsv
runtime-boundary-native-evidence-acceptance-gate.tsv
blocked-runtime-promotion-lock.tsv
next-boundary-recommendations.tsv
promotion-candidates.tsv
```

目标状态：

1. `native_evidence_ready=1`；
2. `node_inventory_gate_complete=0`，直到 Node inventory row 真实执行；
3. `browser_smoke_gate_complete=0`，直到 browser proof 真实通过；
4. `promotion_lock_active=1`，直到人工明确解锁；
5. blocker 从 `missing_host_runtime` 转为：

```text
pending_node_inventory_promotion_gate
pending_browser_smoke_gate
promotion_lock_active
```

这一步的重点是：native proof 已经完成，但还没有完成 Node/browser promotion，因此
blocked family 不能直接消失。

七、第五阶段：设计 Node inventory execution path

只有 native DB protocol probe 通过后，才允许考虑让 `axis/db_demo/base.ngc` 进入
Node inventory execution。

可接受方向：

1. 通过 LinuxCNC-owned tooldata DB protocol wrapper 执行；
2. 保留 `DB_PROGRAM = ./db_nonran.py` 的行为边界；
3. Node/WASM 侧只做 file staging、protocol bridge、result capture；
4. 所有 tool DB state 来自 LinuxCNC protocol / db.py 行为，而不是 JS 自行解释。

不可接受方向：

1. 把 `axis/sim.tbl` 或任意 `.tbl` 当作 DB fallback；
2. 在 JS 中手写 `T10..T19` tool DB state；
3. 跳过 `v2.1` / `g` / `l` / `u` / `p` protocol；
4. 只因为 native `bin/rs274` 能 parse `base.ngc` 就标记 Node inventory PASS；
5. 把 virtual HAL readiness 当作 tool DB process readiness。

如果 Node/WASM 当前无法启动 Python DB process，则应保持：

```text
node_inventory_gate_complete=0
promotion_allowed=0
```

并把下一步限定为“设计 tool DB protocol bridge”，而不是直接改 baseline。

八、第六阶段：Browser proof

Browser proof 只能在 Node inventory gate 真实完成后做。

Browser proof 至少需要：

- diagnostics artifact 记录 tool DB protocol proof status；
- release URL workflow 显示 `axis/db_demo/base.ngc` 的 DB proof；
- 明确 `tool_table_fallback_sufficient=0`；
- 明确 `python3_sufficient=0`；
- 明确 source owner 是 LinuxCNC DB protocol；
- browser 只呈现 proof / workflow / artifact，不自行执行 tool DB semantics。

九、第七阶段：真实 inventory baseline promotion

只有满足以下条件后，才允许把 `axis/db_demo/base.ngc` 从 skipped 变为 executed：

1. native DB runtime probe passed；
2. Node inventory execution path 通过 LinuxCNC-owned DB protocol；
3. browser proof / release diagnostics gate 已通过；
4. promotion lock 手动关闭；
5. `promotion-candidates.tsv` 中对应行从：

```text
candidate_kind=inventory-ready
current_status=SKIP
skip_kind=L4-TOOL-DB
promotion_allowed=0
```

变为真实可 promotion 状态，并有明确 proof chain；
6. `summary.tsv` 中 `axis/db_demo/base.ngc` 变为：

```text
inventory_status=PASS
skip_or_fail_reason=-
```

预期 baseline 变化：

```text
executed: 28 -> 29
passed:   28 -> 29
skipped:  131 -> 130
unexpected_fail: 0
```

十、需要同步更新的文件/断言

baseline 真实变化后，至少同步：

```text
wasm-port/docs/sim-configs-coverage-matrix.md
wasm-port/docs/sim-config-coverage-promotion-analysis.md
wasm-port/docs/compatibility-validation.md
wasm-port/runtime/sdk/src/linuxcnc-hal.js
wasm-port/runtime/sdk/src/project-release-readiness.js
wasm-port/tests/fixtures/project-release-readiness-ready.json
wasm-port/tests/sdk/node/verify_sdk_surface.mjs
wasm-port/tests/sdk/node/verify_project_release_gate_manifest.mjs
wasm-port/tests/host/verify_project_release_readiness_artifact.mjs
wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.mjs
```

需要同步更新的固定 baseline：

```text
VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE
project release readiness fixture simConfigInventory
coverage matrix Current Node inventory
compatibility validation current gate text
promotion candidate expected status
skip-summary expected count
```

十一、最小验证命令

host runtime 准备阶段：

```text
wasm-port/tests/native/probe_tool_db_runtime.sh
```

native runtime proof 阶段：

```text
ENABLE_TOOL_DB_RUNTIME_PROBE=1 wasm-port/tests/native/probe_tool_db_runtime.sh
```

artifact / inventory 阶段：

```text
git diff --check
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/sdk/node/verify_sdk_surface.sh
wasm-port/tests/sdk/node/verify_project_release_gate_manifest.sh
```

browser / release proof 阶段：

```text
SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_real_simulation_browser.sh
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh
wasm-port/tests/host/verify_project_release_readiness_artifact.sh
```

十二、下一步工作内容

当前机器 artifact 显示缺少：

```text
linuxcnc
milltask
halcmd
```

因此下一步不是改 Node inventory baseline，而是：

1. 在具备完整 LinuxCNC host runtime 的环境中运行：

```text
wasm-port/tests/native/probe_tool_db_runtime.sh
```

2. 如果状态变为 `ready_disabled_by_default`，继续运行：

```text
ENABLE_TOOL_DB_RUNTIME_PROBE=1 wasm-port/tests/native/probe_tool_db_runtime.sh
```

3. 拿到 `runtime_protocol_probe_passed` 后，刷新 inventory artifacts：

```text
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
```

4. 再进入 promotion readiness / lock 更新，而不是直接把
   `axis/db_demo/base.ngc` 改成 PASS。

十三、简要结论

tool DB 的解锁关键不是 virtual HAL 能力不足，而是还缺 LinuxCNC task/tooldata DB
process runtime proof。当前 source evidence、contract、readiness artifact、probe gate
都已铺好；真正的第一步是补齐 host runtime 并跑通
`ENABLE_TOOL_DB_RUNTIME_PROBE=1 wasm-port/tests/native/probe_tool_db_runtime.sh`。
