批8 判据面: canary D1 确定性闸门(两次构建逐字节对拍)+ 重锁前置落纸 - #135
Merged
Merged
Conversation
本档 = (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(值一字未动)。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
摘要
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 是两件事)
差别在重锁那一刻最大:若某批合法地改了码(须重锁)而同时引入非确定性,只比旧值的流程会在
采一次样时把非确定值锁进表——此后 canary 常绿,而产物其实每次都不一样。
两次构建对拍正是区分「确定但变了」与「不确定」的那一步。
二、实现(
tools/baseline/canary_check.sh)determinism_gate <a> <b> <label>:产物缺失 ⇒ fail-closed 红;两产物不同 ⇒ 红 + 打印两侧 sha/尺寸(红必须可诊断)。collect_into末尾对 canary ELF 这一档再构建一次(+1 clean-cache + 1 构建)并过闸;D1 红 ⇒ 采集阶段即失败,不进入 5/5 校验 ⇒ 堵死「非确定性采样被当成锁定值」这条路。
⇒ 合成自证 6 → 8 子检;
tests/harness/test_canary_carrier.py的期望计数 6→8 同批同步(现pass=7 skip=0)。三、落纸(team-lead 要求的两条)
cmp逐字节相同;与锁定值的比较照旧保留(两件都要)。canary_check.sh档头 D1 契约块 +canary_values.tsv表头各写明「重新锁定前必须先看到 D1 绿——否则可能把非确定值锁进表;D1 红 ⇒ 不得重锁,先查非确定性」。
四、边界(team-lead 裁定)
.ccr四条不在本闸门覆盖内(如需另议)。五、读数
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)——读数见报告。