@furongjun1999/dsh-memory 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +7 -6
  2. package/docs/eval/cons200_/345/206/262/347/252/201/346/243/200/346/265/213/351/200/211/351/235/242_/345/256/236/346/226/275/350/256/260/345/275/225_v1.0.md +223 -0
  3. package/docs/eval/cons200_/345/206/262/347/252/201/346/243/200/346/265/213/351/200/211/351/235/242_/345/256/236/346/226/275/350/256/260/345/275/225_v1.1.md +340 -0
  4. package/docs/eval/issue50_/345/205/203/346/225/260/346/215/256/351/200/217/344/274/240/344/270/216/345/205/234/345/272/225_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +437 -0
  5. package/docs/eval/issue50_/345/215/212/351/207/215/345/244/215/345/276/205/345/256/232/345/244/215/346/240/270_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +488 -0
  6. package/docs/eval/issue50_/345/276/205/345/256/232/345/244/215/346/240/270/345/205/245/351/230/237_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +428 -0
  7. package/docs/eval/issue50_/350/257/273/351/235/242/344/277/235/346/212/244/345/217/252/350/256/244/346/230/276/345/274/217/346/235/245/346/272/220_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +271 -0
  8. package/docs/eval/issue50_/351/207/215/350/246/201/345/272/246/345/220/214/346/272/220/344/270/216/344/277/235/346/212/244/350/257/255/344/271/211_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +306 -0
  9. package/docs/eval/issue51_/344/270/200/351/224/256/345/256/211/350/243/205/345/244/261/350/264/245_/345/275/222/345/261/236/345/210/244/345/256/232_v1.0.md +58 -0
  10. package/docs/eval/issue52_/346/235/241/344/273/266/345/205/210/350/241/214/344/270/216/346/210/252/346/226/255/345/217/257/350/247/202/346/265/213_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +360 -0
  11. package/docs/eval//344/270/211/346/241/243/350/207/252/346/262/273_/346/255/245/351/252/244/342/221/241/346/241/243/344/275/215/345/215/225/344/270/200/345/205/245/345/217/243_/350/220/275/347/240/201/350/256/260/345/275/225_v1.0.md +651 -0
  12. package/docs/eval//344/270/211/346/241/243/350/207/252/346/262/273_/346/255/245/351/252/244/342/221/242/345/217/230/346/233/264/345/215/225/344/270/216/345/233/236/346/273/232/345/216/237/350/257/255_/350/220/275/347/240/201/350/256/260/345/275/225_v1.0.md +439 -0
  13. package/docs/eval//344/270/211/346/241/243/350/207/252/346/262/273_/346/255/245/351/252/244/342/221/243/345/207/206/345/205/245/350/257/273/346/225/260_/350/220/275/347/240/201/350/256/260/345/275/225_v1.0.md +1337 -0
  14. package/docs/eval//344/270/211/346/241/243/350/207/252/346/262/273_/346/255/245/351/252/244/342/221/244/346/224/266/345/256/230/344/270/216/345/205/250/351/223/276/351/252/214/346/224/266_/350/220/275/347/240/201/350/256/260/345/275/225_v1.0.md +1817 -0
  15. package/docs/eval//345/217/221/345/270/20309_/346/243/200/347/264/242/351/235/242/344/270/211/346/211/271/346/224/266/345/217/243_v1.0.md +66 -0
  16. package/docs/eval//347/254/2543/345/261/202stg/347/273/223/346/236/204/347/264/242/345/274/225_/345/256/236/346/226/275/350/256/260/345/275/225_v1.0.md +250 -0
  17. package/docs/mdcg//345/212/237/350/203/275/350/260/203/347/224/250/346/230/240/345/260/204/350/241/250_v0.1.md +25 -25
  18. package/docs/plans/stg/346/235/241/344/273/266/345/214/226/344/270/216/347/273/223/346/236/204/347/264/242/345/274/225_/350/256/276/350/256/241_v0.1.md +124 -0
  19. package/docs/plans//350/256/260/345/277/206/350/207/252/345/244/204/347/220/206/344/270/211/346/241/243/350/207/252/346/262/273_/350/256/276/350/256/241_v0.2.md +207 -0
  20. package/md_cg/admission.py +718 -0
  21. package/md_cg/autonomy_modes.py +642 -0
  22. package/md_cg/consistency.py +133 -8
  23. package/md_cg/forgetting.py +38 -6
  24. package/md_cg/freshness.py +17 -1
  25. package/md_cg/lifecycle.py +30 -2
  26. package/md_cg/mcp_server.py +63 -7
  27. package/md_cg/mdcg.py +85 -17
  28. package/md_cg/mdcos.py +666 -16
  29. package/md_cg/protect.py +79 -4
  30. package/md_cg/provenance.py +1 -1
  31. package/md_cg/review_cli.py +31 -2
  32. package/md_cg/rollback.py +411 -0
  33. package/md_cg/rollback_cli.py +104 -0
  34. package/md_cg/stg.py +400 -50
  35. package/md_cg/stgidx.py +281 -0
  36. package/md_cg/test_autonomy_admission.py +1098 -0
  37. package/md_cg/test_autonomy_modes.py +1972 -0
  38. package/md_cg/test_b1_auto_id_multiproc.py +7 -0
  39. package/md_cg/test_b1b2_write_face.py +7 -0
  40. package/md_cg/test_b3_merge_keeps_content.py +7 -0
  41. package/md_cg/test_cons200_scan_selection.py +791 -0
  42. package/md_cg/test_i50a_half_dup_defer.py +408 -0
  43. package/md_cg/test_i50b_defer_to_review_queue.py +545 -0
  44. package/md_cg/test_i50c_meta_passthrough.py +608 -0
  45. package/md_cg/test_i50d_importance_source.py +531 -0
  46. package/md_cg/test_i50e_readside_protection.py +656 -0
  47. package/md_cg/test_issue39_utf8_stdio.py +9 -1
  48. package/md_cg/test_issue52_scan_condition_first.py +677 -0
  49. package/md_cg/test_linkref.py +7 -0
  50. package/md_cg/test_mode_parity.py +1393 -0
  51. package/md_cg/test_mutation_rollback.py +805 -0
  52. package/md_cg/test_n204_n205_n226_n227_n228_n229_exit_gates.py +1 -1
  53. package/md_cg/test_n214_n215_n221_n222_write_face_gates.py +7 -0
  54. package/md_cg/test_p2_mcp.py +8 -0
  55. package/md_cg/test_p9_forget_protect.py +7 -0
  56. package/md_cg/test_p9c_dedup_hints.py +7 -0
  57. package/md_cg/test_policy_required_ccg.py +5 -1
  58. package/md_cg/test_protocol.py +7 -0
  59. package/md_cg/test_stgidx_index_parity.py +1020 -0
  60. package/md_cg/test_writelimit.py +36 -9
  61. package/md_cg/test_writepipe.py +5 -2
  62. package/md_cg/weights.py +15 -1
  63. package/md_cg/writepipe.py +101 -2
  64. package/package.json +1 -1
  65. package/skills/plugin.json +1 -1
@@ -0,0 +1,1337 @@
1
+ # 三档自治 · 步骤④「准入读数与准入闸」——落码记录 v1.0
2
+
3
+ > **状态**:本批落码完成(R1–R4 机检读数 + 准入闸生效面 + 守卫与定点变异自证)。
4
+ > **v1.1 补强批次(2026-10-02)**:溢出容错(`_as_ts`)与结算异常 fail-closed
5
+ > 收口已追加——见 **§八**(含修前复现腿、补强后独立复核 **ACCEPT** 与边界留池);
6
+ > §5.3 的 DEFER 依据与 §六.12 留池项据此**移入已收口**。
7
+ > **版本语义(回应读者「文件名 v1.0 / 内容 v1.1」)**:文件名与 H1 的 v1.0=
8
+ > 步骤④**落码批次**版本;v1.1=该批次内**补强批次**的内容版本(正文以「补强轮
9
+ > v1.1」标注)。文件名不追改——版本语义以本注为准。
10
+ > **设计真源**:`docs/plans/记忆自处理三档自治_设计_v0.2.md`(已签收冻结)——
11
+ > §七(四条读数 R1–R4 · 门槛 · 窗口=裁定③ 长期 30 天 / 短期 3 天)、
12
+ > §六(准入:不满足该档**不可选中**、fail-closed 报缺哪条读数、不静默降级)、
13
+ > §十一(R1–R4 各有独立断言与一组门槛刚过/刚不过边界用例,含窗口边界 3 天/30 天)。
14
+ > **建立在**:步骤③(提交 `fd5b94ea`,变更单三字段与回滚原语)之上。
15
+ > **证据标签**(全文数字按此标注出处,不混记):
16
+ > - **〔实跑·撰写轮〕**=本报告撰写轮在本机实跑(2026-10-02;**含修订轮补跑**——
17
+ > CLI 退出码、计时复测、settle 崩溃语义、修前标记重数等,位置随文标注);
18
+ > - **〔采集·复现段〕**=本工作流修复前采集的复现腿(§二);
19
+ > - **〔采集·实施段〕**=落码轮采集的探针/采样读数(§三、§二.2.9);
20
+ > - **〔采集·复核段〕**=独立复核轮采集的读数与判定(§五);
21
+ > - **〔采集·编排侧〕**=编排脚本采集的整栈读数(§四.4);
22
+ > - **〔实跑·补强轮〕**=补强实施轮实跑(§8.5/§8.6);
23
+ > - **〔实跑·定稿轮〕**=补强批次定稿轮复跑(§8.5/§8.7/§8.10);
24
+ > - **〔采集·复现段(补强轮)〕**=补强轮修复前采集的 11 条复现腿(§8.2);
25
+ > - **〔采集·复核段(补强后 ACCEPT 轮)〕**=补强后独立复核采集(§8.8)。
26
+ > **「本轮」消歧(回应读者:跨节指不同轮次)**:全文不再出现无前缀的「本轮」——
27
+ > 撰写轮内部的补跑统一称**修订轮**(见上表首项);§八 内的轮次以上列标签名
28
+ > 标注(补强轮/定稿轮)。
29
+ > **硬边界自查**:只告警不改数据(读数与准入闸零写入,守卫机械钉死);**实验面**
30
+ > 不触在役数据根写面(在役采样全程只读,stat **逐项**复核 SAME——口径与强度
31
+ > 见 §4.5「六面」注);实验走 `tempfile`
32
+ > 合成库;不改 `data/policy.json`、不削弱任何 forbidden;未 `git add/commit/push`
33
+ > (工作树实读见 §7.1)。**唯一例外=纪律 16 收尾归档写入**(落码轮,见 §4.5 末
34
+ > 「判读点说明」)——本批红线判读以该段为准。
35
+ > **行号口径(四套并存;回应读者「换算对不上」)**:全文行号分四类,**不可跨类
36
+ > 相减**——①**原落码(撰写轮)**:§三 表与 §3.2/§3.3/§3.4/§3.5 的行号,时点=
37
+ > 步骤④ 原落码(含**函数内实现行**,如 `r4_converging:536`);②**修前(补强前)**:
38
+ > §5.3、§8.1「修前崩溃点」列、§8.2 的站点行,时点=补强前;③**补强后(定稿轮
39
+ > 读码)**:§8.1「修后站点」列、§8.3、§8.5、§8.6、附 A 的行号,时点=补强后
40
+ > (当前工作树);④**运行期帧行**:§8.2 的 `函数(文件:行)` 数字是 traceback 报
41
+ > 出的**函数内执行行**(与 def/注释行不同口径,见 §8.1 口径注)。**原落码 → 补强
42
+ > 后**的符号级对照表见 **§3.1 末**;「注释行与 def 行相差 1 行」的规则**仅在同一
43
+ > 时点内**成立(附 A 顶部注)。
44
+ > **术语**(回应读者「三个术语无定义」):**三档 plan/confirm/full**、**变更单三
45
+ > 字段(before/impact/rollback)**、**计划输入面** 的定义与出处见 **§2.10**
46
+ > 术语与字母对照(本修订轮补入)。
47
+ > **编号出处(回应读者:多处编号查不到来源)**:文中「裁定①–⑤」=
48
+ > `docs/plans/记忆自处理三档自治_设计_v0.2.md` **§〇.2**(2026-10-01 使用者
49
+ > 签收:①默认档位/②变更确认覆盖面/③准入读数时间窗/④确认队列/⑤升降档);
50
+ > 「设计 §N」=该设计文档章节(如 §七 读数表、§十一 验收判据);
51
+ > 「**契约**」=**本批任务书**(编排侧发派,**未入库**——其条款编号在仓内
52
+ > 不可核对,报告内引用处均按此注);「步骤②/③ 报告」=
53
+ > `docs/eval/三档自治_步骤②档位单一入口_落码记录_v1.0.md` /
54
+ > `…步骤③变更单与回滚原语_落码记录_v1.0.md`。
55
+
56
+ ---
57
+
58
+ ## 一、缺陷定义与真实站点(行号=撰写轮读码所见)
59
+
60
+ 放权阶梯(设计 §七)要求「先证明判断可信,再放权」:full 档须经 R1–R4 四条
61
+ 准入读数核验,不满足则不可选中(设计 §六)。修前**四条读数与准入闸全缺**,且
62
+ 支撑它们的数据面入口亦缺。逐条(行号均为撰写轮读码实见;「修前」以
63
+ HEAD=`fd5b94ea` 工作树为准,含 `git show HEAD:` 对照):
64
+
65
+ | # | 缺陷 | 真实站点(实读) | 修前形态 |
66
+ |---|---|---|---|
67
+ | 1 | **R1 判断非退化读数缺失** | `md_cg/forgetting.py:638`(`def summary(cg)`) | 返回体仅 `{"total", "by_verdict"}`(`:643`/`:658` 两个返回点)——无窗口、无单一 verdict 占比、无 <90% 门槛、无「满足与否」结构化体;`md_cg/admission.py` 修前不存在 |
68
+ | 2 | **R2 会说「不」读数缺失** | `md_cg/mdcos.py:2271`(`def review_stats`)+ 写入口 `md_cg/mdcg.py:2761`(`def add_rejected`)/ `:2792`(`def add_unresolved`) | `review_stats()` 键集 `records/by_decision/proposals/pending/closed/noop/terminal_status`——无逐层(rejected/unresolved)计数、无最近 `created_at` 聚合;两层写入口只落 `created_at`,无近期读数出口 |
69
+ | 3 | **R3 破坏可逆读数缺失** | `md_cg/rollback.py:356`(`def rollback_mutation`)/ `md_cg/rollback_cli.py:73`(`def main`)/ `md_cg/protect.py:249`(`def snapshot_preimage`) | 统一回滚入口不写第二套台账(docstring `:361-362` 明文「审计由各分支的落盘/restore 留痕承担,本模块不另写第二套台账」);CLI 只打印 JSON;`action="preimage"` 是**执行时点前像**、不是「回滚发生」的痕迹——「30 天内 ≥1 次真实回滚」修前无入口可答 |
70
+ | 4 | **R4 判断收敛读数缺失** | `md_cg/mdcos.py:2271`(同一聚合单点) | 无 10 天子窗、无 reject/edit÷全部裁定的驳回率、无逐窗趋势、无 <20% 门槛、无「窗口不足 3 子窗时如实判不可判」 |
71
+ | 5 | **GATE 准入闸缺失(fail-open)** | `md_cg/autonomy_modes.py:135`(修前 `def mode`)/ `:151`(修前 `def decide`)/ `:48`(docstring 自认留池) | 修前 `mode()` 全文=env 解析(去空白/小写/合法值闸),零读数咨询;`:48` 原文「本批**不做**(登记留池):计划输入面;R1–R4 准入读数」。⇒ `MDCG_AUTONOMY=full` 时读数再坏也直接生效(设计 §六「不可选中」未落) |
72
+
73
+ 另(腿GATE 采集):`conformance`/`census` 家族修前无准入面——`conformance.check`
74
+ 的 20 个 check id(enum.*/edge.*/index.*/dup.*/stratum.*/analysis.*/reach.*/
75
+ gate.sample/protocol.*)无一 R1–R4 类;`report_summary` 键集
76
+ `{ok,verdict,fail,warn,blindspot,failed_ids,t}` 无 R1–R4。
77
+
78
+ ## 二、修前现场(复现腿;〔采集·复现段〕)
79
+
80
+ 修复前本工作流逐条复现(8 条腿,全部 `reproduced=true`;实验库为 `tempfile`
81
+ 合成库或只读采样)。逐条 **payload / 异常(崩溃点)/ 站点**(字母/术语约定见
82
+ §2.10 对照表):
83
+
84
+ ### 腿R1 · 判断非退化读数缺失(verdict 分布无窗口/无占比/无门槛)
85
+ - **payload**:临时库 lib_r1(tempfile 沙箱):合成 `_forgetting.jsonl` 5 条
86
+ (DROP×3/MERGE×1/DEFER×1,t=now−1d/−2d/−3d/−4d/−40d,末条在 30 天窗外)+
87
+ 1 个 knowledge 节点;实跑 `forgetting.summary(cg)` 与 `summary(cg, window_days=30)`。
88
+ - **observed(异常/崩溃点)**:summary 返回
89
+ `{'total':5,'by_verdict':{'DROP':3,'MERGE':1,'DEFER':1}}`,键集仅
90
+ `['by_verdict','total']`——无窗口、无单一 verdict 占比、无 <90% 门槛、无
91
+ 「满足与否」结构化体;按 §七(R1 窗口 30 天)传窗口 ⇒
92
+ **`TypeError: summary() got an unexpected keyword argument 'window_days'`**;
93
+ `dir(forgetting)` 读数类候选=[];调用前后盘面 sha256 逐文件比对 UNCHANGED(只读)。
94
+ - **site**:`md_cg/forgetting.py:638`;`md_cg/autonomy_modes.py:48`(自认留池)。
95
+
96
+ ### 腿R2 · 会说「不」读数缺失(rejected/unresolved 近期新增无入口)
97
+ - **payload**:临时库 lib_r2:`cg.add_rejected('探针假设 PASSED:R2 复现',…)` 与
98
+ `cg.add_unresolved('探针未解问题 PASSED:R2 复现',…)` 各落一层节点
99
+ (created_at=now,age≈0 天);实跑 `cg.review_stats()` 与 `review_stats(window_days=3)`。
100
+ - **observed**:两层节点均在案(`rej_844270e3c8` layer=rejected;`unr_…`
101
+ layer=unresolved;age_days≈0),但 review_stats 键集无逐层计数、无最近
102
+ created_at;传 3 天窗口 ⇒ **`TypeError: MdCGOS.review_stats() got an
103
+ unexpected keyword argument 'window_days'`**;全入口候选扫描(recent/stat/
104
+ count/window/layer 名面)无命中——『3 天内各 ≥1 / 30 天总量各 ≥1』不可答。
105
+ - **site**:`md_cg/mdcos.py:2271`;`md_cg/mdcg.py:2761/2792`。
106
+
107
+ ### 腿R3 · 破坏可逆读数缺失(30 天内 ≥1 次真实回滚不可答,且真实回滚零独立留痕)
108
+ - **payload**:临时库 lib_r3:`cg.add('q_1')` →
109
+ `autonomy_modes.propose_mutation('C','q_1',after=改写版)` →
110
+ `cg.review_decide(pid,'accept')` 执行(拍执行时点前像)→ 进程内
111
+ `rollback.rollback_mutation` 与「字段里的回滚命令串」CLI 子进程各演一次真实
112
+ 回滚;前后逐文件差分。
113
+ - **observed**:真实回滚成立:in-process `ok=True` / `bytes_equal_preimage=True`
114
+ / residual 三面全 True;CLI rc=0、JSON ok=true。但『回过』无读数:
115
+ `_protected_audit.jsonl` 的 action 集合恒为 `['preimage']`(执行后/回滚后/
116
+ CLI 后三次取样均无 rollback 条目);逐文件差分:CLI 回滚仅 modified
117
+ `['_index.json','knowledge/orphan/q_1.md']`,零台账落盘;`decisions.jsonl`
118
+ 中 rollback 事件=0;`dir(rollback)` 计数类候选=[]——该读数无任何入口,且
119
+ 真实回滚当前不留独立痕迹(唯一痕迹是执行时点 preimage 一条)。
120
+ - **site**:`md_cg/rollback.py:356`;`md_cg/rollback_cli.py:73`;
121
+ `md_cg/protect.py:249`。
122
+
123
+ ### 腿R4 · 判断收敛读数缺失(驳回率无 3×10 天子窗、无趋势)
124
+ - **payload**:临时库 lib_r4:合成 `hippocampus/decisions.jsonl` 11 条
125
+ (t 跨 −29..−2 天;reject×5/edit×1/accept×5);实跑 `cg.review_stats()` 与
126
+ `review_stats(window_days=10)`。
127
+ - **observed**:review_stats 只出聚合
128
+ `{'records':11,'by_decision':{'reject':5,'accept':5,'edit':1},'proposals':11,…}`——
129
+ 无 10 天子窗、无 reject/edit÷全部裁定的驳回率、无逐窗下降趋势、无 <20% 门槛、
130
+ 无「窗口不足 3 子窗时如实判不可判」的落点;传子窗宽 ⇒
131
+ **`TypeError: MdCGOS.review_stats() got an unexpected keyword argument
132
+ 'window_days'`**;子窗/比率类候选扫描无命中;前后盘面 UNCHANGED。
133
+ - **site**:`md_cg/mdcos.py:2271`。
134
+
135
+ ### 腿GATE · 准入闸缺失(env=full 而读数不满足 ⇒ 静默放行 fail-open)
136
+ - **payload**:临时空合成库 lib_gate(R1–R4 材料全缺:`_forgetting.jsonl` 无、
137
+ rejected=0、unresolved=0、decisions.jsonl 无、`_protected_audit.jsonl` 无);
138
+ `MDCG_AUTONOMY=full` 下实跑 `autonomy_modes.mode()` 与 `decide(A..E)`
139
+ (A–E=新增/合并/改写/删除/权重五类动作,见 §2.10);另跑
140
+ plan/confirm/bogus 对照并扫 conformance 巡检面。
141
+ - **observed(崩溃点)**:`mode()='full'`;`decide(A..E)` 全 `'allow'` 且 hint
142
+ 全为 `''`——**读数不满足仍直接生效:无回落 confirm、无告警、无「缺哪条读数」
143
+ (fail-open,正是 §六 禁止的静默)**;`dir(autonomy_modes)` 准入/读数类符号=[];
144
+ mode() 源码零读数咨询(实测 False);conformance 巡检面无 R1–R4、
145
+ `check+report_summary` 零写入(逐文件 sha256 差分 added/removed/modified 全空)。
146
+ 对照面:confirm/plan 档现状行为不变、非法 env 仍 `AutonomyModeError` fail-closed
147
+ (可作「不动面」对拍锚点)。
148
+ - **site**:`md_cg/autonomy_modes.py:135`(mode)/`:151`(decide);`:48`。
149
+
150
+ ### 腿WINDOW · 窗口机检缺失(3/30 天含边界,判别力为零)
151
+ - **payload**:六个单文件临时库:同型 `_forgetting.jsonl` 各 1 条,t 分别=
152
+ now−2.9d/−3.0d/−3.1d 与 now−29.9d/−30.0d/−30.1d(窗内/边界/窗外 × 短/长期
153
+ 窗口);各经 `forgetting.summary` 读数。
154
+ - **observed**:六组输出完全同形 `{'total':1,'by_verdict':{'DEFER':1}}`——时间
155
+ 维度无人消费,窗口(含边界 3.0/30.0 天)不可判;配合 summary/review_stats
156
+ 签名均无窗口参数(TypeError 实测见 R1/R2/R4)与全仓普查(forgetting/mdcos-review
157
+ 面 `window_days=` 0 处;『3 天』『30 天』『驳回率』『子窗』零落点;唯一带窗口的
158
+ `insight.report(window_days)` 属预测校准语义,非 R1–R4)——§十一『窗口边界
159
+ 3 天/30 天各一条』无实现可挂。
160
+ - **site**:`md_cg/forgetting.py:638`、`md_cg/mdcos.py:2271`(唯一聚合单点均无
161
+ 时间维度)。
162
+
163
+ ### 腿GUARD · 读数守卫/边界用例/定点变异缺失(现有守卫绿基线)
164
+ - **payload**:文件级探针:`md_cg/test_autonomy_modes.py` 与
165
+ `md_cg/test_mutation_rollback.py` 标记计数(R1..R4/准入/窗口/门槛/够格,
166
+ Unicode 转义口径);`test_*reading*/admission*` 文件存在性;另实跑两套现有
167
+ 守卫取改动前基线。
168
+ - **observed**:两守卫文件标记计数 R1=R2=R3=R4=0、准入=0、窗口=0、门槛=0、
169
+ 够格=0(仅泛用词『读数』出现——**口径**:两文件分别 5 处与 7 处、均在注释;
170
+ 撰写轮以 `git show HEAD:<file>` 重数核对〔实跑·撰写轮〕:修前
171
+ `test_autonomy_modes.py` 5 处(5 行)、`test_mutation_rollback.py` 7 处
172
+ (7 行),按出现次数与含词行数同值);无读数守卫文件;§十一 要求的
173
+ 『R1–R4 各独立断言+门槛刚过/刚不过边界用例+窗口边界+定点变异』全缺。
174
+ 基线实测:`python -X utf8 -B -m md_cg.test_autonomy_modes` → EXIT=0
175
+ 「三档自治档位守卫:138 通过,0 失败」;`python -X utf8 -B -m
176
+ md_cg.test_mutation_rollback` → EXIT=0「变更单回滚面守卫:59 通过,0 失败」
177
+ ——**读数缺席不产生任何红项**。
178
+ - **site**:`md_cg/autonomy_modes.py:48`;`md_cg/test_autonomy_modes.py`
179
+ (存在但零 R1–R4 标记)。
180
+
181
+ ### 自证 · 仅用临时目录与工作区零改动
182
+ - **payload**:两段探针脚本执行于
183
+ `C:\Users\test\AppData\Local\Temp\step4_repro_hjesj_ml\repro_step4.py` 与
184
+ `repro_step4b.py`;沙箱根全由 `tempfile.mkdtemp` 建:`step4_repro_hjesj_ml`
185
+ (脚本+守卫日志 4 件)、`step4_repro_jg3_2pv1`(29 件)、`step4_repro_b_vsdh_7ev`
186
+ (17 件);全程 `-B`(不落 pyc)。
187
+ - **observed**:`SANDBOX_UNDER_TEMP=True`(实跑打印,三个实验根 50 件全在系统
188
+ 临时目录);守卫运行另建 2 个 `%TEMP%` 沙箱空壳(`autonomy_modes_sandbox_0l_zuub7`:
189
+ 8 件;`mutation_rollback_sandbox_oquy4q_b`:10 件,均只有 `_index.json` 与
190
+ `.lock` 的合成壳——守卫 docstring 已知留池行为);`git status --porcelain`
191
+ 仅 `?? .zcode/`(会话起始既有)、`git diff --stat` 空、HEAD 仍
192
+ `fd5b94ea40dcfea94114943b64c615cd2b4aec37`、stash 空;全仓本会话新增 `.pyc`
193
+ 计数=0;未 `git add/commit/push`;在役数据根零写入。
194
+ - **site**:N/A(自证项)。
195
+
196
+ ### 2.9 落码期补充探针(〔采集·实施段〕;为修法决策提供依据)
197
+
198
+ - **腿① `mode()` 无准入折算**:修前 `md_cg/autonomy_modes.py:135` 的 `mode()`
199
+ 全文=env 解析——修前 env=full 恒返回 full。(撰写轮读码核对:HEAD 版
200
+ `def mode`=:135、`def decide`=:151、留池文案=:48,逐一对上。)
201
+ - **腿② 无读数模块**:修前全仓 `md_cg/*.py` 无 admission 面;`grep MDCG_AUTONOMY`
202
+ 只命中 `autonomy_modes.AUTONOMY_ENV_KEYS`(单点守卫既有断言)。
203
+ - **腿③ 旧守卫以 `env=full` 跑全链(准入闸接线方式的关键探针)**:全仓 **13 个**
204
+ 旧守卫文件在模块级置 `MDCG_AUTONOMY=full`(夹具注释原文见
205
+ `md_cg/test_p2_mcp.py:15-21`):`test_b1_auto_id_multiproc.py:59`、
206
+ `test_b1b2_write_face.py:49`、`test_b3_merge_keeps_content.py:81`、
207
+ `test_i50b_defer_to_review_queue.py:76`、`test_i50d_importance_source.py:84`、
208
+ `test_i50e_readside_protection.py:94`、`test_linkref.py:25`、
209
+ `test_n214_n215_n221_n222_write_face_gates.py:106`、`test_p2_mcp.py:21`、
210
+ `test_p9_forget_protect.py:27`、`test_p9c_dedup_hints.py:52`、
211
+ `test_protocol.py:34`、`test_writelimit.py:30`。这些实验跑在**空合成库**上
212
+ ——读数必然不满足。⇒ 若准入闸接在「每次 `decide()` 自动查」上,这 13 处
213
+ 夹具的 full 档全链断言会整体击穿。这是本批「生效面=显式 settle()」决定的
214
+ 直接依据(§3.2 偏离①)。
215
+ - **腿④ 回滚无独立留痕**(步骤③ 转录+撰写轮复核):`rollback_mutation`
216
+ (`md_cg/rollback.py:356`)不写第二套台账;C 回滚前后 `decisions.jsonl`
217
+ 字节不变、`_audit.jsonl` 零新增。在役库复核:`_audit.jsonl` 活动分片 `op`
218
+ 分布 `{'add': 105334, 'audit_rotate': 1}`、`restore` 0 条;
219
+ `_protected_audit.jsonl` action 分布 `{'override_write': 4, 'override_forget': 4,
220
+ 'snapshot': 1}`、`preimage` 0 条。⇒ R3 只能状态推断(§3.2 偏离②)。
221
+ - **腿⑤ 在役库数据面规模(成本约束来源;落码轮时点读数)**:在役根
222
+ `D:\program\AEIS\data\mdcg`(`datapath.mdcg_root()` 同源解析;本机用户级根
223
+ `C:\Users\test\.dsh\.dsh-memory\data\mdcg` 为空壳——只有 `_keys.json`,不是
224
+ 认知图):`_index.json` 21.3MB / `_audit.jsonl` 23.9MB(105335 行;单位与
225
+ 时点口径见 §4.5 注)/
226
+ `_audit_archive/` 8 片 ≈ 536MB / `_deletions.jsonl` 2.0MB(8725 行)/
227
+ `_forgetting.jsonl` 82KB / `hippocampus/decisions.jsonl` 437 行 / `rejected/`
228
+ 11 个 md / `unresolved/` 22 个 md。⇒ 读数必须**流式限成本**:`_audit.jsonl`
229
+ 只读活动分片(单项流式——落码轮粗估 0.26s 量级、撰写轮复测 0.206s;两轮
230
+ 口径关系见 §3.5),归档分片不读(如实点名,见 §六.2)。
231
+
232
+ ### 2.10 术语与字母对照(回应读者:同字母多义)
233
+
234
+ | 字母/符号 | 含义 | 出处/定义(撰写轮读码) |
235
+ |---|---|---|
236
+ | **A–E(动作类)** | A 新增 / B 合并 / C 改写 / D 删除 / E 权重与生命周期 | 设计 §一 五类表;实现常量 `md_cg/autonomy_modes.py:107-115`(`A_ADD`…`E_WEIGHT`);`decide(A..E)` 即对五类逐一判定 |
237
+ | **R3 的「D 面」** | 证据面一:活动分片 `_audit.jsonl` 的 `forget→restore` 对(对应 D 删除类软删的「删过又回过」留痕) | §3.2 偏离②;`admission.py:355-373`(`audit_restore`) |
238
+ | **R3 的「C/B 面」** | 证据面二:`decisions.jsonl` accept 执行记录 + 前像在位 + 盘面逐字节==前像——**C 改写与 B 合并两类动作共用这一条判据**(B 不是独立第三面,是「C/B 面」对 B 合并的覆盖) | §3.2 偏离②;`admission.py:375-420`(`preimage_pair`;筛选条件 `act in ("B","C")` 见 `:389`) |
239
+ | **守卫组字母 A–F / L** | 守卫文件的断言分组编号(A–F=`test_autonomy_admission.py` 六组;L=`test_autonomy_modes.py` 批次④ 组) | §4.1;两文件的 `_GROUPS` |
240
+ | **用例号(A2/B3/C1/C4/C6/D3/E2a/L2b…)** | 「组字母+组内序号」的**用例编号**,与动作类字母、R3 证据面名**不同源**(例:C 组的用例 C1 钉的是 **D 面**、C4 钉的是 **C 面**) | §4.6 表;守卫内 `ok(...)` 文案 |
241
+ | **R1–R4** | 四条准入读数(R1 判断非退化/R2 会说「不」/R3 破坏可逆且回过/R4 判断收敛) | 设计 §七;`md_cg/admission.py` |
242
+ | **三档 plan/confirm/full**(回应读者:只见名字无定义) | **plan=计划模式**(A/B/E 须命中计划步骤才允许、C/D 需确认;无计划输入时 A/B/E 一律 forbid);**confirm=变更确认**(缺省档;B/C/D 先出变更单、经裁决 accept 才落,A/E 直落);**full=完全访问**(全允许,但须经 R1–R4 准入闸)。「**回落 confirm**」=full 未过闸时**实际生效档位**降为下一档 confirm——改动的 B/C/D 类动作退回「先确认后落」 | 设计 §三 裁决矩阵;实现 `md_cg/autonomy_modes.py:138-145`(`MATRIX`)、`:223`(`settle`) |
243
+ | **变更单三字段 before/impact/rollback**(回应读者:从不列出是哪三个) | 步骤③ 在变更单载荷上补的**执行时点**三字段:`before`=前像(执行时点快照引用,回滚句柄)/`impact`=影响面(执行时点读数)/`rollback`=可执行回滚命令串。提议时点即占键(取值 None/""),由执行桥在动作落盘前补全 | 步骤③ 报告;实现 `md_cg/autonomy_modes.py:467-522`(`mutation_payload`/`mutation_executed`) |
244
+ | **计划输入面**(回应读者:全文无解释) | plan 档「须命中计划中的步骤」所依赖的**计划输入**——即「本次哪些动作类获准」的计划对象(`decide(plan=…)` 的 `plan` 入参面)。**本批未落**:无计划(`plan=None`)时 plan 档的 A/B/E 一律 forbid(fail-closed 带 hint) | 设计 §三 硬约束③;实现 `md_cg/autonomy_modes.py:388-422`(`_plan_actions`);留池登记见 §六.7 |
245
+
246
+ (易混点提示:§七 `decide(D)→allow` 的 D=**删除动作类**;R3「D 面」的 D=
247
+ **软删恢复留痕面**——两个 D 不同源、不互指。**行号口径**:本表为撰写轮读码;
248
+ 补强后对应行见 §3.1 末对照表。)
249
+
250
+ ## 三、修法契约与落点
251
+
252
+ ### 3.1 交付三件与落点总表(修后=工作树实读;行号撰写轮核对,**口径=``def``
253
+ 定义行**)
254
+
255
+ | # | 交付 | 落点 | 说明 |
256
+ |---|---|---|---|
257
+ | 1 | **四条读数机检** | `md_cg/admission.py`(新,681 行)——`r1_non_degenerate:219` / `r2_says_no:272` / `r3_reversible:349` / `r4_converging:501`,汇总 `check:565`,缓存入口 `gate:588`,CLI `main:654` | 每条返回结构化体(`id/ok/window_*/readings 字段/thresholds/detail`);CLI `python -X utf8 -m md_cg.admission [--root R]` 单入口答「它今天够格吗」(rc 0/1/2) |
258
+ | 2 | **准入闸(生效面)** | `md_cg/autonomy_modes.py`:`MODE_CONFIRM:104` / `MODE_FULL:105`、`_configured_mode:162`(env 解析单点,从旧 `mode()` 抽出、文字逐字不变)、`mode:178`(返回**实际生效档位**)、`_SETTLEMENT:194`、`settle:199`、`admission_state:246`、`reset_settlement:254` | full+读数不满足 ⇒ `effective` 回落 confirm + `alerts` 逐条报缺哪条读数 + stderr 一行启动面告警;plan/confirm 零 IO 零告警;非法 env 仍 fail-closed |
259
+ | 3 | **守卫+报告** | `md_cg/test_autonomy_admission.py`(新,860 行;45 断言 + 15 处定点变异)+ `md_cg/test_autonomy_modes.py` 扩展 L 组(`g_l:931`,11 断言;变异表 ① 锚点随 `_configured_mode` 挪位、预期红项数校准为 ①17/②40/③47)+本报告 | 守卫含 R1–R4 各独立断言与门槛刚过/刚不过边界用例、窗口边界 3 天/30 天、准入闸四态、只读证明 |
260
+
261
+ **行号对照:原落码(上表,def 行)→ 补强后(定稿轮读码,def 行)**(回应读者
262
+ 「无法把 §3.1 的行号换算到当前工作树」):补强批次在 `admission.py` 插入
263
+ `_as_ts` 段并扩写各 docstring、在 `autonomy_modes.py` 新增 `_warn` 段并扩写
264
+ `settle` 等函数 ⇒ **位移不均匀**(+12~+37),**无单一换算规则**;下表为唯一
265
+ 换算锚点(两端均为 def 行口径;「修前/帧行」等其他口径见报头「行号口径」注):
266
+
267
+ | 符号(admission.py) | 原落码 | 补强后 | 符号(autonomy_modes.py) | 原落码 | 补强后 |
268
+ |---|---|---|---|---|---|
269
+ | `r1_non_degenerate` | 219 | **256** | `MODE_CONFIRM` | 104 | **116** |
270
+ | `r2_says_no` | 272 | **309** | `MODE_FULL` | 105 | **117** |
271
+ | `r3_reversible` | 349 | **386** | `_configured_mode` | 162 | **174** |
272
+ | `r4_converging` | 501 | **538** | `mode` | 178 | **190** |
273
+ | `check` | 565 | **602** | `_SETTLEMENT` | 194 | **208** |
274
+ | `gate` | 588 | **625** | `settle` | 199 | **223** |
275
+ | `main` | 654 | **691** | `admission_state` | 246 | **301** |
276
+ | | | | `reset_settlement` | 254 | **309** |
277
+
278
+ - 「**注释行与 def 行相差 1 行**」的规则**仅在同一时点内**成立(例:补强后
279
+ `r1:255`(注释)合 `r1_non_degenerate:256`(def);原落码 `r1:218`(注释)
280
+ 合 `:219`(def))——跨时点比较用上表,**不可相减**。
281
+ - **函数内实现行**(§3.2③ 的 `r4_converging:536`、§3.2④ 的 `admission.py:308`、
282
+ §3.3 注① 的 `admission.py:239-240`)属原落码时点的**函数体内**行号,不适用
283
+ def/注释行规则;补强后对应位置(定稿轮读码):`strictly_down` 行=
284
+ `admission.py:573`、`ok = bool(short_ok and long_ok)`=`:345`、
285
+ `top = max(by_win, key=by_win.get)`/`top_share`=`:276-277`。
286
+
287
+ ### 3.2 契约偏离声明(四处 + 一处口径备案;均为探针实测后的决定,未绕开)
288
+
289
+ **① 挂点选「新模块」而非 census/conformance 家族**(本批任务书把挂点留待
290
+ 探针定;任务书未入库——条款编号不可仓内核对,下同)。
291
+ 理由:`conformance.check()` 每次全库遍历(`load_index` 21.3MB / 16657 节点,
292
+ 在役实测同量级);R1–R4 的窗口/门槛语义与 conformance 的库结构阈值族不同;
293
+ 准入闸需要一个**热路径可查、零 IO** 的结算面(conformance 报告体不适合承担)。
294
+ `admission` 与 conformance 家族同守「只读 + 如实 + 缺数据源 BLINDSPOT」三纪律
295
+ (模块 docstring `:13-20`),且可被未来 sustain/启动面复用(留池 §六.1)。
296
+
297
+ **② R3 用「状态推断」两条证据面**(本批任务书:读法探针后定并在报告说明;
298
+ 任务书未入库)。
299
+ 实测回滚无独立留痕(§二 腿④)且**本批不改写路径加留痕**(硬约束「只告警
300
+ 不改数据」+对拍约束)。故 R3 的证据面(`method="state_inference"`,逐条标注;
301
+ 面名对照见 §2.10——「C/B 面」=C 改写与 B 合并共用的**一条**判据,B 不是
302
+ 独立第三面):
303
+ - **D 面**(`audit_restore`):活动分片 `_audit.jsonl` 的 `op="restore"` 行
304
+ (t 在 30 天窗内)∧ 同 id 有**更早** `op="forget"` 行 ⇒「删过又回过」
305
+ (真跑证据:`forget` 写 `_audit("forget", …)`、`restore` 写
306
+ `_audit("restore", …)`,键名 `id` 探针实测);
307
+ - **C/B 面**(`preimage_pair`):`decisions.jsonl` 的 accept 执行记录(30 天窗内、
308
+ `rec["mutation"]` 为 dict)∧ 执行时点前像在位(`_protected_history/` 文件 +
309
+ `_protected_audit.jsonl` 的 `action="preimage"` 行)∧ **现盘面与该前像逐字节
310
+ 相等** ⇒「曾变更且现回到前像」(真跑证据:出单→accept→回滚后
311
+ `bytes_equal_preimage=True`,守卫 C4 实测)。
312
+
313
+ 误报边界如实登记(§六.4):「碰巧回到前像」「无效果执行」在现有数据面上不可
314
+ 与真实回滚区分;判据取「盘面事实」(设计 §七「不是理论上可回滚」的精神)。
315
+
316
+ **③ 读法裁决①:R4「逐窗下降」取严格递减**。设计原文「逐窗下降且 <20%」;
317
+ 实现取 `r远 > r中 > r近`(严格递减)且最近子窗 `< 0.20`(严格小于)。平坦
318
+ 不算下降——边界用例 D3 专钉(0.30/0.10/0.10 不满足)。若设计者原意是
319
+ 「不增」,改 `r4_converging:536`(`strictly_down` 一行)即可(守卫 D3 会同步
320
+ 要求改用例)。
321
+
322
+ **④ 读法裁决②:R2「3 天各 ≥1(30 天总量各 ≥1)」两条都要**。实现
323
+ `ok = short_ok and long_ok`(`admission.py:308`,补强后 `:345`);窗口嵌套
324
+ (3 天 ⊂ 30 天)使长期判据在短期满足时自动满足——其**独立判别力**在「短期
325
+ 不足」侧(守卫 B2:3 天外 30 天内的记录使 `total_30d=1` 但 `recent=0` ⇒
326
+ 不满足)。如实登记:长期判据冗余面(§六.5)。
327
+
328
+ **⑤ 口径备案:R1「单一 verdict 占比」的 verdict 集合含 ACCEPT**(回应读者
329
+ 「是设计原意还是实现自定」)。设计 §七 原文只写「单一 verdict 占比 < 90%」,
330
+ **未限定 verdict 集合范围**;实现取窗口内**全量键**(含 ACCEPT)的最大占比
331
+ (`admission.py:239-240`,补强后 `:276-277`)——ACCEPT **计入占比**、不计入
332
+ 「三态齐备」要件(明细与在役例见 §3.3 注①)。**认领为口径选择(备案)而非
333
+ 偏离**:若设计原意是「DROP/MERGE/DEFER 三态内部占比」(不含 ACCEPT),改
334
+ `r1_non_degenerate` 单点(对 `by_win` 先过滤三态再取 max)即可,守卫 A 组与
335
+ 变异 ① 会同步要求改用例——语义可分叉点已可双向钉死。
336
+
337
+ ### 3.3 四条读数结构与门槛(设计 §七 表 → 实现映射;窗口=裁定③)
338
+
339
+ | 读数 | 判据(逐字照设计) | 窗口 | 结构化体主键 | 数据面(实测形态) |
340
+ |---|---|---|---|---|
341
+ | **R1** 判断非退化 | DROP/MERGE/DEFER 各自出现过 ∧ 单一 verdict 占比 < 90%(「占比」=窗口内**全部** verdict 取值中最大者——**含 ACCEPT**;见注①) | 30 天 | `total/by_verdict/seen/missing_verdicts/top/top_share/summary_all/undated` | `_forgetting.jsonl`(行键 `t`+`verdict`;`summary_all` 与 `forgetting.summary` 同源同口径——本模块按值复制文件名常量,守卫 F1 钉同值) |
342
+ | **R2** 会说「不」 | `rejected/` 与 `unresolved/` **3 天内各 ≥1**(且 30 天总量各 ≥1) | 3 天(长期 30 天) | `layers.{rejected,unresolved}.{total,recent,total_30d,latest_created_at,undated}` | 两层 md 的 `frontmatter.created_at`(探针实测:`add_rejected`/`add_unresolved` 的 fm 恒落该键;无 created_at ⇒ 计 `undated` 不计窗,不猜 mtime) |
343
+ | **R3** 破坏可逆且回过 | 30 天内 ≥1 次**真实回滚**(状态推断两证据面,见 §3.2 偏离②) | 30 天 | `count/d_restores/cb_pairs/candidates/archived_shards/evidence[]/method` | `_audit.jsonl`(活动分片)+ `hippocampus/decisions.jsonl` + `_protected_history/` + `_protected_audit.jsonl`(盘面定位:文件名 `{id}.md` 优先、`_index.json` 兜底——探针实测 `_index.json` 只在 compact/close 时落盘) |
344
+ | **R4** 判断收敛 | 30 天内 3 个 10 天子窗,驳回率(reject+edit ÷ 全部裁定)逐窗**严格**下降 ∧ 最近 < 20% | 30 天(3×10) | `windows[{lo,hi,total,reject,edit,rate,by_decision}]/rates_asc`(`rates_asc`=按**时间**升序(最远→最近)的驳回率列表,**不是数值升序**;见注②) | `hippocampus/decisions.jsonl`(行键 `t`+`decision`;单遍流式分窗,窗界 `lo < t ≤ hi`) |
345
+
346
+ > **注①(R1 的 verdict 集合——回应读者「ACCEPT 从何而来」)**:`_forgetting.jsonl`
347
+ > 的 verdict 写入侧共四态=**ACCEPT / MERGE / DROP / DEFER**(`md_cg/forgetting.py:27-28`
348
+ > 分支表;落点 `log`/`record_drop`/`reinforce` 等)。设计 §七 的三态判据只点名
349
+ > DROP/MERGE/DEFER(实现常量 `R1_VERDICTS`),而「单一 verdict 占比」的实现取
350
+ > 窗口内 `by_win`(**全量键**)的最大占比(`admission.py:239-240`
351
+ > `top = max(by_win, key=by_win.get)`)——故在役读数 `0.9349 = 201/215` 是
352
+ > **ACCEPT 占比**:ACCEPT **计入占比**、**不计入**「三态齐备」要件。
353
+ > **注②(`rates_asc` 方向——回应读者「字段名与内容不符」)**:字段名指**时间**
354
+ > 升序(最远→最近,`admission.py:528` 注释「时间升序(最远 → 最近)」),不是
355
+ > 数值升序;数值本身不单调(在役 `[0.3774, 0.0932, 0.1076]` 是先降后升)。
356
+
357
+ **不可判口径(如实,不假装)**:R1 窗口内 0 条 ⇒ `ok=False`(detail 说明样本
358
+ 不足);R2 无 `created_at` 计 `undated`;R3 无候选/无证据 ⇒ `ok=False` 且
359
+ `archived_shards` 如实点名未纳入的归档分片数;R4 任一子窗无裁定 ⇒ **`ok=None`**
360
+ (「不可判」——既非满足也非不满足,由调用方 fail-closed 计入 missing)。
361
+
362
+ **「不可判」与「不满足」的分叉依据(回应读者:同为证据不足却三处结论不同)**:
363
+ 分叉判据=**判据本身是否仍可判定**,不是「样本多寡」的笼统口径(实现点:
364
+ `r1` 的 `ok = bool(total_win > 0 and …)`、`r3` 的 `ok = bool(count >= 1)`、
365
+ `r4` 的 `if empty: ok = None`):
366
+ - **R1 空窗与 R3 零证据 ⇒ `ok=False`(可判不满足)**:两者的判据是「出现性」
367
+ 阈值(三态各自出现过 ∧ 占比 < 90%;30 天内 ≥1 次回过)——样本不足直接使
368
+ 「出现过 / ≥1」不成立,判据**可判**为假;
369
+ - **R4 空子窗 ⇒ `ok=None`(不可判)**:判据是「3 个子窗的比率严格递减」——
370
+ 某子窗 0 裁定 ⇒ 该窗比率**无定义**(0 分母),判据**无法构成**,只能如实报
371
+ 「不可判」(设计 §七 明文「窗口不足 3 子窗时如实判不可判」);
372
+ - **「未实测」措辞的关系**:CLI/detail 对 R3 写的「破坏可逆性未实测」是
373
+ **解释性文案**(现状:没发生过回滚、数据面证不出可逆),其结构化判定仍是
374
+ `ok=False`(可判),**不是** `None`——「未实测」≠「不可判」。
375
+
376
+ ### 3.4 准入闸生效面(settle/mode/结算态)
377
+
378
+ 语义(`autonomy_modes.py:199` `settle`;`:178` `mode`):
379
+ - `settle(environ=None, root=None, force=False, ttl=None)`:
380
+ - `configured != full`(plan/confirm)⇒ **零 IO** 返回
381
+ `{configured, effective=configured, settled=False, admission=None, alerts=[]}`
382
+ ——不受读数影响(设计 §六/§七 只对 full 设门槛);
383
+ - `configured == full` ⇒ 调 `admission.gate(root or default_root(), ttl, force)`:
384
+ 读数全满足 ⇒ `effective=full`、`alerts=[]`(与改动前逐位一致);
385
+ 否则 ⇒ `effective=MODE_CONFIRM`、`alerts=[{reading, ok, detail}…]`
386
+ (逐条报缺哪条读数)+ stderr 一行。**告警全文**(`autonomy_modes.py:232-238`
387
+ 模板逐字;`<root>`=实际结算根):
388
+ ```text
389
+ [MdCG 三档自治] MDCG_AUTONOMY=full 但准入读数不满足:缺 R1、R2、R3、R4 ——实际生效档位回落 confirm(不静默降级;读数详情:python -X utf8 -m md_cg.admission --root "<root>")。
390
+ ```
391
+ ——行内「**复查命令**」即尾部的
392
+ `python -X utf8 -m md_cg.admission --root "<root>"`(读数零写入入口,照此可复核);
393
+ - 结算体写入进程级 `_SETTLEMENT`;`mode()` 对 full 读结算态
394
+ ⇒ 全出口(热路径 `decide`、工具面、CLI)看到**同一实际生效档位**。
395
+ - **「不可选中」的作用面**:经 env 选中 full 的路径;`decide(mode_explicit=…)`
396
+ 是显式强制指定(守卫/工具用;不经 env 键=不属「选中」行为——生产热路径
397
+ 一律走 env 路径),不参与折算。
398
+ - **未 settle = 旧行为**(对拍):结算态为空时 `mode()` 返回配置档位——
399
+ 与改动前**逐位一致**(守卫 E6/L5 钉死)。
400
+ - **异常语义(撰写轮实测+读码;回应读者「settle 抛异常时档位是什么」)**:
401
+ `settle` 对 `admission.gate()` 的异常**不捕获**(唯一的 `try` 只包 stderr
402
+ 写入,`autonomy_modes.py:231-240`)——读数抛异常时异常直接传播、
403
+ `_SETTLEMENT.update(out)` 不执行,结算态**保持原值**。实测两情形(合成库、
404
+ 溢出触发,读数见 §六.12):· 从未成功结算 ⇒ 结算态为空 ⇒ `mode()` 返回
405
+ **配置档位(full)**——即「数据面损坏导致 settle 崩溃」时 full **照常生效
406
+ (fail-open)**;· 已有成功结算 ⇒ 取**上一次成功结算**的 effective(不升不降)。
407
+ 该 fail-open 属本批留池缺口(§六.12),**不背书为已收口**。
408
+ - `admission_state()`:只读返回最近结算体(含 alerts)——「它今天够格吗」的
409
+ 程序接口;`reset_settlement()`:清结算态(供测试/宿主重结算)。
410
+
411
+ ### 3.5 触发频度与缓存(本批任务书关键约束的落点;探针定)
412
+
413
+ - **热路径零 IO**:`mode()`/`decide()` 只读进程级结算态——不扫描任何数据面
414
+ (守卫 E7/L6 以 `admission.cache_stats()["checks"]` 计数机械钉死:TTL 内
415
+ 三次结算只扫一次)。
416
+ - **读数缓存**:`admission.gate()` 是唯一读数入口,进程级 TTL 缓存
417
+ (`TTL_DEFAULT = 60.0`,键 = root 绝对路径;`force=True` 绕过)。
418
+ - **探针定 TTL 的依据**(在役库实读,两轮;回应读者「0.23s 与 0.26s 口径」):
419
+ 落码轮读数=一次完整四读数扫描 **0.23s**(P6);主成本 `_audit.jsonl`
420
+ 流式读数「0.26s」是**单项粗估**(落码轮 105335 行)——与整扫**非同一口径**,
421
+ 两数不可相减。**撰写轮复测〔实跑·撰写轮〕**:整扫 **0.228s**;`_audit.jsonl`
422
+ 单项流式 **0.206s**(112770 行——库已增长)。两轮一致:整扫即 0.2–0.3s
423
+ 量级;`_forgetting.jsonl`/`decisions.jsonl` 均 < 0.05s。
424
+ - **TTL=60s 的语义(含「自动降档」的前提,撰写轮澄清)**:TTL=60s ⇒ **最坏
425
+ 每分钟一次**完整扫描(前提=有调用方按该频度调 `settle`)。「读数跌破门槛
426
+ 后至多一个 TTL 周期内自动降档」(设计 §七「降档=自动执行」)成立的**前提
427
+ 是宿主按周期调用 `settle`**;本批**未接任何周期调用方**(见 §六.1)——宿主
428
+ 不调用时,档位不随时间自动变化(行为=改动前),亦不自动降档。
429
+ - **调用面留池**:本批**不**在 `mcp_server.main()`/常驻巡检里接 `settle`
430
+ (§六.1 说明)——`settle` 是显式生效面,宿主按需调用。
431
+
432
+ ### 3.6 探针读数(数据面形态实测;合成库 `tempfile` + 在役库只读)〔采集·实施段〕
433
+
434
+ | 探针 | 读数 | 结论 |
435
+ |---|---|---|
436
+ | P1 `rejected/`/`unresolved/` 节点 fm | `created_at`(float)恒在(`add_rejected`/`add_unresolved` 探针实测);文件名 `rej_<hash>.md`/`unr_<slug>.md` | R2 判窗键确定 |
437
+ | P2 `_audit.jsonl` 行形态 | `{"t","op","id","actor","session",…}`;`forget`/`restore` 均带 `id`;`restore` 带 `forced` | R3 D 面判据可行 |
438
+ | P3 `_index.json` 落盘时机 | `add`+`flush` 后**只有** `_index_log/` 分片;`close()` 后才写 `_index.json` | R3 盘面定位必须「文件名优先、索引兜底」 |
439
+ | P4 回滚真跑(C 面) | 出单→accept→`rollback_mutation` ⇒ `ok=True`、`bytes_equal_preimage=True`、`method=preimage`;R3 读数 `cb_pairs=1` | R3 C/B 判据端到端可行(守卫 C4 固化) |
440
+ | P5 回滚真跑(D 面) | `forget`→`restore(force=True)` ⇒ `_audit.jsonl` 两条(`op=forget`/`op=restore`, `forced=true`);R3 读数 `d_restores=1` | R3 D 面判据端到端可行(守卫 C1 固化) |
441
+ | P6 在役库一次完整扫描 | 0.23s;四条读数结构化体见 §4.5 | 成本与 TTL 依据 |
442
+ | P7 Windows `time.time()` 刻度 | ~15.6ms(守卫 E7 实测:同刻度内 ttl=0 仍命中缓存) | E7 的过期用例改用 `ttl=-1`(确定过期),不对刻度做假设 |
443
+ | P8 旧守卫 full 夹具 | 13 个文件 env=full + 空合成库(§二.2.9 腿③) | 准入闸生效面=显式 settle(偏离①) |
444
+
445
+ ## 四、验证数字
446
+
447
+ ### 4.1 守卫正向〔实跑·撰写轮〕
448
+
449
+ ```text
450
+ python -X utf8 -m md_cg.test_autonomy_admission → 45 通过,0 失败;exit 0;首行「锚点自检:PASS(test_autonomy_admission.py;不以 git HEAD 为基线源)」
451
+ python -X utf8 -m md_cg.test_autonomy_modes → 149 通过,0 失败;exit 0(原 138 + L 组 11)
452
+ ```
453
+
454
+ 分组计数(按 `PASS <组字母>` 行前缀实读):**A 6 / B 6 / C 6 / D 6 / E 15 /
455
+ F 6,合计 45**(F 组含 F0 常量规格面;分组口径差异不影响总数;A6/B5 两条
456
+ 结构/容错面用例不在 §4.6 边界表、见该表下注);扩展套件
457
+ L 组 **11**=**L1、L2、L2a、L2b、L3(循环 confirm/plan 两条)、L4、L5、L6、
458
+ L7、L8**(`md_cg/test_autonomy_modes.py:988-1058` 读码清单:1+1+1+1+2+1+1+1+1+1=11;
459
+ 回应读者「按 L1–L8+L3 两条只能推 9」——L2 下有 L2a/L2b 分条,合起来才是 11)。
460
+
461
+ ### 4.2 变异自证〔实跑·撰写轮〕
462
+
463
+ `python -X utf8 -m md_cg.test_autonomy_admission --mutate` ⇒ **未变异基线
464
+ 红项=0;15 处逐处「命中预期」**(红项数序列 2,1,1,2,2,1,1,1,1,2,1,6,1,2,1);
465
+ 尾行「定点变异自证:PASS(每处判据都有变异钉死,且红项数逐处吻合)」;exit 0:
466
+
467
+ | # | 变异 | 红项 |
468
+ |---|---|---|
469
+ | ① | R1 占比阈值放宽(0.90→1.01) | 2(A2 + F0) |
470
+ | ② | R1 三态判据摘除 | 1(A4) |
471
+ | ③ | R1 30 天窗失效 | 1(A5,窗口边界命中) |
472
+ | ④ | R2 组合判据只剩长期 | 2(B2 + B4) |
473
+ | ⑤ | R2 短期窗口缩短(3→1 天) | 2(B3 窗口边界 + F0) |
474
+ | ⑥ | R3 D 面成对判据摘除 | 1(C3) |
475
+ | ⑦ | R3 C/B 面盘面判据摘除 | 1(C5) |
476
+ | ⑧ | R3 30 天窗失效 | 1(C6 窗口边界) |
477
+ | ⑨ | R4 严格下降放宽为不增 | 1(D3) |
478
+ | ⑩ | R4 最近窗阈值放宽 | 2(D2 + F0) |
479
+ | ⑪ | R4 不可判分支摘除 | 1(D4) |
480
+ | ⑫ | 准入闸恒放行(settle 不查读数) | 6(E2/E2a/E2b/E2d/E8/F2) |
481
+ | ⑬ | 准入闸告警静默(alerts 恒空) | 1(E2a) |
482
+ | ⑭ | 生效档位折算摘除(mode 不读结算态) | 2(E2b/E8) |
483
+ | ⑮ | 读数缓存失效(gate 每次重算) | 1(E7) |
484
+
485
+ `python -X utf8 -m md_cg.test_autonomy_modes --mutate` ⇒ **未变异基线红项=0;
486
+ 16 处逐处「命中预期」**(红项数序列 17,40,47,6,10,4,18,4,20,2,15,2,3,2,8,9);
487
+ exit 0。其中 ①「档位不生效」红 17=原 9+L 组 8、②「confirm 也直落」红 40=
488
+ 原 39+L 组 L2b、③「矩阵坍缩」红 47=原 46+L 组 L2b。**旧基线出处**(回应读者
489
+ 「原 9/39/46 去哪对」):`docs/eval/三档自治_步骤②档位单一入口_落码记录_v1.0.md`
490
+ **§8.3**(14 处逐处 9/39/46/6/10/4/9/4/10/2/15/2/3/2,该报告行 558)+ 变异表
491
+ 注释(`md_cg/test_autonomy_modes.py:1080-1104`)。
492
+
493
+ **锚点纪律**:两套变异表均可报 ANCHOR-MISS(fail-closed,exit 2)且**不以
494
+ git HEAD 为基线源**(首行自检文案在案)。本批实测触发过一次真锚点漂移:
495
+ 步骤② 表内 ① 的锚点原指向 `mode()`,本批把 env 解析抽到 `_configured_mode()`
496
+ 后**锚点自检当场转红(exit 2)**——已同步锚点到 `_configured_mode`(文字逐字
497
+ 不变),并复跑至全绿。这正是「锚点漂移报 ANCHOR-MISS」的实测证据。
498
+
499
+ ### 4.3 python 全量〔实跑·撰写轮〕
500
+
501
+ ```text
502
+ python -X utf8 scripts/run_tests.py → ===== SUMMARY 307/307 通过,5 跳过(依赖缺失/平台不符) ===== ;rc=0
503
+ python -X utf8 scripts/run_tests.py md_cg → ===== SUMMARY 230/230 通过,3 跳过(依赖缺失/平台不符) ===== ;rc=0
504
+ ```
505
+
506
+ - 全量跳过的 5 项(如实点名):`md_cg.test_md_access_parity` /
507
+ `md_cg.test_p44_md_whitebox`(依赖 `.gitignore` 忽略的本地白箱库)、
508
+ `md_cg.test_wisdom_md_store`(依赖本地 md 语料真源)、
509
+ `swarm.tests.bench_swarm_parallel` / `swarm.tests.bench_swarm_scale`
510
+ (负载敏感,仅串行执行)——与本批无关。
511
+ - `md_cg` 组跳过的 3 项=上表前三条。
512
+ - 涉本批的三件在案:`PASS md_cg.test_autonomy_admission`(新守卫)、
513
+ `PASS md_cg.test_autonomy_modes`(含 L 组)、`PASS md_cg.test_autonomy`
514
+ (相邻件);以及 §二.2.9 腿③ 所列 13 个 full 档夹具(`test_p2_mcp` /
515
+ `test_writelimit` / `test_p9_forget_protect` 等)全部 PASS——「不自动接线
516
+ ⇒ 夹具前提零击穿」的机械证据。
517
+
518
+ ### 4.4 容器两栈退出码〔采集·编排侧;本报告未复跑〕
519
+
520
+ | 栈 | 既定命令(`README.md:585-590` 发版门禁) | 退出码 | 读数(采集转录) |
521
+ |---|---|---|---|
522
+ | **栈一** | `docker run --rm -v "$(pwd):/work" -w /work -e CARGO_TARGET_DIR=/tmp/target rust:bookworm bash scripts/linux_verify.sh full` | **0** | `结果: 22 pass / 0 fail`|`[PASS] smoke_test (linux)`|`=== 汇总: 38 pass / 0 fail ===` |
523
+ | **栈二** | `docker run --rm -v "$(pwd):/work" -w /work node:22-bookworm bash -c "npm install --include=dev && npm run build && node --import tsx --test test/*.test.ts"` | **0** | `# cancelled 0`|`# skipped 3`|`# todo 0`|`# duration_ms 11440.493285` |
524
+
525
+ **栈一两个计数的关系(撰写轮读码复算;回应读者「22 与 38 各是什么」)**:
526
+ `结果: 22 pass / 0 fail`=`hive.hive_mcp.smoke_test` **自身**的通过数(⊆ 总汇);
527
+ `=== 汇总: 38 pass / 0 fail ===`=`scripts/linux_verify.sh` 的 `record()` **总计数**
528
+ (脚本 `:11-15` 计数器、`:115` 打印)——按脚本逐段复算(`full` 模式):
529
+ cargo test 1 + cargo build --release 1 + python 套件 23 + hive 脚本 4 +
530
+ 断言判别力自证 7 + hive 面自证 1 + smoke_test 1 = **38**
531
+ (`scripts/linux_verify.sh:20-22,24-27,36-52,54-59,61-107,109-116` 读码)。
532
+ 故 22 ⊆ 38:22 是 smoke 子项,38 是各子项之和。
533
+
534
+ **栈二尾部四行的边界(回应读者「# skipped 3 是哪三项」)**:`# skipped 3` 的
535
+ **明细未随材料传入**(不代补);可确证事实=退出码 0 且摘要无 fail/cancelled。
536
+ **「发版门禁算不算过」**:脚本门禁判据=`fail=0`(`linux_verify.sh:116`
537
+ `[ "$fail" -eq 0 ]`);本批两栈退出码均 0(编排侧采集)——但本报告**未复跑**
538
+ (下段声明),整栈背书以编排侧为准。
539
+
540
+ **未复跑声明(如实)**:本报告撰写轮已确认能力在位——`docker --version`
541
+ = 28.4.0(rc=0),`docker images` 中 `rust:bookworm`、`node:22-bookworm`
542
+ 均在本地;但两条命令均以**读写**方式挂载仓根(`-v "$(pwd):/work"`)、会在
543
+ 工作树写产物,与本 ask 硬边界「只写这一个文件」相抵,故**不复跑**,读数归
544
+ 编排侧采集。栈二只给尾部四行(pass/fail 明细未随材料)——「栈二过了」的
545
+ 可确证机械事实=退出码 0 且摘要无 fail/cancelled 行。
546
+
547
+ ### 4.5 在役库只读采样〔实跑·撰写轮;修订轮复跑〕
548
+
549
+ 在役根:`D:\program\AEIS\data\mdcg`(`isdir=True`,修订轮实读)。修订轮实跑两条
550
+ 只读路径〔实跑·撰写轮〕(回应读者「命令不可复原」):
551
+ ① **CLI**=`python -X utf8 -m md_cg.admission --root "D:\program\AEIS\data\mdcg"`
552
+ ⇒ **rc=1**(「不够格」档;stdout 即下方读数块,stderr 空);
553
+ ② **结算体与六面 stat 采样**=进程内调用(脚本要点:`sys.path` 指向仓根;
554
+ `os.environ['MDCG_AUTONOMY']='full'`;`am.reset_settlement()` 后
555
+ `am.settle(root=R, force=True)`;`adm.check(R)` 与 `am.admission_state()`
556
+ 逐字段打印)。两条路径全程零写入。
557
+
558
+ ```text
559
+ == 三档自治准入读数(R1–R4)· D:\program\AEIS\data\mdcg
560
+ 结论:不够格 缺:R1、R2、R3、R4
561
+ [NO ] R1: 30 天窗内 verdict 三态不全:缺 DROP、DEFER(窗口内 {'ACCEPT': 201, 'MERGE': 14})——分布退化。
562
+ [NO ] R2: 3 天窗内新增不足:rejected=0。
563
+ [NO ] R3: 30 天窗内 0 次「回过」证据(D 面 0 + C/B 面 0;候选执行记录 0 条);注意:未纳入归档分片 8 个,落在归档里的 restore 会漏计——破坏可逆性未实测。
564
+ [NO ] R4: 子窗驳回率(远→近)37.7% / 9.3% / 10.8%;逐窗严格下降=False;最近子窗 10.8% < 20%——未收敛或不满足门槛。
565
+ ```
566
+
567
+ 结构化体主字段(同一实读):
568
+
569
+ - **R1**:`total=215`、`by_verdict={'ACCEPT':201,'MERGE':14}`、`top_share=0.9349`、
570
+ `missing_verdicts=['DROP','DEFER']`、`undated=0`。
571
+ - **R2**:`rejected{total:11, recent:0, total_30d:11, undated:0}`、
572
+ `unresolved{total:22, recent:8, total_30d:22, undated:0}`。⇒ 短期缺口在
573
+ `rejected`(最近一条在 3 天外 30 天内);`unresolved` 侧活性在(3 天内 8 条)。
574
+ - **R3**:`count=0`、`d_restores=0`、`cb_pairs=0`、`candidates=0`、
575
+ `archived_shards=8`(如实点名:归档分片未纳入)。⇒ 步骤③ 的执行桥尚未在
576
+ 在役库产生变更单执行记录。
577
+ - **R4**:`rates_asc=[0.3774, 0.0932, 0.1076]`(远→近);最近子窗 10.8% <20%
578
+ 但**非严格递减**(9.3%→10.8% 回升)⇒ 不满足。
579
+ - **准入演示**(只结算进程态,不写库):`MDCG_AUTONOMY=full` ⇒
580
+ `settle.configured=full`、`effective=confirm`、`alerts=['R1','R2','R3','R4']`、
581
+ `mode()→confirm`;stderr 一行告警在案。
582
+ - **只读复核**:读数/结算前后对 `_forgetting.jsonl` / `_protected_audit.jsonl` /
583
+ `_audit.jsonl` / `_deletions.jsonl` / `hippocampus/decisions.jsonl` /
584
+ `hippocampus/inbox.jsonl` 六面 `(size, mtime_ns)` **逐项相等** ⇒ **SAME**。
585
+ **六面的覆盖面与强度(回应读者「为何六面足够 / 措辞强度」)**:① 覆盖面——
586
+ 六面是**在役库的抽样面**,**不含** `rejected/`、`unresolved/`、
587
+ `_protected_history/`、`_index.json`(§3.3 数据面与 §二.2.9 腿⑤ 曾列及)
588
+ ⇒ 写入若落在未采样面,本证据**在结构上看不见**;为何取六面而未全覆盖,
589
+ **材料未载**(不代补)。更硬的零写入证据在合成库侧:守卫 E9/L7 用
590
+ `adm._fingerprint`(**目录级递归**全部文件)断言结算前后指纹相同。
591
+ ② 强度——「逐项相等」指 `(size, mtime_ns)` 两元组相等,与 §8.8② 表示
592
+ **内容相等**的「IEEE754 位串逐位相等」**不是同一强度**;全文按本注措辞
593
+ 区分(报头「硬边界自查」的「stat 逐位复核 SAME」同此口径)。
594
+ **样本与口径注**(回应读者「25607244 与 23.9MB 并列」):`_audit.jsonl`
595
+ =(**25,607,244 字节 ≈ 24.4MiB**, mtime_ns 1790953515324661400)=**撰写轮
596
+ stat 实读**;§二.2.9 腿⑤ 的 **23.9MB**=**落码轮**读数(单位口径未随材料
597
+ 标明)——两数**时点不同**(库持续写入:行数亦从 105335 增至 112770),
598
+ 不逐位可比,本报告不做单位换算断言。
599
+
600
+ 口径说明:落码轮初读(步骤③ 后、本批写码前)四读数结论相同;R4 两子窗率
601
+ 存在 ±0.1% 级差异——在役库持续写入的常态,**非本批实验/采样写入**(六面 stat
602
+ SAME 为证)。另注:R1 的 `0.9349=201/215` 为 **ACCEPT 占比**(verdict 集合与
603
+ 占比口径见 §3.3 注①)。
604
+
605
+ **判读点说明(纪律 16 归档写入与红线判读;回应读者「§4.5 末找不到判读点」——
606
+ 修订轮补回该段并补时间线)**:本节及以上「只读」指**读数采样与修复实验**全程零
607
+ 写入。另按工作纪律第 16 条(任务收尾归档,收尾强制流程),**落码轮收尾**向
608
+ 认知图写入**一条归档记忆节点**(`mem_1790952929766_b28eef`,`knowledge/orphan/`,
609
+ 经写入闸门 11 条禁止+6 条必需规则 ⇒ **ACCEPT**、读回确认可检索)——纯**新增**
610
+ 节点,不改任何既有节点/队列/账本;本机 MCP 认知图 root 与在役根同为
611
+ `D:\program\AEIS\data\mdcg`。判读点(供复核):红线「不触在役数据根写面」的
612
+ 既有解释是**实验面**(步骤③ §7.2 原文「一切实验走 `tempfile` 合成库……未触
613
+ 任何在役数据根」;先前各批次的归档节点同样经此常规通道写入在役库)。**本批的
614
+ 读数与准入闸(契约对象——「契约」出处见报头编号出处注)在在役库上零写入**
615
+ (守卫 E9/L7 指纹 + 本节 stat 六面 SAME;覆盖面与强度见上「六面」注)。
616
+ **时间线(修订轮补充,回应读者「孰先孰后」)**:该归档写入发生于**落码轮收尾**
617
+ (材料/落码轮记录;节点 id 已在落码轮报告中引用);**撰写轮的只读采样发生在
618
+ 其后**——六面 SAME 证明的是**撰写轮采样/结算前后**零写入,**不覆盖**该归档
619
+ 写入;归档写入的落点文件与时刻**未随材料给出**(材料仅载:`knowledge/orphan/`
620
+ 新增节点、经闸门 ACCEPT),本报告不代补。
621
+
622
+ ### 4.6 门槛边界用例清单(设计 §十一「门槛刚过/刚不过 + 窗口边界 3 天/30 天」)
623
+
624
+ | 读数 | 刚过 | 刚不过 | 窗口边界 |
625
+ |---|---|---|---|
626
+ | R1 | A1 三态齐占比 33%;A3 **89.9%**(1000 条:899/51/50) | A2 **恰 90.0%**(18/1/1);A4 三态不全(缺 DEFER) | **A5:30 天窗 ±60s**(窗外 1 条不计入、窗内 2 条计入;全量仍 3) |
627
+ | R2 | B1 两层 3 天内**恰好 1** 条 | B2 短期不足(3 天外 30 天内);B4 边界外 60s | **B3:3 天窗 ±60s**(窗外不计短期、窗内计入;30 天总量仍 2);B6 40 天外不计长期 |
628
+ | R3 | C1 D 面真跑 forget→restore(1 次);C4 C 面真跑 accept→回滚(盘面逐字节==前像) | C2 只删不回;C3 只有 restore 无更早 forget;C5 执行不回滚 | **C6:30 天窗 ±60s**(窗外 restore 不计、窗内成对计入恰 1) |
629
+ | R4 | D1 0.40/0.30/0.10 严格递减且最近 10% <20% | D2 **恰 20.0%**;D3 持平(0.30/0.10/0.10 不严格递减) | D4 样本不足 ⇒ **不可判 ok=None**;D5 10 天子窗界(`lo<t≤hi`,±60s 分属两窗);D6 edit 与 reject 同权 |
630
+
631
+ **A6/B5 与本表的关系(回应读者:清单与 §4.1 计数对不上)**:本表=设计 §十一
632
+ 点名的**三类边界用例清单**(「门槛刚过/刚不过 + 窗口边界」;22 项=A 5+B 5+
633
+ C 6+D 6)。§4.1 的 A 组 6、B 组 6 另含两条**结构/容错面**用例,不在本表:
634
+ **A6**=「缺数据面(无 `_forgetting.jsonl`)⇒ 不满足且 detail 指名缺哪个文件」;
635
+ **B5**=「无 `created_at` 的节点不计窗(如实计入 `undated`;不猜文件 mtime)」。
636
+ ⇒ A 6=A1–A5+A6;B 6=B1–B4+B5+B6;加上 C 6+D 6+E 15+F 6=**45**(§4.1)。
637
+
638
+ **边界用例的判别力(修订轮按实测红项清单校准;回应读者「10 个用例无变异对应」)**:
639
+ A–D 组 24 个用例中被定点变异**直接打红**的是 **12 个**——A2/A4/A5(变异①②③)、
640
+ B2/B3/B4(④⑤)、C3/C5/C6(⑥⑦⑧)、D2/D3/D4(⑨⑩⑪)(实测红项名清单见 §4.2 表
641
+ 与 §8.5 复跑读数);其余 12 个(A1/A3/A6、B1/B5/B6、C1/C2/C4、D1/D5/D6)**无
642
+ 专属变异项**——其中 A1/A3/B1/C1/C4/D1 为「刚过」侧正例(变异打红的是判据失效
643
+ 的**负例**形态,正例由同一判据链的负例变异间接约束)、A6/B5 属结构/容错面、
644
+ B6/D5/D6 属窗口与同权登记面(「窗界归属」「edit 同权」等要素由 R4 判据链的
645
+ 其它变异与 D1–D4 一并覆盖,但无独立变异项)。**原句「每一处都有定点变异把它
646
+ 打红」过度声称,本修订收回**。用例数据全部用**字面量**窗口(3/10/30 天),
647
+ 不引用被测常量(否则常量变异会带着数据一起漂移、判别力流失——这是守卫校准
648
+ 时实测到的形态,已在守卫注释登记)。
649
+ (表中 **C1–C6 为 C 组用例编号**,与动作类/证据面名不同源:C1 钉 **D 面**、
650
+ C4 钉 **C 面**——对照表见 §2.10。)
651
+
652
+ ## 五、独立复核判定与它列出的 uncovered〔采集·复核段〕
653
+
654
+ ### 5.1 判定与依据
655
+
656
+ **独立复核=DEFER**。依据(复核材料原文要点):复核对象=工作树三档自治
657
+ 步骤④(`md_cg/admission.py` 新、`md_cg/autonomy_modes.py` +125 行、两守卫)。
658
+ 全部实验在系统临时目录合成库(`%TEMP%`,跑完已清理,`recheck*` 残留 0);
659
+ 未编辑工作区,终态 git status 与初始一致(M×2+??×4)。
660
+
661
+ **「DEFER」的读法(撰写轮如实声明;回应读者「DEFER 是哪种意思」)**:复核
662
+ 材料**未随附 DEFER 的处置规则文本**(「通过但带条件/不通过/待定」三义在
663
+ 材料内无从裁决)——本报告只登记「判定=DEFER、依据=§5.3 溢出缺口」这一
664
+ 机械事实,**不做「已验收/已收口」声明**;裁决归属复核方/使用者。步骤④ 的
665
+ 验收判据出处=设计 **§十一(落码时)**「准入读数 R1–R4 各有独立断言与一组
666
+ 『门槛刚过/刚不过』的边界用例(含窗口边界:3 天 / 30 天各一条)」
667
+ (`docs/plans/记忆自处理三档自治_设计_v0.2.md:186-191`,撰写轮读码)。
668
+
669
+ ### 5.2 复核四覆盖面读数(逐面转录)
670
+
671
+ **① 容错/退化**(自写脚本,独立 oracle):
672
+
673
+ - `recheck_1_readings.py`(19/19):R1 11 行混合坏行/非 dict/无 t/非数值 t →
674
+ 窗内 3、undated 2、全量 5,与独立实现 oracle 逐数一致;R2
675
+ rejected(4/1/2/2)/unresolved(3/2/2/1)(坏 md/非 md/子目录/字符串 created_at
676
+ 全容错;**口径**:材料只给四元组、**未标字段序**——不代解。若按 §3.3 的
677
+ R2 字段序 `total/recent/total_30d/undated` 读则两串自洽(4/1/2/2:总 4、
678
+ 3 天内 1、30 天内 2、无 created_at 2;3/2/2/1 同法)。**可重建性声明(回应
679
+ 读者)**:存在「第二种字段序也自洽」的可能性未被排除(材料未载字段序)⇒
680
+ 「与独立 oracle 逐数一致」这一复核结论**在本报告内不可独立重建**;如需核请
681
+ 向复核方索取脚本与字段序。本报告只作上述一致性提示、不代断言);R4 窗
682
+ 界 t=now−10d 归 W2、子窗空→ok=None、前窗持不平判不满足;
683
+ check 空库 missing=[R1..R4](None 也计入,fail-closed);CLI rc=0/1/2。
684
+ - `recheck_2_r3.py`(10/10):MemCGOS 真跑 forget→restore(`d_restores=1`,
685
+ 证据成对)与 出单→accept→`rollback_mutation`(`cb_pairs=1`,独立读写比对
686
+ 盘面逐字节==前像;对照 c_2 未回滚=0);两段式定位三态可判定(无索引:不计;
687
+ 写 `_index.json` 指路:命中计 1;坏索引:不抛不计);审计链缺 preimage 行不计。
688
+ - `recheck_5_extra.py`(5/5):归档里的 forget→restore 对 count=0 且 detail
689
+ 点名「漏计」,同数据放活动分片=1(漏计系真实发生而非数据无效);
690
+ `TTL_DEFAULT=60.0`;`settle(root=None)` 经 default_root 解析但不触在役根。
691
+ - 修前五腿等价复核:腿① env=full 无折算→settle 后 confirm;腿② CLI 可用;
692
+ 腿③ 未 settle 时 mode()==旧(对拍)+旧守卫抽样 `test_p2_mcp` 64/0、
693
+ `test_writelimit` 全过(零击穿);腿④ R3 状态推断可判。
694
+
695
+ **② 对拍**(git HEAD 旧实现为 oracle):`recheck_3_parity.py`(7/7):16 组 env
696
+ (含非法值异常消息逐字)、360 组 decide(decision/mode/hint 三字段)、6 组
697
+ 未 settle 进程态 mode() 全部逐位一致;full+满足 settle 后≡旧 full 直落;
698
+ full+不满足=有意变化(confirm);显式 root 不触 default_root(桩抛异常未触发)。
699
+
700
+ **③ 守卫**:`python -X utf8 -m md_cg.test_autonomy_admission` → 首行
701
+ 「锚点自检:PASS」、45 通过 0 失败、exit 0;`--mutate` → 基线红项=0、15 处
702
+ 红项数 [2,1,1,2,2,1,1,1,1,2,1,6,1,2,1] 全命中、exit 0(抽核红项名:①=A2+F0、
703
+ ⑫=E2/E2a/E2b/E2d/E8/F2、⑬=E2a、⑭=E2b+E8)。`python -X utf8 -m
704
+ md_cg.test_autonomy_modes` → 149 通过 0 失败 exit 0;`--mutate` → 16 处
705
+ [17,40,47,6,10,4,18,4,20,2,15,2,3,2,8,9] 全命中 exit 0。**删断言探针**
706
+ (两个探针:其一=内存改 `_GROUPS` 去掉 g_a;其二=包装 `ok` 吞掉 A2 断言;
707
+ 均**未改文件**):对照 rc=0;两个探针均 rc=1 且打印「红项数不符」——自证
708
+ 对断言存在性有判别力。(材料原文以「P1/P2」命名该两探针;为避免与 §3.6 的
709
+ 探针编号 P1–P8 混名,本报告改用行为描述。)
710
+
711
+ **④ 不得静默**:`recheck_4_observable.py`(9/9):子进程分离捕获 stderr
712
+ 恰一行告警(含 MDCG_AUTONOMY=full、缺 R1、R2、R3、R4、root、复查命令——
713
+ **告警全文与「复查命令」逐字见 §3.4**),stdout 无告警;alerts 的 reading
714
+ 序列==读数 missing、四条 detail 互异;CLI rc=1 打印「缺:R1、R2、R3、R4」;
715
+ `sys.stderr` 换成抛异常 stub 后 settle 仍返回正确结算体(alerts 完整)。
716
+
717
+ ### 5.3 uncovered(复核列出的实测缺口=DEFER 依据)
718
+
719
+ `recheck_7_overflow.py`:数据面一行 `{"t": <400 位十进制整数>}` →
720
+ **`OverflowError: int too large to convert to float`**,traceback 定位
721
+ `admission.py:158`(`_ts` 的 `float(v)`)与 `:170`(`_fm_ts` 的 `float(v)`);
722
+ 影响面实测:R1/R2/R3/R4 四条各自崩、`check()` 崩、env=full 的 `settle()` 崩、
723
+ CLI rc=1 但 stdout 空(stderr 为 traceback)。边界对照:`1e400`(float inf)/
724
+ NaN/`1e39` 均不崩,触发条件=**整数型数值超出 float 范围**。合法写侧 `t` 全为
725
+ `time.time()` 浮点(`forgetting.py:756`、`mdcos.py:496` 等)⇒ 需数据面损坏/
726
+ 第三方写入才触发;**守卫判据面无此类用例**。该缺口与模块自述「坏行跳过不抛」
727
+ (`_stream_jsonl`)与「非正数返回 None」(`_ts` docstring)的容错口径存在
728
+ 张力,**故复核不全盘背书**,判 DEFER。
729
+
730
+ 撰写轮读码复核:上述两个崩溃点行号与实读一致——`admission.py:158` 与 `:170`
731
+ 均确为 `return float(v)`(在 `_ts` / `_fm_ts` 内)。
732
+
733
+ **该缺口的档位后果(撰写轮实测,摘要;回应读者「崩溃时档位是什么」)**:
734
+ `settle` 对读数异常**不捕获**——① 从未成功结算 ⇒ 结算态为空 ⇒ `mode()` 返回
735
+ **full(fail-open)**;② 已有成功结算 ⇒ 保持上一次结算的 effective(不升不降)。
736
+ 完整读数与代码面见 §3.4「异常语义」与 §六.12。
737
+
738
+ **收口陈述(补强轮 v1.1,2026-10-02;回应读者「DEFER 依据是否仍在」)**:
739
+ 本节缺口(大整数溢出崩溃 + 由此暴露的 fail-open)已由**补强批次**收口——
740
+ `admission._ts`/`_fm_ts` 数值容错(不可表示/±inf/NaN ⇒ 视同缺时间戳,不抛)
741
+ + `autonomy_modes.settle` 结算异常 fail-closed(写失败态;从未结算 ⇒ 回落
742
+ confirm,已结算 ⇒ 不升不降)。**本节的 DEFER 依据不再成立**;收口读数、守卫
743
+ 扩展与前后对拍见 **§八**。本节上文为撰写轮的历史记录,保持原样不追改。
744
+
745
+ ### 5.4 复核的只读/边界面(转录)
746
+
747
+ 自写 walk 指纹在 check+settle 前后 **SAME**;settle/读数零写入;全部实验在
748
+ `%TEMP%`,已清理(16+2 项)。
749
+
750
+ ## 六、边界与未覆盖(含本批明确不修而留池的面)
751
+
752
+ 1. **生产接线留池**:`mcp_server.main()`/常驻巡检**未**接 `settle`——本批落
753
+ 生效面单点(`autonomy_modes.settle`)与守卫;接线为何不能「自动」(13 处
754
+ full 夹具 + 空库会击穿)见 §二.2.9 腿③/§3.2 偏离①;宿主(启动面/周期
755
+ 巡检)按需调用即可,调用后热路径零 IO 生效。
756
+ **兑现边界(修订轮补充;回应读者「接线之前是不是等于没兑现」)**:接线
757
+ 排期**未随本批材料给出**(不代补)。在宿主接线之前,「不满足则不可选中」
758
+ 只对**调用过 `settle` 的进程态**生效;未调用 `settle` 的进程里 `mode()`
759
+ 与改动前逐位一致(守卫 E6/L5)——即该条设计在未接线进程里**尚未兑现**,
760
+ 本报告如实登记,**不背书为已兑现**。
761
+ 2. **R3 归档分片不读**(如实边界):`_audit_archive/` 在役 8 片 ≈ 536MB——
762
+ 准入检查不读(成本);落在归档里的 `restore` 会被漏计,读数体
763
+ `archived_shards` 与 detail 如实点名(复核 `recheck_5_extra.py` 已实测
764
+ 「漏计系真实发生」)。需要时离线全扫(留池)。**漏计方向(修订轮补充)**:
765
+ 漏计只会**少算**「回过」证据(R3 更难满足),**不会**把没回过的判成回过
766
+ ——方向上偏保守;在役 R3 当前 `count=0` 与归档面无关(候选执行记录 0 条)。
767
+ 离线全扫排期未随材料(不代补)。
768
+ 3. **R3 加密库逐字节边界**:沿用步骤③ 登记——覆写 `_seal_content` 的实例
769
+ 密文层不保证逐字节可复现;本读数的 `preimage_pair` 判据在非加密库成立
770
+ (含全部守卫合成库)。**在役库是否加密实例:本报告无法判定**(判据=
771
+ 实例是否覆写 `_seal_content`;无查询口,不代断)——若在役为加密实例,
772
+ R3 的 **C/B 面**(逐字节判据)在其上不适用(沿用本登记),**D 面**
773
+ (`op` 留痕判据)不依赖逐字节比对、不受该边界影响。
774
+ 4. **R3 推断的误报边界**(如实):C/B 面「现盘面==前像」可能由「执行无效果」
775
+ 或「第三方把节点改回原样」产生;D 面「forget→restore 对」可能由非回滚
776
+ 通道的恢复产生——现有数据面无逐单可查标记(步骤③ §6.1.3 已登记「回滚
777
+ 计数无独立留痕」),本读数取「盘面事实」判据并逐条标 `method`;要做
778
+ 精确回滚台账须先设计回滚留痕(另项)。
779
+ 5. **R2 长期判据冗余面**(如实):窗口嵌套使「短期满足 ⇒ 长期满足」;长期
780
+ 判据的独立判别力在「短期不足」侧(B2/B4 用例钉死)。保留为显式读数。
781
+ 6. **R4 读法裁决**:严格递减 + 最近 <20%(严格);子窗按「现在」滑窗
782
+ (非自然日对齐)——读数体 `windows[].lo/hi` 如实给出窗口边界。
783
+ 7. **准入的自动升降档语义**:读数是**资格条件**(非历史)——读数恢复后 full
784
+ 自动可用(至多滞后一个 TTL;**前提=宿主重调 `settle`**——本批未接周期
785
+ 调用方,见 §六.1);「升档=计划式确认」(裁定⑤,出处=设计 §〇.2)管
786
+ **配置面**(谁有权把 env 改成 full),计划输入面不在本批(延续步骤②③
787
+ 留池)。
788
+ 8. **`prefeed(write=True)` 同族落点 / `protect.is_protected` 读面**:与准入面
789
+ 无关,沿用 issue50-d/e 登记,未动。
790
+ 9. **E 分数类(权重/生命周期)回滚**:R3 只覆盖 C/B/D(设计 §四);分数类
791
+ 沿用各模块既有 rollback(留池)。
792
+ 10. **守卫沙箱残留**:`rmtree` 在 Windows 可能被锁句柄挡住(沿用既有登记),
793
+ 残留为空壳合成库、零真实数据。
794
+ 11. **`_fingerprint` 为私有名**:守卫以 `adm._fingerprint` 访问(同仓测试访问
795
+ 内部面的既有惯例,如 `_SETTLEMENT`);如需公开可另议。
796
+ 12. **(复核 uncovered;补强轮 v1.1 已收口)大整数时间戳的溢出崩溃**:
797
+ **收口状态(补强轮 v1.1,2026-10-02)**:本项**已从留池移入已收口**——
798
+ 修复三件、逐型读数与前后对拍见 **§八**。本段下文为**修前**历史记录
799
+ (「落码批不修 / 不背书为已收口」等句均指修前时点,保持原样不追改),
800
+ 顺序阅读时以本前置句为准。
801
+ `{"t": <400 位整数>}` 使 R1–R4/`check`/`settle` 抛 `OverflowError`
802
+ (`admission.py:158`/`:170`)。**落码批不修**——触发条件=数据面损坏/第三方
803
+ 写入(合法写侧 `t` 恒为浮点);修复要动容错语义面(与「坏行跳过不抛」
804
+ 口径的张力),需连同「如实」纪律一起设计,留待下批;复核据此判 DEFER,
805
+ 本报告如实登记、**不背书为「已收口」**。
806
+ **崩溃后档位语义(撰写轮实测;回应读者「这正是 §六 要禁的静默」)**:
807
+ 实测两情形(合成库、溢出触发)——① 从未成功结算 ⇒ `settle` 抛错后结算
808
+ 态保持为空、`mode()` 返回 **full(fail-open)**;② 已有成功结算 ⇒ 保持
809
+ 上一次结算(不升不降)。代码面:`settle` 对读数异常不捕获(唯一 `try`
810
+ 只包 stderr 写入,`autonomy_modes.py:231-240`)。⇒「数据面损坏 + 未结算」
811
+ 时 full 照常生效——此为**已实测的 fail-open 后果**,一并属本留池项,
812
+ 本报告不背书为已收口。
813
+ **收口登记(补强轮 v1.1,2026-10-02)**:本项已从留池**移入已收口**
814
+ ——修复三件、逐型读数与前后对拍见 **§八**。新语义下上述「崩溃后档位语义」
815
+ 两情形为:① 从未成功结算 + settle 异常 ⇒ 失败态、`mode()` **回落 confirm**
816
+ (fail-open 收口);② 已有成功结算 + 异常 ⇒ 保持上次 effective(不升不降,
817
+ 对拍锚;失败态仍可观测、可随时重结算)。本段上文保留为**修前**实测记录。
818
+ 13. **容器两栈未由本报告复跑**(§4.4 理由:读写挂载会写工作树,与本 ask
819
+ 硬边界相抵);读数为编排侧采集转录。
820
+
821
+ ## 七、不动面对拍与红线自查
822
+
823
+ - **env=plan/confirm 逐位一致**:`settle` 对 plan/confirm **零 IO**(不读读数、
824
+ 零告警),`mode()` 返回配置档位;未 settle 时 `mode()` 对 full 也返回配置
825
+ 档位(结算态为空)——与改动前**同一代码路径**(`_configured_mode` 即旧
826
+ `mode()` 体,文字逐字)。旧守卫 149/0(含 H 组 full 对拍、I 组 confirm/full
827
+ 逐位相等)+ 13 处 full 夹具的整套件由定向回归覆盖(§4.3)。
828
+ - **env=full 且读数满足 ⇒ 逐位一致**:守卫 E1/E8a/L1(`effective=full`、
829
+ `alerts=[]`、`decide(D)→allow`)。
830
+ - **env=full 且读数不满足 ⇒ 有意变化(回落 + 告警)**:E2 系列/L2 系列。
831
+ - **红线**:实验全部在 `tempfile.mkdtemp` 合成库(两守卫沙箱);读数/准入闸
832
+ 对在役库零写入(§4.5 六面 stat SAME);未改 `data/policy.json`;未削弱任何
833
+ forbidden;未 `git add/commit/push`(工作树实读:见 §7.1)。
834
+ **例外(如实):纪律 16 归档**——**落码轮收尾**向认知图(在役库同一 root)
835
+ 写入一条归档记忆节点 `mem_1790952929766_b28eef`(纯新增、经闸门 ACCEPT)
836
+ ——完整判读点与时间线见 **§4.5 末「判读点说明」**(修订轮已补回该段),
837
+ 供复核员按「实验面红线」判读。
838
+
839
+ ### 7.1 git 面(撰写轮实读)
840
+
841
+ ```text
842
+ $ git status --porcelain
843
+ M md_cg/autonomy_modes.py
844
+ M md_cg/test_autonomy_modes.py
845
+ ?? .zcode/
846
+ ?? docs/eval/三档自治_步骤④准入读数_落码记录_v1.0.md
847
+ ?? md_cg/admission.py
848
+ ?? md_cg/test_autonomy_admission.py
849
+ $ git rev-parse HEAD
850
+ fd5b94ea40dcfea94114943b64c615cd2b4aec37
851
+ $ git diff --stat
852
+ md_cg/autonomy_modes.py | 125 ++++++++++++++++++++++++++++--
853
+ md_cg/test_autonomy_modes.py | 179 +++++++++++++++++++++++++++++++++++++++----
854
+ 2 files changed, 284 insertions(+), 20 deletions(-)
855
+ $ git stash list →(空)
856
+ ```
857
+
858
+ `data/policy.json`、`hive/`、`scripts/`、在役数据根:零改动。
859
+
860
+ ## 八、补强批次(v1.1 · 2026-10-02)——溢出容错收口与结算异常 fail-closed
861
+
862
+ > **批次定位**:在 §三–§七 已落成果**之上增量补强**(工作树步骤④改动原样保留、
863
+ > 不重做)。收口对象=**§5.3 的 DEFER 依据 / §六.12 留池项**(独立复核 uncovered:
864
+ > `{"t": <400 位整数>}` 使 `admission.py` 的 `_ts`/`_fm_ts` 抛 `OverflowError`,
865
+ > 级联 R1–R4/`check`/`settle` 全崩;且「**从未成功结算时** `mode()` 回 full」=
866
+ > fail-open)。**生产接线(`mcp_server.main`/巡检接 `settle`)仍留池**——本批
867
+ > **未**接线(§六.1 登记不变)。
868
+ > **证据标签(本节)**:〔实跑·补强轮〕=补强实施轮实跑(2026-10-02 本机,命令
869
+ > 见 §8.5/§8.6;守卫/回归均以工作树实现为被测面,**不以 git HEAD 为基线源**);
870
+ > 〔实跑·定稿轮〕=本报告定稿轮复跑(§8.5/§8.7,含 python 全量、`md_cg` 定向与
871
+ > git 面);〔采集·复现段(补强轮)〕=§8.2 十一条复现腿;〔采集·复核段(补强后
872
+ > ACCEPT 轮)〕=§8.8(四条复核要求读数、python 全量、容器两栈)。对拍基线取自
873
+ > §4.1/§4.3 的〔实跑·撰写轮〕读数。
874
+
875
+ ### 8.1 缺陷定义与真实站点(补强对象;行号=定稿轮读码所见)
876
+
877
+ 补强收口两条(背景=§5.3 复核 uncovered + §六.12 留池项):
878
+
879
+ **缺陷 1 · 不可表示时间戳值 ⇒ 读数崩溃(级联)**。`_ts`/`_fm_ts` 对「整数型
880
+ 数值超出 float 表示范围」(以 400 位十进制整数为代表)执行 `float(v)`,未捕获
881
+ `OverflowError` ⇒ R1–R4 各自崩、`check()` 崩、`settle()` 崩、CLI 未捕获异常
882
+ (退出码 1、stdout 空);`1e400`(float inf)不崩但**静默**(不入窗、不计
883
+ undated——§8.2 腿 10 实测)。
884
+
885
+ - **修后站点(读码所见)**:`md_cg/admission.py:160` `_as_ts` 数值闸**单点**
886
+ (补强新增:类型 → `float(v)` 兜 `OverflowError/ValueError/TypeError` →
887
+ 有限正判据);`_ts:179` / `_fm_ts:196` 为其调用点。
888
+ - **修前崩溃点(采集帧链转录)**:`_ts` 内 `return float(v)` 于 `:158`、
889
+ `_fm_ts` 内于 `:170`;级联路径 `r1(:230)`/`r2(:294)`/`r3(:362,:385)`/
890
+ `r4(:511)` → `_ts(:158)`(`r2` → `_fm_ts(:170)`)、`check(:568)` →
891
+ `r1(:230)` → `_ts(:158)`、`gate(:600)` 同源。
892
+ - **口径注(行号)**:修前行号为**采集时点**(补强前代码)实读转录——§5.3
893
+ 撰写轮已复核「`:158`/`:170` 均确为 `return float(v)`」;`admission.py` 为
894
+ 未跟踪新文件,补强前版本不在 git 历史内、无法回读对照。本条左列行号
895
+ (`:160`/`:179`/`:196`)为定稿轮读码所见。
896
+
897
+ **缺陷 2 · 结算异常静默 ⇒ fail-open**。`settle()` 对读数结算异常**不捕获**
898
+ (唯一 `try` 只包 stderr 写入)⇒ 结算态不更新;「**从未成功结算** + 崩溃 ⇒
899
+ `mode()` 照常返回 full」——正是设计 §六 要禁的静默(fail-open)。
900
+
901
+ - **修后站点(读码所见)**:`md_cg/autonomy_modes.py:223` `settle`——异常分支
902
+ `:253-277` 写失败态(`error` 非空 + `alerts[settle_error]`)并向 stderr 打
903
+ 一行告警(告警单点 `_warn:214`);`mode:190` 按结算态折算。
904
+ - **修前形态(采集帧链)**:`autonomy_modes.py:219`(settle 内 gate 调用点)→
905
+ `admission.py:600(gate)` → `:568(check)` → `:230` → `:158`,异常未被捕获
906
+ 而直接传播;stderr 零告警。
907
+
908
+ ### 8.2 修前现场:本工作流采集的复现腿(11 条;〔采集·复现段(补强轮)〕)
909
+
910
+ 修复前本工作流逐条复现(11 条腿,全部 `reproduced=true`;实验库一律
911
+ `tempfile.mkdtemp` 于系统临时目录的合成库,不触在役数据)。逐条
912
+ **payload / 异常(崩溃点)/ 站点**:
913
+
914
+ 1. **R1 读数面(`_ts` 溢出)**——payload:实验根下 `_forgetting.jsonl` 一行
915
+ `{"t": 10**399(400 位十进制整数), "verdict": "DROP"}`;调
916
+ `admission.r1_non_degenerate(root, now=固定值)`。异常/崩溃点:
917
+ `OverflowError: int too large to convert to float`;帧链
918
+ `r1_non_degenerate(admission.py:230)` → `_ts(admission.py:158)`。
919
+ 站点:`md_cg/admission.py:158`。
920
+ 2. **R2 读数面(`_fm_ts` 溢出)**——payload:实验根下 `rejected/n1.md` 与
921
+ `unresolved/n2.md` 的 frontmatter 为 `created_at: <400 位整数>`(`nodefile.loads`
922
+ 经 `json.loads` 解析成 Python int);调 `admission.r2_says_no(root)`。异常:
923
+ `OverflowError`;帧链 `r2_says_no(admission.py:294)` → `_fm_ts(admission.py:170)`。
924
+ 站点:`md_cg/admission.py:170`。
925
+ 3. **R3 读数面·设备审计分片(`_ts` 溢出)**——payload:实验根下 `_audit.jsonl`
926
+ 一行 `{"op":"forget","id":"n1","t":<400 位整数>}`;调
927
+ `admission.r3_reversible(root)`。异常:`OverflowError`;帧链
928
+ `r3_reversible(admission.py:362)` → `_ts(admission.py:158)`。
929
+ 站点:`md_cg/admission.py:158`。
930
+ 4. **R3 读数面·裁决记录(`_ts` 溢出)**——payload:实验根下
931
+ `hippocampus/decisions.jsonl` 一行
932
+ `{"decision":"accept","t":<400 位整数>,"mutation":{"action":"C","target":"n9","before":"x/y.md"}}`;
933
+ 调 `admission.r3_reversible(root)`。异常:`OverflowError`;帧链
934
+ `r3_reversible(admission.py:385)` → `_ts(admission.py:158)`。
935
+ 站点:`md_cg/admission.py:158`。
936
+ 5. **R4 读数面(`_ts` 溢出)**——payload:实验根下 `hippocampus/decisions.jsonl`
937
+ 一行 `{"t":<400 位整数>,"decision":"accept"}`;调
938
+ `admission.r4_converging(root)`。异常:`OverflowError`;帧链
939
+ `r4_converging(admission.py:511)` → `_ts(admission.py:158)`。
940
+ 站点:`md_cg/admission.py:158`。
941
+ 6. **`check()` 级联(首条读数即崩)**——payload:实验根下 `_forgetting.jsonl`
942
+ 含 `{"t":<400 位整数>,"verdict":"DROP"}`;调 `admission.check(root)`。异常:
943
+ `OverflowError`;帧链 `check(admission.py:568)` → `r1_non_degenerate(:230)` →
944
+ `_ts(:158)`;check 未返回任何汇总体。站点:`md_cg/admission.py:158(经 :568/:230)`。
945
+ 7. **`settle()` 异常 ⇒ `mode()` fail-open(从未成功结算时,核心腿)**——payload:
946
+ env `MDCG_AUTONOMY=full`;实验根 `_forgetting.jsonl` 含 `{"t":<400 位整数>}`;
947
+ `autonomy_modes.reset_settlement()` 后调 `settle(root=<temp>)`。observed:
948
+ settle 抛 `OverflowError`(帧链 `autonomy_modes.py:219` →
949
+ `admission.py:600(gate)` → `:568(check)` → `:230` → `:158`,异常未被捕获
950
+ 而直接传播);stderr 零告警;`admission_state()` 保持未结算态
951
+ (`configured=null/effective=null/settled=false/alerts=[]`);随后 `mode()`
952
+ 返回 `"full"`(fail-open)。**对照**(同一调用面、空库根无溢出行):settle
953
+ 不抛,返回 `effective=confirm`、alerts 4 条并写 stderr 一行告警、
954
+ `mode()=confirm`——崩与 fail-open 由溢出行直接引起。
955
+ 站点:`md_cg/autonomy_modes.py:219`。
956
+ 8. **`settle()` 异常 ⇒ 旧 full 保留(已成功结算后注入)**——payload:先构造
957
+ R1–R4 全满足实验库(`check ok=true、missing=[]`)→ settle 成功
958
+ `effective=full/mode()=full` → 向 `_forgetting.jsonl` 追加
959
+ `{"t":<400 位整数>}` → `settle(force=True)`。observed:第二次 settle 抛
960
+ `OverflowError`(同帧链);结算态未更新仍
961
+ `configured=full/effective=full/settled=true`;`mode()` 仍 `"full"`——
962
+ 异常静默且档位不降。站点:`md_cg/autonomy_modes.py:219`。
963
+ 9. **用户面 CLI(`python -m md_cg.admission`)**——payload:子进程
964
+ `python -X utf8 -m md_cg.admission --root <temp 实验根> --ttl 0`(库含
965
+ `{"t":<400 位整数>}`)。observed:退出码 1(未捕获异常,正常面应有 render
966
+ 输出与 0/1 语义退出码);stdout 空;stderr 尾部为 ` return float(v)` /
967
+ `OverflowError: int too large to convert to float`。
968
+ 站点:`md_cg/admission.py:158`。
969
+ 10. **逐型读数基线(R1 面六型)**——payload:六个独立实验根,各写一行载荷 +
970
+ 一行合法 `{"t": now-3600, "verdict":"MERGE"}`:①`{"t":<400 位整数>}`
971
+ ②`{"t":1e400}` ③`{"t":NaN}` ④`{"t":"1700000000"}` ⑤`{"t":-5}`
972
+ ⑥`{"t":null}`;调 `r1_non_degenerate(root, now=固定值)`。observed:**仅①崩**
973
+ (`OverflowError` @`:158`);②`1e400`→`float('inf')` 不崩但**静默**——不入
974
+ 30 天窗且不计 undated(`total=1/undated=0/summary_all=2`,inf 行在窗口判定
975
+ 中消失);③④⑤⑥不崩且计 `undated=1`(合法行 `total=1`)。站点:
976
+ `md_cg/admission.py:158`(仅大整数型;其余五型未崩)。
977
+ 11. **对照腿(无溢出载荷 / root 不存在,非崩溃面)**——payload:①env
978
+ `MDCG_AUTONOMY=full` + 空实验库根 `settle(root=<temp>)`;②
979
+ `settle(root=<不存在的临时路径>)`。observed:均不抛——①返回
980
+ `configured=full/effective=confirm/settled=true`、alerts 4 条、stderr 一行
981
+ 回落告警、`mode()=confirm`;②同样正常回落 confirm + 告警(读数缺失走
982
+ `ok=False` 路径)——界定改动前崩溃只由不可表示数值触发,而非调用面本身。
983
+ 站点:无(未崩溃)。
984
+
985
+ ### 8.3 修法三件与落点(补强轮实读;行号口径=符号所在行)
986
+
987
+ | # | 交付 | 落点 | 说明 |
988
+ |---|---|---|---|
989
+ | 1 | **数值容错**(补强一) | `md_cg/admission.py`:新增 `_as_ts:160`(数值闸**单点**:类型 → `float(v)` 兜 `OverflowError/ValueError/TypeError` → 有限正判据);`_ts:179`/`_fm_ts:196` 改用之 | 不可表示(超出 float 范围的整数型数值)/±inf/NaN ⇒ `None`(⇒ 读数 `undated` 桶),**不抛**;合法数值**逐位不变**。口径=`_stream_jsonl`「坏行跳过不抛」+ `_ts` docstring「非正数返回 None」 |
990
+ | 2 | **结算异常 fail-closed**(补强二) | `md_cg/autonomy_modes.py`:`_SETTLEMENT:208` 增 `error` 键(键集 7→8,形态固定);新增 `_warn:214` 单点;`settle:223` 包 try/except 写**失败态**(异常分支 `:253-277`);`mode:190`/`admission_state:301`/`reset_settlement:309` 同步 | 失败态=`configured=full` + `settled=True` + `error` 非空 + `alerts=[{reading:"settle_error", ok:None, detail:"读数不可得(…)…"}]`——与「未调用过 settle」(configured=None、error=None)**可区分**;**有效档位两格**见 §8.4 |
991
+ | 3 | **守卫+报告**(补强三) | `md_cg/test_autonomy_admission.py`:G 组 `g_g:642`(**19** 断言);变异表 `_SRC_MUTATIONS:856` **+4 处**(⑯`:932`/⑰`:941`/⑱`:946`/⑲`:952`,另校准 ⑫/⑭);本报告本节 | 见 §8.5(含变异红项序列与 ANCHOR-MISS 探针) |
992
+
993
+ 「生效条件:」注释与 docstring 同步:`_as_ts`/`_ts`/`_fm_ts` 与 `settle`/`mode`/
994
+ `admission_state`/`reset_settlement` 各注释行重写;两模块 docstring 各增
995
+ 「补强批次」段;守卫 docstring 增 G 组覆盖与变异口径说明。
996
+
997
+ ### 8.4 结算异常语义(失败态判定;契约两句话的解释与可分叉点)
998
+
999
+ 契约两处并置(原文):「`settle` 异常 ⇒ confirm+告警非 full」与「『已成功结算后
1000
+ 异常 ⇒ 不升不降』保持」。本批按**场景互补**落法(与 §5.3② 的修前实测口径一致):
1001
+
1002
+ | 场景 | 有效档位 | 结算态 | 判定阅读 |
1003
+ |---|---|---|---|
1004
+ | **从未**成功结算 + `settle` 异常 | **回落 confirm** | 失败态(error 非空) | 收口 fail-open(契约背景所指缺口) |
1005
+ | 已有成功结算 + `settle` 异常 | **保持上次 effective**(不升不降) | 失败态(error 非空,alerts 报「读数不可得」) | 既有对拍锚;失败态可观测、可随时重结算 |
1006
+ | `settle` 之外的读数面异常(未再调 `settle`) | 不变(结算态是冻结快照,`mode()` 零 IO) | 不变 | 「已成功结算后异常 ⇒ 不升不降」的另一半 |
1007
+ | 未调用过 `settle` | `mode()`=env(full) | 空态(configured=None、error=None) | 既有对拍锚**不得破** |
1008
+
1009
+ **若设计者「回落 confirm」为无条件(含已结算场景)**:改动点为异常分支一行
1010
+ (`eff = prev or MODE_CONFIRM` → `eff = MODE_CONFIRM`),守卫变异 ⑱ 与该方向
1011
+ 恰相反、G3d/G3e 会同步要求改用例——语义可分叉点已在守卫与变异表中双向钉死
1012
+ (同 §3.2 偏离③ 的处置体例)。**本批选择按上表落码,若复核判定应为无条件
1013
+ fail-closed,请以该行改动加守卫同步为收口。**
1014
+
1015
+ ### 8.5 守卫与回归数字(〔实跑·补强轮〕+〔实跑·定稿轮〕复跑;命令与退出码)
1016
+
1017
+ ```text
1018
+ python -X utf8 -B -m md_cg.test_autonomy_admission → 64 通过,0 失败;exit 0
1019
+ (补强前基线同法实跑:45 通过,0 失败;+19 = G 组)
1020
+ python -X utf8 -B -m md_cg.test_autonomy_admission --mutate
1021
+ → 未变异基线红项=0;19 处逐处「命中预期」;exit 0
1022
+ 红项序列 2,1,1,2,2,1,1,1,1,2,1,7,1,3,1,10,2,2,6
1023
+ (既有 13 处不变;校准 2 处:⑫ 6→7、⑭ 2→3;新增 4 处:⑯ 10、⑰ 2、⑱ 2、⑲ 6)
1024
+ python -X utf8 -B -m md_cg.test_autonomy_modes → 149 通过,0 失败;exit 0(不变)
1025
+ python -X utf8 -B -m md_cg.test_autonomy_modes --mutate
1026
+ → 未变异基线红项=0;16 处逐处「命中预期」(17,40,47,6,10,4,18,4,20,2,15,2,3,2,8,9
1027
+ ——与补强前逐处同值);exit 0(对拍锚未破)
1028
+ python -X utf8 -B scripts/run_tests.py md_cg → 230/230 通过,3 跳过;rc=0(不变)
1029
+ ANCHOR-MISS fail-closed 探针(进程内注入假锚点,未改文件)
1030
+ → main() 返回 2、打印「锚点自检:FAIL(fail-closed,exit 2)」(机制未改、在位)
1031
+ ```
1032
+
1033
+ **定稿轮复跑(本报告定稿轮独立重跑、非转录;〔实跑·定稿轮〕)**:四条命令
1034
+ rc 均 0——`…test_autonomy_admission` 64 通过 0 失败;其 `--mutate` 基线红项=0、
1035
+ 19 处红项序列与上块逐处同值(`2,1,1,2,2,1,1,1,1,2,1,7,1,3,1,10,2,2,6`);
1036
+ `…test_autonomy_modes` 149 通过 0 失败;其 `--mutate` 基线红项=0、16 处
1037
+ (`17,40,47,6,10,4,18,4,20,2,15,2,3,2,8,9`)全「命中预期」。另跑:
1038
+ `python -X utf8 -B scripts/run_tests.py` → **307/307 通过,5 跳过**(依赖缺失/
1039
+ 平台不符:`md_cg.test_md_access_parity` / `md_cg.test_p44_md_whitebox` /
1040
+ `md_cg.test_wisdom_md_store` / `swarm.tests.bench_swarm_parallel` /
1041
+ `swarm.tests.bench_swarm_scale`)、rc=0;`python -X utf8 -B scripts/run_tests.py
1042
+ md_cg` → **230/230 通过,3 跳过**、rc=0。
1043
+
1044
+ **G 组 19 断言清单**(正向全绿;括注=把它打红的定点变异):
1045
+ G1/G1a 逐型读数(`_ts`/`_fm_ts`;⑯);G2/G2a R1 溢出面不崩 + `undated`(⑯);
1046
+ G2b/G2c R2 同上(⑯);G2d R3 同上(⑯);G2e R4 同上(⑯);G2f `check` 不崩(⑯);
1047
+ G3/G3a/G3b/G3c 从未结算 + 异常 ⇒ 失败态 + 回落 + 告警 + 可区分(⑰/⑲);
1048
+ G3d0/G3d/G3e 已结算 + 异常 ⇒ 不升不降 + 可观测(⑱/⑲);G4 未 settle 对拍
1049
+ (保持面);G5 失败态零写入(保持面);G6 溢出库 settle 端到端(⑯/⑫)。
1050
+
1051
+ ### 8.6 逐型读数与溢出面实测(〔实跑·补强轮〕)
1052
+
1053
+ 逐型(`_ts`/`_fm_ts` 同口径;补强前 → 补强后):
1054
+
1055
+ | 型 | 补强前 | 补强后 |
1056
+ |---|---|---|
1057
+ | 400 位十进制整数 | **抛 `OverflowError`** | `None`(⇒ undated,不抛) |
1058
+ | `1e400`(float inf) | `inf` | `None` |
1059
+ | `-inf` | `None`(`v > 0` 不成立) | `None` |
1060
+ | NaN | `None`(同左) | `None` |
1061
+ | 字符串数字 `"1700000000"` | `None`(类型闸) | `None` |
1062
+ | 负数 | `None` | `None` |
1063
+ | `None` | `None` | `None` |
1064
+ | 合法浮点 `1700000000.5` | `1700000000.5` | `1700000000.5`(逐位不变) |
1065
+ | 合法整数 `1700000000` | `1700000000.0` | `1700000000.0`(逐位不变) |
1066
+ | `10**300`(可表示) | `1e300` | `1e300`(逐位不变) |
1067
+
1068
+ 四条读数 + `check()` 对含溢出行的数据面(合成库:`_forgetting.jsonl` 一大整数行
1069
+ + 一 `inf` 行 + 一合法行;`decisions.jsonl` 一整数行;`rejected/` 一 `created_at`
1070
+ 大整数节点;`_audit.jsonl` 一坏 `restore` 行):**全部不崩**——R1 `undated=2`/
1071
+ `total=1`(坏行视同缺时间戳)、R2 `rejected.undated=1`(合法一条照常计窗)、
1072
+ R3 `count=0`(坏行不成对)、R4 坏行不计窗(合法三子窗判定不受扰)、`check()`
1073
+ 四读数齐备、缺口如实列出。**settle 端到端**(补强轮实跑):含溢出行的库 ⇒ 不崩、
1074
+ 读数正常判不满足 ⇒ 回落 confirm、`error is None`(非结算失败态)。
1075
+ **补强前对照的取证口径(如实)**:① 「读数抛 `OverflowError`」=补强轮**编辑前**
1076
+ 探针直证(`_ts`/`_fm_ts` 对 400 位整数均抛,编辑前实跑);② 「该库 `settle`
1077
+ 崩溃 + 未结算进程 `mode()` 照常 full」=§5.3 复核转录(补强轮读码核对:`settle`
1078
+ 对读数异常不捕获),其**可执行重现**=本批变异⑲「结算异常不捕获」实测(该形态
1079
+ 下 G3 系列 6 条判据全红,即失败态/回落/告警整组不存在)——补强轮未复现补强前的
1080
+ 原始二进制(工作树即修复后实现)。
1081
+
1082
+ ### 8.7 前后对拍与硬边界自查
1083
+
1084
+ - **前后对拍(合法数据面逐位不变)**:守卫既有 A–F 组 45 断言补强前后**同一组
1085
+ 断言、两次全绿**(45/0 → 64/0,A–F 组计数不变);`test_autonomy_modes` 149/0
1086
+ 与定向回归 230/230 补强前后同值;G1 逐型表对合法值以**字面量 oracle**
1087
+ (=补强前公式对外可见结果)逐一相等。⇒「不动面对拍」未破。
1088
+ - **未 settle 对拍**:G4/E6/L5 三处钉死(`mode()`=env 逐位不变)。
1089
+ - **只告警不改数据**:G5/E9/L7 指纹断言;读数/结算路径零写入。
1090
+ - **红线**:实验全部在 `tempfile` 合成库;未触在役数据根写面(补强轮未在在役
1091
+ 库上做任何读写);未改 `data/policy.json`;未削弱任何 forbidden;
1092
+ 未 `git add/commit/push`;**生产接线未动**(留池,见批次定位)。
1093
+ - **定稿轮补跑(如实)**:python 全量 `python -X utf8 -B scripts/run_tests.py` →
1094
+ `307/307 通过,5 跳过`、rc=0;`md_cg` 定向 → `230/230 通过,3 跳过`、rc=0
1095
+ (命令与读数见 §8.5)。
1096
+ - **仍未复跑**:容器两栈——复核段读数为退出码 0/0(见 §8.8);本报告定稿轮实读
1097
+ docker 能力面在位(`docker --version`=28.4.0,rc=0;镜像 `rust:bookworm`、
1098
+ `node:22-bookworm` 在位),但两栈命令均以**读写**方式挂载仓根
1099
+ (`-v "$(pwd):/work"`)、会在工作树写产物,与本 ask 硬边界「只写这一个文件」
1100
+ 相抵,故不复跑(读数归复核段)。
1101
+
1102
+ ### 8.8 独立复核(ACCEPT)与 uncovered〔采集·复核段(补强后)〕
1103
+
1104
+ **判定=ACCEPT**。依据=四态判定单 = ACCEPT(补强两条修复均成立,四条复核要求
1105
+ 全部由复核方在系统临时目录合成库上独立复现)。复核环境(材料原文要点):
1106
+ Python 3.12.10;全部实验走 `%TEMP%` 自写脚本(**不 import 守卫做验证**),跑完
1107
+ 清理临时沙箱 78 项;工作区零编辑(终态 `git status` 与初始逐位相同:M×2+??×4;
1108
+ HEAD `fd5b94ea` 不变;stash 空);未 `git add/commit/push`;所有 settle/读数
1109
+ 调用均传显式合成 root(输出中出现的 root 全为 `%TEMP%`,未动在役数据根)。
1110
+
1111
+ 复核四项要求(逐条转录;括号内为复核方脚本名):
1112
+
1113
+ **① 修前输入不崩 + 容错路径真的发生**(`recheck_A.py` → **29 通过 / 0 失败,
1114
+ exit 0**):
1115
+ - 输入有毒的独立证据:`float(int('9'*400))` 抛 `OverflowError`;补强前公式对
1116
+ BIG 抛、对 inf 返回 inf、对 NaN/-inf 返回 None(与 §8.6 逐型表逐格自查吻合);
1117
+ - 现行树:`_ts`/`_fm_ts` 对 BIG/inf/NaN/字符串/None 一律 None 不抛;含坏行
1118
+ (BIG/inf/NaN/字符串/负值/无 t)的库上 R1–R4 与 `check()` 不崩、CLI rc=0/1
1119
+ 正常输出(不再 traceback/空 stdout);
1120
+ - 容错路径真的发生(可判定比较、非空池):R1 窗内行索引集合={0,1,2}、
1121
+ undated={3,4,5,6,8,9}(**索引 7 缺席注,回应读者「分桶不闭合」**:该行不进
1122
+ 任何桶——按 `_stream_jsonl` 口径(空行/JSON 解析失败/非 dict 不 yield,
1123
+ `admission.py:212-230` 读码),这是唯一可能的行类别;材料未载第 7 行内容与
1124
+ 库总行数,**不代补**。若按「10 行=3 计窗+6 undated+1 不进桶」重建,与下文
1125
+ 双负对照的 `total=10` 设定相容,但该重建含推断成分、仅作理解辅助,不背书为
1126
+ 材料事实),`by_verdict`/`summary_all` 与独立扫描逐位一致
1127
+ (`summary_all` 另与 `forgetting.summary` 独立实现一致);R2
1128
+ `total/recent/total_30d/undated`=4/1/1/2(rejected)与 2/1/1/1(unresolved)
1129
+ 与独立一致(**与 §5.2① 的 4/1/2/2 不可互推**:两组数字分属**两轮独立复核的
1130
+ 不同合成库**——§5.2=DEFER 轮、本节=补强后 ACCEPT 轮,无同一库的前后关系;
1131
+ §8.7「合法数据面逐位不变」由 §8.8② 的**同库猴补丁对拍**支撑,与本差异无关);
1132
+ R3 证据节点集合={k_1,k_c}(坏行不成对、未回滚不计);R4 三窗
1133
+ 计数 (11,10,10) 与独立一致;settle 对满足库=full/error=None、对仅溢出库
1134
+ =confirm/error=None(非失败态);
1135
+ - 双负对照:坏行被计窗会得 total=10、被丢会得 undated=0,实测 3/6 与两者都
1136
+ 不同 ⇒ 对照可判定。
1137
+
1138
+ **② 合法输入与改前一致(逐位)**(`recheck_B.py` → **10/0**;`recheck_E.py` →
1139
+ **8/0**):`_ts`/`_fm_ts` 合法值 12 型(max 附近/denormal/2**53/bool/0/-0.0
1140
+ 等)与补强前公式 IEEE754 位串逐位相等;键回退面逐位相等。库级:纯合法库上把
1141
+ 补强前公式猴补丁回 admission(内存、不改文件)跑 `check()`,与现行结果全返回值
1142
+ 递归位串相等;settle=full/零告警/error=None;未结算 `mode()`=env 对拍锚;
1143
+ confirm/plan 零 gate 调用;指纹不变。边界补测:`10**309`/-BIG/list/dict/object/
1144
+ `'nan'` ⇒ None 不抛(`10**309` 补强前抛);max double 合法面逐位一致。
1145
+
1146
+ **③ 守卫本体与变异自证**(独立复跑,逐条读 rc/断言数/红项):
1147
+ `…test_autonomy_admission` rc=0、64 通过 0 失败;`--mutate` rc=0、19 处红项
1148
+ 序列 `2,1,1,2,2,1,1,1,1,2,1,7,1,3,1,10,2,2,6` 全「命中预期」;
1149
+ `…test_autonomy_modes` rc=0、149 通过 0 失败;`--mutate` rc=0、16 处
1150
+ `17,40,47,6,10,4,18,4,20,2,15,2,3,2,8,9` 全命中——与报告声称逐位吻合(独立
1151
+ 复跑、非转录)。**删断言探针**(内存改 `_GROUPS`、不改文件、3 个独立子进程):
1152
+ 对照 rc=0;删 g_a ⇒ 自证 rc=1、3 处「红项数不符」;删 g_g(补强组)⇒ rc=1、
1153
+ 6 处不符(补强 ⑯⑰⑱⑲ 实测红项 0/0/0/0 vs 预期 10/2/2/6)⇒ 自证对断言存在性有
1154
+ 判别力、非空转。**锚点 fail-closed 探针**(注入假锚点):`main()` rc=2 且打印
1155
+ 「锚点自检:FAIL(fail-closed,exit 2)」。
1156
+
1157
+ **④「不得静默」可观测**(`recheck_D.py` → **11/0**):子进程分离捕获——回落时
1158
+ stderr 恰 1 行(含 `MDCG_AUTONOMY=full`、缺 R1-R4、回落 confirm)、stdout 无
1159
+ 告警、`alerts==读数 missing`、`mode()=confirm`;失败态(注入 gate 异常):从未
1160
+ 结算 ⇒ stderr 一行「结算失败/不可判」+ effective=confirm(fail-open 收口成立);
1161
+ 已结算 ⇒ effective 保持 full(不升不降)且 error 非空可查;失败态
1162
+ (configured=full+error)与未调用过 settle(configured=None)可区分;stderr
1163
+ 写失败不影响结算体返回。
1164
+
1165
+ **复核轮的 python 全量与容器两栈**:python 全量 rc=0——`===== SUMMARY
1166
+ 307/307 通过,5 跳过(依赖缺失/平台不符) =====`(与定稿轮复跑同值,见 §8.5)。
1167
+ 容器两栈:
1168
+
1169
+ | 栈 | 退出码 | 读数(复核轮转录) |
1170
+ |---|---|---|
1171
+ | 栈一(`linux_verify.sh full`) | **0** | `结果: 22 pass / 0 fail`|`[PASS] smoke_test (linux)`|`=== 汇总: 38 pass / 0 fail ===` |
1172
+ | 栈二(`node:22-bookworm`:build + `node --test`) | **0** | `# cancelled 0`|`# skipped 3`|`# todo 0`|`# duration_ms 11966.3271` |
1173
+
1174
+ (栈一「22 与 38 两个计数的关系」读码复算、栈二尾部四行的边界说明见 §4.4
1175
+ ——同款口径。)
1176
+
1177
+ **uncovered(复核列出)**:复核材料未随附新的 uncovered 清单——四条复核要求
1178
+ 全部独立复现通过,**复核轮无新增未覆盖项**;此前 DEFER 轮的 uncovered=§5.3
1179
+ 溢出缺口(即本批收口对象),收口成立后判 ACCEPT。**不代补**(若复核另有清单,
1180
+ 以其原始材料为准)。
1181
+
1182
+ ### 8.9 边界与未覆盖(补强轮留池面)
1183
+
1184
+ - **生产接线仍留池**(§六.1 登记不变):`mcp_server.main()`/常驻巡检**未**接
1185
+ `settle`——本批只落容错与失败态语义;未接线进程里 `mode()` 与改动前逐位一致
1186
+ (G4/E6/L5 对拍锚)。
1187
+ - **明确不修而留池(补强轮点名的面)**:① R3 归档分片离线全扫(§六.2);
1188
+ ② R3 加密库逐字节边界(§六.3);③ R3 推断误报边界(§六.4);④ 回滚独立
1189
+ 留痕「另项」(步骤③ 登记);⑤ 计划输入面(延续步骤②③留池)。
1190
+ - **容错口径的边界(补强批次语义,如实)**:`_as_ts` 只收「能表示为有限正浮点」的
1191
+ 值;`1e400`/±inf/NaN/字符串数字/负数/None ⇒ `None`(计入 `undated` 桶)。
1192
+ 一处**有意行为变化**:`1e400`(float inf)在补强前「不崩但静默」(不入窗、
1193
+ 不计 undated——§8.2 腿 10 实测),补强后计入 `undated`(如实)——不再有
1194
+ 「数值静默消失」的行。
1195
+ - **未复现补强前的原始二进制**(§8.6 同款口径):工作树即修复后实现;
1196
+ 「修前公式抛 `OverflowError`」由复核独立证据(`float(int('9'*400))` 抛错,
1197
+ §8.8①)与变异 ⑯(容错摘除后 10 项判据全红,§8.5)双向钉死。
1198
+ - **容器两栈未由本报告复跑**(理由与能力面读数见 §8.7);读数归复核段(§8.8)。
1199
+
1200
+ ### 8.10 git 面(补强轮+定稿轮实读;工作树未提交)
1201
+
1202
+ ```text
1203
+ $ git status --porcelain
1204
+ M md_cg/autonomy_modes.py
1205
+ M md_cg/test_autonomy_modes.py
1206
+ ?? .zcode/
1207
+ ?? docs/eval/三档自治_步骤④准入读数_落码记录_v1.0.md
1208
+ ?? md_cg/admission.py
1209
+ ?? md_cg/test_autonomy_admission.py
1210
+ $ git rev-parse HEAD → fd5b94ea40dcfea94114943b64c615cd2b4aec37(不变)
1211
+ $ git diff --stat → md_cg/autonomy_modes.py | 180 +++…(补强轮 +55)
1212
+ md_cg/test_autonomy_modes.py | 179 +++…
1213
+ 2 files changed, 339 insertions(+), 20 deletions(-)
1214
+ $ git stash list →(空)
1215
+ ```
1216
+
1217
+ **定稿轮复读(2026-10-02;〔实跑·定稿轮〕)**:同上逐位一致——`M×2+??×4`
1218
+ 六行不变(本报告为未跟踪文件,其编辑不改变 diff 面);`git diff --stat` 合计
1219
+ `2 files changed, 339 insertions(+), 20 deletions(-)`;HEAD 仍
1220
+ `fd5b94ea40dcfea94114943b64c615cd2b4aec37`;stash 空。⇒ 工作树除本报告
1221
+ (未跟踪)外,自补强轮以来未再改动。
1222
+
1223
+ `data/policy.json`、`hive/`、`scripts/`、在役数据根:零改动。
1224
+
1225
+ ---
1226
+
1227
+ ## 附 A:本批新增/修改的判据与「生效条件:」注释(本仓惯例)
1228
+
1229
+ > **行号口径(回应读者「换算对不上」)**:本节列的是「生效条件:」**注释行**、
1230
+ > **时点=补强后(最新工作树)**;§3.1 表列的是 **`def` 定义行**、**时点=
1231
+ > 步骤④ 原落码**——两者**跨时点、不可相减**。「注释行与 def 行相差 1 行」的
1232
+ > 规则**仅在同一时点内**成立(例:补强后 `r1:255`(注释)合
1233
+ > `r1_non_degenerate:256`(def);原落码 `r1:218`(注释)合 `:219`(def))。
1234
+ > **原落码 → 补强后**的符号级换算用 **§3.1 末「行号对照」表**;修前/帧行口径
1235
+ > 见报头「行号口径」注与 §8.1 口径注。
1236
+
1237
+ - `md_cg/admission.py`(新):模块 docstring(四条读数判据逐字照设计 §七 +
1238
+ 三条纪律 + R3 探针结论 + TTL 依据 + 「补强批次」段 `:69-76`);每个函数上方
1239
+ 「生效条件:」注释(`_now:154`/`_as_ts:159`〔补强新增〕/`_ts:178`/
1240
+ `_fm_ts:195`/`_stream_jsonl:211`/`_fingerprint:233`/`r1:255`/`r2:308`/
1241
+ `r3:385`/`_disk_path_of:494`/`_load_index_nodes:522`/`r4:537`/`check:601`/
1242
+ `gate:624`/`cache_stats:646`/`reset_cache:653`/`default_root:660`/
1243
+ `render:676`/`main:690`)。
1244
+ - `md_cg/autonomy_modes.py`:模块 docstring 增批次④ 段与「补强批次」段
1245
+ (`:48-78`);`_configured_mode:173`/`mode:189`/`_warn:213`〔补强新增〕/
1246
+ `settle:222`/`admission_state:300`/`reset_settlement:308` 各带「生效条件:」;
1247
+ `__all__` 增四符号(`:96-98`)。
1248
+ - `md_cg/test_autonomy_admission.py`(新):模块 docstring(六组覆盖 + G 组
1249
+ 「补强批次」段 + 变异口径 + 沙箱硬边界,`:1-56`);`_SRC_MUTATIONS:856`
1250
+ (19 处;补强 +4、校准 2)。
1251
+ - `md_cg/test_autonomy_modes.py`:docstring 增批次④ L 组段;`g_l:931`(补强轮
1252
+ 未改,定稿轮读码复核同值);`_SRC_MUTATIONS:1079`(16 处,同上)。
1253
+
1254
+ ## 附 B:本报告证据来源对照(每个数字谁跑的)
1255
+
1256
+ - **〔实跑·撰写轮〕**:守卫正向 45/0 与 149/0 及分组计数;两套 `--mutate`
1257
+ 全绿(15 处/16 处红项数逐处吻合);`python -X utf8 scripts/run_tests.py`
1258
+ 全量 307/307 与 `md_cg` 组 230/230(§4.3);在役库只读采样(§4.5 全部
1259
+ 数字与六面 stat SAME);git 面(§7.1);docker 能力面(§4.4 未复跑声明)。
1260
+ **修订轮补跑**:CLI rc=1(§4.5①);整扫 0.228s / `_audit.jsonl` 0.206s
1261
+ (§3.5);settle 崩溃两情形实测(§3.4/§六.12);修前守卫标记重数 5/7
1262
+ (§二 腿GUARD);`linux_verify.sh` 38 构成读码复算(§4.4)。
1263
+ - **〔采集·复现段〕**:§二 8 条复现腿(腿R1/R2/R3/R4/GATE/WINDOW/GUARD/自证)。
1264
+ - **〔采集·实施段〕**:§3.6 P1–P8、§二.2.9 腿①–⑤、§4.6 边界用例表、§3.1
1265
+ 落点表、§4.2 锚点漂移记录、在役库落码轮初读。
1266
+ - **〔采集·复核段〕**:§五 全部(四项覆盖面读数、uncovered、只读边界)。
1267
+ - **〔实跑·补强轮〕/〔实跑·定稿轮〕/〔采集·复现段(补强轮)〕/〔采集·复核段
1268
+ (补强后 ACCEPT 轮)〕**(§八):
1269
+ · **实跑·补强轮**=补强实施轮实跑(§8.5/§8.6 数字:守卫 64/0、两套
1270
+ `--mutate`;`md_cg` 定向 230/230;逐型读数表;ANCHOR-MISS 探针);
1271
+ · **实跑·定稿轮**=本报告定稿轮复跑(§8.5 四条命令 rc=0 与红项序列逐处
1272
+ 同值、python 全量 307/307 与 `md_cg` 定向 230/230;§8.7 docker 能力面;
1273
+ §8.10 git 面复读);
1274
+ · **采集·复现段(补强轮)**=§8.2 十一条复现腿(全部 `reproduced=true`);
1275
+ · **采集·复核段(补强后 ACCEPT 轮)**=§8.8 全部(四条复核要求读数、
1276
+ python 全量、容器两栈;uncovered 无新增)。
1277
+ - **〔采集·编排侧〕**:§4.4 容器两栈读数(栈一 `38 pass / 0 fail` 退出码 0;
1278
+ 栈二退出码 0)。
1279
+ - **〔修订轮(2026-10-03;读者反馈修订)〕**:反馈逐条处置——报头口径注、§3.1
1280
+ 行号对照表、§3.2 备案⑤、§3.3 分叉依据、§4.5 六面注、§4.6 校准、§5.2 可重建
1281
+ 性声明、§六.12 前置消解、§8.6/§8.8/§8.9 消歧与缺口注、附 A 口径重写、附 B
1282
+ 本条与附 C——**只改本报告文件**,未动源码/数据;§4.6 校准依据的变异红项名
1283
+ 清单为修订轮实跑(`--mutate`,见附 C 末)。
1284
+ - **未跑(如实)**:§4.4 与 §8.7 的容器两栈均未由本报告复跑(§8.7 理由;
1285
+ §4.4 为编排侧采集、§8.8 为复核段读数)。**在役库写入面**:本报告实跑面
1286
+ (采样/结算/守卫/全量)零写入;在役库上的写入仅=纪律 16 收尾归档
1287
+ (落码轮、非本报告实跑面——见 §4.5 末「判读点说明」)。
1288
+
1289
+ ## 附 C:读者问答登记(修订轮 · 2026-10-03;逐条处置)
1290
+
1291
+ > **本附逐条登记读者反馈「nextQuestions(8 条)」的处置**:能答的给答案与出处;
1292
+ > 材料未载的如实标注「不代补」;不属报告职责的说明归属方。unclear(8 条)/
1293
+ > unsupported(3 条)的处置已就地落在正文(落点清单见本附末)。
1294
+ > **处置原则**:只改本报告文件;不改源码、不改数据;未复跑容器两栈(理由 §8.7)。
1295
+
1296
+ 1. **步骤④整批(含补强)最终的验收状态?** —— 机械事实三层:原批复核判
1297
+ **DEFER**(依据=§5.3 溢出缺口;§5.1);补强后复核判 **ACCEPT**(两条修复
1298
+ 成立;§8.8);原 DEFER 依据已由补强收口(§5.3 收口陈述、§六.12 收口登记)。
1299
+ **「整批是否通过 / 可否提交」的裁决权在复核方/使用者**——本报告不做验收
1300
+ 声明(§5.1 同口径),工作树至今未提交(§8.10)。⇒ 建议:以「复核方对整批
1301
+ (含 §八)出一次收口裁定」作为提交前置。
1302
+ 2. **生产接线谁做、何时做?** —— **材料未载(不代补)**;§六.1 已登记「接线
1303
+ 排期未随本批材料给出」。已可确证的只有:未接线期间「不满足不可选中」与
1304
+ 「自动降档」**均尚未兑现**(§六.1 兑现边界、§3.5)。
1305
+ 3. **归档节点 `mem_1790952929766_b28eef` 的落点文件与写入时刻?** —— **材料
1306
+ 未载(不代补)**(§4.5 判读点说明)。可确证:节点 id、`knowledge/orphan/`、
1307
+ 经闸门 ACCEPT、发生于落码轮收尾;写作时刻/文件路径需向落码轮归档执行方
1308
+ 索取。
1309
+ 4. **补强后容器两栈是否重跑?`# skipped 3` 是哪三项?** —— 补强后读数=复核段
1310
+ 实跑:栈一/栈二退出码均 **0**(§8.8);**栈二 `# skipped 3` 明细未随材料
1311
+ 传入(不代补)**(§4.4 同口径)。
1312
+ 5. **复核脚本(`recheck_*.py`)能否归档?** —— 材料只载「已清理、残留 0」
1313
+ (§5.1)。能否归档**不由本报告决定**——登记为开放项:建议复核方在下次复核
1314
+ 时把脚本与夹具一并归档;否则 ACCEPT 的原始证据只能读转述(§5.2 已逐面标注
1315
+ 转述属性、§8.8 同)。
1316
+ 6. **在役库 R3 何时可能满足?加密实例谁判定?** —— R3 需在役库出现「真实
1317
+ 回过」证据;现状 `count=0`=**候选执行记录 0 条**(执行桥尚未在役库产生
1318
+ 变更单执行记录;§4.5)。加密实例**无查询口**(§六.3)——判定归属库属主/
1319
+ 后续批次;两者均涉及在役放权,登记为开放项(不代断)。
1320
+ 7. **R1 占比含 ACCEPT 是设计原意还是实现自定?** —— 设计 §七 原文**未限定
1321
+ verdict 集合范围**;实现取全量键(含 ACCEPT)。**已升格为 §3.2 第⑤条口径
1322
+ 备案**(本修订轮),含「若设计原意不含 ACCEPT:改 `r1_non_degenerate` 单点
1323
+ +守卫/变异同步」的分叉路径。
1324
+ 8. **版本号是否需要 v1.1?** —— **文件名不追改**:v1.0=步骤④落码批次版本、
1325
+ v1.1=批次内补强批次的内容版本(报头「版本语义」注,本修订轮补);§5.3/
1326
+ §六.12 的「已收口」状态已就地在两节内标注(v1.1)。
1327
+
1328
+ **本修订轮正文落点清单(便于定位)**:报头(版本语义 / 证据标签表补 4 项 /
1329
+ 「本轮」消歧 / 行号口径四类 / 术语指针);§2.10(+3 术语行:三档、变更单
1330
+ 三字段、计划输入面);§3.1 末(行号对照表+函数内行对照);§3.2(+备案⑤);
1331
+ §3.3(+不可判/不满足分叉依据);§4.5(六面覆盖面与强度注、措辞校准);
1332
+ §4.6(+A6/B5 注、判别力按实测红项清单校准);§5.2①(+可重建性声明);
1333
+ §六.12(+前置收口消解句);§8.6/§8.8/§8.9(「本轮」消歧、R2 两轮库注、
1334
+ 索引 7 缺口注);附 A(口径注重写);附 B(来源补修订轮);附 C(本附)。
1335
+ **修订轮实跑的复核性证据**:`python -X utf8 -B -m md_cg.test_autonomy_admission
1336
+ --mutate`(rc=0;19 处红项名清单用于 §4.6 校准)——红项名与 §4.2/§8.5 所载
1337
+ 逐处吻合。