Files
cnc_wams/完善wasm/working/23-04-HAL-Meter-Scope-JSON-Evidence-Gate落地蓝图.md
2026-07-10 21:26:42 -04:00

209 lines
10 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.
# 23-04 HAL Meter/Scope JSON Evidence Gate 落地蓝图
> 后续状态:本蓝图要求的两个 JSON evidence、wasm-port gate、Web gate 和 compare 字段已由 `28` 实施完成;原生 halscope/halmeter process 边界不变。
## 定位
本文件落实 `ACC-035/INT-022`:在 `17-04-HAL-Scope-Meter结构化证据复核.md``20-04-HAL-Scope-Meter-JSON-Gate实现缺口复核.md` 已经确认缺口之后,进一步把 `hal_meter_evidence``hal_scope_waveform_evidence` 的实际落地路径、数据来源、schema、脚本位置和验收 gate 固定下来。
覆盖 04 条目:
- `4.13 HAL Scope`
- `4.14 HAL Meter`
- `10.6 HAL 信号监视`
- `10.7 HAL Scope`
严格口径:`halGraph``halNets`、gmoccapy HAL model、按钮状态、截图、Canvas 折线或普通 HAL snapshot 只能作为输入来源,不能直接等价为 HAL Meter/Scope 完成。只有生成独立 JSON evidence、通过 Node gate并在 Web evidence/compare 中引用这些字段,才能把 04 的 HAL Meter/Scope 从“条件通过/待 gate”继续晋级。
## LinuxCNC 源码对照
| 对照对象 | LinuxCNC 路径 | Web/WASM 等效要求 |
| --- | --- | --- |
| HAL Meter 当前值监视 | `linuxcnc/src/hal/utils/meter.c``docs/src/man/man1/halmeter.1.adoc` | 输出 pin/signal/parameter 当前值、类型、来源、连接状态、source reference 和完整性 |
| HAL Scope 采样组件 | `linuxcnc/src/hal/utils/scope_rt.c``scope_shm.h``scope_usr.h` | 输出采样周期、记录长度、通道定义、触发条件、样本序列和 source reference |
| HAL Scope 用户界面 | `linuxcnc/src/hal/utils/scope.c``docs/src/hal/halscope.adoc``docs/src/man/man1/halscope.1.adoc` | Web 可用 Canvas/表格展示,但 proof 必须落到 waveform JSON |
| HAL runtime 数据源 | `linuxcnc/src/hal/hal_lib.c``hal_priv.h` | Web/WASM 侧只允许从 LinuxCNC-backed virtual HAL snapshot 或 native evidence 派生,不允许 UI 手填 |
## 现有可复用数据源
### `wasm-port`
| 现有资产 | 可复用内容 | 限制 |
| --- | --- | --- |
| `runtime/core/linuxcnc_wrap/linuxcnc_hal_runtime.cpp` | `snapshot_json()` 已输出 `pins``signals``params``threads``events` | 当前不是 `hal_meter_evidence``hal_scope_waveform_evidence` |
| `tests/wasm/node/verify_hal_runtime.mjs` | 已创建 bit/float/s32/u32 pin、param、net、thread并断言 snapshot | 只证明基础 HAL runtime不证明 meter/scope schema |
| `lchal_get_snapshot_json` | 可作为 meter 当前值的数据入口 | 需新增格式转换和 gate |
| `lchal_step_threads` | 可作为 scope 采样时钟入口 | 需记录 samplePeriodNs、recordLength 和样本序列 |
### `web-rtcp-5axis-xyzbc-trt-sim-plan`
| 现有资产 | 可复用内容 | 限制 |
| --- | --- | --- |
| `app/src/runtime/gmoccapy-hal-model.js` | gmoccapy pin group、core/spindle/postgui net、硬按钮/override/jog/tool/message pin 映射 | 是 HAL model不是 meter/scope runtime proof |
| `tests/node/verify_gmoccapy_hal_model.mjs` | 可继续证明 HAL model 本身不漂移 | 不能替代 `hal_meter_evidence`/`hal_scope_waveform_evidence` |
| `working/evidence/web-xyzbc-trt-evidence.json` | 已有 `halGraph``halNets``taskHalFullState``pyvcpPostgui` | 顶层尚无 `hal_meter_evidence``hal_scope_waveform_evidence` |
| `working/evidence/compare-xyzbc-trt-evidence.json` | 已有 native/Web compare 框架 | 尚无 meter/scope 对比项 |
本轮复核确认当前 evidence 顶层字段:
```text
web-xyzbc-trt-evidence.json: has_hal_meter_evidence=false
web-xyzbc-trt-evidence.json: has_hal_scope_waveform_evidence=false
compare-xyzbc-trt-evidence.json: has_hal_meter_evidence=false
compare-xyzbc-trt-evidence.json: has_hal_scope_waveform_evidence=false
```
## `hal_meter_evidence` Schema
建议生成位置:
```text
wasm-port/build/evidence/hal-meter-evidence.json
web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/hal-meter-evidence.json
```
最小 schema
| 字段 | 规则 |
| --- | --- |
| `apiName` | 固定为 `hal_meter_evidence` |
| `schemaVersion` | 固定为 `1`,后续变更必须增版本 |
| `source` | `wasm-hal-runtime-snapshot``web-task-hal-status``native-hal-meter` |
| `profileId` | 例如 `xyzbc-trt``xyzac-trt``gmoccapy-xyzab` |
| `linuxCncReferences[]` | 至少包含 `src/hal/utils/meter.c``docs/src/man/man1/halmeter.1.adoc` |
| `snapshotCycle` | 来源 snapshot 的 cycle/taskCycle/servoCycle |
| `items[]` | 非空,且至少覆盖 pin、signal、parameter 三类中的可用类别 |
| `items[].name` | HAL pin/signal/parameter 名称 |
| `items[].sourceKind` | `pin``signal``parameter` |
| `items[].type` | `bit``float``s32``u32``s64``u64` |
| `items[].value` | 与 HAL type 一致的 JSON 值 |
| `items[].connected` | 对 pin/signal 必须有布尔值parameter 可为 `false` |
| `items[].signal` | pin 连接到 signal 时必须记录 |
| `integrity.complete` | 全部必填字段通过时为 `true` |
| `integrity.missing[]` | 缺字段时列出原因,且不得晋级 |
最小覆盖集合:
```text
pin: motion.analog-out-03, motion.program-line, probe.in/probe.out
signal: probe-signal 或目标 Web evidence 中实际存在的 HAL net signal
parameter: standalone.param-float, standalone.param-s32 或目标 profile 中可回读参数
```
## `hal_scope_waveform_evidence` Schema
建议生成位置:
```text
wasm-port/build/evidence/hal-scope-waveform-evidence.json
web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/hal-scope-waveform-evidence.json
```
最小 schema
| 字段 | 规则 |
| --- | --- |
| `apiName` | 固定为 `hal_scope_waveform_evidence` |
| `schemaVersion` | 固定为 `1` |
| `source` | `wasm-hal-runtime-thread-samples``web-task-hal-servo-samples``native-halscope` |
| `profileId` | 与采样运行 profile 一致 |
| `linuxCncReferences[]` | 至少包含 `scope_rt.c``scope_shm.h``scope_usr.h``halscope.adoc` |
| `samplePeriodNs` | 正整数 |
| `recordLength` | 正整数 |
| `channelCount` | 必须等于 `channels.length` |
| `channels[]` | 每项包含 `index``name``kind``type` |
| `trigger` | 包含 `mode``channel``edge``level` 或显式 `forced: true` |
| `samples[]` | 长度等于 `recordLength` 或记录 `integrity.truncated=true` |
| `samples[].sampleIndex` | 从 0 递增 |
| `samples[].timeNs` | 单调递增 |
| `samples[].values[]` | 长度必须等于 `channelCount` |
| `integrity.complete` | 字段、长度、类型和时间单调均通过时为 `true` |
最小采样策略:
1. 初始化 HAL runtime创建至少 2 个 pin 和 1 个 signal。
2. 建立 `net`,让输出 pin 传播到输入 pin。
3. 每个 sample 前修改至少一个 pin 值,调用一次 `lchal_step_threads()` 或 Web task/HAL servo step。
4. 记录 `sampleIndex``timeNs`、每个 channel 的值。
5. 校验至少一个 channel 值随 sample 变化,避免静态截图式 proof。
## 建议新增 Gate
### `wasm-port`
建议新增:
```text
wasm-port/tests/ui/node/verify_hal_meter_evidence.mjs
wasm-port/tests/ui/node/verify_hal_scope_waveform_evidence.mjs
```
命令:
```bash
cd wasm-port && node tests/ui/node/verify_hal_meter_evidence.mjs
cd wasm-port && node tests/ui/node/verify_hal_scope_waveform_evidence.mjs
```
通过输出:
```text
hal_meter_evidence_schema=ok
hal_meter_evidence_items=ok
hal_scope_waveform_schema=ok
hal_scope_waveform_samples=ok
```
失败条件:
- 没有 `linuxCncReferences`
- `items[]``channels[]` 为空。
- `samples[]` 长度与 `recordLength` 不一致且没有 `truncated` 说明。
- waveform 中所有 sample 完全相同。
- 从 UI 字符串或截图生成 evidence而不是从 HAL snapshot/runtime 派生。
### `web-rtcp-5axis-xyzbc-trt-sim-plan`
建议新增:
```text
web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_hal_meter_scope_evidence.mjs
```
并扩展:
```text
web-rtcp-5axis-xyzbc-trt-sim-plan/tools/collect-web-xyzbc-trt-evidence.mjs
web-rtcp-5axis-xyzbc-trt-sim-plan/tools/compare-xyzbc-trt-evidence.mjs
```
要求:
- `web-xyzbc-trt-evidence.json` 顶层必须出现 `hal_meter_evidence``hal_scope_waveform_evidence`
- `compare-xyzbc-trt-evidence.json` 必须出现对应 comparison 项。
- Browser smoke 只负责证明 UI 渲染,不得替代 JSON schema gate。
## 04 严格状态更新
| 04 项 | 当前状态 | 落地后晋级条件 |
| --- | --- | --- |
| `4.13 HAL Scope` | 待实现 waveform JSON gate | 生成 `hal_scope_waveform_evidence`,通过 schema、sample、trigger 和 compare gate |
| `4.14 HAL Meter` | 条件通过,待补 meter JSON gate | 生成 `hal_meter_evidence`,覆盖 pin/signal/parameter 当前值并通过 gate |
| `10.6 HAL 信号监视` | 条件通过 | 如果只声明监视模型,`halGraph`/`halNets` 可保留;若声明 meter-like 当前值,必须引用 `hal_meter_evidence` |
| `10.7 HAL Scope` | 待实现 waveform JSON gate | Canvas/UI 必须由 `hal_scope_waveform_evidence` 驱动或引用该 evidence |
## 与现有文件的关系
- `17-04-HAL-Scope-Meter结构化证据复核.md`:定义源码边界。
- `20-04-HAL-Scope-Meter-JSON-Gate实现缺口复核.md`:确认当前缺 `hal_meter_evidence` / `hal_scope_waveform_evidence`
- 本文件:定义实际 schema、生成路径、脚本位置、通过输出和晋级条件。
- 后续实现脚本后,必须把命令输出回填到 `05-验收证据.md`,再把 `14` 中对应项从“待实现 gate”晋级。
## 结论
`ACC-035/INT-022` 已完成 HAL Meter/Scope JSON Evidence Gate 的落地蓝图。当前项目仍不能把 04 的 HAL Scope/Meter 宣称为完整完成;但后续实现已收敛为明确的两个 JSON evidence、三个 Node gate 和 Web evidence/compare 字段扩展。任何晋级必须以这些可机读字段和 gate 通过为准。
## 后续状态
蓝图已由 `ACC-040/INT-027` 实施:`hal_meter_evidence``hal_scope_waveform_evidence`、WASM Node gate、Web evidence 和 compare 均已通过。当前严格结论见 `28-04-HAL-Meter-Scope-JSON-Evidence-Gate实施记录.md`;该结果不继承为原生 GTK/RT `halmeter`/`halscope` process proof。