Skip to content

Latest commit

 

History

History
505 lines (434 loc) · 45.3 KB

FPR-REPLAY.md

File metadata and controls

505 lines (434 loc) · 45.3 KB

M3 FPR 重放验收记录(2026-08-07)

仪器复立(计划 v2.29 步 9 O49,2026-09-05):重放仪器以测试子仓 cli/tests/it/fpr_replay.rs(#[ignore])常设,补齐两处此前只靶手工仲裁的度量—— 每条拦截对父版基线读一次(新 / 延展 / 漂移),对提交整体落地后的子状态再读 一次(落地 / 中间态),孪生文件同提交的去向随行;本册仍是账本,最新一节为 2026-09-05 全史复跑。M7.5(2026-08-18)曾把根目录仪器随休眠仪器整体退役、K 轮(2026-08-26) 从历史复活跑毕再退役,那两段的复现配方保留在文末「历史复现」。

验收门(计划 §6 M3):500 次真实正常编辑重放误拦 ≤ 1。 方法:cli/tests/fpr_replay.rs(#[ignore],release 跑)——把 git 线性历史当真实编辑流:每提交每改动代码文件 = 一次"把子版本内容写入 父状态"的编辑事件;影子目录增量物化父状态,先探针后应用;guard 默认档(t=50 / min_distinct=7)。拦截逐条列出供仲裁——真实引入了 跨文件重复的提交是真阳,不计入误拦。

结果

语料 事件数 拦截 仲裁后误拦 折算 /500
requests 完整历史尾段 400 提交(钉定 1f6589ec 止) 487 0 0 0.00
CodeEraser 自仓全史(真实 agent 编辑流) 143 35 0(全为真重复,见下) 0.00
合计 630 35 0 0.00 ≤ 1 ✅

自仓 35 条拦截仲裁(全真阳)

  • 2 条:zod locale fixtures 入库提交——这些文件按设计互为 T2 克隆, "新增文件与既有文件重复"判定正确。
  • 33 条:cli/tests/*.rs 之间共享的 rust_fn(seed)/tmp()/git 助手 ——作者本人复制粘贴的真实重复(8 个测试文件各持一份)。工具当场 抓住了它要消灭的行为。治理已分四批完成(251→211→209→205→202 块, 预算同步降档):tests/common/mod.rs 统一数据助手 + hook 运行器 + daemon 启动/回收 + observe 尾行读取 + dedup 断言 + tree-sitter 解析 harness(第 5 份拷贝在 RCA 对拍 harness,切换后 322 单元实跑复验绿); src/hookio.rs 统一三 hook 的 stdin 进气与 observe 写入。保留不抽 =命名边界(ce.toml 注释同步):用例平行结构(deny/warn/observe 三态 断言、dedup_index 刷新序列)、三 hook 的信封契约声明(4 块)、 metrics/divergence/sonar 的文档性测试体(~150 块——逐例白皮书引注 即内容本体,T2 把 src 字面量折叠后相邻用例连成一个家族)。

重放捎带抓获的产品缺陷(已修)

探针候选文件在"索引后、探针前"消失(删除/改名竞态;requests 史上的 目录改名提交实锤触发)曾使探针整体报错——现按陈旧锚点同一哲学降级 跳过(probe.rs load_candidate_streams),daemon 探针请求不再因竞态 失败。

K 轮复跑与探针语义根修(2026-08-26,v1.2.0 前)

仲裁出处:用户授权下的模型仲裁(授权 2026-08-24,执行 2026-08-25/26), 非人工记录;每条首燃判定均以 git 事实与今日检测器复核,方法见文末。

仪器按「复现」节配方复活(两个同代垫片,样张见同节),语料与旋钮同 2026-08-07。

第一轮(出厂语义=全文探针):requests 尾段 487 事件 0 拦截(与原记录逐字同); 自仓全史 2274 事件 505 拦截(111.04/500)。按无序文件对分解 = 122 对首燃 + 383 复燃;首燃逐对取子提交状态的两文件入临时夹具、以今日 ce dedup 终审: 90 对重复真实落地(44 对至今仍在 186 预算台账),32 对仅存在于重放中间态—— 全部是拆叶/并叶提交(新叶先探、宿主未削;含 2 例并叶=被匹配文件同提交删除)。 真机 hook 实测:暖索引下拆叶写 deny(172 tokens 命中);本机生产台账 719 探 / 170 degraded / 9 燃、零拆叶误拦。383 复燃 = 编辑携带既接受债块的文件被全文模型 再拦——活 guard 对 Edit 只探 new_string 片段,不受此扰;Write 全文重写则同病,真尖边。

判定与拍板:32 条中间态若计误拦 = 1.41% > §4.2 M4 门(≤1%)。用户拍板 (2026-08-26):根修探针再复测,不降档。

根修(guard::novel_matches):探针只报新引入的匹配——Write 减盘上旧全文、 Edit 减 old_string 的自有匹配(基线探针仅首探命中才发;基线 degraded 减零—— 放行绝不骑在未答的问题上);拦截词补搬移安全序(先削源后写目标,探针按当下磁盘 验证候选流,实测放行)。observe feed matches 语义随之收窄为新引入数,schema 0.6.0→0.7.0 具名断点。四腿电池 cli/tests/it/guard_novelty.rs(携债重写不新 / 加孪生仍拦 / 编辑自替不新 / 拆叶仍拦且教序)——书写该电池时两度被新语义活拦, 按共享咽喉消重后过门:工具第三次当场抓住作者本人。

第二轮(新语义,仪器同镜像):

语料 事件 拦截 分解 折算 /500
requests 尾段(同钉定) 487 0 — 0.00
自仓全史 2274 139 84 真引入 + 32 中间态搬移 + 23 延展复燃 见下
  • 84 真引入:子状态经今日检测器复核确有跨文件重复的落地提交——工具该拦的。
  • 23 延展复燃:编辑扩张/漂移了既有重复区,父版基线按构造不重叠——当时判真阳倾向入册; 2026-09-05 常设仪器按父版基线实测重分类(见下节):全史 35 条复燃 = 延展 11 + 归零复引 24 + 漂移 0,没有一条是既接受重复区的纯搬移。
  • 32 中间态搬移:写先于削的拆叶/并叶。瞬时树内确有重复(探针未说谎),意图是 搬移——复制与搬移在写入瞬间信息等价,瞬时谓词不存在;处置 = 拦截词教安全序 (先削源即过),终态判决属 Stop 层(搬移完成后树内无重复,Stop 审计对此类天然 不误报)。
  • 门算术(双口径并记,不合成单一数字):按重放全文写模型计 32 条误拦 = 7.03/500(1.41%);按活流口径(Edit 片段语义 + 安全序协议)本机 719 条生产 探针 0 条此类误拦 = 0.00/500。两类已晋级规则维持 deny(拍板走根修而非降档), 依据入 CHANGELOG。

多文件搬移仪器(清单 57 处置):无序对首燃/复燃分类 + 同提交 name-status 交叉 + 子状态二文件夹具复核,即本节全部搬移测量的工作法;当时不另立常驻仪器 (M7.5 休眠仪器退役律)——2026-09-05 O49 以常设 #[ignore] 腿复立,同提交 name-status 交叉与子状态复核都进了仪器,见下节。

常设仪器全史复跑(2026-09-05,计划 v2.29 步 9 O49)

仲裁出处:本节没有人工或模型仲裁——两处判定都由仪器实测:父版基线(shared = 与该孪生 全部核实共享片段的 token 和;父版 0 = 新、子版更大 = 延展、否则 = 漂移)与落地(提交整体 应用后再对子状态探一次:仍与该孪生共享片段 = 落地,否则 = 写先于削的中间态)。真阳判据仍是 文首那条——真实引入了跨文件重复的写入是真阳,落地行按构造即此类(核实过的 T1/T2 片段、父版没有)。

仪器差异(对 2026-08-26 的复活件):语料只计有 token 流的判决语言——Markdown 是判决语言但无语法、 其重复归 docdup(daemon 探针回复同一读法),故 requests 窗口 487 → 365 事件;自仓自 2274 事件长到 3164(555 个第一父提交,止于 b8d3c1e)。

语料 事件 拦截事件 (事件, 孪生) 行 落地行 中间态行 严格 /500 中间态计误拦 /500
requests 尾段 400 提交(钉定 1f6589ec 止,M5-3 钉定克隆内) 365 0 0 0 0 0.00 0.00
CodeEraser 自仓全史(555 提交 @ b8d3c1e) 3164 176 257 178 79 27.81 12.48(按事件 62 = 9.80)

自仓 257 行的分解(类 × 首燃/复燃 × 孪生同提交去向 × 落地):

类 燃 孪生同提交 落地 行
新 首燃 未动 落地 107
新 首燃 同提交新增(A) 落地 18
新 首燃 同提交修改(M) 落地 22
新 首燃 同提交修改(M) 中间态 45
新 首燃 同提交删除(D) 中间态 30
新 复燃 未动 落地 8
新 复燃 同提交修改(M) 落地 12
新 复燃 同提交修改(M) 中间态 4
延展 复燃 未动 / A / M 落地 1 / 1 / 9
漂移 — — — 0
  • 复燃 35 行的重分类(替代 K 轮「23 延展复燃按倾向判真阳」):延展 11(子版与孪生的共享片段比 父版多 63~389 token,全部落地——编辑确实又抄了一段)+ 归零复引 24(父版与该孪生已无共享片段: 这一对早先燃过、被消掉、这次又被引回来;20 落地 / 4 中间态)+ 漂移 0——没有一条复燃是既接受 重复区的纯搬移。倾向变成了度量。
  • 中间态 79 行 / 62 事件:全部是孪生同提交被动过的写入——D 30 = 改名(--no-renames 下新路径 先探、旧路径同提交删除),M 49 = 拆叶 / 并叶(宿主同提交被削)。b4a0b642(2026-08-26 把 76 个 测试二进制并成 cli/tests/it/,75 文件搬家)一个提交贡献 26 行;K 轮 2274 事件上的 32 对首燃 中间态,在长了 39 % 且含这次搬家的历史上成了 79 行。守卫对这一类的处置不变:拒绝词教安全序 (先削源后写目标),终态判决属 Stop 层。
  • 孪生同提交被动却落地的 62 行(M 43 / A 19):宿主改了别处、副本仍在(如 b4a0b642 同批搬进的 11 对互抄测试文件),按构造是落地的真引入。
  • 门算术(双口径并记,同 K 轮,不合成单一数字):按重放全文写模型把每条中间态计误拦 = 79/3164 = 12.48/500(2.50 %;按事件 62 = 9.80/500 = 1.96 %);按账本自身的真阳判据,落地行是 核实过的、父版没有的跨文件重复——误拦 0。活流口径的 0.00/500(Edit 片段语义 + 安全序协议, 本机生产台账 719 探 / 9 燃)沿用 K 轮读数,本节未重量。
  • 行按目录:cli/tests 147 / cli/src 43 / core/app 42 / core/test 22 / contracts/fixtures 3 ——测试树仍是抄 helper 的主场(2026-08-07 的结论没变);98 / 555 个提交带行。

分级区档位映射 zone_tiers 的台账(2026-09-06,计划 v2.29 步 10 C-zone_tiers)

两份历史已实跑并冻结:自仓 0.5388 %、requests 2.4553 %。后者超过 1 %, 按预定合取采用 B:默认维持 false,无默认档位变更。

门(计划 §4.2 默认档位演进路线第 3 级):每次默认档位变更在 CHANGELOG 记录依据(FPR 数据), 本节采用 M4 的误报率 ≤ 1 % 线;M3 的「500 次误拦 ≤ 1」是另一条更严的线。[guard] zone_tiers 自 v2.7 ① 起 opt-in,此前每个周期的 CHANGELOG 都写「本周期无新增独立 FPR 记录,按 §4.2 维持原档」—— 因为这一类根本没有自己的台账。本节是那份台账;仪器 = 测试子仓 cli/tests/it/fpr_zone_replay.rs(#[ignore],release 跑,常设),冻结件 = contracts/eval/fpr-zone-v1.json,执行者 = cli/tests/it/fpr_zone_gate.rs(非 ignored: 冻结件的算术自洽,且出厂默认必须正好是这份算术许可的那一档)。

口径(每一条都由仪器实测,本节无人工仲裁):

  • 事件 = 某个第一父提交里,一个改动文件(A/M;D 不写入)的一次 Write。范围与钩子完全同读: 有语言臂(Lang::from_path,含 md、html 与纯尺寸臂 js/yml/css/sh;html 测量时还在纯尺寸臂,计划 v2.30 步 5 升为判决语言)且 在父提交那棵树的 walk 作用域内(ce.toml 的 exclude、各级 .gitignore / .ceignore、.gitmodules 声明的 submodule 路径按 Owner::Foreign 出局)。另记 与 fpr_replay 同分母的事件 = 有语法的判决语言 子集,两册据此可并读;率按事件全集算,那才是这条规则真正看见的总体。
  • 行数 = 子 blob 的 lines().count(),与 budget::resulting_lines 对 Write 的算法逐字节相同。
  • S = 父提交已提交基线的 softLine(下界 1),无则回落该文件自己那张表的 file_lines_warn; H = 同一张表的 file_lines_fail;切点取父提交基线的 zoneTiers,不合法则用编译期镜像 (250, 750)。三者都经 guard::zone::envelope / guard::zone::table_for 读,位置与档位只经 guard::zone::landing —— 钩子 zone_assess 调的就是这一个函数,仪器里没有第二份 25/75。
  • 拦截 = 档位为 ask(唯一执法的一档;warn 吃每(规则,文件,会话)一次的注入预算,observe 只写 feed)。
  • 误拦 = 落在「经审查为正常」的编辑上的拦截。两份语料按定义整体正常,故每一条 ask 都是误拦, 除非它被硬线遮蔽:H != 0 且 行数 > H 时 guard.rs 走的是硬预算那条分支,zone_assess 根本不被调用,区的 ask 到不了决定行——单列一栏 ask 被硬线遮蔽,从误拦里减去,不从事件里减。
  • warn 档只作信息(不执法),照列不入率。
  • 软线会搬家:自仓 softLine 2026-08-20 之前不存在(回落 300),此后从 294 一路走到 370。 仪器读父提交当天那条线——这是唯一诚实的读法,冻结件里另记 soft_lines: {S: 事件数}, 让读者看得见左边缘怎么动、各段各计了多少事件。不回归到今天的 S:那测的是没人跑过的规则。
语料 提交 事件 同分母事件 落区 observe warn ask ask 被硬线遮蔽 误拦 ask 率 CP 95 % 上界
requests @ 1f6589ec 400 448 365 237 15 21 201 190 11 2.4553 % 4.3507 %
self @ 9ee086ad 568 5196 3228 470 260 177 33 5 28 0.5388 % 0.7778 %

每条 ask 打印 INTERCEPT JSON(sha / file / lines / soft / hard / permille / tier / shadowed),同一序列化器写入冻结件的 intercepts。

裁定规则(先写下来,再看数):两份语料的率都 ≤ 1 % ⇒ [guard] zone_tiers 默认翻到 true,CHANGELOG 该版本条目首句写「默认档位变更 + 依据 = 本节数据」;任一份超线 ⇒ 维持 false, CHANGELOG 写「无默认档位变更」并点名本节。区间如实说:本节的 CP 95 % 上界是校准证据的宽度, 不是野外误报率的上界;点估计与上界分列,不合成单一数字(FPR-TOMBSTONE.md 同一立场)。 两者的一致性由 fpr_zone_gate.rs 执行:出厂 Guard::default().zone_tiers 必须等于 「每一份语料都 ≤ gate_ppm」,不等即 CI 红——只写在文档里的规则没人执行,这一条有执行者。

config_unreadable_commits(今天的 Config 读不了父提交声明的覆盖缺口)两份均为 0。 消重后复冻耗时:自仓 408.44 s,requests 69.16 s(release 测试体;首测 396.40 / 57.87 s,冻结件逐字节相同);requests 的 11 次 未遮蔽 ask 全在 src/requests/adapters.py(641~750 行),H 处仍归区内,超过 H 才遮蔽。 自仓全集 5196 比设计估计的 4300~4700 大;同分母事件 3228 与另外 1968 次 Markdown / 纯尺寸写入 分列,保留产品作用域的实测全集,不按估计删样本。语料历史均完整,钉定窗口未扩大。

逐语言台账(2026-09-28,计划 v2.30 步 6 提交 E)

六个语言各一份历史已实跑并冻结。按台账自身的真阳判据(落地 = 真阳,孪生同提交被动的中间态 = K 轮仲裁的写先于削类), 六份的误拦都是 0;按严格口径(每条中间态计误拦)c 0.1226 %、cpp 0.4514 %、java 0.0915 %、lua 0、 r 4.7075 %、html 零事件——两口径并记,不合成单一数字(同上一节)。裁定:六个语言都留在 judged_mask, 1.8.0 一版发出;r 的严格读数与它的来历写在下面。

门(设计册 reference/language-expansion.md §14 第 9 条:逐语言发布门 = FPR ≤ 1 %, 未达门的语言不随版发布)此前只写在册里、没有执行者。本节是那份台账;仪器 = 测试子仓 cli/tests/it/fpr_lang_replay.rs(#[ignore],release 跑,常设;走法就是 fpr_replay.rs 的 replay,只多一个 「只数这个语言的文件」的过滤——两本台账对「事件」「拦截」「落地」的读法不可能不一致),冻结件 = contracts/eval/fpr-lang-v1.json,执行者 = cli/tests/it/fpr_lang_gate.rs(非 ignored:每行的算术从冻结的行重算一遍, 且 Lang::judged_mask() 的每一位必须正好是台账许可的那一位——超线的语言留在判决集即 CI 红)。

口径(每条由仪器实测;行的分类是机械的,本节无人工仲裁——仲裁的是 K 轮,见上):

  • 语料 = 该语言精度考题的第一个语料,钉在考题登记册(EVAL-SET-LANGS.md)的 tip: c = lua/lua@0b29f408、cpp = fmtlib/fmt@6d71f746、java = google/gson@854c8255、lua = luarocks@2d2cc8ef、 r = tidyverse/stringr@ae054b1d、html = 本仓@d4b7f1f3(步 4 收口的 tip)。窗口 = 从 tip 往回最新 400 个第一父提交 (上一节 requests 的窗宽),再往前一个提交的树作种子。语料与 tip 都从考题登记表读,环境变量改不了它量什么。
  • 事件 = 窗口内某个第一父提交里,该语言的一个改动文件(A/M;D 不写入)的一次 Write。只数该语言;其余判决语言的 文件照样进影子树与索引(孪生可以是别的语言的文件——lua 语料里 llex.c 的孪生 lopnames.h 按扩展名表是 C++,钩子看到的 就是这样)。
  • 拦截 = 探针(replay 同一条路:子 blob 对父提交状态的索引探针,减去父内容自有的匹配)报出 ≥ 1 个孪生。
  • 落地 = 提交整体应用后再对子状态探一次,仍与某个孪生共享片段——父版没有的、核实过的跨文件重复,台账的真阳类。
  • 孪生被动 = 被拦事件里没有一行落地、且它点名的每个孪生都在同一提交里被改(M)或删(D)——写先于削的拆叶 / 并叶 / 改名,以及整仓重排版里先写的那一个。K 轮已裁:写入瞬间复制与搬移信息等价,拒绝词教安全序(先削源后写目标),守卫对这一类 维持 deny;本节按同一裁定把它记在误拦之外、严格率之内。按构造,一个中间态的孪生必被同提交动过(子内容不变,共享片段消失 只能因为孪生变了或没了),所以第三类只有在仪器出了新东西时才会非零——那正是门要抓的。
  • 误拦 = 被拦事件 − 落地 − 孪生被动。率 = 误拦 / 事件;门 = ≤ 10,000 ppm(1 %,gate_ppm 与上一节同一个常量)。 严格率 = (被拦事件 − 落地)/ 事件 = 每条中间态都计误拦的全文写模型读数,与上一节自仓的「中间态计误拦」同口径 (自仓 2026-09-05 那次按事件是 1.96 %)。
  • HTML:Lang::fingerprints() 为假(页面没有标识符叶,任何两页都会哈希成一对),探针对它永不生效——它的行按构造是 零事件,门对它的许可写明理由:这一类对 HTML 无事可拦,而不是「测过了没误拦」。零事件行的区间无信息,按定义印 100 %。
  • 裁定规则:某语言的率 ≤ 门 ⇒ 留在 judged_mask;超线 ⇒ 该语言翻回 scan-only、不随该版发布,CHANGELOG 点名本节。 一致性由 fpr_lang_gate.rs 执行。
语言 语料 提交 事件 被拦事件 落地 孪生被动 误拦 率 CP 95 % 上界 严格率 严格 CP 95 % 上界
c lua @ 0b29f408 400 815 3 2 1 0 0.0000 % 0.4516 % 0.1226 % 0.6817 %
cpp fmt @ 6d71f746 400 443 11 9 2 0 0.0000 % 0.8292 % 0.4514 % 1.6212 %
java gson @ 854c8255 400 1092 142 141 1 0 0.0000 % 0.3372 % 0.0915 % 0.5091 %
lua luarocks @ 2d2cc8ef 400 579 120 120 0 0 0.0000 % 0.6350 % 0.0000 % 0.6350 %
r stringr @ ae054b1d 400 701 48 15 33 0 0.0000 % 0.5248 % 4.7075 % 6.5479 %
html codeeraser @ d4b7f1f3 400 0 0 0 0 0 0.0000 % 100.0000 % 0.0000 % 100.0000 %

每条拦截打印 INTERCEPT 行(sha / file / twin / 父子共享 token / novel / 类 / 首燃复燃 / 孪生同提交去向 / 落地或中间态), 同一序列化器写入冻结件的 intercepts。

逐语言读法(行按第一次实跑,口径对齐后的复跑逐字节相同):

  • c / lua:815 事件,3 拦截——3e9dbe14 ltablib.c 对 lstrlib.c(延展)与 ltests.c(新)、ded2ad2d llex.c 对 lopnames.h 与 ltm.c,四行落地;一个孪生被动 3d54b42d(2024-09-30「'objsize' broke in smaller pieces」)lfunc.c 对 lgc.c:拆出来的一块先写进 lfunc.c,lgc.c 同提交削掉。
  • cpp / fmt:443 事件,11 拦截;9 落地(include/fmt/base.h ↔ format.h 两次延展、format.h ↔ format-inl.h、 core.h → format.h,测试树四对互抄);两个孪生被动都是 include/fmt/format.h 对 ranges.h(85f6ecc7、d0aae8c1 「Refactor range outer formatting」,范围格式化的代码在两个头文件之间搬动,第二次是复燃)。
  • java / gson:1092 事件,142 拦截 / 427 行——测试树互抄是主场(b3dce2dc 一个提交里 ArrayTest.java 对五个测试文件); 141 落地,一个孪生被动 2c94c757(2023-11-06「Formats codebase」整仓重排版):FieldNamingPolicyTest.java 先写,对尚未 重排的 proto/…/ProtosWithPrimitiveTypesTest.java 撞上恰 50 token 的片段,孪生同提交重排后消失;另两条中间态行 (93596dac 把 EnumTypeAdapter / JsonElementTypeAdapter 从 TypeAdapters.java 拆成独立文件)所在的事件各有别的行落地, 按事件计入落地。
  • lua / luarocks:579 事件,120 拦截 / 2855 行,全部落地——spec/ 的测试文件互抄成片;四条中间态行(spec/unit/*.lua 从 spec/*_spec.lua 拆出,源文件同提交删除或改写)所在的事件各有别的行落地,孪生被动计 0。
  • r / stringr:701 事件,48 拦截,15 落地,33 孪生被动,误拦 0,严格率 4.7075 %——33 里 32 在同一个提交 f07fbf45 (2022-10-04「Ensure all files use .R extensions」:git 自己的改名检测读作 36 个 R100 纯改名 R/c.r → R/c.R 等,仪器按 --no-renames 读作 36 对删除 + 新增,其中 32 个新文件过了 50 token 的探针线,每个都在父状态索引里撞上同内容的旧路径;旧路径 同提交删除,中间态),另 1 个是 f1f5eb3a tests/testthat/test-join.r 并入 test-c.r 的并叶(孪生同提交删除)。这正是上一节 自仓 30 条 D 类中间态的同一类(那里也是改名),处置相同:拒绝词教先削源;真机上改名走 git mv,Write 钩子(hooks.json 的 matcher 是 Write|Edit)根本看不见。严格读数 4.7 % 比自仓自己的 1.96 % 高,来源只有这一个 36 文件的改名提交——它是 400 提交窗口里的一个提交,不是 R 编辑的常态;本节如实印出,不改窗口、不换语料。
  • html / 本仓:0 事件(按构造),400 提交的 Rust / Haskell / Markdown 改动照常进影子树与索引,只是没有一个 HTML 文件 成为事件。

第一次实跑与口径的对齐:仪器第一稿把每条中间态都计成误拦(只有严格口径),r 读 4.7075 % 超线。核对上一节与 K 轮拍板 (2026-08-26:32 条中间态搬移 1.41 % > 门,用户拍板根修探针再复测、不降档,此后两口径并记)后,本台账改成与常设台账同一读法 ——孪生被动记在误拦之外、严格率之内,两个数都冻结、都印在表里;行本身没有变(复跑逐字节相同,脚本先核对再贴表)。这一段留在 这里,让读者看得见口径是在看过数之后才对齐的,以及对齐到了哪条既有拍板。发版门按哪种口径读,用户裁 2026-09-28「按既有读法,R 过门」(AskUserQuestion,三选一:既有读法 / 严格口径 / 先改仪器识别纯改名);严格口径继续并记、不作门。

耗时(release 测试体,用户在用电脑、CPU 80 %):c 395 s、cpp 324 s、java 695 s、lua 408 s、r 104 s、html 319 s(HTML 的几分钟全花在把本仓 400 提交的 Rust / Haskell 文件送进影子索引)。

flow/1 逐语言回放(2026-09-30,计划 v2.31 步 4 提交 D1 / D2)

十个语言各一份历史,在提交 D1 的干净树(降表 = 提交 E 回修之后的)上实跑、由 D2 冻结。本台账不是门:flow/1 的准入由精度册定(设计册 reference/analysis-track.md §13 第 6 条「精度考题 ≥ 99 %,回放台账并记」;门 = cli/tests/it/eval_flow_precision.rs 的掩码腿),这里是第二读数——问语料的作者自己拿每条发现怎么办了。仪器 = 测试子仓 cli/tests/it/fpr_flow_replay.rs(#[ignore],release 跑,常设;计数规则只住在 fpr_flow_replay_parts/book.rs 与 lane.rs, 语料与合成历史走同一段代码),冻结件 = contracts/eval/fpr-flow-v1.json,执行者 = cli/tests/it/fpr_flow_gate.rs(非 ignored: 十行按考题表序、语料与 tip 等于考题的、窗口等于共用常量;两个口径各自、逐类与三个受评类合计都封闭;受评合计等于类 0 / 1 / 2 之和; harness.commit 在本历史上;三张表(D2 落)逐字等于冻结行渲染出的;flow::judged_mask() 里每个语言都有自己的行;一段两语言三提交的 合成历史把真阳、两口径的误拦、移除、未定、只改格式不算修改、每条发现只结一次账各落一例;手改一个冻结数,门红并点名该行)。

口径(每条由仪器实测,行的分类是机械的,本节无人工仲裁):

  • 语料 = 该语言 flow 考题的第一个语料,钉在考题表的 tip(eval_flow_parts::EXAMS,登记册 EVAL-SET-FLOW.md)。 窗口 = 从 tip 往回 400 个第一父提交,由旧到新走,再往前一个提交是种子——与上一节同一个常量(common/ledger.rs 的 WINDOW)。
  • 事件 = 窗口内某提交对其第一父的一个该语言改动文件(git diff --name-status -M50%,按 Lang::from_path 过滤;增、改、删、改名都算)。 改名跟随:单元身份随文件搬到新路径;纯改名(上一节 stringr 那 36 个 .r → .R)没有一个单元的记号变,不是修改。
  • 每个事件的父版与子版各经产品降表(flow::lower::lower_file)、整文件送真核(flow::wire::judge;一条 link 全程复用,核拒的单元 照 wire_batch 剔除)。单元身份 = (路径,单元名,形参数,同名同形参数单元里的序号)——序号是落码时补的第四位:重载与同一形参数的 匿名单元否则共用一个键。发现身份 = (类,锚):类 0 = 不可达段首语句的文本、类 1 = 变量名 + 写语句的文本、类 2 / 3 = 变量名;文本取 降表图例的 stmt_text(语句首行)、去掉全部空白;同一单元里同键的两条发现合成一条,行段取并。
  • 修改按记号读:一个单元两版都判过、且它的记号序列不同,才算这次事件修改了它。记号 = 起始行落在单元行段内的每个 tree-sitter 叶结点的 源文本,按源序,注释子树跳过、空白不成叶(fpr_flow_replay_parts/side.rs)——只改格式或注释的提交不修改任何单元。没用查重家族的记号流: 那条流把标识符折成 ID、字面量折成 LIT,改名变量或改常量会读成没改。
  • 入册:事件父版上判出的发现入册,子版上新出现的在事件之后入册;同一条发现在一个口径里只入册一次,被判成误拦的不再回册,判成真阳或移除 的若再出现按新发现入册。
  • 两口径,每条发现各结一次账:严格 = 该发现的单元第一次被(记号级)修改时,它在子版消失 = 真阳、留下 = 误拦;窄 = 修改时消失 = 真阳,留下且这次修改在父版一侧的改动行(git diff -U0 的块头;纯插入读作插入点两侧的两行)与发现的行段相交 = 误拦,不相交的修改不结账、 发现继续在册。单元在子版里没了(文件删、单元删、改名或改形参数)= 移除,不计入率;窗口末仍在册 = 未定,不计。dynamic 单元(核整体 不判)与降不出 / 被核拒的单元按单元版本各计一次(dynamic / 未判),不入率;子版里一个单元是 dynamic 或未判时,它的在册发现这次不结账。
  • 于是每个口径、每类都各自封闭:发现 = 真阳 + 误拦 + 移除 + 未定。两个口径的真阳与移除可以不同——严格口径在第一次修改时就结了账的发现, 窄口径里可能在后来的修改中消失或被移除——所以冻结行对两个口径各记一套。严格率 = 严格误拦 / (严格真阳 + 严格误拦),窄率 同理; 率只算类 0 / 1 / 2(精度门读的三类),类 3(未用形参)是顾问、单独一列一张表、不进率;两口径并记、不合成单一数字;率不存,执行者从计数重算。

台账(D2,2026-09-30:十语言在 D1′ 的干净树 5e02af4a 上 release 串行重量,十行 harness.commit = 5e02af4a、dirty = false; 与车道先量的一份——harness 车道提交 6df7078d、九行 dirty,不入库——按同一仪器逐格对拍,十语言各 63 格全同,只差 harness 与 measured_at; 执行者的台账阶段常量 FLOW_LEDGER 随本提交翻 Frozen,读冻结件的三腿起读,下面三张表由执行者逐字核对):

语言 语料 提交 事件 判过的单元版本 dynamic 未判 严·发现 严·真阳 严·误拦 严·移除 严·未定 严格率 窄·发现 窄·真阳 窄·误拦 窄·移除 窄·未定 窄率 类 3 发现
python requests @ 80683562 400 365 33983 0 0 26 11 11 3 1 50.0000 % 26 16 0 5 5 0.0000 % 84
typescript zod @ 912f0f51 400 766 114184 0 0 3 2 1 0 0 33.3333 % 3 3 0 0 0 0.0000 % 2
tsx zod @ 912f0f51 400 73 877 1 0 1 0 1 0 0 100.0000 % 1 1 0 0 0 0.0000 % 0
rust ripgrep @ 3fce3b5b 400 368 78668 0 0 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 % 7
go cobra @ adbc8813 400 534 34668 0 0 1 0 1 0 0 100.0000 % 1 0 0 0 1 0.0000 % 19
c lua @ 0b29f408 400 815 68022 19972 0 6 0 3 2 1 100.0000 % 6 1 0 2 3 0.0000 % 2
cpp fmt @ 6d71f746 400 446 89231 31175 0 46 8 9 3 26 52.9411 % 46 8 2 3 33 20.0000 % 3
java gson @ 854c8255 400 1102 49751 0 0 284 149 47 4 84 23.9795 % 284 164 8 8 104 4.6511 % 403
lua luarocks @ 2d2cc8ef 400 667 24137 225 0 135 22 29 47 37 56.8627 % 138 33 7 56 42 17.5000 % 49
r stringr @ ae054b1d 400 705 4332 95 0 2 2 0 0 0 0.0000 % 2 2 0 0 0 0.0000 % 18

逐类(类 0 不可达、类 1 死存储、类 2 未用局部;率只算这三类):

语言 类 严·发现 严·真阳 严·误拦 严·移除 严·未定 严格率 窄·发现 窄·真阳 窄·误拦 窄·移除 窄·未定 窄率
python 0 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 %
python 1 9 0 7 1 1 100.0000 % 9 2 0 3 4 0.0000 %
python 2 17 11 4 2 0 26.6666 % 17 14 0 2 1 0.0000 %
typescript 0 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 %
typescript 1 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 %
typescript 2 3 2 1 0 0 33.3333 % 3 3 0 0 0 0.0000 %
tsx 0 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 %
tsx 1 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 %
tsx 2 1 0 1 0 0 100.0000 % 1 1 0 0 0 0.0000 %
rust 0 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 %
rust 1 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 %
rust 2 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 %
go 0 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 %
go 1 1 0 1 0 0 100.0000 % 1 0 0 0 1 0.0000 %
go 2 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 %
c 0 4 0 2 1 1 100.0000 % 4 1 0 1 2 0.0000 %
c 1 2 0 1 1 0 100.0000 % 2 0 0 1 1 0.0000 %
c 2 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 %
cpp 0 1 0 0 0 1 0.0000 % 1 0 0 0 1 0.0000 %
cpp 1 33 5 7 0 21 58.3333 % 33 5 1 0 27 16.6666 %
cpp 2 12 3 2 3 4 40.0000 % 12 3 1 3 5 25.0000 %
java 0 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 %
java 1 7 0 4 0 3 100.0000 % 7 0 0 0 7 0.0000 %
java 2 277 149 43 4 81 22.3958 % 277 164 8 8 97 4.6511 %
lua 0 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 %
lua 1 28 1 11 5 11 91.6666 % 29 3 2 11 13 40.0000 %
lua 2 107 21 18 42 26 46.1538 % 109 30 5 45 29 14.2857 %
r 0 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 %
r 1 0 0 0 0 0 0.0000 % 0 0 0 0 0 0.0000 %
r 2 2 2 0 0 0 0.0000 % 2 2 0 0 0 0.0000 %

类 3(未用形参,顾问;不进率,两口径各五列):

语言 类 严·发现 严·真阳 严·误拦 严·移除 严·未定 窄·发现 窄·真阳 窄·误拦 窄·移除 窄·未定
python 3 84 0 22 1 61 84 0 20 1 63
typescript 3 2 0 0 2 0 2 0 0 2 0
tsx 3 0 0 0 0 0 0 0 0 0 0
rust 3 7 0 0 0 7 7 0 0 0 7
go 3 19 0 9 0 10 19 0 5 0 14
c 3 2 0 0 0 2 2 0 0 0 2
cpp 3 3 0 1 0 2 3 0 0 0 3
java 3 403 14 71 103 215 403 14 27 106 256
lua 3 49 13 3 12 21 50 15 0 14 21
r 3 18 1 0 9 8 18 1 0 9 8

读法(只引表、不另算):

  • 十语言两口径率由第一张表的「严格率」「窄率」两列读。窄口径七个语言是 0.0000 %(python、typescript、tsx、rust、go、c、r),cpp 20.0000 %、 java 4.6511 %、lua 17.5000 %;严格口径只有 rust 与 r 是 0.0000 %,其余大得多(python 50.0000 %、typescript 33.3333 %、tsx / go / c 100.0000 %、 cpp 52.9411 %、java 23.9795 %、lua 56.8627 %)——它把「单元被改过一次、发现还在」一律记误拦,窄口径只在改动行碰到发现的行段时才结账。两个数都是 实测、都冻结,不合成单一数字;本台账不设线,准入仍只读精度册。tsx / go / c 的严格 100 % 各是一条误拦对零真阳(分母 1 / 1 / 3),不是率的常态。
  • 窄口径的误拦逐条(语言 / 提交 / 单元 / 变量;仪器在结账那一事件打印 FALSE <提交> <路径> <单元>/<形参数> kind <类>: <锚>,这里从十个 d2-<语言>.log 抄、条数对回表的「窄·误拦」列):cpp 2 条——46a45990 include/fmt/compile.h compile_format_string/1 类 2 next_id、 45f230b9 test/printf-test.cc test_length/2 类 1 unsigned_value;java 8 条——2c94c757 functional/StreamingTypeAdaptersTest.java testNullSafe/0 类 2 expected、99cc4cb1 reflect/TypeTokenTest.java createTypeTokenTypeVariable/0 类 2 unused、99cc4cb1 stream/JsonReaderTest.java testPrematurelyClosed/0 类 2 unused1 与 unused2、0eb681b1 internal/UnsafeAllocator.java create/0 类 2 ignored、9471163d functional/ReflectionAccessFilterTest.java testBlockInaccessibleJava/0 类 2 ignored、7878ee2b internal/bind/TypeAdapters.java javaTimeTypeAdapterFactory/0 类 2 e、a3b9f1f7 stream/JsonReader.java nextLong/0 类 2 ignored; lua 7 条——3612c269 src/luarocks/build.lua process_dependencies/2 类 2 ok、d83b908a src/luarocks/util.lua util.check_lua_version/2 类 2 err、494a4934 src/luarocks/cmd/install.lua install.install_binary_rock/2 类 1 ok、99c72672 win32/pe-parser.lua M.msvcrt/1 类 2 i、 d300c11c src/luarocks/cmd/install.lua install.install_binary_rock_deps/2 类 1 ok、d300c11c src/luarocks/cmd/make.lua make.command/1 类 2 errcode、deb9cadc src/luarocks/cmd/install.lua install.install_binary_rock/2 类 2 ok;其余七个语言 0 条。归因不在本节做:这些行是语料作者 改了那个单元、改动行碰到了发现、发现还在——是不是产品误报要回精度考题的真值表问。
  • 类 3 顾问列(第三张表):十语言共 587 条发现,窄口径误拦 python 20、go 5、java 27,其余七个语言 0;严格口径 python 22、go 9、java 71、cpp 1、 lua 3;逐条见 d2-<语言>.log 的 kind 3 行。未用形参在每个面都是顾问,不进率、不进门。

耗时(release 测试体,同机串行,每个语言一次 CE_FPR_FLOW_CORPUS=<语言> 带 CE_BLESS=1 与 CE_FPR_OUT=<树外目录>,记挂钟秒):D2 这一坐 (主根干净树 5e02af4a)python 378 s、typescript 859 s、tsx 72 s、rust 248 s、go 346 s、c 560 s、cpp 286 s、java 459 s、lua 273 s、r 577 s,合计 4,058 s。度量期间机器满载——别的会话的 cargo 测试与一个游戏把 CPU 占到 100 %——这十个数只作上界。对照:车道在较安静的窗口用同一仪器量同十个语料 (harness 车道提交 6df7078d,63 格与本档全同),取整后 c 292 s、cpp 202 s、go 158 s、java 271 s、lua 155 s、python 140 s、r 184 s、rust 121 s、 tsx 53 s、typescript 213 s,合计 1,789 s;安静窗口的复量另记。十行的 measured_at 前五行(python、typescript、tsx、rust、go)记 2026-09-30、 后五行(c、cpp、java、lua、r)记 2026-10-01:一次坐下跨过了 UTC 零点,执行者只要求每行自带 ISO 日期、不要求十行同日。

复现

常设腿(测试子仓 cli/tests/it/fpr_replay.rs,release 跑,cwd cli/):

  • 自仓全史:cargo test --release -j 8 --test it -- --ignored fpr_replay::every_intercept_is_read_against_its_parent_baseline --exact --nocapture(本机约 7 min;精确过滤,避免同时启动同名子串的 L2 仪器);
  • requests 窗口:PowerShell 逐句设 $env:CE_FPR_REPO='<M5-3 钉定的 requests 克隆>'、$env:CE_FPR_TIP='1f6589ec3a1ee910f9a65cc3ceac60b26677bc0e'、$env:CE_FPR_LIMIT='400',再跑上一条精确命令; ——1f6589ec 是 EVAL-SET-M5-3 钉定 tip 8068356 的祖先(git rev-list --first-parent 626 提交),不必另克隆;
  • CE_FPR_LIMIT=N 只放最新 N 个提交、以其前一提交的树为种子(冒烟)。

分级区台账腿(同三个环境变量,语料名另由 CE_FPR_CORPUS 给,默认 self;不建索引、不探针, 比 fpr_replay 快一个量级):

  • 自仓全史:PowerShell 清除上述 CE_FPR_* 选择,再设 $env:CE_BLESS='1',执行 cargo test --release -j 8 --test it -- --ignored fpr_zone_replay --nocapture;
  • requests 窗口:另一次 PowerShell 调用,逐句设 $env:CE_FPR_CORPUS='requests' 与上述 requests 三变量,再设 $env:CE_BLESS='1',执行同一条 zone 命令;
  • 每次 bless 只重写自己那一行,另一行原样留在 contracts/eval/fpr-zone-v1.json 里。

逐语言台账腿(CE_FPR_CORPUS 只认六个语料名,语料与 tip 由考题登记表钉住,不读 CE_FPR_REPO / CE_FPR_TIP / CE_FPR_LIMIT):PowerShell 逐句设 $env:CE_FPR_CORPUS='lua'(或 fmt / gson / luarocks / stringr / codeeraser)与 $env:CE_BLESS='1',执行 cargo test --release -j 8 --test it -- --ignored fpr_lang_replay --nocapture;六个语料各跑一次, 每次只重写自己那一行($env:CE_FPR_OUT='<目录>' 时读写都在那个目录,三份台账同读这一条规则)。

flow/1 回放腿(CE_FPR_FLOW_CORPUS 只认十个 flow 考题语言名,语料与 tip 由 flow 考题表钉住;克隆读 CE_FLOW_CLONE_ROOT,缺省 .ce-eval/corpora,只读不写;要 CE_CORE_BIN):PowerShell 逐句设 $env:CE_FPR_FLOW_CORPUS='python'(或 typescript / tsx / rust / go / c / cpp / java / lua / r)与 $env:CE_BLESS='1',执行 cargo test --release -j 4 --test it -- --ignored fpr_flow_replay --nocapture; 十个语言各跑一次,每次只重写自己那一行;$env:CE_FPR_OUT='<目录>' 让十次 bless 都写到树外、度量树保持干净,十行齐了再把档拷进 contracts/eval/(同 flow 考题档的 CE_FLOW_OUT)。

历史复现(退役期 2026-08-18~2026-09-05)

M7.5 退役后、常设腿复立前的复核(K 轮两轮)用的是从 git 历史复活的根目录仪器——按 EVAL-SET.md「再生成」 节的复活律连同同代支撑复活、跑毕重退役(其 common::git_out 已于 9e05f53 出仓,单取仪器 文件对今日支撑编译不过):git show 0c7c936^:cli/tests/fpr_replay.rs > cli/tests/fpr_replay.rs && git archive 0c7c936^ cli/tests/common | tar -x, 跑文末命令,再 rm -rf cli/tests/fpr_replay.rs cli/tests/common (复活件在两个仓都是未跟踪文件:cli/tests 自 9bedcc4 起是 submodule,超仓索引里只有 gitlink 一行,对着 submodule 路径 git checkout <sha> -- <路径> 会静默把 gitlink 换成历史 blob——退役必须是纯 rm,永不写索引):

K 轮实测两处同代垫片(复活后按此打上;第一片 product mirror 仅第二轮新语义复测才打、第一轮出厂语义须留白;第二片 remove_missing 补 seen 参两轮都必打——今日签名为二参,缺之编译不过):

--- fpr_replay.rs (0c7c936^)
+++ fpr_replay.rs (revived, K round)
@@ -128,6 +128,30 @@
                 lang: Lang::from_path(Path::new(&rel)).expect("lang"),
             };
             let m = probe::probe(&idx, &shadow, target, p, f).expect("probe");
+            // product mirror (K step 11 novel-duplication semantics):
+            // a Write replaces the file, and matches the replaced
+            // content already had are carried, not introduced — for
+            // M events subtract the parent version's own matches
+            let m = if status == 'M' && !m.is_empty() {
+                let old = git_out(&repo, &["show", &format!("{parent}:{rel}")]);
+                let base_t = probe::Target {
+                    rel: &rel,
+                    content: &old,
+                    lang: Lang::from_path(Path::new(&rel)).expect("lang"),
+                };
+                let base = probe::probe(&idx, &shadow, base_t, p, f).expect("probe base");
+                m.into_iter()
+                    .filter(|x| {
+                        !base.iter().any(|b| {
+                            b.file == x.file
+                                && b.start_line <= x.end_line
+                                && x.start_line <= b.end_line
+                        })
+                    })
+                    .collect()
+            } else {
+                m
+            };
             if !m.is_empty() {
                 intercepts.push(format!(
                     "{} {} -> {} ({} tok)",
@@ -140,7 +164,11 @@
             apply(&shadow, &mut idx, &repo, commit, &rel, p);
             live.insert(rel);
         }
-        idx.remove_missing(&live).ok();
+        // same-generation shim: remove_missing grew a `seen` arg after
+        // the instrument retired (walkidx refresh split); the replay's
+        // seen set is simply what the index holds
+        let seen = idx.indexed_paths().expect("indexed_paths");
+        idx.remove_missing(&live, &seen).ok();
     }
     println!(
         "replayed {events} edit events, {} intercepts:",
  • 自仓:cargo test --release --test fpr_replay -- --ignored --nocapture
  • 外部仓:CE_FPR_REPO=<path> cargo test --release --test fpr_replay -- --ignored --nocapture (本记录的 requests 语料:钉定 commit 浅克隆后 git fetch --deepen 400)