Skip to content

批8 判据面: canary D1 确定性闸门(两次构建逐字节对拍)+ 重锁前置落纸 - #135

Merged
dslsdzc merged 3 commits into
developfrom
feature/b8-canary-d1-determinism
Sep 18, 2026
Merged

dslsdzc merged 3 commits into
developfrom
feature/b8-canary-d1-determinism

Conversation

@dslsdzc

@dslsdzc dslsdzc commented Sep 18, 2026

Copy link
Copy Markdown
Owner

摘要

canary D1 确定性闸门:同一 canary ELF 两次构建逐字节 cmp,与既有的「与锁定值比」(F3)互补
外加把「重锁前必须先看到 D1 绿」写进脚本档头与值表头;.ccr 四条与 5 值校验照旧保留

(本 PR 另携带 (i) 小批的实施记录 docs/superpowers/plans/2026-09-19-i-raw-int-ptr.md——按约定「文档不单推、随下一批 PR 带上」。)

一、为什么必须有 D1(与 F3 是两件事)

判据 管的什么 防的什么
F3(既有) 「与表内旧值相同」 无声变化
D1(本 PR) 「与自己再构建一次相同」 非确定性

差别在重锁那一刻最大:若某批合法地改了码(须重锁)而同时引入非确定性,只比旧值的流程会在
采一次样时把非确定值锁进表——此后 canary 常绿,而产物其实每次都不一样
两次构建对拍正是区分「确定但变了」与「不确定」的那一步。

二、实现(tools/baseline/canary_check.sh

  1. 新函数 determinism_gate <a> <b> <label>:产物缺失 ⇒ fail-closed 红;两产物不同 ⇒ 红 + 打印两侧 sha/尺寸(红必须可诊断)。
  2. collect_into 末尾对 canary ELF 这一档再构建一次(+1 clean-cache + 1 构建)并过闸;
    D1 红 ⇒ 采集阶段即失败,不进入 5/5 校验 ⇒ 堵死「非确定性采样被当成锁定值」这条路。
  3. 自证新增 S7 两向(团队约定 Merge pull request #10 from RhineIris/tokenizer-rewrite #11):同文件⇒绿(防恒红)/ 异文件⇒红且命中诊断(防恒绿)
    ⇒ 合成自证 6 → 8 子检;tests/harness/test_canary_carrier.py 的期望计数 6→8 同批同步(现 pass=7 skip=0)。

三、落纸(team-lead 要求的两条)

  1. 正面:断言 = 两次构建 cmp 逐字节相同与锁定值的比较照旧保留(两件都要)。
  2. 接进重锁流程canary_check.sh 档头 D1 契约块 + canary_values.tsv 表头各写明
    重新锁定前必须先看到 D1 绿——否则可能把非确定值锁进表;D1 红 ⇒ 不得重锁,先查非确定性」。

四、边界(team-lead 裁定)

  • 只对已构建的那一档(canary ELF)做,不做全语料
  • 不新增 job,挂在采集步内;.ccr 四条不在本闸门覆盖内(如需另议)。

五、读数

  • 起点:canary 5 值 = 表内同值;脚本时长 0.45–0.68s(早期 1.7s/10.8s 两次读数为机器负载所致,非本改动)。
  • 边际成本实测:单次 clean-cache + build tests/suite/ptr_arith.cr --static = 0.049 / 0.057 / 0.049s(240B 语料)
    远低于「把某 job 时长推到翻倍」的红线
  • 端到端[PASS] D1 canary_elf: 两次构建逐字节相同(f1137275…) + 5/5 PASS(值表未动、值未变)。

六、突变自证(断言命中目标)

MUT-D1:在 collect_into 内把第二次构建的产物扰动一字节(模拟一次非确定构建),断言改到的正是那一行 ⇒
rc=1 + [FAIL] D1 canary_elf: 两次构建产物不同(**非确定性** ⇒ 不得据此重锁) + [canary] FAIL 采集阶段(未进入校验)
调用点是活的、且 fail-closed(不让非确定采样进入锁定比较)。还原后逐字节核对 ✓。

七、本地全量层

五档(check / bootstrap-tests / selfhost-tests / suite / full-bootstrap)+ canary(D1 + 5/5)+ selftest-types/selftest-purity 逐字节 + test_view_builtins + test_raw_int_ptr + test_canary_carrier(pass=7)——读数见报告。

本档 = (i) 小批(@raw_int 放宽接受指针,PR #134 → develop 08f0b65)的实施记录:
裁定与同文件约束 · 改动(含 av > TI_DEX_S 上界通用坑 · 文案单点 · 安全面边界)· pre/post 读数(产物逐字节不变)·
类型实测定名(M2 交叉证据)· 负控的面 · 突变两向 + **实测红项计数 1+1=2** · 既有判据换夹具重定 ·
diag.cr 四处失准登记(归 (甲) 刀 4)· 两条通用纪律。

**§4.1 = team-lead 指定原样落纸的实证**:同一 M1 突变下 build 面 build_ok(rc=0+有产物) **仍然 PASS**
⇒ 一句话证明「豁免面上的『能过』断言对该类回归完全不敏感,能抓住的只有 check 面缺席断言」——
作为「断言弱于注释 / 零产物先问有没有豁免」那条通用纪律的**实证附件**(一次突变同时证伪弱判据、证实强判据)。

doc-only(新增 1 个 .md),src/ 与 tests/ 零改动 ⇒ 不撞 b8-e1 的批 2。**本地提交,不单推**(等下一批 PR 带上)。
【裁定】team-lead 2026-09-19 裁 (乙) 并放行(动 tools/baseline/ 与 b8-e1 的 checker.cr/tests 不撞文件):
canary 的 5 个锁定值覆盖的是「与**旧值**比」(F3),**不是**「与**再一次构建**比」。差别在**重锁那一刻**最大——
若某批合法改了码(须重锁)而同时引入非确定性,只比旧值 ⇒ 操作者采**一次**样即锁,此后 canary 全绿而产物每次都不一样。
⇒ 新增 **D1**:同一 canary ELF **两次构建逐字节 **,与 F3 互补(F3 防无声变化 · D1 防非确定性)。

【实现】tools/baseline/canary_check.sh:
· 新函数 determinism_gate(产物缺失 ⇒ fail-closed 红;不同 ⇒ 红 + 打印两侧 sha/尺寸,红必须可诊断);
· collect_into 末尾对 **canary ELF 这一档**再构建一次(+1 clean-cache +1 构建)并过闸——**D1 红 ⇒ 采集阶段即失败,不进入 5/5 校验**(堵死「非确定性采样被当锁定值」这条路);
· 自证新增 **S7 两向**(团队约定 #11):同文件⇒绿(防恒红)/ 异文件⇒红且命中诊断(防恒绿)⇒ 合成自证 6 → **8** 子检。

【落纸(你要求的两条)】① 正面断言 = 两次构建  相同;与锁定值比较**照旧保留**(两件都要)。
② **接进重锁流程**:脚本档头 D1 契约块 +  表头各写明「**重锁前必须先看到 D1 绿**,否则可能把非确定值锁进表」。

【边界(按你裁)】只对**已构建的那一档**做,**不做全语料**;不新增 job; 四条不在本闸门覆盖内(如需另议)。

【读数】起点:canary 5 值(与本表同)+ 脚本时长 0.45–0.68s(早期 1.7/10.8s 读数为机器负载所致);
**边际成本实测 = 单次 clean-cache + 构建 240B 语料 ≈ 0.05s**(3 次 0.049/0.057/0.049s)⇒ **远低于「时长翻倍即停」的红线**。
闸门端到端: + 5/5 PASS;载体判据 tests/harness/test_canary_carrier.py 期望 6→8 同步(pass=7 skip=0)。

【突变自证】MUT-D1(在 collect_into 内把第二次构建的产物扰动一字节,断言命中目标)⇒ rc=1 +  + **** ⇒ 调用点是活的且 fail-closed。还原后逐字节核对 ✓。
【裁定理由】 恰恰是**序列化/顺序面**(段序 · intern 序 · 侧表顺序)——非确定性最可能在那里现形,
而 ELF 是按序发射的机器码;重锁流程覆盖**全部 5 个条目**,只保 ELF 等于**漏掉 4/5**。

【实现】collect_into 第二遍构建改为**全 5 条**(写入 $d/again/,5 次 clean-cache+构建,实测 +0.2s),
逐条过 determinism_gate 并传 **spec 名**作 label ⇒ 诊断形如 (**点名条目**,
否则一次红只说明「有非确定性」而不说去哪查)。档头 D1 契约块的覆盖面/边界同步改写(只 canary 两档的 5 个条目,不做全语料)。

【自证加强】S7b 除「命中 两次构建产物不同」外,**加断言输出含 **(把「诊断点名条目」编码成判据,
不写在报告句子里)。S7 仍为 2 子检 ⇒ 合成自证仍 **8/8**、carrier 期望计数**不变**(8)。

【双突变自证(均断言命中目标 + 点名到正确条目)】
· MUT-D1a 扰动 (ELF)⇒ rc=1 +  + ;
· MUT-D1b 扰动  ⇒ **ELF 条 PASS** 而  ⇒ **四条 .ccr 是「接上线的」不是「装了没接线」**,且点名精确到条目。

【读数】端到端 0.633/0.679s(另一次 9.9s = 机器负载;CPU 0.32+0.29s 不变)· 边际 5 次构建合计 ≈ 0.27s
(单次 0.054/0.057/0.060s)⇒ 仍远低于「时长翻倍即停」。闸门:**5 条 D1 全 PASS** + 5/5 PASS(值一字未动)。
@dslsdzc
dslsdzc merged commit 7ddf6ed into develop Sep 18, 2026
4 checks passed
@dslsdzc
dslsdzc deleted the feature/b8-canary-d1-determinism branch September 18, 2026 18:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant