@furongjun1999/dsh-memory 0.6.1 → 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 (105) hide show
  1. package/README.md +49 -18
  2. package/docs/README.md +1 -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.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/207/272/350/264/247/351/235/242/345/206/222/347/203/237_/350/277/233/350/264/247/351/227/250/347/246/201_v1.0.md +460 -0
  17. package/docs/eval//345/217/221/345/270/20308_/350/207/252/350/277/255/344/273/243/344/270/216/347/235/241/347/234/240_/345/233/276/346/243/200/347/264/242/350/267/257/344/270/216/346/235/203/351/207/215_v1.0.md +97 -0
  18. 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
  19. package/docs/eval//345/275/222/344/270/200/345/261/202/347/274/272/347/234/201/347/277/273/345/205/263_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +458 -0
  20. 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
  21. package/docs/hive//346/243/200/347/264/242/347/256/227/346/263/225/345/217/243/345/276/204/345/257/271/347/205/247_v0.1.md +136 -11
  22. package/docs/hive//346/243/200/347/264/242/350/267/257/345/276/204/344/270/216/350/256/244/347/237/245/347/273/223/346/236/204/345/245/221/347/272/246_v0.1.md +32 -2
  23. package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +88 -0
  24. 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 +40 -40
  25. package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +47 -11
  26. package/docs/mdcg//347/235/241/347/234/240/345/221/250/346/234/237_/350/277/220/347/273/264/345/211/215/346/217/220/344/270/216/347/273/264/346/212/244/346/214/207/345/215/227_v1.0.md +183 -0
  27. 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
  28. package/docs/plans//347/235/241/347/234/240/344/270/216/350/207/252/350/277/255/344/273/243_/345/212/237/350/203/275/344/274/230/345/214/226/350/256/276/350/256/241_v0.4.md +547 -0
  29. 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
  30. package/md_cg/admission.py +718 -0
  31. package/md_cg/autonomy_modes.py +642 -0
  32. package/md_cg/bench_e2e_locomo_qa.py +11 -4
  33. package/md_cg/chain.py +47 -0
  34. package/md_cg/consistency.py +133 -8
  35. package/md_cg/forgetting.py +38 -6
  36. package/md_cg/freshness.py +527 -0
  37. package/md_cg/generation.py +409 -0
  38. package/md_cg/hotcache.py +4 -1
  39. package/md_cg/lifecycle.py +30 -2
  40. package/md_cg/mcp_server.py +191 -26
  41. package/md_cg/mdcg.py +594 -39
  42. package/md_cg/mdcos.py +869 -38
  43. package/md_cg/nodefile.py +74 -1
  44. package/md_cg/protect.py +79 -4
  45. package/md_cg/provenance.py +1 -1
  46. package/md_cg/review_cli.py +31 -2
  47. package/md_cg/rollback.py +411 -0
  48. package/md_cg/rollback_cli.py +104 -0
  49. package/md_cg/semantic/canonical.py +22 -0
  50. package/md_cg/semantic/unify.py +73 -22
  51. package/md_cg/semantic/unify_fixture.json +25 -0
  52. package/md_cg/sleep.py +1297 -0
  53. package/md_cg/stg.py +400 -50
  54. package/md_cg/stgidx.py +281 -0
  55. package/md_cg/sustain.py +146 -9
  56. package/md_cg/test_auto_defaults.py +424 -0
  57. package/md_cg/test_autonomy_admission.py +1098 -0
  58. package/md_cg/test_autonomy_modes.py +1972 -0
  59. package/md_cg/test_b1_auto_id_multiproc.py +7 -0
  60. package/md_cg/test_b1b2_write_face.py +7 -0
  61. package/md_cg/test_b3_merge_keeps_content.py +7 -0
  62. package/md_cg/test_boundary_hit.py +410 -0
  63. package/md_cg/test_cons200_scan_selection.py +791 -0
  64. package/md_cg/test_en_pipeline.py +22 -13
  65. package/md_cg/test_generation_guard.py +352 -0
  66. package/md_cg/test_h4_sustain_snapshot.py +14 -4
  67. package/md_cg/test_i50a_half_dup_defer.py +408 -0
  68. package/md_cg/test_i50b_defer_to_review_queue.py +545 -0
  69. package/md_cg/test_i50c_meta_passthrough.py +608 -0
  70. package/md_cg/test_i50d_importance_source.py +531 -0
  71. package/md_cg/test_i50e_readside_protection.py +656 -0
  72. package/md_cg/test_issue39_utf8_stdio.py +9 -1
  73. package/md_cg/test_issue52_scan_condition_first.py +677 -0
  74. package/md_cg/test_linkref.py +7 -0
  75. package/md_cg/test_mode_parity.py +1393 -0
  76. package/md_cg/test_mutation_rollback.py +805 -0
  77. package/md_cg/test_n204_n205_n226_n227_n228_n229_exit_gates.py +1 -1
  78. package/md_cg/test_n212_n213_n224_generation_gates.py +14 -8
  79. package/md_cg/test_n214_n215_n221_n222_write_face_gates.py +7 -0
  80. package/md_cg/test_n230_dirty_replay.py +375 -0
  81. package/md_cg/test_p2_mcp.py +8 -0
  82. package/md_cg/test_p2_six_elements.py +463 -0
  83. package/md_cg/test_p3_legacy_closure.py +433 -0
  84. package/md_cg/test_p4_freshness.py +680 -0
  85. package/md_cg/test_p8_subgraph_chain.py +14 -1
  86. package/md_cg/test_p9_forget_protect.py +7 -0
  87. package/md_cg/test_p9c_dedup_hints.py +7 -0
  88. package/md_cg/test_policy_required_ccg.py +5 -1
  89. package/md_cg/test_protocol.py +7 -0
  90. package/md_cg/test_rank_parity_score_mode.py +6 -0
  91. package/md_cg/test_semantic_canonical.py +5 -3
  92. package/md_cg/test_sleep.py +611 -0
  93. package/md_cg/test_sleep_p1.py +784 -0
  94. package/md_cg/test_stgidx_index_parity.py +1020 -0
  95. package/md_cg/test_time_core_lint.py +968 -0
  96. package/md_cg/test_unify_default_off.py +701 -0
  97. package/md_cg/test_unify_scope.py +182 -0
  98. package/md_cg/test_writelimit.py +36 -9
  99. package/md_cg/test_writepipe.py +5 -2
  100. package/md_cg/weights.py +15 -1
  101. package/md_cg/whitebox_kb/aeis_core/time_core.py +8 -0
  102. package/md_cg/writepipe.py +101 -2
  103. package/package.json +3 -2
  104. package/skills/plugin.json +1 -1
  105. package/utf8_boot.py +237 -0
@@ -0,0 +1,340 @@
1
+ # cons200 冲突检测选面 修复记录 v1.1-r1(收口轮;按读者反馈逐条修订)——索引序静默截断 → 相关性预筛+保底面+面内例外+超限可观测
2
+
3
+ **版本行**:v1.1-r1(收口轮;v1.1 主体+按读者反馈逐条修订——处置明细见 §七)
4
+ **落位说明(编排侧收口)**:本文件原名 `docs/eval/undefined_修复记录_v1.0.md`(run args 丢失所致,来由见「『undefined』来由」节);编排侧收口更名为 `docs/eval/cons200_冲突检测选面_实施记录_v1.1.md`,报告内容未由编排侧改动。**文件名版本(v1.1)与版本行(v1.1-r1)分属落位约定与修订轮次,二者不一致非笔误**。
5
+ **日期**:2026-10-03 | **被测面**:`D:\program\dsh-memory-main` 工作树(**未提交**——`git status --porcelain` 实列 `M md_cg/consistency.py`、`M md_cg/test_mode_parity.py`、`?? md_cg/test_cons200_scan_selection.py`、`?? docs/eval/cons200_冲突检测选面_实施记录_v1.0.md`、`?? .zcode/`)| **基线**:HEAD `9a1150dd21f4d7cb0d2a48933ea559a15518f7bd`〔本报告实跑〕
6
+
7
+ **本报告覆盖的闭环**:第一轮缺口 → 补齐(两最小条件+三处增补)→ 第二轮复核。
8
+
9
+ **关联**:
10
+ - `docs/eval/cons200_冲突检测选面_实施记录_v1.0.md`(mtime 2026-10-03 10:45,本报告实测)=**第一轮快照**(23 断言/5 变异/F1「未修」等表述);本报告为收口轮记录,状态口径以本报告为准(该文档本身未动——报告撰写轮硬边界;是否加指向本报告的注记需改另一文件,留给维护者,见 §六)。
11
+ - 设计稿签收点 5(`docs/plans/stg条件化与结构索引_设计_v0.1.md`,第二实现批);issue #52 同族不同模块(`md_cg/stg.py`)。
12
+ - **「undefined」来由(契约偏离声明)**:本工作流 ask 的缺陷/契约字段渲染为 `undefined`(run `dwfrun-9d53a69a` 系 AmendWorkflow 启动、无 `args` 段,`__host.args.defect/contract` 为空 → `String(undefined)`);按工作树证据(守卫初版、上述实施记录 §五、`.zcode/workflow-drafts/consistency选面修复-第二实现批.dwf.ts:50-52` 的 GAPS 常量)恢复缺陷=**cons200**、待实施契约=收口轮两缺口(①面内例外 ②无词面口径定点断言);编排侧收口已更名为 `cons200_冲突检测选面_实施记录_v1.1.md`。〔工作流采集·修复段〕
13
+
14
+ **证据分级声明**:
15
+
16
+ | 标记 | 含义 |
17
+ |---|---|
18
+ | 〔本报告实跑〕 | 本报告撰写员在本次 ask 内亲手执行并核对(守卫三模式 / mode_parity 正向 / `scripts/run_tests.py md_cg`+全量 / h4 守卫 / big 库最终版读数复现 / sha256 与行数 / git 面 / 全仓检索 / HEAD 与工作树行号读码) |
19
+ | 〔工作流采集·修复段〕 | 修复工作流采集材料(9 条修前复现腿、实施 changes、探针)——**转录**,不代跑不代补 |
20
+ | 〔工作流采集·复核段〕 | 两轮独立复核采集材料(判定/证据/uncovered)——**转录** |
21
+ | 〔工作流采集·编排侧〕 | 容器两栈退出码——**转录,未复跑**(需容器装置,本次未尝试) |
22
+
23
+ **行号口径**:改前行号=`git show HEAD:` 导出后逐行核实;改后行号=读工作树文件核实——均为〔本报告实跑〕读码所见。
24
+
25
+ ---
26
+
27
+ ## 〇、图例与口径速览(v1.1-r1 新增)
28
+
29
+ ### 0.1 编号体系一览(防撞号)
30
+
31
+ | 体系 | 含义 | 出处 |
32
+ |---|---|---|
33
+ | **L1–L9** | §二 修前复现腿编号(L1 条件互斥漏检 … L9 工作树对照) | §二 表 |
34
+ | **「L1 直跑」** | 工作纪律第 17 条的「L1 只读判定可直跑」**层级名**——与复现腿 L1 **不同义**(本报告文末已改称「只读直跑」以免再撞) | 文末 |
35
+ | **G1–G6** | cons200 守卫的**内容分组**(G1 选面 / G2 对拍 / G3 可观测 / G4 成本 / G5 语义红线 / G6 收口轮缺口闭合) | `md_cg/test_cons200_scan_selection.py:31-51` |
36
+ | **A1–A4 / B1–B5 / C1–C6 / D1–D4 / E1–E4 / F1–F4** | 上述六组的**断言编号**(27 条,逐条见 0.2) | 同上 |
37
+ | **①–⑥** | 守卫 `--branch-baseline` 的**定点变异编号**(逐条见 0.3) | `test_cons200_scan_selection.py:644-654` |
38
+ | **Q 组** | `test_mode_parity` 的**对拍组**(15 项,见 0.4) | `md_cg/test_mode_parity.py` |
39
+ | **H-4(a)** | 并发纪律「迭代点取快照」(见 0.5) | 下条 |
40
+
41
+ ### 0.2 守卫断言图例(27 条一句话;分组见 0.1)
42
+
43
+ | # | 内容(源标签摘要) |
44
+ |---|---|
45
+ | A1 | 索引序尾部的冲突对(c1 面)被检出(修前扫描面读不到它;选面回退即红) |
46
+ | A2 | 尾部冲突对使判定进入 DEFER/强度 ≥ CLASH_HIGH |
47
+ | A3 | 索引序尾部的纪律节点(discipline 面)被检出(REJECT) |
48
+ | A4 | layer 面:contextual 层冲突对在层过滤后照常检出 |
49
+ | B1 | 修后检出集 ⊇ 修前(legacy 形态运行时重建) |
50
+ | B2 | 修复有效:存在「修前漏检、修后检出」的新增检出 |
51
+ | B3 | 新增检出非空且**只能来自原被切面**(逐条核验:不在修前扫描面内) |
52
+ | B4 | 修前扫描面内的检出(保底面)修后逐条仍在 |
53
+ | B5 | 尾部冲突对:修前漏检、修后检出(缺陷取证的守卫内复现) |
54
+ | C1 | 候选超限 ⇒ truncated=True(修前无任何标记) |
55
+ | C2 | 口径:scanned>kept(scanned=预筛后候选数、kept=实际精比数) |
56
+ | C3 | kept 覆盖全部相关候选(≥3:a_conf/zz_offline/zz_disc)且 ≤2×MAX_SCAN |
57
+ | C4 | 截断附可操作 hint(含「细化生效条件/不适用条件」「条件索引」语义) |
58
+ | C5 | 未超限:truncated=False、不附 hint、scanned==kept(口径自洽) |
59
+ | C6 | MCP 面(`_consistency_call`)同批读数随返回体透传 |
60
+ | D1 | 读盘数=kept(预筛/选面阶段零读盘;未全量读盘) |
61
+ | D2 | 相关候选(a_conf/zz_offline/zz_disc)全部进入精比面(kept≥3) |
62
+ | D3 | 无条件内容:剔除档只剔**面外**非纪律候选(面内一律保留;读盘=kept=scanned=201) |
63
+ | D4 | 小库溯源:读盘数=kept 且不超过全库节点数(快照级候选面) |
64
+ | E1 | MAX_SCAN==200 一字未动(契约禁止面) |
65
+ | E2 | exclude 自排除语义保持(被排除节点不检出不比对) |
66
+ | E3 | 四态照旧:无关条件 → ACCEPT/0.0(小库未超限路径) |
67
+ | E4 | 面内例外不误伤:无条件内容下面内声明候选与纪律候选仍比对(comparable=2)、判 ACCEPT 不误报 BLINDSPOT;scanned=面内+面外纪律 |
68
+ | F1 | 面内例外转正(非同源形态):条目 tags 置空+盘面 tags=[discipline]+落修前扫描面内 ⇒ 无词面输入下仍检出 REJECT |
69
+ | F2 | 面外非同源残余:修后与修前形态同判(均不检出);修前形态重建锚点漂移 ⇒ 本断言转红(fail-closed) |
70
+ | F3 | 无词面口径定点:scanned=面内候选+面外纪律候选、kept=scanned、truncated=False、不附 hint、读盘=kept |
71
+ | F4 | 结构保证:无词面输入下修前扫描面(200 名)逐位进入精比面/读盘面 |
72
+
73
+ **「核心 A1/B2/B5 全红即 PASS」的含义与判据**:`--legacy-baseline` 把「修前形态」在运行时源码上重建后跑**全 6 组×27 断言**;退出判据=**A1、B2、B5 三条全部转红**(源码 `test_cons200_scan_selection.py:762-767`:`core = {l for l in reds if l.startswith("A1 ")/("B5 ")/("B2 ")}`,`len(core) < 3` 才 FAIL)。这三条的语义(0.2)=「尾部冲突对可检出」「存在修前漏检修后检出的新增」「L1 缺陷的守卫内复现」——即**「这条守卫抓得住 cons200 缺陷本身」的最直接三条**;legacy 模式**不要求**其余断言也转红。
74
+
75
+ ### 0.3 定点变异表(`--branch-baseline`;预期红项数与旧值→新值)
76
+
77
+ | # | 变异 | 预期红项数(v1.1 实测=预期) | 首轮旧值〔实施记录 v1.0 §4.1〕 |
78
+ |---|---|---|---|
79
+ | ① | 选面回索引序截断(修前形态) | 8 | 7 |
80
+ | ② | 去掉 truncated/kept 上报与 hint | 11 | 10 |
81
+ | ③ | 预筛把真冲突候选剔掉(假阴性) | 19 | 14 |
82
+ | ④ | MAX_SCAN 数值偷调大(契约禁止面) | 10 | 8 |
83
+ | ⑤ | 剔除档失效(预筛退化,读盘面回到全候选) | 4 | 2 |
84
+ | ⑥ | 去掉修前扫描面例外(收口轮①面内例外失效) | 5 | (新增,无旧值) |
85
+
86
+ ⑥ 的红项**具名**(本报告实跑):**F1、F3、F4、D3、E4**——恰为面内例外(收口轮①)相关的全部断言。
87
+
88
+ ### 0.4 `test_mode_parity` 引用面图例(Q 组)
89
+
90
+ - **Q 组=对拍组**:工作树 vs **HEAD 导出树**(`git archive` 只读导出)上同场景跑写链/插件链,比较观察项读数。
91
+ - **15 项对拍清单**(本报告实跑输出):`A_add、E_fresh、E_weights、full_A、full_B、full_C、full_D、full_E_fresh、full_E_weights、matrix、mode_default、plan_C、plan_D、plan_decide、plg_A`。
92
+ - **SAME(15)/DIFF(0)**=15 项中逐位相同 15 项、不同 0 项。
93
+ - **豁免语义**:cons200 批给写链 out 的 consistency 读数**新增** `kept`/`truncated` 两键,而 HEAD 导出树没有——豁免=**跨代键差**(`_KNOWN_EXT_KEYS` `test_mode_parity.py:642`;`_norm_known_ext` `:646-653` 先剔除这两键再比较)。**旧键仍逐位对拍**。
94
+ - **「已知扩展在场」断言**(`:692-697`):工作树写链 out 的 consistency **必须含**这两键(删新键则转红)。
95
+ - **负对照**(`:718-720`):向导出树副本定点注入「写链 A 新增也需确认」差异 ⇒ DIFF 项**恰好** `A_add/full_A`(证明对拍有判别力)。
96
+
97
+ ### 0.5 术语
98
+
99
+ | 术语 | 定义 | 出处 |
100
+ |---|---|---|
101
+ | **过滤(谓词与集合)** | 「过滤后索引序前 limit」中:过滤谓词=两条 `continue`——`exclude` 命中跳过(`consistency.py:591-592`)+`layer` 不匹配跳过(`:593-594`);被滤集合=exclude 指定节点与该 layer 之外的节点;计数基准=**通过谓词之后**才 `fidx += 1`(`:595-596`),故「面内」=过滤后按索引序(`nodes.items()` 快照序)前 limit 名 | 读码;守卫同口径 `_pre_face` `:270-281`、`_face_and_disc` `:284-299` |
102
+ | **修前扫描面/面内/保底面** | 修前扫描面=旧选面逐位形态(过滤后索引序前 limit);「面内」=`in_before = fidx < lim`(`:595`);保底面=修前扫描面 ∩ 候选(`:617-618`) | 读码 |
103
+ | **面内例外与预筛的关系** | 预筛 `_sift_score`(`:322-361`)只**排序、不剔除**;唯一剔除档条件是**三合一**:`no_terms and not disc and not in_before`(`:607`)——`in_before` 为真(面内)即豁免剔除;剔除档与排序无关 | 读码 |
104
+ | **no_terms(无词面输入)** | `no_terms = not (tw_pos or tw_neg)`(`:587`):待检输入(content/condition_space/non_applicable_conditions)经 `_new_terms` 解析出的正/负条件**词面皆空**。触发剔除档。例:L3/L4/L7/L8 载荷(「本次操作:删除生产数据…」无 CCG 条件声明)=无词面;L1/L2/L5 载荷(含 `# 生效条件:生产环境`)=有词面(不触发剔除档) | 读码 |
105
+ | **H-4(a)** | 本仓并发纪律条目「**迭代点取快照**」:凡从 `cg.index` 取回 `nodes` 后、取用前先 `list(...)`——裸迭代在并发写(前台 add/flush 与后台巡检共享同一实例)下触发 `RuntimeError: dictionary changed size during iteration` | `docs/eval/优化第三批_门禁转正与调度止血与门控收口_v1.0.md` §1.3/§3.3(另见 `issue52_..._修复记录_v1.0.md:26` 术语条);守卫 `md_cg/test_h4_sustain_snapshot.py:2-5` |
106
+ | **43/0** | `md_cg/test_h4_sustain_snapshot`(H-4(a) 全 md_cg 域扫描守卫)的读数:**43 通过 / 0 失败 / 0 跳过**——本报告实跑 `python -X utf8 -m md_cg.test_h4_sustain_snapshot`,rc=0 | 本报告实跑 |
107
+ | **可观测「四级/五项」称法** | 第一轮复核材料称「四级皆在场」、实列五项(check 返回体/`_consistency.jsonl` 末行/mcp 返回体/writepipe cvd 及 review_queue/pipeline out.consistency)——本报告按实际列举写「五处」并照录材料称法;**MdCG.add 直连面**另见 §四注 | §五/§四 |
108
+
109
+ ---
110
+
111
+ ## 一、缺陷定义与真实站点
112
+
113
+ ### 1.1 缺陷定义
114
+
115
+ `consistency.check` 的既有节点比对面=`list(nodes.items())` 快照的**索引序前 `MAX_SCAN`=200 并静默 break**:条件级真冲突(条件互斥=DEFER 级;纪律违反=REJECT 级)落在索引序第 200 位之后即**静默漏检**——不抛异常、返回体无截断标记(无 `truncated`/`kept`/`hint`)、判 `ACCEPT`/强度 0.0。
116
+
117
+ - **缺陷面**=一切经该函数的检测:写链全部入口(`MdCG.add` 直连 / `writepipe._gate_consistency` / `mdcos.check_consistency`)与 MCP 检测查询面(`mcp_server._consistency_call`)的公共汇聚点(行号见 §1.2)——写入闸与查询同面。
118
+ - **规模**:在役库 17882 节点 ⇒ 检测面 ≈1.1%(≈1.1%=200/17882 的算术值)。**出处=守卫 docstring `test_cons200_scan_selection.py:6-10` 的材料陈述——本报告未取证**(未触在役数据根;该库测于何时、现规模是否仍为 17882,本报告无法作答);「索引序最前 `code_*` 占满名额、`mem_*` 几乎从不进面」同为**构述断言**(同出处)。
119
+ - **同族不同模块**:issue #52 修的是 `md_cg/stg.py` 时空接口;前序两 commit(`0d3a0ab2`/`9a1150dd`)文件清单均无 `md_cg/consistency.py`〔转录自实施记录 v1.0;其来源为 `git show --stat` 实跑〕。
120
+
121
+ ### 1.2 真实站点(行号为本报告读码所见)
122
+
123
+ **改前树(HEAD `9a1150dd`,`git show HEAD:md_cg/consistency.py`,805 LF 行)**:
124
+
125
+ | 站点 | 内容 |
126
+ |---|---|
127
+ | `md_cg/consistency.py:61`(HEAD) | `MAX_SCAN = 200`——单次检测最多比对的既有节点数 |
128
+ | `:478`(HEAD) | `strength, scanned, comparable = 0.0, 0, 0`(`scanned` 初始位) |
129
+ | `:496`(HEAD) | `for nid, e in list(nodes.items()):`——索引序快照迭代 |
130
+ | **`:501-502`(HEAD)** | **截断主站点**:`if scanned >= int(limit): break`——静默 break,无任何标记 |
131
+ | `:503-504`(HEAD) | `scanned += 1`;`node = cg.get(nid) or {}`(每候选一次读盘) |
132
+ | `:514-520`(HEAD) | 纪律违反分支——节点不入扫描面时**不可达** |
133
+ | `:630-635`(HEAD) | 返回体 `rec` 仅 `scanned`/`comparable`——无 `kept`/`truncated`/`hint` |
134
+
135
+ **改后树(工作树 `md_cg/consistency.py`,931 行;收口轮最终态)**:
136
+
137
+ | 站点 | 内容 |
138
+ |---|---|
139
+ | `:61-64` | `MAX_SCAN = 200` 数值未动;注释改为「相关面/保底面各自的限额」 |
140
+ | `:69-75` | `_SCAN_HINT`(截断可操作提示:细化生效条件/不适用条件、建索引方向、明劝阻调大数值) |
141
+ | `:322-361` | `_sift_score`:快照级相关性预筛(只读条目 `tags`/`rejection_terms`;零读盘零正文解析) |
142
+ | `:487` | `check` 上方「生效条件:」注释(同步面内例外语义) |
143
+ | `:505-533` | `check` docstring 选面节(含 `:528-532` 非同源形态诚实边界原文) |
144
+ | `:584-585` | `order = list(nodes.items())`(H-4(a):快照后再迭代) |
145
+ | `:591-596` | 过滤谓词(exclude/layer)与 `in_before = fidx < lim`(面内判定;定义见 §0.5) |
146
+ | **`:607`** | **面内例外(收口轮①)**:`if no_terms and not disc and not in_before: continue`——剔除永不触及修前扫描面 |
147
+ | `:612-621` | 相关面(`_sift_score` 序前 limit)∪ 保底面(过滤后索引序前 limit ∩ 候选);`scanned`/`kept`/`truncated` 落点 |
148
+ | `:634-641` | 精比循环纪律分支(`_ban_hit` 子串命中断 REJECT) |
149
+ | `:750-756` | 返回体 `rec`(含 `kept`/`truncated`,旧键全在场) |
150
+ | `:759-760` | `truncated` 为真附 `hint` |
151
+ | `:772` | `log(cg, rec)`——**无条件**写 `_consistency.jsonl`(截断可观测的留痕面,见 §四注) |
152
+
153
+ **消费面(`md_cg/mdcg.py` 等未改文件=HEAD 行号)**:
154
+
155
+ | 站点 | 内容 |
156
+ |---|---|
157
+ | `mdcg.py:2169-2185` | `MdCG.add` 直连块:`:2172-2175` `_cons.check(...)`(**不设 limit**,缺省=MAX_SCAN);`:2177-2178` REJECT+`on_conflict="reject"` → 抛 `ConsistencyError`;`:2181-2185` `extra["consistency"]` 只投影五旧键(`verdict/reason/strength/emotional/unresolved_id`) |
158
+ | `mdcg.py:1714-1716` | 「非合作写者协议」声明(`_dir_fingerprint` docstring:外部直改文件内容属非合作写者协议,见 readcache 同款声明) |
159
+ | `writepipe.py:283-303` | `_gate_consistency`:`:296-302` 调 `cg.check_consistency(...)`(不设 limit);`:303` `ctx["cvd"] = cvd`(完整读数透传) |
160
+ | `mdcos.py:4410-4433` | `check_consistency`:`:4412` `limit=consistency.MAX_SCAN` 缺省;`:4427-4433` 直通 `consistency.check` |
161
+ | `mcp_server.py:1285-1310` | `_consistency_call`:`:1301` `limit=int(a.get("limit") or consistency.MAX_SCAN)`;`:1296-1303` 直通 |
162
+
163
+ ---
164
+
165
+ ## 二、修前现场(本工作流采集的复现腿)
166
+
167
+ 〔工作流采集·修复段〕;「修前」=HEAD 行为。**共同事实:可运行腿全部无未捕获异常/崩溃**——缺陷形态=静默漏检(L1–L6、L9 对照)与写面静默放行(L7);L8 的异常是该载荷**应得**处置(对照取证)。库形态:big=203 候选合成库(201 条带声明填充+索引序尾部 `zz_tail_offline`〔位次 201,`# 不适用条件:生产环境`〕、`zz_tail_disc`〔位次 202,`tags=[discipline]`、禁令「删除生产数据」〕;前 200 面经脚本逐位核验不含二者)。
168
+
169
+ **载荷词面归类**(用 §0.5 的 no_terms 定义):L1/L2/L5 载荷含 `# 生效条件:生产环境`=**有词面**(不触发剔除档);L3/L4/L7/L8 载荷=**无词面**(触发剔除档)。**腿编号 L1–L9 与文末「L1 直跑」(纪律第 17 条层级)不同义**(§0.1)。
170
+
171
+ | # | 腿 | payload(关键项) | observed(异常/崩溃点) | site | reproduced |
172
+ |---|---|---|---|---|---|
173
+ | L1 | **核心腿**·条件互斥(DEFER 级)漏检 | 内容=`# 功能名:生产批处理\n# 生效条件:生产环境\n`(有词面);big 库;limit 缺省=MAX_SCAN | **无异常(静默漏检)**;`verdict='ACCEPT' reason='无冲突' strength=0.0 conflicts=[] scanned=200 comparable=200`——尾部真冲突对未入检出,返回体无任何截断标记 | `consistency.py:501-502`(HEAD) | true |
174
+ | L2 | 对照·位置性 | 同 L1 载荷+`limit=300` | 无异常;`DEFER strength=1.0 conflicts=['zz_tail_offline'] scanned=203 comparable=203`——同一循环同一载荷,仅限额越 200 位即检出 ⇒ L1 漏检是**位置性**的 | `consistency.py:496-506`(HEAD 同一循环) | true |
175
+ | L3 | **核心腿**·纪律违反(REJECT 级)漏检 | 内容=`本次操作:删除生产数据,并清理相关日志\n`(无词面);big 库 | **无异常(静默漏检)**;`ACCEPT/0.0/scanned=200`——REJECT 级真冲突被吞;纪律分支因节点不在扫描面而不可达 | `:501-502`(静默 break);`:514-520`(不可达分支) | true |
176
+ | L4 | 对照·位置性 | 同 L3 载荷+`limit=300` | 无异常;`REJECT strength=1.0 conflicts=[('discipline','zz_tail_disc',1.0)] scanned=203` | `:496-506`(HEAD) | true |
177
+ | L5 | 对照·载荷真实性 | L1/L3 载荷 @ mini 3 节点库(不涉限额) | 无异常;clash→`DEFER 1.0 ['zz_mini_offline']`;disc→`REJECT [('discipline','zz_mini_disc')]`——两载荷均为真冲突 | `:496-506`(未截断路径) | true |
178
+ | L6 | 腿·静默性 | 不注入载荷:读 L1 返回体+big 库根 `_consistency.jsonl` 末行 | 无异常;返回体 keys=14 个(`actor/comparable/conflict_strength/conflicts/emotional/layer/missing/neg/pos/reason/recursion/scanned/t/verdict`)——**无 `truncated`/`kept`/`hint`**;jsonl 末行同键集;`scanned=200=MAX_SCAN` 且无告警 | `:630-635`(HEAD rec 仅 scanned/comparable) | true |
179
+ | L7 | **核心腿**·写面静默放行 | `cg.add('mem_probe_evil', <L3 载荷>, layer='knowledge', consistency=True, on_conflict='reject')` @ big 库 | **无异常抛出**;返回 `'mem_probe_evil'`(落盘 `landed=True`)——REJECT 级纪律违反经写链闸静默落盘(对照 L8) | `mdcg.py:2170-2185`(直连不设 limit);截断点 `consistency.py:501-502` | true |
180
+ | L8 | 对照·写面应拒 | 同 L7 调用 @ mini 库 | **抛 `ConsistencyError`**:`[REJECT] 命中纪律节点的不适用条件(negative.reject)`——该载荷在写面应得的处置 | `mdcg.py:2177-2178` | true |
181
+ | L9 | 归因对照·工作树(含未提交修复)同场景检出 | L1/L3 载荷+新临时库(同构造)@ 工作树代码(HEAD+未提交 diff) | 无异常;P_CLASH→`DEFER 1.0 ['zz_tail_offline'] scanned=203 kept=202 truncated=True`;P_DISC→`REJECT [('discipline','zz_tail_disc')] scanned=1 kept=1 truncated=False`——与 HEAD 漏检逐位对照,行为差异归因于该批 diff | 工作树 `consistency.py`;对照 HEAD `:501-502` | true |
182
+
183
+ **L9 采集版本与「哪组数字对应交付代码」(v1.1-r1 补)**:L9 的 P_DISC `scanned=1` 说明其采集版本=**收口轮①(面内例外)落地前**的工作树 diff(该版本 no_terms 输入下,面内非纪律候选被剔除,候选仅剩面外纪律 1 名)。**最终版(交付代码)同构造读数**(本报告实跑,203 节点同构库):
184
+
185
+ | 场景 | 最终版读数〔本报告实跑〕 | L9 采集读数(面内例外前) |
186
+ |---|---|---|
187
+ | P_CLASH(有词面) | `DEFER 1.0 [zz_tail_offline] scanned=203 kept=202 truncated=True hint=True` | `DEFER 1.0 [zz_tail_offline] scanned=203 kept=202 truncated=True`(两版一致——有词面输入不触发剔除档,面内例外不参与) |
188
+ | P_DISC(无词面) | `REJECT 1.0 [zz_tail_disc] scanned=201 kept=201 truncated=False`(面内 200 名豁免剔除 + 面外纪律 1=201,与 §3.1/§5.2 收口轮②口径一致) | `REJECT [zz_tail_disc] scanned=1 kept=1 truncated=False` |
189
+
190
+ 即:**「交付代码对应哪组数字」=上表左列**;L9 右列为历史版本读数(其「与 HEAD 对照」的归因价值不受影响)。其余腿(L1–L8)为 HEAD 行为采集,无版本歧义;本报告未对其余腿做最终版逐条重跑(见 §七 条目 18)。
191
+
192
+ ---
193
+
194
+ ## 三、修法契约与落点(含复核缺口补齐)
195
+
196
+ ### 3.1 契约(三条硬线+可观测+收口轮两缺口)
197
+
198
+ 〔工作流采集·修复段〕+守卫 docstring(`test_cons200_scan_selection.py:12-19`/`:21-29`,读码核实):
199
+
200
+ | # | 契约 | 机械钉法 |
201
+ |---|---|---|
202
+ | C1 | **MAX_SCAN 数值不动**(200;数值放大不是修法) | `consistency.py:61-64`;守卫 E1;变异④(偷调 2000 → 红 10) |
203
+ | C2 | **修后检出 ⊇ 修前**(结构保证:保底面=过滤后索引序前 limit ∩ 候选,逐位保留) | `:612-621`;守卫 B1/B3/B4;变异①(回索引序截断 → 红 8)、③(剔真冲突候选 → 红 19) |
204
+ | C3 | **预筛不读盘**(快照级;只读条目 `tags`/`rejection_terms`) | `:322-361`;守卫 D1(读盘数==kept);变异⑤(剔除档失效 → 红 4) |
205
+ | C4 | **截断不静默**(`scanned`/`kept`/`truncated`+超限 `hint`) | `:69-75`/`:759-760`(+`:772` jsonl 留痕,见 §四注);守卫 C1–C6;变异②(去上报与 hint → 红 11) |
206
+ | **收口轮①** | **面内例外**:剔除永不触及修前扫描面——「修后 ⊇ 修前」成为**与「条目 tags 与盘面 fm.tags 同源」无关的结构保证** | `:607`;守卫 F1/F4;变异⑥(去面内例外 → 红 5) |
207
+ | **收口轮②** | **无词面口径定点**:`scanned`=面内候选+面外纪律候选、`kept=scanned`、`truncated=False`、不附 hint | 守卫 F3(独立重算 200+1);D3/E4 同步改写 |
208
+
209
+ **判据一字未动**:阈值/覆盖计算/四态路由未改;本批只改**选面与读数**(`consistency.py:533` docstring 同款声明)。
210
+
211
+ ### 3.2 落点表(收口轮最终工作树,读码核实)
212
+
213
+ - **实现侧**(`md_cg/consistency.py`):`:607` 面内例外(`and not in_before`);`:591-596` 过滤与面内判定;`:487`/`:505-533` 注释与 docstring(面内例外+非同源诚实边界 `:528-532`);`:612-621` 相关面∪保底面;`:750-760` 读数与 hint;`:772` jsonl 留痕。
214
+ - **守卫侧**(`md_cg/test_cons200_scan_selection.py`,791 逻辑行):新夹具 `_mk_gapface` `:170-187`(非同源·面内 7 节点)/`_mk_tail_residual` `:190-203`(非同源·面外 261 节点);`_Fixtures.close` `:216-243`(从 `mdcg._LIVE_CGS` 摘除+优雅 close+删目录);助手 `_face_and_disc` `:284-299`(`:291` H-4(a) 快照);G6 四断言 `:497-562`(F1 `:506`/F2 `:537`/F3 `:548`/F4 `:559`);D3 `:450-455`、E4 `:488-493`(按面内例外语义改写);变异 ⑥ 于 `:653`;`_MUTATION_PINS` `:611`、`_mutation_table_gaps` `:615-641`;`_branch_baseline` TABLE-GAPS 接入 `:697-700`+锚点预检 `:701-707`;`_legacy_baseline` 接入 `:747-750`+判据 `:762-767`;`main` 接入 `:771-776`;F2 漂移转红 `:517-522`。
215
+ - **同步面**(`md_cg/test_mode_parity.py`):`_KNOWN_EXT_KEYS` `:642`、`_norm_known_ext` `:646-653`、Q 组比较点 `:681-682`、「已知扩展在场」`:692-697`、负对照 `:718-720`——定向豁免 `kept`/`truncated` 两**键**。
216
+
217
+ ### 3.3 复核缺口补齐(第一轮缺口 → 补齐)
218
+
219
+ 〔工作流采集·修复段/缺口补齐段〕:
220
+
221
+ 1. **F1 面内例外(收口轮①)**——第一轮复核 F1「判据分叉缝」的闭合:剔除档加 `and not in_before` 后,非同源形态(条目 tags 置空+盘面 tags=[discipline])的面内候选仍进精比面、由**盘面判据**裁决:「修后 ⊇ 修前」不再依赖「同源」前提。自建实测(第二轮复核):gapface_ns(7 节点,`q_ns` 落面内)→ 现行 `REJECT [(discipline,q_ns)]`、读盘 7==独立重算;面外残余(tailns_ns,261 节点)→ 修后与修前**同判 ACCEPT**(不构成回归,已声明边界)。
222
+ 2. **无词面口径定点(收口轮②)**——`no_terms` 输入下 `scanned==kept==201`(=面内 200+面外纪律 1)、`truncated=False`、不附 hint、读盘 201 名含 `zz_disc`;与独立重算逐位一致(第二轮复核);守卫 F3/F4 为定点钉。
223
+ 3. **三处增补**(超出两最小条件字面,对齐姊妹守卫标准,可整段回退):①**防误删自检**(`_MUTATION_PINS`+`_mutation_table_gaps`+三入口 fail-closed rc=2——直查第一轮 uncovered#3「内存删⑥ rc=0」);②**夹具临时目录残留修复**(根因=进程退出兜底 `_atexit_flush_all` 对存活实例 `close()` 把 `_index.json`/`.lock` 写回已删根;修后三连跑零残留——uncovered#8 的 cons200 面);③**H-4(a) 快照纪律**(定义见 §0.5;`consistency.py:585`、守卫 `:291`;h4 域扫描点名后 43/0 复绿——43/0 读数本报告实跑复核,见 §0.5/§四)。
224
+ 4. **偏离声明**(转录):D3/E4 因面内例外语义变化必须改写(原 23 断言无法保持原值);六处变异预期值按实测重校(配对见 §0.3;逐处「恰好命中」与零空转不变);「报告与工作树漂移」(uncovered#2)=报告撰写阶段职责——**本报告即该条的收口**(该条所指 `cons200_...实施记录_v1.0.md` 仍为第一轮快照、未改,如实保留)。
225
+
226
+ ### 3.4 同步面豁免的语义与「值漂移谁兜」(v1.1-r1 补)
227
+
228
+ - **豁免的是什么**:Q 组比较时先经 `_norm_known_ext` 剔除 `kept`/`truncated` 两键再逐位比对——豁免的是**「工作树 vs HEAD 导出树」的跨代键差**(HEAD 侧根本没有这两键,不豁免则必然 DIFF),**不是**说这两键的值可以任选。
229
+ - **值由谁兜**:两键的**口径与结构**由 cons200 守卫的 C1–C6/D3/F3 兜(check 层断言:`truncated`⟺`scanned>kept`、`kept`≤2×MAX_SCAN、未超限 `scanned==kept`、超限附 hint、MCP 透传、无词面口径定点);`mode_parity` 只负责**「键在场」**(`:692-697`)与旧键逐位对拍。即:**跨模式键差豁免、check 层值口径另钉**。
230
+ - **豁免后这两键的可观测性还剩几层**:仍有三层——`check` 返回体(含 hint)、`_consistency.jsonl` 留痕(`:772`)、mcp/writepipe/pipeline 各透传面(§五);`MdCG.add` 直连的返回体投影不含它们(§四注)。
231
+
232
+ ---
233
+
234
+ ## 四、验证数字
235
+
236
+ ### 4.1 本报告实跑(撰写/修订轮亲手执行)
237
+
238
+ | 项 | 命令(原样) | 结果 |
239
+ |---|---|---|
240
+ | 守卫·正向 | `python -X utf8 -m md_cg.test_cons200_scan_selection` | **27 通过 / 0 失败,rc=0**(G1 4+G2 5+G3 6+G4 4+G5 4+G6 4=27 断言;逐条内容见 §0.2) |
241
+ | 守卫·变异自证 | 同上 `--branch-baseline` | **rc=0**;未变异基线 27 条全绿;六处变异打红 **①8 ②11 ③19 ④10 ⑤4 ⑥5** 逐处==预期(配对与旧值见 §0.3);**空转断言 0**;判别力自证 PASS |
242
+ | 守卫·⑥红项具名 | 定制探针(`G._build_mutant(G._M6)`+`G._activate`+`G._run_groups`,内存态、未改文件) | 打红 5 条=**F1、F3、F4、D3、E4**(面内例外相关断言全数) |
243
+ | 守卫·修前形态 | 同上 `--legacy-baseline` | **rc=0**;打红 8 条=**A1/A3/B2/B3/B5/D3/E4/F3**。判据=核心 **A1/B2/B5** 全红(源码 `:762-767`,含义见 §0.2 末);**F1/F4 在该形态下按设计绿**(F1:判据不依赖面内例外——小库不受截断、盘面判据本就判 REJECT,其红项钉是变异⑥;F4:legacy 形态下面内候选仍全部进读盘面,集合包含关系不破)——已由本报告实跑名单(8 条不含二者)与⑥红项名单(含二者)双向证实 |
244
+ | 对拍守卫·正向 | `python -X utf8 -m md_cg.test_mode_parity` | **64 通过 / 0 失败,rc=0**;Q 组 SAME(15)/DIFF(0)(15 项清单与判据见 §0.4);「已知扩展(kept/truncated)在场」PASS;负对照 DIFF 恰好 `A_add/full_A` |
245
+ | h4 快照纪律守卫 | `python -X utf8 -m md_cg.test_h4_sustain_snapshot` | **43 通过 / 0 失败 / 0 跳过,rc=0**(「43/0」主语与出处见 §0.5) |
246
+ | big 库最终版读数复现(L9 对照) | 自建 203 节点同构库+`consistency.check` 两载荷 | P_CLASH=`DEFER 1.0 [zz_tail_offline] scanned=203 kept=202 truncated=True hint=True`;P_DISC=`REJECT 1.0 [zz_tail_disc] scanned=201 kept=201 truncated=False`(与 L9 采集版本对照见 §二末) |
247
+ | targeted 套件 | `python -X utf8 scripts/run_tests.py md_cg` | **234/234 通过,3 跳过,rc=0**(含 `PASS md_cg.test_cons200_scan_selection` / `test_mode_parity` / `test_p11_consistency`) |
248
+ | **python 全量** | `python -X utf8 scripts/run_tests.py` | **311/311 通过,5 跳过(依赖缺失/平台不符),rc=0** |
249
+ | 文件面 | sha256+行数+git 面 | consistency.py `74f7baa7…`(931 行)、test_mode_parity.py `590d533e…`(1393 行)、守卫 `87967bb0…`(791 逻辑行);HEAD `9a1150dd…`;跑完全部测试后三文件 sha256 与 `git status` 逐位未变 |
250
+
251
+ **「截断不静默」在 `MdCG.add` 直连链(L7 调用方式)的落点**(v1.1-r1 补,本报告实跑):`MdCG.add` 的返回体/`extra["consistency"]` 只投影五旧键(`mdcg.py:2181-2185`,兼容边界)——但 `consistency.check` 内部**无条件** `log(cg, rec)`(`consistency.py:772`),故该链的 `_consistency.jsonl` 留痕仍含完整读数。实测:经 `MdCG.add(consistency=True, on_conflict='reject')` 落盘后,库根 jsonl 末行 **17 键含 `hint/kept/truncated`**(`verdict=DEFER scanned=203 kept=202 truncated=True hint=True`);同链换 L3 载荷(P_DISC)则**抛 `ConsistencyError`**(修复版下写面拒绝)。即:直连面的可观测面=**库根 jsonl 留痕**(而非该入口返回体/fm 投影)。
252
+
253
+ ### 4.2 工作流采集(转录)
254
+
255
+ - **探针**(两轮复核材料):删 `g4_cost` 组 → rc=1(基线 27→23、五处红项失配);注水恒真断言 → rc=1 且点名「Z9 复核注入恒真断言」为空转;锚点漂移两路径 → ANCHOR-MISS+rc=2;TABLE-GAPS 防误删自检:删⑥/删④/改名 → 三入口 rc=2(完好表 gaps=[]);`_Fixtures` 夹具多轮运行后 %TEMP% 零 `mdcg_cons200_*` 残留。
256
+ - **复核段自跑**:第一轮=合成库 20 场景×两树+四条调用腿(称法见 §5.1)+守卫三模式+探针+对拍;第二轮=24 场景×两树(含 3 非同源)+F1/no_terms 自建场景+防误删自检四入口。
257
+ - **容器两栈**〔编排侧,未复跑〕:栈一 **rc=0**(`结果: 22 pass / 0 fail`+`=== 汇总: 43 pass / 0 fail ===`+`[PASS] smoke_test (linux)`,两数关系未说明);栈二 **rc=0**(`# cancelled 0 | # skipped 3 | # todo 0 | # duration_ms 11664.166824`,无 pass 计数)。两栈覆盖内容未随材料提供。
258
+ - **部署**〔转录自修复段材料;其确认方式(进程启停时间/端口探测)未随材料提供,本报告**未独立核实**〕:在役常驻 MCP server 进程仍为改动前代码——新选面随**服务重启**生效;本轮未重启/未测重启后成本形态。重启的执行者/时点/补测口径=材料未含(§六 待决)。
259
+
260
+ ---
261
+
262
+ ## 五、独立复核两轮判定与各自 uncovered
263
+
264
+ 〔工作流采集·复核段〕;两轮复核均**只读**(未编辑工作区文件;开工/终检 sha256 与 git status 逐位一致;实验在系统临时目录沙箱自建、跑完清理;HEAD oracle=`git archive` 导出树)。前史一句:第一实现批复核为 **DEFER**(实施记录 v1.0 §五;uncovered=F1/② 等,即收口轮两缺口的出处)→ 收口轮补齐 → 下述两轮为本工作流的复核。
265
+
266
+ ### 5.1 第一轮复核:**ACCEPT**
267
+
268
+ - **复核对象**:工作树未提交的 cons200 修复(`consistency.py` 选面重构+`_SCAN_HINT`;守卫 `test_cons200_scan_selection.py`;同步 `test_mode_parity.py`)——开工/终检 sha256:`consistency.py 74f7baa7…`、`test_mode_parity.py 590d533e…`、守卫 `f3269fa8…`(当时版本)。
269
+ - **证据**(数字集合写清):
270
+ - **对拍场景集 20 个**=12 个未截断(small×10+empty×2)+8 个截断;**19/20 个语义面两树读盘序列逐位一致**——其余 **1 个=递归场景**(材料原注「1 个递归场景不比较」,即该场景不做逐位比较、不计入 19)。8 个截断场景上「修后 ⊇ 修前」成立(20/20 场景成立,含未截断场景的空集情形);verdict 只变强;12 个未截断场景业务键全等。
271
+ - **退化/容错路径集**(与上述对拍集**不同集**):截断真发生 **6 个场景**(材料列 5 例不等式:263>202、263>12、263>0、262>201、264>202;第 6 例未列)——**注意**:§§「截断 6 场景」与「8 个截断场景」分属这两个不同的场景集,不是同一批。
272
+ - **调用腿**:材料称「四条调用腿」、实列**五名**——`MdCGOS.check_consistency`(→DEFER/263/202;同载荷无词面→REJECT)、`mcp_server._consistency_call`(kept=202/truncated=True/hint 在场)、`writepipe._gate_consistency`(纪律场景→moved_to=review_queue)、`default_pipeline().execute`(truncated=True/kept=202)、`MdCG.add(consistency=True,on_conflict=reject)`(→抛 ConsistencyError)(称法与列举数不一致,照录)。
273
+ - 守卫三模式 rc=0(27/27;变异 8/11/19/10/4/5;legacy 打红 8 条);截断时 hint 含三语义;四级可观测在场(**材料称「四级」、实列五项**:check 返回体/`_consistency.jsonl` 末行/mcp/writepipe cvd 及 review_queue/pipeline out.consistency;称谓差异照录,见 §0.5)。
274
+ - **结论**:修复在复核范围内成立;**未发现反例**。
275
+ - **本轮 uncovered**(材料中被后续引用的编号):
276
+ - **#2** 报告与工作树漂移(材料层:`cons200_...实施记录_v1.0.md` 仍称 23 断言/5 变异/F1「未修」);
277
+ - **#3** 防误删自检缺失——内存删变异⑥时 rc=0 不转红(其余变异覆盖其标签,删条目无人察觉);
278
+ - **#8**(cons200 面)夹具临时目录残留——每次运行残留一个 `mdcg_cons200_*` 目录。
279
+ - 其余编号未随材料提供,如实标注(不补造)。
280
+
281
+ ### 5.2 补齐(§3.3)后,第二轮复核:**ACCEPT**
282
+
283
+ - **复核对象**:工作树未提交的 cons200 **收口轮**修复;工作树快照:守卫 `87967bb0…`(791 逻辑行,含 TABLE-GAPS/`_MUTATION_PINS`/`_mutation_table_gaps`)、`consistency.py 74f7baa7…`、`test_mode_parity.py 590d533e…`;HEAD `9a1150dd…`。
284
+ - **证据**(数字集合写清):
285
+ - 场景集 **24 个**(含 **3 个非同源形态**):**22 个可比场景**×两树读盘序列逐位一致——剩余 2 个「不可比」的**判据与场景清单材料未给**(不是按「非同源即不可比」推得的数:3 个非同源场景在 22 个可比集内);第一轮 20 场景 → 第二轮 24 场景的**差集清单材料未给**(可见新增为非同源形态族)。
286
+ - 截断真发生(263>202、263>12、263>0、262>201、264>202)=**退化路径集**(与 5.1 的「8 个截断场景」分属两集);`limit=0/−5`→kept=0/读盘 0 不崩;空库 0 读盘不崩;剔除档真发生(无词面输入候选 201 vs 全量 263)。
287
+ - **六条腿**新旧对照(材料点名:`MdCGOS.check_consistency` / `mcp_server` / `writepipe`×2(两种场景)/ `default_pipeline` / `MdCG.add`)——与第一轮「四条(实列五名)」为**不同腿集**(轮次不同)。
288
+ - F1 缺口闭合(自建非同源形态实测)与 no_terms 口径(`scanned==kept==201`)见 §3.3;守卫三模式 rc=0(六变异逐处==预期);防误删自检:删⑥ → `gaps=['len:5≠6','缺: ⑥']`、四入口全 rc=2;夹具零残留;同步面 mode_parity rc=0(64/0、SAME(15)/DIFF(0)、负对照精确)。
289
+ - **结论**:两条最小条件经自建场景与独立复算均成立;**未发现反例**。
290
+ - **本轮 uncovered**(7 条,转录):
291
+ 1. **在役库面未取证**(硬边界:未触在役数据根):17882 规模真库成本与构成、F4「在役纪律投影节点 tags 词形令 `_is_discipline` 判 False」的实效;
292
+ 2. **报告与工作树漂移**(材料层)——`cons200_...实施记录_v1.0.md` 仍为第一轮快照;**本报告即该条的报告侧收口**(该文档本身按硬边界未改;加注记的处置见 §六);
293
+ 3. **F2 诚实边界另一支未独立构造**(面外、无 `rejection_terms` 的旧节点、仅声明生效条件的 pos 面冲突)——仅由守卫 docstring 声明覆盖;
294
+ 4. **未复跑项**(按复核任务边界):全量 `scripts/run_tests.py`、容器两栈、`test_mode_parity --mutate`(其中全量已由**本报告撰写轮**补齐实跑:311/311 rc=0;其余两项仍未复跑);
295
+ 5. **部署面**:在役常驻 MCP 进程须重启生效、重启后成本形态未测;
296
+ 6. **H-4(a) 快照纪律**仅读码核到(`consistency.py:585`),未做专项运行时测试(注:h4 守卫本体 43/0 由本报告实跑复核,见 §四);
297
+ 7. 系统临时区仍留有执行者时代的 `cons200_*` 材料目录(非本轮生成、未清理以免动他人材料)。
298
+
299
+ ---
300
+
301
+ ## 六、边界与未覆盖(含面外残余与留池面)
302
+
303
+ **面外残余(已声明边界;措辞按证据强度修订)**:非同源形态下面外节点(条目未标纪律、盘面是纪律)在候选超限时不被精比。**在复核与实现所检的协作写路径下未发现该形态**(写路径经索引增量日志保持条目与盘面同源;非合作写者协议声明见 `mdcg.py:1714-1716`、`readcache` 同款声明)——但**非合作写者路径在在役库中的实际可达性与规模未取证**(uncovered#1),且「在役纪律投影节点词形是否令 `_is_discipline` 判 False」未取证:故本边界是**已声明的探测边界**,不是「已证明全局不存在」。守卫 F2(`:537`)与 docstring `:528-532` 同款声明;第二轮复核实测两树同判 ACCEPT。
304
+
305
+ **留池面(本轮仍不修/未测)**:
306
+ 1. **在役库取证**:17882 规模成本与构成、F4 词形实效(`_is_discipline` 对 `work-discipline` 词形判 False 已实证为纯函数——**本报告实跑**复核:`_is_discipline({'tags': ['work-discipline','discipline:1','harness:all','v1.1']}, ...)`→False,对照 `['discipline']`→True、id 前缀 `discipline_*`→True;原出处=实施记录 v1.0 §5.2 F4 同款实跑。「纪律 REJECT 面对在役投影节点整体失效」与否取决于在役库构成——未取证不下结论);
307
+ 2. **F2 诚实边界的 pos 面覆盖缺口**:设计上由条件索引方向解决(`_SCAN_HINT` 指向设计稿),本批不做覆盖断言;
308
+ 3. **部署面**:常驻 MCP 重启生效与重启后成本形态未测;**重启的执行者/时点与补测口径=材料未含(待决,材料侧无此信息)**;
309
+ 4. **MAX_SCAN 数值与判据阈值**:不改(契约禁止面)——`rejection_terms` 只覆盖负条件面、条件级检测非语义蕴含(模块诚实边界);
310
+ 5. **材料层**:`cons200_...实施记录_v1.0.md` 保持第一轮快照(硬边界:本报告只写一个文件)——**是否给它加一行指向本报告的注记**:需改另一文件、超出本报告硬边界,留给维护者;未加注记前的状态口径以本报告为准。
311
+
312
+ **本报告硬边界遵守情况**:只改本文件(`cons200_冲突检测选面_实施记录_v1.1.md`,v1.1-r1 修订);未改任何源码;未 `git add/commit/push`;未触在役数据根;报告无明文凭据。
313
+
314
+ **只读直跑留痕**(工作纪律第 17 条「L1 只读判定可直跑」层级——**非** §二 复现腿 L1):本报告实跑命令(守卫三模式、⑥红项探针、mode_parity 正向、h4 守卫、big 库读数复现、`scripts/run_tests.py md_cg`、`scripts/run_tests.py` 全量、sha256/行数、`git rev-parse/status/show`、全仓检索)——全部只读判定/临时目录建库,可逆、不改仓库状态;跑完后三文件 sha256 与 `git status` 逐位未变。
315
+
316
+ ---
317
+
318
+ ## 七、读者反馈处置(v1.1-r1 修订明细)
319
+
320
+ | # | 反馈条目(类别) | 处置 | 落点 |
321
+ |---|---|---|---|
322
+ | 1 | 断言编号无图例;「核心 A1/B2/B5」无法判断(unclear) | **补证据**:新增 §0.2 全 27 条图例+legacy 判据源码(`:762-767`)与三条核心语义 | §0.2 |
323
+ | 2 | H-4(a) 未展开;「43/0」无主语(unclear) | **补证据**:§0.5 给出 H-4(a) 定义与出处;43/0=h4 守卫「43 通过/0 失败/0 跳过」(本报告实跑) | §0.5、§4.1 |
324
+ | 3 | 「过滤后索引序前 limit」定义缺失(unclear) | **补证据**:§0.5/§1.2 给出谓词、被滤集合、计数基准、与预筛的关系 | §0.5、§1.2 |
325
+ | 4 | §5.1/§5.2 数目集合互不闭合(unclear) | **改措辞+标注**:两处「截断」计数分属两场景集;19/20 例外=递归场景;四条腿实列五名、第二轮六条腿点名;24/22/2 与 20→24 差集标注「材料未给」 | §5.1、§5.2 |
326
+ | 5 | 变异新旧值无法对应(unclear) | **补证据**:§0.3 变异表配对 ①7→8、②10→11、③14→19、④8→10、⑤2→4、⑥新增 5 | §0.3 |
327
+ | 6 | legacy 判红机制与 F1/F4 缺席(unclear) | **补证据**:判据=核心三条全红(源码);F1/F4 按设计绿+实测⑥红项名单(F1/F3/F4/D3/E4)双向证实 | §四 4.1 |
328
+ | 7 | no_terms 未定义(unclear) | **补证据**:§0.5 定义(`:587`)+§二 载荷归类注 | §0.5、§二 |
329
+ | 8 | 两处「L1」同符号(unclear) | **改措辞**:§0.1 编号体系一览+文末改称「只读直跑(纪律第 17 条 L1 层级)」 | §0.1、文末 |
330
+ | 9 | L9 读数与最终口径对不上、版本未标(unsupported) | **补证据**:§二 L9 加采集版本(面内例外前)+最终版同构库读数(本报告实跑:P_DISC scanned=201)+1→201 差异解释 | §二末 |
331
+ | 10 | 「截断不静默」在 MdCG.add 落不到实处、四级/五项不符(unsupported) | **补证据**:§四注给出实测落点(库根 jsonl 含读数);§五按五项照录并注明材料「四级」称法 | §四、§五 |
332
+ | 11 | 17882 当事实、未取证(unsupported) | **改措辞**:标注出处与未取证;F4 纯函数实证给双出处(本报告实跑+实施记录 §5.2 F4) | §1.1、§六 |
333
+ | 12 | 面外残余「无此形态」绝对语气(unsupported) | **改措辞**:「协作写路径下未发现该形态」+协议声明出处+可达性未取证保留 | §六 |
334
+ | 13 | 部署断言无来源(unsupported) | **改措辞**:标注「转录自修复段材料;确认方式未随材料提供,未独立核实」 | §4.2 |
335
+ | 14 | 文件名 v1.0 vs 版本 v1.1、是否有 v1.0(next) | **说明**:首部注明「路径由任务指定、版本行由收口轮决定,非笔误」;检索 0 命中已录 | 首部 |
336
+ | 15 | 重启由谁/何时/口径(next) | **边界**:材料未含——登记为待决 | §六-3 |
337
+ | 16 | 旧文档加注记(next) | **边界**:需改另一文件、超出「只写一个文件」硬边界——留给维护者 | §六-5 |
338
+ | 17 | 豁免后 kept/truncated 值漂移谁兜(next) | **补证据**:§3.4 豁免语义(跨代键差)+值口径由 cons200 守卫兜、mode_parity 只钉在场 | §3.4 |
339
+ | 18 | §二是否按交付版本重跑(next) | **部分补**:L9 已给最终版读数;其余腿为 HEAD 行为采集(无版本歧义),重跑全表超出本修订范围——如实标注 | §二末 |
340
+ | 19 | 非可比/例外场景内容(next) | **边界**:材料未给清单(如实标注);不推论其是否落在 F2 类缺口 | §5.1、§5.2 |