Skip to content

release: develop → main - #180

Merged
dslsdzc merged 140 commits into
mainfrom
develop
Oct 23, 2026
Merged

dslsdzc merged 140 commits into
mainfrom
develop

Conversation

@dslsdzc

@dslsdzc dslsdzc commented Oct 23, 2026

Copy link
Copy Markdown
Owner

内容

将 develop 合并到 main。包含 v4 语法迁移、文档与源码注释重写、后端自举修复、运行时和 LSP 安全修复、类型系统与缓存相关修复,以及对应的测试和文档更新。

验证

  • develop 上的 check 通过
  • 既有 bootstrap-tests / selfhost-tests 仍受 v4 语法迁移遗留问题影响
  • 本次发布按维护者要求合并

dslsdzc and others added 30 commits August 30, 2026 16:47
* fix: resolve remaining TODO safety gaps

* fix: preserve strings in interpreter

* test: cover pointer dereference escape regression

* fix: handle generic types in bootstrap checker

* fix: harden CCR parsing and i32 serialization

* fix: validate APX and static FFI paths

* perf: buffer LSP RPC input reads

* fix: 字符串常量下标越界守卫 + hex/oct/bin 溢出守卫 base 校准 + 词法错误累积修复(M-2/P2 收尾)

* fix: 字符串常量下标越界守卫 + hex/oct/bin 溢出守卫 base 校准 + 词法错误累积修复(M-2/P2 收尾)

---------

Co-authored-by: DslsDZC <dsls.dzc@gmail.com>
* docs: spec 补定——要点部分以格形态为标准解释方式(三层映射)

* docs: 语法文档重写(第 1-3 章:设计要点/词法/模块)

* docs: 语法文档重写(第 4-7 章:类型标注/声明/表达式/控制流)

* docs: 语法文档重写(第 8-10 章:函数/接口泛型/规约)

* docs: 语法文档重写完成(第 11-13 章 + 全文验证通过)

* docs: 语法文档重写实现计划(4 任务/逐章验证/全文清单)

* docs: 设计要点补定——一切自动推断完整清单(类型/所有权/编译期/惰性/指针/dyn/概率/机器形状,无关键字)
* feat: v6 SYM 归并/REG 坐标化——spec §3.2/§3.5 目标形状落地(vars 并入函数记录声明区、globals 带 type、REG kind/parent/enter/exit/first/last、root_region span 派生函数边界;ELF 发射零变化)

* refactor: regalloc-consistency.corespec → src/compiler/regalloc-consistency.cr——定位修正(分配器逻辑契约文档载体,非规约/非编译单元;配套 verify 运行自检在 opt.cr)

* docs: regalloc-consistency.cr 重写——去 corespec 语法改 Core 注释契约文档(分配器逻辑契约 + opt.cr 实现映射 + 三层正确性定位 + 缺口挂账)

* refactor: .corespec 退役——独立规约格式取消(crasm 同构:规约 = .cr 语法唯一表达);ebnf/spec 文件标注 + CLAUDE.md 同步 + 语法并入 core.ebnf 挂账

* fix: 数据面防御批 1(GC-1/GC-3/GC-4)——entries_coexist 上界校验 + loader REG root span 对 NOD 空间校验 + save var 行序位置级守卫

- GC-1(M-5):opt.cr entries_coexist 补 e1/e2 ≥ g_entry_count 上界守卫返回 0
  (槽后零填充/缓冲外越界读 → 判定垃圾或崩溃);新增 cir --inject-coexist-oob 探针
- GC-3(SYM 评审 M1):ccr_io.cr loader NOD 解析后逐函数校验 root region span
  instr_start+count ≤ instr_cnt(REG 段解析先于 NOD 无法对照;ENT ele>instr_cnt 同风格)
- GC-4(SYM 评审 M2):ccr_io.cr save var 行序守卫升级为位置级(vs == 前缀累计 +
  末块铺满;计数级 Σ 总量守恒时察觉不到块错位);新增 ccr --inject-var-shift 钩子
- 钩子均隐藏 debug 标志(真实构建路径永不注入,同 check-regalloc inject-* 模式)
- 测试:test_live_ranges(GC-1,11→12)/ test_ccr_v6(GC-3/GC-4,6→8),先红后绿

* feat: 定值识别建模扩权——dest≥0 = 定值点(GC 批 2):ALLOC_ARRAY/ALLOC_STRUCT 内存对象诞生 + producer 直写并入版本切分(格式定稿 §4.1);STORE_INDEX_VAR/STORE_PTR/DYN_DISPATCH dest 非定值排除(IR 全集勘定);判定②义务边界自动扩权代码零改动已验证;inject-read-gap 迭代序保非 func0 回归面

* test: param_ents=-1 定向测试(GC 批 3)——重定值参数无入参版本条目断言(.ccr SYM param_ents + dump-entries 双通道;对照只读参数 def=-1 条目 id);regalloc-consistency.cr 挂账注记同步(机制括注 + 测试引用);顺手项:v6 spec §4.1 步骤 1 补 carve-out 注记(STORE s1 单列 + 三 op 排除,引 §3.4)+ opt.cr rl_rule2_func「dest 从不读」注释修正(三 op dest = 真实读点,扫列边界如实)

* fix(hit): M2 独立小项批——--table × --link/--shared 显式拒绝(stderr+exit 1);未用哨兵字段改存 0(store dst/load s2,修自持截断除 255 vs Python 0xFFFFFFFF 分裂);add 反减 dest-fresh 防御(d==s1 落 0 事件旧路径);"events emitted" 计数改名(表模式总结语义准确);REX 注释 W+R→W+R+B;M1 plan 表文件格式示例同步真源(0x4D 29 DA/角色)+ core-x86.toml 头部注释修正

* docs: TODO M2 挂账勾销(小项批 3/4 完成;负值常量池载体仍挂)

* docs: int 无上限语义定稿(int-unbounded-semantics)+ 溢出错误编码层归位(注释更新,消息/错误码不动)

Task A: 新建 docs/superpowers/specs/2026-09-06-int-unbounded-semantics.md——
int = 数学整数公理化接口(无溢出概念,溢出非语义事件);经典 64 位机器字 =
快路径投影,超界 = 编码层事务(静态区间证明免检/推导不出才检查提升,表示策略
归 hw-map 远期);溢出类错误(lexer 字面量守卫/CCR i32 字段校验)重新定位 =
编码层限制错误;与 dex 精确两线不混(int = 语义层无上限、dex = 表示层工程);
int 公理可被 .cr requires/ensures 规约对照验证(CompCert 精神推广到原语层)。
引用 type-system-direction / width-out-of-language / 三层映射 v4 /
bounds-inference 挂账 / spec-design §9.4。

Task B(保守落实):lexer.cr str_int_literal / bootstrap lexer.py 前缀进制守卫
注释更新为编码层限制语义(语言无上限、经典投影受限;两编译器差异 = 投影形状
差异非语义分歧);ccr_io.cr save_ccr 守卫注释 v5→v6 修正 + 文件格式域归位。
错误文本与错误码体系不动(无测试断言该文本;消息改动需全量重建 + 并行会话
共享工作副本,风险>价值)——注记方案入 spec §七。

* docs: int 多字表示设计草案(后端策略 B:64 快路径 + 溢出扩展 2-limb)——语义层零改动,编码层投影;决策点 D1-D6 待拍

* docs: int 多字 M1 实施计划——add/sub 溢出全链(tagged 槽/jo 慢路径/2-limb/分配器只栈);D4 常量多字推迟 M2(IR_CONST 64 槽=格层表示需 v6 常量段)

* feat: int 多字 M1 Task 1——tagged 槽框架(增量移植:识别/tag 区/栈布局;HIT 发射保持完整)+ test_mw_task1

* fix: int 多字 M1 Task 1 评审修复——mw_setup_tags 单遍前向→不动点闭包(循环回边携带 tag 态)+ B' IR_STORE 定值拷贝边(变量行入集)+ test_mw_task1 补 s6 红用例/s7 帧区分(v6 oracle)

* feat: int 多字 M1 Task 2——快路径溢出检测发射(tagged int add/sub 后 jo rel32 → 函数尾慢路径块骨架)

- instr.cr:IR_BINARY int ADD/SUB 分支 e2_alu 后、e2_st 前发射 e2_mw_jo
  (0F 80 rel32,6B——块附函数尾,rel8 ±127 在 >127B 函数体不可达;单遍
  发射目标后知 → 恒 rel32 唯一正确)+ g2_init 清零计数(ret_patch 同款
  逐函数段)+ mw_int_arith_jo_needed(表模式门控复用)
- elf.cr:Phase 3 每函数尾声 ret 后——jo 记录回填(块位置后知)+ 慢路径
  块骨架(ud2 占位,溢出 = 确定性 SIGILL;Task 3 替换为 2-limb 修正代码,
  jo 记录届时扩展 dest 等现场);HIT 表路径对 tagged int add/sub 整条排除
- sizes.cr sz_jo=6;globals/dyn_arr g_x86_mw_jo_* + grow_mw_jo_patch
- untagged 快路径零字节变化(z 用例与改动前快照指令流逐字节一致;E8 call
  位移例外——stdlib 函数布局合法后移)
- test_mw_task2.py:v6 oracle 期望 jo 数(不动点 tag 集)+ main 区域 0F 80
  扫描(计数/目标==函数尾块/ud2)+ t3 大函数 rel32 必需性(12KB 体首个 jo
  距块 >127B)+ t2 溢出 rc -4(SIGILL,跳转可达性)+ 零 diff 基线比较

* feat: int 多字 M1 Task 3——慢路径 + 2-limb 表示运行时:jo 后数学修正(add 溢出高 limb = CF?-1:0 / sub = CF?0:-1——sbb 推演 + 4 万样本验证)、alloc(16) 2-limb 堆对象写 [lo,hi]、dest 值槽回存(含 O1/O2 reg 形态)+ tag 置位(g2_tag_off)、jmp 回快路径 store 后(jo 记录扩展 pos/dest/is_sub/resume;每站点独立函数尾块;rsp 16 对齐 call alloc)+ test_mw_task3(syscall3 原始 16B 通道验全 128,CF/op 判别矩阵)+ test_mw_task2 块形状更新

* feat: int 多字 M1 Task 4——消费者适配(tag 读路径 + tag 卫生):tag 卫生 = 定值点写 tag(add/sub 快路径落值清 0 + IR_STORE/IR_LOAD 拷贝运行时 tag 传播 + prologue 参数保存清 0——无帧入口清零,行模型定值点全集论证);消费者读路径 = return 解 2-limb 指针取低 limb(exit 低 8 位 = 数学值)+ 128 位比较(高 limb 带符号/低 limb 无符号)+ 128 位混合链式 add/sub(快操作数 sar 63 扩展、进位/借位链、结果可装 64 位降级快值保持 2L 非零不变量、hi 出 {0,-1} 域仍精确——码域界论证 <2^66 无错误路径);每站点函数尾 2L 块 + 快路径 tag 检查(0F 85 rel32 回填,jo 同款);表路径门扩展(tagged 比较落旧路径)+ 评审 Minor REX docstring 3 处误修;+ test_mw_task4(16 用例 x O0/O1/O2:return/比较判别矩阵、链式 128 流、卫生红用例)

* fix: int 多字 M1 Task 4 评审 Critical——fits-64 检查编码 0x4D→0x49(0x4D 39 D3 错编 = cmp r11,r10——reg 字段误指 r10;0x49 39 D3 = cmp r11,rdx = hi vs sar63(lo) signmask):假 fit(hi==lo、hi∉{0,−1})静默降级截断(链达 −2^64−2 → −2 / 2^64+1 → 1,活体实证)→ 一字节修复 + sar63→cmp r11,rdx 恢复活(死代码态随修复消除)+ 判别回归 d1/d2(syscall3 16B 通道全 128 断言——评审确认唯一判别形态;红 6/6→绿 6/6,既有 18 用例 54/54 不受扰);spec(int-multiword-backend-design §5)补 return 出逃边界句(M1 内 return-2L 到内部调用方 = 确定性截断低 64 wrap,全 128 return = M2);Minor:报告数字订正 16→18/54、IR_STORE/IR_LOAD s1<0 尾分支注释、块体积注释(最坏 ~160B/rel8 局部 ≤~60B)、卫生论证锚进 mw_setup_tags 注释;+ test_mw_task4 判别回归 2 用例(20 用例 x O0/O1/O2 = 60 组全绿)

* docs/task5: int 多字 M1 Task 5 裁决——D6 tagged 只栈不实施(确认 + 测试加固):现状实证 O2 下 tagged 变量(含运行时 2L 态:循环携带/参数行/双 2L 对象)确被 CAG 分配寄存器(rbx/r12-15),O1 恒全栈(alloc_registers 门 = opt≥2);D6 排除动机(多字不可驻单寄存器)被 D1a 表示消解(驻留 = 快值或堆指针,128 载荷在堆,tag 帧字节)——reg 形态 = 单 seam(g2_slot/g2_tag_off)结构保证 + task4 60 组 O2 绿实证,排除零收益有代价 → 零代码改动(分配器/发射不变);+ test_mw_task5(3 用例×O0/O1/O2 = 15 组:O2 元断言 tagged∩REG_ASSIGN≠∅ 于 2L 溢出函数 + O1 元断言 REG_ASSIGN=0 + 行为绿/16B 通道——裁决可执行形态,翻案则红)+ instr.cr 消费方接口注释 D6 定案 + plan(Task 5 执行记录/D6 修订/Task 1 偏差注——评审 M3 同步)+ spec §6 D6 定案条目

* docs/task6: int 多字 M1 收官——验证 + 回归 + 文档收尾:+ test_mw_task6(8 边界用例 × O0/O1/O2 = 24 组:i64max±1 恰好一步越界 / 上边界三步链 + 降级回 i64max 再越界 / 下边界邻域 −2^63 快值不溢出 + add/sub 连续越界 + 回升降级 / sub 形式 i64max− −1 / 上下边界双站 + 2L vs 2L 高 limb 判别 / max 边界 fast↔2L 比较真值表双分派 + EQ/GE −10 哨兵 / min 边界同 hi 低 limb 无符号判别 / 循环携带越上边界——期望值 Python 独立计算,16B 通道验全 128);收官全量回归绿(mw1-6 + hit_table 11/11 + compile + backend_bootstrap stage1→3 byte-identical + ccr_v6 9/9 + region_cfg 22/22 + slice_bounds 7/7 + corec check)+ O2 自举重建;plan(状态行 M1 完成 + Task 6 执行记录 + 偏差/风险四项逐条处置:jo 修正已验(8 万样本 + 判别矩阵)/保守 tagged 集代价记录/D1c=M2/arena 生命周期已核/return 低 8 位 → 16B 测试钩子)+ spec backend-design(状态定稿 + §8 M1 完成范围 + M2 挂账 9 条)+ int-unbounded §六挂账 2 注记 M1 实例落地 + TODO 新节(M1 完成 → M2 挂账)

* docs: M1 收官补账——零 diff 基线 CI 化入 M2 挂账(Task 6 评审)+ plan jo rel32 括注同步(3 处)+ hi∈{0,-1} 放宽注记

* docs: M1 spec §8 M2 挂账补 10/11——零 diff CI 基线化(Task 6 评审指派)+ hi∈{0,-1} 放宽注记(编号修正)

* docs: 寄存器分配移后端设计草案——编码层资源决策归位(corearch 数据面+分配+判定;.ccr opt_meta 简化;纯机械映射表述取消);决策点 R1-R5 待拍

* docs: regalloc 移后端 Task 1——opt.cr 按层切分盘点(归属/依赖/调用面清单入库)+ CSE 产物零效果实证 + D-1/D-3 拍板点;实施计划入版本库

* refactor: regalloc 编码决策层纯搬移入 corearch——新建 src/arch/linux/ld/regalloc.cr(opt.cr 189-1737 保真:数据面 compute_live_ranges/entries/共存 + CAG alloc_registers + 判定 verify/注入钩子,逐字搬移待表述清理)+ corearch 闭包接线 + get_ir_var_name 移 dyn_arr.cr(corearch 闭包无 ir_gen.cr,判定打印随迁;双侧共享位);行为零变化(build 绿 + compile/ccr_v6 回归绿)

* feat: regalloc 移后端切换——分配+判定归位 corearch(R1a/R2/R3 落地;D-1=Y ENT 出格式、D-3=b 栈共享停用)

corearch:load 后 O2 自算 alloc_registers + regalloc_verify_all(emit 前,违反=编译错误,成功静默);表模式跳过(M1 直线路径无 O2 组合验证);调试通道随迁同名 flag(--dump-entries/--dump-coexist/--check-regalloc/--inject-* 三态 dispatch + 新 --dump-regassign 逐对输出)
corec:opt.cr 1940→312 行(数据面/共存/判定/注入/CAG alloc/pass_stack_share 迁出删除;留 AST 折叠 + pass_cse + optimize_all 死码摘 alloc 引用);main.cr O2 段与 cir 调试通道摘除;dataflow lower 尾 compute 摘除;ccr_io save 恒空(ENT 0 条/SYM func 与 REG first/last -1/param_ents -1/opt_meta 0——loader 空表语义已支持,零 version bump)
测试:test_live_ranges 通道改道 corearch(断言期望零变化 13/13);test_mw_task5 元断言改 --dump-regassign(O2 tagged∩REG_ASSIGN≠∅ 于 2L 溢出函数、O1 恒空——reg 形态裁决在 corearch 自算下保持);test_ccr_v6 重写(ENT/opt_meta 恒空断言 8/8,conversion/param_ents 载体消亡测试改/删)
验证:O2 行为等价全锚点绿(exit 42/55/20/14/22/30/31/6/15/7 + 16B 全 128 通道);回归全绿 mw1-6 + compile + backend_bootstrap stage0-2 + ccr_v6 8/8 + region_cfg 22/22 + slice_bounds 7/7 + hit_table 11/11 + bootstrap 3 套 + selfhost 其余套件
偏差注:Task 2/3/4 因 corec 闭包互锁合并为单切换提交(纯搬移提交先行可独立评审);CSE 实证无产物效果(NOD O0/O1/O2 逐字节同——R5 门语义留 Task 5 表述)

* docs: regalloc Task 5+6——表述清除与 CLI 语义(R5)+ spec/plan/TODO 收尾
Task 5:regalloc.cr 判定区头/镜像/alloc 区头过时注记(.ccr 传输 meta、corec 不含后端文件等 5 处)→ corearch 自算自消费表述;instr.cr get_reg_for_var 头注(saved in .ccr v3+ → O2 自算填充,O0/O1 恒空);globals.cr 区间/条目表填充方注(opt.cr → regalloc.cr + D-1=Y 恒空);regalloc-consistency.cr 参考实现指针 → src/arch/linux/ld/regalloc.cr + 负编码数据模型表述清理 + 缺口注记(pass_stack_share 停用 / param_ents 载体消亡 / GC-1 已修);corec/corearch -O 帮助文案(O1 = CSE corec 进程内、O2 = 分配+判定 corearch——corec build 透传);opt.cr 头注释 = 剩件清单;「纯机械映射」src 侧零残留(project-book 哲学表述校对挂账 TODO)
Task 6:spec R1-R5/D-3 拍板记录 + 实施完成状态(§2-§7 更新);plan 状态行 + Task 1-6 执行记录(纯搬移/切换两提交评审线 + 互锁偏差说明);TODO 新节(完成 → 挂账五条)
验证:改动后 build 绿;行为回归面 = 切换提交已全量绿(注释/文案零行为面)

* docs: HIT M2 设计定稿——运行时核事件集 + 全表驱动收口(specs/2026-09-07-hit-m2-design.md):方案 1 拍板(4 数据事件保持 + 扩展 jump/branch/call/ret/extern = 9 事件运行时核;schema v2 投影模板语言;数据化边界 = 单指令编码、序列算法保留;运行时条目最小描述 x86 一档);范围 = A+B 全量、验收含自举;M2a-d 分段(事件集/降低全 op/发射收口/运行时+纯表自举)+ 验收链(模板对照→suite→组合→自举两段)

* docs: HIT M2 实施计划定稿(plans/2026-09-07-hit-m2.md)——Task 0 盘点锚点(形态族/schema 定稿/序列边界/op 映射三清单驱动后续)+ M2a(schema v2 加载/解释器新形态 + 事件流注入测试通道解耦/jump·branch·call·ret·extern 模板)+ M2b(控制流标签回填/调用降低/合成规则完备 + suite 混合过渡验收 + 自举冒烟透传 --table)+ M2c(形态族分批数据化 byte-identical + emit 汇合消灭混合)+ M2d(运行时条目参数化/extern 解锁组合验证/纯表自举终验/文档清账);风险注记 + 表模式恒 O0 约束

* docs: HIT M2 Task 0 盘点——形态族/schema v2 定稿 + 序列算法边界 + IR op 映射三清单(计划锚点回填)

* docs: HIT M2 Task 0 修复——评审 findings(A3 mov rcx,r11 字节 49 89 CB → 4C 89 D9 反转修正;A1 opcode 十进制 → 0x 十六进制统一;R1 帧公式去 mw_frame_size 加项(tag 偏移 -(vc*8+1+k) 同步);R2/Task 5 里程碑引用 15 → 14(运行时条目参数化 = Task 14);清单 hit 层 seam 函数具名)

* feat: HIT schema v2——投影模板语言扩展 + 运行时核事件声明(M2a Task 1)

* fix: HIT M2 Task 1 评审修复——step 小节解析越界修正 + 多 proj step 小节 fixture(复审闭环)

* feat: 模板解释器 v2 形态 + 事件流注入测试通道——REX/ModRM/SIB/disp/imm/rel(M2a Task 2)

* docs: 格层边界定稿——判据(G1-G4)+ v6 审计裁决(NOD/ENT/REG/边表)+ corearch 转换器契约 C1-C6(格→编码投影器定位、实例化边界推广、M2/HIT 判据裁决)

* docs: v7 格形态设计定稿——真图载体(边界 spec P1-P3 修复·载体革命级): 边表必落配方闭合 + ENT 主干化(v6 §4.1 规则执行化)+ 调度=投影 + op 字典显式遗留 + 归一化双通道 + 行为判据(v7 重建 ≡ v6 链);两段式第一段,字节格式/实施计划后置

* docs: v7 字节格式定稿——真图载体两段式第二段: NOD 36B(邻接 first_edge/edge_count) + EDG 段 8B×n(数据/state 前向边) + ENT 28B 恒空→实记录 + 拓扑不变量校验(回边 = 操作数非边);cir_cache v13 邻接先例,实施计划后置

* docs: v7 格形态实施计划(2026-09-09)——Task 0 盘点锚点 + Task 1 v7 骨架(version 7/NOD 36B 邻接/EDG 段写读同改,v6 读退役)+ Task 2 ENT 主干化(corec 产实记录 = regalloc compute_entries 镜像基 + loader 激活 + SYM/REG 回填)+ Task 3 收官(test_ccr_v7 全量迁移/全量回归/自举重建/文档);行为等价判据 = 回归全绿 + stage 链 byte-identical;CSE 疑点非修复项注记

* docs: corearch 重写设计定稿——范式无关小内核 + 实例定制(决策点 3): 内核三组件(语义对象模型/判定分配引擎族/实例注册契约——regalloc-cache-mapping 判定四条 = 首个成员)+ x86 实例组成(调度重建/lower/实例算法族/实例数据 = HIT 表归位)+ 现模块归属裁决表(regalloc 拆分语义侧 vs CAG)+ 演进序(v7 → 内核抽取 → x86 实例化 = M2 复启接续);判据 = 行为等价 + 投影正确性(C4)

* docs: v7 Task 0 盘点——EDG 内容期望清单 + CSE 实测注记 + ENT 规则对照 + 落盘序核对(计划锚点回填)

* docs: v7 计划引文修正(Task 0 评审 Minor 2-6)——save_ccr 尾界 :636、arena 补丁位 ir_gen.cr:1711/:2287、cir_cache 恢复区段精确化、ARENA_RESET GAP 标注、BOUNDS_CHECK 文件名

* feat: v7 格式骨架——version 7 + NOD 36B 邻接 + EDG 段必落 + df 播种修复(写读同改,v6 读路径退役)

* docs: v7 编译器缺陷跟踪注册——elf.cr 巨函数尾代码生成缺陷(TODO 预存 Bug #4: 机制/子系统假设/gdb 证据/repro/推迟批准)+ v7 计划风险注记(Task 1 越界配套裁决记录)

* feat: ENT 主干化——corec 产实记录(v6 §4.1 规则执行化)+ loader 激活 + SYM/REG 条目回填

* feat: v7 收官——测试族迁移(V7File walker 全量)+ cache-hit 回归 + ENT 负分支覆盖 + 全量回归 + 自举重建 + 文档同步

* docs: v7 format spec §5 测试族行同步(Task 3 评审 Minor 3——test_ccr_v7 23/23 已取代 v6 族,无 v6-vs-v7 链对照)

* docs: corearch 内核抽取实施计划(2026-09-10)——Task 1 语义侧纯搬(ent_kernel.cr: 数据面/共存/规则①② 判定 + meta 读通道随判定; CAG/meta 写入留实例)+ Task 2 写侧单源化(compute_entries_v7 镜像消除, 内核进双 concat)+ Task 3 注册契约最小面(实例声明表 + 表驱动分派)+ Task 4 收官; 行为零变化判据 = test_live_ranges 13/13 + test_ccr_v7 23/23 byte-identical

* refactor: 内核抽取 Task 1——语义侧搬移 ent_kernel.cr(判定引擎 + 数据面纯搬,零语义改动)

* docs: 内核抽取计划修订(Task 1 评审)——Task 2 Files/Step 1 携带 RPT_MAX + ir_op_kind_name 迁入(Important)+ LOC_HOME_BASE 裁决修正三处残留清理(Minor 3)

* refactor: 内核抽取 Task 2——写侧单源化(compute_entries_v7 镜像消除,双转录 R5 收敛)+ RPT_MAX/ir_op_kind_name 迁入内核

* fix: 内核抽取 Task 2 补漏——src/compiler 自举单元 import ent_kernel(full-bootstrap N06/SIGSEGV 同类闭合)+ globals 表头注同步 + 回归面补全

* feat: 内核抽取 Task 3——注册契约最小面(实例声明表 + 表驱动分派,行为不变)

* feat: 内核抽取收官——全量回归 + 自举重建 + 蓝图步骤 2 完成注记 + cir cache 指纹缺陷挂账(TODO #5)

* docs: 内核组件完备化设计定稿(步骤 2.5)——① 语义对象模型(对象面 API + 调度重建移实例)+ ② 判定中立化(登记表通道 + 位置域声明化, LOC_HOME_BASE 出内核)+ ③ 注册契约完整(资源域代数/③④ 形式声明不实现/双向输出面)+ 中立性静态 guard; 行为零变化判据

* docs: 内核组件完备化实施计划(步骤 2.5)——Task 0 盘点锚点(重建段依赖面/region_of_nod 定夺/登记接入面/判定读 meta 面/guard 设计)+ Task 1 对象模型(对象面 API + 调度重建移实例)+ Task 2 判定中立化(登记表通道 + 位置域声明化)+ Task 3 注册契约完整(声明扩展/③④ 形式声明/输出面)+ Task 4 收官(中立性 guard + 全量回归);行为零变化判据

* docs: 内核完备 Task 0 盘点——重建段依赖面/region_of_nod 定夺/登记接入面/判定读 meta 面/中立性 guard 设计(计划锚点回填)

* docs: 内核完备计划 Minor 修正(Task 0 评审)——邻接偏移 +28/+32(s1 8B)、g_opt_meta 提及 7 注释+5 读、meta_reg_for_var 删→体改写不删(注入探针 :254/:261 同步)、中立性 guard 前置 Task 2 Step 1(红验证不丢)

* feat: 内核完备 Task 1——语义对象模型(对象面 API + NOD 对象存储 + 调度重建移实例 build_linear_schedule)

* fix: 内核完备 Task 1 补正——ld/main.cr 活入口注记重写(I-1)+ EDG 守卫常量化(M-3)+ 设计 §1.2 配方查询注记(M-1)

* docs: main.cr 活入口注记行引修正(复审残留 Minor——:152/:23/:56/:63 → :158/:29/:62/:69, 前插 +6 漂移)

* docs: 内核完备域参数化废弃修正(用户原则——内核零寄存器/域分类概念)——设计 §2.2 重写(位置 = 不透明整数 + home 面 = 条目字段独立互斥遍; 合成 = 实例侧事务)+ §3.1 删 home_base/reg_domain 字段 + 计划 Task 2/3 删 kern_set_loc_domain/域接线步

* docs: 内核完备计划重组——全量中立化波(Task 2 A 通道 compute 系改 NOD 对象面 + 写侧 populate / Task 3 B 通道登记表 + LOC_HOME_BASE 移除 / Task 4 输出面中性化 + 配方查询补体 + ③④ 声明 / Task 5 收官);审计结论 F1-F5 入设计 §4.5 + 写侧载体裁决

* feat: 内核完备 Task 2——A 通道中立化(compute 系改 NOD 对象面 + 写侧 populate,内核零线性流引用)

* feat: 内核完备 Task 3——B 通道中立化(登记表通道 + LOC_HOME_BASE 移除,内核零位置编码/零实例布局读)

* feat: 内核完备 Task 4——输出面中性化 + 配方查询补体(nod_inputs)+ 注册契约完整化(③④ 声明)

* feat: 内核完备收官——中立性 guard 全绿 + 全量回归 + 自举重建 + 文档同步(步骤 2.5 完成)

* docs: 内核完备计划头部重复 Tech Stack 行清理(控制器编辑残留)

* docs: 设计 spec 评审 Minor 1/2 修正——§1.2 nod_inputs 交付取代注记 + §7 判据引用锚点修正(§4.1-4.4 → §4 判据 1-2)+ CI 聚合层注记

* refactor: 语义内核目录分层——ent_kernel.cr 迁入 src/lattice/(与 src/kernel 验证内核命名区分;双 concat/回退链/_import/guard 路径同步)

* fix: ld 自举单元补 import lower_to_core——N06/N01 静默未定义闭合(c138c44c 同类;入口能力分歧挂 TODO #6)

* docs: TODO #6 评审措辞修正(旗标计数 6 非 7 /「机制在但 CLI 未接线」精确化)+ 补静默未定义类守卫建议(③)

* docs: x86 实例化设计定稿(步骤 3)——实例 = 三轴组合(架构 x86_64 × 格式 ELF × OS Linux):三轴目录(src/arch/x86_64 + src/format/elf + src/os/linux)+ 表数据迁架构轴(hit 引擎保持)+ 序列算法文件化(frame/callseq/tag2l/syscall/entry)+ 构建清单分段守卫 + 寄存器分配切分判定表(需求推导内核候选/物理选择实例)+ spill·驱逐能力演进预留(双向契约三段形状)+ 演进波次(结构/参数化/能力)

* docs: x86 实例化波 1(结构波)实施计划——Task 0 锚点 + Task 1 三轴搬迁+组合根(src/targets/x86_64-linux)+清单分段守卫(零抽取)+ Task 2 entry 整搬 + Task 3 frame 抽取(帧公式双源合流)+ Task 4 tag2l 整搬 + Task 5 callseq 抽取(五函数 SysV 三处同源合流)+ Task 6 syscall 抽取 + Task 7 收官;H1-H7 风险注记

* refactor: x86 实例化波 1 Task 1——三轴目录搬迁 + 组合根(src/targets/x86_64-linux)+ 清单分段守卫(零抽取)

* fix: 波 1 Task 1 补正——project-mode 构建 error 门接入 run_checked(TODO #6 ③ 事发层闭合)+ CLAUDE.md 路径同步 + TODO #7 死文件登记

* docs: TODO #6 ③ 残留面清点补全 + TODO #7 碰撞集/引述精确化(波 1 Task 1 复审遗留)+ elf.cr 头注路径同步

* refactor: x86 实例化波 1 Task 2——emit_start/emit_start_size 整搬 src/os/linux/entry.cr(OS 轴首个文件)

* docs: 波 1 Task 2 评审遗留——entry.cr 头注耦合分类修正(g_call_main_pos 本文件写)+ sizes.cr 单源守护注补 entry.cr(H2 类)+ TODO #7 第二实例登记(活文件双源,结构性防护非删除)

* refactor: x86 实例化波 1 Task 3——frame.cr 抽取(帧公式双源合流单入口 + prologue/epilogue 函数化)

* refactor: x86 实例化波 1 Task 4——tag2l.cr 整搬(mw 族纯编码 + tag 表 owner 携行; frame↔tag2l 同轴双向引用裁定注记)

* docs: 波 1 Task 4 评审遗留——frame.cr pf_frame_overhead 预存双计显式注记(波 2 清, 无发射影响)+ sizes.cr tag2l 同源化声称软化(值一致尚未同源——e2_mw_jo 字面量 6)

* refactor: x86 实例化波 1 Task 5——callseq.cr 抽取(参数/栈/返回/调用序列五函数,SysV 三处同源合流)

* docs: TODO #8/#9 注册(波 1 Task 5 评审裁决)——前端 ≥18 形参静默误编译类(高优先级,含 7B 清理 runtime 覆盖收口条件)+ extern >6 int 参语义缺口(callseq.cr:45 指针落地)

* refactor: x86 实例化波 1 Task 6——syscall.cr 抽取(syscall3/4 内置体,Linux syscall 约定;扫描段留位加注)

* docs: TODO #10 注册(波 1 Task 6 评审 Important)——elf.cr 三处手写 syscall 序列(mmap/clone/exit,syscall1/5/6 形,格式轴内)OS 轴收编面,波 2/实例 B 前必办 + elf.cr 扫描段注补交叉引用

* test: x86 实例化波 1 收官 carry——syscall4 套件持久覆盖(tests/suite/syscall4_test.cr,os.cr wait4 r10 第四参径)

* refactor: x86 实例化波 1 收官——全量回归 + 自举重建 + syscall4 套件覆盖 + 文档同步(波 1 结构波完成)

* docs: 波 1 Task 7 评审修复——Task 6 提交哈希抄错修正(94d1ac15359→94d1cac15359 ×3)+ 清单八段化/elf.cr 锚点 877-886/构建脚本段注时态

* docs: 语言面收窄裁决定稿——定长数组「退役类型身份、保留表示提示」(A+B 融合,用户拍板)+ 宽度语言侧清理三项 + 交叉执行序(波 R1 收窄批 → R2 接口化主设计 → R3 映射侧与实例化波 2/3 合批)

* docs: TODO/README crasm 退役同步——专节标退役(原里程碑划销/保留备查)+ README 汇编层与语言面两行状态更正(对齐 docs/crasm.md 2026-09-05 已废弃状态行)

* docs: 语言面收窄 波 R1 实施计划定稿(plans/2026-09-10-language-surface-narrowing-r1.md)——五任务(定长注记/宽度死条目/词法面收窄/全局初始化修复/收官)+ 侦查证据链(root cause = 初始化缺失)+ 行为变化面与零变化判据

* docs: 语言面收窄 R1 Task 1——定长数组「表示层概念」注记(ast/checker/parser 七处,零行为改动;语义归处 = product/序列+长度约束/F11,语法保留为内联容量存储表示提示)

* docs: R1 计划 Task 3 改写——数字字面量「不支持 _ 分隔符」两编译器统一响亮报错(用户裁决 2026-09-10;消灭 1_000 静默 0)+ bootstrap 既有测试同步点

* docs: R1 计划补 diff 校验规范式样(Task 1 实现者实测:jj diff 默认 color-words 无 + 前缀 → grep 校验恒真空通过;ugrep 式样报错;fish noclobber)

* docs: R1 计划 Task 4 补边界——无初值切片 `[T]`(长度 0)不注入序言(保持 BSS 零=空切片;空切片解引用属独立 null 陷阱类)

* docs: R1 计划 Task 3 修正——lexer 诊断前缀是 `error: ` 非 `error[XX]`(实测 0xZZ),测试断言改为消息标记;Task 5 增登记「lexer 诊断前缀不一致 → 守卫 error[ 扫描面零覆盖」

* refactor: 语言面收窄 R1 Task 2——宽度死条目移除(ast.cr 77-86 token kind + W_* 值域,墓碑注释勿重编号)+ parser 两处死分支清理(lexer 从不发射,引用面归零)

* docs: R1 计划 Task 2 Step 4 判据精确化——墓碑注释自身含标识符字样,判据按「代码引用零命中」(实现者实测)

* docs: R1 计划 Task 5 收 Task 2 评审遗留(M1 parser 注释恢复 + M3 文档面随迁清单,含 numeric-migration-inventory:148 过时断言按实测修正)

* docs: R1 计划 Task 4 补 cir 缓存交互前置——函数命中缓存不走 ir_gen_func(注入点)+TODO #5 跨重建不失效 → 判据前必须清缓存并记录该交互

* fix: 语言面收窄 R1 Task 3——数字词法收窄(_ 分隔符与宽度后缀一律响亮报错:消灭 1_000 静默 0 误编译;bootstrap/self-hosted 双侧对齐;grammar + bootstrap 测试同步;新增词法对照测试)

* docs: R1 计划 Task 5 收 Task 3 评审 Minor 登记(诊断重复 4 遍 / 1._5 与 1. 边缘分歧 / 0x_ 措辞优先级)

* fix: 语言面收窄 R1 Task 4——全局初始化修复(聚合/非常量全局降级为 main 序言 IR 序列:alloc+逐元素存+写槽;解释器补标量常量初始化阶段)——修 139 崩溃与静默 0;同面另修三处根因:ELF 字段访问全局基址(e2_load_var 规约,原读栈垃圾)/解释器 callee 内联缺聚合族 opcode/callee 返回值暂存槽覆写首个全局;类型别名型聚合全局一并覆盖;新增双路径测试(15 例)

* docs: R1 计划 Task 5 收 Task 4 评审发现(枚举族 callee 内联缺口 Important / 嵌套别名一层解析 / 测试 clean_cache 返回码检查 / 报告措辞)

* docs: 语言面收窄 R1 收官——全量回归 11/11 + 自举全链 cmp IDENTICAL/N06=0 全绿 + spec/TODO/台账同步 + test_compile 清单陈旧路径修正(存在性断言)+ Task 2 遗留清账(parser 行尾注释 / 伪代码与盘点文档随迁,含 analysis.cr:895 行实测修正)

* docs: R1 计划收官修正——Step 2 自举口径(corec2/corec3 链在 src/ci/run.sh full-bootstrap,非 test_backend_bootstrap)+ 32 复选框补勾(Task 1-5 全执行)

* docs: R1 终审收尾——TODO #11 扩写为 callee 内联缺 18 opcode(枚举/裸指针/切片/边界检查族,含终审复现件)+ 全局初始化机制条补缓存交叉引用 + spec §1.3 括注与实现对齐(内联表示未兑现=R3)+ 测试 pid 后缀防并发互踩

* docs: 接口化主设计轮(R2)设计定稿——语义基座(类型=值集合/包含判定/穷尽性=补集空性)+ 双轴接口注册表(本质条目·横切接口·用户契约)+ 类型项层与语义子类型引擎 + 检查器四步迁移 + 五项能力落点(定长退役/泛型具体化/impl 重定义/穷尽性)+ .ccr TYPE·IFACE 载体段 + P0-P5 分期与判据 + 现状事实底座(含 2026-09-10 侦查 file:line)

* docs: R2 P0 实施计划定稿(plans/2026-09-10-r2-p0-type-engine.md)——五任务(类型项表+构造 API+自测通道 / NNF+DNF 规范化 / 判定引擎三态+原子互斥+μ memo+预算守卫 / 反例+穷尽性+递归参数化用例 / 收官)+ 清单三处注册 + checker 零改动与零产物变化判据

* docs: R2 P0 计划修缺陷——索引探针改 tt_mod 非负取模(i64 向零截断下负哈希得负下标 → 扩容后去重静默失效;Task 1 压力测试实证 grew.dedup_* 全灭)

* docs: R2 P0 计划补附加验证纪律(禁长 sleep / 同缺陷至多 2 轮迭代 / 计划代码非免检——负哈希取模越界实证)

* feat: R2 P0 Task 1——类型项表(DAG + 哈希去重)+ 构造 API + selftest-types 自测通道骨架(checker 零改动)

* docs: R2 P0 Task 1 收尾——计划三处修正(用例下限 MIN_CASES=5→Task 4 抬 32 / 扩容函数自持 type_terms.cr 不入 dyn_arr.cr 共享面 / 三条实现约定:键不含哈希·零初值 ready 位·无 XOR 用 FNV-1 加法)+ Task 4 增索引扩容守门用例 + TODO #14 登记(bootstrap 非字面量全局初值静默 0,实测确认)

* feat: R2 P0 Task 2——NNF(否定下推/De Morgan/双重否定)+ DNF 规范化(∩→∪ 分配律,两支全展开)+ 形态判定(is_literal/product_chain/dnf)+ 5 例规范化自测(10/10)

* docs: R2 P0 计划 Task 2 修分配律骨架缺陷(只展开一支 = 静默丢项;自测 norm.distributed 实证)

* feat: R2 P0 Task 3——语义包含判定引擎(三态 1/0/-1 + 原子类互斥公理 + 字面蕴含 + μ 展开代入 + 假设-判定 memo(预算耗尽结果不缓存)+ 预算守卫 + 可空/不相交/等价)+ 13 例判定自测(23/23)

* feat: R2 P0 Task 4——反例(witness = A\B 规范化项 + 可空过滤)+ 穷尽性(补集空性 + 遗漏 witness)+ 递归/参数化用例 + 索引扩容守门;修两处引擎缺陷:μ 展开须走 memo 入口(余归纳终止)、字面矛盾规则收窄(正×负异类不空——原版致 witness 恒 -1);MIN_CASES 抬至 32(38/38)

* docs: R2 P0 收官——spec §9 P0 标 ✅(落点/提交链/未覆盖面)+ TODO #15 登记(引擎落点 + 4 项未覆盖面 + 4 条实现期实证教训)

* fix: R2 P0 终审修复——3 Critical + 4 Important:① ¬P ⊆ ¬X 方向反(改 X ⊆ P)② memo 表满开放寻址死循环(装填因子守卫 + 重建重放 + 查找计预算)③ -1 被吞成 0 并污染缓存(字面蕴含上抛 + 预算重置清 memo + witness 区分 -1/-2)④ tt_is_dnf 不认 n≥3 析取 ⑤ AK_NAMED 不给确定答案(三态 + 未覆盖面置位)⑥ 规范化计入预算(2^n 爆炸可截断)⑦ ¬μ 不静默改写为 μ¬(保留字面);另修 grow_tt_index 定容未含「≥2×项数」(自测守门用例实证的重放死循环);用例 38→47(Critical/Important 各配回归例)

* fix: R2 P0 复审 Minor 收口——N1 预算重置连 memo 容量一并清(grow_ty_memo 早退致清空承诺失效)+ N2 预算窗口扫描守「exhausted⇒-1」不变量 + N3 补 witness/exhaust 的 -2 未知例 + N5 未覆盖面断言前显式重置 + N4 文档同步(spec 49 例 / TODO #15 三态与 -2 / 测试注释);用例 47→49

* docs: TODO #15 补未覆盖面⑥(memo 重建 × 进行中态无实测覆盖——复审 ⚠️ 登记)

* docs: R2 P1(影子对拍)实施计划定稿——桥接层(ti→类型项,N 不入身份)+ type_equal 包装(8 站点标注)+ 分类计数(AGREE/OLD_STRICTER/OLD_LOOSER/UNKNOWN)+ CLI 通道(两态产物逐字节不变)+ 三档语料差异清单 + 收官

* feat: R2 P1 Task 1——影子桥接层(checker ti → 引擎类型项,含 N 不入身份断言)

- src/compiler/ty_shadow.cr:sh_term_of_ti(ti → 引擎类型项)+ per-ti 缓存(16B/条
  开放寻址,装填因子守卫 + 重建重放 + 写回前重探)+ sh_tuple_to_product + sh_map_hits/entries
- 原生映射按**语义**逐项对应(TI_BOOL=2/TI_STR=3 vs AK_STRING=2/AK_BOOL=3 下标序不同——
  计划注释「前 7 项 1:1」不成立,按下标直通会 bool↔string 静默错标,守门用例 str_ak/bool_ak)
- TYP_TUPLE 实读布局:data=字段数、extra=g_gen_apply_data 起始下标(计划文的 g_tuple_* 不存在)
- 自测 49 → 67 例(桥接 16 例 + 扩容/重放 2 例);零行为变化(ptr_arith 产物与 R1 基线逐字节相同)
- 注册:_import.cr / build_selfhost_native.py(corec 清单,checker 段后)/ tests/selfhost/test_compile.py

* docs: R2 P1 计划修 3 处骨架缺陷——AK/TI 数值不 1:1(bool/str 下标互换,须语义分派)+ 桥接缓存须装填守卫/重放/回写前重探 + TYP_TUPLE 实读布局(data=字段数/extra=g_gen_apply_data 起始);并裁决 TY_DEX_S→AK_DEX、TYP_DYN 过宽近似→Task 3 单列

* docs: R2 P1 计划收 Task 1 评审 Minor(M1 native 分派改 get_type_data 显式比对 / M4 头注点明 AK-TI 下标互换)——并入 Task 2 落地

* docs: R2 P1 计划收 Task 1 评审完整版(M2/M3 转 Task 2 执行者 / M5 &T vs &mut T 差异 Task 3 单列 / M6 骨架代码补装填守卫·重放·无守卫重放版)

* feat: R2 P1 Task 2——影子判定挂点(type_equal 包装 + 8 站点)+ 分类计数 + CLI 通道(两态产物逐字节不变)

- checker.cr: type_equal → type_equal_core(6 处内部递归一并改名)+ 包装 type_equal
  (旧判定照常返回;--type-shadow 开时 sh_compare 只观察);8 个外部决策点各加
  sh_site_begin(id)(727/964/977/992/1232/1426/1818/2151,id ↔ 语义全表见 ty_shadow.cr 头注)
- ty_shadow.cr: sh_compare(三态分类:agree/old_stricter/old_looser/unknown,前后各
  ty_budget_reset(200000) 不污染)+ 256 槽差异环形缓冲(满则只计数)+ sh_report 摘要行
  + sh_dump_write 条目转储(TSV:site/t1/t2/old_ok/kind);头注点明 AK_* 与 TI_* 下标 2/3 互换
  (M4)并勘误骨架站点标签(3/8)
- ty_shadow.cr M1: sh_native_ak 改读类型表本体(kind==TYP_BASE 且 data==TY_* 码),
  消除「init_types 行号序恰与 TI_* 码序一致」的隐式依赖
- globals.cr: g_shadow_on/site/total/agree/old_stricter/old_looser/unknown + 环形缓冲 3 全局
- main.cr: --type-shadow / --type-shadow-dump 旗标 + sh_finish(check/build/cir/ccr/run 共用;
  check 路径实测生效);build_selfhost_native.py: corelsp 清单补引擎+影子层(否则 checker 引用悬空)
- 判据:OFF/ON 两态产物与 /tmp/r1t4_base_bin 三份 sha256 全等(95084e7b…d475);
  自测 67/67;回归 36/36 套件绿

* docs: R2 P1 计划收 Task 2 落地——站点表实读修正(无 match 路径/6 不可达/8=EXPR_ASSIGN)/ Task 3 未知桶拆两因(不可翻译 vs 引擎 -1)/ Task 4b 挂账清零(M4 注释与 corelsp 清单、>1024 重建用例、既有 @inline rc=139 登记)

* test: R2 P1 Task 2 评审补强——M2 ptr class 断言 + M3 native 分派全表覆盖(row 7 dyn 陷阱守门)

Task 1 评审补强项(M2/M3)落地到 type_selftest.cr(M1 已在 844cec6 落地):

- M2: bridge.ptr_ak —— TYP_PTR 整支 class 断言(原 bridge.ptr_inner 只断参数链,
  整支误译成 AK_SEQUENCE/AK_REF 也会绿;对照 bridge.ref_inner 已断 class)
- M3: native 分派(kind==TYP_BASE 且 data==TY_* → sh_base_ak)全表覆盖,M1 后是主路径
  且此前零用例:
  · bridge.native_row_table —— 行 0..7 逐行对照 data 语义 → AK(含 bool↔str 不互换),不抽样
  · bridge.native_dyn_kind_branch —— **row 7 陷阱守门**:TI_DYN 行 kind=TYP_DYN 但
    data=0(== TY_INT)→ 断言 sh_native_ak(TI_DYN) == -1(先判 kind 后比 data 才是对的,
    先比 data 会把 dyn 静默译成 AK_INT)且项本身 = AK_DYN
  · bridge.native_dex_s —— TY_DEX_S 占位行(row 8)M1 后走 native 路径,两侧同 = AK_DEX
- 负控实证(/tmp 副本,非仓库文件):把 sh_native_ak 改成 data-first 后重建 → 14 例红
  (含 bridge.dyn_ak 得 0=AK_INT、native_dyn_kind_branch、native_row_table)→ 守门用例
  具备判别力,不是恒绿
- 判据复跑(新编译器):selftest 71/71;OFF-IDENTICAL / ON-IDENTICAL;
  tests/suite 31 程序两态扫 27/27 IDENT(4 SKIP = 2 既有 @inline rc=139 + 2 预期失败 fixture)
- 三二进制哈希:corec 77d20bb2…c420 / corearch、corelsp 同前次(注释与测试增量,零 codegen 影响)

* docs: R2 P1 Task 2 评审落地——Task 3 增 Step 0(未知桶拆两因,先改码再采数)+ Task 4b 更新(核销①/补 type_terms.cr:73 陈旧注/站点 4 恒 agree 限制)+ TODO #16 登记(嵌套 fn 声明 rc=139,最小复现与两版归属证据)

* docs: R2 P1 Task 3——影子对拍差异清单(三档语料计数 + 分类样本 + 归因与裁决建议)+ Step 0 未知桶拆两因(kind=3 桥接缺口 / kind=0 引擎负值,摘要增拆因子段与站点直方图)

* docs: R2 P1 Task 4 收官清单(Step 4c)——Task 3 评审 4 Minor(findings 精度/5 字段/关态开销注释+早退/kind 名)+ 5 条 TODO 登记(F1 P2 硬前置/F2 裁决/F3/F4/仓库卫生)+ harness git 拦截缺口登记

* docs: R2 P1 Task 4 收官——全回归 14 套件绿(selftest-types 71→72:第二次重建守门用例 + 负控有牙)+ 两态逐字节 IDENTICAL(build/check 双路径,sha256 95084e7b…d475)+ 自举 CMP_IDENTICAL/N06=0/冒烟 42;Task 3 评审 4 Minor 收口(M1 findings 精度 + 2 行未提交哈希修正核实/M2「前 6 字段」→「前 5 组 key=value」3 处/M3 sh_site_begin 关态早退 + 注释如实改写/M4 dump kind 名 unknown_engine 须知)+ 5 条 TODO 登记(F1 P2 硬前置/F2 裁决/F3 checker.cr:1053/F4 泛型后续形参/仓库卫生)+ harness 缺口登记(block-git 复合命令可绕过,只登记未改)+ Step 4b(type_terms.cr:73 陈旧注更正/corelsp 自 Task 2 起必链引擎层)+ spec §9 P1 ✅ 落点 + TODO #17(开关默认值与产物影响/裁决归属)

* docs: R2 P1 终审 4 Minor 收口——M-1 站点 6 去留裁决(保留挂点待 P2:落 TODO #17 + findings §8)/ M-2 findings §10 复现注释 71→72(+Task 3 时点说明)/ M-3 §3.1 加「Task 3 时点」注(自指语料漂移量化:main.cr 3964→3967、_import.cr 3844→3847、ccr_io.cr 4177→4180,Task 4 实测;非自指档抽检不变)/ M-4 globals.cr + ty_shadow.cr「关时连读都不发生」限定为「除 g_shadow_on 自身外」(M3 早退后的事实);复验 = 三 guard clean + selftest-types 72/72 + 两态 OFF/ON 与基线逐字节同(sha256 95084e7b…d475)

* docs: R2 P2a(逐点替换批 a)实施计划定稿——F1 同名 TYP_NAMED 建表去重(用户裁决:根治)+ F2 数组长度转常量档长度约束(用户裁决:不留静默缺口)+ type_equal 判定替换(legacy 保留对拍)+ 对拍复跑差异归零/站点覆盖同报;P2b(iface 查表 + res_type_node 合一)另立

* feat: R2 P2a Task 1(F1)——同名 TYP_NAMED 建表去重(唯一分配点 + 侧表守卫/重放/重探;读取点读名字故语义不变)

* docs: R2 P2a 计划收 Task 1 落地——用例数回填 77 + Task 3 增三条必测项(同名泛型应用跨站点探针 C-1 / 自指语料 .ccr 实测 C-5 / unknown 计数与站点覆盖同报)

* docs: R2 P2a 计划收 Task 1 评审——Task 3 增负控(同名不同实参不得判等)+ 管线内断言(C-4);Task 4 增登记(.ccr 与 cir 缓存态相关,判据前必须 clean-cache)

* docs: R2 P2a Task 1 评审 3 Minor 收口(纯注释)——C-3① named_dedup_reset 可达性纠错(reset_frontend_state→check_all 每请求 + 长驻进程 str_intern 下标稳定 ⇒ 删之即静默错型,非「不可达防御」)/ C-3② 负键分支理由改写(bump 不置零 → 任意 ti,非特指 ti=0)/ ③ probe 注释 ret→slot 对齐

* feat: R2 P2a Task 2(F2)——数组长度 N 迁为常量档长度约束(身份去 N,拒绝语义保持:异长仍报错、不静默通过)

实现:① type_equal_core 的 TYP_ARRAY 分支去 N(身份与引擎面一致:桥接 AK_SEQUENCE 参数链不含 N);② 新增具名约束 array_len_constraint_ok(沿结构对应位置下钻:数组元素/指针/引用/切片/元组字段/泛型实参——N 不在顶层位也拦住);③ 8 个判定点经 type_compat_strict(身份 ∧ 长度约束)显式补检,-1(长度约束违反)走专属措辞(码不变:TF01/TA01/TC02 门语义不动),type_equal 调用次数/位置不变(影子站点采样面保持可比)。判据:selftest-types 85/85;ELF-IDENTICAL(95084e7b…d475);.ccr 冷缓存三语料 IDENTICAL;P1 语料影子对拍 agree=100%(含自指 main.cr 4029 判定、old_stricter=0);探针 D/G 形态复现:异长报 error[TF01]「Array length constraint not satisfied」、同长通过。

* docs: R2 P2a 计划收 Task 2 评审——Task 3 增两条硬性(N 面验收由行为探针承担:F2 后影子对 N 失明 / N 不得回身份);Task 4 增自指 .ccr 冷缓存对比 + M2 用例

* docs: R2 P2a Task 2 评审 M1 收口(纯注释)——array_len_constraint_ok 头注「同形」限定:仅指递归位覆盖、非比较项相同(REF 的 extra/mut 与 TUPLE/APPLY 元数·基型行号归身份面、约束有意不重复;PTR 的 extra/asp 身份亦不比 = 反向不对称)

* feat: R2 P2a Task 3——type_equal 判定替换(快路径 + 引擎语义判定;未知回落 legacy 并计数,不静默)+ 对拍复跑差异归零 + 站点覆盖同报

- checker.cr:type_equal 判定权移交引擎(type_equal_engine = 快路径 t1==t2 / 桥接 sh_term_of_ti /
  ty_equiv 三态 / unknown 与桥接失败回落 legacy 并分列计数);旧实现保留为 type_equal_legacy
  (影子对照物 + 回落实现,数组分支 Task 2 起 N-free,P5 删);type_equal = 判定入口 + 影子包装
  (对照物切 legacy);array_len_constraint_ok 仍是长度面唯一判定点(8 站点全经 type_compat_strict)。
- globals.cr:g_replace_unknown / g_replace_bridge(init_types 归零,与行号空间同生命周期)。
- ty_shadow.cr:影子分类语义 = 引擎 vs legacy(替换门);[type-shadow] 摘要行尾追加两回落计数。
- main.cr + checker.cr:C-4 管线内断言 --verify-named-dedup(侧表↔res_type_node 三组检查,默认关)。
- type_selftest.cr:+3 用例(88/88)= N 不回身份 / unknown 回落计数 / 桥接回落计数。
- tests/selfhost/test_named_dedup.py:C-4 断言常驻判据。

判据:ELF 逐字节 95084e7b…d475 IDENTICAL(开/关两态)· 对拍 71 文件 24796/24796 agree
(old_stricter/old_looser/unknown/replace_* 全 0;站点 1/2/4/6 零命中同报)· 全回归 23 套件 rc=0 ·
自举 corec2/corec3 CMP_IDENTICAL + N06=0 + 冒烟 42 · .ccr 4 语料(含自指 main.cr)IDENTICAL · 收紧清单空。

* test: R2 P2a Task 4 收官——M2 用例(REF/SLICE 下钻位 + 站点 0/-1 措辞分派,双负控突变有牙)+ 自指 .ccr 冷缓存直接采样 + F1/F2 划销与 P2a 落地登记(含 F5/opt.cr:177 + .ccr 缓存态同族)

* fix: R2 P2a 终审 Critical——桥接缓存随类型表重置失效(长驻进程行号复用致两个不同类型被判等,静默漏报)

机制(本批引入):Task 3 让判定路径**无条件**调 sh_term_of_ti(此前仅 --type-shadow 下),而
init_types() 只清类型表 + named_dedup 侧表、未清桥接缓存(key = ti 本体)⇒ corelsp 每请求
reset_frontend_state → check_all → init_types 复用行号时,陈旧 ti→term 命中即返回 = 不同类型判等。
评审实证:同 URI 两次 didOpen(只换 a 的元素型 int→bool)→ 第二次 diagnostics=0(应 1 条)。

- ty_shadow.cr:新增 sh_map_reset()(cap/entries/hits 归零,惰性重建;同 named_dedup_reset 先例);
  头注失真更正——「--type-shadow 关时除 g_shadow_on 外连读都不发生」自 Task 3 起不成立,
  改写为「只观察 = 不写 checker 判定状态/不改判定结果/不写产物,非零写入」+ 缓存失效契约。
- checker.cr:init_types() 调 sh_map_reset()。
- type_selftest.cr:+2 用例(95/95)= t3c.map_reset_clears_bridge(计数)/ t3c.no_stale_term_after_reset
  (行为:行号复用不得返回陈旧项,元素 AK int→bool)。
- tests/selfhost/test_lsp.py:+test_double_open_bridge_cache_reset(TESTS 第 10 项)。
- TODO.md §24:Critical 修复记录 + 同族清偿登记(桥接缓存 + type_equal_legacy = 调试结构进生产路径,
  P5 前清偿)+ F2 4/6 下钻位缺突变控制 → 覆盖清单;「3 处」更正为 5 个文件、「23 套件」改称已跑集。

负控(修复前必红):LSP 用例在修复前二进制上 lsp suite: FAIL (1/10)(仅新用例红,V2 diagnostics=[]);
自测用例突变控制(副本删 sh_map_reset 调用)93/95、两例 FAIL。
复验:selftest-types 95/95 · ELF 开/关逐字节 95084e7b…d475 · .ccr 4 语料(含自指 main.cr)IDENTICAL ·
自举 CMP_IDENTICAL + N06=0 + 冒烟 42 · 全仓 38 套件 rc=0(含 test_lsp 10/10)· 对拍 71 文件
24853/24853(T1-T3)全五档 27046/27046 agree,old_stricter/old_looser/unknown/replace_* 全 0。

* docs: 语义安全路线图 + 9 份设计 spec 起草完成(用户裁决:全部起草;S-B 一族一份)——共享契约(7 属性轴 + 义务四档 + 确定性轴族/不确定性=显式请求 + policy 即数据 + 三类不可消)+ S-A 基础设施(含 C1-C4 规范性约定:单调展开/属性写右侧/⊥ 非真/双负控)+ 五族策略(注入/授权/信息流/围栏/状态版本)+ S-C 性能无实现承诺 + S-D 解释·预测·增量 + S-E 汇合语义(四形态图级定义 + 物理⇏语义降级义务 + select 重定);含跨 spec 交叉检查(S-B1→S-A 健全性约定、S-B5/S-E 独立互证 extern 效应无保证序通道)

* docs: 效应/纯度修正实施计划(P0 插队批)——真纯度计算(保守起点+调用图不动点+SCC 保守)替换乐观常量 + state 链分类表补全(IR_CALL_EXTERN + spawn/yield/hotpatch/dyn_dispatch)+ 判据重定(边集语义断言取代 .ccr 字节同旧);关键决策 = lazy 判定解耦(保住 ELF 逐字节不变判据)

* docs: 语义安全 9 spec 收敛轮(用户裁决 ★10 全照推荐 + 两簇评审 findings 全收)——A 簇: 轴真源 D1/放行声明统一 schema D2/新增 C5 非退化性(右项非 ⊤ + 正例非 ⊥ + 假 unknown 分因)/装载期校验 D6/效应清单唯一 D7 + 8 Minor; B 簇: 成本模型五字段 D4/纯度事实前提改写(标为前置缺陷并指向修复批)/汇合点收窄为跨执行流 + 负控 D10/deadline 仅诊断 D8/S-D3 判据可达化 + D_effect join 三值/边界=合法显式源 D19 + 6 Minor

* feat: 效应纯度修正 Task 1——真纯度计算(全程序 IR 面 + 调用图不动点 + SCC 保守)替换乐观常量;state 链迁至 IR 生成后重建(lazy 判定冻结保发射面)

- checker.cr: compute_all_purity(store 族/效应 opcode/传递闭包/SCC 保守不动点;
  不可解析调用与 unsafe 区判不纯)+ src_func_of_ir/df_func_of_node/fi_ispure_of
- dataflow.cr: df_create_node/sg_pop 的链连接迁至 df_replay_state_chain(成品图重放,
  循环终止规则整块复刻);df_state_finalize = 真纯度 + 链重建(两个管线调用点)
- 泛型:实例由自身体算 + 源 = 实例合取(monomorph 登记 g_purity_inst 侧表;
  brief 的继承写入在该时点会抄到乐观默认值,会把有效应实例错标纯)
- lazy 判定与其输入(checker 乐观默认,IR 生成期)原样冻结 ⇒ 发射面逐字节不动
- cir 缓存版本 14→15(快照不再含链边,旧快照 + 重放 = 重复边)
- 新自测通道 selftest-purity(纯度 13 例 + 链语义 4 例)+ tests/selfhost/test_purity.py
- test_compile.py 源清单补新文件(清单漂移 = resolver Undefined name)+ 构建清单同步

* docs: 语义安全 spec 收敛批 v3(第二轮闭环,A+B 两线全部遗留收口)——A 线: N1 未声明面限定「已声明域内声明不完整」/ N2 §3.1 schema 补第四族(S-B4 kind=mint)+ 四族填法 / N3 integrity 首消费方改「暂无对侧确认(登记)」/ N5 族级例外限定 + ⚠️2 declassify 通道=kind 投影; B 线: N1 Critical 汇合判据改锚语义(前驱间无依赖路径 ∧ 各自可达并发/边界根——原 region 身份判据经实测恒假、执法空过)+ 非空断言 + §4.2 现状断言改正 / N2 本地编号统一 L<n> + 路线图 §4 编号对照表 / N3 S-C 切片靶对象重定(循环不变纯节点;实证 thunk 双路 eager 直通 ⇒ 「≥2 次使用」无收益)/ N4 S-D4 与 S-A D_external 来源列对齐 / N5-N8(返回面/可观测面收窄/清单唯一口径/v7 段位); 纯度事实回填指引留待在飞批 Task 4

* feat: 效应纯度修正 Task 2——state 链分类表补全(单一真源 = purity_op_effect;D7 效应清单收敛为一份)——df_connect_state 的 opcode 级判定改调 purity_op_effect,一并覆盖计划五 opcode(IR_CALL_EXTERN/SPAWN/YIELD/HOTPATCH_ROUTE/DYN_DISPATCH)+ 只进了纯度侧的 IR_STORE_PTR(裸指针写)与 IR_AWAIT(spawn 同步);载荷级区分经核不需要(分类按 opcode,s1 不参与);selftest-purity 17→26 例(红态 3 例精确失败 extern/spawn/yield:touch 0 vs 3)——验收例 effect 双调全入链 / pure_add 零入链;判据 selftest-types 95/95 · test_purity PASS · test_ccr_v7 24/24 未重锁 · test_compile PASS · ELF 逐字节 95084e7b…d475 IDENTICAL(发射面零泄漏)

* test: 效应纯度修正 Task 3——判据重定(边集语义断言取代 .ccr 字节同旧)+ test_ccr_v7 期望表实测未变不重锁 + TODO 判据条目

- 期望表重锁判据 = **实测**:clean-cache + corec ccr PROBE_SRC → V7File 解码 → data 41/state 13 逐集合 == EXPECT_DATA/EXPECT_STATE(相等 True),源码域内唯一 IR_CALL = node 35 pure_add 且 kind=1 入边 = 0 ⇒ Task 1 预测成立 → **不重锁、不改表**(只加注释说明)。
- 新增边集语义断言三条(各带正/负控,全部 .ccr 层——判据的产物面):
  ① 可证纯调用(pure_add + 泛型纯实例 id[int])⇒ 无 kind=1 入边;负控 = 同文件 effect 调用必有入边;
  ② 效应调用四类(store 体 / extern / 不可解析 builtin load64 / 间接 IR_DYN_DISPATCH)⇒ 必有 kind=1 入边;负控 = 同文件 pure_add 无入边;
  ③ 每函数链独立(全文件 kind=1 边零跨函数 + 非退化守卫:329 条链边 / 15 函数);负控 = byte mutation(main 内一条 kind=1 边 to_nod 改写到后一函数区间,保前向不变量)→ 同判据函数必须报出恰好该违规([] → [(f,t')])。
- 咬合实证(/tmp/corec2 = Task 1 前编译器,同 fixture 同谓词):① RED(id[int] 被链指入,入边 [32]——monomorph 未写 fi_ispure 读 0 的既有缺陷面);② RED(effect/extern/dyn_dispatch 三类无入边;load64 当时已保守入链);③ 旧产物亦零跨函数(该性质无历史 RED,咬合由 byte mutation 控制承担)。当前编译器三条全 GREEN。
- TODO.md 新增 #26 判据条目:state 边/纯度类改动判据 = 语义零变化 + 边集语义断言 + 自举稳定(连续两次编译产物一致);旧「.ccr 逐字节同旧版」退役;产物变更清单(.ccr NOD/EDG + --dump-objects + .cir 缓存)+ clean-cache 要求;ELF 逐字节不变仍有效(lazy 解耦)

* docs: 效应/纯度修正批 Task 4 收官——全量回归 38/38 rc=0 + 语料级旧前端/当前 ELF 逐字节 20/20 同(ISO 发射面零泄漏)+ canary 95084e7b…d475 IDENTICAL + 自举两连建产物一致 + corec2b/corec3b cmp IDENTICAL + N06=0 + 冒烟 42;.ccr 变更面实测 = 仅 chain(kind=1)边增删(NOD 语义字段零差异、STR/SYM/ENT/REG 逐字节不变;CHAIN_SRC 303→329 / ptr_arith 293→318 / 无效应程序 +24 全来自 runtime 闭包);TODO 新增 #27 落地登记(fi_ispure 真计算 + purity_op_effect 单一真源;链覆盖 = 函数内全部保守效应 + 不可解析/未证纯调用;残余 = lazy 判定冻结 + use_count 时序缺陷保持独立)+「控制流自动惰性」行号复核 + auto-memo 补 IR_DYN_DISPATCH 间接调用入链注;五份 spec 纯度回填(S-A/S-C/S-D/S-E/S-B5:缺陷标记改已修 + commit ids + 链覆盖范围 + 残余限定;S-C 首切片门禁与 §2.2 C2 加时点约束、S-E 判据 (a) 前提改「已满足」+ 残余三条 + N6 重述、S-D §1.7.1 硬约束 8 与 S-B5 §1.2 事实底座相应修订)

* docs: Task 4 回填补遗——S-C 两处残留「今日取保守条款」措辞改真纯度事实(§1 表来源列 + §2.1 合法性行;时点约束指向 §2.2 C2)

* fix: TODO #8 ≥18 形参静默误编译——根源 = FuncInfo.param_types 16 槽定长内嵌槽区(16→144=return_type)而 parser/monomorph 写入无界:第 17 槽踩 return_type、第 18 槽踩 ast_node,形参类型值 TY_INT=0 恰把 ast_node 写成节点表首项(实测 rt.cr:4:13 的 int 类型节点)⇒ checker 读 fi_ast_node=0 发 TF01 误归 + .ccr name_idx=0(import)/param_count=0 + IR 体丢失(46→28 instrs)而 corec build 仍 rc=0、产物 SIGSEGV 139(N=17 因 TY_INT=0 误打正着而通过——钳位最小实验单独证明因果);修复 = 槽区扩至 MAX_FN_PARAMS=64(对齐 ast.cr 镜像 [int;64],覆盖 ≥22 = 6 寄存器参 + 16 栈参的 >127B 栈清理形)+ fi_param_type/fi_set_param_type 槽区护栏(唯一写点受护,未来调用点不可能再越界写)+ 超限签名 P020 硬错 rc=1(绝不静默 rc=0);回归 tests/selfhost/test_params_limit.py(N=17/18 逐值 + 22/64 逐参校验 + 65 拒绝且无产物)+ tests/suite/params_many.cr(22 参 = add rsp,0x80 128B 栈清理形 runtime 覆盖——Task 5 Minor 4 收口)+ src/ci/run.sh selfhost-tests 挂钩;既存 red 划界:check src/compiler 两条 TF01 系 ty_shadow.cr:118 记载的 loop-落空既有误报(lits_copy/ty_memo_slot_no_grow,形参 ≤2 在边界外)——判据 selftest-types 95/95 · test_compile PASS · test_purity PASS · test_ccr_v7 24/24 未重锁 · ELF 逐字节 95084e7b…d475 IDENTICAL(发射面零泄漏)

* fix: TODO #25 F5 元组槽位——parser 元组分支改两趟(先全部解析元素值、后统建连续 wrapper:EXPR_TUPLE 契约 a=首 wrapper/b=个数,wrapper.a=元素值节点),修正 TODO「照 struct 先例」的交错顺序实测不成立(交错下相邻 wrapper 间插着下一值子树:P{a:11,b:g()} 误返 0);消费点 4 处同步解引用(checker/ir_gen/monomorph 克隆改先值后连续 wrapper/opt),并校正 opt.cr 与 ir_gen ast_patch_node 的 a/b 槽约定(两处经核无调用者=死码);第二根因:checker EXPR_TUPLE 元素类型两趟落盘(data_start 曾在推断循环前取,嵌套元素推断向 g_gen_apply_data 追加数据顶开后续落点、extra 错位 → 嵌套元组异型互赋静默通过);探针 14 例(3 主判据 + 边界 3 + 嵌套 4 + IR/ELF 冒烟)入 tests/selfhost/test_tuple_slots.py + run.sh selfhost-tests;判据 selftest-types 95/95 · test_compile/test_purity PASS · test_ccr_v7 24/24 · ELF 逐字节 95084e7b…d475 IDENTICAL · .ccr 同哈希(AST 布局零泄漏,ptr_arith 无元组字面量)· 泛型实例化与 suite 回归绿;同族**未修**登记 = struct 字面量复合值误编译 + ARRAY 复合元素误读([[1,2],[3,4]] vs [5,6] 静默接受)

* fix: TODO #8 评审 Important 收口——CIR_CACHE_VER 15→16(修复前 ≥18 形参函数的坏 IR 已被写入 .cir 快照;缓存键 = 源路径::函数名 + 纯 AST 指纹,不含编译器身份 ⇒ 同源文件修复前后指纹相同,旧快照会被命中并把坏 IR 原样复活成活产物 rc=0——正是本修复要消灭的静默类;bump 使旧条目整体失效,cache miss = 无害重建。键缺编译器身份的根因仍归 TODO #5 另单);判据 selftest-types 95/95 · ELF 95084e7b…d475 IDENTICAL · params_many 冷/暖产物 IDENTICAL + rc=0

* docs: TODO #8/#25 收口登记——#8 根因(16 槽内嵌槽区越界写)+ 修复(MAX_FN_PARAMS=64/护栏/P020)+ 阈值重定说明 + 缓存面;#25 两趟修法(推翻 TODO 原建议,附实测反证)+ 第二根因 + 同族未修三项转条目

* docs: 语义安全 spec 收敛批 v3 复核收口——改名误伤 8 处(S-D 六处 L7/L17/L10/L8/L25/D12 + S-B1 §6 判据 D4 + S-B3 两处 L7 指向不存在或错误的决定;均按 roadmap §4 对照表改正)+ 路线图 标题/正文 八份→九份(其余 8 份)+ 裸评审编号补线别前缀(B 线 I3/I4/I5/N4 等);来源 = safety-verify-v3-2 复核的单一阻断项,收敛批 v3 自身引入的失效模式

* fix: TODO #16 函数体内嵌套 fn 声明编译段错误——根因 = parse_primary 无 T_FN 分支,语句位遇嵌套 fn 落回通用兜底「Unexpected token in expression」只消费 fn 一个 token ⇒ 解析失步:内层返回类型 + 函数体花括号(int 后随 {)被当作 struct 字面量(IDENT + {)解析、把外层 } 当字段吃掉直至 EOF,而该字段循环只认 } 且 advance_tok 在 EOF 是空操作(parser.cr:24-28)⇒ 自旋每轮 ast_alloc 直至 bump allocator 触顶(g_ast_cap 0x400000 节点 × ESZ_ASTNODE 72 = 288MB)→ rt.s .Lalloc_oom 返回 NULL → grow_ast/_dyncpy rep movsb 向 NULL 拷贝 ⇒ rc=139(gdb 实测崩点 = grow_ast 内 rep movsb、rdi=0x0 目的地 NULL、rcx=0x12000000=288MB 拷贝量;编译日志止于 [3/5] parse,与 TODO 记载一致;A/B 用 /tmp 构造的修复前二进制独立复现 139);语言面判定 = 嵌套 fn 不属语言面:grammar/core.ebnf Statement 不含 FunctionDecl(函数声明仅 TopLevelDecl)、bootstrap 参考实现(parser.py parse_block 已带 EOF 护栏)同输入报 SyntaxError 2:6 Unexpected token: fn、docs/spec-design.md 实现层函数值/闭包按 YAGNI 挂起、checker/ir_gen/monomorph 无任何嵌套函数注册路径 ⇒ 正确修复 = 定位诊断拒绝而非「支持」,TODO 原文「判据 = 最小复现 rc=0」的前提不成立(裁决与依据记入 tests 文件头与 run.sh 注释);修复 = ①parser.parse_stmt 语句位遇 fn/flow(含 pub 前缀)报 error[P21](ast.cr EC_P_NESTED_FN=1021,格式与 P020 同族)+ skip_nested_fn 花括号配平整段跳过(从函数体 { 起算 depth、体内嵌套块/struct 字面量成对计入;= expr; 与 extern 无体形式遇分号收尾)⇒ 后续语句恢复解析不再失步 ②同族 6 处只认 } 的循环补 EOF 护栏(parse_primary struct 字面量字段循环 = 实际自旋点 · parse_pattern struct 模式 · parse_declaration 的 struct/enum/interface/impl 体循环)③run.sh selfhost-tests 挂钩 test_nested_fn.py(沿 params_limit/tuple_slots 惯例)、run_suite 的 mini* SKIP 注释改记负例性质(at_test_mini4/6 = 嵌套 fn,5 = 扁平正例已在套件);A/B 实测(同源双二进制对拍):嵌套 fn 最小件 139→rc=1 + error[P21] + --> 2:5 定位、5 例嵌套变体(@inline 调用形/pub/双层/后续语句/无 @inline)全 rc=1、4 例 EOF 失步探针(struct 字面量开括号/带 token、未闭合 if、未闭合 fn 体)139→rc=1、check/run/build/cir/ccr 五命令齐 rc=1 且无产物(绝不静默);判据:build_selfhost_native rc=0 · selftest-types 95/95 · test_compile/test_purity PASS · test_ccr_v7 27/27 · test_nested_fn 17/17 · params_limit 5/5 · tuple_slots 14/14 · suite 21 pass/0 fail(mini* 9 例按既有 SKIP)· ELF 逐字节 95084e7b…d475 IDENTICAL(clean-cache 后 ptr_arith)· 扁平对照 build rc=0 + 运行 exit 2 正确;残留登记(非本次引入):EOF 失步恢复期重复打印无定位 parse error(有界 ≤64 条、毫秒级、rc=1,属既有解析错误报告面)+ docs/error-codes.md 表止于 P019(P020/P021 未登记,沿前次同类修复惯例)

* docs: TODO #16 收口 + 错误码登记——嵌套 fn 根因(parse_primary 无 T_FN ⇒ 解析失步 ⇒ bump allocator 耗尽 ⇒ rep movsb 向 NULL 拷,gdb rdi=0/rcx=288MB)+ 结局判定(不属语言面 ⇒ P021 定位拒绝 rc=1,推翻 TODO 原文 rc=0 前提)+ EOF 护栏 6 处;error-codes 表补 P020/P021(表尾计数 P001–P019→…
* docs: 核心维护文档重组落地——分类树(28 归位)+ README 索引 + onboarding/testing 手册 + editor-setup 拆分 + ADR-0001~0004 + 三范本重写(合树重建)

* docs: proposals/ 存量校准——8 份状态头对照实现(active/partial/proposal)+ 实现与测试指向

* docs: language/design 退役同步校准——syntax/learning-path/spec-design/regalloc 的 .corespec 引用改指 .cr 内联 + ADR-0001

* docs: 残留校准收尾——z-vision/probabilistic 的 .corespec 引用改指退役后形态(全树仅剩合规叙述)

* docs: active 文档树 emoji 状态标记清理(✅❌⚠ 换 [ok]/[fail]/[注意];ASCII 图线与 ✓✗ 排版符号保留)

* docs: 存储语义拆四份——memory-model 总览/cache-semantics 七条权威/existence-structure v6 承载/region-model 经典映射(全引用更新指向)

* docs: 目录按受众重建——developer/maintainer(design+adr+proposals)/academic + 顶层导航(链接全量修复+README 重写)

* docs: pointer-model 重写——三 pass 与实现对齐(Andersen 约束/alloc 位图/逃逸三点/双路径边界)+ 受众定位维护者

* docs: regalloc-cache-mapping 重写——v6 对齐(ENT 区间/home/sweep)+ 两线实现状态(develop 朴素 LS vs v6 分支 CAG)+ 判定四条/CAG 定案保留

* docs: 规约语法定稿 #check/#ensure——syntax 第十章/语法示例统一 + tutorial 警示框修正(未实现实情)+ spec-design 管线一致化(.csp 退役)/链接修复

* docs: ir-op-semantics 目标修订——int 无上限定稿注记(编码层投影视角)/v6 NOD/规约语法定稿;契约表体保持(活对照表,重写风险>收益)

* docs: dataflow-design 留档范围标注——§8 环语义标注仍权威(条款 4b 出处),§1-7 早期稿;链接路径修复

* docs: at-intrinsics 受众改开发者 + @fast 语义对齐(性能提示零变化,apx 才是精度授权)

* docs: errors.md 真源声明——ast.cr EC_* 为码真源,L 族(词法)例外注记(消息文本真源,码为文档侧)

* docs: 收尾批——glossary/z-vision/project-book 正文路径更新 + 全库链接真实相对化(修 docs/ 前缀系统性错误)+ editors/corelsp 互链核验

* docs: tutorial 去 .crasm 残留(改 HIT/unsafe + 决策链接)+ z-vision 条款指向修正(cache-semantics 为七条家)

* docs: academic/lattice-theory.md 提炼(v4 定稿:三层映射/规则封闭对象开放/无格承诺/范式映射表)+ spec-design 双受众标注 + README 索引

* docs: tutorial 开发者调性重写——去内部机制术语(region/pass/provenance → 图模型直觉),保留深入链接

* docs: 受众声明与目录统一(developer 目录=开发者/academic=学术,verifier-kernel/cache-semantics 补兼维护者)

* docs: z-vision 补定位头注(受众=所有读者)

* docs: ADR 补全 0005-0015——git 历史决策事件系统化(内存分层/缓存语义/图锚定区域/region 化/规约 v2/dex-apx/平台桥/int 无上限/类型方向/惰性下沉/HIT)

* docs: ADR 更早期补全 0016-0018——arena 模型/并发 GMP 定稿/仓库治理(历史最早段扫描,早期为编码修复无独立决策)

* docs: ADR 补全 0019-0020(自举路线启动/IR 双形态)+ ADR-0004 日期修正(拆分实为 2026-05-28,历史全扫发现)

* docs: developer/ 深化首批——quickstart/concepts/examples/faq 新建(新手完整体验入口),README 索引更新

* docs: CLAUDE.md 与受众树同步——设计文档列表按 developer/maintainer/academic 重写 + .corespec 退役措辞修正

* docs: 交叉引用错位修复——execution-model 重写后 §5.x 旧节号改新章节(§一/§三)+ 数处旧路径

* docs: syntax 关键字计数修正 37→36(与 lexer.cr lookup_keyword 逐词核对一致)

* docs: syntax 头部开发者化——三层映射理论表移除(链 concepts.md),provenance/pass/hw-map 内部词清除,probabilistic 删

* docs: syntax 正文 checker/provenance 内部词改开发者表述

* docs: syntax hw-map 内部词清理(机器形状表述目标平台化)

* docs: syntax 补复合赋值(+= -= *= /=)——记号表与优先级表(实现支持,文档遗漏;%= 不支持已注明)

* docs: syntax 补 =>(match 臂)与变参(...name:Type)记号——lexer/parser 支持而文档遗漏的真实缺口

* docs: syntax 切片类型注记——2026-09-01 语法定稿为准,运行时 high 界完整化按 TODO 推进(计划优先表述)

* docs: concepts 分篇四篇(graph/memory/deploy/spec)+ 入口改索引 + examples 扩 tests/suite 索引(内容创作深化)

* docs: README 规则补判据层级(计划优先代码兜底)+ 演进义务声明——开发者文档迭代机制落位

* docs: onboarding 铁律段改人类视角——澄清铁律为 AI 会话规则,人类维护者遵守仓库协作约定(人机一致项保留)

* docs: 铁律受众混淆清理(3 处)——ADR/testing/FAQ 改人类视角(CPU 限速=AI 会话规则,人类建议非必须)

* docs: 维护文档重组 Task 9 总验收——陈旧交叉引用 95 处(29 文件)修复至最终布局(docs/design→docs/maintainer/design、docs/language→docs/developer、docs/adr→docs/maintainer/adr、glossary/at-intrinsics/verifier-kernel 实际落位)+ 根 README/TODO 同步 + README 索引回填(archive 4 份/ir-schema/verifier/coq/concepts 分篇);验收:失效链接 82→8(余 8 = 3 类有意保留:已删文件的历史叙述/crasm git 历史指针/前向链接)+ 移动文档定位声明 100% · crasm 34≤40 · project-book 64≤150 · 分支零 src 改动

* docs: 维护文档重组 Task 9 补遗——4 份未移动文档补定位头注(coq/README、ir-schema×2、verifier/kernel-spec;计划全局约束 6 的唯一未执行项),格式照 developer/errors.md 既有约定
)

取净内容而非按提交链合入,理由(实测):
- 该分支的**语法文档重写**(9 个提交)已被 develop 侧超越 —— develop 的 docs/developer/syntax.md
  是同一份重写的后续修订(含 += / => / 变参记号、切片类型注记、#check/#ensure 规约退役 .corespec 等,
  由文档重组批补齐),且已按「语言本体 / 不标实现状态」把设计理念移到 concepts.md
  ⇒ rebase 后 8 个提交在 docs/language-syntax.md 上带同一处「移动 vs 修改」冲突,逐个解无意义
- 其净贡献 = 本提交的 2 个文档(其余 8 个提交的内容均已在 develop 中)

内容:
- plans/2026-09-04-compile-time-linearity.md —— 编译时间线性化计划:每 pass 一条上界定理(数学保证而非测量)
  + 计数器证书(--emit-ops-cert)+ scaling 回归守门;含只读审计出的真嫌疑(checker find_sym/find_gsym 全符号表回扫、
  调用点 find_func 全表扫 = 确定超线性)
- specs/2026-09-04-message-copy-elision-design.md —— 消息边界拷贝消除设计
- `.gitignore` 早已覆盖这三类(`*.ccr` / `*.cir` / `*.o`,共 4 处规则),但这 12 个文件在规则生效前就已入库
  ⇒ 用 `jj file untrack` 从仓库摘除,**磁盘文件保留**(构建产物照常可用)
- 判据:`jj file list | grep -cE "\.(ccr|cir|o)$"` = 0 · 磁盘文件仍在 · 零源码/测试改动
- 清单:examples/{add,complex}/{main.ccr,main.cir,prog.o} · examples/{test_max,test_scale,test_sum,test_sumto}.{ccr,o}
原则(与维护者逐条定稿):陈述技术事实,不自我推销 ——「越是不普通的项目,README 越该写得普通」

结构:普通开头(2 段)→ 可运行代码样例 → Features → Design → Status → Building →
Usage → Documentation → Contributing → License;顶部互链 `English | 中文`。

相对旧首页(219 行)的实质变化:
- 删:slogan 式开场("全新的、完全自主设计的")· 自举里程碑大表 · 已实现特性大表 · 未完成限制大表
- 定位不缩窄:`experimental programming language`(非 systems programming language)
- 口径修正:「retained at every layer」→「remains available in the semantic IR through
  lowering, allowing verification and optimization to operate before final target encoding」
  (.cir = 验证消费面;.ccr = 格层线性投影;不主张 ELF 仍承载 type/specification)
- Features 按辨识度排序:reproducible three-stage bootstrap · direct ELF · semantic graph IR ·
  graph→lattice→encoding · raw pointers + provenance · arena tied to regions · fibers/channels ·
  function-level incremental compilation;泛型/枚举/元组/数组沉到最后
- 代码样例走真实接口 io.println_i(旧首页的 io.println_int 是不存在的函数)

实测:样例用当前源构建运行 = 输出 55 / rc=0;全部文档链接存在
(execution-model 已随文档重组移至 docs/maintainer/design/)
…68)

原实现只拦「整条命令以 git 开头」⇒ `cd x && git …` / `echo hi; git log` / `(git …)` /
`bash -c "…"` / `$(…)` / `sudo …` 全部放行(铁律 #2 的机械拦截有洞)。

修法:先剥离 heredoc 体(脚本体是数据),再用 shlex(punctuation_chars,**尊重引号**)
分词,按分隔符 token 切段,每段跳过前导(环境赋值 / 前缀命令 / shell 名 / 旗标 / 纯数字)
后看**首个命令词**是否为 git(含 /usr/bin/git);另递归扫 bash -c / sh -c 内联脚本。

实现期自查抓到两处真缺陷(首版不尊重引号 ⇒ 提交信息/数据里的 git 文本被误拦):
- 引号/heredoc 内的 git 文本必须放行 ⇒ 改为 shlex 分词 + heredoc 剥离
- `$(` 是单 token ⇒ 把 `$` 计入分隔符集
- 换行被 shlex 当空白吃掉 ⇒ 移出 whitespace 并计入标点(多行命令的行首调用不再漏拦)

判据 tests/harness/test_block_git.py:**36 例(BLOCK 20 / ALLOW 16)⇒ 实测 36/36**
- BLOCK:裸/带路径/&&/;/|/||/&/子壳/$()/反引号/bash -c/sh -c/sudo/nice/env/xargs/timeout/
  嵌套/heredoc 之后有真调用
- ALLOW:jj git …(git 非命令词)·echo git·grep git·.gitignore 族·引号内非命令位·
  **提交信息含 git 文本**·**heredoc 体内的 git 文本**(两条为误伤负控)
- 已挂 CI bootstrap-tests job(src/ci/run.sh 一行;本地 CI_JOB_NAME=bootstrap-tests 实跑 rc=0)

失败模式有意为「放行」:hook 自身异常 exit 0 —— 宁可漏拦,不可把会话卡死。
同提交更新 TODO #23(登记 → ✅ 修复 + 判据 + 失败模式)。
#64(W4,备选不实施):对「生成期分配共享面」的程序**整体关 `.cir` 缓存**(照 `g_optrep_on`
先例 `main.cr:488-491`)——收益 = 强制冷态 ⇒ 「命中跳过生成期副作用」这一类结构性消失(比 (b)
见证式更彻底);代价 = 该编译单元增量收益归零(粒度从「函数」升到「编译单元」:T2 实测外推 =
语料 3 档全条目失效、编译器自源 110 条目 → 0);关系 = 同一不变量的更粗更保守形态。

#65(W3 批归因,未实施修法):`corec cir` 的 `.cir` DOT 冷/暖差异**全部是变量名标签**
(非 label 差异 = 0,四探针 324/690/610/648 行),`.ccr` 冷/暖 −108~117B。根因 = **ir_gen 期
合成名字串在暖态缺席**(`new_ir_var("bin"/"_arena", …)`;快照只载函数级字符串常量,不载生成期
名字串 ⇒ 恢复的 var `name` 索引越域 ⇒ `get_ir_var_name` 返 "")。**首次归因 P4 附录 D-1**
(原记「冷/热 `.ccr` 逐字节同不可达」而未给根因)。风险划界三条(实核):① 非静默面(诊断码集
两态一致;变量名无诊断消息消费者)② 不传导产物(ELF 逐字节同、暖态 `.ccr` 后端消费结果同)
③ 与 TODO #5 身份字段不同层(那防跨二进制,本面是同二进制冷/暖名字面漂移)。

`tools/baseline/REBUILD.md` 暖态腿口径段补「**口径限制**」:现比对 = rc + 诊断码集 + 产物 sha,
**不覆盖 DOT label / 日志文本** ⇒ 本类名字面分歧不会被腿抓住;扩口径须另批(本次不实施)。

出处:W3/W4 批报告 `/tmp/fct5/task-report.md`(判据全套 = canary IDENTICAL · `.ccr` 四条同锁值 ·
72 档/探针零差异 · 枚举 61/61 · 五 CI job 5/5 rc=0 · 链 IDENTICAL + N06=0 ⇒ 扫面未扰动仓库)。
* docs: R0-A —— ctl 计划任务级细化落仓(定理清单 spec + T1..T10/7 门并入计划 + 审计勘误)

- 新增 `specs/2026-09-16-compile-time-theorems.md`:12 行上界定理 + 机检口径(`--emit-ops-cert`
  计数器 / `C_pass` 常数表 / 判定器)+ 「改 pass 必须同步本表」纪律(review checklist)。
- `plans/2026-09-04-compile-time-linearity.md`:状态行改「已细化」;§4 头部加现行权威指针;
  §2.1 **划销已失效的 `pass_stack_share` 行**(该 pass 已停用)+ §3 Phase C 同步;新增 §8
  (审计勘误 E1–E7 + T1..T10 任务表 + 与 §3 五批的映射)与 §9(裁-CTL-1..7 + 全局停条件)。
- 审计复核结论(逐条实读现址):28 条中**仍成立 25**(8 条纯行号漂移 · 2 条位置迁移
  `IR_CALL 发射→callseq.cr:202`、`alloc_registers→arch/x86_64/regalloc.cr:406` · 2 条「疑似」
  升「确定」)· **已失效 1**(`pass_stack_share`)· **须开工首日定位 2**(elf 前向补丁解析循环、
  Phase 3 的 O(F²) 回扫);**后端目录 `src/arch/linux/ld/` 已退役** ⇒ §2.2 路径全部作废。
- TODO #67 登记(含开工前置:裁-CTL-1..7 + T1 冻结基线与修复前 scaling 基线);`docs/README.md`
  索引同步(superpowers 指针后附新增文档)。

**零编译器源码改动**(纯文档 + TODO 标记);未跑任何构建/测试。

* docs: R0-B —— 验证切片轮草案落仓(plans/2026-09-16-verification-slice.md)+ TODO #68

- 全文落仓(原稿 `/tmp/verslice/plan-draft.md`):切片边界五候选(推荐 **C1** = `#check`/`#ensure`
  最小面 + VC 打印,零求解器)· 分诊表(逐要素现状 file:line / 最小代价 / 前置 / 建议)·
  「与 IR 的关系」两表(`.cir` 无对外序列化 ⇒ 建议消费面 = `.ccr`)· **六裁决门 裁-V1..V6** ·
  任务总表 T0..T5 · Global Constraints(canary 硬闸 + `#` 零足迹 + 载体版本位不动)· 停条件 7 条 ·
  未决项 U-1..U-7 · 自检记录。
- 头部改为:**已落仓 + 定位声明(受众/状态/真源)+ 诚实边界**(写作时零构建;行号只在当轮
  revision 有效,T1 须重取)。
- TODO #68 登记(范围 + 六门开工前置 + 已固化的实读关键事实 + 状态「立项/草案,未实施」)。
- `docs/README.md` 索引同步(R0-A 已列名)。

**零编译器源码改动**(纯文档 + TODO 标记);未跑任何构建/测试。

* docs: R0-C —— 预存 Bug 分类账落仓 + TODO 内文核销/勘误(TODO #69)

- 新增 `specs/2026-09-16-preexisting-bug-ledger.md`(原稿 `/tmp/bugtriage/ledger.md`,逐条实读分类:
  65 编号条目 = 还活着 17 · 部分收口 2 · 已修 16 · 登记/非缺陷 28;含优先级排序 · 建议批 B1..B9 ·
  划销清单 · 重复项互引 · 诚实项)+ 头部定位声明与落仓说明。
- **TODO 内文核销 11 条**(逐条按账内证据在落仓时**复核后**再划):#5/#8/#11/#16/#25/#28/#29/#32/
  #35/#40/#55(#23 已在位划销故未重复;#35 按容量批 E-3 口径转「历史」)。
- **#17 归档**(登记对象 = 影子层,已随 P5 T5 整体删除)。
- **#31 文字勘误**(实读证伪「`test_backend_bootstrap.py` 早已挂」:`src/ci/run.sh` 命中 0,
  该守卫只在手工全枚举路径执行)。
- **#20 锚点勘误**(`checker.cr:1053` → 定义 `:1912` / 丢弃点 `:2021`)。
- **TODO #69 登记**(落点 + 本次动作 + B1..B9 待裁 + `#66` 预留注记 + 状态「修复批未开」)。

**零编译器源码改动**(纯文档 + TODO 标记);未跑任何构建/测试。
缘起(CI 挂点审计实测,2026-09-16):`tests/selfhost/test_backend_bootstrap.py` 长期「自称已挂」(TODO 登记句)而 `src/ci/run.sh` 零命中——它是唯一能拦「清单双注册漂移(project-mode error[N06] 静默)」的门,且已致一次真实漏检(P3a 期间 `import monomorph` 漏删 ⇒ 33×N06 静默未定义、rc=0 产物照出、跨 5 个任务不可见)。缺口账(TODO #31)因此长期少算一档。审计全量 = 守卫单元 74 · 已挂 35 · 部分挂 2 · **从未挂 37**(报告 /tmp/ciudit/audit.md)。

#9 挂点覆盖率机械判据(根治「靠人记」):
- 新 `tests/harness/test_ci_hook_coverage.py`:枚举 tests/{selfhost,bootstrap,harness}/*.py 与 run.sh **可执行挂点**(行首 `python3 <路径>`;注释行不算——「注释里自称挂」正是抓点)做差集 ⇒ 未挂项必须逐条登记;**反向亦查**(白名单条目已挂/已删 = 腐烂 ⇒ FAIL);非空转下限(语料 ≥50 / 挂点 ≥30);**内存内突变自证**(摘任一真挂点 ⇒ 差集必含它)。
- 新 `tests/harness/ci_hook_allowlist.txt`:27 条未挂项(23 selfhost + 4 bootstrap)逐条带理由 + 「范围外登记」段(tests/kernel/run_diff.py 硬编码仓外 Coq harness ⇒ **不可挂**;parity/rebuild 需 jj+完整历史而 CI 浅检出 ⇒ CI 不可行;probes/warm 手工腿;test_term_io.cr;pseudocode_check.py)。
- 挂进 `bootstrap-tests` job(纯 python、毫秒级、无需编译器;与 test_block_git.py 同处)。
- 判据:`CI_JOB_NAME=bootstrap-tests bash src/ci/run.sh` rc=0(36/36 + 新判据 PASS:scope=63 hooked=36 allowlisted=27);**实跑突变**:真摘 `test_generics.py` 挂点 ⇒ FAIL 精确点名该文件(rc=1)⇒ 复原逐字节同 ⇒ PASS。

#6 workflow_dispatch 空转修复(`.github/workflows/core-ci.yml`):
- `pr` job:`if: github.event_name == 'pull_request'` → `... == 'pull_request' || ... == 'workflow_dispatch'`
- `full` job:`if: github.event_name == 'merge_group'` → `... == 'merge_group' || ... == 'workflow_dispatch'`
- 效果:手动派发不再空转(原两 job 的 if 互斥且都不含 workflow_dispatch ⇒ 派发跑 0 个 job);full 层在 merge queue 休眠期首次可达(手动全量)。YAML 解析实核 = jobs {pr, full} + 两条新 if 值。注释内已写明改动点。

#8 只做一半(按指示):**未动 TODO.md**(文档修订批并行在写);实读计数(selfhost 31/54 · bootstrap 3/7)与差集清单见本批报告。

未做(按指示):`test_backend_bootstrap.py` 的挂点(须实测时长 ⇒ 构建面,排 (A) 之后);其余构建面挂点扩容同此。
* docs: 文档 vs 现实修订 T1——CLAUDE.md(agent 必读面):src/compiler 清单 20→38(含 2 死件标注)· src/stdlib 8→19 · Known Issue「corec2 tokenizer」标历史 · 套件清单口径 · `.ccr` v8→v9

- src/compiler 树:20 条 → **全 38 条**(R2 各批新增的 type_engine/type_terms/ty_shadow/ccr_types/cir_cache/iface_*/ptr_analysis/provenance_verify/region_check/monomorph/ext_*/type_selftest/purity_selftest/opt/pass/dump/interp/project/regalloc-consistency 全部补齐),每条带**单元归属**(按全路径核 corec_files(45)/corelsp_files(31)/backend_support_files(9)/common_files(9));死件显式标注:`elf.cr`(零 importer,TODO #7)/`linker.cr`(0 字节空文件,本次审计新登记)/`regalloc-consistency.cr`(文档载体不入清单)。
- src/stdlib 树:8 条 → **全 19 条**(补 arena/assert/chan/dex/goroutine/hotpatch/sched/scheduler/trace/variadic),并标注「不在任何清单」的 7 件。
- Known Issues:`corec2 tokenizer 死循环` → 叠删线 + 现状块(full-bootstrap 链 rc=0、P6 T6 实测 corec2==corec3 IDENTICAL ⇒ 不复现,不再作阻塞项);`pass_cse/O1` → 标注「未复核(审计零构建)⇒ 须一次 -O 1 自举实测」,不得据它推断。
- 套件清单:三行示例 → 注明全集口径(selfhost 50+ / bootstrap 7;真源 = ls + run.sh 挂点)。
- 附带修订(审计同类新发现):Known Conventions 的 `.ccr` 版本 **v8 → v9**(版本真源 = ccr_io.cr::CCR_VERSION)。
- 依据 = 2026-09-16 文档 vs 现实审计(35 条;本批修 13 条不成立项之 D3/D4/S3/S4 + 本条附带)。

* docs: 文档 vs 现实修订 T2——spec-design(EBNF 断言 ×4)· ir-schema(.csr 真源 + .ccr 版本)· ir-op-semantics(IR_APPROX + 外部真源锚)

- spec-design.md D1(4 处):`variant`「EBNF 已有」→ **EBNF 尚未定义(待实现)**(`:46`/`:283`/`:306`);`:260` 的「EBNF 已定义(core.ebnf 归口;corespec.ebnf 为迁移期残留)」→ 修订块(实核 `grammar/core.ebnf` 对 `forall|exists|#check|#ensure|spec ` **零命中**;`corespec.ebnf` 已于 2026-09-06 **退役**且自述「迁移事项」)。旧断言以引用原文形式保留在修订注内(变更史 = 资产)。
- ir-schema/corespecir-schema.md D2:`状态 = active` + `真源 = ccr_io.cr` → **设计态(未实现)** + 「(拟)…当前零实现」;附实核(全仓 `csr|CSR1|TagNode` 零命中)与前置裁决提示。
- ir-schema/coreir-schema.md D2 半 + S2:头部真源注(`.cir/.ccr` 半成立、`.csr` 半不成立);「六、线性化」节加版本修订注(**现行 version = 9**、段数 8、P4 T1 +TYPE/IFACE、P6 T3 8→9;`v7` = 段表架构代号);`:283` 的 `version==7` → `version==9`。
- ir-op-semantics.md S1:`:46`「IR_APPROX 尚未入 ast.cr / 50 已定义 + 1 规划」→ **51 条全部已定义**(`ast.cr:568`);`:102` 表行「注解(规划)/迁移时加入」→「注解 / —(零发射点;已定义)」。
- ir-op-semantics.md S6:§0 真源表加修订注(仓外 `~/compcert` **无版本锚** ⇒ 行号引用跨机不可复现、CompCert 更新后静默漂移;复核口径 = 结论面与行号面分开判)。
- 依据 = 2026-09-16 文档 vs 现实审计(D1/D2/S1/S2/S6)。

* docs: 文档 vs 现实修订 T3——project-book §3.2 改写 · onboarding 语法真源 · verifier 仓外真源锚 · errors.md 计数口径

- project-book.md D5:§3.2「规约层 IR:行为约束的独立存储」→ **「规约层:行为约束的图上标注」**整段改写(与 ADR-0001 对齐:`.corespec` 独立格式**已退役**、规约 = `.cr` 内联 `#check/#ensure` 编译进图 TagNode;`.csr` 标「当前零实现」);原「两类文件 / `.corespecir` 并行 IR」叙述以**删除线原文**保留在节内(变更史 = 资产)。
- onboarding.md D6:`grammar/` 行「`corespec.ebnf`(规约)」→ 标明该文件 **已退役(2026-09-06, ADR-0001)**、规约并入 `core.ebnf` 属**未完成的迁移事项**、**勿引**。
- verifier/kernel-spec.md D7:加修订注——仓外真源 `~/mctt` **无版本锚**(仅「icfp25 分支」)⇒ 行号对照跨机/跨会话不可复现、外部树变动后静默漂移;补锚要求 + 跨机复核前置。
- developer/errors.md S5:族表总计 `~146` → **150**(与本表加和一致)+ **计数口径注**(三口径:表加和 150 / 明细码行 149 / `ast.cr` 定义 137)与成因(L 族 11 无码常量等)+ 真源关系。
- 依据 = 2026-09-16 文档 vs 现实审计(D5/D6/D7/S5)。

* docs: 文档 vs 现实修订 T4——审计全表落盘(docs/superpowers/specs/2026-09-16-doc-reality-audit.md)+ README 索引 + TODO #70

- 新文档 `docs/superpowers/specs/2026-09-16-doc-reality-audit.md`:35 条断言全表(危险 7 / 陈旧 6 / 成立 20 / 无法判定 2),每条 = 断言原文 · 出处 `file:line` · **可复现实核命令与结果** · 判定 · **修订去向**(指向本批 3 提交);含「复现命令」节(可整体复制)与「诚实边界」节(零构建、未跑 jj、取样口径、零「不改」= 无已知误判、修订风格 = 保留原断言不静默抹史)。
- `docs/README.md`:档案与工具链目录加索引行(指向审计文档;判据 = 「改文档/照文档设计前先查此表」)。
- `TODO.md` **#70**(空号取值:本树快照最高号 = 65;R0 在用 #66..#69 ⇒ 取 **#70** 留缓冲,避免并行撞号):审计+修订批条目(危险 7 逐条摘要 · 陈旧 6 · 审计外新发现(linker.cr 空文件、CLAUDE.md v8→v9)· 无法判定 2(保留)· 方法论登记 · 关联)。
- 依据 = 2026-09-16 文档 vs 现实审计(本批 T1–T3 的收口)。
* docs: (A) 批 T1 记录——前置侦查 + 冻结基线 + 起点判据 + 四形态 RED + 取址面完备性勘察

零源码改动(纯测量)。起点 230e5a1;冻结基线配方重建 = 白名单三 sha + 冒烟 42;
本树重建 ×2(corec 129d55a6… / corearch 22e96d03… / corelsp f4514365…)。

起点判据(全绿,未沿用容量批值):五 CI job rc=0 · 枚举 61/61 · selftest 415/415 ·
check rc=0 · canary 95084e7b…d475 IDENTICAL · .ccr 四条(冷+暖)· dump 3521 · DOT
165915B b1bdf480… · 链 006e58e1… + N06=0 + 冒烟 42 + --help rc=1 · 腿① 72 档零差异 ·
探针 17×0/12×1(1 档横幅差异已归因)· 暖态腿 FAIL=0。

四形态 + 三子形态全复现:局部 139/139 · 数组元素 139/139 · 全局 ELF 0/interp 139 分歧 ·
结构体字段写入丢失 · c1 正确但脆弱 · c2 139 · c3 ELF 8/interp 96(T2 记 216:分歧类稳定、
数值不稳定);**新增 ③b(全局 + 装箱写)= ELF 0/interp 5 静默分歧**。

取址面完备性勘察(承重件):直接取址面 100% 可在 IR-gen 期分类(&ident / &arr[i] /
&<其它表达式> 取临时量 = 非槽 / 切片);不可分类仅指针算术(OP_PTR_ADD,REP-2 边界)与
extern 写(登记)。**自源/语料/套件「可选 + 取址」同现 = 0**(自源源码零真取址)⇒ 本批
对自举链/发射面影响预期为 0。⇒ (iii) 可行(停条件①②③未触发)。
报告:/tmp/capt6/task1-report.md + .superpowers/sdd/rep-task1-report.md

* docs: (A) 批 T2 Step 1 先裁落纸——裁-REP-1..4 定案 + 不变量 + 完备性论证 + 写点/取址点清单

- 取裁:REP-1 = (iii) 逃逸域化恒装箱 · REP-2 登记+探针(指针算术边界)· REP-3 维持登记
  (&s.a 写入丢失)· REP-4 接受(取址预扫)
- 不变量:INV-1 地址被取过的可选槽恒持装箱值(写点装箱 + 表示位钉 1)· INV-2 指针写
  pointee 可选 ⇒ 装箱 · INV-3(导出)经指针读的装箱假定成立 · 非取址槽保持表示位
  (P4 裁决 5 不回退)· 聚合面 E-2 不动
- 完备性论证(T1 勘察转正式):引理 1 指针来源枚举完备(仅 &ident / &arr[i] 产生槽地址;
  &<其它> = 临时量 · IR_FNADDR = 函数地址)· 引理 2 可分类性(EXPR_IDENT ⇒ ni ⇒ 预扫可收)
  · 引理 3 聚合面已由 E-2 闭合 ⇒ 定理:不存在「未被标记但可经指针写」的局部/形参可选槽;
  越界者仅 REP-2/extern(登记)。假设两条(预扫覆盖面 / 名字索引保守标记)
- 写点清单 W1–W6(逐条 file:line + 漏改后果 + 突变抓手)+ 取址点七行清单 + 零足迹论证
  (含 T1 语料面证据:自源零真取址 ⇒ 标记面在既有语料恒空)

* fix: (A) 批 T2 Step 2 表示位随存储走——取址槽恒装箱(裁-REP-1 (iii))

W1 取址预扫(`g_addr_taken_names` + `optrep_addr_prescan`,收**操作数**名索引)· W2/W3 局部
写点(标记槽 ⇒ 装箱 + 表示位钉 1)· W4 形参序言条件装箱 + 钉 1 · W5 `IR_STORE_PTR` 按 pointee
可选性装箱 · W6 零足迹门(全部首判 `g_optrep_on`)。pointee 声见面 = W5 前提件:`UOP_REF`
源名取自操作数(`EXPR_UNARY.int_val` 是 `is_mut` 位,非名索引);全局声明面**只升级不降级**。

**第二根因(计划外,预存缺陷)**:ELF 后端 `IR_REF` 全局取址一律 `e2_lb(g2_slot(s1))` ⇒ 帧外
伪 rbp 偏移,`&g` 取栈上垃圾地址(写读经指针自洽故被掩盖,与全局槽脱钩)——冻结基线实证
`g_mut` ELF 1 / interp 5 · `g_refread` ELF 36 / interp 1。修法 = 全局源走 `lea r10,[rip+rel32]`
+ RIP 补丁(照 `IR_STORE` 全局分支先例)。形态③(全局槽)的 ELF 腿在此外修复前不可能正确。

**判据(全绿)**:`selftest-types` 415/415 · 枚举 61/61 · 五 CI job 5/5 · canary
`95084e7b…d475`(28822B)IDENTICAL · `.ccr` 两口径四条命中锁定值 · 腿① 72 档逐档零差异 ·
探针 29 档(唯一差异 = T1 已归因的横幅)· 自举链 `corec2 == corec3 5725df65…` + N06=0 +
冒烟 42 · 突变 **M1/M2/M3a 三条全红 + 精确回滚**(M3a 门控恒开 ⇒ canary/.ccr 复红)·
`test_optional` **48→66 例 66/66**(四形态 × {裸, 装箱, None, 条件写} + 形参 + c1/c2/c3 转正 +
REP-2/REP-3 登记 + 负控;c3 = **自证式断言**不钉历史数值)。④ `&s.a` 维持裁-REP-3 登记。
* docs: (A) 批 T3 裁决落纸——裁-T3-1 推断可选数组/切片元素写点漏(6 形态实证 139/139)判定本批修(声明面登记,写点零改动)+ 裁-T3-2 extern 面登记收窄(编译期接受/运行期不可达)+ 裁-T3-3 写点分类表;并据实更正 T1 §4.1 行 #6 的切片覆盖断言

* fix: (A) 批 T3 裁-T3-1——推断(无标注)可选数组/切片的元素写点漏(7 形态 139/139 → 正确)

根因:元素写点的元素类型取自**声明表**(`elem_ti_of` ← `slot_decl_ti`),而声明表此前只在
**带注解**的 LET 登记(`type_node >= 0`)⇒ 推断声明面解析 `et = -1` ⇒ 不装箱 ⇒ 裸值落进
「读侧恒按装箱解包」的元素槽 ⇒ 139(双路径同)。推断声明的两个来源都没登记:① 数组字面量
把元素类型建成 `irv_type(首元素)`(`Some(x)` 的 IR var 是 TI_UNIT 占位)② `IR_SLICE` 把切片
var 建成 `new_ir_var("slice", TI_INT)`。

修法(写点零改动):① `EXPR_ARRAY` 预扫**数组级元素可选性**(Some/None 关键字形 / 可选 ident /
可选调用)⇒ 可选则登记 `[T?;n]`,且**装箱判定改用数组级可选位**(元素序在后的 Some 也须影响
在前的裸元素);② `IR_SLICE` 源数组元素可选 ⇒ 登记 `[T?;·]`;③ **LET/全局初值处把值面登记
继承到绑定 var**(登记落在值 var、写点读绑定 var——本修的关键一环)。

零足迹:全部 `g_optrep_on` 门控 + **仅可选元素登记** ⇒ 非可选程序/既有语料零新状态;
ELF canary 95084e7b…d475(28822B)IDENTICAL 实测。

用例:test_optional.py 66 → 80 例(14 例 T3 面:7 修复形态 + 对照 4 + 只读 1 + 负控 1 +
切片套切片 1),80/80 PASS。

* docs: (A) 批 T3 实施记录——裁-T3-1 落地(字面量预扫 + 切片登记 + LET/全局初值继承;写点零改动)+ 7 形态转正 + 突变三条全红 + 判据全绿(canary IDENTICAL · .ccr 四条命中 · 腿①零差异 · 链 093ba230…)
…§9 (A) 批行 + TODO #56 核销 + 三条新登记(#71 FFI 边界 INV-1 / #72 推断模块级全局数组 139 归全局类型推断面 / #73 批收官+四项边界)+ 计划文档任务总表回填与批终态结论 (#76)
#76 B04 / #77 IR_REF 目标侧);预存 Bug 清单 #56 转「已修」+ 三处关联行同步;run.sh 三条过期计数机械核对同步(ccr_types 48→49 · enum_limit 15→18 · warm_cache_gate 6→10);REBUILD.md 增「跨二进制暖态腿日志文本」口径限制(与 #65 同条,不另立);批报告入仓 docs/superpowers/specs/2026-09-16-opt-rep-batch-report.md(现象→根因→修法→判据→登记→未覆盖面 + 事故纪律) (#77)
* docs: (A) 批后审计——apx(dex)形式转换完备性只读审计(表 A 边界×落点×转换×判定 21 行 + 表 B 未覆盖清单 10 探针设计 + N-1/N-3 同族判定 + 优先级)

结论摘:① 契约「存储/边界处按槽位形式转换」只在 4 类落点兑现(局部/全局/LET 写点 + 二元对齐 + @raw_int + 返回点部分);② 聚合面(字段/元素/元组/枚举载荷)写点无 dex 调整、读点 IR_LOAD_* 硬定型 TI_INT ⇒ 类型丢失连带下游转换全失效(放大器);③ **新确证(高置信读码)**:(B) B7「未确证」项可达——Core "-> dex" 经 fn_return_ti 归一为 TI_DEX_S(ir_gen.cr:684-690),而返回点转换门是 g_cur_ret_ti == TI_DEX(:2494)⇒ Core 函数 return 局部 apx 值恒不转换(静默错值、双路径同错);④ extern 实参面已排除(apx 原样 = C ABI binary64,依据 :1805 契约);⑤ as 为纯 IR_LOAD 拷贝(:2749-2767,:2765)无形式转换;⑥ 比较/相等仅在操作数 IR 型完好时对齐(:1248-1273)⇒ 经聚合读入者静默错。**同族判定 = 两条独立根因**(N-3 = 前端转换环覆盖面(门 :1806 EXPR_IDENT)/ N-1 = 前端改写 TI_DEX_S(:1832)× 后端分类按 irv_type(callseq.cr:71/97/99/125)的口径交互,机理**未实证**、候选 A/B 列明),但同主题 ⇒ 建议一批次两任务。零构建/零测试/零源码改动;全文标注读码判定 vs 未实证。

* docs: apx 转换审计——探针语法按本仓既有用例形校正(impl 接收者 self: S · 字面量 S { f = v })+ 增「探针为设计稿(未编译验证语法)」口径注

* docs: apx 转换审计收尾(lead 口径)——⑦a 全局初值逐行读完落实(未覆盖:extern 返回 / apx 全局运行期初值 ⇒ 位模式入 scaled 槽,写点 ir_gen.cr:3099-3101 无 dex_store_adjust)+ B-7 标「待语言定案」不进 RED + §3 据实改判:N-1 与 N-3 为**同一根因**(转换环覆盖面,两触发模式:调用形态门 / 环内形参类型读取未命中;新增 callee 侧证据 frame.cr:115-140 与 callseq.cr:66-132 的「按序 vs 按类」落位不对称),附两处插桩点与改写条件 + 修法方向落「维护者背书」;TODO 增 #78(聚合读丢型 = 总闸级,影响面超 apx)
* plan: 全局行操作数 seam 收编(同族六点)批次计划——只读侦查落纸(零构建/零源码改动)

产出:docs/superpowers/plans/2026-09-16-global-operand-seams.md

根因(一句话):g2_slot(src/arch/x86_64/instr.cr:55-72)对全局行(v < var_start)返回帧外伪 rbp 偏移
(第 71 行,偏移为正 ⇒ 落调用者帧),而「全局 vs 局部」分派被要求在每个操作数消费点各自手写 ⇒
int 面已收进 e2_load_var(:427-444),dex 面五件(e2_sd_load/load1/load_x/cvt/store,:348-424)与写侧
三处手写 rip 序(IR_CONST 493-513 / IR_STORE 1045-1057 / IR_REF 1096-1112)从未收编 ⇒ 同族按分支逐个漏。

审计坐标逐条自读复核(rev 084a0fa363fb):
- B1 520-521 · B2 468 · B4 1334-1335 · B5 1345 · B6 callseq.cr:73/:126 · B7 callseq.cr:160-163 ·
  死码 sz_ofs/sz_load_var 447-456 · 死变量 1231 —— 全部命中。
- B8 审计 4 点(1817/1860/1880/1891)⇒ 实读补全为 6 点:+1852(ALU 结果回存)、+1883(MEM load 回存);
  且 1860/1880/1891 是 hit_st_modrm_disp 的 disp 槽位参(非 e2_ld/e2_st 偏移参)⇒ 修法与其余不同。
- B7 修法修正:审计建议「全局判定前移一行」不成立——前移会让全局 dex 返回值落 :163 走 rax,
  而 dex 返回约定在 xmm0 ⇒ 正确修法 = 全局支自身按型分派(当前不可达 ⇒ 零字节代价)。
- 相邻「全局 string 型面」坐标 = ir_gen.cr:3116(默认 TI_INT)+ 3119-3131(dex 判定);apx 位 = 3125。

候选三案:① 纯 seam 收编(新增 e2_lea_glob + e2_sd_ld_var/e2_sd_cvt_var/e2_sd_st_var,形态无关单入口;
  非全局分支逐字节复制现状 ⇒ 零足迹可逐字节证)② ① + 完备性清单零未分类 + 突变双向控制(推荐)
  ③ 逐点最小修(照 IR_REF 先例,漂移源原样保留 ⇒ 否)。
七道裁决门:裁-SEAM-1 写侧收编范围(推荐只清点 d 域、不收编现状正确的三处手写序)· 裁-SEAM-2 extern
  判据降级到发射字节 · 裁-SEAM-3 方法调用第二根因(ir_gen.cr:1810 EXPR_IDENT 门 ⇒ dex 实参不做
  bits↔scaled 转换)推荐单列 + 探针钉值 · 裁-SEAM-4 B7 加固(修正修法)· 裁-SEAM-5 B8 表实例 ·
  裁-SEAM-6 相邻三项(string 型面单列 / 死码死变量顺带删)· 裁-SEAM-7 探针入仓形态。
判据面:canary 95084e7b…d475(28822B;canary 档 ptr_arith 实读无全局无 dex ⇒ 构造性不可达,仍须实测)
  · .ccr 四条锁定值 · 腿① 72 档 · 探针 29 · 枚举 61/61 · selftest-types 415/415 · 五 CI job ·
  自举链 corec2==corec3 + N06=0 + 冒烟 42;探针六点双路径 + 局部对照同值 + 突变双向红;停条件 7 条。

* plan: 全局行 operand seam 批——七门裁决落纸(§先裁落纸;方案取 ②,裁-SEAM-3 加硬封口)

维护者 2026-09-16 七门逐条裁决已逐条落纸,并按裁决加严三处计划条款:
- 裁-SEAM-1 同意:写侧三处手写 rip 序不收编;写侧 d 域清点零未分类,判「否」必须给 file:line。
- 裁-SEAM-2 同意:extern 判据降级到发射字节(红 = movsd xmm0,[rbp+正偏移] 形态)+ 口径限制写明。
- 裁-SEAM-3 加硬:方法调用转换缺口单列第二根因,**本批必须封口**——RED 先三选一记证
  (响亮 139 / 拒收 / 静默错值);静默 ⇒ 同批修转换环(ir_gen.cr:1810 门);响亮 ⇒ 不得变静默;
  超预算 ⇒ 停下报 lead、不许自行放宽。T3 增步骤 5 封口条款与判据。
- 裁-SEAM-4 同意修正修法(全局支自身按型分派)。
- 裁-SEAM-5 同意:B8 只迁 1817/1852/1883,disp 三处(1860/1880/1891)单列。
- 裁-SEAM-6 同意:string 型面单列;死码 447-456 + 死变量 1231 顺带删(删后 canary 须仍 IDENTICAL)。
- 裁-SEAM-7 同意全做(py 套件 + run.sh 挂钩 + 一档 suite 语料)。
- 正式登记条目新增:e2_sd_* 五件无 E2_REG_SLOT_BASE 分支(现因 regalloc 类型门不可达)。
- 构建纪律入纸:nice -n 19 + 同一时刻只跑一个构建(开跑前 ps 实查,他人构建中则等)。

* plan: 全局 seam 批 T2 进展(零构建)——g2_slot 全点 56 处枚举 + 写侧 d 域结构性初判 + B6 可达性修正(need_pack 掩蔽)

T1 因构建槽位被另一代理占用(parity_run.sh / warm_leg.sh 在跑)未开跑;先落 T2 的零构建部分:

① T2-a:g2_slot 全点机械枚举 = 56 处(助手 5 + emit_instr 45 + hit_ev_emit_one 6),
   逐分支坐标入表(含 IR_REF d 侧 1110 未分派、IR_YIELD 1419/1420、IR_DYN_* 等);
   分类列待 T1 的 RED 实证回填(T2 完成判据 = 零未分类)。

② T2-b:写侧 d 域结构性初判 = 无活点。全局 var 索引唯一来源 find_global(ir_gen.cr:579) /
   global_var_of(:3055),实核调用点 4 处全部只作 s1/操作数/只读分类(:524 只读 · :1116 操作数 ·
   :1364 emit(IR_STORE,-1,gv,…) · :3074 全局初值同形);emit dest 恒 new_ir_var 产物
   (IR_CALL dest = :1925)。残余风险 = IR_REF d 侧 1110 等,T1 用全局指针槽探针复核。

③ T2-c(重大修正):B6 可达性受 need_pack(ir_gen.cr:1927-1952)掩蔽——实参块仅在非连续时
   才打包进连续 _arg 临时,且打包只搬值不换形式:
   - ac==1 恒不打包 ⇒ 单实参调用全局实参直达后端(B6(b) extern 单参形 = 寻址面可达);
   - 方法调用 s.m(g):接收者(:1783 显式前置 self_var)与全局索引几乎必然不连续 ⇒ 打包 ⇒
     寻址缺陷被掩蔽(B6(c) 寻址面可达性大幅收窄,仅偶合形可达);
   - 但转换环缺口不被掩蔽(TI_DEX 形式原样穿过打包)⇒ 方法调用 apx 实参仍静默值错。
   ⇒ 裁-SEAM-3 的 RED 预判 = 静默错值(非 139)⇒ 触发加硬条款「同批修转换环」。

④ T2-d:转换环修法改动面评估——func_ni 对方法可用(:1777 checker 写入),但 arg_vars[0]=接收者
   而被调 EXPR_PARAM 链不含 self ⇒ 对齐须差一格(is_method 位);只对 dex 形参动作 ⇒ 非 dex 零足迹。
   初判 ~10-15 行(未超预算,不触发停下报 lead);前置 = T1 实测 + find_func 对方法可用性实测。

计划内同步修正:B6(b)/B6(c) 活点行与探针表行均加 need_pack 指针;探针 B6(b) 定为单实参形(恒不打包)。

* plan: 全局 seam 批 T1 实施记录(RED 实测;未建新构建——用当前树等价二进制 /tmp/p7t3/build/corec)

T1 RED 已跑(腿① corec run / 腿② build --static + 跑产物;cwd=仓库根、ulimit -c 0):

确认 RED(全局特有、ELF 侧分歧)4 点:
- B1 IR_BINARY TI_DEX s1:差分 g:dex,apx=±100.0 → `if g > 0.0` ⇒ ELF 7/7(符号不随初值变)、interp 7/1;
  同形 int 全局对照 1/1 正确、局部形 ELF 1 正确、且**运行期赋值后仍错**(初值面排除 ⇒ 读面坏)。
- B2 IR_I2F s1:h 全局 ±100.0 → `d : dex, apx = h` ⇒ ELF 7/7(错)、h 局部版 ELF 1(对)——同源仅位置不同,最干净。
- B4 IR_SLICE s1/s2:ELF 71 vs interp 20(期望 20);局部对照 20/20。
- B6(b) callseq dex 实参(单实参 extern):ELF 139 响亮 SIGSEGV、interp 255;**且 U6 结案**:
  extern 静态构建成功产生产物可跑(无链接失败)⇒ 运行期腿可用。

未复现(第一轮形态):
- B5 IR_AWAIT s1:g=5/9/7 精确随初值(5/9/7 双路径一致)⇒ 该形态读路径正确。
- B6(c) 方法调用:apx 全局实参值面 7/7、栈参形(第 9 个 binary64)7/7 均正确 ⇒ 与 T2-c 掩蔽分析部分一致,
  且**值面亦未错**(第二根因该形态不出现)。
- B6(a) 直调 7/7(与审计已排除一致);B7 非回归 5/5。

附加发现(登记候选,非本批目标):N-1 局部 apx 作第 9 个 binary64 栈参 ⇒ interp/ELF **双路径同错 1**(期望 7)
= 非全局面独立缺陷;N-2 多条 dex 转换探针 interp rc=255(全局/局部同现)⇒ 解释器既有偏差,
T4 用例主判据定为「全局 vs 局部同形对拍」。

T3 范围影响(待追认):确认活点 = B1/B2/B4/B6(b)(+B8 待表实例实核);B5/B6(c) 按 U7 待取裁
(推荐限一轮换形态搜,无命中即「未复现 + 探针钉住 + 登记」结案,不进 T3)。

基线二进制口径说明:/tmp/p7t3 与当前树 diff -rq 仅 src/ci/run.sh 与构建产物不同(全 .cr 一致),
故其 03:23 构建 = 当前树等价二进制;跑探针不占构建槽位(parity_run/warm_leg 仍在跑,未新建构)。

* plan: 全局 seam 批 T1 决定性 RED(mut 全局形)——B1/B2/B4/B5 四点全达标;B6(b) 139 归因更正;B6(c) 转 N-3(形式转换缺口)

T1 续跑(决定性形 = **mut 全局**;由 N-4 发现驱动:不可变+字面量初值的全局被
find_global_const_node(ir_gen.cr:592-611) 折叠成 IR_CONST ⇒ 读点不碰全局行 ⇒ 早先数条探针
根本没触达寻址面):

- B1 `g : dex, apx, mut = ±100.0; if g > 0.0` ⇒ ELF 7/7(符号不随初值)、interp 1/7;
  int 全局对照 1/1 正确、局部形 ELF 1 ⇒ RED 确认(折叠已排除)。
- B2 `h : dex, mut = -100.0` → `d : dex, apx = h` ⇒ ELF 7(错)/ 局部 h 形 ELF 1(对)⇒ RED。
- B4 `g : [int;4] = [...]` + 全局 lo ⇒ ELF 71 vs interp 20(局部对照 20/20)⇒ RED。
- B5(新达标)`g : int, mut = 5; g = 9; x := await g` ⇒ interp 9 / **ELF 26** ⇒ RED(早先
  「未复现」= 探针用不可变 int 全局、被折叠)。
⇒ RED 判据「至少 B1/B2/B4/B5」**四项全部达标**(三重隔离:mut 形 + 局部对照 + int 对照)。

- B6(b) 归因更正:对照 `seam_ext(1.5)`(**无全局实参**)同样 139 ⇒ 139 = 静态构建下未解析
  extern 符号必崩,与全局实参无关 ⇒ U6 结案口径修正:**无运行期腿,判据只能到发射字节**。
- B6(c) 定性更新 = N-3:`s.m(apx_mut_global)` ⇒ interp 1 / ELF 1(期望 7);**局部对照
  `s.m(lx)`(局部 apx mut)⇒ 同样 1/1** ⇒ **与全局行无关**(双路径同错 = 前端形式转换缺口,
  环门 ir_gen.cr:1810 以 EXPR_IDENT 为门 ⇒ 方法调用整段跳过)⇒ 非本批「ELF-only 静默」类。
  ⇒ 裁-SEAM-3 原判前提(B6(c) 属全局 seam 案)被实测证伪,需 re-ruling:(a) 同批修转换环 /
  (b) 单列 N-3;计划推荐 (b)(本批根因单一 = g2_slot 帧外伪偏移;N-3 与 g2_slot 无关,并入
  会污染判据面),但原裁「不许留给下一批」⇒ 须 lead 明确追认。

其余:B6(a) 7/7(与排除一致);B7 5/5 非回归;N-1(局部 apx 第 9 个 binary64 栈参双路径同错)、
N-2(interp rc=255 既有偏差)、N-3、N-4(mut 硬约束)四条登记入计划。

* doc: 全局 seam 批——裁-SEAM-3 证伪与改判留痕(准 (b) 单列 N-3)+ 四条硬条件落地(TODO #74/#75 + dex/apx 节补注)

维护者追认:裁-SEAM-3 原判前提被 T1 实测证伪 ⇒ 改判 (b) 单列 N-3(「这不叫放宽,叫纠错」)。
按四条硬条件逐条落地:

1. TODO #74(新条目,高危表述):方法调用 apx 实参不做形式转换(环门 ir_gen.cr:1810 以 EXPR_IDENT
   为门 ⇒ EXPR_FIELD 整段跳过)——静默错值 · 双路径同错。含最小复现、双路径实测(interp 1 / ELF 1,
   期望 7)、局部对照(s.m(lx) 同错 ⇒ 与全局行无关)、根因 file:line、修法对齐陷阱(arg_vars[0]=接收者)、
   以及「为什么比响亮失败更危险(双路径一致 ⇒ 对拍判据抓不到)」。
2. TODO #75(新条目):局部 apx 量作第 9 个 binary64 栈参 ⇒ 双路径同错;标注与 #74 同族
   (apx 形式转换缺口族),两条合看 = 面不是点。
3. 计划 §先裁落纸 增「裁-SEAM-3 证伪与改判」小节:原裁前提 X / 实测证据 Y / 结论(前提不成立,
   真实身份 = 形式转换缺口、与 g2_slot 无因果)/ 改判 (b) + 四条硬条件落地位置 + 免构建口径确认。
4. N-2 落 dex/apx 迁移遗留节补注(查无重复条目):corec run 对 apx 算术显式报错 + rc=255 =
   能力边界非缺陷(与既有「深度守卫 rc=255」同码不同因);N-4(模块级全局常量折叠陷阱)同节补注 +
   计划 T4 用例头注硬约束(探针必须用 mut 全局)。

计划 T4 主判据同步更新:全局 vs 局部同形对拍(两腿都跑 ELF);corec run 腿仅在其可用时作附加证据,
apx 算术例不得把 255 当错值信号。

* fix: 全局行操作数 seam 收编(T3)——新增形态无关分派单入口 + 迁移 B1/B2/B4/B5/B6/B7/B8

根因:g2_slot 对全局行(v < var_start)返回帧外伪 rbp 偏移(指向调用者帧的合法位移)⇒
任何直吃 g2_slot 的操作数读写点静默读写调用者帧;int 面已由 e2_load_var 收编,dex 面五件
(e2_sd_load/load1/load_x/cvt/store)与写侧从未收编。

新增(src/arch/x86_64/instr.cr,紧随 e2_load_var;架构轴,OS 轴消费):
- e2_lea_glob(buf,pos,var):lea r11,[rip+0] + RIP 补丁登记(disp32 = pos+3,与 e2_load_var
  内联段逐字节同序);仅全局行调用;scratch r11 即时消费、不跨指令存活。
- e2_is_glob(v):判定单入口(<0 ⇒ 0)。
- e2_sd_ld_var(buf,pos,xmmn,v):读侧 dex(全局 → lea r11 + F2 0F 10 /n mod=00 rm=3;
  局部 → 现 e2_sd_load/_load1/_load_x 原字节,n=0/1 编码逐字节等价)。
- e2_sd_cvt_var(buf,pos,v):IR_I2F 源(全局 → F2 48 0F 2A 03;局部 → 现 e2_sd_cvt 原字节)。
- e2_sd_st_var(buf,pos,v):写侧 dex(全局 → F2 0F 11 03;局部 → 现 e2_sd_store 原字节)。
- e2_st_var(buf,pos,reg,v):写侧 int(全局 → lea r11 + REX.WRB 0x89 /0 rm=3;局部 → 现
  e2_st 原字节)。

迁移(逐点 = 读/写两端):
- B1 IR_BINARY(TI_DEX) 585/586 双操作数 + 593 dest;
- B2 IR_I2F 532 源(e2_sd_cvt_var)+ 533 dest;
- B4 IR_SLICE 1398-1403 数组指针/低界 → e2_load_var;
- B5 IR_AWAIT 1411-1416 s1 → e2_load_var + dest → e2_st_var;
- B6 callseq.cr:75(寄存器 dex 实参)/ :129(栈 dex 实参)→ e2_sd_ld_var;
- B7 callseq.cr cs_ret_value:全局支**自身按型分派**(裁-SEAM-4 修正修法——不是把 dex 判定
  前移,前移会让全局 dex 返回走 rax 而非 xmm0);非全局路径字节原样;
- B8 hit_ev_emit_one 1886/1921/1952 dest 回存 → e2_st_var(disp 参三处 1860/1880/1891 按
  裁-SEAM-5 单列不改)。

裁-SEAM-6 顺带删死码:sz_ofs/sz_load_var(零调用者)+ IR_LOAD_ENUM_TAG 的死变量 o1。

零足迹:全部新分支只在「全局行」触发;非全局行 = 逐字节复制现状(局部路径调用原语、
参数与次序不变)⇒ 预期 ELF canary IDENTICAL + .ccr 四值不变(待槽位构建实测)。

* test: 全局行 operand seam(T4)——探针套件 + suite 语料 + run.sh 挂钩

tests/selfhost/test_global_seams.py(12 例):
- B1(IR_BINARY TI_DEX 全局操作数):负/正号差分 + 局部同形对照
- B2(IR_I2F 全局源):同三形
- B4(IR_SLICE 全局数组 + 全局低界):解释器腿可用 ⇒ interp 20 + ELF 20 双钉
- B5(IR_AWAIT 全局源,运行期赋值不可折叠):interp 9 + ELF 9
- B6(b)(extern dex 实参):**发射字节级**正片段判据(4c 8d 1d … f2 0f 10 03)——静态无
  .so ⇒ 调用未解析符号必崩(对照 seam_ext(1.5) 同样 139),无运行期腿
- B7:非 dex 全局返回非回归
头注落两条硬约束:① 必须用 mut 全局(不可变 + 字面量初值被常量折叠 ⇒ 不触达寻址面;
本批 T1 第一轮即栽在此处)② apx 算术无解释器腿(corec run 显式拒收 rc=255,非缺陷),
主判据 = 全局 vs 局部同形对拍。

tests/suite/global_seam_test.cr:run_suite 逐档 build + run 语料(B1/B2/B4/B5 合成一档,
期望 rc=0),头注同样落两条硬约束。

src/ci/run.sh:selfhost-tests 增挂 test_global_seams.py(满足 test_ci_hook_coverage.py 的
「枚举 ⇒ 必挂」机械门)。

* fix: 全局 seam sd 三助手补 REX.B(缺它 [r11] 变 [rbx] ⇒ 野指针 139)+ B6(b) 判据收紧为连续序列

T5 首轮实测(T4 套件 8/12)暴露自伤缺陷:e2_sd_ld_var/e2_sd_cvt_var/e2_sd_st_var 的
`movsd xmm{n},[r11]` / `cvtsi2sd xmm0,[r11]` / `movsd [r11],xmm0` 均**漏 REX.B 前缀**——
ModRM rm=3 只有 3 位,选 r11 必须 REX.B=1;漏它则实际寻址 [rbx](野指针)⇒ B1/B2 全局形
ELF 由「静默错值」变为 SIGSEGV 139(T4 套件当场抓住;int 写侧 e2_st_var 未犯此错——它按
IR_STORE 先例带了 emit_rex)。

修法:三处补 REX.B(0x41;cvt 形 = 0x49 = REX.W+REX.B 同置),global 形 12 字节/条:
- movsd xmm{n},[r11] = F2 41 0F 10 ModRM(mod=00 reg=n rm=3)
- cvtsi2sd xmm0,[r11] = F2 49 0F 2A 03
- movsd [r11],xmm0  = F2 41 0F 11 03

判据侧同步收紧(教训入判据):B6(b) 原判据把 `4c 8d 1d` 与 `f2 0f 10 03` **逐片段独立 find**
⇒ 缺 REX.B 的坏序列照样通过(弱判据放跑了本缺陷)。改为**连续序列正则**
`4c 8d 1d .{4} f2 41 0f 10 03`,并在 case_elf_match 头注写明这条教训。

实测(重建后):T4 套件 12/12 · suite 语料 rc=0 · 冒烟 42 · canary 95084e7b…d475(28822B)
IDENTICAL · .ccr 四条 = 96015 680a6f98 / 96158 76f36e6a / 142793 41e9d845 / 142936 704316c8
(两口径 + 冷态,逐条 clean-cache)。

* chore: 腿① 语料计数 72 → 73(本批新增 tests/suite/global_seam_test.cr ⇒ t1 32→33)

全局 seam 批按裁-SEAM-7 新增一档 suite 语料,parity_run.sh 的 72 档计数断言随即硬失败
(runner 内注「语料数变化 ⇒ 硬失败,须显式改本文件」)——按该权威口径显式更新:
- tools/baseline/parity_run.sh:CORPUS_TOTAL 72 → 73(t1 32→33)+ 头注两处计数 + 增量来源注明
- src/ci/run.sh:selfhost-tests 注释内「72 档语料」→「73 档语料(+1 = tests/suite/global_seam_test.cr)」

判据(本批实跑):更新后 parity_run.sh 候选/参考两侧均 rc=0、语料 73 档 ×2 文件 = 146 条目、
`diff -rq` 零差异。

* plan+test: 全局 seam 批 T5 判据全绿落纸(含偏差台账 3 条)+ 字节判据失败消息修正

T5 实测(全部本实例实跑):
- T4 套件 12/12 · suite 语料 rc=0 · 冒烟 42 · canary 95084e7b…d475(28822B)IDENTICAL
- .ccr 两口径四条全 IDENTICAL(96015 680a6f98 / 96158 76f36e6a / 142793 41e9d845 / 142936 704316c8;
  逐条 clean-cache + 冷态)· check src/compiler rc=0(0 条 error[)· selftest-types 415/415
- 五 CI job 全 rc=0 · 自举链 corec2==corec3 IDENTICAL(093ba230…)+ N06=0 + 冒烟 42
- 腿① 73 档对拍(冻结基线×当前源 vs 当前二进制×当前源)diff -rq 零差异(146 条目;rc 35×0/38×1)
- 探针 29 档:rc.txt / cold 日志 / 暖态 warm.out 与 (A) 批 post 输出零差异(warm/ 逐档仅临时路径差异)
- 突变双向:Mu1(e2_lea_glob 补丁位置 +3→+4)⇒ B1/B2 全局红 + B6(b) 判据红 + 局部对照绿 + canary 不变;
  Mu2(e2_ld disp8 ModRM rm=5→rm=4)⇒ 探针 11/12 红 + canary 变 a7ef9ddf…(≠锁值)✓ 两向均成立

偏差台账(本批自曝、已闭合):偏差-1 = sd 三助手漏 REX.B([r11] 编码成 [rbx] ⇒ 139,T4 套件当场拦,
已修 b179268);偏差-2 = B6(b) 逐片段独立 find 的弱判据放跑了偏差-1(已改连续序列正则);
偏差-3 = 新增 suite 语料使腿① 计数断言硬失败(72→73 显式更新,已提交)。

本提交:计划落 T5 记录 + tests/selfhost/test_global_seams.py 失败消息按文本渲染(\xNN 由正则引擎解释;
.hex() 会把 pattern 文本 dump 成 hex,误导排查——已在注释内写明勿改回)。

* docs: TODO #79——全局 operand seam 批收官登记(四点 RED 转正 + 两条探针硬约束 + 偏差台账 3 条)

批交付与判据全绿地入 TODO(详见 docs/superpowers/plans/2026-09-16-global-operand-seams.md §T5):
- 根因/交付/提交链/判据(T4 套件 12/12 · canary IDENTICAL · .ccr 四值同 · 五 CI job rc=0 ·
  自举链 IDENTICAL + N06=0 · 腿① 73 档零差异 · 探针 29 档零差异 · 突变双向)
- 四条登记(#74/#75 同族 + B8 disp 参三处 + e2_sd_* 无 REG_SLOT 分支 + 全局 string 行型面)
- 两条探针硬约束(mut 全局 / apx 无解释器腿 ⇒ 主判据 = 全局 vs 局部同形 ELF 对拍)
- 偏差台账 3 条(REX.B 自伤 / 弱判据 / 计数漂移,全部本批内闭合)
编号取 #79(#74/#75 为本批早前落的两条;#76-#78 由并发 apx 审计批占用,避免撞号)。

* docs: 计划措辞更正——B7 可达性判定被跨批审计更新(文档措辞更正:B7 可达性判定被跨批审计更新)

跨批 apx 转换审计(只读读码)确证:**B7 的全局支**当前不可达(本批读码判定不变),
但**同族 `-> dex` 返回路径可达**——`fn_return_ti`(ir_gen.cr:684-690)把 `-> dex` 归一为
`TI_DEX_S`,而返回点转换门写 `g_cur_ret_ti == TI_DEX`(ir_gen.cr:2494)⇒ **门恒不触发** ⇒
`fn f() -> dex { return <局部 apx 值>; }` 静默错值 · 双路径同错。

本提交**只改文档措辞、零字节影响、不重跑判据**:
- §活点清单 B7 行:补跨批更正与该可达路径的 file:line + 「归 apx 批次(审计表 B-2 / P0),非本批面」
- §未决项 U2:结案口径更新(B7 全局支不可达;同族返回路径可达 ⇒ 归 apx 批)
- §T1 表 B7 行:非回归判据保留,注明可达形态归 apx 批

处置纪律(按 lead 指示):B7 加固(全局支**自身按型分派**、非判定前移)**仍然正确、不撤**;
本批**不修** `-> dex` 返回路径(保持根因单一)。

* docs: TODO 编号去重留痕——seam 批 apx 两条改号 #74/#75 → #80/#81(develop 已占 #74–#78:REP-3/REP-2/B04/IR_REF 目标侧/聚合读丢型)+ 交叉引用同步(含批收官条目内两处)
* plan: 判据载体化批(criteria-carrier)T0 裁决落纸——canary + .ccr 四条配方挖出确证出处(cap-task1-report.md:82 表 B#8 + /tmp/capt1/t1b_criteria.sh:34-53 可执行原文)+ 全值 sha256/字节实测复核(三处独立采集体 /tmp/capt1 · /tmp/capt6 · /tmp/fct3 逐条吻合 ⇒ 与输出路径无关,CI 可复现)+ 两口径差异定位(段表解码:仅 STR +79 / SYM +64,其余六段尺寸相同)+ 载体设计(值表 TSV + canary_check.sh + harness 牙)+ fail-closed 四规则 + 零足迹论证 + 换代纪律 + 未覆盖面 9 条(含挂点成本估算)

* feat: 判据载体化——ELF canary + .ccr 四条 = 机器闸门(此前零自动化载体)

缘起(实核):canary `95084e7b…d475`(28822B) 与 .ccr 四条锁定值(96015 680a6f98… /
96158 76f36e6a… / 142793 41e9d845… / 142936 704316c8…)在本仓 *.py/*.sh/*.cr/*.toml/
*.yml 命中数为 0——只活在 docs/.superpowers 的文字里,每批靠人/代理手跑引用。同类事故本仓
已发生过一次(test_backend_bootstrap.py 自称已挂而 run.sh 零命中 ⇒ error[N06] 跨 5 任务
33 次静默漏检)。本批把这一课升一层。

载体(新增两件 + 一件牙):
- tools/baseline/canary_values.tsv = 锁定值单一真源(5 条;配方/出处/口径/复现性/换代纪律
  全在头注);全值 sha256 与字节数经**三处独立采集体**逐条复核(/tmp/capt1 2026-09-14 ·
  /tmp/fct3 2026-09-15 · /tmp/capt6 2026-09-16;输出目录各不相同 ⇒ 与输出路径无关 ⇒ CI 可复现)。
- tools/baseline/canary_check.sh = 闸门本体。配方(冷态,逐条 clean-cache;出处 =
  .superpowers/sdd/cap-task1-report.md:82 表 B#8 + /tmp/capt1/t1b_criteria.sh:34-53 可执行原文):
  canary = `build tests/suite/ptr_arith.cr --static -o <D>/pa`;四条 = 两语料(ptr_arith/
  generics_test) × 两口径(`ccr F -o O` / `build F -o O --static` 取 O.ccr)。
  fail-closed 四规则:F1 任一步 rc≠0/产物缺失 ⇒ 红(防「编译挂了没产物 ⇒ 跳过断言 ⇒ 绿」)·
  F2 值表缺/多条目 ⇒ 红(防断言面缩水)· F3 sha256 **与** 字节数逐条比 + 打印期望vs实际
  (防只比尺寸的假绿)· F4 工具/编译器缺失 ⇒ 红。自证模式 --selftest(S1 绿路可达 +
  S2–S6 五类必红:同尺寸改内容/改尺寸/缺产物/值表缩水/假期望)。
- tests/harness/test_canary_carrier.py = 牙:A 机械(run.sh 真挂断言)+ B 合成自证 +
  C 真产物篡改必红(复制采集目录 ⇒ 翻一字节 ⇒ --verify-only 必须红且指名产物;
  --require-compiler 时缺编译器 = FAIL,不静默跳过)。

两口径差异定位(本实例段表解码实测):差异只在 STR +79B 与 SYM +64B(合计恒 143B),
NOD/ENT/REG/EDG/TYPE/IFACE 六段尺寸相同 ⇒ 是接口面语义差、非输出路径长度差。

挂点(T2):src/ci/run.sh selfhost-tests 尾部 —— bash tools/baseline/canary_check.sh
(需已构建编译器;本 job 首行即 build_selfhost;成本 = 1 档 ELF + 4 次 .ccr,秒级)
+ python3 tests/harness/test_canary_carrier.py --require-compiler(载体先跑 ⇒ 牙腿
零额外编译,顺序即契约)。tests/harness/ci_hook_allowlist.txt 计数当场重算
(selfhost 32/55 · bootstrap 3/7 · harness 3/3 ⇒ 差集 27 不变)+ 范围外登记段加载体条目。

T3 顺手:tests/selfhost/test_mw_task2.py A5 修复——零 diff 基线在 build/(不入库)而
run.sh 从不传 --snapshot,原「不在就 [SKIP]」使判据可**整体静默消失**(新克隆/CI 恒 SKIP
且 rc=0);改默认 **基线缺失即 FAIL**,仅显式 --allow-skip/--skip-zdiff 降级;白名单
该条目理由列写明现状与「为何仍未挂 CI」(基线须在改动前编译器上产 ⇒ 参照物结构性不可得)
+ 成本估算(中高,属口径换代)。

实测(**全部零编译**——构建槽被在途批占用):--selftest 6/6 · --verify-only 对上两套
真产物各 5/5(/tmp/capt6 与 /tmp/fct3 采集)· 真产物翻一字节 ⇒ 红且指名 pa_ccr(其余 4 条
仍绿)· test_ci_hook_coverage rc=0(scope=65 hooked=38 unhooked=27)。
**待实测(等构建槽)**:载体默认模式(真采集 5/5)· 五 CI job · 全枚举。
判据值换代纪律 = 不符即停下上报,勿改值表(计划 §6)。

* doc: 判据载体化批 T1–T3 实测记录落纸(§9 E1–E9,全部零编译——构建槽被在途批占用)——selftest 6/6 · 两套真产物 --verify-only 各 5/5(/tmp/capt6 与 /tmp/fct3,跨批次跨目录)· 真产物翻一字节 ⇒ 红且指名 pa_ccr(其余 4 条仍绿)· 挂点前 harness rc=1(A1/A2 双 FAIL 抓「未真挂」)→ 挂点后 rc=0 · hook-coverage scope=65 hooked=38 unhooked=27 差集不变;待实测项逐条列明(载体默认模式真采集 / mw_task2 无基线 rc=1 / 五 CI job / 全枚举 / 挂点成本时长)

* fix: 判据载体化牙的新鲜度守卫 + §9 实测记录补 E10/E11

E10 采集路径端到端(桩编译器替换「编译」一环):canary_check.sh 默认模式 rc=0 5/5 ⇒
参数构造/逐条 clean-cache/次序(canary 先落 pa.ccr、ccr 步覆盖)/-o X ⇒ X.ccr 派生
全部经真代码路径验证。
E11 由 E10 暴露的假绿面:采集目录若是上一代二进制留下的陈货(比 build/corec 旧),
直接复用会让 C 层牙「拿陈货报绿」⇒ 加 mtime 新鲜度守卫(不复用则重采);CI 中 run.sh
先跑载体 ⇒ 恒新鲜,该守卫只防本地/乱序。
顺手清掉 E10 桩产出的 build/canary_artifacts/(非真编译器产物,留着有误导性)。

* fix: canary 载体 F4 加细(不可执行 / 同目录缺 corearch 各给更早诊断)——corearch 检查镜像 main.cr:713-721 的 get_arg(0) 目录解析;桩端到端复跑仍 5/5 + selftest 6/6

* doc: T0 追加项结案——两套 .ccr 四值 = (甲)「同口径不同时代」非漂移 + 判据契约改两级 + 冷态-only 论证

**锁定值本身零改动**(5 条数据行逐字节同)——本提交只改论证与契约表述。

1) (甲) 结案(出处挖到 file:line,两代都可独立复现):
   旧 v8(NOD 36B)= ptr_arith 90823 fb4a3b59… / 90966 592afa31…;generics_test 134701
   cafb4278… / 134844 ec8413ec…(P4 附录 D-1 表 · TODO.md:474 两口径表 · :521 P5 T7 复验
   90823/90966/135341/135484 · :376)。新 v9(NOD 40B)= 本表四条(p6-task3-report.md:62
   逐条带「原 …」括注 + **显式 delta 归因** = 4B × 节点数:pa +5192=4×1298 / gt +7452=4×1863)。
   ⇒ 审计表 C 引的是 P4/P5 时代值,与本表不冲突。
2) 判据契约改**两级**(不再单写「不得改值表」,也不写「永远不该变」):
   canary ELF = 发射面零泄漏检测器(变 ⇒ 停下上报);.ccr 四条 = 格式+内容形状检测器
   (值变 ≠ 必然回归,但**必须显式归因 + 同批重锁 + 旧值留痕**;无归因 = 红)。先例两例 =
   P6 T3 格式演进 / P4 T3 内容面演进(STR +16 串/+156B、TYPE +360~400B);反向例 = P4 T5
   「用户程序零扰动」型批把本闸门当正面判据用。**本闸门禁止的不是变化,是无声变化**。
3) 冷态-only 三条理由落纸(防「补全」成冷暖双锁引入假红):记录值即冷态 · P4 D-1 明载非可选
   程序冷≠热是**已豁免的预存面**(pre-P4 同病 89086/88954)· 暖态在本两档零区分力(T1 表 B 8c
   实测冷=暖;generics_test 构造性 cold≡warm:含泛型 ⇒ main.cr:480-486 c484 置 cache_enabled=0)
   且暖态另有专属闸门(test_warm_cache_gate.py 挂 CI + warm_leg.sh 手工腿)。
4) 143B 根因补 = --static 前置 rt.cr(main.cr:433-437 现址;P4 D-1 已查明「4 全局 + 1 串」),
   与本批段表解码 STR+79/SYM+64 一致;语料 B 全路径确认 = tests/suite/generics_test.cr(2593B)。
5) canary 28822B 性质确认 = **ELF 文件大小**(\177ELF 魔数 + -rwxr-xr-x,stat 实核)。

复跑(零编译):--selftest 6/6 · 两套真产物 --verify-only 各 5/5 · 骨架 harness PASS。

* doc: T0 追加项补完——.ccr 四值实为**三代链**(非两代):G1 P4-T7(cafb4278…/ec8413ec…) → G2 P5-T7(ddec1ce6…/cd2af565…,gt +640B) → G3 P6-T3 起=本表;审计表 C 引的是 G2。

关键新发现:**G1→G2 的 gt 变化本批未挖到显式重锁声明**(TODO.md:521 只记新值)——这恰好
印证本批立论:锁定值单靠「记在文档里」不足以当闸门,必须配「变化即归因」的机制;否则每代
都留一处「不知道它为什么变了」的缺口。G2→G3 则有显式归因(p6-task3-report.md:62 逐条
「原 …」+ delta = 4B × 节点数)。**锁定值数据行仍零改动**——本次只补论证与出处。

* doc: 判据载体化批真跑记录(§9.1 E15–E22)——构建槽静默后串行实跑

已实测:载体默认模式 **rc=0 · 5/5 · 1.04s**(五条与值表逐条 IDENTICAL ⇒ 四条 .ccr 预期
IDENTICAL 被实测确认)· 牙 7/7(2.24s,复用采集 ⇒ 零额外编译)· CI selfhost-tests **rc=0 · 78s**
且日志内确凿出现两挂点(非自称已挂)· bootstrap-tests rc=0(hook-coverage 65/38/27)·
check rc=0 · 30s · suite rc=0 · 19s · T3 fail-closed 自证(隔离树)默认 rc=1(9 FAIL)/
--allow-skip rc=0 / 有基线 ALL PASS。
E17 = 牙抓到的**自身断言字面量 bug**(载体渲染 ,断言误写  ⇒ 恒假红;
selftest 用 grep 正则故 B 层没抓到、C 层抓到)——「牙抓的是闸门自身」的实证。
成本回填 §2.1:边际 ≈ 3.3s/job(selfhost-tests 78s)。
**待回填(在跑/未跑)**:full-bootstrap · 全枚举——已在表中如实标「待实测」,未写成已测。

* doc: 判据载体化批真跑收官(E19/E20/E22 回填实测值)

五 CI job 全 rc=0:bootstrap-tests(hook-coverage 65/38/27 · BLOCK 20/ALLOW 16 = 36/36)·
check 30s · suite 19s · selfhost-tests 78s(内含本批两挂点真跑)· full-bootstrap **676s**。
full-bootstrap 细节:N06=**0** · corec2 == corec3 cmp **IDENTICAL**(双 2892374B,sha256 双
093ba2305c204fdd1ce1ad892af21ade75fb79dfcb3957fdc897affd73d9c814)。
全枚举 **62/62 rc=0 · 207s**(判据 = 无任何 FAIL: 行,非仅计数)。
四项曾以「待实测」标注,现逐条回填为实测值——无一项以估算冒充实测。

* fix: 牙的 C 层断言字面量 bug——载体渲染 "期望(expected)="(expected 与 = 之间隔着 )),断言误写 expected= ⇒ 恒不命中 ⇒ 恒假红

真跑实证:C 层首跑 rc=1 并打印「篡改后虽红但未指名产物/未打印期望vs实际」,而输出里
明明有该行——查证 = 断言子串 expected= 在文本里不存在(实际是 (expected)=)。
**--selftest 的 S2/S6 用的是 grep 正则**(模式里本就含 (expected)=)⇒ B 层一直绿、只有
C 层抓到 ⇒ 这正是「牙」要抓的形态:它抓的是闸门/断言自身,不是产物。
修复后 C 层 7/7(含真产物翻一字节 ⇒ 必红且指名 pa_ccr、缺产物 ⇒ 必红)。

* fix: 裁 (A) 环境归一化——载体钉 HOME + gt 两条重锁 142765/142908(CI 红档机理闭环)

机理(CI PR #80 红档 → 本机精确复现):编译器解析 import 时读
`$HOME/.core/lib/<模块>/index`(src/compiler/module.cr:523-530),命中即
`reg_so_funcs` 把索引里声明的函数名驻留进 `.ccr` 串表。本机有 `~/.core/lib/io/index`
⇒ `generics_test`(import io/fmt)多驻留 `print_int`(9)+`println_int`(11) = 2×4+20 = **恰 28B**;
CI 无该文件 ⇒ 少 28B。`ptr_arith` 零 import ⇒ 不读 $HOME ⇒ pa 三条全过(与观测一致)。
段级定位:差异**全在 STR**(2521→2493),其余七段逐字节同;本机 `HOME=<空目录>` 复现出
CI 的**同一 size 与同一 sha**(d92a2727…/a1f7b99c…)⇒ 归因闭合。

本次改动:
1) canary_check.sh:采集 5 条时把 HOME 钉到**采集目录内的空 home/**(+ CORE_SAFE=1),
   并打印实际 HOME。**不 unset/置空**——module.cr:526 有硬编码 `/home/DslsDZC` 兜底,
   置空反而去读原开发者家目录(已登记 TODO #82)。
2) canary_values.tsv:gt 两条重锁 142765/142908(d92a2727…/a1f7b99c…),旧值
   41e9d845…/704316c8… 留痕 + 标注「**自本批起作废**」+ 归因 + **判据效力范围**注
   (旧值从来不是跨机可复现的:G3 起每次「命中」都隐含依赖本机 io/index 在场)。
3) 效力范围同批落纸:计划 §6-6 + §9.2(含排除法、机理、V1/V2a/V2b 三次实跑)·
   REBUILD.md 已知限制新增一条(手工复跑也须归一化,否则得到本机态假红)。
4) TODO 两条独立登记(本批不修):#79 `.ccr` 产物依赖 $HOME ⇒ **跨机不可复现**
   (与「缓存键缺编译器身份」同族)· #82 module.cr 家目录硬编码兜底
   (判据 = HOME unset 时不得读任何家目录路径)。
5) ci_hook_allowlist.txt 计数改为**本分支**当场重算(31/54·3/7·3/3;此前 32/55 是
   手术前含 seam 批 test_global_seams.py 的树)——顺带把「计数随分支漂移」写进头注。

验证(全绿):--selftest 6/6 · 载体默认 **5/5**(V1:开发者 $HOME 仍含 io/index 仍绿
⇒ 与开发者 HOME 解耦)· 牙 7/7 · hook-coverage scope=64 hooked=37 unhooked=27(与 CI 一致)。
对裁 (A) 条件 4 的「反例测试」有一处**实测更正**(已写入 §9.2):在受控 HOME 造 io/index
**应当红**(那是改输入,不是环境噪声)——V2a 实测 142793(旧值)、V2b 良性索引同尺寸异 sha
⇒ 「解耦」的正确读法 = 与开发者的/外部的 $HOME 解耦(V1 已证),受控 HOME 每次采集
rm -rf 重建为空 ⇒ 外部无法在运行中污染它。

* doc: 编号改 #82/#83(避让 develop 已占 #79–#81)+ §4 措辞定稿 + V2b 推论单列入 #82

1) **编号改**(避免与 develop 撞号):`.ccr` 依赖 $HOME ⇒ **#82** · `module.cr:526` 硬编码 ⇒ **#83**。
   原取 #79/#82 漏了 #79 本身——seam 批有一条「#79 全局 operand seam 批收官」且**已 squash
   入 develop**(`e529aba2`),develop 现到 #81。编号说明改为**时序口径**:本分支基点 develop
   `47dde0d8` 早于 seam 合入 ⇒ 写入时看不到 #79–#81 ⇒ 按 develop 现状取 #82/#83。
   同步修正:REBUILD.md 与计划中引用(#79/#82 → #82/#83)。
2) **§4 措辞按维护者定稿落地**(原条件 4 表述经实测更正并双方确认):
   **解耦 = 与载体控制范围之外的任何 $HOME(开发者机 / CI runner / 他人机器)解耦**(V1 证);
   **载体自身的受控 HOME 是判据输入的一部分**——每次采集重建为空 ⇒ 既不可被外部在运行中污染,
   也**不假装对它不敏感**(V2a/V2b 证:放索引进去产物真变 ⇒ **闸门红才是正确行为**);
   「索引在场」的覆盖面若将来需要 ⇒ **另立语料/口径,绝不放宽本闸门**。V1/V2a/V2b 三行表
   已在 §9.2 作为「解耦成立」的证据链。
3) **V2b 推论单列进 #82**(缺陷性质更清楚):**良性索引**(只列已被 stdlib 驻留的
   `print`/`read_file`)⇒ **尺寸不变但 sha 变**,差异散布 STR/SYM/NOD/IFACE 四段
   ⇒ 触发因是「**索引是否存在**」本身(注册动作改变既有条目的序/标记),不是新名数量
   ⇒ **判据的输入面比预期大**。
4) §1.2 表 gt 两行同步为重锁后值 + 重锁前值标注作废;§1.3 补「G3 之上的第四代(环境面)」;
   §1.4 标题改「历史快照」。

复验(全绿):载体默认 5/5 · 牙 7/7 · hook-coverage scope=64 hooked=37 unhooked=27。

* doc: TODO #83 内一处交叉引用残留改号(见 #79 → 见 #82)——编号一致性收口
…实证:两条独立 find 放跑野指针 139;强判据写法 = 连续序列/带 gap 正则/锚点+定长窗口/反例驱动)② 表 B 弱判据 B1-B5 逐条实核落纸(test_hit_table.py:1207 事件1-4 只比前2B · test_mw_task2.py:242 慢路径块 2B 锚 · test_hit_table.py:284 四字面量黑名单 · test_cir_warm_path.py:172-175 STR 冷/暖豁免 · test_ccr_types.py:1760 剔行后比对)③ 结构性发现:最强字节判据全未挂 CI(allowlist:19 自标最高危 = N06 唯一门 + :25/:30-35 同族)+ 成本估算与批序 ④ 表 A 全表/表 B 的 B6+/表 C 待审计原文回填(已向 criteria-strength-audit 索取,未回填不臆造) (#81)
… 盲窗)+ #89/#84-#88 编号与结论校正 (#82)

* docs: 判据强度审计(全文回填 + 编号对齐)——表 A 22 条逐条落纸 · 表 B 6 条弱判据(审计编号 B1-B6 + 每条最小坏实现 + 兜底)· 表 C 兜底网 10 条 · 总结行/危害序/结构性发现(按 05:58 载体化批修正)+ 坐标漂移声明;TODO 新增 #90(审计 B1 = 零 diff 腿 E8 盲窗,危害序 ②)并校正 #84-#88 的审计编号引用、按修正版收窄/补全 #89(canary 与 .ccr 四条机器闸门已挂 selfhost-tests ⇒ 未挂集合余 5 类;批序按 low/mid/high 三档补全)

* docs: 判据强度审计回填按审计第三次投递对齐——A8 锚改 1207/1208..1220(引文锚)· B3 锚 :281(引文锚,:284 系 if bad: 邻域)· §0「反例驱动」改写为可操作自检问句(「什么坏实现能骗过这条断言?」+ 建议写进判据注释 + 维护者原话「判据弱不是因为写得少,而是因为没人问过它能不能被骗过」);TODO #86 行号同步对齐
* plan(apx 转换缺口批): 计划落纸(只读侦查产出,未取裁不得落码)

坐标全量实读校正 · 两条实质性结论校正(审计 ②a/B-2 读码判定不成立 · B-7 探针零区分力)·
§0 立论基石(apx 是 LET 专属标签 ⇒ 聚合面规范形式恒 scaled)· §5 三候选 + 推荐 ·
§6 八裁决门 · §8 Global Constraints(含 .ccr 四条取 canary_values.tsv 当前真源)·
§9 未决项 9 + 停条件 7 + 待用户问 1(as 语义)| docs/superpowers/plans/2026-09-16-apx-conversion-fix.md

* plan(apx 转换缺口批): 先裁落纸——八门全按推荐 + 裁-APX-2 加硬为不变量

§6bis 八门取裁 + 维护者补强理由入档 · Global Constraint 12 重写为不变量
(ir_gen 路径不得新增 alloc_type 站点;判据三条 = 节点级通道 / warm-cache 冷暖同判 / .ccr TYPE 段尺寸不变)·
裁-APX-3 维护者问用户 · 裁-APX-6 + U5 留档警示(改后端维持不可达不变量)·
§1.1 表格式留痕(审计原文 ↔ 实读 ↔ 结论;TY_DEX==TI_DEX==1 逐值对齐)· T1 步骤:B-2 放最前
| docs/superpowers/plans/2026-09-16-apx-conversion-fix.md

* plan(apx 转换缺口批): T1 实施记录 + 校正 C(探针声明形缺陷)

T1 全绿执行(零源码改动):B-2 裁定实验(显式 apx 形 ELF=7 ⇒ 校正 A 成立、审计 ②a 证伪、停条件 1 未触发)·
探针电池 16 例实测(RED = b1/b1b/b3a/b3b/b4a/b4b/b4c/b5/b6/b8/b11/b13;绿 = c3a/c4a/c6/b10/b12)·
#81 机理裁定(b9_direct 绿 7 vs b9_method 红 0,同形只差调用形态 ⇒ 落位公式不对称证伪、U3 结案)·
起点判据 canary+.ccr 5/5 PASS · 冻结基线三 sha 命中 + 冒烟 42

**校正 C(本批最重要)**:`d : ., apx = 7.0`(审计表 B 全表用形)**不产生 apx 槽**
(ir_gen.cr:2389 的 apx 分支以 declared_ti == TI_DEX 为门,`.` 推出 TI_UNIT)⇒ 审计表 B **全部假绿**;
正确探针形 = `d : dex, apx = …`。附带撤回首版的元组下标误校正(`t . 0` 带空格才是对的)
| docs/superpowers/plans/2026-09-16-apx-conversion-fix.md

* docs(apx 批): 校正 C 落 errata 到审计文档 + 第二类假绿入方法论文档

① docs/superpowers/specs/2026-09-16-apx-conversion-audit.md —— **保留原文 + 追加 §errata**(体例:
   裁决被证伪要留痕,不静默改):
   - 表 B 标题下加**抄表前必读**提示行 → 指向文末 §errata
   - E1(必修):表 B 十条探针源须用**显式形** `d : dex, apx = …`;原稿 `d : ., apx = …` **不产生 apx 槽**
     (ir_gen.cr:2389 门以 declared_ti == TI_DEX 为前提,`.` ⇒ TI_UNIT ⇒ 槽型回落 TI_DEX_S)⇒ 按其运行**全部假绿**;
     判别法 = .cir 中 `const dex = <bits>` 序列在场性 + 解释器 rc=255 反向自证 + bits mod 256 数值正据
   - E2:表 A ②a / B-2「恒不触发」被证伪(g_cur_ret_ti 取自 fi_return_type 的 TY_* 码,TY_DEX==TI_DEX==1)
     ⇒ B-2 现状已绿(T1 实测 ELF=7),移出 RED 改列非回归钉子
   - E3:B-7 探针**零区分力**(探针设计缺陷,与「语义未定」正交)+ 替换探针(源改精确值:恒等 0 / 转换 1)
   - E4:元组数字下标须写 `t . 0`(带空格)—— 原文写法是对的,防后人「顺手改成 t.0」
② docs/superpowers/specs/2026-09-16-criteria-strength-audit.md —— 新增 **§0bis 第二类假绿:探针不触发**:
   与 §0「片段式判据」正交(前者改断言,后者改探针);配自检问句「我怎么知道探针走到了那条路径?」+
   本例实证 + 三类判别法(产物形态自证 / 反向自证 / 突变自证)+ 数值反推正据
| docs/superpowers/specs/2026-09-16-apx-conversion-audit.md docs/superpowers/specs/2026-09-16-criteria-strength-audit.md

* plan(apx 转换缺口批): T2 实施记录(四表完备性枚举,零未分类)+ 停条件 2 触发上报

四表(全读码 + grep,逐条分类):
① 转换调用点 13 处(11 外部 + 2 内部)—— 漏斗本体只被 5 类落点调用,实参面只有门内两处
② 写点 40 处 —— 本批须接线 8 处 / 候选-可选 dex 面 3 处 / 已接线 3 处 / N/A 26 处
③ 读点硬定型 5 处 —— **新增第 3 个硬定型点 = match 结果槽 `:2222`**(审计未列,归 #78)
④ 调用形态 7 行 —— 直调/泛型 ✓;**方法调用 RED(#80);模块限定调用 RED(T2 新增)**

⚠ **停条件 2 触发(按纪律停下报 lead)**:枚举发现两个 §3 未列的表外活点
- **模块限定调用 `m.f(x)`**(m1b 实测:直调 `dex_str(d)`="7" ✓ / `dex.dex_str(d)` ✗ ELF=4 期望 7)
  —— 审计与 TODO #80 均未列;这是日常形态(`io.println` 面同源)
- **指针写 `*p = d`**(`p1` 实测 15/15 双路径同错,期望 7;`:1423` `IR_STORE_PTR` 无漏斗)
  —— check 另发 B04 软诊断 = TODO #76 既有面,build 仍 rc=0
二者均属既有族(L1 调用覆盖面 / L2–L8 写点覆盖面)的新行,非新族;本计划建议**并入本批**
(推荐方案 (i) 的两条改动面天然覆盖,边际成本≈0),是否并入由维护者裁

新未决项 U10(`func_ni<0` 调用形态可达性)/ U11(候选 3 处可选 dex 面可达性)
| docs/superpowers/plans/2026-09-16-apx-conversion-fix.md

* docs(apx 批): errata E5(审计表 A/B 不完备)+ T3 前置探针 U10/U11 落纸

① 审计文档 §errata 追加 **E5 完整性声明**(维护者硬条件 2):表 A/B 的覆盖面**不完备** ——
   漏了两个 T2 实测活点(模块限定调用 `m.f(x)`:直调 "7" ✓ / 模块调用 ELF=4 ✗;指针写 `*p = d`:15/15)。
   写明「效力边界」:凡按本文推断『除表 A 所列外无其它活点』者,该推断不成立;完整枚举以批计划 §7ter 四表为准
② 计划 §7quater(T3 前置探针):
   - **U10 结案**:`func_ni<0` 形态 = **不可达**(u10 `check rc=1` + error[N06] Undefined function,无产物)
     ⇒ 表 ④ 末行改「不可达(N06 硬错拦停)」并附探针
   - **U11 实测 = 可达且错值**(u11 ELF 15/interp 15 vs 精确对照 u11b 7/7)⇒ **按维护者硬条件 3 停下上报,不接线**
     根因比「3 处候选写点」更宽:`dex_store_adjust` 触发门是 `declared_ti == TI_DEX`,而 `dex?` 的 declared_ti
     是 TYP_OPTIONAL 类型索引 ⇒ **可选 dex 的 LET/赋值写点整段跳过转换**,装箱把 bits 原样塞载荷槽
     ⇒ 读回按 scaled 解释 = 15(同 T1 数值自洽链)⇒ 这是**正交新轴(dex? 整族)**,非「3 处写点接线」问题
     三选 (a) 并入 / (b) 单列(**推荐**)/ (c) 只接线不深挖(不推荐)+ 三条理由 + 若裁 (b) 的零足迹哨兵处置
| docs/superpowers/specs/2026-09-16-apx-conversion-audit.md docs/superpowers/plans/2026-09-16-apx-conversion-fix.md

* docs(apx 批): U11 裁 (b) 单列 —— TODO #91 + errata E6 + 四表 dex? 行(零未分类保持为真)

维护者裁 U11 = (b) 单列,四条硬要求逐条落地:
① **TODO.md #91**(编号实读:develop 现有到 #90 ⇒ 取 #91):可选 dex(`dex?`)整族 —— 形式转换 × 可选表示的交集面
   含实测证据(u11 15/15 vs u11b 精确对照 7/7)· 根因坐标(`ir_gen.cr:2389-2393`/`:2423-2424` 门 = declared_ti == TI_DEX,
   `dex?` 给 TYP_OPTIONAL 类型索引)· 四态判据要求(裸/装箱 × bits/scaled)· 与 (A) 批 INV-1 交叉引用 ·
   **性质声明「现状本就错、非本批引入」**
② **零足迹哨兵 + 两条加码**:刺眼标注「**该值 15 不是期望语义,只是零足迹绊线**;谁修谁负责改它」+
   反向检查(修复落地时必然变值 ⇒ 按 canary「显式归因 + 同批重锁 + 旧值留痕」纪律换代,不得当正确基线抄走)
③ **四表补 dex? 行**(本批不做 · 归 #91):表②dex? 写点行(含 :2457 LET 门不触发)· 表③dex? 载荷读行 · 表④正交说明行
   ⇒ 使「零未分类」这句话**仍为真**(不让它被后来的发现悄悄证伪)
④ **errata E6**(完整性声明 2):点名可选 dex 整族为表 A/B 未覆盖的第 3 处(前两处 = 模块限定调用 / 指针写,E5);
   并说明 E5 的「以四表为准」由第③条兜住
| TODO.md docs/superpowers/specs/2026-09-16-apx-conversion-audit.md docs/superpowers/plans/2026-09-16-apx-conversion-fix.md

* fix(apx 批 T3): 唯一漏斗 + 聚合/指针写点接线 + 调用环覆盖面重写(#80/#81/⑦a 收口)

范围(维护者裁-APX-1..8 + 三条硬条件):
① **漏斗** `dex_slot_norm(val)`:聚合面**不存在 apx 形式**(`apx` 是 LET 专属标签,parser.cr:819)
   ⇒ 字段/元素/元组/载荷/指针 pointee 的规范槽形式**恒为精确** ⇒ 任何 TI_DEX 值入这类槽前转 scaled。
   非 apx 值原样返回(**零 IR**)⇒ 非 apx 程序逐字节不变。**零类型表查询**(Global Constraint 12:
   ir_gen 路径不得新增 alloc_type 站点)
② **8 个写点接线**:字段赋值(:1380 邻域) · 下标赋值(:1403/:1410 共用入口) · **指针写(:1423,T2 新增)** ·
   枚举载荷(:2611) · 结构体字面量字段(:2647) · 数组字面量元素(:2695) · 元组元素(:2822) ·
   全局运行期初值(:3097,按**槽声明型**走既有 `dex_store_adjust` —— apx 全局须 scaled→bits)
③ **环覆盖面重写(裁-APX-5 + 硬条件 1「逐形态收窄」)**:门从 `ast_kind(func_node) == EXPR_IDENT`
   放宽为「`func_ni >= 0` 且 `find_func` 命中 Core/extern 函数」——覆盖 直调 / 方法调用 / **模块限定调用**
   (T2 新增活点)。**不是「凡调用都进环」**:EXPR_AT 内建在 :1600 已提前返回;find_func 落空 ⇒ 环不进。
   实参节点改取 `arg_nodes[cpi]`(与 `arg_vars` **同表锁步**;方法调用的 EXPR_ARG 链不含接收者 ⇒
   旧游标会滞后一位)
④ **比较点声明面查表(L10 · 裁-APX-1 的作用域替代)**:`dex_decl_form_of_expr(node)` 节点级取回
   聚合读的声明 dex-ness(EXPR_FIELD 结构体字段 / EXPR_INDEX 全局定长数组元素;**零 alloc**)
   ⇒ 分流前把该操作数按 TI_DEX_S 参与,避免「TI_INT 操作数 I2F」把 scaled 整数当整数升 double。
   **不改读点定型**(#78 的爆炸半径,另批)

判据(全绿):
- **探针电池 21 例全部转正**:b1 49→7 · b1b 15→7 · b3a/b3b/b4a/b4b/b4c/b5/b6 15→7 · b8b 0→**1** ·
  b11 0→7(⑦a)· b13 49→7 · **b9_method 0→7**(#81 = #80 同一修复,T1 裁定坐实)· **m1b 模块限定调用 →7** ·
  **p1 指针写 15→7**
- **非回归**:b12=7 · c3a/c4a/c6=7 · b10=7 · b2=7(返回点)· b9_direct=7
- **零足迹**:canary `95084e7b…d475`(28822B) + `.ccr` 四条 **5/5 IDENTICAL**(含 gt 两条 142765/142908)
- `check src/compiler` rc=0 · **selftest-types 415/415** · 关键套件 7/7 PASS(compile/optional/global_seams/params_limit/tuple_slots/agg_slots/agg_checks)
- **五 CI job 全 rc=0**(check 以 `check src/compiler` rc=0 计;bootstrap-tests/suite/full-bootstrap 实测 rc=0;selfhost-tests 771 行 0 FAIL)
- **腿① 冻结基线同源对拍 73 档 `diff -rq` 零差异** + 暖态 41 档真命中 FAIL=0 · **探针 29 档**冷/暖 FAIL=0
- **自举链 corec2 == corec3 IDENTICAL**(同 sha 328772e7…)+ `--help` rc=1 + 冒烟 42
- **突变双向**:M1 关漏斗 ⇒ b3a/b3b/b4a/b4b/b5/b6 回 15 红(b11/b13/b8b/b1 不受影响=走环/独立点);
  M2 环门退回旧形 ⇒ b1=49/b1b=124/b9_method=0 红、b10/b12/c3a 仍绿;**两种突变下 canary 均 IDENTICAL**
  ⇒ 证明 apx 探针组是载荷判据、canary 面与本批面正交
| src/compiler/ir_gen.cr

* docs(apx 批): T3 实施记录(21 探针全转正 · 零足迹 5/5 · 五 CI job 全绿 · 腿① 73 档零差异 · 自举链 IDENTICAL · 突变双向)

§7quinquies:实现点清单 8 项 + 判据全表 + 遗留四条
- 遗留:B-8 原探针期望值不可用(新发现)—— `d : dex, apx = 1.5` 与 `s.f = 1.5` 同十进制值在 binary64 下**不相等**
  (apx 字面量走 lexer 位模式 ~2ulp 截断 vs 聚合槽经 scaled 精确 1.5)⇒ 已换有区分力的 B-8′(无补丁 0 / 有补丁 1);
  该 ~2ulp 面属**预存语义**(test_dex_arith.py 头注已文档化),本批不改、登记备查
- 探针 29 档唯一 log 差异(n05_recursive 多一行进度打印)已归因**预存**(本批前后二进制对该探针输出逐字相同)
| docs/superpowers/plans/2026-09-16-apx-conversion-fix.md

* test(apx 批 T5)+docs(T7): 探针套件 + 挂点三件套 + suite 语料 + 批报告 + 台账

**T5 交付**
- `tests/selfhost/test_apx_conversion.py`(新):**23 例**(方法调用/self 偏移/模块限定调用/第 9 个 binary64 栈参×2/
  聚合四类写点/切片元素/指针写/全局运行期初值×2/比较点/非回归×4/精确形对照×3/**#91 哨兵**)
  + **两条自证腿**(① 声明形自证:显式形 `const dex = <bits>` 在场 / 推断形不在场 / 解释器拒收 rc=255 反证
  ② C1 双形对拍通用腿 field/elem/tuple)+ 软诊断容忍(**恰 {B04}**,体例照 TODO #76)
- `tests/suite/apx_conversion_test.cr`(新):suite 常规腿(只放已绿形态,rc=0);**§2 绕开既有 139 形态**
- `src/ci/run.sh`:挂在 `selfhost-tests` job(含判据分工与两约束的注释)
- `tools/baseline/parity_run.sh`:**CORPUS_TOTAL 73→74**(显式更新计数,本仓出过计数漂移)
- `test_ci_hook_coverage.py` PASS(scope=66 hooked=39;新脚本已挂 ⇒ **无需白名单条目**)

**T7 交付**
- `docs/superpowers/specs/2026-09-16-apx-conversion-batch-report.md`(新):批报告,含**判据分工一节**(canary 正交性)
- `TODO.md`:#80/#81 **✅ 已修**状态(含机理裁定与判据)+ #78 **apx 批交叉引用**(RED 语料/同改点含 :2222/GC12 不变量)
- `2026-09-16-criteria-strength-audit.md` **§0ter 判据覆盖域**(三类假绿形态齐备:§0 片段式 / §0bis 探针不触发 / §0ter 覆盖域)
- 计划 §8 canary 正交性注

**两条新登记(T5 期间实测)**
- `TODO #92`:apx 字面量 ~2ulp ⇒ 「同十进制值」在 binary64 下可不相等(**预存语义**,登记备查防假红)
- `TODO #93`:**模块限定调用直接作实参 ⇒ SIGSEGV 139**(**零 dex**,既有缺陷——T3/预变更/**冻结基线 97f4394** 三者同崩)
| tests/selfhost/test_apx_conversion.py tests/suite/apx_conversion_test.cr src/ci/run.sh tools/baseline/parity_run.sh TODO.md docs/superpowers/specs/2026-09-16-apx-conversion-batch-report.md docs/superpowers/specs/2026-09-16-criteria-strength-audit.md docs/superpowers/plans/2026-09-16-apx-conversion-fix.md

* docs(apx 批): 批报告补「腿① 暖态跨 rev 条目差」三方差分归因(与本批无关)

74 档暖态:基线 65 生效档 vs 当前 41(28/74 档条目数不同)。三方差分决定性:
预变更 rc=1/0 条目 · T3 当前 rc=1/0 条目 · 冻结基线 97f4394 rc=0/**17 条目**
⇒ 差异全在 pinned rev ↔ develop 之间(本批之前 fail-closed 收紧使 N06 档 rc 0→1 ⇒ 无产物无条目)
⇒ **非本批引入**;腿① 判据(74 档 check 日志逐字节同 + 逐档 rc 同 + 暖态 FAIL=0)全绿
| docs/superpowers/specs/2026-09-16-apx-conversion-batch-report.md
**#93 真面目 = 「已解析直调的实参推断缺失」**(原题「模块限定调用直接作实参 ⇒ SIGSEGV 139」是**表象**):
- 根因 `checker.cr:2817` 提前 `return sym_type(si)`(被调已解析为 Core fn)+ 推实参循环在函数尾
  `:2833-2839`(**只在 func_ni < 0 时可达 ⇒ 对任何有名被调是死码**)⇒ 实参表达式从不被推断
- 139 链:内层 EXPR_FIELD 被调的 ast_data 只能由 checker 模块/方法分支回填(:2584/:2645)⇒ 从没回填
  ⇒ 保持 parser 初值 0 ⇒ istr_get(0) = 首个 interned 串("import")⇒ 后端查不到 ⇒ 外部位重定位 ⇒ 139
- **第二种表现(更危险)= 静默通过**:`g(nosuchfn(1))` **check rc=0 零诊断**(运行时亦 139)

交付:
① `TODO.md` #93 **原地扩写**(标题按真面目改 + 根因/139 链/可达性边界表/日常形/三方差分/
   修法 (a)(b)(c)/两条腿判据网/状态 + 批次位置待用户定);**原实测记录保留**(留痕体例)
② `docs/superpowers/specs/2026-09-16-arg-inference-gap.md`(侦查全文:根因 · 判别矩阵 ·
   日常形反直觉 · 三方差分 · 修法候选 · 19 例观测矩阵 · 未决项 U1–U4)
③ `tests/selfhost/test_arg_inference_gap.py`(**RED 语料 19 例** = 腿A 9 + 腿B 1 + 对照 9;
   断言「修复后」行为 ⇒ 当前 10/19 未达,**头注标死「勿挂 CI」**)
④ `tests/harness/ci_hook_allowlist.txt`:新增条目(**RED 语料勿挂**,注明修复批次须删条目+挂 run.sh)
   判据 = `test_ci_hook_coverage.py` **PASS**(scope=67 hooked=39 unhooked=28)

判据网两条腿(**缺一即只修了一半**):腿A = 139 → 期望值;**腿B = 零诊断 → error[N06](正据)**
| TODO.md docs/superpowers/specs/2026-09-16-arg-inference-gap.md tests/selfhost/test_arg_inference_gap.py tests/harness/ci_hook_allowlist.txt
…te/cli_view_test.cr 未同步;第一腿自 2026-09-18 起硬失败)+ REBUILD.md 配方同改 + 实测分布加注留痕 (#170)
…L=75(该句一度为假)+ REBUILD.md 加注点明他处 75 均为 76 档之前实测值 (#171)
…T3 拼接源 → T4 自源改写法 → T5 自源 parser → T6 语料 → T7 收尾重锁;判据三代换代表 + 反向规范化对拍(零构建下判 T4 只改形状) (#172)
…量花括号四格拆表(1 真 + 1 注释提及,零字符);探针修一处空壳绿(清单走工作副本 + 读失败被吞 ⇒ 空语料 0==0 PASS)改 fail-closed + 清单内容同源 (#174)
…指三轴+组合根)· faq .ccr 版本 v6→v9(指 ccr_io.cr::CCR_VERSION 为准)· corec2 死循环条目加修订注(不再阻塞,corec2==corec3) (#175)
基底问题(本轮探明的根因):本地那堆 v4 改动原在 dbadb8d 上(落后 develop 24 提交、
缺 104 档文件——其中恰含 develop 已合入的施工计划与 T0 布局规格),所以「改了一大半
v4 语法」却看不到计划。本笔把堆 rebase 到 develop(920b1cbb)。

- 前端(T1/T2):bootstrap/corec 取 feature/v4-migration-t1t2 的**计划版**实现——
  39 关键字 + NEWLINE/INDENT/DEDENT 发射 + parser 吃 INDENT…DEDENT(取代 {}),
  随附判据载体 tools/v4_frontend_probe.py(94 条,含正反两态);唯一 FAIL 是
  J-T1-2「两套前端关键字一致」= 批末判据(自源侧属 T5)。
  本地那套「双形并存」实现退居 bookmark wip/v4-local-stale-base(bb8cb353)备查。
- 自源面:src/compiler 恢复 develop 版(本地双形自源改动按计划留待 T5 重做)。
- T3:build_selfhost_native.py 的 wrapper 与 tests/selfhost/test_compile.py 的内联源
  改 v4 形(`:` + layout)。(tools/build_stdlib.py 无 wrapper 行,计划该格不适用。)
- 文档:48 档冲突逐档合(事实/结构/引用以 develop 为准,本地较新的事实与风格保留)
  ⇒ 0 冲突;另恢复被堆清空的 docs/superpowers/plans/2026-07-30-lazy-eval.md(develop 186 行)
  并删两枚 .tmp 原子写残骸。
- 判据现状:T1/T2 探针 94 条(93 PASS);tests/bootstrap 全红 = (乙) 预期
  (料语料仍 v3);src/** 语料未动(花括号 14,962 / `;` 18,663)⇒ T4 起点。
工具(一次性迁移工具,非常设判据):tools/v4_migrate.py + tools/v4_migrate_v3lex.py(vendored v3 扫描器)

## 结果(92 档 = src/**/*.cr 全量)
- **85 档已迁移**(内容改变)· **6 档 no-op**(本就无 {} / ;,v4 形与 v3 形逐字节同:
  compiler/_import.cr · linker.cr(0 字节) · regalloc-consistency.cr · lsp/_import.cr ·
  stdlib/_import.cr · targets/x86_64-linux/_import.cr)· **1 档未迁移**(compiler/elf.cr)。

## 判据读数
- **V1(v4 前端解析,最强)**:91/92 过;唯一挂的恰是未迁移的 elf.cr。我**独立复跑**确认同一读数。
  三条反向突变(region 头缩进错 / 删 `:` / sibling 错位)全红 ⇒ J-T4-3 由 V1 直接兜住。
- **V2(只改形状的证明)**:76 档**逐 token(类型名, 词素)完全相同**(我另抽检 fmt.cr 1507 token /
  checker.cr 21361 token 独立复核 = IDENTICAL);9 档的差异**恰为**本笔裁定的显式改写,
  逐条 difflib 可读:dyn_arr 1 · parser 7 · ld 14 · cli 4(unsafe 上提 + return 补写)·
  interp 4 · main 1 · module 1 · opt 1 · provenance_verify 1(空 region 裁决,全是纯 delete)。
  口径补正(采纳):不能一把抓全丢 `;`/`{}` —— `[T; N]` 的 `;` 与 struct 字面量的 `{}` 必须保留;
  v4 侧的块开是 `COLON_BLOCK`,也须列入丢弃集。首轮不做此区分时假红 701/38 项。
- **V3(计数)**:`{`/`}` token 级 11,378 → **1**(只剩 src/stdlib/toml.cr:268 的 struct 字面量);
  `;` 29,556 → **16**(全是 src/stdlib/collections.cr 的 `[T; N]`)。
- **V4a 注释行:10,289 → 10,636(↑,0 档下降)· V4b 空行:2,583 → 2,596(↑,0 档下降)**。
  ⇒ V4b 是本笔**新增的判据面**:我抽检 fmt.cr 时抓到空行被吞(17→6,`}` 行消失时把相邻空行一起吃了),
  要求修(根因两条:`_plain_gap` 连续换行吞行 + EOF 收尾少一个 `\n`)并扩成 A/B 双读数。

## 本笔裁定(附理由,逐条留痕)
- **空 region 12 处 / 7 档**(计划只记 3 处——「只含注释的块」与 `{ }` 在 token 面不可区分):
  5 处按规则自处理(无 else 且条件纯局部量的 `if … { }` 整条删;只含注释的函数体补匹配返回类型的显式 `return`);
  7 处逐条裁定后全批(if/else-if 链整条删 · `if str_len(…) > 0 { }` 整条删(str_len = fmt.cr:4-8 纯读取,
  我实核)· 空 `else` 从句单独摘除)。
  **已知偏差**:main.cr:21 / module.cr:172 删掉的条件各含一次内存读 ⇒ 无效指针下原式会陷阱而删后不会;
  列为 B1/B2 建起来后的重点核对项。
- **`unsafe { … }` 作值 10 处 / 3 档**(ld 6 · cli 2 · parser 2):v4 里 unsafe 是 region(语句位),
  实参位是表达式位 ⇒ 原式非法。前端加「**region 作声明右值**」后机械上提临时量(10 处全为单个
  `@str_of`/`@ptr_of`),求值次数与副作用次序逐条论证保持。
- **elf.cr 不迁移**:死文件(三面清单皆无)+ v3 下也解析不过(86/375/380/388 行各缺一个 `)`)+ J4 载体。

## 前端与文档的配套改动(本笔)
- `bootstrap/corec/frontend/parser.py`:`_at_line_end()` 增**第三态**「prev == DEDENT 即行边界」
  ⇒ `x := unsafe: …` 这类以 region 收尾的声明可解析(实测 OK)。
- `docs/core-language-syntax_v4.md` §4.1:新增「region 作声明右值」(含反向不成立:`f(unsafe: …)` 非法)。
- `docs/maintainer/design/v4-layout-spec.md` §10:T0 补遗三节(括号外续行非法 · 空 region 无法表达 +
  裁定与留痕 · region 作右值),逐条带施工期实测。
- `tools/v4_frontend_probe.py`:修 `selfhost_keywords` 抽取(原按 `\n}\n` 切块,v4 形下当场 ValueError)。
- `docs/superpowers/specs/2026-09-11-policy-injection-design.md:439`:`缺口` → `口子`(避免与该文
  其余 5 处「缺口 = 缺失项」撞义)。

## 批内位置
T0 规格 ✓ · T1/T2 ✓(探针 94 条)· **T3 ✓** · **T4 ✓(本笔)** · T5 自源 parser · T6 其余语料 · T7 收尾重锁。
⇒ 此刻 tests/bootstrap 仍全红、自举链仍断 —— 这是 (乙) 的**预期中间态**(前端已硬切,自源尚未跟上)。
## 问题(上一笔 T4 暴露的语义漂移)
T4 把语料从 v3(`{}` + `;`)改写成 v4(`:` + layout)后,全量构建虽过(BUILD SUCCESS),
但 checker 刷出 **450 条 `Function …: expected return type …` + 308 条 `If branches have
different types`**。根因:v4 没有 `;` ⇒ 语句末的裸表达式被当成 **region 尾值**(`Block.expr`),
而 v3 里它是 `ExprStmt` ⇒ 块类型改变 ⇒ 函数推断返回类型改变。
**token 级判据(T4 的 V2)天然看不见它**(token 流完全相同,差的是 AST 形状)。

## 修法:位置语义
依据 = v4 目标语法 §7.4(函数无隐式尾返回)+ §4.1(region 作声明右值取尾值)+ **v3 逐形等价**:
- **表达式位**(声明/赋值右值、`return` 的值、调用实参、索引、括号内、match 臂体等,
  统一走 `_want_value_expr()` 入口)⇒ **保留尾值**。
- **语句位**(`parse_stmt`、函数体、`loop`/`while`/`for` 体)⇒ 末项裸表达式包 `ExprStmt`;
  **例外(v3 等价)**:**块状末项**(`If`/`Match`/`Loop`/`For`/`Unsafe`/`Flow`)**保尾值**——
  v3 的 `;` 只终止**普通**表达式语句,块状语句从不带 `;`,它本来就是 v3 的暂定尾表达式。
  (对块状语句说「等价 v3 带 `;`」是凭空补一个 v3 没有的 `;`。此条是实施者发现「我给的规则①
  与我列的验收③互相矛盾」后**停下上报**、由我裁定采纳的。)

## 读数(均实测;我对主判据做了独立复跑)
- **两类类型告警 758 → 20**(`expected return type` 450→7 · `If branches` 308→13);
  对 (单元, 消息) 多重集做差:**新增 0 条**。残余 20 条根因与尾值无关(`loop:` 尾项被判 unit、
  `ReturnStmt` 被判其值类型),v3 同报。
- **三产物 sha256 与改前逐字节相同** ⇒ **纯判定面修复、发射面零变化**(T4 语料语义未动)。
- 全量构建 `=== BUILD SUCCESS ===` + 三条 `[GUARD] error[ = 0`。
- **T1/T2 探针 94 条 / 1 FAIL**(唯一 FAIL 仍是批末判据 J-T1-2)——**我独立复跑确认**。
- 四格对照(我独立复跑):v3 if尾随 0 / v3 赋值尾随 1 = v4 if尾随 0 / v4 赋值尾随 1 ⇒ 逐格等价。
- 反向对照:改前 parser 在同串上报 `If branches have different types` ⇒ 判据非空转。

## 本笔另含(T4 收口)
- **空行收拢(按删除缝)**:裁定删掉的整条 `if … { }` 在同一 region 内留下的连续 ≥2 空行收成 1。
  **只收 3 处**(main.cr · module.cr · interp.cr)——先测出语料本就有 **11 档**存在「连续 2 空行」的
  **原有写法**,全局收拢会平白吃掉原文空行、让 V4b 假性下降。反向对照:≥2 空行多重集的变化档数 = 0。
- `tools/v4_migrate.py`:按缝收拢逻辑 + `V4B_BLANK_DROP_EXEMPT` 常量(注释写明**应为空集**)。
- `docs/core-language-syntax_v4.md` §4.1:`if` 作右值的例子**降为设计态/未实现**——实测
  `total := if ready: … else: …` 能解析能过检,但发射面丢值(`ir_gen.py` 的 `gen_if` 无条件
  `return None`;**既有缺陷**,改前 parser 同样复现)。可运行的是 `t := unsafe: <E>` 形。

## 另案(未动,已登记)
- `tests/bootstrap/{test_pipeline,test_borrow,test_generics}.py` 三档红 = 内联源码仍是 v3 形
  (改前/改后 parser 对 7 档归一化输出逐条相同 ⇒ 与本次改动无关)⇒ 属 **T6** 迁移面。
- 块值 `if` 的发射面缺口(上条 §4.1 注)⇒ 另开 TODO。

## 批内位置
T0 ✓ · T1/T2 ✓ · T3 ✓ · **T4 ✓**(+ 本笔位置语义闭合)· **T5 待起** · T6 · T7。
纯注释改动(行为与 4ad482d 逐字节一致:探针 94/1 复跑确认)。
- 规则①②③在 __init__ 里按最终口径重述:语句位控制流尾项保留 Block.expr,其余包 ExprStmt;
  表达式位一律保留尾值;收尾由「位置 ∧ 种类」共同决定。
- _is_block_like 的 docstring 补齐依据(v3 里控制流语句本来不带 ; ⇒ 本来就是块尾值;
  真正分叉的只是「带 ; 的表达式语句」),并留下「一律包 ExprStmt ⇒ 探针 94/5 转红」的反向实证,
  防止后人改回字面形。
- Flow 保留在集合内(同为开 region、以 DEDENT 收尾的块状形;实测 src/ 里 `flow:` 语句命中 0 ⇒ 零影响)。
两条均为 v4 迁移施工期产出,**只登记未修**;迁移对照表两行旧号列写 `—`。

- **#2026-10-11-1**:维护者裁定 `#` 族**只有使用面** ⇒ `#tag`(全族里唯一「用 # 声明新东西」的构造)属**范畴错误、该删而非改名**;
  连带两条结构性毛病(体是竖排序列而语义是**集合**=形状说谎;可复用名被关进标签族、不能 import/文档化/单测)。
  两个候选方向(未拍):**不留** = §10.8 整节删、复用只走库 + `spec fn`;**留** = 必须长成一个**非 `#`** 的声明形。
  卡住的面:`docs/core-language-syntax_v4.md` §10.8 + `docs/maintainer/design/spec-design.md:203`(旧形 `#tag sorted = { … }`,同面两形不一致)。
- **#2026-10-11-2**:`x := if c: 1 else: 2` 能解析能过检但**运行期得 None**;根因 = `bootstrap/corec/frontend/ir_gen.py` 的 `gen_if` **无条件 return None**。
  **既有缺陷、与迁移无关**(同片段走改前 parser 同样得 None);旁证 = `t := unsafe:` + `7` ⇒ 运行期 7(region 作右值这条通道是通的)。
  ⇒ v4 文档 §4.1 的 `total := if ready: …` 例子已降为「设计态/未实现」并注明根因。

判据:`python3 tests/harness/test_todo_id_migration.py` → **6/6 PASS**(J1 残留 0 · J2 悬空 0 · J3 映射完备 153/153 · J6 同日段唯一)。
## 交付(12 档,+1163 / −232)
- **`src/compiler/ast.cr`**:token 常量 `T_NEWLINE=103 / T_INDENT=104 / T_DEDENT=105 / T_COLON_BLOCK=106 /
  T_COLON_DECL=107`(**既有 0..102 一个未动**,从空洞外起)+ `T_NEVER=108 / T_CATCH=109 / T_FAIL=110 /
  T_SPEC=111 / T_PIPE=112`;`dyn` 复用既有 `T_DYN=99`(该号此前零发射点);解析器码 `EC_P_STRUCT_LIT_SEP = 1030`。
- **`src/compiler/lexer.cr`**:布局机件(缩进栈 / `g_bracket_depth` / `layout_skip_blank` / `colon_at_line_end` /
  `layout_break` / `finish_layout`;更浅且不匹配任何外层列 ⇒ **响亮报错**,不静默对齐);
  关键字表 **36 → 39**(去 `None`/`Some`/`move`,加 `catch`/`dyn`/`fail`/`never`/`none`/`spec`);
  `tokenize(_src, layout_bypass)` 旁路改**显式形参**(使 call site 原文即判据载体)。
- **`src/compiler/parser.cr`**:region 产生式 + 位置语义(`g_want_value`)+ 行边界三态 + struct 字面量分隔符
  **盲跳 → 校验 `=`**(未选定形响亮 `P030`)+ `match` 臂 `|` 前缀两形都收 + 删 `T_MOVE` 分支。
- **`never` 语义(两前端同改)**:以**发散语句**收尾的路径(`return`/`break`/`continue`)其类型 = `never`
  (不再是「所返回值的类型」),且 `never` 与任何类型相容;落点在**组合函数层**
  (`bootstrap/corec/frontend/type_checker.py` 的 `_compat` / `src/compiler/checker.cr` 的 `type_compat_strict`)。
- **`tokenize()` 调用点逐处复核(J-T5-1)**:实算 **10 处**(裸 grep 13 − 定义 1 − 注释 3 = 9,+ `lsp/lsp.cr:179`;
  计划 §7.2 的「12」是旧口径,T0 §5.4 已更正为 9/10)。**唯一需要旁路的是 `parser.cr` 的 `interp_parse_holes`**
  (洞是从源切出的表达式、无 layout 上下文;不旁路会伪造缩进状态并改写外层缩进栈)。其余 9 处**不旁路**,
  逐处给出理由(其后都有 `res_imports`/`parse_all` 等 layout 消费者)。

## 判据(我独立复跑主门)
| 门 | 读数 |
|---|---|
| **J-T5-3** `./build/corec clean-cache` + `check src/compiler` | **rc=0 · 零诊断 · `ok`**(改前 12638 条诊断)——**我自跑复核** |
| 同一门 CI 形态 `CI_JOB_NAME=check src/ci/run.sh` | rc=0 |
| **J-T5-2** `corec2`/`corec3` 两次构建 + `cmp` | **IDENTICAL**——**我自跑复核**(corec2 编 arith 运行 = 110) |
| **T1/T2 探针**(含新增 `positions` 52 条) | **146 条 ALL PASS**——**我自跑复核**(J-T1-2 真绿:两表皆 39) |
| J-T0-5 零构建半 | `tools/v4_layout_probe.py tokenize-sites --require-bypass` ⇒ rc=0 · YES |
| 两套前端诊断集一致 | 35 条差分样例逐条同判 |
| v3↔v4 逐字节等价 | 10 组同程序对(v3 文本走代 0 vs v4 文本走 T5)**10/10 输出逐字节同** |
| 反向对照 | ① 代 0 读 v4 ⇒ 4/4 rc=1 零产物;② 破坏「行尾 `:`」判定 ⇒ 3/3 BUILDFAIL;③ 摘洞内旁路 ⇒ `P27`;④ 撤 `never` 相容 ⇒ 两前端各自把诊断**全部打回**(自源 `ICE04` / bootstrap 两条齐回) |

**语料一字未动** —— 裁定的 `never` 语义把 2 条 `TC02` 全部消解,故「改 `main.cr` 语料」的候选作废。
(`main.cr` 本笔的两处改动是 `tokenize(g_source, 0)` 的**签名扩展**,非语义改动。)

## 施工期挖出的两条(前者已登记另案,后者见 TODO)
1. **改前 12638 条诊断的头号根因 = 「把注释的列当成 anchor」**:`ast.cr` 里 `TY_DEX_S … // 注释续行` 处
   伪造出 `INDENT(22)`。⇒ 布局扫描器必须**先吃空白+注释再判行首**(纯空行/纯注释行成 no-op;T0 §1.1 判定①同面)。
2. **`never ⊆ X` 在类型项引擎里是未覆盖面**:`ty_sub(never, named)` 返回 **-1** ⇒ `error[ICE04] (uncovered face)`。
   本批只在**组合层**兑现语义 ⇒ **两层对「`never` 作子类型」的认定当前不一致**(组合层收、引擎层 -1)。
   当前 `src/**` 零命中(三绿即证),但属**潜在缺口**,另案登记。
3. **两套前端的 block-like kind 清单本就该不同**:自源侧 `EXPR_WHILE` 是独立 kind(Python 侧 desugar 成 `Loop`),
   `Flow` 在自源侧不是表达式节点 ⇒ 判据锚在**语义**(v3 逐形等价),**不锚 kind 名**。已写进 `is_block_like` 头注并注明
   「禁止为『两边清单长得一样』而增删」。

## 另案(未动,逐条留痕)
- `fail`/`catch` **两套前端均无产生式** ⇒ 本批「发散出口」只覆盖 `return`/`break`/`continue`(计划 §十.5 定其语义属另一批)。
- **bootstrap 的 `none` 拼写面**:`src/**` 真实使用 0 处;但 `tests/bootstrap/test_pipeline.py` 的
  `'V4 lowercase none'` 用例与 `tests/selfhost/test_compile.py:179` 真用 ⇒ 自源 rc=0/运行 42 ✓、bootstrap
  `Undefined name: none` ✗ ⇒ 已固化进判据档的真实分歧,另行处置。
- `tests/selfhost/`(78 档)2 绿 / 76 红,**逐档归因 = 内联语料仍是 v3 形**(T6 面);`tests/bootstrap/*.py` 同因。
…;组合层与引擎层认定不一致(v4 T5 施工期实名,本批只在组合层兑现,未碰 ty_sub)

判据:`python3 tests/harness/test_todo_id_migration.py` → 6/6 PASS。
## 1. `none` 作值(T1/T2 面欠账)
`parse_primary` 的 `T_NONE`/`T_SELF` 合成一格 ⇒ **拆开**:`T_NONE` 归一到 canonical 零载荷变体
`EnumConstructor(['None'], [])`(与自源同语义)。
`NameResolver` 内建表**不需要**补 `none` —— 归一路径根本不经过名字解析,且补一个 `Ident('none')`
反而会让节点缺 `__variant`、断掉 desugar 臂比较与 `ir_gen` 的 `MakeEnum`
(**这是实施者对我的方案的一处正确更正**,我采纳)。

- 正:判据档原样源(`value := none` + `| none => 42`)⇒ resolver=[] · checker=[] · **运行 42**(与自源同值)
- 反:把该格改回「当标识符」⇒ `Undefined name: none` + `Comparison not allowed` 齐回

## 2. 基本类型 `T?` 的**语法面**
依据 = v4 文档 §3.2 原文(`value : int? = 5`)+ 两前端同语义。
`parse_type` 收尾结构重排:`never`/`dyn`(关键字令牌)· `base_types` · `unit` · `PathType`+泛型实参
**四族并入同一条 if/elif/else 链**,链后**唯一一个** `?` 处理点(四族共用)。
选「并入同一条尾部」而非「早退前再写一份 `?`」= 避免同一判定两份实现(T0 §2.3 明令)。

- **接受矩阵 10/10 与自源逐格一致**(`int?`/`dex?`/`bool?`/`string?`/`char?`/`unit?`/`never?`/`dyn?`/
  `Self?`/`Foo?`)——**我独立复跑**。中途只改 `base_types` 一族时,矩阵暴露 `never?`/`dyn?` 两格残余
  (它们是关键字令牌、走另一条早退)⇒ 一并并入同链,残余清零。**这条是被矩阵逼出来的,不是看出来的。**
- 反:撤掉「`?` 唯一处理点」⇒ 四格全部复现原错

## 3. ⚠ 本笔**未达成**的部分(另案,非本笔范围)
四格现在**解析全过**但**check 全不过**:bootstrap 的 `type_checker.py` 里 `OptionalType` **0 处命中**
(`grep` 一命令可复现)⇒ bootstrap **完全没有 `T?` 的语义面**(无 `T ⊆ T?` 注入、无 `none : T?`、
无可选值 match 面)。那是把自源 R2 P3 Task 4 的可选表示机制(`TYP_NULL`/`TYP_OPTIONAL`/`g_optrep_on`/
`IR_MAKE_ENUM`/match 两分支面)搬到 Python —— **一笔独立的批**,不是「补几行」。
⇒ 本笔只兑现**语法面**;语义面登记另案(见 TODO)。

## 4. 实施者对我一处前提的更正(采纳)
我派活时写的「不修就卡 T6」**不成立**:T6 语料走**自源**编译器(`tests/suite/*.cr` 由 `./build/corec`
编译、`tests/selfhost/*.py` 驱动 `./build/corec`),只有 `tests/bootstrap/*.py` 驱动 Python 前端,
而该目录 `T?` 用量 **0**(实测 grep 空)。
⇒ 本修的**有效依据是另两条**(都成立):① 两前端同语义(本批硬判据);② v4 文档 §3.2 的目标形。

## 5. 复跑读数(我独立复核前三条)
`tools/v4_frontend_probe.py` **146 条 ALL PASS** ✓ · `clean-cache` + `check src/compiler` **rc=0 零诊断** ✓ ·
7 档 harness 机械门 **7/7 rc=0** ✓ · `T?` 形参位 10 格解析 **10/10** ✓。

## 6. 顺带实名一条**既有缺陷**(代 0 同病,但**会卡 T6**)
`enum E: V(int?)` **能编过但运行 rc=139(SIGSEGV)**;`/tmp/v3ws` 的代 0 编译器对 v3 形
`enum E { V(int?) }` **同样 139** ⇒ **非 T5 引入**。
⇒ 但 `tests/suite/opt_dex_test.cr:20` 逐字 `enum EOpt { V(dex?) }` ⇒ **T6 会撞上**。另案登记(见 TODO)。
…的枚举变体运行 SIGSEGV,代 0 同病,会卡 T6)

两条均 v4 迁移 T5 施工期实名,**只登记未修**;迁移对照表两行旧号列写 `—`。
- **#2026-10-11-4**:`grep -rn OptionalType bootstrap/` ⇒ type_checker.py 零命中 ⇒ bootstrap 的 `T?` **语法面已通、语义面全缺**
  (无 `T ⊆ T?` 注入、无 `none : T?`、无可选值 match 面)⇒ 四格解析全过、check 全不过。修法 = 搬自源 R2 P3 Task 4
  的可选表示机制。**当前不阻塞**(tests/bootstrap 与 src 的 T? 用量皆 0)。
- **#2026-10-11-5**:`enum E: V(int?)` build rc=0 但 **run rc=139**;代 0(`/tmp/v3ws` @ 920b1cb)v3 形同样 139 ⇒ 既有缺陷。
  **但会卡 T6**:`tests/suite/opt_dex_test.cr:20` 逐字 `enum EOpt { V(dex?) }`。

判据:`python3 tests/harness/test_todo_id_migration.py` → 6/6 PASS。
## 一、T5:六项「文档 vs 实现」冲突,全部按「以文档为准 ⇒ 改实现」落地(两套前端同改)
| # | 文档依据 | 内容 |
|---|---|---|
| ① | §10.1 | `#check`/`#ensure` 写在 **region 开头**(inline 保留为**兼容**,文档只写 region 头);含 `need_eol` 补漏(同行 `return` 被当第二条 region 项) |
| ② | §13.5/13.6/13.7 | **顶层前导 `@`** 注解(白名单 `hotpatch`/`ffi`/`preferredDomain`/`executionDomain`);笔误响亮报错 |
| ③ | §11.3/§13.7 | **`flow name(...)`** 文档形(`flow fn` 保留兼容;2×2 矩阵两格全绿) |
| ④ | §13.7 第三例 | **语句前导位 `@`**(`@preferredDomain(gpu)` 在 `loop:` 前);白名单 = **文档释文 + 语料实证**(含 `NoBoundsCheck`/`fast`/`unroll`/`section`),口径已写进**两处代码注释**并注明「禁止后人按章号再收窄」 |
| ⑤ | §1.6(新裁) | **region 可为空**(7 个 region 头位全覆盖);**运行时硬证**:空 `loop:` ⇒ 运行 rc=124(真死循环,`never` 语义不破);空函数体 ⇒ `TF01`(无尾值为真) |
| ⑥ | §7.3 | **`=>` 后开 region**(多行臂体);`=>:` 收为兼容(文档无此形) |

**反向对照累计 7 条**(flow 文档形 · `need_eol` · 语句位 `@` · `never` 相容 · 空 region · match 臂体 region · `=>:`),全部必红。

## 二、判据面:`never` 裁定 × 空 region 规格化的交汇(**四方互斥,见下**)
T5 用**六行实测表**证明:**硬门(`check src/compiler` rc=0 零诊断)与四方钉子在本设计空间内互斥**——没有一行同时满足。⇒ 裁决(维护者 2026-10-11「按 T5 的建议」):
- **(a) 位置规则保持现状** ⇒ **`nail2` 让**(`if 1<2: 1 else: "s"` 的 v3 `;`-less 语义在 v4 不可表达;三条救援路分别要 86/102/270 条诊断且破 `-> never` 惯用形);
- **(b) `return ⇒ never` 保留** ⇒ **`nail3` 让**,但**新增判定面**把它要回:`EXPR_RETURN` 处取**当前函数声明返回型**做 `type_compat_strict`(承载 = `g_cur_fn_ret_ti` 显式上下文)⇒ `test_tc02_branch` **13/15 → 14/15**(唯一剩红 = 已裁定让的 `nail2`);
- **(c) `TI_ERROR` 独立哨兵**(把「真 `never`」与「错误恢复」分家;收窄到 `infer_expr` 侧,`res_type_node` 全族不动)⇒ `nail4` **部分**:`q1/q2/q3` 如预期,`ta1` **仍未回归**(见三);
- **`nail1` 空-region 判别式**(`then_ti == TI_NEVER ∧ else 是零项 EXPR_BLOCK`)⇒ F1–F7 逐格如预期(含 **F2 反向钉**与 **F7 回归钉**),构造性不碰 `src/compiler`(谓词在那两处恒假)。

## 三、悬空账(**如实留档,不许人动**)
- **`nail4`「同一节点第二推断来源」**:判别探针(`d1`/`d2`)证实 `undef_x` 的 ti **有第二个来源**(`EXPR_IDENT` 的 `UNDEFINED→TI_ERROR` 未参与赋值位那条链);4 项已排除、3 条候选(`collect_decls` 预登记 / `ast_set_type_val` 回填 / `res_type_node` 族)**未验完 ⇒ 按裁定挂起**。
  ⚠ **代价已被量出**:3 档 `tests/probes/` **负例探针被静默接受**(`n05_recursive` rc=1`{TS03}`→rc=0 · `n10_named_vs_int`/`n21_t_assign_int` rc=1`{TA01}`→rc=0),同文本跨三次二进制读数差证「必在二进制侧」;且 **`probes_run.sh` 不在任何 CI job 里**(只在 `src/ci/run.sh:129` 的注释中被提及)⇒ **无自动门看着**。
- **`-> int` 返回 `bool`(新判定面暴露的既有偏差)**:检查闭包内 **3 处**(`type_engine.cr::lit_implies`)+ 闭包外 **8 处**(`src/kernel/**`,`build_kernel.py` 只编译不 lint)= **11 处 / 3 档**。语义上 = 本编译器「`bool ⊆ int` 可隐式」的既有约定 ⇒ **待维护者裁**(认可 ⇒ 豁免转长期项且应写进语言面;不认可 ⇒ 11 处源该改)。**当前代码保持豁免,只限这一对**。
- **不带码 `add_error` 被带码诊断遮蔽**(`main.cr:133-137` 的次序:`g_diag_count > 0` 先命中 ⇒ `print_parse_errors()` 永不到达);正控已证机制(唯一诊断不带码时才打印)。
- **`corec run` 包裹壳的 `;`-切分启发式**(`main.cr:356-391`,7 段内嵌源)——设计缺口,非字符串迁移。

## 四、T6 语料迁移(`.cr` 135 档 + 内联 Core 85 档 `.py` + 63 档 `.md`)
- **`.cr`**:已迁 **125** / no-op **5** / 未迁 **5**(`legacy_asm_backend`×4 按计划 §十 #10「不迁」+ `t2_neg_unclosed` 工具中止)。
  **B1/B2**(pre = `920b1cbb`×v3 文本 · post = 钉版 sha `0e23a78a…`×v4 文本):① 严格等价 **113** · ③ 真空集 9(**不当绿灯**)· ④ 其余 13(未迁 5 · 改善方向 1 · **负例失效 3** · 二进制侧新增级联 3 · 代际面变化 1)。
  **`E4/E6` 撤回**(用改语料绕前端缺口 = 把缺陷藏进语料)⇒ 待 T5 实现到位后 `opt_dex_test`/`apx_conversion_test` **双双回到严格等价**——**裁定的正确性由结果证明**。
- **内联 Core**:`.py` 绿档 **2/85 → 61/85**、**由绿转红 0**;`.md` 63 档**注释记号 1607→1607、空行 5829→5829 逐数不变**,384 块 0 违规;`rebuild.sh:71` 冒烟改 v4 形(实测 rc=42,**`[4/4]` 在 `PINNED_REV` 换代前必红 = 已知窗口态**)。
  **构建窗口闭环**:`purity_selftest.cr` 23 段迁后 `tests/selfhost/test_purity.py` **rc=1 → rc=0**(改前实证 `expected ':' to open a region, got ''`)。
- **过渡形登记**:`E2`(`#check` inline)9 档 + `E3`(`@hotpatch` 并入声明行)1 档 ⇒ **目标形 = 文档形**,**翻转时点 = T7 窗口**(一次重建后两形都收)。维护者已同意。

## 五、其它
- `src/` 空 region 处置:**2 处回流**(`main.cr::read_source_file` · `module.cr::load_imports` —— T4 按旧政策整条删掉时**连带删掉一次内存读**,回流后消掉该「已知偏差」);**其余 10 处保留删除**(无副作用的空 `if`,删除等价且更干净)。**口径留档:判据 = 改动是否变了可观察行为。**
- `src/compiler/checker.cr` 本笔含 `TI_ERROR` 27 处 + `nail1` 判别式(逐行带理由注释)。

## 六、判据(我独立复核的那些)
`check src/compiler` **rc=0 零诊断** · `corec2 == corec3` **IDENTICAL** · `tools/v4_frontend_probe.py` **146 条 ALL PASS** · 7 档 harness **7/7**。
重锁四类对象(逐条实测,见 tools/baseline/ 头注留痕):
1/2 canary 5 值 + .ccr 四条 —— **实测零变化 ⇒ 不重锁**(D1 确定性 5/5 绿 + F3 5/5 同)。
    归因:本批是前端形状迁移,不动发射器/后端;STR 段由被编译程序驱动而非编译器源排版。
    反向对照:把 pa_ccr 植回 2026-09-20 旧值 ⇒ canary_check.sh --verify-only 必红(2 项 FAIL)。
3/4 二进制 sha 白名单 3 条 + PINNED_REV —— 97f4394(v3 末代) → 25e7019(v4 迁移 T6 收官)。
    依据 = v4 可读性硬约束(旧 rev 只认 v3 形,rebuild.sh:71 冒烟已改 v4 形 ⇒ 旧 rev 下必红)。
    自证:rebuild.sh 重建三 sha 与白名单逐条同 + 冒烟 42 + 与工作树自建二进制逐字节同。
    旧 rev/旧三 sha 留痕(rebuild.sh 注 + REBUILD.md 历史表)。

过渡形翻转(与本次重锁同批):
E2 —— 9 档 tests/spec/*.cr 正例的 inline `#check` 改文档 §10.1 的 region 头形;
E3 —— tests/suite/hotpatch_test.cr 的 `@hotpatch` 改文档 §13.6 的前导 `@` 形。
    翻转前后逐档 rc + 码集**逐格相同**;tests/selfhost/test_spec_grammar.py 48/48 绿。

收尾复跑(实跑读数):v4 探针 146 ALL PASS · check src/compiler rc=0 零诊断 ·
corec2 == corec3 IDENTICAL · canary 5/5 + carrier 7/7 · probes 29 档 20×0/9×1
(已知 3 档 rc 1→0:n05/n10/n21,checker 侧悬空账,非本面)· parity 76 档 43×0/33×1 两腿零差异。

判据面清理:parity_run.sh CORPUS_TOTAL=76 与实算一致(36+2+15+19+4);
REBUILD.md:77/82/130 的「75 档」加当时值标注 + 补 T7 自建基线分布;tests/spec/README.md 74→75 改 76。

已知遗留(预存,非本笔引入,T6 修订处同样红):tests/harness/{test_lsp_builtin_table,
test_criteria_mutations}.py 的锚点正则未随 v4 形状更新 ⇒ 各自 L1-L4 / M7-M10 红。
## 1. `tests/selfhost/test_string_interp.py`(**我们这批引入的真缺陷**,会让 CI 整 job 断)
- **根因**:`build_run()` 的 Core 载荷模板在 T6 内联迁移时被**机械折叠成单行**,**`%s` 前多了 4 空格**
  ⇒ `extra_body=""` 时生成 **8 空格缩进的 `return 0`**(比上一行更深)⇒ v4 parser 报
  `error[P02]: unexpected dedent at top level`;另 `:130` 的 `extra_body` 仍是 v3 形带 `;`。**两处缺陷**。
- **归属**:`jj diff -r` 逐提交实核 ⇒ 仅落在第五笔 `25e70197`;干净 rev `920b1cbb` 模板**良构 v3**。
- **⚠ 严重性**:该档是 **`src/ci/run.sh:334` 的 `selfhost-tests` 挂点**,且 `run.sh:15` = **`set -euo pipefail`**
  ⇒ 该档 RC≠0 会**直接中止整个 `selfhost-tests` job**(不是单档红)。
- **修**:模板 `%s` 前**去掉那 4 空格**(恢复 v3 契约「`extra_body` 自带缩进」)+ `:130` 去 `;`。**期望值一字未动**。
- **读数**:`python3 tests/selfhost/test_string_interp.py` ⇒ **RC=0 · 失败项 [] · B 组 14/14 PASS**。
- **同款扫描**:全仓 `tests/*/*.py` 搜「`\n    %s` 折叠模板」= **仅此一处** ⇒ 单点机械错误,非普遍现象。

## 2. `tests/harness/test_lsp_builtin_table.py` + 3. `test_criteria_mutations.py`(锚点抽取去 v3 形)
两档因 v4 形状而**抽取为空**(预存红,非新引入):
- `annotation_names()` 原以「首个顶格 `}` 行」为体边界 ⇒ **v4 函数无闭括号** ⇒ 抽到 `None` ⇒ L3 红;
- `lsp_at_names()` 原以 `return out;` 为界 ⇒ v4 无 `;` ⇒ **抽到空集**;
- M7–M10 的 11 个锚 + `mut_self_item2` 真跑腿锚 = v3 形(`{`/`;`)⇒ `str.count` 全 0。
**修法:只改「抽取」层,断言一字未动**;边界判据统一改走新增的 `top_level_body()`
(「`fn` 行之后首个**顶格行**」= v3 的 `}` 与 v4 的下一顶层构造同为**排他**边界,取出同一段体)。
**M7 真跑腿探针载荷**同步改 v4 形 + `None`→`none`(**先实测再改**:在未突变树先编译,确认 rc=0 且回 30 才落笔)。

## 判据(实跑)
- `tests/harness/*.py` **7 档全 RC=0**(`criteria_mutations` 27/27 含真跑腿开 · `lsp_builtin_table` 4/4)。
- **含牙证明**:L4-①~④ 逐条实跑;M1–M6 的 20 个突变体;**M7–M10 的「咬合证明」**(内存内撤掉该判据所描述的守卫 ⇒ 锚归 0)
  ⇒ 证明**锚与突变同处**(判据咬的正是它自称咬的那处)。
- `nice -n 19 ./build/corec check src/compiler` ⇒ **RC=0 / `error[`=0**(证明未动 `src/**`)。

## 同族登记(**不改**,附后人防误读标注)
- `tests/harness/test_lsp_builtin_table.py:195` · `tests/harness/test_ir_ref_sites.py:90` —— 追加载荷为 v3 形,
  **形状陈旧但当前仍工作**(锚正则不涉 `;`/`}`)⇒ 登记不动,免得后人见 v3 形以为漏迁。
…· 设计缺口 1 · 发布步骤 1 · 登记不动 1 · 语料另案 1)

逐条(按标题行号 = 序号):
- **#2026-10-12-1**【缺陷·checker】`nail4` 同一节点**第二推断来源**(`undef_x = 0` 的 LHS ti 非错误哨兵);★ 代价 = **3 档 `tests/probes/` 负例探针静默接受**(`n05_recursive`/`n10_named_vs_int`/`n21_t_assign_int`)+ **`probes_run.sh` 不在任何 CI job 里** ⇒ 无自动门。已排除 4 项、剩 3 条候选未验 ⇒ **维护者裁定挂起**。
- **#2026-10-12-2**【既有约定·待裁】`-> int` 却 `return` `bool`:**11 处 / 3 档**(闭包内 3 `type_engine.cr::lit_implies` + 闭包外 8 `src/kernel/**`);「`bool ⊆ int` 可隐式」是否为**语言面规则**。**新判定面(nail3)的第一批战果**。
- **#2026-10-12-3**【诊断面·系统性静默】不带码 `add_error` 只要同批有带码诊断就**永远不打印**(`main.cr:133-137` 次序);正控已证机制。
- **#2026-10-12-4**【设计缺口】`corec run` 包裹壳按**行尾 `;`** 切分(`main.cr:356-391`);`has_main != 0` 时不执行 ⇒ 不影响 `rebuild.sh` 冒烟。
- **#2026-10-12-5**【**发布步骤·非缺陷**】`PINNED_REV` 与 squash 合入耦合:`25e70197` 不进 develop 历史 ⇒ **合入那一步须同批重指 + 重锁三 sha**。
- **#2026-10-12-6**【判据面·登记不动】两处 v3 形载荷(`test_lsp_builtin_table.py:195` · `test_ir_ref_sites.py:90`)——形状陈旧但**当前仍工作**,防后人误读为漏迁。
- **#2026-10-12-7**【语料面·另案】inline 过渡形**余 15 档**未翻文档形(负例本体 + `t3_pos_ensure_*`);两形都收 ⇒ 不阻塞。

判据:`python3 tests/harness/test_todo_id_migration.py` → **6/6 PASS**(J1 残留 0 · J2 悬空 0 · J3 映射完备 · J6 同日段唯一)。
…#apply`/`#rewrite`)+ **删除 `#tag`**(明写「Core 不引入用户可见的策略定义机制」)

维护者 2026-10-12 给出更新后的 §十,逐字落盘(仅补齐标题层级)。相对旧版的三处实质变化:

1. **§10.3 由「`spec fn`」改为「可复用命题与纯函数」** —— **Core 不引入 `spec fn`,所有函数都是 `fn`**;规约表达式可调用**任何被编译器判定为纯、终止、可判定**的函数(纯性由 HDFG 自动推导,不需用户标记);有副作用/不终止/不可判定者出现在规约中 ⇒ **编译器直接报错**。
   ⇒ **函数契约本身就是可复用的命题**:已证明的函数经 `#apply`/`#rewrite` 引用,`#apply(append_assoc)` 引用的是那条**全称命题**。
   ⇒ 规约表达式中的**自由变量自动泛化为全称闭包**(`#ensure(append(xs, Nil) == xs)` ≡ `forall(xs: List) => …`)。
2. **`#tag` 整节删除**(原 §10.8)—— 改为明写「**Core 不引入用户可见的策略定义机制;战术库的扩展通过普通模块和导入完成**」。⇒ **这正是此前设计讨论里判为「范畴错误」的那一处**(`#` 族应只有使用面)**由维护者裁定落定**(TODO #2026-10-11-1 据此闭档,见该条更新)。
3. **战术标签重组为四类**:提示标签(`#induct`/`#cases`/`#unfold`/`#rewrite`/`#apply`/`#exists`)· 语义范围标签(`#graph.*`)· 判定与求解标签(`#ring`…`#smt`,**只能在 VERIFY 阶段执行**)· 预算标签(`#budget`)。

另:§1.3 关键字的注里删掉 `#tag` 并加注「战术标签里**没有**『策略/标签定义』这一形」。

§10 体量:旧 388 行 → 新 322 行。
…整节删除 + `spec fn` 取消)

该条所记三条毛病(`#` 既使用又定义 / 形状说谎 / 名字关在标签族里)由「**不引入该构造**」一并消除;
原记录保留供追溯。判据:`tests/harness/test_todo_id_migration.py` → 6/6 PASS。
feat(v4): 目标语法迁移(批内 T0–T7)
Normalize live docs and source comments: remove metaphors, process history, task ids, dated repair notes, and obsolete shorthand. Archive SDD reports, remove generated pseudocode, and update references.

Also register backend flags through the shared backend flag module, replace the negative TI_ERROR sentinel with ti_error(), remove the unused compiler ELF writer, and update affected test counts.
docs: rewrite live documentation and source comments
Comment thread tests/selfhost/test_at_rename.py

def run_corec_rss(args, timeout=1800):
"""同 run_corec,另回该子进程峰值 RSS(KB)。os.wait4 ⇒ 只算本进程,不受先跑子进程污染。"""
out_path = tempfile.mktemp(prefix="core_warm_rss_")
Comment thread tests/selfhost/test_generic_param_erasure.py
check(got == want, "%s · dest=_dxsc 计 %d(期望 %d;4 = 两遍各转一次 = 红)" % (name, got, want))

# ── C6:rc 中性 + 零产物(带/不带 --dump-params)────────────────────────────
elf_a, elf_b = tempfile.mktemp(), tempfile.mktemp()
check(got == want, "%s · dest=_dxsc 计 %d(期望 %d;4 = 两遍各转一次 = 红)" % (name, got, want))

# ── C6:rc 中性 + 零产物(带/不带 --dump-params)────────────────────────────
elf_a, elf_b = tempfile.mktemp(), tempfile.mktemp()

def params_of(src_path: str):
_clean_cache()
out = tempfile.mktemp(suffix=".cir")
p = _write(PROBE_KEYS)
tmp.append(p)
_clean_cache()
out = tempfile.mktemp(suffix=".cir")
@dslsdzc
dslsdzc merged commit 22e670d into main Oct 23, 2026
6 of 9 checks passed
@dslsdzc
dslsdzc deleted the develop branch October 23, 2026 01:45
@dslsdzc
dslsdzc restored the develop branch October 23, 2026 01:45
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.

3 participants