# 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` 自动继承。