@furongjun1999/dsh-memory 0.7.0 → 0.7.2

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 (78) hide show
  1. package/README.md +8 -6
  2. package/codebuddy/CODEBUDDY.md +5 -5
  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.0.md +223 -0
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. package/docs/eval//345/217/221/345/270/20310_/350/257/273/351/235/242/346/215/237/345/235/217UTF8/345/256/266/346/227/217/346/224/266/345/217/243_v1.0.md +71 -0
  18. 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
  19. 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
  20. 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
  21. 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
  22. package/docs//345/267/245/344/275/234/347/272/252/345/276/213_/350/256/244/347/237/245/345/233/276/346/235/241/347/233/256_v1.1.json +4 -4
  23. package/md_cg/admission.py +718 -0
  24. package/md_cg/autonomy_modes.py +642 -0
  25. package/md_cg/bench6_arms.py +10 -6
  26. package/md_cg/census.py +2 -1
  27. package/md_cg/consistency.py +133 -8
  28. package/md_cg/forgetting.py +38 -6
  29. package/md_cg/freshness.py +17 -1
  30. package/md_cg/lifecycle.py +30 -2
  31. package/md_cg/mcp_server.py +63 -7
  32. package/md_cg/mdcg.py +157 -31
  33. package/md_cg/mdcos.py +675 -19
  34. package/md_cg/mreview/locate.py +1 -1
  35. package/md_cg/protect.py +79 -4
  36. package/md_cg/provenance.py +1 -1
  37. package/md_cg/review_cli.py +31 -2
  38. package/md_cg/rollback.py +420 -0
  39. package/md_cg/rollback_cli.py +104 -0
  40. package/md_cg/routing.py +10 -1
  41. package/md_cg/stg.py +400 -50
  42. package/md_cg/stgidx.py +281 -0
  43. package/md_cg/test_autonomy_admission.py +1098 -0
  44. package/md_cg/test_autonomy_modes.py +1972 -0
  45. package/md_cg/test_b1_auto_id_multiproc.py +7 -0
  46. package/md_cg/test_b1b2_write_face.py +7 -0
  47. package/md_cg/test_b3_merge_keeps_content.py +7 -0
  48. package/md_cg/test_cons200_scan_selection.py +791 -0
  49. package/md_cg/test_corrupt_utf8_read_surfaces.py +451 -0
  50. package/md_cg/test_generation_guard.py +15 -9
  51. package/md_cg/test_health_corrupt_utf8.py +37 -0
  52. package/md_cg/test_i50a_half_dup_defer.py +408 -0
  53. package/md_cg/test_i50b_defer_to_review_queue.py +545 -0
  54. package/md_cg/test_i50c_meta_passthrough.py +608 -0
  55. package/md_cg/test_i50d_importance_source.py +531 -0
  56. package/md_cg/test_i50e_readside_protection.py +656 -0
  57. package/md_cg/test_index_crossprocess_reload.py +39 -24
  58. package/md_cg/test_issue39_utf8_stdio.py +9 -1
  59. package/md_cg/test_issue52_scan_condition_first.py +677 -0
  60. package/md_cg/test_issue53_cipher_health_hash.py +385 -0
  61. package/md_cg/test_linkref.py +7 -0
  62. package/md_cg/test_mode_parity.py +1393 -0
  63. package/md_cg/test_mutation_rollback.py +805 -0
  64. package/md_cg/test_n204_n205_n226_n227_n228_n229_exit_gates.py +1 -1
  65. package/md_cg/test_n214_n215_n221_n222_write_face_gates.py +7 -0
  66. package/md_cg/test_p2_mcp.py +8 -0
  67. package/md_cg/test_p9_forget_protect.py +7 -0
  68. package/md_cg/test_p9c_dedup_hints.py +7 -0
  69. package/md_cg/test_policy_required_ccg.py +5 -1
  70. package/md_cg/test_protocol.py +7 -0
  71. package/md_cg/test_stgidx_index_parity.py +1020 -0
  72. package/md_cg/test_writelimit.py +36 -9
  73. package/md_cg/test_writepipe.py +5 -2
  74. package/md_cg/weights.py +15 -1
  75. package/md_cg/writepipe.py +101 -2
  76. package/package.json +1 -1
  77. package/skills/plugin.json +1 -1
  78. package/zcode/AGENTS.md +5 -5
@@ -0,0 +1,651 @@
1
+ # 三档自治 · 步骤②「档位单一入口」(MDCG_AUTONOMY 单点 · 缺省 confirm · 热路径 B/C/D 出变更单 · 裁决执行桥)——落码记录 v1.0
2
+
3
+ **日期**:2026-10-02(v1.1 同日修订——按读者反馈逐条处置,明细见 §七) | **批次**:设计 v0.2 步骤②(§十三 落码顺序;「落码记录」= 本仓 eval 体例的「修复工程报告」,同 issue50 系列) | **基线**:HEAD `d5a6a511` | **被测面**:本仓工作树(未提交——**19 改 + 2 新增**;git 面另含未跟踪 `.zcode/`=宿主目录、起点已在、**非本批产物**;见文末 git 面)
4
+
5
+ **版本谱系与引用裁决(v1.2 报告轮增,回应本轮读者反馈「版本号自相矛盾」)**:**文件名与标题的 `v1.0` 是文档标识**(文件名固定、不改,避免既有引用断裂);正文有两个**修订层**——**v1.1**(2026-10-02 同日,按上一轮读者反馈逐条处置,明细 §七)与 **v1.2**(同日:**补强批次**落码 + **报告轮**定稿,主体 §八)。**冲突裁决规则(唯一,按序适用)**:① **层级高者优先:v1.2 > v1.1 > v1.0 原文**;② 同层内标〔本报告实跑〕的最新块优先于转述块;③ 凡标「保留不覆盖」的旧块(§五 / §6.1 / §6.2 / §6.4 / §七 7.1–7.2 / 附录)**一律是历史层**——只作对读复核当时的判断依据,**不得作现行状态引用**。**本文档的现行状态 = §八(含 8.8–8.12)+ §五 / §6.1 / §6.2 / §6.4 / §七 中标「补强批次更新(v1.2)」「报告轮补 / 报告轮(v1.2 定稿)」的块。** 另:上段与 §6.5 的「19 改 + 2 新增」是 v1.0 起点读数,**现态(20 改 + 4 未跟踪)见 §8.12**。
6
+
7
+ **范围限定(v1.1 增,读者反馈①)**:标题「热路径 B/C/D 出变更单」的**覆盖面** = 写链直写面(C 覆写)· `remember_gated` 的两个合并落点(B 合并 / 限流 CONVERGE)· MCP 工具面两个删除通道(D);**`gated=true` 的 C 覆写面与 A 新增面不在此列**(已知旁路,见 §五 发现 1/2、§6.2)——「缺省 confirm 档下 B/C/D 一律出单」只在上列覆盖面成立,不是全仓成立。
8
+
9
+ **补强批次更新(v1.2)——本限定对现树不再成立**(回应本轮读者反馈:限定未随 §八 更新):上句列为「不在此列」的两面**已于补强批次接入档位判定**(`gated=true` 的 C 覆写与 A 新增走 `MdCGOS._autonomy_gate_rewrite`;见 §8.1 补强二/三、§8.2 前后对拍、§8.8 P2/P3)。**现行覆盖面** = 写链直写面(C 覆写)· `remember_gated` 两个合并落点(B 合并 / 限流 CONVERGE)· MCP 工具面两个删除通道(D)· **gated 面 C 改写 / A 新增(补强批次新增)**。仍**不在**覆盖面内的两面 = **脚本通道直调库层**(留池⑤:`scripts/dsh_log_index.py` 等直调 `MdCGOS.forget` 不接档位)与**计划输入面**(留池④)。现行精确说法:**缺省 confirm 档下,上列覆盖面内的 B/C/D(含 gated 面 C)出单且不落盘;A 新增一律放行(不出单)。**
10
+
11
+ **v1.2 补强批次(2026-10-02 同日,独立复核判 DEFER 之后)**:§五 列出的三条未收口(发现 1 / 发现 2 / 观察 3)与容器栈一「37 pass / 1 fail」的唯一失败项(SHIM-MISS)已由**补强批次**收口——前后对拍读数、守卫扩展数字、该腿 37/1→38/0 的修复证据与docstring 订正记录见 **§八**;§五 / §6.1 / §6.2 / §6.4 的相应状态已就地更新(更新块以「补强批次更新」起头,**原有正文保留不覆盖**,供对读复核当时的判断依据)。
12
+
13
+ **报告轮(v1.2 定稿)补**:§八 含 8.1 落点表 / 8.2 前后对拍 / 8.3 守卫与 14 处变异红项数 / 8.4 栈一 37·1→修复证据 / 8.5 docstring 订正 / 8.6 不动面对拍 / 8.7 自跑与未跑;报告轮另补 **8.8 修前现场(四条复现腿逐条:payload/异常/站点)**、**8.9 本批自身独立复核判定(ACCEPT)与它列出的 uncovered**、**8.10 验证数字(本报告实跑的 python 全量 305/305 + 转录的容器双栈退出码)**、**8.11 边界与留池**、**8.12 工作树现状快照订正**(订正 §8.5 与附录中被复核判为失准的快照)。
14
+
15
+ **关联**:
16
+
17
+ - 设计真源:`docs/plans/记忆自处理三档自治_设计_v0.2.md`——§三 裁决矩阵与三条硬约束(`:59-75`)、§四 复用既有审核队列(`:77-86`)、§五 计划模式(`:88`)、§九 可观测面(`:170`)、§十 边界(`:178`)、§十一 验收判据(`:186`)、§十三 落码顺序(`:197`)。
18
+ - 上游批次:issue50-a/b/c/d/e(`docs/eval/issue50_*`)。设计稿 §八.2(`:145` 起)实测更正指出「DEFER 无复核入口,第①条须与 DEFER→队列接线同批落」——第①条已随 issue50 三批收口(`d5a6a511`),本批即其后的步骤②。
19
+ - 本批内自查实修缺陷(见 §3.3):`MDCG_CAN_ADMIN=0` 的身份可经档位路径删除节点(`test_p2_mcp` §9 抓到)——两处「实修」字样均指此项。
20
+
21
+ **证据分级声明**(本报告只写有机械证据的事):
22
+
23
+ - 标 **〔本报告实跑〕** = 本报告撰写员在本 ask 内亲手执行并计数(守卫正向 / 变异自证 / 变异全红项驱动 / 合成库行为探针 / 行号读码 / 哈希与字面量扫描 / git 面);
24
+ - 标 **〔工作流采集〕** = 修复**实施段**产出,本报告**转录**,不代跑不代补;
25
+ - 标 **〔复核材料〕** = **独立复核段**产出(含其转录的 python 全量 / 容器双栈等编排侧读数),本报告**转录**,不代跑不代补(v1.1 增:原「〔工作流采集·复核材料转录〕」标签统一为「〔复核材料〕」);
26
+ - 行号规则:**改后行号 = 读工作树核实**〔本报告实跑〕;**改前行号 = `git show HEAD:` 核实**(HEAD=`d5a6a511`)〔本报告实跑〕;引用复核材料所载行号时沿用其原样并加「复核引」字样,与本报告读码有差异处以本报告为准(判别方法与实例见 §五 发现 1)。
27
+
28
+ **角色与批次(v1.2 报告轮增,回应本轮读者反馈「标签与角色体系没闭环」)**——全文出现的五个产出角色,定义如下(同一角色在不同批次的标签不同,逐行对应):
29
+
30
+ | 角色 | 定义(产出了什么) | 本文档中的标签 |
31
+ |---|---|---|
32
+ | **实施段** | 落码本批**补强**改动(`mdcos.py`/`writepipe.py`/`test_policy_required_ccg.py`/`test_autonomy_modes.py`)并在**同一 ask** 内实跑的产出方 | 〔本批实跑〕(§八 头注定义;**不是**本报告轮) |
33
+ | **复核段** | 对补强成果做**独立复核**(自写探针、不采信实施自述)的产出方 | 〔复核材料〕 |
34
+ | **报告轮** | **本文档的撰写方**(本 ask):只做读码复核、守卫/全量实跑与转录,不动源码 | 〔本报告实跑〕;读盘上源码的独立核对另标 **〔本报告实跑读码补核〕**(§五 定义) |
35
+ | **工作流采集段** | 修复工作流的**采集段**(批次② 的八条复现腿材料、§二 全节) | 〔工作流采集〕 |
36
+ | **编排侧** | 发起并汇总本工作流的脚本、及其发起的**容器双栈实跑**(执行方) | 〔编排侧采集转录,本 ask 未跑〕(§8.10;早先写作「〔同上〕」处已改为此全称) |
37
+
38
+ **术语速览**(沿用设计稿与本仓既有概念,首现带出处):
39
+
40
+ | 术语 | 释义 |
41
+ |---|---|
42
+ | **三档** | `plan`(计划)→ `confirm`(变更确认,**缺省**)→ `full`(完全访问)的放权阶梯(设计 §七 `:102`;本批实现 `md_cg/autonomy_modes.py:69`) |
43
+ | **档位** | 当前生效档,由 env 键 `MDCG_AUTONOMY` 指定。真源与读取链(v1.1 统一——四个行号各司其职,回应读者反馈②):**键名字面量** `"MDCG_AUTONOMY"` 在 `autonomy_modes.py:66`(全仓唯一 `.py` 字面量落点)→ **缺省值** `"confirm"` 在 `:62`(`AUTONOMY_ENV_DEFAULTS` 表 `:61-63`——**改缺省只改这里**)→ **唯一解释函数** `mode()` `:128-140`(非法值 fail-closed)。`:69` 的 `AUTONOMY_MODES` 是**合法值枚举表**(plan/confirm/full),**不放缺省值** |
44
+ | **动作类 A–E** | A 新增 / B 合并 / C 改写 / D 删除 / E 权重与生命周期(设计 §一 `:38-48`;实现 `autonomy_modes.py:74-79`) |
45
+ | **变更单**(`kind="mutation"`) | 「需确认」动作的结构化单据:动作类 + 目标 + 后像(+ 理由/复现参数),复用**既有**审核队列,靠 rec 顶层类型字段 `kind` 与既有提案区分(设计 §四 `:77-80`) |
46
+ | **裁决执行桥** | `review_decide` 对变更单 `accept` 的执行路径(`mdcos._mutation_execute`,`:2482`):显式越过确认判定、直调库层原语 |
47
+ | **留池** | 「明确不修、记录在案、待后续批次或使用者裁定」的清单(各报告 §六 固定栏目) |
48
+ | **测试组 A–J**(≠ 动作类) | 守卫 `test_autonomy_modes.py` 的**断言组**:A 矩阵 / B 写链 C 改写 / C B 合并两落点 / D 删除 / E 幂等键 / F 存量兼容 / G 单点结构 / H 不动面对拍 / I gated 面 / J SHIM 修复面。**与动作类 A–E 同字母、完全不同的体系**——**B 组断言的是 C 改写、C 组断言的是 B 合并**。全文凡说「X 组」一律指断言组;首个使用处 §4.1 已加提示,组定义落点见 §4.1 末「守卫组成」 |
49
+ | **复现腿编号(两套、互不共享)** | §二 的 **腿①–⑧** = 批次② 的八条复现腿(腿① 装载面缺失 … 腿⑧ 档位零读取点,见 §二 各节标题);§8.8 的 **P1–P4** = 本批(补强批次)的四条复现腿(**P1** 容器栈一 SHIM-MISS / **P2** 发现 1 gated 面 C 旁路 / **P3** 发现 2 plan 档 A / **P4** 观察 3 执行桥 target_missing)。引用请带编号前缀(「§二腿①」「P1」),勿单写「腿①」 |
50
+
51
+ ---
52
+
53
+ ## 一、缺陷定义与真实站点
54
+
55
+ ### 1.1 缺陷定义(四件,同一根因:设计 §三 冻结的档位语义在代码里零落点)
56
+
57
+ 1. **装载面**:`md_cg/autonomy_modes.py` **不存在**——任何 `import md_cg.autonomy_modes` 立即 `ModuleNotFoundError`(腿① 实测两条载荷 rc=1)。全仓代码对 `MDCG_AUTONOMY` **零读取点**(HEAD 树 grep:唯一命中在设计稿正文 `:73`;`A_ADD`/`B_MERGE`/`D_DELETE` 零命中——见 1.2 末行)〔本报告实跑〕。
58
+ 2. **热路径 B/C/D 全部直执行**:C 改写(写链 `cg.add` 直接落盘)、B 合并(`remember_gated` 两个分支直调 `converge_into` / `reinforce`)、D 删除(MCP 工具面两通道直调 `cg.forget` → `publish` 软删)——全部**无档位判定、零变更单产物**(腿②–⑤)。
59
+ 3. **变更单面缺位**:`propose` 条目 rec 无 `kind` 类型字段;幂等键只有内容签名(`phash = _sig(content)`),**动作类与目标不参与幂等**;合成 mutation 键无处安放(只能落 `extra` 任意槽)(腿⑥)。
60
+ 4. **裁决面无分派**:`review_decide` 对 mutation 载荷静默按 proposal 处理——「一条声称删除的裁决把节点正文清空而非删除」(腿⑦);且**非法档位值不 fail-closed**:5 档(含 `bogus-garbage-value`)行为逐字段一致,非法配置静默等同缺省(腿⑧)。
61
+
62
+ 一句话:**对既有记忆的 B/C/D 变更在缺省(甚至计划)档下不经确认静默发生,且非法配置静默降级为放行**——与设计 §三「变更确认(默认档):B/C/D 需确认」「计划外零变更」两条硬语义直接冲突。
63
+
64
+ ### 1.2 真实站点(**改前树** = HEAD `d5a6a511`;行号为本报告 `git show HEAD:` 读码所见〔本报告实跑〕)
65
+
66
+ | 站点 | 内容 |
67
+ |---|---|
68
+ | `md_cg/autonomy_modes.py` | **文件不存在**(装载面;腿① 导入即抛) |
69
+ | `md_cg/writepipe.py:146-150` | 写链两段式执行器(`:150` `out = _executor(ctx)`);before 链(linkref/deps/audit/consistency/gated)**无档位闸** |
70
+ | `md_cg/writepipe.py:546` | 覆写读数(`_prior = _forgetting.prior_node(cg, ctx["nid"])`)——判定点只读,不改变落盘行为 |
71
+ | `md_cg/writepipe.py:552-574` | **缺陷主站点(C 改写)**:`cg.add(ctx["nid"], _content, …)` 直接落盘 |
72
+ | `md_cg/writepipe.py:579-582` | 覆写提示(`overwrite_of`/`overwrite_ratio`)——仅透出读数,不改 verdict、不改落盘 |
73
+ | `md_cg/mdcos.py:3686-3693` | **缺陷站点(B · 限流 CONVERGE)**:`:3690-3692` `writelimit.converge_into` 直调并入 |
74
+ | `md_cg/mdcos.py:3742-3753` | **缺陷站点(B · 遗忘 MERGE)**:`:3750-3752` `forgetting.reinforce` 直调强化 |
75
+ | `md_cg/mcp_server.py:2411-2412` | **缺陷站点(D · 通道一)**:`cg(op=forget)` → `cg.forget(...)` |
76
+ | `md_cg/mcp_server.py:3527-3528` | **缺陷站点(D · 通道二)**:`mdcg_forget` → `cg.forget(...)` |
77
+ | `md_cg/mdcos.py:2663-2690` | 库层 `forget`:`:2677` `guard_forget`、`:2683` `publish(src, dst)` 软删(无档位) |
78
+ | `md_cg/mdcos.py:2034` | 幂等键 `phash = _sig(content)`(内容签名;动作类/目标不参与对账) |
79
+ | `md_cg/mdcos.py:2066-2089` | queue rec 14 键字段集:`t/pid/id/content/layer/tags/condition_space/payload_hash/sensitivity/verify/verify_hash/extra/actor/session`——**无 `kind`** |
80
+ | `md_cg/mdcos.py:2487-2533` | decision 分支面:仅 accept/reject/edit/merge/noop 五值,全函数**无 kind/action 概念** |
81
+ | `md_cg/mdcos.py:2573-2574` | accept/edit 直接 `self.add(item["id"], content, …)`(裁决无动作分派) |
82
+
83
+ **字面量面(HEAD 树机械扫描,本报告实跑)**:`git grep -n MDCG_AUTONOMY HEAD` → 唯一命中设计稿 `:73`;`git grep -n autonomy_modes HEAD` → 唯一命中设计稿 `:188`;`A_ADD` / `B_MERGE` / `D_DELETE` → 零命中(rc=1)。工作区(含未追踪)现况:`MDCG_AUTONOMY` 5 命中 = 设计稿 `:73` + `autonomy_modes.py` `:5/:9/:28`(注释与 docstring)与 `:66`(**键名字面量**——全仓唯一 `.py` 字符串字面量落点,读取链见术语速览「档位」行)。**同名坑排除**:`md_cg/autonomy.py:2` 是「信息差驱动的自主探索闭环」(被 `mdcos.py` 的 `insight(act=explore)` 调用),与本批无关〔工作流采集〕。
84
+
85
+ ### 1.3 修后树坐标(读工作树所见〔本报告实跑〕;落点明细见 §3.2)
86
+
87
+ | 坐标 | 内容 |
88
+ |---|---|
89
+ | `md_cg/autonomy_modes.py:1-341` | **新模块(档位单一入口)**:env 缺省表 `:61-63`(值 `:62`)、env 键名表 `:65-67`(字面量 `:66`)、合法值枚举表 `:69`、动作类 `:74-79`、矩阵 `:92-99`、`mode()` `:128`、`decide()` `:144`、**变更单面五个符号** `:251` `order_kind` / `:261` `mutation_view` / `:283` `mutation_payload` / `:300` `mutation_dedup_key` / `:318` `propose_mutation`(v1.1 更正:原写「四件」而列五个行号,恰为五个符号) |
90
+ | `md_cg/writepipe.py:617-674` | `_gate_autonomy`(链尾注册 `:730`) |
91
+ | `md_cg/mdcos.py:2482-2565` | `_mutation_execute` 执行桥 |
92
+ | `md_cg/mdcos.py:2789-2820` | `_decide_mutation` 分派(挂钩 `:2653-2655`) |
93
+ | `md_cg/mdcos.py:2892-2926` | `forget_gated`(D 档位路径) |
94
+ | `md_cg/mdcos.py:3831-3881` | `_autonomy_gate_merge`(B 两落点共用单点) |
95
+ | `md_cg/mcp_server.py:2411-2415` / `:3574-3577` | 工具面两通道改接 `forget_gated` |
96
+
97
+ ---
98
+
99
+ ## 二、修前现场(本工作流采集的复现腿)
100
+
101
+ 以下八条腿均为**修复工作流采集**〔工作流采集〕,全部 `reproduced=true`;实验库一律 `tempfile.mkdtemp` 于系统临时目录的合成库,不触在役数据。
102
+
103
+ ### 腿① 装载面|档位唯一入口缺失(`autonomy_modes.py`)
104
+
105
+ - **payload**:`PYTHONPATH=仓根`、cwd=系统临时目录下跑 `python -c "import md_cg.autonomy_modes"` 与 `from md_cg.autonomy_modes import decide, A_ADD, B_MERGE, C_REWRITE, D_DELETE, E_WEIGHT`;另对全仓(`.py/.ts/.md/.json/.rs`)机械扫描 `MDCG_AUTONOMY` / `autonomy_modes` / `A_ADD` / `B_MERGE` / `D_DELETE` / `"mutation"`。
106
+ - **observed(异常/崩溃点)**:两条 import 载荷 **rc=1**,异常类型与消息均为 `ModuleNotFoundError: No module named 'md_cg.autonomy_modes'`;全仓 `MDCG_AUTONOMY` 仅 1 命中且在 `docs/plans/记忆自处理三档自治_设计_v0.2.md:73`(设计稿正文),**代码零读取点**;`autonomy_modes` 仅设计稿 `:188`;`A_ADD`/`B_MERGE`/`D_DELETE` 零命中;`"mutation"` 仅设计稿 `:80` + 两部英中词典条目(译「变种」);两文件 `md_cg/autonomy_modes.py` 与 `md_cg/test_autonomy_modes.py` 均不存在。
107
+ - **site**:`md_cg/autonomy_modes.py`(文件不存在,导入即抛)。
108
+
109
+ ### 腿② 热路径 C|`cg(op=write)` 对既有 node_id 覆写直接落盘(无出单、无档位判定)
110
+
111
+ - **payload**:合成库落盘 `c_ovr`(`content_kind=work_wip`)后同 id 覆写 `content:'改写后的正文B'`;再以 env `MDCG_AUTONOMY∈{未设, confirm, plan, full, bogus-garbage-value}` 五个独立子进程各复跑一遍同一载荷(各自新库)。
112
+ - **observed(异常:无——静默直落)**:覆写返回 `{ok:true, committed:true, moved_to:null, overwrite_of:'c_ovr', overwrite_ratio:0.1667}`,盘上 `c_ovr` 正文=`改写后的正文B`;`review_list()` 长度 0、`hippocampus/inbox.jsonl` 不存在(**零变更单产物**);trash 空。写链内判定点仅在落盘前产出提示读数(`out['overwrite_of']`),不改变落盘行为、不改变 verdict;**5 档(含非法值)逐字段对拍 diff 全空**——档位对热路径零影响。
113
+ - **site**:`md_cg/writepipe.py:552`(cg.add 直接落盘);判定点 `md_cg/writepipe.py:546`(prior_node 只读),提示 `md_cg/writepipe.py:581`。
114
+
115
+ ### 腿③ 热路径 B|`remember_gated` CONVERGE 分支(`writelimit.converge_into`)直执行
116
+
117
+ - **payload**:合成库两次 `cg.remember_gated('b001',…, layer='contextual', role='user')` → `('b002','批次248收官记忆',…)`。
118
+ - **observed(无异常)**:第二条返回 `{verdict:'MERGE', merged_into:'b001', gate:{verdict:'CONVERGE', limiter:'converge', …}, converged:{ok:true, merge_count:1, content_sink:{node_id:'b001', action:'appended', …}}}`——目标 `b001` 正文被直接追加聚合行(含「【聚合」)、`merge_count=1`;`review_list()` 长度 0,无任何变更单。
119
+ - **site**:`md_cg/mdcos.py:3690`(writelimit.converge_into 直调;MERGE 分支 `:3686-3692`)。
120
+
121
+ ### 腿④ 热路径 B|`remember_gated` MERGE 分支(`forgetting.reinforce`)直执行
122
+
123
+ - **payload**:215 字长文 base(避开 writelimit 模板签名)与其改一段的近重复版(bigram 重复度 0.915≥DUP_MERGE 0.85、未过保护线),`role='user'`,两次 `remember_gated`(m001/m002)。
124
+ - **observed(无异常)**:`forgetting.assess` 裁决 MERGE(reason=`'重复度 0.92≥0.85(并入 m001,强化既有)'`);`remember_gated` 返回 `{verdict:'MERGE', merged_into:'m001', reinforced:{node_id:'m001', merge_count:1, content_sink:{action:'appended', line:'- 【聚合 …】…'}}}`——reinforce 就地把既有节点改写;`review_list()` 长度 0。
125
+ - **site**:`md_cg/mdcos.py:3750`(`out['reinforced'] = forgetting.reinforce(…)`;分支判定 `:3742`)。
126
+
127
+ ### 腿⑤ 热路径 D|MCP 工具面 forget 直接软删(两通道)
128
+
129
+ - **payload**:合成库先落盘 `d_node`/`d_node2`(`work_wip`),再分别调 `mcp_server._cg_dispatch(cg,{op:'forget', node_id:'d_node', reason:'合成载荷:删除面复现'})` 与 `mcp_server.call_tool(cg,'mdcg_forget',{node_id:'d_node2', reason:同})`。
130
+ - **observed(无异常)**:两通道均直接执行:`op_forget→{ok:true,id:'d_node'}`、`mdcg_forget→{ok:true,id:'d_node2'}`;`trash/d_node.md` 与 `trash/d_node2.md` 出现(`trash_has_both=true`);`_deletions.jsonl` 2 行;两节点均已从索引摘除(`still_in_index=[false,false]`);`review_list()` 长度 0(无确认、无变更单)。
131
+ - **site**:`md_cg/mcp_server.py:2411` 与 `:3527`(→ `cg.forget`)→ `md_cg/mdcos.py:2683`(`publish(src,dst)` 软删;`forget` 定义 `:2663`)。
132
+
133
+ ### 腿⑥ 变更单面|propose 条目无 kind、幂等键只有内容签名
134
+
135
+ - **payload**:`cg.propose('q_a','同一条内容X')` 与 `cg.propose('q_b','同一条内容X')`;随后直读原始 inbox 记录、`review_list()`、`review_stats()`;另以 `**extra` 承载合成 mutation 键(kind/action/target)观察落点。
136
+ - **observed(无异常)**:rec 键集 = 14 个(无 `kind`);`review_list` 条目 17 键(多 status/round/issues)亦无 `kind`;`review_stats` 无 `kind` 维度。**幂等仅按内容**:不同目标(q_a vs q_b)同内容返回**同一 pid**(`payload_hash = sha1(内容)`,实测 == `mdcos._sig('同一条内容X')`)——动作类/目标不参与幂等;合成 mutation 键只能落 `extra`(无专用字段)。
137
+ - **site**:`md_cg/mdcos.py:2066`(rec 字段集)/ 幂等键 `md_cg/mdcos.py:2034`(`phash = _sig(content)`)。
138
+
139
+ ### 腿⑦ 裁决执行桥|review_decide 对 mutation 载荷静默按 proposal 处理(无动作分派、无 fail-closed)
140
+
141
+ - **payload**:合成载荷(按设计 §四 最小载荷:动作类+目标+后像;现状只能经 `propose(**extra)` 表达):① `kind=mutation,action=B_MERGE,target=md_tgt,后像='并入的新内容ZZZ'` → `review_decide(pid,'accept')`;② `action=C_REWRITE,后像='另一个后像内容'` → `review_decide(pid,'edit',edits={'content':'编辑后的内容YYY'})`;③ `action=D_DELETE,target=d_tgt,后像为空` → `review_decide(pid,'accept')`。
142
+ - **observed(三例均无异常、无 fail-closed、无 hint)**:① accept 返回 `{ok:true,node_id:'md_tgt'}`,目标正文被整段覆写为「并入的新内容ZZZ」、无「【聚合」行、`md_tgt` 未进 trash、`_deletions.jsonl` 无新行——accept 走的是 `self.add(item['id'], content, …)` 提案落盘,**未按 action 分派** `reinforce`/`converge_into` 原语;② edit 直接落盘「编辑后的内容YYY」;③ D 载荷 accept 后 `d_tgt` **仍存在且在索引**、不在 trash、deletions 无记录,其正文被清空为「\n」——**一条声称删除的裁决把节点正文清空而非删除**。
143
+ - **site**:`md_cg/mdcos.py:2573`(accept/edit 一律 `self.add(item['id'], …)`);decision 分支面 `:2487-2533`(只有 accept/reject/edit/merge/noop 五值,全函数无 kind/action 概念)。
144
+
145
+ ### 腿⑧ 档位零读取点|5 档(含非法值)行为逐字段一致
146
+
147
+ - **payload**:同一组热路径动作(C 覆写 / B×2 / D×2 / propose / 裁决)在 env `MDCG_AUTONOMY∈{未设, confirm, plan, full, bogus-garbage-value}` 五个独立子进程、各自新库上各跑一遍,按 9 组指纹逐字段对拍。**(v1.2 报告轮注:「9 组指纹」的逐组清单未随采集材料传入——本报告**不代补、不代猜**;可确证的机械事实 = 该腿覆盖的动作面为 C 覆写 / B×2 / D×2 / propose / 裁决共 7 个动作载荷,指纹组数(9)与其构成见下 observed——两者口径不同,此处如实并列而不强行配平。)**
148
+ - **observed**:`identical_to_unset={confirm:true, plan:true, full:true, bogus:true}`,diffs 全空——**含缺省 confirm 与非法值均不改变任何热路径行为**;非法值不 fail-closed、不报错、不列合法值(对照设计 §三 要求:缺省 confirm、非法 env fail-closed 报错并 hint 列合法值——现状全无)。
149
+ - **site**:无读取点(对照面 = `md_cg/autonomy_modes.py` 不存在;全仓唯一 `MDCG_AUTONOMY` 字面量在设计稿 `:73`)。
150
+
151
+ ---
152
+
153
+ ## 三、修法契约与落点
154
+
155
+ ### 3.1 契约(设计 v0.2 §三/§四,逐条)
156
+
157
+ 1. **单一入口**(§三 硬约束①,设计稿 `:73`):档位是**一个** env 键(`MDCG_AUTONOMY=plan|confirm|full`,缺省 `confirm`),由**一处**判据函数读取与解释;不得各模块各读一份。落法:`autonomy_modes.py` 为全仓唯一 `.py` 字面量落点(键名 `:66`)与唯一读取出口(`autonomy_env() :120` / `mode() :128`);**改缺省只改 `AUTONOMY_ENV_DEFAULTS` 表(`:61-63`,值在 `:62`)**——`:69` 的 `AUTONOMY_MODES` 只枚举合法值、`:65-67` 只管键名(三者分工见术语速览「档位」行)。
158
+ 2. **纯加严**(§三 硬约束②):任一档都不得放宽既有判据——档位判定一律在**既有资格闸通过之后**:写链在 audit/consistency/gated 之后、链尾执行器之前(`:617-652` 注释与 `:726-730` 注册);删除在 `protect.guard_forget` 等资格闸之后(`forget_gated :2892-2905`);B 合并在限流闸/遗忘三问**裁决之后**(`_autonomy_gate_merge :3831-3852`)。另:写面资格闸(层闸/写保护/降级闸)住在 `cg.add` 内部,故档位判定前新增 `write_qualify` 资格探针(`mdcos.py:3884-3920`,`override=False` 只判不写快照)。**该探针的覆盖口径(v1.1 补——回应「这两句各覆盖哪些闸类」)**:探针调用的闸 = `guard_overwrite`(→`is_immutable`:层保护 self/anchor、`immutable` 标记 + principal 层白名单;`protect.py:269-281`、`:361-379`)与 `guard_move`(→`is_protected`:**仅跨层**时触发;`:297-304`);**不覆盖**「`protected` 位/分数」形态的**同层**覆写(`is_immutable` 本就不认位/分——`protect.py:180-198`)——即「本该 AccessDenied/ProtectionError 的覆写不得变成静默入队」在此覆盖面上成立;位/分形态同层覆写会出单且 accept 落盘(实测,见 §6.1 第 8 条),按既有教义不属「本该被拦」。
159
+ 3. **计划外零变更**(§三 硬约束③):计划模式下未命中计划步骤的动作 = `forbid`(fail-closed 带 hint),不静默跳过。**适用范围按设计 §三 表逐格**(设计稿 `:63-69`,本报告读码):「须命中计划步骤」格只有 A/B/E 三个——`plan` 档下无计划输入(`plan=None`)时它们一律 forbid(带「计划输入面待后续批次」hint);**C/D 两格在 plan 档的定值是「需确认」(与 confirm 档同格),不使用、也不依赖计划输入**——硬约束③的 fail-closed 不作用于 C/D 是矩阵(设计真源)的逐格定值,不是豁免(实现 `MATRIX :92-99` 逐格照抄,守卫 A 组逐格断言;v1.1 改写:原「矩阵如此」表述易被读作拿被质疑对象自证,此处给出契约出处与适用范围的精确划分)。
160
+ 4. **裁决矩阵**(§三,3 档 × 5 类逐格照抄,`MATRIX :92-99`):plan 档 A/B/E=`plan_step`(命中计划才 allow,否则 forbid)、C/D=confirm;confirm 档 A/E=allow、B/C/D=confirm;full 档全 allow。
161
+ 5. **变更单**(§四,`kind="mutation"`):复用既有审核队列(**不新建第二套**)——类型字段落 rec 顶层(`kind` 只在显式给定时落键;缺键 = proposal,存量零迁移);业务载荷(动作类/目标/后像/理由/复现 meta)落 `extra.mutation`(沿用 `extra.defer_reason` 先例);幂等键 = 动作类 ⊕ 目标 ⊕ 后像 的 sha1(`mutation_dedup_key :300`),**显式覆盖** `payload_hash`(内容签名不带目标会撞键)。构造/出单唯一入口 = `propose_mutation :318`(复用既有入队单点 `cg.propose`)。
162
+ 6. **裁决执行桥**(§四):变更单 `accept` = 执行对应动作(B 走 `reinforce`/`converge_into` 原语、C 走既有 `add` 覆写、D 走既有 `forget` 软删);`reject` = 原样留痕不执行;**其余裁决(edit/merge/noop)对变更单未定义 ⇒ fail-closed** 报 `mutation_decision_unsupported` 带 hint(不静默当已处理)。执行失败 ⇒ **不记裁决**、提案保持 pending(不许「落一条 accepted 而动作没做」)。
163
+ 7. **库层不接线**(§三 硬约束②的机制前提):`MdCG.add` / `_write_node` / `MdCGOS.forget` 与合并原语(`forgetting.reinforce` / `writelimit.converge_into`)保持无档位判据——「已确认」由调用点保证,不靠可伪造的旗标穿透各层;保护闸不绕(`add`/`reinforce`/`converge_into` 内部 `protect.guard_*` 仍是落盘必经之路)。
164
+
165
+ ### 3.2 落点(改后行号 = 读工作树所见〔本报告实跑〕)
166
+
167
+ | 文件:行号 | 改动 |
168
+ |---|---|
169
+ | `md_cg/autonomy_modes.py:1-341` | **新模块**:env 缺省表 `:61-63`(值 `:62`;「改缺省只改这里」)+ env 键名表 `:65-67`(全仓唯一 `.py` 字面量 `:66`)+ 合法值枚举表 `:69`、动作类 `:74-79`、矩阵 `:92-99`、`AutonomyModeError :115`、`autonomy_env :120`、`mode :128`(非法值 fail-closed 抛错带 hint 列 `plan|confirm|full`,不静默降级)、`decide :144`(→allow/confirm/forbid+hint)、变更单五个符号:`order_kind :251`、`mutation_view :261`、`mutation_payload :283`、`mutation_dedup_key :300`、`propose_mutation :318` |
170
+ | `md_cg/writepipe.py:405-410` | `_gate_gated` 新增 `CONFIRM` 分支:透出 `moved_to=review_queue`+`mutation`+`autonomy`(DROP/DEFER 两态字面量分支一字未动) |
171
+ | `md_cg/writepipe.py:609-613` | `_AUTONOMY_META_KEYS`:写链 payload 白名单(裁决 accept 时按此重放 `cg.add`,保两条路径 fm 等价) |
172
+ | `md_cg/writepipe.py:617-674` | `_gate_autonomy`:档位闸本体(`prior_node` 判 C/A `:641-642`、`write_qualify` 资格在先 `:647`、`decide :650`、ALLOW `:651-652`、FORBID `:656-660`、CONFIRM 出单 `:661-674`) |
173
+ | `md_cg/writepipe.py:726-730` | 注册到 before 链**末位**(`register_before("autonomy", _gate_autonomy)`;audit/consistency/gated 之后、链尾执行器之前);模块头链序注释 `:23` 同步 |
174
+ | `md_cg/mdcos.py:2018/2032-2042/2047/2093-2094` | `propose` 新增两个**可选**槽 `kind`/`dedup_key`:`kind` 只在显式给定时落 rec 顶层(缺省不落键 = 存量与新普通提案 rec 形状逐位不变);`dedup_key` 非空时顶替 `payload_hash` |
175
+ | `md_cg/mdcos.py:2482-2565` | `_mutation_execute` 执行桥(B/C/D 分派、unknown 动作 fail-closed、异常/失败一律不落裁决、提案保持 pending) |
176
+ | `md_cg/mdcos.py:2649-2655` | `review_decide` 挂钩:变更单在既有前置闸(已判/verify_readonly/再审批/红队门控)**之后**、既有 accept/edit/merge/noop 链**之前**走 `_decide_mutation` |
177
+ | `md_cg/mdcos.py:2759-2786` | `_finish_decision` 收尾单点(`_record_decision`+`_cascade_dedup`+`flush`;proposal 链与变更单共用同一收尾) |
178
+ | `md_cg/mdcos.py:2789-2820` | `_decide_mutation` 分派(accept=执行/reject=留痕/其余 fail-closed) |
179
+ | `md_cg/mdcos.py:2829-2865` | `_forget_qualify` 资格前置闸单点(索引代际感知 → not_found → `protect.guard_forget`) |
180
+ | `md_cg/mdcos.py:2868-2889` | `_forget_apply` 软删体单点(`publish` 进 trash+deletions 清单+`_unstage`+缓存失效+audit;与改动前 `forget` 体逐位一致) |
181
+ | `md_cg/mdcos.py:2892-2926` | `forget_gated` 档位路径:资格闸 → `decide(D)` → ALLOW 软删 / CONFIRM 出单且不软删(`deleted=False`)/ FORBID fail-closed;**库层 `forget` 语义不变**(脚本通道不接) |
182
+ | `md_cg/mdcos.py:3831-3881` | `_autonomy_gate_merge`:B 合并**两落点共用**档位单点(`write_qualify :3848` → `decide(B) :3850` → ALLOW 放行/`FORBID :3855`/CONFIRM 出单 `:3867-3881`;响应形态对齐原 MERGE 出口,带 `gate`/`merged_into` 两键) |
183
+ | `md_cg/mdcos.py:3884-3920` | `write_qualify` 资格探针(新增):`guard_overwrite`+`guard_move`(`override=False` 只判不写快照);ghost 节点返回 None |
184
+ | `md_cg/mdcos.py:4009-4019 / :4082-4093` | `remember_gated` 两处调用点:CONVERGE 在 `converge_into` 之前、MERGE 在 `reinforce` 之前接档位判定(判定在各自治裁决之后) |
185
+ | `md_cg/mdcos.py:5010-5028` | **实修缺陷**:`MdCGSecure` 的 can_admin 闸抽成单点 `_forget_admin`,`forget`(`:5021-5023`)与 `forget_gated`(`:5026-5028`)都过它(详见 §3.3) |
186
+ | `md_cg/mcp_server.py:2074 / :2411-2415` | `cg(op=forget)` 删除分支 → `cg.forget_gated`(restore 分支不变);函数级生效条件注同步 |
187
+ | `md_cg/mcp_server.py:3293 / :3574-3577` | `mdcg_forget` → `cg.forget_gated`;生效条件注同步 |
188
+ | `md_cg/mcp_server.py:3360-3404` | `mdcg_remember` **非 gated 直写分支**:同 id 已存在 ⇒ C 改写 / 不存在 ⇒ A 新增(判据复用 `forgetting.prior_node :3356`),先 `write_qualify :3370` 再按档位判定,确认档出单且不落盘(`cg.add` 在 `:3405`)——契约偏离处,见 §3.4 |
189
+ | `md_cg/review_cli.py:122-140 / :155` + `scripts/review_cli.py:102-118 / :133` | 显示面双副本同步 `_kind_label`:list 输出新增「变更单(动作名→目标)」标注,缺 `kind` 仍显示「提案」(零迁移) |
190
+ | `md_cg/test_writepipe.py:138-143` | 默认链组成断言补 `autonomy`(断言意图不变:默认链注册表与执行序;writepipe 是设计内插拔点,链长必然增长) |
191
+ | 13 个既有测试**夹具隔离** | 逐条登记(**括号内 = 夹具插入段在新文件中的起始行号,不是数量**——`git diff -U0` hunk 头 `@@ -X,0 +N,K @@` 的 N,本报告实跑逐点核对全部吻合;插入行数 K:`test_p2_mcp` 为 8、其余 12 个各 7):`test_b1_auto_id_multiproc(54)` / `test_b1b2_write_face(44)` / `test_b3_merge_keeps_content(76)` / `test_i50b_defer_to_review_queue(71)` / `test_i50d_importance_source(79)` / `test_i50e_readside_protection(89)` / `test_linkref(20)` / `test_n214_n215_n221_n222_write_face_gates(101)` / `test_p2_mcp(15)` / `test_p9_forget_protect(22)` / `test_p9c_dedup_hints(47)` / `test_protocol(29)` / `test_writelimit(25)`——均插入同一段显式置 full 档(env 键名从真源表取 `autonomy_modes.AUTONOMY_ENV_KEYS['mode']`,不构成第二处字面量;夹具段内容样张 = `test_linkref.py` diff:4 行注释+1 行 import+1 行 env 置 full+1 行空行,`test_p2_mcp.py` 为 5 行注释+import+env+空行=8 行——本报告读码),**断言意图一字未改**〔工作流采集〕。全测试面 `git diff --numstat` 实测 12×7+8=92 行插入 / 0 删除,另 `test_writepipe.py` +5/−2〔本报告实跑〕——括号内行号与其它处的「N 通过」计数(如 `test_p9_forget_protect` 37 通过、`test_b3_merge_keeps_content` 31 通过)读法不同、互不冲突 |
192
+ | `md_cg/test_autonomy_modes.py:1-795` | **新守卫**(8 组 / 101 条断言 / `--mutate` 定点变异自证 10 处 / ANCHOR-MISS fail-closed exit 2),见 §四 |
193
+
194
+ ### 3.3 本批内自查实修缺陷(can_admin)
195
+
196
+ 档位路径(`forget_gated`)原设计为「资格闸 → 档位 → `_forget_apply`」,而 `MdCGSecure` 的 `can_admin` 要求原先**只写在 `forget` 里**——档位路径直调 `_forget_apply` 会把管理闸整个跳过。实测:`MDCG_CAN_ADMIN=0` 的身份经 `mdcg_forget` 能删掉节点(`test_p2_mcp` §9 抓到)〔工作流采集〕。修法:抽单点 `_forget_admin`(`mdcos.py:5010-5018`),`forget` 与 `forget_gated` 两入口同序同错型都过它。守卫 D 组两条 + 变异⑩(红项=2)钉死。**本项为实施段自查修复、复核段独立复核确认**,不是设计稿内的工作项。
197
+
198
+ ### 3.4 契约偏离(1 处,如实登记)
199
+
200
+ 契约把 C 只点名写链(`cg(op=write)` 覆写);实现**另把 `mdcg_remember` 非 gated 直写面一并接线**(`mcp_server.py:3360-3404`,采集材料站点提示列了 `:3357`)——不接则该工具可整体绕过档位面;同时新增 `write_qualify` 探针以满足「判定必须在既有资格闸通过之后」的硬约束(层闸/保护闸在 `cg.add` 内部)。其余契约条款逐条照做。
201
+
202
+ ---
203
+
204
+ ## 四、验证数字
205
+
206
+ ### 4.1 守卫(**本报告实跑**)
207
+
208
+ | 检查 | 命令 | 结果 |
209
+ |---|---|---|
210
+ | 正向 | `python -X utf8 -m md_cg.test_autonomy_modes` | **退出码 0**;首行「锚点自检:PASS(test_autonomy_modes.py;不以 git HEAD 为基线源)」;**101 通过 / 0 失败**;逐组计数(按实跑输出行数):A 39 / B 10 / C 12 / D 10 / E 4 / F 4 / G 10 / H 12 = 101 |
211
+ | 变异自证 | `python -X utf8 -m md_cg.test_autonomy_modes --mutate` | **退出码 0**;未变异基线:红项=0;10 处逐处「命中预期」;总结「定点变异自证:PASS(每处判据都有变异钉死,且红项数逐处吻合)」 |
212
+
213
+ **字母体系提示(v1.2 报告轮增,回应本轮读者反馈「两套字母重叠」)**:下表「红项构成」里的 **A 组 / B 组 / C 组 … = 守卫断言组**(组定义见本节末「守卫组成」段),**不是动作类**——**B 组断言的是「写链 C 改写」、C 组断言的是「B 合并」**,同字母、不同体系;动作类 A–E(新增/合并/改写/删除/权重)见术语速览。读下表与 §八 时按「**组**」字识别断言组。
214
+
215
+ **逐处变异红项数(红项数与实测逐处吻合〔本报告实跑〕;构成类别〔工作流采集〕)**:
216
+
217
+ | # | 变异(注入形态) | 红项数 | 命中 | 红项构成(守卫 `_SRC_MUTATIONS` 注释 + 实跑输出) |
218
+ |---|---|---|---|---|
219
+ | ① | 档位不生效(`mode` 恒返回表内缺省) | 7 | ✓ | A 组非法值/归一 2+full 档直落 3+plan fail-closed 1+full 档零变更单 1 |
220
+ | ② | confirm 也直落(`decide` 把 confirm 格判成 allow) | 25 | ✓ | **A 6+B 5+C 10+D 4=25(穷尽清单见下方明细块)**;v1.1 更正:原采集表述含「E 组」,驱动实跑**不含** E 组项——以实跑为准 |
221
+ | ③ | 矩阵整表坍缩成 full(档位不生效·真源版) | 31 | ✓ | **A 11+B 6+C 10+D 4=31(穷尽清单见下方明细块)**;v1.1 更正:原采集表述作「A 组 15 格…」,与实跑构成不符——以实跑为准 |
222
+ | ④ | 写链档位闸不生效(`_gate_autonomy` 恒放行) | 6 | ✓ | B 组 C 改写 5(出单/未改写/载荷/队列/accept)+plan 档 A 1 |
223
+ | ⑤ | 合并档位闸不生效(`_autonomy_gate_merge` 恒放行) | 10 | ✓ | C 组 MERGE 4+CONVERGE 3+H 组 full 对拍 1+F/E 相关 2 |
224
+ | ⑥ | 删除档位闸不生效(`forget_gated` 直调软删) | 4 | ✓ | D 组出单/在位/载荷/accept 四条 |
225
+ | ⑦ | accept 不执行(执行桥空转) | 5 | ✓ | B/C/C-CONVERGE/D 四条「accept 执行」+B 组「改写只发生一次」 |
226
+ | ⑧ | 幂等键丢掉目标(内容签名回归) | 3 | ✓ | E 组三条幂等判据 |
227
+ | ⑨ | kind 不落 rec(变更单退化成提案) | 6 | ✓ | B 组队列 kind 1+C 组 3+D 组 accept 1+E 组队列计数 1 |
228
+ | ⑩ | 档位路径绕过 can_admin 闸(实修缺陷原形态) | 2 | ✓ | D 组「无 can_admin 被拒」+G 组「管理闸单点」 |
229
+
230
+ **②③ 红项穷尽清单(v1.1 增补,回应读者反馈:两行原来加不出数字)**——来源为**临时驱动**(系统临时目录脚本,借守卫 `_patched`/`_run_groups` 打印每处变异全量 `_FAIL` 后自清沙箱;**本报告实跑**,与 `--mutate` 版逐处一致):
231
+
232
+ - **②「confirm 也直落」= A 6+B 5+C 10+D 4 = 25(穷尽)**:
233
+ - A(6):plan×C、plan×D、confirm×B、confirm×C、confirm×D(五格 confirm 判据)+「confirm 判定带可读 hint」;
234
+ - B(5):C 改写出变更单且不落盘、出单时正文未被改写、载荷齐备、队列 `kind=mutation`、accept 返回 ok;
235
+ - C(10):遗忘闸 MERGE 出单且不合并、出单时未合并、载荷、accept 返回 ok、reject 不执行、edit fail-closed、仍在 pending、CONVERGE 出单、CONVERGE 未并入、accept 执行 CONVERGE;
236
+ - D(4):删除出单且不软删、出单后原样在位、载荷、accept 执行软删。
237
+ - **③「矩阵坍缩成 full」= A 11+B 6+C 10+D 4 = 31(穷尽)**:
238
+ - A(11):plan×A/B/C/D/E 五格+confirm×B/C/D 三格+confirm hint+「plan 档未命中计划步骤→forbid」+「plan 档无计划→forbid」;
239
+ - B(6):C 改写/未改写/载荷/队列/accept 返回 ok 五项+「plan 档 A 新增 fail-closed」;
240
+ - C(10)、D(4):同 ② 的 C 组与 D 组。
241
+
242
+ **守卫组成(读码核实〔本报告实跑〕)**:8 组 `_GROUPS :573`(A 矩阵逐格/缺省/非法 env/plan 面无计划、B 写链 C 改写、C B 合并两落点、D 删除+资格闸+库层不接线+can_admin、E 幂等键、F 存量无 kind、G 单点结构,H 不动面对拍);变异表 `_SRC_MUTATIONS :589-650`(10 项,每项 = (说明, 目标, 锚点原文, 替换文, **预期红项数**));锚点漂移即 ANCHOR-MISS、fail-closed exit 2(`:23-26` 模块 docstring);沙箱硬约束:一切读写 `tempfile.mkdtemp` 内(含 `MDCG_AUX_ROOT`/主密钥,`:48-53`),跑完 rmtree,**绝不碰在役数据根**;`sys.exit(rc) :795`。**不动面基线不绑 git HEAD**——「基线绑提交那一刻即失效(本仓**批次 80/81 两次教训**)」为本仓既有判词,出处 `md_cg/test_n225_nonobject_load.py:81`(同语另见 `test_i50a_half_dup_defer.py:41`、`test_i50b_defer_to_review_queue.py:54` 等;本报告读码)——故 `H` 组以「full 档构造性等价+confirm 档 A/E 与 full 逐位相等」对**当前盘实现**自证。
243
+
244
+ **独立复核的独立跑与删断言探针**〔复核材料〕(**v1.2 报告轮更正标签**:原文误标〔工作流采集〕——按报头定义与 §8.9,该段是**复核段**产出):复核独立跑守卫(退出码 0,8 组 101 通过/0 失败,**批次②版守卫**——现版 10 组 126 见 §8.3)与 `--mutate`(退出码 0,未变异基线红 0,10 处 7/25/31/6/10/4/5/3/6/2 逐处「命中预期」);删断言探针(临时驱动**内存**改 `_GROUPS` 后调 `main()`,零文件改动):对照不删→PASS/0 处不符;删 g_b→退出码 1、**6 处不符**(其中「写链档位闸不生效」红项 **6→0**);删 g_h→退出码 1、**唯一不符项=「档位不生效」**——红项数判据有判别力。ANCHOR-MISS 实测:in-process 注入漂移锚点 → exit 2(fail-closed)。
245
+
246
+ **「N 条」的计数口径(v1.2 报告轮增,回应本轮读者反馈「与逐组计数对不上」)**:原文括号里的「写链 C 改写 **5** 条」「不动面对拍 **6** 条」**不是该组断言总数**(B 组 10 / H 组 12,见上表「逐组计数」),而是**该组作为红项来源、在某处变异下贡献的红项数**:5 = B 组贡献给变异② 的红项数(即 ② 行的 B 构成);6 = H 组贡献给变异① 的红项数。两者**不同口径、并不相抵**。**本报告实跑复核**(在**现版 10 组**守卫上;g_b/g_h 两组自身在补强批次未变动,故仍可对读;各变体独立子进程、内存改 `_GROUPS`、零文件改动、跑后清沙箱):删 g_b → 6 处红项数不符,② 39→**34**(恰减 5)、④ 6→**0**、① 9→7、③ 46→40、⑦ 9→7、⑨ 10→9;删 g_h → **唯一**不符项 = ① 9→**6**(恰减 6)——**与批次② 记录的结构逐项同形**(删 g_b 六处不符且 ④→0;删 g_h 唯一不符且只动 ①),两数由此获独立佐证。
247
+
248
+ ### 4.2 定向套件 / 全量 / 容器(转录,非本报告实跑)
249
+
250
+ | 检查 | 数字 | 级别 |
251
+ |---|---|---|
252
+ | 定向套件 `python -X utf8 scripts/run_tests.py md_cg` | SUMMARY 228/228 通过、3 跳过(依赖缺失/平台不符)、**exit 0**(含新守卫 PASS、含全部 13 个夹具隔离文件与 writepipe 链断言更新) | 〔工作流采集〕 |
253
+ | **python 全量** | **exit 0**;输出摘要含 `PASS md_cg.test_time_core_lint` 与 `===== SUMMARY 305/305 通过,5 跳过(依赖缺失/平台不符) =====` | 〔复核材料〕 |
254
+ | **容器栈一** | **退出码 1**;输出摘要:`结果: 22 pass / 0 fail` | `[PASS] smoke_test (linux)` | `=== 汇总: 37 pass / 1 fail ===`(**v1.2:该唯一失败项已定位并消除**——`test_policy_required_ccg --head-baseline` 的 SHIM-MISS;改后读数 `38 pass / 0 fail`、退出码 0 见 §8.10) | 〔复核材料〕 |
255
+ | **容器栈二** | **退出码 0**;输出摘要:`# cancelled 0` | `# skipped 3` | `# todo 0` | `# duration_ms 11449.917389` | 〔复核材料〕 |
256
+
257
+ **容器双栈口径(v1.1 增,回应读者反馈「两栈没有定义」)**:本仓发版门禁的双栈**既定命令**(`README.md:581-590`,本报告读码):
258
+
259
+ - **栈一** = `docker run --rm -v "$(pwd):/work" -w /work -e CARGO_TARGET_DIR=/tmp/target rust:bookworm bash scripts/linux_verify.sh full`——镜像 `rust:bookworm`、容器内工作目录 `/work`(挂载仓根);README 注释口径:rust + python 全量(cargo test / python 18 套含全部守卫 / smoke 端到端);
260
+ - **栈二** = `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"`——镜像 `node:22-bookworm`;发布件 TS 编译 + node test。
261
+
262
+ **采集材料未声明其所用命令是否即此——本报告只转录其输出摘要与退出码,不代指**(同 issue50-e 先例;执行目录/挂载由既定命令形态可知,但采集中实际如何执行未传)。
263
+
264
+ **如实说明**:① 上述四条命令的**命令原文与失败/跳过明细未随采集材料传入**(栈一汇总 37 pass / 1 fail 中的 **1 个失败项是什么、其失败面覆盖什么、是否与修复面相关,材料未载**——本报告不代补、不代裁;栈二摘要未见 `# pass`/`# fail` 计数行,「栈二过了」的可确证机械事实 = 退出码 0 且摘要无 fail/cancelled 非零项)。② 本报告环节未复跑定向套件/全量/容器(无容器环境;只写一个文件的硬边界),其数字不标〔本报告实跑〕。
265
+
266
+ ### 4.3 复核段对拍与退化路径读数〔复核材料〕
267
+
268
+ - **两树对拍**:A = 改动前实现(`git archive HEAD` 解出 zip);B = 工作区现行树副本(sha256 前 16 位与工作区一致:mdcos `261a2ec9a90734f7` / writepipe `ac8d66d810068745` / mcp_server `99fefdc9d869f89e`)。逐位对拍(剔时钟面键与时间派生 pid/record_hash):`MDCG_AUTONOMY=full` 下 add_new / add_over / merge_forget / converge_wl / forget_mcp / forget_lib / gated_new / gated_over / mdcg_remember_over / plain_propose / cli_list **全部逐位相等**;缺省 confirm 下 add_new / gated_new / forget_lib 逐位相等,B/C/D 出单且不落盘(accept 执行、reject 不执行)。
269
+ - **修前各腿输入在现行树**:20 个场景全退出码 0 无异常,每场以「库根 `.md` 独立扫描 vs 索引节点集」可判定比较,全部一致=true。**(v1.2 报告轮注:这 20 场的逐场清单未随复核材料传入——不代补;且与上一行**不同口径**:上一行可数出的 11 个(add_new / add_over / merge_forget / converge_wl / forget_mcp / forget_lib / gated_new / gated_over / mdcg_remember_over / plain_propose / cli_list)是「两树对拍」列名的场景数,20 是「修前各腿输入在现行树」那一轮的场景总数,其构成未载。另:§二 的腿数是 8(批次② 复现腿),也与 20 不是同一计数对象。**)既有测试腿:`test_writelimit`(退出 0)/ `test_p9_forget_protect`(37 通过 0 失败)/ `test_b3_merge_keeps_content`(31 通过)。
270
+ - **退化路径确实发生**:未知动作类 Z 的单 accept→`ok=false/mutation_action_unknown`、单仍 pending、节点集未变;`order_kind(42)`/`order_kind(None)`→proposal、`mutation_view("x")`→None、`plan=垃圾(None/""/[]/0/object())` 全→forbid;`write_qualify("ghost")`→None 且不建文件。
271
+ - **不得静默的可观测面**:`MDCG_AUTONOMY=bogus`:`cg(op=forget)` 与 `cg(op=write)` 均抛 `AutonomyModeError`,消息含「允许值 plan|confirm|full(缺省 confirm)…不静默降级」,经 `mcp_server.py:4016-4025` 包装即为 `isError=true` 的 `AutonomyModeError: 非法档位…`;独立扫描节点集一致、无落盘。`review_decide(noop/edit)` 对变更单 → `{"ok":false,"error":"mutation_decision_unsupported","hint":…}`,decisions.jsonl 无记录、单仍 pending、节点未动。
272
+ - **显示面(端到端实跑,两副本)**:`python -m md_cg.review_cli list` 与 `python scripts/review_cli.py list` 均输出可辨行——`[prop_...] pending · 变更单(删除→ n1) · knowledge 层` 与 `· 提案 ·` 两种标注并存〔工作流采集〕;读码落点 `md_cg/review_cli.py:155` / `scripts/review_cli.py:133`(`_kind_label` 定义 `:123` / `:103`)。
273
+ - **既有测试改动面**:复核口径「`git diff` 显示仅 7 行夹具(env 置 full)+ `test_writepipe` 链名断言随链新增 `autonomy` 更新,无断言被削弱」〔复核材料〕——「仅 7 行」的**单位**经本报告 `git diff --numstat` 实测为**每文件** 7 行(`test_p2_mcp` 8 行)、测试面合计 92 行插入 / 0 删除(§3.2 夹具行同口径)。
274
+
275
+ ---
276
+
277
+ ## 五、独立复核判定与它列出的 uncovered
278
+
279
+ **判定:DEFER**(不 ACCEPT)〔复核材料〕。
280
+
281
+ **补强批次更新(v1.2,2026-10-02,本批实施段实跑)**:上列三条未收口(发现 1 / 发现 2 / 观察 3)**已全部收口**——① 发现 1:新增 gated 面档位判定单点`MdCGOS._autonomy_gate_rewrite` 并接进 `remember_gated` 的 ACCEPT 分支(confirm/plan 出单不落盘、full 放行、资格在先),失实的 docstring 一并订正;② 发现 2:同一单点的 A 新增分支在 plan 档fail-closed(confirm/full 零变化);③ 观察 3:执行桥 C 分支加存在性判据,目标消失即`target_missing`(不重建节点、不记 accepted)。逐条前后对拍读数见 **§8.2**,守卫数字见 **§8.3**;本节的判定与证据为**复核当时的记录**,保留不覆盖。
282
+
283
+ **报告轮补**:本节判定(DEFER)是**批次②**成果的复核记录;**本批补强成果自身的独立复核判定= ACCEPT**(§8.9:复核自写探针在合成库独立实跑四条腿正照 + 合法输入逐位对拍 + 不得静默可观测面 + 文档面订正),两者层级不同、不得混读。
284
+
285
+ **本节标注规则(v1.1 增)**:以下各条 = 复核自述(〔复核材料〕);其中带「〔本报告实跑读码补核〕」字样的括注是撰写员对**盘上源码**的独立核对——两者分列,可逐句分辨归属(回应读者反馈「转述与自核混用」)。
286
+
287
+ - **双树与边界**:实验库根全部 `tempfile.mkdtemp` 于系统临时目录;跑完已清理(含 83 个残留沙箱目录);工作区 `git status --short` 与开工时逐字一致(未增删改任何文件)。
288
+ - **守卫与变异独立跑**:退出码 0,8 组 101 通过/0 失败;`--mutate` 退出码 0,10 处红项数逐处吻合;删断言探针有判别力(见 §4.1 末段)。
289
+ - **不得静默的可观测面**:见 §4.3(AutonomyModeError 包装、`mutation_decision_unsupported`、显示面两副本可辨)。
290
+ - **对拍与退化路径**:见 §4.3(20 场景、11 场景逐位相等、退化路径全数发生)。
291
+ - **发现 1(确认档可被 `gated=true` 旁路:C 改写直接覆写、不出单)**〔复核材料〕:`probe.py B gated_over`(缺省档)→ `committed=True`、目标正文已被替换、`pending=[]`(无变更单);`probe.py B mdcg_remember_gated` → 同,`ok=True` 无 `moved_to`。`driver.py` 同两场 A vs B **逐位相等**(档位判定完全没走)。代码根据:`writepipe.py:359-360` `_gate_gated` 在 `gated` 时短路 `return`,链尾 `_gate_autonomy` 不执行;`inspect.getsource(MdCGOS.remember_gated)` 全文 255 行**无任何档位判据**(不含 `autonomy_modes`/`_am.`/`C_REWRITE`),ACCEPT 分支 `mdcos.py:4060` 直调 `self.add` ⇒ 同 id 覆写立即落盘;`mdcos.py` 全仓 `C_REWRITE` 仅出现在 `_mutation_execute:2529`。而 `writepipe._gate_autonomy` docstring(复核引 `:615-630`)声称「其覆写/合并分别由 `remember_gated` 的 C/B 判定覆盖」——**B 合并确被覆盖,C 覆写没有(失实陈述)**。设计 §一 C 行「同 id 覆写(`cg(op=write, node_id=…)`)=改写」、§三 缺省档 C=需确认;`docs/mdcg/README详细版_v0.4.10.md:436/438/687` 表明 `mdcg_remember(gated=true)` 正是插件自动记忆的主写入通道。
292
+
293
+ 〔本报告实跑读码补核〕(v1.1:消解「无任何」与「B 合并确被覆盖」的相抵读法、裁决 docstring 行号冲突):
294
+
295
+ - `remember_gated`(`def :3922`)按源码行区间实测 `:3922-4177`(256 行;复核记 255 行系 `inspect.getsource` 量法,差 1 行为量法差异):函数体**不含** `autonomy_modes` / `_am.` / `C_REWRITE` / `B_MERGE` / `A_ADD` 字样,**含** `_autonomy_gate_merge`(两处调用点 `:4009`、`:4082`)⇒ 复核句「无任何档位判据」的**精确口径 = C 覆写与 A 新增面**无档位判据;**B 合并 / 限流 CONVERGE 面已接**(其判定点即 `_autonomy_gate_merge`,见 §3.2)——两句并置不矛盾,原并列陈述易被读成相抵,此处更正;
296
+ - `mdcos.py:4060-4063` 确为 `self.add(node_id, content, layer=layer, override=override, …)`(ACCEPT 分支直调);
297
+ - docstring 引文两处**逐字相同**、**行号两处不同**(复核引 `:615-630`;本报告读为 `:632-634`,该句在 `def _gate_autonomy :617` 的 docstring 体 `:618-635` 的「不落盘的边界(如实)」段)。**裁决依据**:三文件 sha256 前 16 位与复核材料所列**逐位一致**(本报告实跑:writepipe `ac8d66d810068745` / mdcos `261a2ec9a90734f7` / mcp_server `99fefdc9d869f89e`)⇒ 复核与撰写员读的是**同一棵树**,行号差异属**引用口径**(非文件被改动);**全文行号以本报告读码为准**。
298
+ - **发现 2(plan 档经 `gated=true` 的 A 新增不被拦)**〔复核材料〕:`driver.py plan_new` A vs B(plan) 有差异(B 正确 fail-closed、未落盘);`plan_gated`(同输入加 `gated=true`)**逐位相等**,`probe.py B plan_gated` 显示 `committed=True`、节点已写入、`pending=[]`。与 §三 硬约束③「计划外零变更」不一致,且同批非 gated 路径会 forbid(守卫 B 组亦如此断言——**「同批非 gated 面会 forbid」一句的来源=实施段采集读数**〔工作流采集〕;本条其余为复核自述〔复核材料〕)。
299
+ - **观察 3(C 单目标在 accept 前消失时的 upsert)**〔复核材料〕:`_mutation_execute` 的 C 分支走 `self.add`(upsert)→ 静默落地为「新增」并记 `accepted`(`probe.py B mut_target_gone`:节点被重建、decisions 记 accepted);docstring 提到的 `target_missing` 只覆盖 B/D 原语(**该尾句的来源=实施段采集读数**〔工作流采集〕;本条其余为复核自述〔复核材料〕)。
300
+
301
+ **它列出的 uncovered(本报告口径说明)**:复核材料**未使用「uncovered」字样**;其列出并留在本批之外未收口的面 = **发现 1 / 发现 2 / 观察 3**(上列三条)。对应关系:发现 1 即实施段留池清单第 ⑥ 条(`gated=true` 覆写面不在本批 C 接线内)——复核为其补上了「docstring 失实陈述」与「插件主写入通道被旁路」两条加重证据;发现 2 与观察 3 **不在实施段留池清单内**,系复核新列——本报告如实并列于 §六。
302
+
303
+ ---
304
+
305
+ ## 六、边界与未覆盖(含本轮明确不修而留池的面)
306
+
307
+ ### 6.1 实施段留池(设计 §四/§九/§十三 后续批次;转录〔工作流采集〕)
308
+
309
+ 1. 前像/影响面/回滚命令/`_protected_history` 通用化未做(③批次);
310
+ 2. R1–R4 准入读数与窗口未做(设计 §七);
311
+ 3. §九 变更单台账(生成/裁定/驳回/回滚四计数)未做——仅 `review_stats` 经 kind 无关口径可见;
312
+ 4. 计划输入面未落(plan 档 A/B/E 现恒 forbid);
313
+ 5. 脚本通道(`scripts/dsh_log_index.py` 等直调 `MdCGOS.forget`)不接档位;
314
+ 6. `gated=true` 且带既有 node_id 的 ACCEPT 覆写(`remember_gated` 自身覆写面)不在本批 C 接线内; **〔补强批次更新(v1.2):本项已销项——本批已接入,见 §八 §8.1/§8.2〕**
315
+ 7. 变更单载荷未含前像;**回滚能力精确口径(v1.1 补,读码)**:D 走 `trash/`+删除清单、可 `restore`(`_forget_apply :2868-2889`、`restore :2937`);受保护节点经 override 路径的覆写/删除会由 `protect.snapshot` 落 `_protected_history/<id>/<ts>.md` 快照(`protect.py:215-245`,由 `_allow :262-265` 触发);**普通(非受保护)节点的 C 覆写与 B 合并没有前像**——设计 §四 要求的前像/回滚命令通用化即留池①(设计稿 `:81-86`「把这一对从『仅受保护节点』推广为『一切 C/D/B 动作』」),本批未做。
316
+ 8. 「受保护节点在确认档下报错时机从请求时移到 accept 时(防护不弱:accept 仍被 `guard_*` 拦、提案留 pending)」——**采集材料原文照录**。v1.1 用合成库探针实测补充(**本报告实跑**,缺省 confirm 档、`tempfile.mkdtemp` 合成库):① 层保护(self 层)覆写、受保护形态**跨层**覆写(knowledge→contextual)、self 层删除 ⇒ **请求时点即被 `write_qualify`/`_forget_qualify` 拦**(`ProtectionError` 三例、`PENDING 0`、零出单);② 位/分形态(`protected` 位或 `importance≥0.7`)的**同层**覆写 ⇒ `is_immutable=(False,'')`、`write_qualify→None`、**请求时点出单**,accept 时**执行成功**(`executed: true`、正文被覆写)。⇒ ⑧ 的两个半句(「出单」与「accept 仍被拦」)在本轮实测的形态样本上**不能同时成立**:能出单的形态 accept 不拦;会拦的形态请求时点即拦、出不了单。机制根据(读码):`is_immutable` 只认层保护(`PROTECTED_LAYERS`=self/anchor)与 `immutable` 标记、**不认 `protected` 位与分数**(`protect.py:180-198`;`guard_write` docstring `:273`「importance≥0.7 只保证『不可遗忘』,不阻断系统自身的幂等更新」);`guard_move`/`guard_forget` 走 `is_protected` 口径(认位/分;但 `guard_move` 仅在跨层时触发)。⑧ 的**指涉形态/闸类材料未点名**——如实并列、不代裁其余可能面(如「出单后保护状态被外部升级、accept 时才拦」的时序场景本轮未测)。
317
+
318
+ 另:**契约偏离 1 处**(`mdcg_remember` 非 gated 直写面另行接线+`write_qualify` 探针),见 §3.4——已在实施记录中明说。
319
+
320
+ ### 6.2 复核列出的未收口面(含实施留池未含的新项)
321
+
322
+ **补强批次更新(v1.2,2026-10-02,本批实施段实跑)**:本节三条**本批已收口**(下条目的原文保留不覆盖,只在此并列新状态):① **发现 1** —— gated 面 C 覆写已接入档位判定(出单不落盘 / full 放行 / 资格在先),`writepipe.py:632-642`(v1.2 报告轮读码;采集引 `:632-645`)的失实 docstring 已订正并附「订正记录」块(§8.5);② **发现 2** —— gated 面 A 新增在 plan 档 fail-closed、confirm/full 零变化;③ **观察 3** —— 执行桥 C 目标消失改 `target_missing` fail-closed(不重建节点、不记 accepted)。三条的定点变异(⑪/⑫/⑬)与前后对拍见 §8.2/§8.3。
323
+
324
+ 1. **确认档可被 `gated=true` 旁路(发现 1)**:对应留池 ⑥;复核证据(`writepipe.py:359-360` 短路、`remember_gated` 的 C/A 面无档位判据、`mdcos.py:4060` 直调 `self.add`、docstring 失实)已列 §五。**本批不修**(接线面超出本批 C 契约;该面为插件自动记忆主通道,接线需单独设计确认单形态)。**失实 docstring 的修正亦未做**——`writepipe.py:632-634` 现仍为原文(本报告读码;`def _gate_autonomy :617` 的 docstring 全文含该句),修正归实施方/后续批次(本报告轮次硬边界:不得动源码)。
325
+ 2. **plan 档经 `gated=true` 的 A 新增不被拦(发现 2)**:**实施留池清单未含此项**——复核新列;与硬约束③直接冲突,待后续批次。
326
+ 3. **C 单目标 accept 前消失 → upsert 静默转新增(观察 3)**:**实施留池清单未含此项**——复核新列;`target_missing` 只覆盖 B/D 原语。
327
+
328
+ ### 6.3 确认不动的面
329
+
330
+ - **库层语义不变**:`MdCG.add` / `_write_node` / `MdCGOS.forget` / `forgetting.reinforce` / `writelimit.converge_into` 不含档位判据(守卫 G 组 10 条钉死)——「直调库层不接线」是执行桥「越过确认判定」的机制前提;
331
+ - `_gate_gated` 的 DROP/DEFER 两态字面量分支一字未动(`:405` 新增 CONFIRM 分支之外零改动);
332
+ - 13 个既有测试仅夹具隔离(断言意图一字未改,见 §3.2 末段);
333
+ - 显示面缺 `kind` 存量条目一律按「提案」显示(零迁移)。
334
+
335
+ ### 6.4 材料缺项(如实,不代补)
336
+
337
+ - 容器栈一「汇总 37 pass / 1 fail」的**失败项明细**未随材料传入(不代补、不代裁其与修复面的关系); **〔补强批次更新(v1.2):已补齐——该失败项=`md_cg.test_policy_required_ccg --head-baseline`(SHIM-MISS),见 §8.1/§8.4;该腿本机改前退出码 1、改后退出码 0〕**
338
+ - 容器栈二摘要无 `# pass`/`# fail` 计数行——用例总数与通过数材料未携带;
339
+ - 定向套件/全量/容器两栈的**命令原文**未随材料传入(仅输出摘要与退出码);容器两栈的**既定命令**另见 §4.2「容器双栈口径」(`README.md:581-590` 读码),**采集所用命令是否即此未声明、不代指**。
340
+
341
+ ### 6.5 硬边界遵守
342
+
343
+ 本批只动 §3.2 所列文件(源码改动 + **2 个新增文件**——`md_cg/autonomy_modes.py`、`md_cg/test_autonomy_modes.py` + 13 个测试文件夹具隔离);**未** `git add`/`commit`/`push`,未触在役数据根。本报告撰写员只新增本文档一个文件:落盘前 `git status --porcelain` 实测 = 起始快照逐字一致(19 改 + 3 未跟踪,其中 `.zcode/` 为宿主目录、起点已在,**本批新增仅 2 个**;见文末)〔本报告实跑〕。全文无明文凭据。
344
+
345
+ ---
346
+
347
+ ## 七、修订记录与读者问答(**7.1–7.2 = v1.1 轮**;**7.3–7.4 = v1.2 报告轮**)
348
+
349
+ ### 7.1 修订处置(读者反馈 unclear 9 条 + unsupported 6 条,逐条)
350
+
351
+ | # | 反馈(类别) | 处置 | 落点 |
352
+ |---|---|---|---|
353
+ | 1 | 档位真源/唯一读取点行号四处不一致(unclear;与 #9 同题) | 统一为一条读取链:**键名 `:66` → 缺省值 `:62`(`AUTONOMY_ENV_DEFAULTS` 表 `:61-63`,「改缺省只改这里」)→ 唯一解释函数 `mode() :128`**;`:69` 仅枚举合法值、不放缺省值。四处表述逐一改写对齐 | 术语速览「档位」行、§1.2 末行、§1.3、§3.1 条 1、§3.2 |
354
+ | 2 | 「变更单四件」列五个行号(unclear) | 更正为「**变更单面五个符号**」并逐一命名(order_kind/mutation_view/mutation_payload/mutation_dedup_key/propose_mutation) | §1.3、§3.2 |
355
+ | 3 | 括号数字(`(54)`…`(25)`)无定义、疑与「37 通过」冲突(unclear) | 定义为「**夹具插入段在新文件中的起始行号**」(`git diff -U0` hunk 头 `@@ -X,0 +N,K @@` 的 N;13 处逐点核对全部吻合);补 `git diff --numstat` 实测(12×7+8=92 行插入 / 0 删除;`test_p2_mcp` 8 行、其余各 7 行);夹具段内容样张出处(`test_linkref.py`、`test_p2_mcp.py` diff 读码);并注明与「N 通过」计数读法不同、互不冲突 | §3.2 夹具行 |
356
+ | 4 | 「容器栈一/栈二」全文无定义(unclear) | 补「容器双栈口径」:`README.md:581-590` 的既定命令(镜像 `rust:bookworm`/`node:22-bookworm`、挂载 `/work`、各自覆盖)+「采集材料未声明所用命令是否即此、不代指」 | §4.2 |
357
+ | 5 | 第三种证据标签未定义;§五 转述与自核混用(unclear) | 标签统一为「**〔复核材料〕**」并在证据分级声明中定义;§五 加「标注规则」,自核句统一加「**〔本报告实跑读码补核〕**」前缀 | 声明、§五 |
358
+ | 6 | docstring 行号冲突(`:615-630` vs `:632-634`)未裁决(unclear) | 裁决:两引文**逐字相同**、三文件 **sha256 与复核材料逐位一致** ⇒ 同一棵树、差异属**引用口径**(非文件被改动);**全文行号以本报告读码为准** | §五 发现 1 补核条 |
359
+ | 7 | 「两次教训」无交代(unclear) | 补出处:`md_cg/test_n225_nonobject_load.py:81`「本仓**批次 80/81 两次教训**:基线绑提交那一刻即失效」(同语另见 `test_i50a_half_dup_defer.py:41`、`test_i50b_defer_to_review_queue.py:54`;本报告读码)——含义:变异/锚点基线若绑 git HEAD,提交后基线即与快照对照失效 | §4.1 守卫组成段 |
360
+ | 8 | ②③ 红项构成非穷尽、加不出数字(unclear) | 补**穷尽清单**(②=A6+B5+C10+D4=25;③=A11+B6+C10+D4=31),来源=临时驱动实跑(全量 `_FAIL` 打印,与 `--mutate` 逐项一致);并更正原采集表述(②无 E 组项、③非「15 格」构成) | §4.1 明细块 |
361
+ | 9 | 同 #1(unclear) | 同 #1 | 同 #1 |
362
+ | 10 | 标题/缺陷定义被正文限定掉(unsupported) | 报头加「**范围限定**」:覆盖面 = 写链 C / 两合并落点 B / 工具面 D;`gated=true` 的 C 覆写面与 A 新增面为已知旁路(§5 发现 1/2、§6.2) | 报头、§6.2 |
363
+ | 11 | 「无任何档位判据」与「B 合并确被覆盖」相抵(unsupported) | 收窄口径:该句精确含义 = **C 覆写与 A 新增面**无档位判据;**B 合并/限流 CONVERGE 面已接**(`_autonomy_gate_merge` 两调用点 `:4009`/`:4082`);行数 256 vs 255 为量法差异 | §五 发现 1 补核条 |
364
+ | 12 | 计划档「未命中即 forbid」与「C/D 同格」互斥(unsupported) | 改写:硬约束③的 fail-closed 只作用于「须命中计划步骤」三格(A/B/E);C/D 在 plan 档的定值本就是「需确认」(设计稿 §三 表 `:63-69`,契约出处)——不是豁免、也不是拿矩阵自证(旧句「矩阵如此」已改写) | §3.1 条 3 |
365
+ | 13 | 「13 文件各插一段」与「仅 7 行夹具」冲突(unsupported) | 以 numstat 实测改写:「仅 7 行」应读作**每文件** 7 行(`test_p2_mcp` 8 行);测试面合计 92 行插入 / 0 删除 | §3.2 夹具行 |
366
+ | 14 | 报错时机两句相反(unsupported) | 给出覆盖口径(§3.1 条 2:`guard_overwrite`/`guard_move` 各自判据与形态边界)+ §6.1 第 8 条用合成库探针**实测重构**(**两方向样本 = 该条的 ① 请求时点即拦〔`ProtectionError` 三例:self 层覆写 / 跨层覆写 / self 层删除〕与 ② 位·分形态同层覆写出单且 accept 执行成功**;⑧ 按「材料未点名」并列,不代裁)。**v1.2 报告轮更正**:原文此处写「探针 v1/v2/v3/v4」——全文无此标号、且 §6.1 第 8 条只有 ①② 两个编号(该字符串**更正前**全文仅此一处;更正后本文档的两处出现均为对原表述的引述) | §3.1 条 2、§6.1 第 8 条 |
367
+ | 15 | 「19 改 + 3 新增」计入 `.zcode/`(unsupported) | 报头改「**19 改 + 2 新增**」+括注 `.zcode/` 非本批产物;§6.5 同步 | 报头、§6.5 |
368
+
369
+ ### 7.2 读者问答(**v1.1 轮的** nextQuestions 9 条,逐条;**历史层**——现行状态以本段末「v1.2 更新」与 §八 为准)
370
+
371
+ 1. **复核判 DEFER 后,这批工作树下一步怎么办(继续修/提交/丢弃)?** ——材料未载,**不代裁**。可确证的机械事实:工作树保留、未 add/commit/push;复核判定 DEFER 已记录在案(本报告 §五)。处置归编排侧与使用者。
372
+ 2. **容器栈一「37 pass / 1 fail」的失败项是什么、是否与本批相关、由谁复跑?** ——材料未载(§4.2/§6.4 已如实标注):失败项明细、失败面覆盖、复跑方均无材料依据,**不代补**。
373
+ 3. **`gated=true` 是插件主写入通道,缺省 confirm 档在插件路径上实际生效了吗?步骤②验收怎么算?** ——**部分生效**:`remember_gated(gated=true)` 的 **B 合并 / 限流 CONVERGE 面已接**(`_autonomy_gate_merge` 两调用点 `:4009`/`:4082`,本报告读码);**C 覆写面与 A 新增面未接**(发现 1/2)。验收结论:复核判 DEFER;「步骤②是否验收通过」本报告**不代裁**。
374
+ 4. **13 个既有测试为什么统一置 full 档?缺省档在既有回归面还有没有覆盖?** ——夹具口径 = 这些用例考「合并/覆写/软删真的发生」,缺省 confirm 档会把它们拦下(采集材料口径;参 issue50-a 的 E1/H 先例)。缺省档覆盖:既有回归面**全部**在 full 档下(13 文件显式置 full),缺省档面**只由新守卫 `test_autonomy_modes.py` 覆盖**(其 A/B/C/D/E/F/G/H 组在缺省档下断言、本报告实跑 101/101)——这是可确证事实。
375
+ 5. **A 新增(ghost 节点)在确认档会不会变成一张待确认单?** ——不会:confirm 档 A=allow(矩阵;守卫 A 组逐格断言),A 面**不入单**(ghost 无资格探针不影响此——出单只发生在 C(覆写)与 B/D)。出单场景的精确边界见 §6.1 第 8 条(层/跨层形态请求时点拦;位/分形态同层覆写出单)。
376
+ 6. **C/D 被 accept 执行后,旧内容在哪找回、回滚动作是什么?** ——见 §6.1 第 7 条:D=`trash/`+删除清单可 `restore`;受保护节点(override 路径)=`_protected_history/<id>/<ts>.md` 快照;**普通节点覆盖无前像**(设计 §四 要求的前像/回滚通用化即留池①)。变更单载荷未含前像(留池⑦)。
377
+ 7. **变更单与普通提案如何分开(pid 前缀 / `review_list` 过滤字段 / `review_stats` 口径)?** ——pid 前缀**无**区分(统一 `prop_`+`_sig(...)`,`mdcos.py:2076-2077` 读码);判据 = rec 顶层 `kind`(`mutation` / 缺键=proposal);`review_list` 条目按整条 dict 复制、带 `kind` 可过滤;`review_stats` **无 kind 维度**(按 decision 统计——留池③:§九 台账未做);CLI list 有「变更单(动作→目标)」标注(`md_cg/review_cli.py:123`、`scripts/review_cli.py:103`)。
378
+ 8. **plan 档当前实际可用行为是什么?** ——设 `MDCG_AUTONOMY=plan`:A/B/E 无计划输入时恒 **forbid**(`moved_to="autonomy_forbidden"`、hint 说明「计划输入面待后续批次」、不落盘不出单);C/D 与 confirm 档同格(出单、不落盘);非法值仍是 fail-closed(对全部档同)。
379
+ 9. **被判失实的 `_gate_autonomy` docstring 改了吗?** ——**未改**:`writepipe.py:632-634` 现仍为原文(本报告读码);修正归实施方/后续批次(本报告轮次硬边界:不得动源码),见 §6.2 第 1 条。
380
+
381
+ **v1.2 更新(逐条,仅列状态有变化者;未列者按上答仍成立)**〔报告轮〕:
382
+
383
+ - **第 1 条**(下一步):补强批次成果的独立复核已 **ACCEPT**(§8.9)——这是 v1.1 之后新增的机械事实;**提交 / 再跑 / 丢弃**与「步骤②是否验收通过」的裁定仍归**编排侧与使用者**(设计 §十一 验收判据 `:186` 的逐条对照由裁定方做,本报告不代裁)。
384
+ - **第 2 条**(栈一失败项):**已定位**——唯一失败项 = `md_cg.test_policy_required_ccg --head-baseline` 的 SHIM-MISS(§8.4 / §8.8 P1:本机改前退出码 1、改后 0);编排侧容器栈一改后读数 **`38 pass / 0 fail`、退出码 0**(含该腿;§8.10)。
385
+ - **第 3 条**(插件主通道是否生效):**C 覆写面与 A 新增面已接**(补强二/三;§8.1 / §8.2 / §8.8 P2·P3)——现答:缺省 confirm 档下,`remember_gated(gated=true)` 的 **B 合并 / 限流 CONVERGE / C 覆写均出单且不落盘**、**A 新增放行不出单**;「步骤②是否验收通过」仍不代裁。
386
+ - **第 6 条**(旧内容找回):状态**未变**(本批未补前像)——§7.3 第 3 条给出现行精确口径(「出单→accept」窗口内**不可找回**)。
387
+ - **第 9 条**(docstring 改了吗):**已改**——补强批次把 `writepipe.py:632-642`(报告轮读码;采集引 `:632-645`)的「不落盘的边界(如实)」段订正为与实现逐句一致,并附「订正记录(2026-10-02,补强批次)」块(§8.5 / §8.8 P2)。
388
+
389
+ ### 7.3 读者问答(v1.2 轮,nextQuestions 6 条,逐条)
390
+
391
+ 1. **这批工作树下一步(提交 / 还要再跑什么)?「步骤②是否验收通过」在哪对照、由谁裁?** ——机械事实:工作树 **20 改 + 4 未跟踪**、未 `git add`/`commit`/`push`(§8.12,本报告实跑);补强成果独立复核 **ACCEPT**(§8.9);批次② 的 **DEFER 是历史层记录**(§五),不构成对补强成果的判定。**提交时点、是否再跑门禁、验收裁定**三项均归**编排侧与使用者**;设计 §十一 验收判据(设计稿 `:186`)须由裁定方逐条对照,本报告**不代裁**。
392
+ 2. **容器两栈与 python 全量读数本轮全是转录,能否在仓的临时副本里实跑?由谁复跑进门禁?** ——**python 全量本轮是实跑、不是转录**:`python -X utf8 scripts/run_tests.py` → `===== SUMMARY 305/305 通过,5 跳过(依赖缺失/平台不符) =====`、退出码 0〔本报告实跑〕(§8.10)。**容器双栈本轮未跑**(转录,§8.10 未跑声明);**可行的实跑形态**(回应「临时副本」提议):把仓树复制到仓外临时目录(或 `git worktree add`)对该副本执行 §4.2 既定命令——读写都落副本、不污染工作树;**复跑方与时点**归编排侧 / 发版门禁,本报告不代定。
393
+ 3. **确认单「出单→accept」之间,普通节点 C 覆写的旧正文丢了还能不能找回?前像 / 回滚通用化排在哪个批次?** ——**窗口内不可找回**(现行)〔本报告读码 + §6.1 第 7 条〕:普通(非受保护)节点的 C 覆写**无前像**——出单载荷只存**后像**(`after`),旧正文既不进 `trash/`(那是 D 的通道)也不进 `_protected_history/`(仅**受保护节点**经 override 路径落快照,`protect.py:215-245`);accept 一经执行,原正文即被覆盖、无副本。**回滚通用化 = 留池①⑦**(设计 §四 `:81-86` 要求把这一对推广到一切 C/D/B 动作),**本批未动、未排批次**(排期归编排侧 / 使用者)。
394
+ 4. **变更单落进既有审核队列后,使用者具体怎么操作——CLI 有没有 accept/reject?** ——**有**,两个 CLI 副本同款〔本报告读码〕:`python -m md_cg.review_cli accept <pid> --reason "…"` / `reject <pid> --reason "…"`(用法行 `md_cg/review_cli.py:17-18`,子命令注册 `:212-217`);`python scripts/review_cli.py accept <pid> --reason "…"`(用法行 `scripts/review_cli.py:11-12`,子命令注册 `:186-204`)。变更单语义:**accept = 执行**对应动作(B reinforce/converge、C 覆写落盘、D 软删)、**reject = 原样留痕不执行**(`md_cg/review_cli.py:31-32`、`scripts/review_cli.py:25-26`);`list` 对变更单显式标注「变更单(动作名→目标)」。不用 CLI 时的等价入口 = `cg.review_decide(pid, …)` API。
395
+ 5. **插件侧会不会持续积压变更单、需要什么配套交互?** ——机械事实:补强后缺省 confirm 档下,插件主通道(`mdcg_remember(gated=true)`)的 **C 覆写会出单且不落盘**(该面上一轮正是「旁路确认档」的缺口,§8.2 / §8.8 P2),**A 新增照旧直落**。⇒ 覆写类记忆会在审核队列**累积**待裁;消耗方式 = 上述 CLI / `review_decide`(第 4 条)。若**不希望**插件通道出单,可把档位置 `MDCG_AUTONOMY=full`(该档 gated C/A 均放行直落、零出单——守卫 I 组断言,§8.3);**策略选择归使用者**,本报告不代裁。
396
+ 6. **沙箱残留长期怎么累积、由谁在哪个批次修?** ——残留只落在**系统临时目录**(`tempfile.mkdtemp`,前缀 `autonomy_modes_sandbox_`)、零真实数据;守卫自跑每跑约留 1 个(2 文件的壳,§8.7 报告轮实测两形态)。长期累积取决于跑动频次,由**操作系统临时目录清理策略**兜底;**修复(清理逻辑 / 根因)未排批次——留池**(§8.11 第 1 条),排期归编排侧 / 使用者。报告轮已清本会话累积的 9 个(清点→清理→复核残留 0)。
397
+
398
+ ### 7.4 本轮(v1.2 报告轮)读者反馈处置(unclear 8 + unsupported 2 + nextQuestions 6)
399
+
400
+ | # | 反馈(类别) | 处置 | 落点 |
401
+ |---|---|---|---|
402
+ | U1 | 版本号自相矛盾(unclear) | 新增「版本谱系与引用裁决」块:**文件名/标题 v1.0 = 文档标识**;正文 v1.1 / v1.2 两层;**裁决规则:v1.2 > v1.1 > v1.0 原文**,标「保留不覆盖」者为历史层 | 报头 |
403
+ | U2 | 标签与角色体系没闭环(unclear) | 新增**角色表**(实施段 / 复核段 / 报告轮 / 工作流采集段 / 编排侧)并把各标签绑到角色;**更正** §4.1 末段误标〔工作流采集〕→〔复核材料〕;§4.3 / §五 两处尾标改为明确指涉;§8.10「〔同上〕」→ 全称 | 报头、§4.1、§4.3、§五、§8.10 |
404
+ | U3 | 腿号两套冲突(unclear) | §8.8 腿号改为 **P1–P4**;术语速览增「复现腿编号」行;§8.9 的复核「腿一…腿四」加换算注 | 术语速览、§8.8、§8.9 |
405
+ | U4 | 两套字母体系重叠(unclear) | 术语速览增「测试组 A–J(≠ 动作类)」行;§4.1 表前加「字母体系提示」(点明 **B 组测 C 改写、C 组测 B 合并**) | 术语速览、§4.1 |
406
+ | U5 | 删断言探针数字与逐组计数对不上(unclear) | 定义计数口径(「N 条」=该组在某变异下的**红项构成数**,非组总数 B10 / H12);并**本报告实跑复核**:删 g_b → 6 处不符、② 39→34、④ 6→0;删 g_h → 唯一不符 ① 9→6(与批次② 结构同形) | §4.1 末段 |
407
+ | U6 | §7.1 第 14 条指向不存在的标号(unclear) | 改为按 §6.1 第 8 条实际编号(①②)指涉;并注明原「探针 v1/v2/v3/v4」全文仅此一处、已更正 | §7.1 第 14 行 |
408
+ | U7 | §8.1 同表两套行号、引用无唯一答案(unclear) | 表内行号**统一为报告轮读码**、标题声明口径;实施/采集原读码降为备查(不作引用口径) | §8.1 |
409
+ | U8 | 「9 组指纹」「20 个场景」未展开(unclear) | 两处均注明**清单未随材料传入、不代补**;并说明与相邻数字的口径差异(7 个动作载荷 / 11 个列名场景 / §二 8 条腿) | §二 腿⑧、§4.3 |
410
+ | S1 | §7.2 停留 v1.1、与 §八 相抵(unsupported) | §7.2 标注为**历史层**并加「v1.2 更新」块(第 1 / 2 / 3 / 6 / 9 条状态变化);新增 **§7.3** 回答本轮 6 问 | §7.2、§7.3 |
411
+ | S2 | 报头「范围限定」未随 §八 更新(unsupported) | 加「补强批次更新(v1.2)——本限定对现树不再成立」块:两面已接入;给出**现行覆盖面**与仍不在覆盖面内的两面(脚本通道 / 计划输入面) | 报头 |
412
+
413
+ ## 八、补强批次(2026-10-02 · v1.2)——复核三条未收口 + 容器栈一门禁红
414
+
415
+ **批次定位**:本批在 §三 已落成果**之上增量补强**(工作树的步骤②改动原样保留、不重做)。四项补强 = 独立复核判 DEFER 时列出的三条未收口(**发现 1 / 发现 2 / 观察 3**,见 §五、§6.2)+ 容器栈一「37 pass / 1 fail」的**唯一失败项**(编排侧亲测定位=`md_cg.test_policy_required_ccg --head-baseline` 的 SHIM-MISS——§4.2 当时登记为「失败项明细未随材料传入」,本批补齐)。
416
+
417
+ **证据分级**:本节未标级别者一律=**本批实施段实跑**〔本批实跑〕(同一 ask 内亲手执行并计数);标〔复核材料〕/〔工作流采集〕者为转录,不代跑不代补。
418
+
419
+ **硬边界**:不改 `data/policy.json`、不削弱任何 forbidden、不触在役数据根(全部实验在 `tempfile.mkdtemp` 合成库、跑完 rmtree)、未 `git add`/`commit`/`push`;改前形态的读数用**守卫自身的定点变异机制**在内存里复现(不改源文件),故「前」读数可复现、非转述。
420
+
421
+ ### 8.1 四条补强与落点(行号 = **报告轮读码**;与 §8.8/§8.12 同一口径)
422
+
423
+ | # | 缺口(来源) | 修法 | 落点 |
424
+ |---|---|---|---|
425
+ | 补强一 | 容器栈一唯一红:`test_policy_required_ccg --head-baseline` 报 `SHIM-MISS:…writepipe -> .autonomy_modes` | 把 `autonomy_modes` 登记进 `_SHIMS`(writepipe 的链尾档位闸 `from . import autonomy_modes` 属基线源新增相对 import) | `md_cg/test_policy_required_ccg.py:107-114` |
426
+ | 补强二 | **发现 1**:`gated=true` 的 C 覆写(插件自动记忆主写入通道)在确认档直落覆写、不出单;`writepipe._gate_autonomy` docstring 的「不落盘的边界(如实)」段声称该面「由 `remember_gated` 的 C 判定覆盖」而实际没有(失实陈述) | 新增 **gated 面档位判定单点** `MdCGOS._autonomy_gate_rewrite`:`forgetting.prior_node` 判存在 ⇒ C 改写——confirm/plan ⇒ 出单且不落盘(`moved_to=review_queue`+pid)、full ⇒ 放行;**资格在先**:出单前先 `write_qualify`(受保护/越权覆写照旧当场拒、不静默入队);载荷 meta 复用写链同一份白名单 `writepipe._AUTONOMY_META_KEYS`(延迟导入、不抄第二份),并补 gated 面独有的 fm 扩展键 `role`。ACCEPT 分支接线位置=importance 落盘值写入之后、`self.add` 之前 | `md_cg/mdcos.py:3910-3986`(单点:生效条件头注 `:3910`、`def :3911`、方法体止于 `:3986`)、`:4175-4195`(接线:调用 `:4185-4186`、`_forgetting.jsonl` 留痕 `:4188-4194`、返回 `:4195`);docstring 订正 `md_cg/writepipe.py:632-642`、链序注释 `:736-738` |
427
+ | 补强三 | **发现 2**:plan 档经 `gated=true` 的 A 新增不被拦(与硬约束③「计划外零变更」冲突) | 同一单点的 A 新增分支:confirm/full ⇒ 放行(**行为零变化**——插件主写入通道,本条是硬要求)、plan ⇒ fail-closed 终态(`ok=False` / `error="autonomy_forbid"` / `moved_to="autonomy_forbidden"` / 带可执行 hint,口径同写链 `_gate_autonomy` 的 A 面) | 同上(`md_cg/mdcos.py:3963-3967`) |
428
+ | 补强四 | **观察 3**:`_mutation_execute` 的 C 分支走 `self.add` 的 upsert——C 单目标在 accept 前消失时**静默落成「新增同 id 节点」**并记 accepted | C 分支加存在性判据(`forgetting.prior_node`,与出单时的 C/A 判定同一单点):目标不存在 ⇒ `{"ok": False, "error": "target_missing", ...}` 且**不重建节点、不记裁决**、提案保持 pending(错误名与 B/D 原语 `writelimit.converge_into` 的 `target_missing` 同口径) | `md_cg/mdcos.py:2536-2559`(含 `:2481` 生效条件头注与本函数 docstring 的补强段) |
429
+
430
+ **行号口径(v1.2 报告轮统一,回应本轮读者反馈「同表两套行号、引用无唯一答案」)**:本表**已统一为报告轮读码**(= §8.8/§8.12 口径),**引用以本表为唯一答案**。实施/采集段原读码仅在此备查(**不再作引用口径**):单点写作 `:3910-3988`、接线写作 `:4174-4184`、docstring 订正写作 `writepipe.py:632-645`、链序注释写作 `:735-737`——差异源于行区间**取法**(是否含生效条件头注、是否含尾随空行)与采读时点,**非代码不同**(同一棵树,见 §8.12 的 sha 对照)。
431
+
432
+ **`mcp_server.py` 本批未改**(如实):补强二/三落在 `remember_gated` 单点,`mdcg_remember(gated=true)` 分支(`mcp_server.py:3328-3344`)与写链 `_gate_gated`(`writepipe.py:351`)两个调用点**自动继承**——单点改、两入口同判据。
433
+
434
+ ### 8.2 四条缺口的前后对拍读数
435
+
436
+ **「前」读数的复现方式**:用守卫自身的定点变异(`test_autonomy_modes._patched`,纯内存、零文件改动)把新判据摘掉——该形态与改前实现等价(改前 ACCEPT 分支根本没有档位判据/C 分支没有存在性判据)。故下表「前」列不是转述,而是**可复现实测**。
437
+
438
+ | # | 场景 | 前(判据摘除形态=改前行为) | 后(本批落码后,同场景) |
439
+ |---|---|---|---|
440
+ | 补强二 | `remember_gated` 覆写既有 id,缺省 confirm 档;`mdcg_remember(gated=true)` / `op=write+gated=true` 同 | `verdict=ACCEPT`、**正文已被覆写**(`9595` 进正文)、**变更单 0 条**(复核材料 `probe.py B gated_over` 同形〔复核材料〕) | `verdict=CONFIRM`、`moved_to=review_queue`、`committed=false`、`pid` 非空、**正文未被覆写**、队列 1 条 `kind=mutation`(`id=目标`、载荷=动作类 C·目标·后像·理由·原语 `add`);`accept` 后正文换(走既有 `add`)、`reject` 不执行;受保护节点在 `write_qualify` 当场 `ProtectionError`、**零出单** |
441
+ | 补强三 | `remember_gated` 新 id,plan 档 | `verdict=ACCEPT`、**已落盘**(节点存在) | `verdict=FORBID`、`ok=false`、`error=autonomy_forbid`、`moved_to=autonomy_forbidden`、hint=「计划模式(MDCG_AUTONOMY=plan):动作类 A(新增)须命中计划中的步骤,但本次没有计划可依——fail-closed 未执行、未出变更单…」、**未落盘、零出单** |
442
+ | 补强四 | C 单目标在 accept 前被 `forget` | `accept` 返回 `{"ok": true, "node_id": "b_1"}`、**节点被重建**、**提案不再 pending**(记了 accepted) | `accept` 返回 `{"ok": false, "error": "target_missing", "hint": …}`、**节点未重建**(`cg.get() is None`)、**提案仍 pending**;对照片:目标在位时 `accept` 照旧执行覆写(判据不是「一律拒」) |
443
+ | 补强一 | `python -X utf8 md_cg/test_policy_required_ccg.py --head-baseline` | 输出首行即 `SHIM-MISS:基线源引用了未登记的相对模块…writepipe -> .autonomy_modes`、**退出码 1**(真实前态实跑,非复现) | **退出码 0**;`结果:16 pass / 11 fail(红项:G2b…G8c)` 且红项集合**逐一等于**预期 11 项;打印「红基线符合预期…」;同文件绿态(`--head-baseline` 之外)`28 pass / 0 fail`、退出码 0 |
444
+
445
+ **写链面与 MCP 面的端到端读数**(补强二 的通道覆盖证据)〔本批实跑〕:`op=write` + `gated=true` 覆写既有 id ⇒ 返回体 `moved_to="review_queue"`、`committed=False`、`gate.pid` 非空、链上目标未被覆写;`mdcg_remember({"gated": true, 既有 id})` ⇒ `moved_to="review_queue"`、`pid` 非空、`committed=False`、正文未被覆写。
446
+
447
+ ### 8.3 守卫扩展数字(`md_cg/test_autonomy_modes.py`)
448
+
449
+ | 检查 | 批次②(前) | 补强批次(后,本批实跑) |
450
+ |---|---|---|
451
+ | 正向 `python -X utf8 -m md_cg.test_autonomy_modes` | 8 组 **101 通过 / 0 失败**、退出码 0 | **10 组 126 通过 / 0 失败**、退出码 0;锚点自检 PASS |
452
+ | 逐组计数 | A 39 / B 10 / C 12 / D 10 / E 4 / F 4 / G 10 / H 12 | 同左 + **I 21**(gated C confirm 6+资格在先 2+plan C 1+plan A 1+full C 1+A 对拍 2+链面 3+MCP 1+执行桥 4) + **J 4**(SHIM 登记/SHIM-MISS 判据/整腿 PASS/负对照) |
453
+ | 变异自证 `--mutate` | 10 处逐处吻合、退出码 0 | **14 处逐处吻合、退出码 0**;未变异基线红项=0 |
454
+
455
+ **逐处变异红项数(14 处;后 4 处为本批新增,前 6 处的数字变化为本批复测值)**:
456
+
457
+ | # | 变异 | 前 | 后 |
458
+ |---|---|---|---|
459
+ | ① | 档位不生效(`mode` 恒返回表内缺省) | 7 | **9**(+2=I 组 plan-A fail-closed、full-C 直落) |
460
+ | ② | confirm 也直落(`decide` 把 confirm 格判成 allow) | 25 | **39**(+14=I 组同类判据) |
461
+ | ③ | 矩阵整表坍缩成 full | 31 | **46**(+15=② 的 14 + I 组 plan-C) |
462
+ | ④ | 写链档位闸不生效(`_gate_autonomy` 恒放行) | 6 | 6 |
463
+ | ⑤ | 合并档位闸不生效(`_autonomy_gate_merge` 恒放行) | 10 | 10 |
464
+ | ⑥ | 删除档位闸不生效(`forget_gated` 直调软删) | 4 | 4 |
465
+ | ⑦ | accept 不执行(执行桥空转) | 5 | **9**(+4=I 组四条 accept 执行/target_missing/pending/对照片) |
466
+ | ⑧ | 幂等键丢掉目标(内容签名回归) | 3 | **4**(+1=I 组对照片:同内容异目标撞键) |
467
+ | ⑨ | kind 不落 rec(变更单退化成提案) | 6 | **10**(+4=I 组队列 kind/target_missing/pending/对照片) |
468
+ | ⑩ | 档位路径绕过 can_admin 闸 | 2 | 2 |
469
+ | ⑪ | **新增**:gated 面档位闸不生效(`_autonomy_gate_rewrite` 恒放行=发现 1 原形态) | — | **15** |
470
+ | ⑫ | **新增**:gated 面档位闸跳过资格探针(`write_qualify` 摘除) | — | **2**(受保护节点当场被拦 + 零出单) |
471
+ | ⑬ | **新增**:执行桥 C 目标消失判据摘除(upsert 回归=观察 3 原形态) | — | **3** |
472
+ | ⑭ | **新增**:SHIM 登记丢失(`_SHIMS` 去掉 `autonomy_modes`=补强一 原形态) | — | **2**(J1 登记在位 + J2 判据不抛) |
473
+
474
+ **新增 `attr` 常量型变异**(`test_autonomy_modes.py:935-943`(`_fn_src`)与 `:974-983`(`_patched` 的 attr 分支)):`_SHIMS` 这类「判据是**数据**不是函数体」的落点,源码替换无从下手——新增第三种目标形态 `("attr", 模块, 属性名)`:`替换文` 按属主命名空间求值后 `setattr` 安装、退出还原;锚点漂移同样报 ANCHOR-MISS(若有人删掉登记行,锚点 `"autonomy_modes")` 即缺失 → exit 2,fail-closed)。配套:J 组另设**负对照**(子进程内把 `_SHIMS` 去掉后该腿必须 `SHIM-MISS` 非零退出),使 J3 的绿同样有判别力。
475
+
476
+ **锚点漂移 fail-closed**:`--mutate` 与正向两模式入口都先跑 `_anchor_check()`,漂移即 exit 2(本批新增锚点全部按源码原文书写,一次通过)。
477
+
478
+ ### 8.4 容器栈一 37/1 → 38/0 的修复证据
479
+
480
+ - **失败项定位**(编排侧亲测;本批转录其报错原文):唯一失败=`[FAIL] md_cg.test_policy_required_ccg --head-baseline`,报错为 `SHIM-MISS:基线源引用了未登记的相对模块,假包会缺模块(调用期抛 ModuleNotFoundError,断言会退化成假绿)——请把下列名字加入 _SHIMS(真仓模块)或 _BASELINE_FILES(被变异本体):writepipe -> .autonomy_modes`。
481
+ - **该腿的前后对拍(本机实跑)**:改前 退出码 1(SHIM-MISS,即上句);改后 退出码 0(`16 pass / 11 fail` 且红项集合=预期 11 项,见 §8.2 补强一 行)。
482
+ - **常驻化**:J 组把该腿做成守卫断言(J3 整腿 PASS、J4 负对照)——此后该腿再退化(有人删登记/新增未登记的相对 import)会在 `md_cg.test_autonomy_modes` 就红,不必等容器。
483
+ - **未跑声明**:本批**未跑容器**(本轮自跑范围=新守卫 + 定向回归;容器两栈交编排侧随后跑)。故「栈一 38 pass / 0 fail」的**整栈读数**须以编排侧容器实跑为准;本批给出的是「37/1 中的那 1 条红已被消除且已常驻守卫」的机械证据。
484
+
485
+ ### 8.5 docstring 修正记录(失实陈述的处置)
486
+
487
+ | 位置 | 改前 | 改后 |
488
+ |---|---|---|
489
+ | `md_cg/writepipe.py:632-645` `_gate_autonomy` 的「不落盘的边界(如实)」段 | 「…其覆写/合并分别由 `remember_gated` 的 C/B 判定覆盖」——**B 合并确已覆盖,C 覆写当时没有**(该分支直调 `self.add`),属失实陈述(复核发现 1 的代码根据) | 改为逐句与实现一致的表述:gated 面由 `MdCGOS._autonomy_gate_rewrite`(C 改写/A 新增)与 `MdCGOS._autonomy_gate_merge`(B 合并)承担、本闸只覆盖走链尾执行器的直写(`gated=false`);并追加「**订正记录(2026-10-02,补强批次)**」块写明原文何处失实、何时才与实现一致 |
490
+ | `md_cg/writepipe.py:737` `install_default_gates` 链序注释 | 「其合并/覆写由 remember_gated 的 B/C 判定覆盖」 | 补上两个单点指涉(`_autonomy_gate_merge` / 补强批次的 `_autonomy_gate_rewrite`) |
491
+ | `md_cg/mdcos.py:2481` / `:2502-2507` `_mutation_execute` 生效条件头注与 docstring | 未提 C 面目标消失 | 补「C:目标经 `forgetting.prior_node` 判定——目标已不存在即返回 `target_missing`(fail-closed,不重建节点、不记 accepted),存在才 `self.add` 覆写落盘」与对应的补强说明段 |
492
+ | `md_cg/mdcos.py:4026` / `:4083-4092` `remember_gated` 生效条件头注与 docstring | ACCEPT 面写「ACCEPT 走 add」(落盘=裁决值),未提档位判定——补强后该描述**不完整**(会读成「必落盘」) | 头注改为「ACCEPT **先过档位闸 `_autonomy_gate_rewrite`**…放行才走 add」;docstring 追加「补强批次(2026-10-02,复核发现 1/2 的收口)」段(动作类判定/资格在先/出单与拒绝都写 `_forgetting.jsonl`) |
493
+ | `md_cg/mdcos.py:3910-3945` 新单点 | — | 按本仓惯例加「生效条件:」头注 + docstring(含动作类判定、资格在先、载荷 meta 白名单出处、边界如实项:`session` 不在白名单且被执行桥收进 B 原语槽、两个 gated 调用点都不传) |
494
+
495
+ ### 8.6 不动面对拍(本批实跑)
496
+
497
+ - **A 面(插件新增)confirm/full 零变化**:`remember_gated` 新 id 在两档的**返回体逐位相等**(剔时钟面键)、**落盘节点(正文 + fm)逐位相等**(I 组两条断言);全链(`op=write`)A 新增的 confirm/full 逐位相等沿用 H 组原两条(继续绿)。
498
+ - **full 档全部动作与改动前一致**:H 组 5 条「full → allow 且无 hint」+ I 组「gated C 覆写(full 档)照旧直落:`verdict=ACCEPT`、正文已换、零变更单」+ H 组 full 档 B 合并 / D 删除照旧。
499
+ - **写链行为不回归**:定向回归 `python -X utf8 scripts/run_tests.py md_cg` = **228/228 通过、3 跳过、退出码 0**(含 `test_writepipe` / `test_b1b2_write_face` / `test_i50b_defer_to_review_queue` / `test_p2_mcp` / `test_twophase` / `test_linkref` / `test_writelimit` 等全部链断言)。
500
+ - **既有测试兼容**:本批**未改任何既有测试的断言意图**(新增断言只在 `test_autonomy_modes.py` 的新组;`test_policy_required_ccg.py` 只加 SHIM 登记一行 + 注释)。
501
+
502
+ ### 8.7 本批自跑与未跑(如实)
503
+
504
+ | 项 | 状态 |
505
+ |---|---|
506
+ | 新守卫正向 + `--mutate` | **已跑**:126/0 退出 0;14 处逐处吻合退出 0 |
507
+ | `test_policy_required_ccg` 两态(`--head-baseline` 与绿态) | **已跑**:退出 0 / 退出 0 |
508
+ | 定向回归 `scripts/run_tests.py md_cg` | **已跑**:228/228、3 跳过、退出 0 |
509
+ | 定向回归**稳定性**(同口径复跑) | **已跑 9 次**:7 次 228/228(退出 0);2 次各红 1 项——分别落在 `md_cg.test_b3_merge_keeps_content` 与 `md_cg.test_issue39_utf8_stdio`,**两次都发生在套件与本批守卫 `--mutate` 并行跑时**;两者**单独跑均绿**(b3 31 通过 / issue39 20 通过,各复跑通过)。如实登记为**并行负载下的抖动**、**不代裁根因**:本批改动面(档位/变更单/执行桥)与 issue39(UTF-8 stdio)不相干,且两次红落在互不相同的测试上;`scripts/run_tests.py` 自身默认 `--jobs 4` 并发(`scripts/run_tests.py:192/227-228` 读码),编排侧跑全量时可据该口径复核 |
510
+ | python 全量(305/305 口径) | **未跑**(本轮自跑范围不含;交编排侧) |
511
+ | 容器双栈 | **未跑**(交编排侧;栈一 38/0 的整栈读数以编排侧为准) |
512
+ | 沙箱残留(顺手发现,**留池**) | 守卫 `rmtree(..., ignore_errors=True)` 在 Windows 上被未释放的锁句柄挡住:实测**每次跑约残留 1 个空壳沙箱目录**(内容仅 `<lib>/_index.json` 与 `.lock`,全为合成库、零真实数据)。本批已清理本会话累积的 **30 个**(清点→清理→复核残留 0),**清理逻辑未改**(根因未定、不代裁);守卫模块 docstring 的沙箱段已按实测补「边界(如实)」一行(原文「跑完 rmtree」是**意图**,实测存在残留——本批按「文案与事实一致」口径补注)。批次② 复核曾清理 83 个同类残留,属既有现象 |
513
+
514
+ **报告轮(v1.2 定稿)追加读数**(该表「未跑」栏是**实施轮**当时口径,不变):`python 全量` = **已跑**(`python -X utf8 scripts/run_tests.py` → `===== SUMMARY 305/305 通过,5 跳过(依赖缺失/平台不符) =====`、退出码 0〔本报告实跑〕);**容器双栈** = **转录编排侧读数**(栈一退出码 0 / `38 pass / 0 fail`;栈二退出码 0),本 ask 未跑(命令与理由见 §8.10)。**沙箱残留**:报告轮清点并清理本会话自跑累积的 **9 个** `autonomy_modes_sandbox_*`(清点→清理→复核残留 0),全为合成库、零真实数据;残留形态按收尾路径分两类〔本报告实跑〕——守卫自跑(走到 `main()` 收尾)残留 `<tag>_r0/_index.json`+`.lock` 两个文件(即上文「空壳」),**探针式 import**(import 守卫模块建沙箱、不以 `main()` 收尾)残留含完整合成库内容(实测一个含 `knowledge/orphan/<id>.md`、`inbox.jsonl`、`decisions.jsonl` 等 18 个文件)。⇒「空壳」是**守卫自跑**的典型形态、非全部形态,如实补注。
515
+
516
+ ### 8.8 修前现场(四条复现腿逐条:payload/异常/崩溃点/站点)
517
+
518
+ 四条复现腿编号为 **P1–P4**(**与 §二 的腿①–⑧ 不共享编号体系**——那是批次② 的八条复现腿,见术语速览「复现腿编号」行;本文档凡「P#」均指本节)。四条腿 = **修复工作流采集**〔工作流采集〕(均 `reproduced=true`),实验库一律 `tempfile.mkdtemp` 于系统临时目录的合成库、不触在役数据。「**本报告实跑**」行 = 报告轮用守卫自身的定点变异机制(`_patched`,**纯内存**)摘除本批新增判据复现「前」形态——改前该分支本就没有该判据,故「前」读数是**可复现实测**而非转述;实测与采集腿「前」读数逐项一致。行号规则同报头:「采集引」=采集材料原样;**以本报告读码为准**(现树行号与采集当时有位移,逐处注明)。
519
+
520
+ **P1(容器栈一门禁红)· SHIM-MISS**
521
+
522
+ - **payload**:不改任何文件,直接跑该腿自身命令 `python -X utf8 md_cg/test_policy_required_ccg.py --head-baseline`。触发条件 = 本批在写链新增**函数内相对导入**(本报告读码 `md_cg/writepipe.py:647` `from . import autonomy_modes as _am`,在 `_gate_autonomy` 体内;采集引 `:639`),而守卫登记表 `_SHIMS`(本报告读码 `md_cg/test_policy_required_ccg.py:112-114`;采集引 `:109-110`)未随之登记。
523
+ - **异常/崩溃点**:**不是断言失败,是装配期 fail-closed**——`raise SystemExit`(本报告读码 `md_cg/test_policy_required_ccg.py:149-152`;采集引 `:145-148`,差 4 行)。stdout 原文:「SHIM-MISS:基线源引用了未登记的相对模块,假包会缺模块(调用期抛 ModuleNotFoundError,断言会退化成假绿)——请把下列名字加入 _SHIMS(真仓模块)或 _BASELINE_FILES(被变异本体):writepipe -> .autonomy_modes」;退出码 1。
524
+ - **机械核验(AST 扫描 + 集合差)**:writepipe 的相对 import 集(12 名:audit/autonomy_modes/coldverify/forgetting/hotcache/hyperedge/linkref/mcp_server/mdcg/nodefile/trust/twophase)−(`_BASELINE_FILES` ∪ `_SHIMS`)**恰好缺 `{'autonomy_modes'}`**(唯一缺项)。
525
+ - **本报告实跑**:① 登记在位时同一集合差 = **空集**(12 名全覆盖);② 内存把 `_SHIMS` 去掉 `autonomy_modes` 后调 `_check_shim_coverage(_baseline_sources())` ⇒ `SystemExit`,消息与上句**逐字一致**(负对照:该判据不是空转)。绿腿对照:`python -X utf8 md_cg/test_policy_required_ccg.py` → 28 pass / 0 fail、退出码 0〔本报告实跑〕。
526
+
527
+ **P2(发现 1)· gated 面 C 覆写旁路(confirm 档照样直写落盘)**
528
+
529
+ - **payload**:合成库;`MDCG_AUTONOMY=confirm`。先 `add('l2_1', 六要素正文(初版), layer=knowledge, verification_basis=test)` 并 flush;再走**插件主通道工具面** `mcp_server._dispatch(cg,'mdcg_remember',{content_kind:'text', node_id:'l2_1', content:六要素正文(覆写版), layer:'knowledge', gated:True, consistency:False, importance_hint:0.9, verification_basis:'test'})`(`importance_hint=0.9≥PROTECT_IMPORTANCE` 使 `forgetting.assess` 恒走保护优先→ACCEPT)。同载荷另跑链面 `writepipe` 默认链 `pipe.execute(..., gated=True)`(`_gate_gated`→`remember_gated`)。对照=同档位同载荷改 `gated=False`。
530
+ - **异常/崩溃点**:**无异常、无崩溃——静默直落**。工具面返回体 `verdict='ACCEPT'`、`written='l2_1'`;盘面 `before_has_初版=true` → `after_has_覆写版=true` / `after_has_初版=false`(节点被就地覆写);审核队列 `kind=mutation` 条目 `[]`(未出单)。链面:`ok=true`、`committed=true`、`moved_to=null`、`pid=null`、目标节点已被改写。对照(`gated=false`):`ok=true`、`committed=false`、`moved_to='review_queue'`、`pid='prop_c41ce101d273'`、目标未被改——**两面同载荷行为分叉**,证明 gated 面缺的是档位判定而非别的闸。
531
+ - **旁证**:① 同载荷但 `consistency` 保持缺省 True 的一次运行得 `verdict='DEFER'`、`written=null`(add 被一致性闸判 REJECT 返回 None)——仍无档位判定、无变更单;② 失真文案:`writepipe.py:632-634` docstring 与 `:728-729` 注释声称 gated 面覆写「由 `remember_gated` 的 C 判定覆盖」;实读该分支(采集引 `md_cg/mdcos.py:4046-4073`)只有 `forgetting.assess` 四态,C 面**无任何档位判据**(B 面确有 `_autonomy_gate_merge`,`mdcos.py:4009/4082`)——文案与实现不符。
532
+ - **站点**:采集引 `md_cg/mdcos.py:4046-4073`(ACCEPT 分支;add 落盘 `:4059-4063`);旁路链 `md_cg/writepipe.py:725`(gated)与 `:730`(autonomy 链尾,gated 命中即 return 够不到);失真文案 `md_cg/writepipe.py:632-634`、`:728-729`。**本报告读码(现树)**:ACCEPT 分支 `:4162` 起、档位接线 `:4175-4195`、`self.add` `:4197-4200`;`_gate_gated :351`(短路 `:359-360`、调 `cg.remember_gated :370`)、链尾注册 `:739`。
533
+ - **本报告实跑(前/后)**:[前=内存摘除 `_autonomy_gate_rewrite`]`verdict=ACCEPT`、`committed=None`、`moved_to=None`、`pid=None`、**覆写已发生=True**、变更单=0;[后]`verdict=CONFIRM`、`committed=False`、`moved_to=review_queue`、pid 非空、**覆写已发生=False**、变更单=1。分叉点与采集腿逐项一致。
534
+
535
+ **P3(发现 2)· plan 档 gated A 新增不拦(计划外零变更失效)**
536
+
537
+ - **payload**:合成库(空库);`MDCG_AUTONOMY=plan`。`mcp_server._dispatch(cg,'mdcg_remember',{content_kind:'text', node_id:'l3_new', content:六要素正文(计划档新增), layer:'knowledge', gated:True, consistency:False, importance_hint:0.9, verification_basis:'test'})`(`node_id` 不存在 ⇒ 动作类 A 新增)。对照=同载荷改 `gated=False`、id 换 `l3_new2`。
538
+ - **异常/崩溃点**:**无异常**——`gated=true` 返回 `verdict='ACCEPT'`、`written='l3_new'`、`l3_new_exists=true`(新节点直接落盘);**plan 档未 fail-closed、未给 hint**。对照 `gated=false`:`ok=false`、`committed=false`、`moved_to='autonomy_forbidden'`、`error='autonomy_forbid'` 且 `l3_new2_exists=false`(拒且未落盘)——同一 env 档位下两面对同一动作类判定相反。
539
+ - **站点**:采集引 `md_cg/mdcos.py:4046-4073`(同一 ACCEPT 分支,A 新增与 C 覆写共用,无档位判定);对照实现(直写面)`md_cg/mcp_server.py:3365-3382`(本报告读码=批次② 的直写面档位分支 `:3365-3404`)。
540
+ - **本报告实跑(前/后)**:[前]`verdict=ACCEPT`、节点已落盘=True;[后]`verdict=FORBID`、`ok=False`、`error=autonomy_forbid`、`moved_to=autonomy_forbidden`、节点已落盘=False(hint 全文见 §8.2)。
541
+
542
+ **P4(观察 3)· 执行桥 C 分支目标消失静默转新增(应 `target_missing` fail-closed)**
543
+
544
+ - **payload**:合成库;`MDCG_AUTONOMY=confirm`。`add('l4_1','PASSED 探针正文 初版', layer=knowledge)` 并 flush;链面 `pipe.execute(cg,{content_kind:'text', content:'PASSED 探针正文 改写版', layer:'knowledge', node_id:'l4_1'})` 出 C 变更单(`committed=false`、`pid=prop_d0db4ea7b253`);随后库层直调 `cg.forget('l4_1', reason='模拟目标在执行前消失')` 让目标消失(`ok=true`/`tombstone=true`/`l4_1=null`);再 `cg.review_decide(pid,'accept',reason='复现探针')`。
545
+ - **异常/崩溃点**:**无异常、无失败信号**——accept 返回体 `{'ok': true, 'node_id': 'l4_1', 'mutation': {'kind':'mutation','action':'C','target':'l4_1','primitive':'add','executed': true}}`:目标已不存在却报 `executed`。盘面 `node_recreated=true`,重建节点正文=「PASSED 探针正文 改写版」(`_mutation_execute` 的 `self.add` 对不存在的 id 走了 upsert 语义,「覆写」静默变成「新增」)。裁决留痕:`decisions.jsonl` 落一条 `status='accepted'`、`result={'ok': true, 'node_id': 'l4_1'}`——「动作没做却记 accepted」的**相反情形**在此是「动作性质变了却记 accepted」。期望口径(B/D 现成)= fail-closed 结构化错误 `target_missing` 且不重建节点。
546
+ - **站点**:采集引 `md_cg/mdcos.py:2529-2532`(`elif act == _am.C_REWRITE: node_id = self.add(tgt, after, ...)`);调用链 `:2810` `_decide_mutation` → `_mutation_execute`,分派点 `:2653`。**本报告读码(现树)**:C 分支 `:2536-2559`(存在性判据 `:2546`、`self.add` `:2557`);`_mutation_execute` `def :2482`、`_decide_mutation` `def :2816`、分派调用点 `:2681`。
547
+ - **本报告实跑(前/后)**:[前=内存摘除 target_missing 判据]accept → `ok=True`、`node_id='p_c'`、`mutation.executed=True`、**节点被重建=True**、原提案不再 pending;[后]accept → `{'ok': False, 'error': 'target_missing', ...}`、**节点未重建**、提案**仍 pending**。
548
+
549
+ ### 8.9 本批自身的独立复核判定与它列出的 uncovered
550
+
551
+ **判定:ACCEPT**〔复核材料〕。**与 §五 的 DEFER 分属两层**:DEFER 是**批次②**成果的复核结论(其三条未收口即本批补强二/三/四);本批补强成果自身的复核判定是 ACCEPT。
552
+
553
+ **复核方式(转录)**:不采信执行者自述——全部实验在系统临时目录的合成库上由复核**自写探针**独立实跑(脚本目录 `%TEMP%\am_recheck_9A6g`);沙箱库根全在 `%TEMP%`,跑完已清(其前缀 15 个 + 测试前缀残留 698→0,删前确认 25 秒内无并发测试活动);复核前后 `git status --porcelain` 集合一致(20 改 + 4 未跟踪);未 `git add`/`commit`/`push`,未触在役数据根。
554
+
555
+ **复核读数与报告轮实跑的对照**(复核数字转录;括号内=本报告实跑结果):
556
+
557
+ - 守卫正向:126 通过 / 0 失败、退出码 0;逐组 A39/B10/C12/D10/E4/F4/G10/H12/I21/J4〔=本报告实跑同值〕;
558
+ - `--mutate`:未变异基线红项=0,14 处 9/39/46/6/10/4/9/4/10/2/15/2/3/2 逐处吻合、退出码 0〔=本报告实跑同值〕;
559
+ - **删断言探针**(复核自写 `probeC.py`,**内存改 `_GROUPS`、零文件改动**):删整个 I 组 → `_mutate_mode()` 返回 1(9 处红项数不符,如 ⑪ 15→0、② 39→25、③ 46→31);删 H 组 → 返回 1(① 9→6);删整个 J 组 → 返回 1(⑭ 2→0);另:删 I 组后 ①7/②25/③31/⑦5/⑧3/⑨6 恰等于 §8.3「批次②(前)」列(佐证 +I 组增量算术)〔转录〕;
560
+ - 四条腿正照:探针 A 43 通过/0 失败、探针 B 8 通过/0 失败(**编号换算**:复核材料的「腿一 / 腿二 / 腿三 / 腿四」= §8.8 的 **P1 / P2 / P3 / P4**,两套编号互不共享);腿一解析面实证(搭假包后 `mdcg_head.autonomy_modes` 解析到真实现、`_gate_autonomy(ctx)` 调用期放行;撤 shim 文件后同一调用抛 ImportError——提示文案写 ModuleNotFoundError、实际 ImportError,同族);腿二/三/四用**独立磁盘扫描**(`os.walk` + 自写 fm 解析,不经 md_cg 读 API)〔转录〕;
561
+ - 合法输入与改前逐位对照:双胞胎合成库 5 例(full 档 gated C 覆写、confirm/full 档 gated A 新增、confirm 档链面 A 新增、full 档链面 C 覆写)返回体 / 节点(fm+正文)/ `add` 实参 / 队列条数**全部逐位相等**〔转录〕;
562
+ - 不得静默的可观测面:非法 env(`MDCG_AUTONOMY=bogus`)在 4 个生产面均抛 `AutonomyModeError` 且 hint 列合法值;受保护节点覆写在 `write_qualify` 当场抛 `ProtectionError` 且零出单;plan FORBID 与 gated CONFIRM 均写 `_forgetting.jsonl`〔转录〕。
563
+
564
+ **它列出的 uncovered(未收口/待办)**:
565
+
566
+ 1. **文档面**:工作树现状快照与现树不符(复核材料把该块记作「§8.5」;其在本文档的**实际位置**=附录的「补强批次(v1.2)文件面与行数核对」段——本文档 §8.5 本身是 docstring 修正记录、不含快照)——`mdcos.py` 声称 5141→5267 / `283f7c438774055f`,实为 **5277 行 / `e7fb16c08cc71b0d`**;`test_autonomy_modes.py` 声称 795→1087 / `bb509298bdfca7a3`,实为 **1091 行 / `6104efaaffe568de`**(`writepipe`、`test_policy_required_ccg` 两处 sha 相符);附录 git 面列 19 改+3 未跟踪,与 §8.5 自身「现态 20 改+4 未跟踪」及现况不符。→ **本报告 §8.12 已订正**,订正后以本报告读数为准。
567
+ 2. **行为面(fm 字节面)**:gated C 直落(full 档)与「出单→accept」(confirm 档)的落盘 fm 差异**仅**多一键 `sensitivity: null`(索引条目与正文逐位相等)——新单点 docstring 的「两条路径 fm 等价」在**字节面**不严格成立、**行为面无差**。**本报告实跑复核**:两库对拍实测 fm 差 = 时钟面两键(`condition_space.time_window`、`created_at`,固有)+ 多一键 `sensitivity: null`;判据面依据〔本报告读码〕= `_readable`(`mdcos.py:4942`,`e.get("sensitivity")`)与 `_check_sensitivity_landing`(`mdcg.py:1373`;`:1402` 把假值归一为 None)对「None」与「缺键」同判。
568
+ 3. **沙箱残留**:守卫 `rmtree(..., ignore_errors=True)` 在 Windows 上被未释放的锁句柄挡住,每次跑约残留 1 个沙箱目录;**清理逻辑未改、根因未定——留池**(§8.11 第 1 条;报告轮已清点清理 9 个)。
569
+ 4. **容器面**:容器双栈读数(栈一 `38 pass / 0 fail` 退出码 0;栈二退出码 0)归属编排侧采集,非本报告实跑(§8.10)。
570
+
571
+ ### 8.10 验证数字(报告轮实跑 + 编排侧转录)
572
+
573
+ | 检查 | 命令(报告轮实跑原文) | 数字 | 级别 |
574
+ |---|---|---|---|
575
+ | 守卫正向 | `python -X utf8 -m md_cg.test_autonomy_modes` | 退出码 0;**10 组 126 通过 / 0 失败**;逐组 A39/B10/C12/D10/E4/F4/G10/H12/I21/J4;首行「锚点自检:PASS(test_autonomy_modes.py;不以 git HEAD 为基线源)」 | 〔本报告实跑〕 |
576
+ | 变异自证 | `python -X utf8 -m md_cg.test_autonomy_modes --mutate` | 退出码 0;未变异基线红项=0;14 处 **9/39/46/6/10/4/9/4/10/2/15/2/3/2** 逐处「命中预期」;总结「定点变异自证:PASS」 | 〔本报告实跑〕 |
577
+ | SHIM 腿(红基线) | `python -X utf8 md_cg/test_policy_required_ccg.py --head-baseline` | 退出码 0;`结果:16 pass / 11 fail(红项:G2b, G2c, G2d, G3b, G3c, G4a, G4b, G4c, G5a, G8b, G8c)`+「红基线符合预期」 | 〔本报告实跑〕 |
578
+ | SHIM 腿(绿态) | `python -X utf8 md_cg/test_policy_required_ccg.py` | 退出码 0;`结果:28 pass / 0 fail(红项:无)` | 〔本报告实跑〕 |
579
+ | SHIM 负对照 | 内存把 `_SHIMS` 去掉 `autonomy_modes` 后调 `_check_shim_coverage` | `SystemExit`:`SHIM-MISS:…writepipe -> .autonomy_modes`(与修前原文逐字一致) | 〔本报告实跑〕 |
580
+ | 定向套件 | `python -X utf8 scripts/run_tests.py md_cg` | **228/228 通过、3 跳过、退出码 0** | 〔本报告实跑〕 |
581
+ | **python 全量** | `python -X utf8 scripts/run_tests.py` | **`===== SUMMARY 305/305 通过,5 跳过(依赖缺失/平台不符) =====`、退出码 0**(含 `PASS md_cg.test_autonomy_modes`、`PASS md_cg.test_time_core_lint`;PASS/FAIL/SKIP 行数实测 305/0/5) | 〔本报告实跑〕(与编排侧采集读数逐字一致) |
582
+ | **容器栈一** | 既定命令见 §4.2(`rust:bookworm` + `linux_verify.sh full`) | **退出码 0**;`结果: 22 pass / 0 fail`|`[PASS] smoke_test (linux)`|`=== 汇总: 38 pass / 0 fail ===`——§4.2 当时的 37/1 已成 38/0,那 1 条红即本批补强一 的 SHIM-MISS | 〔编排侧采集转录,本 ask 未跑〕 |
583
+ | **容器栈二** | 既定命令见 §4.2(`node:22-bookworm`) | **退出码 0**;`# cancelled 0`|`# skipped 3`|`# todo 0`|`# duration_ms 11764.542475` | 〔编排侧采集转录,本 ask 未跑〕 |
584
+
585
+ **未跑声明(如实)**:本 ask **未跑容器两栈**,只转录编排侧读数。可确证的机械事实:本机 `docker --version` = 28.4.0、镜像 `rust:bookworm` / `node:22-bookworm` 均在本地(`docker images` 实读);但既定命令把仓根以**读写**方式挂到 `/work`(`README.md:586/588`),整栈运行会在工作区写编译/构建产物——与本 ask 硬边界「只写这一个文件、不得改源码」相抵,故不跑。**定向回归稳定性**(§8.7 登记的并行负载抖动)本轮未复测。
586
+
587
+ ### 8.11 边界与未覆盖(本轮明确不修而留池的面)
588
+
589
+ 1. **沙箱残留(留池)**:守卫收尾 `rmtree(..., ignore_errors=True)` 在 Windows 上被未释放锁句柄挡住,跑一次残留一个沙箱目录;**清理逻辑未改、根因未定**——如实登记、不代裁。报告轮清点并清理本会话自跑累积的 **9 个** `autonomy_modes_sandbox_*`(清点→清理→复核残留 0),全为合成库、零真实数据。
590
+ 2. **fm 字节面不等价(登记,不修)**:gated C 直落(full)与出单→accept(confirm)落盘 fm 差一键 `sensitivity: null`(正文逐字相等;`_readable`/`_check_sensitivity_landing` 对 None 与缺键同判)。**不是缺陷、行为面无差**,但新单点 docstring 的「fm 等价」按字节面读不成立——本轮只登记、不改码(改则动既有 fm 形状)。
591
+ 3. **计划输入面未落(批次②留池④)**:plan 档 A/B/E 现恒 forbid(带「计划输入面待后续批次」hint)——本批未动。
592
+ 4. **脚本通道不接档位(批次②留池⑤)**:直调 `MdCGOS.forget` 的脚本通道仍不接档位——本批未动。
593
+ 5. **变更单无前像/回滚(批次②留池①⑦)**:本批只把执行桥 C 的「目标消失」改成 fail-closed,**未**给变更单补前像——C 覆写的旧正文在「出单 → accept」之间仍无快照。
594
+ 6. **容器整栈未由本 ask 复跑**(读数转录,见 §8.10)。
595
+ 7. **未动面**:`mcp_server.py` 本批零改动(两入口继承 `remember_gated` 单点,§8.1);库层原语不含档位判据(「直调库层不接线」不变,G 组 10 条钉死);`data/policy.json` 未改、无 forbidden 被削弱。
596
+
597
+ ### 8.12 工作树现状快照订正(2026-10-02 · 报告轮实跑)
598
+
599
+ §8.9 第 1 条(复核列出的文档面 uncovered)=**附录的「补强批次(v1.2)文件面与行数核对」段**快照失准(复核材料称其为「§8.5」,按实际位置订正如上)。**订正后以本表为准**(行数口径 = `wc -l`;sha256 前 16 位 = `sha256sum` / `hashlib` 双工具):
600
+
601
+ | 文件 | §8.5 原记(后值) | **现树实读** | sha256 前16位(现树) | 末行换行 |
602
+ |---|---|---|---|---|
603
+ | `md_cg/mdcos.py` | 5267 / `283f7c438774055f` | **5277**(`splitlines()` 5278) | `e7fb16c08cc71b0d` | 无 |
604
+ | `md_cg/writepipe.py` | 751 / `5356e2d1a10b782d` | **750**(`splitlines()` 751) | `5356e2d1a10b782d` | 无 |
605
+ | `md_cg/test_autonomy_modes.py` | 1087 / `bb509298bdfca7a3` | **1091** | `6104efaaffe568de` | 有 |
606
+ | `md_cg/test_policy_required_ccg.py` | 430 / `d84626f502f2b341` | **430** | `d84626f502f2b341` | 有 |
607
+ | `md_cg/mcp_server.py` | 4310 / — | 4310 | `99fefdc9d869f89e` | — |
608
+ | `md_cg/review_cli.py` / `scripts/review_cli.py` | 244 / 220 / — | 244 / 220 | `e5a37104aa1ea534` / `12ec6a15672626c7` | — |
609
+
610
+ - **机械根据**:`mdcos.py`/`test_autonomy_modes.py` 的现树 sha 与 §8.5 所记**不同** ⇒ 该快照不描述现树(内容确有差异,非计数口径问题;两文件 mtime 实测分别为 10-02 17:48:01 / 18:19:36)。`writepipe.py` 的「751 vs 750」是**口径差**:该文件末行无换行,`splitlines()` 计 751、`wc -l` 计 750,sha 一致故内容同一。
611
+ - **git 面(现态,本报告实跑)**:**20 改 + 4 未跟踪**(`.zcode/`=宿主目录、本文件、`md_cg/autonomy_modes.py`、`md_cg/test_autonomy_modes.py`)。相对附录所列「19 改 + 3 未跟踪」,增量 = ① `md_cg/test_policy_required_ccg.py` 进入修改面(补强一 的 `_SHIMS` 登记,批次②清单本不含它——这正是栈一 SHIM-MISS 出现的原因)+ ② 本文件自身。
612
+ - 未 `git add`/`commit`/`push`;未触在役数据根与 `data/policy.json`;**本文档为报告轮唯一写入文件**(写入前后除本文档外 `git status --porcelain` 一致)。
613
+
614
+ ---
615
+
616
+ ## 附:git 面(本报告落盘前实测〔本报告实跑〕)
617
+
618
+ ```
619
+ M md_cg/mcp_server.py
620
+ M md_cg/mdcos.py
621
+ M md_cg/review_cli.py
622
+ M md_cg/test_b1_auto_id_multiproc.py
623
+ M md_cg/test_b1b2_write_face.py
624
+ M md_cg/test_b3_merge_keeps_content.py
625
+ M md_cg/test_i50b_defer_to_review_queue.py
626
+ M md_cg/test_i50d_importance_source.py
627
+ M md_cg/test_i50e_readside_protection.py
628
+ M md_cg/test_linkref.py
629
+ M md_cg/test_n214_n215_n221_n222_write_face_gates.py
630
+ M md_cg/test_p2_mcp.py
631
+ M md_cg/test_p9_forget_protect.py
632
+ M md_cg/test_p9c_dedup_hints.py
633
+ M md_cg/test_protocol.py
634
+ M md_cg/test_writelimit.py
635
+ M md_cg/test_writepipe.py
636
+ M md_cg/writepipe.py
637
+ M scripts/review_cli.py
638
+ ?? .zcode/
639
+ ?? md_cg/autonomy_modes.py
640
+ ?? md_cg/test_autonomy_modes.py
641
+ ```
642
+
643
+ 上述 19 改 + 3 未跟踪与工作流起始快照**逐字一致**。`.zcode/` 为宿主 ZCode 工作目录(workflows / workflow-drafts / workflow-runs / plans),**起点已在、非本批产物**〔本报告实跑:顶层目录列表〕。本文档落盘后终态在此之上仅多 1 个未跟踪文件:`?? docs/eval/三档自治_步骤②档位单一入口_落码记录_v1.0.md`——v1.1 修订**只改本文档自身**(落盘前后除本文档外 `git status --porcelain` 逐字一致)。未 add / 未 commit / 未 push。**(补强批次后现态见 §8.12:20 改 + 4 未跟踪——增量含 `md_cg/test_policy_required_ccg.py` 进入修改面与本文件自身。)**
644
+
645
+ **补强批次(v1.2)文件面与行数核对(本批实施段实跑)**:起点快照 19 改 + 4 未跟踪(`.zcode/`、本文档、`md_cg/autonomy_modes.py`、`md_cg/test_autonomy_modes.py`)→ 现态 **20 改 + 4 未跟踪**——增量为 1 个**既有文件的修改态**:`md_cg/test_policy_required_ccg.py`(补强一 的 `_SHIMS` 登记;它在批次②清单里**不在**修改面,这正是 SHIM-MISS 出现的原因)。本批**未新增/未删除任何文件**,改动落 4 个文件:`md_cg/mdcos.py`、`md_cg/writepipe.py`、`md_cg/test_policy_required_ccg.py`、`md_cg/test_autonomy_modes.py`;行数变化:`md_cg/writepipe.py` 742→**751**、`md_cg/mdcos.py` 5141→**5267**、`md_cg/test_autonomy_modes.py` 795→**1087**、`md_cg/test_policy_required_ccg.py` 426→**430**;未动文件行数不变 (`mcp_server.py` 4310 / `review_cli.py` 244 / `scripts/review_cli.py` 220)。改后 sha256 前 16 位:mdcos `283f7c438774055f` / writepipe `5356e2d1a10b782d` / test_policy_required_ccg `d84626f502f2b341` / test_autonomy_modes `bb509298bdfca7a3`(工作树现状,未提交)。**未** `git add`/`commit`/`push`;未触在役数据根与 `data/policy.json`。
646
+
647
+ **快照订正(2026-10-02 · 报告轮实跑,即 §8.12)**:上段行数/sha 为**更早一次快照**(与现树 sha 不一致 ⇒ 内容确有差异)——现树实读:`md_cg/mdcos.py` **5277**(`e7fb16c08cc71b0d`)、`md_cg/writepipe.py` **750**(末行无换行,`splitlines()` 计 751;`5356e2d1a10b782d`)、`md_cg/test_autonomy_modes.py` **1091**(`6104efaaffe568de`)、`md_cg/test_policy_required_ccg.py` **430**(`d84626f502f2b341`);git 面现态 **20 改 + 4 未跟踪**。上段原文**保留不覆盖**,供对读复核当时的判断依据。
648
+
649
+ **文件行数核对(本报告实跑)**:工作区 `md_cg/writepipe.py` 742 / `md_cg/mdcos.py` 5141 / `md_cg/mcp_server.py` 4310 / `md_cg/review_cli.py` 244 / `scripts/review_cli.py` 220 / `md_cg/test_autonomy_modes.py` 795;改前树(HEAD `d5a6a511`)writepipe 652 / mdcos 4775 / mcp_server 4261。
650
+
651
+ **补强批次终态(v1.2 报告轮实跑,口径同 §8.12:行数=`wc -l`)**:`md_cg/mdcos.py` **5277** / `md_cg/writepipe.py` **750**(`splitlines()` 751)/ `md_cg/test_autonomy_modes.py` **1091** / `md_cg/test_policy_required_ccg.py` **430** / `md_cg/mcp_server.py` **4310** / `md_cg/review_cli.py` **244** / `scripts/review_cli.py` **220**;逐文件 sha256 前 16 位见 §8.12。**本段与 §8.12 是本文档唯一有效的现态快照**;其上「19 改 + 3 未跟踪」「742 / 5141 / 795 / 1087 / 5267」等均为批次②/v1.1 或更早快照的读数,补强批次已使其过时。