File size: 8,562 Bytes
9f075f3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | # 确定性 Agent 运行时规范 v0.1(草案)
> 发起方:HoloAeon 项目(`holoaeon/spec.py` 的 `VERSION` 为版本权威源)。
> 状态:草案,条款可判定、可被第三方实现。**本规范由 HoloAeon 项目发起,欢迎他方实现。**
> 本文不定义产品形态,只定义「什么算可复现」的下限。仿真是仿真,证明是证明。
## 1 范围
本规范面向「声称自己是确定性 Agent 运行时」的任意实现,规定四件事:
1. 复现哈希(DIFF=0)怎么算,什么字段必须剔除;
2. 理由码怎么枚举,什么算「已解释」;
3. 证据怎么分级,什么算「漂移」;
4. 兼容性怎么分级,什么程度的复现算「合格实现」。
不规定:语言、框架、模型、部署形态、许可证。规范只管证据,不管路线。
## 2 术语
| 术语 | 定义 | 判定方式 |
|---|---|---|
| ReproCore 可复现核心 | 裁决、路由目标、命中技能、技能输出等「同一输入应相同」的字段集合 | 字段名登记在实现方的分类表中,未登记即未知 |
| Physical 物理量 | 时间戳、耗时、线程完成序、进程号、内存地址等「本就该每次不同」的字段 | 同上,必须显式剔除而非丢弃 |
| Canonicalize 规范化 | 剔除物理量、统一数值表示、对集合稳定排序后生成规范 JSON 的过程 | 同一逻辑输入两次输出逐字节一致 |
| ReproHash 复现哈希 | `sha256(canonical_json)` 取前 16 个十六进制字符 | 与实现方冻结的黄金值比对 |
| EvidenceClass 证据分级 | `simulated` / `measured` / `third_party` 三档 | `measured` 必须带来源与测量时刻 |
| Golden 黄金回归值 | 随代码评审冻结的期望哈希或期望输出 | 改动须在 PR 标题标注 `[golden]` |
| Self-Attestation 自证报告 | 一次全量自检 + 基准的可复算报告 | 报告自身哈希可复现,`ts_build` 不进哈希 |
## 3 DIFF=0 哈希协议
### 3.1 三条硬规则
- **R1 显式分类**:实现方必须提供字段分类表(`physical` / `repro` / `opaque`)。未登记字段按物理量处理,并**计数告警**,不得静默丢弃。
- **R2 稳定排序**:任何 `list[dict]` 先按稳定键(如 `step` / `seq` / `agent_id`)排序再递归规范化;集群完成序不可复现,必须靠排序消除。
- **R3 定值序列化**:数值统一为定点字符串(抑制浮点抖动);枚举取 `value`;`None` 序列化为 `null`;键升序、无空白。
### 3.2 必须剔除的字段(最小集)
`ts` / `timestamp` / `elapsed` / `duration` / `started_at` / `finished_at` /
`thread_order` / `addr` / `id_runtime` / `pid` / `uptime_s` / `generated_at`。
> 反例(真实踩过):把整包回执连 `ts` 一起哈希,必然每次不同,于是得出「不确定」的假结论。
> 另一反例:把未登记的业务字段当物理量整段剔掉,哈希对内容失去敏感性,两次跑当然相同——
> 这叫「恒真空转」,比假红灯更危险。**因此规范要求:凡 DIFF=0 的公开声称,必须同时发布篡改敏感性自检。**
### 3.3 算法
```
canonical = canonicalize(receipt) # 按 3.1
h = sha256(canonical_json(canonical))[:16] # 前 16 hex
stable = all(h_i == h_0 for i in runs) # runs ≥ 2,每个 run 用全新内核
```
### 3.4 敏感性自检(强制)
对 ReproCore 的任一字段做单点篡改(如把任务原文改一个字),哈希**必须**变化;
哈希不变即判定该实现「未通过本规范」,因为它的 DIFF=0 是空转。
## 4 理由码规范
### 4.1 结构
每条裁决输出固定三字段:`{action, layer, reason}`。
- `action ∈ {allow, advise, block}`,只允许三值;
- `layer` 为守卫层标识(本实现为 `L1`–`L8`:结构 / 体量 / 危险模式 / 权限 / 身份与失真 / 元数据 / 审计 / 一致性);
- `reason` 为可枚举理由码或人类可读短语,**不得为空**。
### 4.2 理由码分层(参考 NEPHRON 27 码体例的分类法)
| 族 | 前缀 | 含义 | 例 |
|---|---|---|---|
| 结构 | `struct_` | 信封字段缺失 / 类型不符 | `struct_missing_recipient` |
| 体量 | `size_` | 载荷或配额超限 | `size_payload_over_1mib` |
| 危险 | `danger_` | 命中危险调用模式 | `danger_os_system` |
| 权限 | `perm_` | 权限等级不足 | `perm_short_2to0` |
| 身份 | `ident_` | 伪造身份或失真输入 | `ident_claim_admin` |
| 元数据 | `meta_` | trace / 模式缺失 | `meta_no_trace` |
| 审计 | `audit_` | 审计链断裂 | `audit_gap` |
| 诚实 | `hon_` | 证据分级不合规 | `hon_measured_no_source` |
### 4.3 判定口径
- 同一输入 + 同一守卫层配置 → 同一 `reason`(理由码不得含时间、随机值、进程号);
- `block` 必须能指名命中的层与模式;说不出哪一层,就不算「已解释」。
## 5 证据防漂移协议
### 5.1 分级
| 级别 | 含义 | 强制附加字段 |
|---|---|---|
| `simulated` | 仿真 / 构造数据,默认档 | 无(`measure_source` 与 `measure_ts` 必须为 null) |
| `measured` | 本机实测 | `measure_source`(命令或路径)+ `measure_ts` |
| `third_party` | 外部来源 | `measure_source` 指向可核验出处 |
### 5.2 漂移判定
- 出现 `measured` 而缺 `measure_source` → 记诚实告警(`H1`),报告结论至少降为 yellow;
- 回执对象缺 `evidence_class` → 记诚实告警(`H2`);
- 文档里出现「实测 / 真实生效」字样但同目录无非 `simulated` 证据 → `H1`。
### 5.3 CI 体例
```
python scripts/verax_verify.py --out reports # 单一入口
退出码 0=绿 / 1=红(红线或复现或单测不过) / 2=黄(诚实或未知字段告警)
```
报告双导出:`reports/attestation.md`(人读)与 `reports/attestation.jsonl`(机器读,逐行一条检查)。
报告自身 `verdict_hash` 由结论字段规范化生成,`ts_build` 不参与——否则报告自己也漂移。
## 6 兼容性分级
| 等级 | 条件 | 允许的声称 |
|---|---|---|
| `full` | 两个独立 run 的 ReproHash 一致;黄金值命中;敏感性自检通过;物理量差异非空(证明剔除真的在起作用) | 「可回放 / DIFF=0」 |
| `sampled` | 仅部分任务有黄金值,或仅在固定机器上复现 | 「有限复现,未覆盖全任务」 |
| `incompatible` | 哈希不稳定,或字段分类表缺失,或敏感性自检失败 | 不得声称确定性 |
分级必须随证据一起发布;只发布等级、不发布证据,视为未分级。
## 7 自检清单(实现方逐条打勾)
- [ ] D1 字段分类表公开,未知字段计数告警(R1)
- [ ] D2 `list[dict]` 稳定排序后再规范化(R2)
- [ ] D3 数值定点化,枚举取 `value`(R3)
- [ ] D4 两次独立 run 哈希一致
- [ ] D5 篡改 ReproCore 后哈希变化(敏感性自检)
- [ ] D6 黄金值冻结并有评审标记 `[golden]`
- [ ] D7 每条裁决含非空 `reason`
- [ ] D8 回执强制 `evidence_class`,`measured` 带来源与时刻
- [ ] D9 报告 `verdict_hash` 可复现,`ts_build` 不进哈希
- [ ] D10 CI 单入口给出 0/1/2 三态退出码
HoloAeon 自身作为第一实现,D1–D10 全部通过(见 `benchmarks/README.md`、
`docs/VERAX.md`、`reports/attestation.md`)。
## 8 已知限制
- 本规范只管**单机确定性**,不管分布式一致性;
- 理由码族表是分类法,不是封闭枚举:实现方可扩展,但不得修改已有语义;
- 本实现语义通道(`holoaeon/semvec.py`)语料只取 47 条技能自述(与 `docs/` 解耦,改文档不漂移),
实测 **12 条固定意图混合路由 11/12(误路由 8.3%)**(`scripts/bench_semvec.py` 可复跑)。
参数是在同一批意图上选定的,含过拟合风险;留出集 6 条中 2 条期望名不存在,
余 4 条命中 2 条,**泛化未验证**。故路由准确率不纳入本规范的合格判据,只作为披露项;
- 维度取舍:`semvec.DIM=32` 与早期投喂建议的 64 维不同。理由是 32 维与 64 维在 12 条意图上
命中相同,而 `fit` 耗时随维数线性增长(2 GB 旧机口径),故取 32;`MAX_VOCAB=2000`、`MIN_DF=1`
同理是为让 `review / sample` 这类只出现一两次的专名进入词表,否则查询向量会塌成零向量
(稳定语料下实际上限用不满,实测词表 334);
- 规范不承诺任何外部真实性:`measured` 只表示「有人在本机量过」,不等于「结论为真」。
|