Files
cnc_wams/完善wasm/working/25-04-Host-Runtime-Opt-In-Promotion-Evidence-Gate落地蓝图.md
2026-07-10 21:26:42 -04:00

323 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 25-04 Host Runtime Opt-In Promotion Evidence Gate 落地蓝图
> 后续状态evidence schema、状态机、release/promotion separation 和 Web 字段已由 `29` 实施完成;人工 promotion lock、realtime 和 hardware 边界不变。
## 定位
本文件落实 `ACC-037/INT-024`:在 `22-04-Full-Process-Realtime-Runtime-Proof实现缺口复核.md` 已经区分 Web/WASM simulation runtime 与宿主能力之后,继续把宿主 User-M、Tool DB、Python remap、实时内核、硬件驱动和完整 native process topology 的 opt-in、证据接受、人工解锁与晋级规则固定为可机读合同。
严格口径:项目发布 gate 通过、host 命令齐全、允许手工 dispatch、probe 默认禁用或某个单 fixture native pass都不能自动等价为宿主能力已晋级。宿主能力必须拥有独立 evidence、独立 promotion lock 和独立人工审查结果。
## LinuxCNC 权威边界
| 能力 | LinuxCNC 权威来源 | 必须证明的宿主行为 |
| --- | --- | --- |
| User-M 外部进程 | `src/emc/task/emctask.cc``USER_M_PATH`/`USER_DEFINED_FUNCTION_ADD``emctaskmain.cc``EMC_SYSTEM_CMD``fork/exec/waitpid` | 搜索、注册、启动、退出状态、异常/中止和配置副作用均由 LinuxCNC-owned runtime 执行 |
| Tool DB 外部进程 | `src/emc/task/taskclass.cc``src/emc/tooldata/tooldata_db.cc``configs/sim/axis/db_demo` | `DB_PROGRAM` 启动、v2.1 handshake、g/p/l/u 协议、持久状态与失败路径 |
| Python remap | `src/emc/rs274ngc` Python plugin/remap 路径、`tests/remap`、代表 `configs/sim` fixture | Python runtime 生命周期、callable lookup、generator/yield、解释器状态绑定和异常传播 |
| Linux realtime/HAL thread | `src/rtapi``src/hal/hal_lib.c``src/emc/motion/motion.c``control.c` | `rtapi_app_main`、真实 HAL thread、周期调度、motion controller/command handler 和实时属性 |
| 硬件驱动 | `src/hal/drivers`、设备特定模块、真实 IO/HAL pin | 明确硬件环境、驱动加载、IO 回读、故障和安全策略 |
| 完整 native process topology | Task/NML/Motion/HAL/IO/RTAPI 进程与共享状态 | 进程启动顺序、NML/共享内存、状态机、退出/恢复和跨进程一致性 |
## 当前机器可读事实
### Host readiness 与 dispatch
`wasm-port/build/wasm/sim-configs-inventory/runtime-boundary-host-readiness-rollup.tsv` 当前记录:
```text
host_readiness_status=host_ready_for_all_opt_in_native_probes
family_count=3
host_ready_family_count=3
host_blocked_family_count=0
execution_enabled=0
promotion_allowed=0
```
`runtime-boundary-opt-in-probe-dispatch-rollup.tsv` 当前记录:
```text
dispatch_status=dispatch_allowed_for_all_opt_in_native_probes
dispatch_allowed_count=3
dispatch_blocked_count=0
execution_enabled=0
promotion_allowed=0
```
结论host ready 和 dispatch allowed 只表示可以手工考虑运行 probe二者都不是执行证据更不是 promotion。
### 三个 runtime family
| Family | 当前 probe status | Native evidence | Node/Browser | Promotion |
| --- | --- | --- | --- | --- |
| `L4-USER-M-PROCESS` | `ready_disabled_by_default` | `pending_until_native_pass` | 等待 native pass | `0` |
| `L4-TOOL-DB` | `ready_disabled_by_default` | `pending_until_native_pass` | 等待 native pass | `0` |
| `L4-PYTHON-REMAP` stop-lookahead fixture | `runtime_lifecycle_probe_passed` | `native_pass_evidence_accepted` | 对应 fixture gate 完成 | 仍为 `0`,等待 manual lock review |
因此:
- `ready_disabled_by_default` 不是 pass。
- `runtime_lifecycle_probe_passed` 只属于具体 Python fixture不能批量晋级 53 个 Python remap rows。
- `evidence_acceptance_allowed=1` 不是 `promotion_allowed=1`
- `promotion_lock_active=1` 时任何自动化都不得改写状态。
### Project release readiness
`wasm-port/build/project-release-readiness.json` 当前可以同时出现:
```text
phase=ready
ready=true
releaseGate.passed=true
blockedRuntimeFamilies=[L4-USER-M-PROCESS,L4-PYTHON-REMAP]
promotedRuntimeFamilies=[]
promotedBlockedFamilies=[]
```
其中 Tool DB Web/WASM proof 可以 `ready=true`,但其 summary 仍明确:
```text
nativeRuntimeRequiredForPromotion=true
promotionAllowed=false
executionEnabled=false
```
结论:项目发布 readiness 证明当前已声明范围可发布,不证明所有 blocked runtime family 已解除。
### Web 代表应用
目标 Web 项目当前固定:
```text
promotionScope=web_simulation_only
hardwareDrive=false
hostRealtimeKernel=false
hostExternalUserMProcessReady=false
hostToolDbProcessReady=false
arbitraryUserMExecution=false
```
Web 中 `externalUserMProcessReady=true``toolDbProcessReady=true` 只能与 `Scope=web_simulation_only` 同时成立,不得映射为 host process ready。
`native-task-hal-audit.js` 允许 `ready_disabled_by_default``skipped_missing_host_runtime` 作为“Web blocked boundary 表达一致”的可接受默认状态,但这只用于证明 host promotion 没有被意外打开;不得把该 `nativeProbeOk` 内部判断解释成 native runtime pass。
## 状态机
每个宿主 family 必须按下列状态推进,不允许跳级:
```text
host_unavailable
-> host_ready
-> dispatch_allowed
-> ready_disabled_by_default
-> probe_running
-> native_probe_passed
-> native_evidence_accepted
-> node_gate_complete
-> browser_gate_complete
-> manual_review_required
-> promotion_allowed
```
失败/旁路状态:
| 状态 | 含义 | Promotion |
| --- | --- | --- |
| `skipped_missing_host_runtime` | 缺命令、库、权限或环境 | 禁止 |
| `blocked_existing_linuxcnc_runtime` | 已有 LinuxCNC process graph 冲突 | 禁止,不得终止用户进程抢占环境 |
| `blocked_missing_source` | LinuxCNC/config source 不完整 | 禁止 |
| `probe_failed` | 运行或断言失败 | 禁止 |
| `native_probe_passed` | 仅 native probe 已通过 | 仍禁止自动晋级 |
| `native_evidence_accepted` | Native evidence schema/来源已接受 | 仍需 Node/Browser 和人工解锁 |
| `manual_review_required` | 自动 gate 已完成,锁仍生效 | 禁止自动晋级 |
## `host_runtime_opt_in_evidence` Schema
建议生成位置:
```text
wasm-port/build/evidence/host-runtime-opt-in-evidence.json
web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/host-runtime-opt-in-evidence.json
```
顶层最小字段:
| 字段 | 规则 |
| --- | --- |
| `apiName` | 固定为 `host_runtime_opt_in_evidence` |
| `schemaVersion` | 固定为 `1` |
| `upstreamCommit` | 锁定 LinuxCNC commit |
| `generatedAt` | UTC 时间 |
| `projectReleaseReady` | 与 host promotion 分离记录 |
| `webSimulationPromotionAllowed` | 只对应 Web simulation boundary |
| `hostPromotionAllowed` | 只有全部指定 family 完成且人工解锁才可为 `true` |
| `families[]` | User-M、Tool DB、Python fixture未来 realtime/hardware 单独增加 |
| `integrity.complete` | schema 和 artifact hash 完整性 |
`families[]` 每项最小字段:
| 字段 | 规则 |
| --- | --- |
| `boundaryClass` | `L4-USER-M-PROCESS``L4-TOOL-DB``L4-PYTHON-REMAP` 等 |
| `target` | 精确 fixture/profile不允许写成模糊 family 后批量继承 |
| `linuxCncReferences[]` | 源码、配置、测试路径 |
| `optInEnv` | 明确的单一 opt-in 环境变量 |
| `hostReady` | 命令/库/权限可用 |
| `dispatchAllowed` | 安全前置检查允许手工运行 |
| `executionEnabled` | 默认必须为 `false` |
| `probeStatus` | 使用本文件状态枚举 |
| `nativeEvidenceStatus` | pending/observed/accepted/rejected |
| `nativeEvidenceArtifacts[]` | stdout/stderr/TSV/JSON 与 SHA-256 |
| `nodeGateComplete` | 布尔值 |
| `browserGateComplete` | 布尔值 |
| `promotionLockActive` | 默认 `true` |
| `manualReview` | reviewer、decision、timestamp、reason未审查时为空 |
| `promotionAllowed` | 不得由 probe 脚本直接写成 `true` |
| `blockers[]` | 全部未满足条件 |
## Opt-In 安全合同
### 默认行为
- 所有宿主 probe 默认不运行,只输出 `ready_disabled_by_default` 或明确 skip/block 状态。
- CI、browser smoke、release gate 和普通 Node gate 不得设置 opt-in 环境变量。
- probe 不得静默启动硬件驱动、占用设备、修改系统配置或终止既有 LinuxCNC 进程。
- probe 输出必须始终保留 `execution_enabled=0``promotion_allowed=0`;实际晋级由独立人工审查 artifact 完成。
### User-M
允许的手工命令:
```bash
ENABLE_MILLTURN_USER_M_RUNTIME_PROBE=1 bash wasm-port/tests/native/probe_millturn_user_m_runtime.sh
```
必须证明LinuxCNC-owned `USER_M_PATH -> EMC_SYSTEM_CMD -> M128/M129` 执行,进程退出状态,以及 `ini.[xyz].*` HAL pin 的切换前后值。若发现已有 `linuxcncsvr`/`rtapi_app`,必须返回 `blocked_existing_linuxcnc_runtime`
### Tool DB
允许的手工命令:
```bash
ENABLE_TOOL_DB_RUNTIME_PROBE=1 bash wasm-port/tests/native/probe_tool_db_runtime.sh
```
必须证明LinuxCNC Tool DB child process、协议 handshake、命令/reply、持久状态和异常关闭。Web Worker/Python-WASM proof 不能替代 native DB_PROGRAM pass。
### Python remap
允许的手工命令:
```bash
ENABLE_PYTHON_REMAP_RUNTIME_PROBE=1 bash wasm-port/tests/native/probe_python_remap_runtime.sh
```
必须按 fixture 保存 lifecycle evidence。stop-lookahead pass 只能晋级 stop-lookahead批量 family promotion 必须逐 fixture 或由等价覆盖矩阵证明,且仍需 manual lock review。
### Realtime 与硬件
当前三个 opt-in probe 不覆盖 Linux realtime kernel 或真实硬件。以下字段必须保持:
```text
hostRealtimeKernel=false
hardwareDrive=false
```
要解除它们,必须另建专用任务和安全合同,至少包括:
- 独立测试主机/容器或实验设备标识。
- realtime kernel/RTAPI backend、latency/period/deadline 证据。
- 真实 HAL driver/module、设备白名单和 IO loopback。
- 急停、限位、故障注入和清理恢复。
- 明确人工授权,不能继承本文件三个 process probe 的 opt-in 权限。
## Promotion 判定
单个 family 的 `promotionAllowed=true` 必须满足全部条件:
```text
hostReady
&& dispatchAllowed
&& probeStatus == expectedPassStatus
&& nativeEvidenceStatus == accepted
&& nodeGateComplete
&& browserGateComplete
&& noUnexpectedFailures
&& sourceGuardPassed
&& promotionLockActive == false
&& manualReview.decision == approved
```
全局 `hostPromotionAllowed=true` 还必须声明 promotion scope。单个 Python fixture 通过时,不得写成整个 Python runtime family 通过。
项目 release gate 必须增加反向断言:
- `ready=true` 时允许存在 `blockedRuntimeFamilies`,但必须完整列出。
- `promotedBlockedFamilies` 必须为空,除非存在已批准的 family evidence。
- `hostPromotionAllowed=false` 时 Web UI 必须显示 host process/realtime/hardware false。
- `ready_disabled_by_default``skipped_*``blocked_*` 不得被 accepted status 集合当作 native pass。
## 建议 Gate
### `wasm-port`
建议新增:
```text
wasm-port/tests/host/verify_host_runtime_opt_in_evidence.mjs
wasm-port/tests/host/verify_host_runtime_promotion_state_machine.mjs
wasm-port/tests/host/verify_project_release_vs_host_promotion.mjs
```
最低输出:
```text
host_runtime_opt_in_evidence_schema=ok
host_runtime_promotion_state_machine=ok
project_release_host_promotion_separation=ok
disabled_probe_not_native_pass=ok
single_fixture_not_bulk_promotion=ok
realtime_hardware_remain_blocked=ok
```
### Web 代表应用
目标 Web evidence 应增加:
```text
hostRuntimeOptInEvidence
hostPromotionSummary
blockedRuntimeFamilies
```
Browser gate 必须验证:
- `promotionScope=web_simulation_only`
- host User-M/Tool DB、realtime、hardware 均显示 false。
- Web simulation ready 与 host promotion false 可以同时正确显示。
- 任何 host family 状态变化必须来自签名/哈希匹配的 evidence artifact不得由 UI toggle 直接修改。
## 当前严格状态
| 能力 | 当前状态 | 晋级条件 |
| --- | --- | --- |
| Web/WASM task-motion-HAL simulation | 可按 `22` 晋级 | 保持 host/realtime/hardware false |
| User-M native external process | `ready_disabled_by_default`Blocked | 手工 native pass、evidence accepted、Node/Browser、manual unlock |
| Tool DB native process | `ready_disabled_by_default`Blocked | native protocol pass、evidence accepted、Node/Browser、manual unlock |
| Python stop-lookahead fixture | native evidence accepted仍锁定 | manual review只允许 fixture scope |
| Python remap family | Blocked | 覆盖矩阵、逐 fixture evidence、manual unlock |
| Linux realtime kernel | Blocked/非 Web 目标 | 独立 realtime 安全任务与专用证据 |
| 真实硬件驱动 | Blocked/非 Web 目标 | 独立硬件实验环境、安全授权和 IO evidence |
| 完整 native process topology | Blocked/条件通过 | Task/NML/Motion/HAL/IO/RTAPI 全链路独立 proof |
## 与现有文件的关系
- `22-04-Full-Process-Realtime-Runtime-Proof实现缺口复核.md`:定义 Web simulation promotion 边界。
- `wasm-port/docs/host-runtime-boundary-handoff.md`:现有 host family、TSV、opt-in 命令和 promotion rule。
- 本文件把状态机、JSON schema、release/promotion 分离、人工解锁和 realtime/hardware 非继承规则纳入总控。
- 后续实际实现 gate 后,必须回填 `05-验收证据.md`,并只更新对应 fixture/family 的状态。
## 结论
`ACC-037/INT-024` 已完成 Host Runtime Opt-In Promotion Evidence Gate 落地蓝图。当前 host 已具备运行三个 opt-in probe 的前置条件,但 `execution_enabled=0``promotion_allowed=0` 仍是正确状态User-M/Tool DB 默认未运行Python stop-lookahead 只有单 fixture native evidence accepted实时内核和硬件完全不在这三个 opt-in probe 的覆盖范围。任何后续晋级必须经过独立 evidence、Node/Browser gate 和人工解锁,不能由项目 release `ready=true` 自动继承。