@furongjun1999/dsh-memory 0.7.2 → 0.7.3

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 (114) hide show
  1. package/README.md +56 -47
  2. package/codebuddy/CODEBUDDY.md +6 -6
  3. package/docs/README.md +148 -144
  4. package/docs/discipline/harnesses.yaml +16 -8
  5. package/docs/discipline/templates/zcode-user.md.tmpl +49 -0
  6. package/docs/eval/AGI/344/270/203/347/273/264/350/257/204/345/210/206/346/212/245/345/221/212_/345/205/255/345/256/266/350/256/260/345/277/206/347/263/273/347/273/237/345/220/214/345/260/272/345/256/236/346/265/213_v3.1.md +340 -0
  7. package/docs/eval/N225_/347/264/242/345/274/225/346/227/245/345/277/227/351/235/236/345/257/271/350/261/241/350/243/205/350/275/275/351/235/242/347/261/273/345/236/213/351/227/270_v1.0.md +2 -2
  8. 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 +1 -1
  9. 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 +1 -1
  10. package/docs/eval/issue43_/351/273/230/350/256/244/347/255/226/347/225/245/344/270/216/351/224/256/347/261/273/345/236/213/351/227/270_v1.1.md +1 -1
  11. package/docs/eval/issue43_/351/273/230/350/256/244/347/255/226/347/225/245/345/212/240/350/275/275/344/270/216/345/207/255/346/215/256/346/230/216/346/226/207/351/230/237/345/210/227_v1.0.md +2 -2
  12. 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 +5 -5
  13. 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 +9 -9
  14. 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 +4 -4
  15. 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 +1 -1
  16. 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 +1 -1
  17. 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 +3 -3
  18. 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 +3 -3
  19. 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 +7 -7
  20. package/docs/eval//344/274/230/345/214/226/347/254/254/344/270/200/346/211/271_/346/216/245/347/272/277/344/270/216/347/255/211/344/273/267/345/217/230/346/215/242_v1.0.md +2 -2
  21. package/docs/eval//344/274/230/345/214/226/347/254/254/344/270/211/346/211/271_/351/227/250/347/246/201/350/275/254/346/255/243/344/270/216/350/260/203/345/272/246/346/255/242/350/241/200/344/270/216/351/227/250/346/216/247/346/224/266/345/217/243_v1.0.md +1 -1
  22. package/docs/eval//344/274/230/345/214/226/347/254/254/344/272/214/346/211/271_/344/276/235/350/265/226/351/200/217/344/274/240/344/270/216/345/257/271/346/213/215/345/217/243/345/276/204/344/270/216/350/264/237/347/274/223/345/255/230_v1.0.md +7 -7
  23. 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 +10 -10
  24. package/docs/eval//345/217/221/345/270/20307_/345/244/226/351/203/250/346/212/245/345/221/212/345/233/233/346/211/271/344/277/256/345/244/215/344/270/216/346/217/222/344/273/266/351/235/242/345/212/240/345/233/272_v1.0.md +4 -0
  25. 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 +1 -1
  26. package/docs/eval//345/217/221/345/270/20311_/345/244/226/346/212/245/345/205/255/350/277/236/344/277/256/344/270/216/344/270/226/347/225/214/346/250/241/345/236/213/345/272/225/345/272/247_v1.0.md +91 -0
  27. 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 +2 -2
  28. package/docs/eval//347/224/250/346/210/267/350/243/201/345/206/263/345/244/204/347/275/256_/347/254/254/344/270/200/346/211/271_v1.0.md +195 -0
  29. package/docs/eval//347/224/250/346/210/267/350/243/201/345/206/263/345/244/204/347/275/256_/347/254/254/344/272/214/346/211/271B6_/346/234/254/346/234/272/350/267/257/345/276/204/347/233/270/345/257/271/345/214/226_v1.0.md +78 -0
  30. package/docs/eval//347/253/257/345/210/260/347/253/257LoCoMoQA/345/220/214/345/217/243/345/276/204/345/257/271/347/205/247_v1.0.md +1 -1
  31. package/docs/eval//347/253/257/345/210/260/347/253/257/345/271/262/346/211/260/346/261/240/350/257/204/346/265/213_/347/241/256/345/256/232/346/200/247/350/243/201/345/206/263vsLLM_judge_v1.1.md +3 -3
  32. 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 +1 -1
  33. package/docs/eval//347/274/226/347/240/201/351/235/242/345/211/215/347/275/256_/345/205/245/345/217/243/350/207/252/344/277/235/350/257/201UTF8/344/270/216/346/226/207/346/234/254open/345/256/210/345/215/253_v1.0.md +1 -1
  34. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v26.md +196 -0
  35. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v27.md +259 -0
  36. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v28.md +217 -0
  37. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v29.md +270 -0
  38. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v30.md +231 -0
  39. package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v31.md +281 -0
  40. package/docs/hive//345/256/211/345/205/250/345/256/241/350/256/241/345/256/236/351/224/232_v0.1.md +1 -1
  41. package/docs/hive//350/234/202/345/267/242M6_ingest/345/256/236/346/226/275/350/256/241/345/210/222_v0.1.md +1 -1
  42. package/docs/hive//350/234/202/345/267/242/345/217/214/345/256/236/344/276/213/344/272/222/351/252/214_/350/256/276/350/256/241/345/256/232/347/250/277.md +1 -1
  43. package/docs/hive//350/234/202/345/267/242/350/256/276/350/256/241_/347/220/206/350/256/272/345/257/271/351/275/220_v0.1.md +17 -17
  44. package/docs/hive//350/234/202/345/267/242/350/277/255/344/273/243_/345/256/217/350/247/202/344/270/216/347/276/244/344/275/223/350/260/203/345/272/246_v0.1.md +1 -1
  45. package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +2 -2
  46. 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 +42 -41
  47. package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +29 -8
  48. 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 +71 -1
  49. package/docs/plans//345/205/250/344/270/255/346/226/207/347/274/226/347/240/201/344/270/216/350/234/202/345/267/242/344/273/273/345/212/241/346/240/207/350/257/206/345/245/221/347/272/246_v2.0.md +1 -1
  50. package/docs/plans//345/244/232/344/270/273/344/275/223/344/270/226/347/225/214/346/250/241/345/236/213_/345/257/271/351/275/220/350/257/204/344/274/260/344/270/216/350/220/275/345/234/260/350/256/276/350/256/241_v0.1.md +141 -0
  51. 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 +2 -2
  52. package/docs/plans//350/257/255/344/271/211/346/227/266/347/251/272/345/233/276/350/241/245/345/205/250_/344/270/226/347/225/214/346/250/241/345/236/213/345/212/237/350/203/275/347/253/257_/350/256/276/350/256/241_v0.1.md +107 -0
  53. 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 +6 -5
  54. package/docs//347/247/244_/350/256/260/345/277/206/347/263/273/347/273/237/350/257/204/346/265/213/350/247/204/350/214/203_v2.1.md +225 -0
  55. package/dsh/cordis-patch-profile-web.example.yml +2 -2
  56. package/lib/bridge.js +9 -0
  57. package/lib/hooks.d.ts +8 -1
  58. package/lib/hooks.js +94 -32
  59. package/lib/lib/hook_audit.d.ts +55 -0
  60. package/lib/lib/hook_audit.js +208 -0
  61. package/lib/lib/mutual.js +5 -1
  62. package/lib/lib/roleplay_web.js +17 -2
  63. package/md_cg/auditview.py +248 -0
  64. package/md_cg/bench_e2e_judge.py +4 -2
  65. package/md_cg/branches.py +29 -3
  66. package/md_cg/consistency.py +38 -13
  67. package/md_cg/datapath.py +38 -11
  68. package/md_cg/forgetting.py +15 -2
  69. package/md_cg/freshness.py +32 -11
  70. package/md_cg/ghostref.py +130 -0
  71. package/md_cg/judgment_manifest.py +7 -0
  72. package/md_cg/mcp_server.py +58 -1
  73. package/md_cg/mdcg.py +4923 -4822
  74. package/md_cg/mdcos.py +31 -12
  75. package/md_cg/nodefile.py +77 -13
  76. package/md_cg/readcache.py +29 -4
  77. package/md_cg/selfreport.py +12 -3
  78. package/md_cg/sleep.py +129 -13
  79. package/md_cg/sources.py +1 -1
  80. package/md_cg/state_events.py +131 -0
  81. package/md_cg/sustain.py +1436 -1436
  82. package/md_cg/test_auditview.py +277 -0
  83. package/md_cg/test_autonomy_modes.py +2 -1
  84. package/md_cg/test_boot_openblas_guard.py +197 -0
  85. package/md_cg/test_ccg_form_parity.py +95 -4
  86. package/md_cg/test_cons200_scan_selection.py +4 -2
  87. package/md_cg/test_datapath_device_name.py +62 -3
  88. package/md_cg/test_generation_guard.py +5 -2
  89. package/md_cg/test_ghostref.py +182 -0
  90. package/md_cg/test_interop.py +1 -1
  91. package/md_cg/test_issue52_scan_condition_first.py +1 -1
  92. package/md_cg/test_lock.py +16 -7
  93. package/md_cg/test_m3_h9_semantic_guard.py +1 -1
  94. package/md_cg/test_n230_dirty_replay.py +375 -375
  95. package/md_cg/test_n238_body_text_parity.py +156 -0
  96. package/md_cg/test_n276_probe_hoist.py +199 -0
  97. package/md_cg/test_p4_freshness.py +95 -1
  98. package/md_cg/test_policy_required_ccg.py +3 -1
  99. package/md_cg/test_readcache_prodpath.py +66 -0
  100. package/md_cg/test_sleep.py +58 -1
  101. package/md_cg/test_sleep_p1.py +218 -2
  102. package/md_cg/test_state_events.py +178 -0
  103. package/md_cg/test_time_core_lint.py +8 -1
  104. package/md_cg/test_writepipe.py +8 -5
  105. package/md_cg/tokens.py +11 -2
  106. package/md_cg/writepipe.py +76 -0
  107. package/package.json +2 -2
  108. package/skills/plugin.json +1 -1
  109. package/src/bridge.ts +9 -0
  110. package/src/hooks.ts +576 -517
  111. package/src/lib/hook_audit.ts +243 -0
  112. package/src/lib/mutual.ts +5 -1
  113. package/src/lib/roleplay_web.ts +17 -2
  114. package/zcode/AGENTS.md +6 -6
@@ -0,0 +1,217 @@
1
+ # 缺陷挖掘 · 自主迭代 第 29 轮报告(swarm 域深挖)
2
+
3
+ > **报告文件**:`docs/eval/缺陷挖掘_自主迭代_v28.md`(文件序号 v28;**轮次号为第 29 轮**——按文件序号序列推定:v26 = 第 27 轮 hive 面、v27 = 第 28 轮 compiler 面,故 v28 顺推为第 29 轮;材料未显式给出轮次号,此系本席推定,**非材料所载**)。
4
+ > **扫描域**:`swarm/` 域(`rust_runtime/src/*.rs` 运行时 + `rust_swarm.py` 验签/编排 + `swarm_cli.py` 命令面 + `swarm/tests/*`)为主,另含 `md_cg/nodefile.py` 两条(候选池带入)。
5
+ > **候选池**:14 条(材料 ① 四区候选与独立复核结论)。**分诊**:`fix 7`(N243–N249)/ `defer 2` / `rejected 0`(材料 ②)。
6
+ > **首次编写**:本文件此前不存在(本席实跑 `ls docs/eval/缺陷挖掘_自主迭代_v28.md` → 不存在;`ls docs/eval/ | grep 缺陷挖掘_自主迭代` 最大为 v27)。
7
+
8
+ **行号口径**:全文行号一律为**本席亲读的现工作区行号**(本工作区已含本轮 N243–N247 的未提交改动,故多数行号与材料 ① 的缺陷时点行号不一致);与材料不一致处逐条注明「材料时点行号」。
9
+
10
+ ---
11
+
12
+ ## 一、执行摘要
13
+
14
+ 1. **扫描面**:候选池 14 条,其中 **属实(real)10 条**、**已被既有缺陷号覆盖(already_covered)4 条**、`false_positive` 0 条(材料 ① 逐条 verdict)。
15
+ 2. **分诊**(材料 ② 分诊席):属实 10 条中 → `fix 7`(编号 **N243–N249**)/ `defer 2` / `rejected 0`。分诊时点编号实占最大 = **N242**(材料 ② numberingEvidence;N241/N242 仅登记于 v27 报告、主题为 `md_cg/nodefile.py`)。
16
+ 3. **实际落地**(本席实跑核验工作区):**已落地 5 条 = N243 / N244 / N245 / N246 / N247**,源码注释与守卫均在位(`git grep -nE 'N24[3-9]' -- swarm/` 命中 N243–N247);**分诊列出的 N248 / N249 未落地**——`git diff --stat HEAD -- swarm/swarm_cli.py` **空输出**,`swarm_cli.py` 不在工作区改动面内(`git status --porcelain` 6 项 `M` 不含它)。材料 ③ 亦**只**提供 N243–N247 五条的红/绿守卫读数,未含 N248/N249(详见 §二-附 与 §五)。
17
+ 4. **编号实占核对(硬要求 ③)**:分诊时点(② 席)最大 = **N242**;本席现跑 `git grep -ohE 'N[0-9]{3,4}' | tr -d 'N' | sort -n -u | tail -8` → `241 242 243 244 245 246 247 802`,其中 N243–N247 即本轮已落地五条,**802 为 flake8 `# noqa: N802` lint 码(非缺陷号,已剔除)**。故本席现跑实占最大 = **N247**。分诊给出的 N243–N249 连号与既占面(N241/N242 属 md_cg,非同对象)无冲突。
18
+ 5. **缺口(如实标注)**:候选池中「`swarm/tests/test_swarm_fault.py:107-110` 恒真断言」(材料 ① 第 7 条,verdict=real / severity low)在材料 ② 分诊中**既未列 fix、也未列 defer/rejected**,无编号。本报告按同族(N160 已登记的恒真断言形态)建议顺延编 **N250**,请编排会话裁决(详见 §五-③)。
19
+ 6. **回归**:全量回归退出码 0(327 条 PASS,材料 ④);swarm Rust crate 单独补跑退出码 0(材料 ④,该 crate **不在**主门禁 cargo 腿覆盖面内,系本轮单独补跑)。
20
+
21
+ ---
22
+
23
+ ## 二、修复清单
24
+
25
+ > **读数来源声明**:本节所有「红基线/绿态」命令与输出均**来自材料 ③(修复席)**,**并非本席实跑**;本席实跑部分(工作区状态、现码行号、编号扫描)见 §四,逐条标注。材料 ③ 中未出现的条目(N248/N249)本节列为「分诊已定 · 未落地」,不给守卫读数(因材料未提供,本席未复跑)。
26
+
27
+ ### 已落地 5 条(N243–N247)
28
+
29
+ #### N243 · 收件箱(结构化数组)进不了实例 VM 符号表
30
+
31
+ - **where(现行)**:`swarm/rust_runtime/src/swarm.rs:737`(`fn run_round`)内收件箱块 `:753-782`,注入行 `:778-781`;消费侧 `swarm/rust_runtime/src/serve.rs:64-78`(`to_vm_value` 对 List/Obj 落 `:76 _ => return None`)与 `:258`(`else if let Some(vv) = v.to_vm_value()` 静默跳过)。
32
+ - *材料时点行号*:swarm.rs:728-736(注入行 :735)/serve.rs:64-78/serve.rs:231。
33
+ - **缺陷面**:协调器把收件箱以 JSON **数组**形态编入实例请求 symbols 的 `"收件箱":[{from,payload},…]`,但 serve 的 `to_vm_value` 对 List/Obj 一律 `return None` 被静默跳过——符号从未进 VM 符号表(VM 值模型仅 Null/Bool/Int/Float/Str,`vm.rs:32-38`),程序一引用即 `vm.rs:357`「名实不符:'收件箱' 未声明(以名举实)」;而 WAL/ACK/水位照记「已投递」,留痕与实际投递不符,载荷只完整留在 WAL。
34
+ - **修复**:协调器侧按 `condition_space` 既有口径(`serde_json_like::escape` 单点)把该数组序列化成 **JSON 文本**注入(`swarm.rs:778-781`),serve 走 Str 臂承载;内层 `from` 同步 escape(`:772`)。未动 serve.rs(避免复制第二份序列化判据)。
35
+ - **守卫**:`swarm/tests/test_swarm_inbox_delivery.py`。
36
+ - **红基线 → 绿态(材料 ③)**:
37
+ - 红:`PYTHONUTF8=1 python -m swarm.tests.test_swarm_inbox_delivery`(HEAD 运行时代码)→ `14 passed, 2 failed`;判别器读数 `[✗] 乙符号表含「收件箱」 — keys=['已收消息数']`、`[✗] 收件箱 = JSON 文本且两条载荷逐字节保真 — None`。
38
+ - 绿:同命令修后 → `16 passed, 0 failed`;读数 `[✓] 乙符号表含「收件箱」 — keys=['已收消息数', '收件箱']`、`[✓] 收件箱 = JSON 文本且两条载荷逐字节保真 — [{"from":"实例甲","payload":"11"},{"from":"实例甲","payload":"22"}]`。
39
+ - 材料 ③ 另载:`cargo test`(临时 target)→ `10 passed; 0 failed`;`python scripts/run_tests.py swarm` → `14/14 通过,2 跳过`。
40
+ - **severity**:high(材料 ①/③)。
41
+
42
+ #### N244 · Rust VM 四处跳转/入口地址无范围校验
43
+
44
+ - **where(现行)**:`swarm/rust_runtime/src/vm.rs` — 单点 `fn set_ip` `:372`(`:373-381` 判据);四处调用点 `JUMP :442`、`JUMP_IF_FALSE :447`、`ZHIZU :480`、`CALL :529`;`code_len` 字段 `:74`、`run()` 置界 `:298`、循环守卫 `:331`。
45
+ - *材料时点行号*:vm.rs:393/:398/:431/:480(旧式 `self.ip = … as usize`)。
46
+ - **缺陷面**:四处写入 `self.ip` 前全无 `[0, code.len()]` 范围判定——负目标被 `as usize` 折成巨大无符号数(`JUMP -1` → 2^64-1)、超界目标原样写入,二者都让 `vm.rs:331 while self.ip < code.len()` 立即为假、`run()` 返回 Ok(halt=null、进程 exit 0),其后指令整段不执行且无诊断(静默错误);Python 侧 `compiler/condition_vm.py:239 _jump`(N239)已做单点校验 → 双后端语义分叉。
47
+ - **修复**:抽 `set_ip(target: i64) -> Result<(), VmError>` 单点,判据复用 Python N239(目标须 ∈ `[0, code_len]`,**上界取 `<=` 而非 `<`**——`== code_len` 是编译器产出的「跳到程序末尾」既有语义);四处写入点统一改走它。RETURN 的 `self.ip = fr.ret_ip`(`:536`)未纳入(ret_ip 只由 CALL 在 `:520` 保存为已自增的合法 ip,`call_stack` 无指令可写,无伪造面)。
48
+ - **守卫**:`swarm/tests/test_rust_vm_jump_guard.py`(新增)+ `vm.rs` 内 `#[cfg(test)] jump_guard_tests` 模块(`:662`)。
49
+ - **红基线 → 绿态(材料 ③)**:
50
+ - 红:`CARGO_TARGET_DIR=$(mktemp -d)/target PYTHONUTF8=1 cargo test --manifest-path swarm/rust_runtime/Cargo.toml` → `FAILED. 11 passed; 3 failed`;`PYTHONUTF8=1 python -m swarm.tests.test_rust_vm_jump_guard` → `5 passed, 9 failed`(八处坏目标读数全为 `rc=0 … {"halt":null,…}`)。
51
+ - 绿:同两条命令 → cargo `14 passed; 0 failed`;py `14 passed, 0 failed`(越界全 `rc=1`,stderr 点明「跳转目标越界:-1(合法地址 0..=4)——负值不得回绕、超界不得静默结束」)。
52
+ - 材料 ③ 另载:`python scripts/run_tests.py swarm` → `15/15 通过,2 跳过`;`run_tests.py compiler` → `22/22 通过,0 跳过`。
53
+ - **severity**:high(材料 ③;材料 ① 原判 medium——**两处不一致,本席如实并列**:材料 ① 复核席判 medium,材料 ③ 修复席 status=verified 标 high)。
54
+
55
+ #### N245 · 手写 JSON 写/读转义集不对称
56
+
57
+ - **where(现行)**:写侧 `swarm/rust_runtime/src/swarm.rs:239-254`(`escape`,**未改动**);读侧三处——`swarm.rs:345-393`(`ps`,新增臂 `:366 \r`、`:367 \b`、`:368 \f`、`:369-386 \uXXXX`)、`serve.rs:171-218`(`parse_str`,新增臂 `:190/:191/:192/:193-210`)、`main.rs:113-152`(`parse_json_string` 字节版,新增臂 `:132/:133/:134/:135-149`)。
58
+ - *材料时点行号*:swarm.rs:239-254(写)/:345-366(读)/serve.rs:171-192(读);材料未点出 main.rs 这第三处读侧。
59
+ - **缺陷面**:写侧 `escape` 产出 `{ \" \\ \n \r \uXXXX }`,三处读侧只认 `{ \" \\ \n \t }`——集合不相容。三面后果:①符号值含制表符(写侧产 `\u0009`)→ 实例请求行解析失败、终态恒为 error,而协调器 rc=0 照发 ACK/推进水位(静默错误);②WAL 载荷含 `\u0009` → 提交点扫描首行即断 → 合法 WAL(Python 侧 `verify_wal_signatures` 裁定 `all_valid=True`)被误标 `.corrupt-<ts>` 并从轮 1 重跑,破坏「同 project+同 WAL 重入即续跑/幂等」契约;③配置或 `--symbols` 含标准 `\r` 转义 → 整进程 exit 2。
60
+ - **修复**:**扩读侧**为写侧的超集(补 `\r \b \f \/ \uXXXX`,BMP 码点),写侧一字未动。反向收窄写侧会使 WAL 不再是合法 JSON(控制字符裸写非法),故不可取。范围超出材料 ① 列举的两处:`main.rs:113` 同集一并收口。
61
+ - **守卫**:`swarm/tests/test_rust_escape_parity.py`(新增)+ Rust 层守卫(`swarm.rs` `escape_parity_tests :2068` 与 `wal_recovery_tests::commit_point_survives_control_char_escapes :2025`、`serve.rs:355`、`main.rs:406`)。
62
+ - **红基线 → 绿态(材料 ③)**:
63
+ - 红:cargo test → lib `FAILED. 14 passed; 4 failed`、bin `0 passed; 1 failed`;`python -m swarm.tests.test_rust_escape_parity` → `10 passed, 5 failed`(①a 终态恒 error、②出现 `resume.jsonl.corrupt-…`、③配置含 `\r` exit 2 / `--symbols` 拒)。
64
+ - 绿:cargo test → lib `18 passed; 0 failed`、bin `1 passed; 0 failed`;py → `16 passed, 0 failed`(①a 无 error、②无 `.corrupt-*`、③运行成功且载荷保真)。
65
+ - 材料 ③ 另载:`python scripts/run_tests.py swarm` → `16/16 通过,2 跳过`;附带宽免一处既有 G3 守卫的假红(测试 helper `ts` 两次取 `now_ms()` → 改为只取一次)。
66
+ - **severity**:medium(材料 ①/③)。
67
+
68
+ #### N246 · 双后端 trust 快照舍入口径分叉
69
+
70
+ - **where(现行)**:`swarm/rust_runtime/src/vm.rs:278-286`(`fn state`,`:280 trust: round3(self.trust_value)`)+ 单点 `fn round3` `:143-145`(`format!("{:.3}", x).parse::<f64>().unwrap_or(x)`);对照面 `compiler/condition_vm.py:224`(`round(self.trust_value, 3)`,**未改动**)。
71
+ - *材料时点行号*:vm.rs:258(旧 `(self.trust_value * 1000.0).round() / 1000.0`)。
72
+ - **缺陷面**:Rust 旧式 `(x*1000.0).round()/1000.0`(`f64::round` = 半数远离零)与 Python `round(x,3)`(十进制半偶)在并列点分叉(trust ∈ {0.0625, 0.3125, 0.5625, 0.8125} 等,0.0625 → Rust 0.063 / Python 0.062);实测分歧不止并列点(`x*1000.0` 自身不精确致 0.0155→0.016 vs 0.015、0.1235→0.124 vs 0.123、1.2345→1.235 vs 1.234)。破坏 `compiler/SEMANTICS.md §5` 双后端契约,使 `swarm/tests/test_rust_codegen.py:44` 的 `abs(py["trust"] - rs["trust"]) < 1e-9` 等价判据判红。
73
+ - **修复**:抽 `round3` 单点对齐 Python(`format!("{:.3}", x).parse()`,Rust 定点格式先精确十进制展开再半偶),`state()` 改走该单点;Python 侧作参照方未动。
74
+ - **守卫**:`swarm/tests/test_rust_codegen.py` ⑪ 段(`:293-294` 起,双后端逐点对照)+ `vm.rs` `trust_round_tests` 模块(`:852`)。
75
+ - **红基线 → 绿态(材料 ③)**:
76
+ - 红:cargo test → `FAILED. 18 passed; 2 failed`(`并列点 0.0625 应半偶舍入为 0.062,得 0.063`);`python -m swarm.tests.test_rust_codegen` → `28 passed, 11 failed`。
77
+ - 绿:cargo test → `20 passed; 0 failed`、bin `1 passed; 0 failed`;py → `39 passed, 0 failed`(⑪ 段 16 例全绿)。
78
+ - 材料 ③ 另载:`python scripts/run_tests.py swarm` → `16/16 通过,2 跳过`;`python -m compiler.tests.test_defect_regression` → `18/18 通过`。口径实测依据(一次性探针):4019 例语料中 `format+parse` 与 CPython `round(x,3)` 0 例不等,旧公式 9 例不等。
79
+ - **severity**:medium(材料 ③;材料 ① 亦 medium)。
80
+
81
+ #### N247 · 收件箱编串 `from` 裸插 → 请求信封击穿
82
+
83
+ - **where(现行)**:`swarm/rust_runtime/src/swarm.rs:770-774`(`serde_json_like::escape(from)`;与同函数 condition_space 五要素 `:790-794` 同口径)。
84
+ - *材料时点行号*:swarm.rs:731(`format!("{{\"from\":\"{}\",\"payload\":{}}}", from, payload)` 裸插)。
85
+ - **缺陷面**:`run_round` 编收件箱逐条时 `from`(来源实例 id,来自用户 config、无校验)**裸插**,含 `"`/`\` 时整条请求行 JSON 结构被击穿,serve 回「请求 JSON 非法:对象结构非法」的 error 对象被 `run_round` 当作合法终态吞下、CLI 仍 rc=0(静默错误:载荷从未进任何符号表,WAL/ACK/水位照记已投递)。同函数 condition_space 五要素早已走 `escape`,`from` 未走。
86
+ - 材料 ① 对该候选末句的更正(如实):其「WAL 里没有任何失败请求的留痕」不准确——WAL 的 `__snapshot__` 行 payload 载有失败终态,并在后续轮产出「修正信号」;未被留痕的只是失败请求字节本身。
87
+ - **修复**:把 `from` 外包 `serde_json_like::escape(from)`(复用同文件既有单点)。**关键如实说明**:该逃逸本体已在同一工作区的 N243 批(未提交)落地(现行 `swarm.rs:772` 已是 escape);材料 ③ 于本 ask 未再改运行时代码,交付的是守卫 scenario_d 与红/绿同命令证据。
88
+ - **守卫**:`swarm/tests/test_swarm_inbox_delivery.py` scenario_d(`:163-172`)。
89
+ - **红基线 → 绿态(材料 ③)**:按指定法(`git show HEAD:<文件>` 覆盖临时副本后跑守卫,sha 校验):
90
+ - 红:`PYTHONUTF8=1 python -m swarm.tests.test_swarm_inbox_delivery` → `16 passed, 4 failed`;N247 面读数 `[✗] 收方终态无 error — 请求 JSON 非法: 对象结构非法`、`[✗] 来源标识逐字节保真 — None`(另两处红为 scenario_c / N243 面,属 HEAD 未含 N243 改动的预期)。
91
+ - 绿:还原后同命令 → `20 passed, 0 failed`;读数 `[✓] 收方终态无 error — None`、`[✓] 来源标识逐字节保真 — [{"from":"实\"例\\甲","payload":"11"}]`。
92
+ - 材料 ③ 另载:cargo test → lib `20 passed; 0 failed`、bin `1 passed; 0 failed`;`run_tests.py swarm` → `16/16 通过,2 跳过`。
93
+ - **severity**:medium(材料 ① 判 low、材料 ③ 判 medium——**不一致,如实并列**)。
94
+
95
+ ### 附:分诊已编号但**未落地** 2 条(N248 / N249)
96
+
97
+ > 材料 ② 分诊将二者列为 `fix`,但**本席实跑确认工作区未含其改动**:`git diff --stat HEAD -- swarm/swarm_cli.py` **空输出**;`swarm_cli.py` 不在 `git status --porcelain` 的改动面(6 项 `M` 为 4 个 `.rs` + 2 个 test)。材料 ③ **未提供**这两条的红/绿守卫读数。故本节**不给读数**、不冒充实修,状态记「分诊已定 · 未落地」。
98
+
99
+ - **N248**(`swarm/swarm_cli.py:102-107`,报告写盘非原子):`open(out_path,"w")` 先截断再 `json.dump`,写中途失败(磁盘满/被杀)会留下被截断的报告并已先毁同路径旧报告;同命令消费的 WAL 走 `swarm.rs:650 rewrite_wal_atomic`(tmp+flush+fsync+rename,现行行号;材料时点 :621-642)原子换入——同一命令内「落盘原子性」两套口径不对称。建议修法(材料 ②):改走与 WAL 同口径的原子写单点。severity low(材料 ①)。
100
+ - **N249**(`swarm/swarm_cli.py:150-169`,`main` 的 argparse 面):用法错(缺 `--config`/缺子命令/`--timeout` 非整数/未知子命令)由 argparse `error()` 写 stderr 并 `sys.exit(2)`,在 `:168-169 args = p.parse_args(argv); args.fn(args)` 之前退出——stdout 恒 0 字节,破坏文件头 `:5`「stdout 恒为单行 JSON(机器面)」契约。与已登记 v5 N25 同契约但非同对象(N25 登记面 `swarm_cli.py:66-67` 全在 `cmd_run/cmd_verify` 体内)。建议修法(材料 ②):把 `parse_args` 包进 `try/except SystemExit` 经既有 `_fail` 单点输出单行 JSON(rc=2)。severity low(材料 ①)。
101
+ - 本席读核(现行):`swarm_cli.py:5` 文件头契约、`:144` 生效条件注释、`:150-152` `add_subparsers(dest="cmd", required=True)`、`:155 --config required=True`、`:159 --timeout type=int`、`:168-169` 解析后调用 —— 与材料 ① 描述一致,`_emit/_fail`(`:42-51`)未参与 argparse 面。
102
+
103
+ ---
104
+
105
+ ## 三、发现明细(全量复核表)
106
+
107
+ > **结论与严重度来源**:均为材料 ①(四区候选与独立复核席);**去向/编号**列中,N243–N247 经本席实跑确认源码注释在位,N248/N249 经本席实跑确认未落地(见 §二-附),4 条 already_covered 的本席读核见下附注。
108
+
109
+ | # | where(缺陷时点/现行) | 结论 | severity | 覆盖号 | 去向 / 编号 | 复核证据来源 |
110
+ |---|---|---|---|---|---|---|
111
+ | 1 | `swarm/rust_swarm.py:147-166`(`rec.get("seq",0)`/`rec["type"]` 在 :154;`line.index('"payload":')` 在 :151;`except` 元组 :159) | already_covered | medium | v2 N4 | — | 材料 ①;本席读核现码(见附注 A) |
112
+ | 2 | `swarm/rust_runtime/src/swarm.rs:737`(收件箱块 :753-782)↔ `serve.rs:64-78`(:76 None)与 `:258`(消费点) | real | high | — | **fix · N243 · 已落地** | 材料 ①③;本席读核现码 |
113
+ | 3 | `swarm/rust_runtime/src/swarm.rs:770-774`(HEAD 时点 :731 裸插 from) | real | low→medium | — | **fix · N247 · 已落地** | 材料 ①③;本席读核现码 |
114
+ | 4 | `swarm/swarm_cli.py:102-107`(非原子写 with open(…,"w")) | real | low | — | **fix · N248 · 未落地** | 材料 ①②;本席读核现码 + `git diff HEAD` 空 |
115
+ | 5 | `swarm/swarm_cli.py:150-169`(main argparse 面) | real | low | — | **fix · N249 · 未落地** | 材料 ①②;本席读核现码 + `git diff HEAD` 空 |
116
+ | 6 | `swarm/rust_runtime/src/swarm.rs:239-254`(escape 写)/:345-393(ps 读)/serve.rs:171-218/main.rs:113-152 | real | medium | — | **fix · N245 · 已落地** | 材料 ①③;本席读核现码 |
117
+ | 7 | `swarm/tests/test_swarm_fault.py:107-110`(`all(... for h in {}.values())` 空 dict 恒真) | real | low | (同族 N160) | **分诊未覆盖 → 建议 N250(待裁决)** | 材料 ①;本席读核现码(见附注 B) |
118
+ | 8 | `swarm/rust_runtime/src/vm.rs:372`(set_ip)/:442/:447/:480/:529(四处) | real | medium→high | — | **fix · N244 · 已落地** | 材料 ①③;本席读核现码 |
119
+ | 9 | `swarm/rust_runtime/src/vm.rs:278-286`(state)/:143(round3)↔ `compiler/condition_vm.py:224` | real | medium | — | **fix · N246 · 已落地** | 材料 ①③;本席读核现码 |
120
+ | 10 | `swarm/rust_runtime/src/vm.rs:331-335`(仅 max_steps)/:387-397(PUSH_CONST 无深闸)/:618-659(state_json 无规模闸) | real | medium | 姊妹面 N157 | **defer**(与 N157 并号归属待裁决) | 材料 ①②;本席读核现码 |
121
+ | 11 | `swarm/rust_runtime/src/main.rs:164-190`(parse_json_scalar;`end` 裸 find,:175 丢弃正确 next) | already_covered | low | v5 N26 | — | 材料 ①;本席读核现码(见附注 A) |
122
+ | 12 | `swarm/rust_runtime/src/main.rs:304-308`(rounds 只有 `.max(1.0)`,f64→u64 饱和) | real | low | — | **defer**(上界阈值待裁决) | 材料 ①②;本席读核现码 |
123
+ | 13 | `md_cg/nodefile.py:461-467`(has_non_applicable 只认带冒号) | already_covered | medium | N241 | — | 材料 ①;本席读核现码(见附注 A) |
124
+ | 14 | `md_cg/nodefile.py:475-492`(positive_body 只剥标题行) | already_covered | low | N242 | — | 材料 ①;本席读核现码(见附注 A) |
125
+
126
+ **计数核对**:14 条 = real **10**(#2,3,4,5,6,7,8,9,10,12)+ already_covered **4**(#1,11,13,14)+ false_positive **0** ✔(与材料 ① 逐条 verdict 一致)。
127
+
128
+ **附注 A(already_covered 4 条的本席读核)**:
129
+ - #1 → 本席读 `swarm/rust_swarm.py:147-166`:`:148 json.loads`、`:151 line.index('"payload":')`、`:154 rec.get("seq",0), rec["type"], …`、`:159 except (ValueError, KeyError, TypeError)`——元组确不含 `AttributeError`,与 v2 N4 登记的同一崩点面一致。
130
+ - #11 → 本席读 `main.rs:164-190`:`:166-169` `end = start + s[start..].find([',','}']).unwrap_or(s.len()-start)`、`:175 let (s2, _) = parse_json_string(s, start)?;`(正确 next 被丢弃)、`:189 Ok((v, end))`——现行未修,与 v5 N26 同源(v5.md:57 登记为「未修复(遗留)」)。
131
+ - #13 → 本席读 `md_cg/nodefile.py:461-467`:`:467 return "# 不适用条件:" in content or "# 不适用条件:" in content`——只认带冒号形态,与同文件 `:386-402 ccg_mark_present` 口径矛盾;判属 N241(v27.md:77,未落地)。
132
+ - #14 → 本席读 `md_cg/nodefile.py:475-492`:`:489 if s.startswith("#") and s.lstrip("#").strip().startswith(NEG_FIELD): continue`——只剥「`#` 且字段名匹配」那一行,裸形态值行残留为召回键;判属 N242(v27.md:78,未落地)。
133
+
134
+ **附注 B(#7 恒真断言的判据,本席实跑)**:本席实跑 `python -c "all(abs(h['score']-1.0)<1e-9 for h in {}.values())"` → `True`(空可迭代对象 `all()` 恒真,确定性核验);并读核现行 `swarm/tests/test_swarm_fault.py:107-110` 断言语义与材料 ① 描述一致。材料 ① 亦注明其措辞范围需收窄:该断言在「WAL 未整段完成的非幂等续跑臂」上会进入真实求值,故严格说是「实际通过路径上的恒真断言」而非「无条件恒真」。
135
+
136
+ ---
137
+
138
+ ## 四、实跑读数(本会话第一手,均为只读)
139
+
140
+ > **L1 直跑:`git status --porcelain` / `git diff --stat` / `git grep` / `ls` / `python -c`(只读判定,产物落点不改仓库、不改外部状态)— 风险:无(只读);频次:本 ask 内一次性;可逆性:完全可逆(无副作用)。** 按工作纪律第 17 条留痕。
141
+
142
+ 1. **工作区状态**(`git status --porcelain`):
143
+ ```
144
+ M swarm/rust_runtime/src/main.rs
145
+ M swarm/rust_runtime/src/serve.rs
146
+ M swarm/rust_runtime/src/swarm.rs
147
+ M swarm/rust_runtime/src/vm.rs
148
+ M swarm/tests/test_rust_codegen.py
149
+ M swarm/tests/test_swarm_inbox_delivery.py
150
+ ?? .zcode/
151
+ ?? swarm/tests/test_rust_escape_parity.py
152
+ ?? swarm/tests/test_rust_vm_jump_guard.py
153
+ ```
154
+ 本席开工与写报告前两次读数一致(`.zcode/` 为会话前既存未跟踪);`swarm/swarm_cli.py` **不在**改动面。
155
+ 2. **改动面规模**(`git diff --stat`):6 files changed, **707 insertions(+), 17 deletions(-)**(main.rs +51 / serve.rs +68 / swarm.rs +166 / vm.rs +314 / test_rust_codegen.py +40 / test_swarm_inbox_delivery.py +85)。
156
+ 3. **N248/N249 未落地判据**(`git diff --stat HEAD -- swarm/swarm_cli.py`)→ **空输出**;`git grep -nE 'N24[3-9]' -- swarm/` → 命中 N243–N247,**无 N248/N249**;`git grep -nE 'N24[89]|N250'`(全树)→ **0 命中**。
157
+ 4. **编号实占扫描**(`git grep -ohE 'N[0-9]{3,4}' | tr -d 'N' | sort -n -u | tail -8`)→ `241 242 243 244 245 246 247 802`。802 = flake8 `# noqa: N802`(非缺陷号)。故现工作区实占最大 = **N247**;分诊时点(② 席)为 **N242**(材料 ②,因 N243–N247 的注释系本轮落地后才出现)。
158
+ 5. **报告文件不存在**(`ls docs/eval/缺陷挖掘_自主迭代_v28.md`)→ 不存在(本文件为本席新建)。
159
+ 6. **恒真断言判据**(`python -c "all(... for h in {}.values())"`)→ `True`。
160
+ 7. **现码行号读核**(本席以 Read/逐行打印亲读并落为 §二/§三 的「现行行号」):`swarm.rs`(239-254 / 345-393 / 650 / 737-782 / 770-774 / 778-781)、`serve.rs`(64-78 / 171-218 / 245-265)、`vm.rs`(72-74 / 143-145 / 278-286 / 296-335 / 358-382 / 387-397 / 441-447 / 477-480 / 509-536 / 618-659)、`main.rs`(113-152 / 164-190 / 300-311)、`swarm_cli.py`(1-173)、`rust_swarm.py`(130-174)、`test_swarm_fault.py`(100-113)、`test_rust_codegen.py`(42-48 / 293-294)、`md_cg/nodefile.py`(455-495)。
161
+
162
+ **未由本席实跑、全部标注来源的读数(不得冒充)**:
163
+ - 各条守卫**红基线/绿态**命令与输出 → **材料 ③(修复席)**;本席未复跑(红基线须先把产品源码回退到 HEAD 版,ask 明令「不得改动任何产品源码文件」)。
164
+ - **全量回归**「退出码 0(327 条 PASS)」与 **swarm Rust crate 退出码 0** → **材料 ④(回归席)**;本席未跑该项目级回归。
165
+ - **候选复核结论与复现证据** → **材料 ①(四区复核席)**;本席仅读核其现码行号。
166
+ - **双清单自检与命中清单** → **材料 ⑤(自检席)**;本节 §附 的本报告自扫描为**本席实跑**。
167
+
168
+ ---
169
+
170
+ ## 五、遗留清单(defer 逐条给建议去向)
171
+
172
+ 1. **值栈深度 / `state_json` 无独立上限**(材料 ① #10,real / medium):`swarm/rust_runtime/src/vm.rs:331-335` 仅有步数上限 `max_steps`;`:387-397 PUSH_CONST` 无深度闸;`:618-659 state_json` 无规模闸——内存 ∝ 步数×单值大小(材料实测:16 KB 载荷 → 峰值工作集约 1153 MB、stdout 约 328 MB;32 KB 载荷 → 约 2281 MB、stdout 约 655 MB;`.pbc` 本体仅 16/32 KB)。**建议去向**:与既有序号 **N157**(CALL 帧全量克隆/无帧深上限,`vm.rs:470-476`,v19.md:81)**同根因姊妹面**,须由归属席裁决「并号 or 单列」;深度/内存预算阈值取值属设计裁决,**建议编排会话转使用者裁决**后再落地(与 N243 资源闸族一并定阈值)。
173
+ 2. **`rounds` 无上界**(材料 ① #12,real / low):`swarm/rust_runtime/src/main.rs:304-308` 仅 `.max(1.0)` 下界,f64→u64 饱和使 `rounds=1e300` 饱和成 `u64::MAX`,`swarm.rs` 的 `for round in start_round..=rounds` 令协调器无限跑并无限追加 WAL(材料实测:约 12 s 内 31803 轮、WAL 32122 行且持续增长)。**建议去向**:「合法 rounds 上界」取值属产品参数裁决、树内无既有常量可复用,**建议编排会话转使用者裁决**;定档后与 N243 资源闸族一并落地。
174
+ 3. **`swarm/tests/test_swarm_fault.py:107-110` 恒真断言**(材料 ① #7,real / low):分诊(材料 ②)未给编号/处置。**建议去向**:同族已登记 **N160**(`test_swarm_reflect_signal.py:72-73`,v19.md:84)——本件属「同型、不同文件新实例」;建议顺延编 **N250**(`fix` 类,修法=断言加「health 非空」前置守卫并改对含值臂校验满分),**请编排会话裁决编号**。此项属分诊缺口,本席**未落地也未改测试**(只写本报告)。
175
+ 4. **N248 / N249 未落地**(材料 ② 列为 fix):`swarm/swarm_cli.py` 在工作区**无改动**(本席实跑证据见 §四-3),材料 ③ 未提供其守卫读数。**建议去向**:下一批修复落地,各配 1 件守卫(N248 = 报告原子写单点/`<out>.tmp` + `os.replace`;N249 = `parse_args` 包 `try/except SystemExit` 经 `_fail` 收口 stdout 单行 JSON 契约);本席**未改任何产品源码**(仅写本报告)。
176
+ 5. **N241 / N242 仍开口**(v27 报告顺延项,候选 #13/#14 already_covered):`md_cg/nodefile.py:461-467`(has_non_applicable 只认带冒号)/ `:475-492`(positive_body 只剥标题行)——本席读核现行仍为旧口径。**建议去向**:按 v27 §五 顺延落地,本轮不重复报。
177
+
178
+ ---
179
+
180
+ ## 六、纪律合规声明
181
+
182
+ 1. **工具面降级声明(第 7 条)**:本会话 `cg(op=route,intent=…)` 经 MCP 端 `mdcg` 正常返回(命中 v27 报告相关节点与编号口径知识),**未触发降级兜底**。
183
+ 2. **只读与不改产品源码**:本席**未改任何产品源码文件**——开工 `git status --porcelain` 与写报告前逐项一致(唯一新增为本报告自身 `docs/eval/缺陷挖掘_自主迭代_v28.md`,属新建文档);全部命令为只读(§四)。
184
+ 3. **命令执行(第 15 条)**:跨进程读写一律经 `python`(argv + 显式 UTF-8),`grep/ls/cat` 等内置/MSYS 工具属豁免面;本席未在 shell 内直接跑原生 Windows 程序。
185
+ 4. **任务派发(第 17 条)**:本席为工作流内报告撰写席,只做编排与只读判定,**未派发**新的执行性任务;只读命令合并为一条 L1 留痕(§四 首行)。
186
+ 5. **归档(第 16 条)**:本席仅产出报告文件,**未写灵枢记忆**(材料 ③ 载明 N243–N247 五条归档节点已由修复席落盘并读回确认;本报告的归档由编排会话按流程处置)。
187
+ 6. **编号一致性(硬要求 ③)**:全文编号(N243–N249、N250 建议、N241/N242/N157/N160/N26/N4 引用)与 §四-4 的编号实占扫描一致;802 已注明为 flake8 lint 码,不计入缺陷号。
188
+ 7. **路径脱敏(硬要求 ②)**:本报告全部路径为仓库**工作区相对路径**,不含任何本机盘符绝对路径、不含密钥/令牌/个人隐私字面量(自扫描见 §附)。
189
+
190
+ ---
191
+
192
+ ## 七、跳过项及原因
193
+
194
+ | 项 | 原因 |
195
+ |---|---|
196
+ | **未复跑各条「红基线」** | 红基线须先把产品源码回退到 HEAD 版再跑守卫;ask 明令「不得改动任何产品源码文件,只写这一份报告」。故红基线一律标注**材料 ③(修复席)**,本席未复跑、不冒充。 |
197
+ | **未跑项目级全量回归 / swarm crate 构建** | 材料 ④(回归席)已跑(退出码 0 / 327 条 PASS;crate 退出码 0);本席在本 ask 的只读范围内未重复派发或直跑该资源敏感项(构建需 cargo、耗时可观,且非本 ask 要求)。 |
198
+ | **未修 N248 / N249 / #7 恒真断言 / N241 / N242** | 本 ask 明令「只写这一份报告,不改任何产品源码」;N248/N249/#7 的落地超出本轮已落地批次(材料 ③ 未含其读数),见 §二-附 与 §五。 |
199
+ | **未核实 N243–N247 绿态的行级 diff 归属** | 材料 ③ 已给每条的改动面读数(如 vm.rs 运行时 +37/-4 等);本席按只读原则核对源码注释在位(§四-3)即可判「已落地」,未逐行 diff 复核实现细节。 |
200
+ | **未端到端复现 §三 各候选** | 复现须构建 Rust(`cargo build`)+ 起子进程,属材料 ① 复核席职责;本席只读核其现码行号与判据。 |
201
+
202
+ ---
203
+
204
+ ## 附:双清单自查(内容政策 + 隐私)
205
+
206
+ **本席实跑扫描面 = 本报告自身**(`docs/eval/缺陷挖掘_自主迭代_v28.md`):
207
+
208
+ - 命令(逐项):`grep -cE "(^|[^A-Za-z0-9])[A-Za-z]:[\\\\/]" docs/eval/缺陷挖掘_自主迭代_v28.md`(盘符绝对路径正则)→ **0**;`grep -cE "sk-[A-Za-z0-9]{12,}|mdcg1\\.|ghp_|tk_[0-9a-f]{8,}" docs/eval/缺陷挖掘_自主迭代_v28.md`(凭据字面量)→ **0**;人工复核无真实姓名/手机号/住址等个人隐私。
209
+ - `policyClean = true`(内容政策:无违规内容);`privacyClean = true`(隐私:无盘符绝对路径、无凭据、无个人隐私)。
210
+
211
+ **材料 ⑤(自检席)所载命中清单(既存 · 非本轮引入,仅供编排会话处置,本报告不重复其内容)**:
212
+ - 本报告**不存在时**无可扫描对象(材料 ⑤ 第二项),本席写出后已按上条自扫通过。
213
+ - 材料 ⑤ 另列多处**既存**(非本轮引入)盘符路径命中,集中在未跟踪目录 `.zcode/review/`、`.zcode/workflows/` 与部分历史入库文件(`docs/eval/*.md`、`docs/hive/*.md`、`dsh/*.yml|ps1`、`hive/src/*.rs` 等),以及 `data/policy.json` 的脱敏规则本体(非真实凭据)、`data/README_memory_bench_1000.md` 的占位符、一份 bench 记录内的真实令牌 id(文内自述可 revoke)。**处置建议(材料 ⑤ 原载)**:提交前从暂存面排除 `.zcode/` 或对路径做占位替换;对本轮改动面(8 件)与 `git diff` 新增行,材料 ⑤ 逐件扫描均 **0 命中**。
214
+
215
+ ---
216
+
217
+ *报告席产出:`docs/eval/缺陷挖掘_自主迭代_v28.md`。本席未改任何产品源码;全文数字凡非本席实跑均标注来源(① 复核席 / ② 分诊席 / ③ 修复席 / ④ 回归席 / ⑤ 自检席)。*
@@ -0,0 +1,270 @@
1
+ # 缺陷挖掘 · 自主迭代 第 30 轮报告(纪律 · 门禁 · 工程管线面深挖)
2
+
3
+ > **报告文件**:`docs/eval/缺陷挖掘_自主迭代_v29.md`(文件序号 v29;**轮次号为第 30 轮**——按文件序号序列推定:v28 = 第 29 轮 swarm 面(HEAD `99f44be2`,批次 94),故 v29 顺推为第 30 轮;材料未显式给出轮次号,此系本席推定,**非材料所载**)。
4
+ > **扫描域**:`scripts/` 工程管线(纪律渲染/守卫、发布件与常驻进程体检、容器验证入口)为主;随 N255 一并收口 `md_cg/selfreport.py` 的 `purge()`。
5
+ > **候选池**:18 条(材料 ① 四区候选与独立复核结论)。**结论分布**:`real 17` / `already_covered 1`(#10 `rank_parity.py`)/ `false_positive 0`。
6
+ > **分诊**(材料 ②):`fix 12`(编号 **N251–N262**)/ `defer 5` / `rejected 0`。
7
+ > **实际落地**(本席实跑核验工作区):**已落地 5 条 = N251 / N252 / N253 / N254 / N255**;分诊列为 `fix` 的 **N256–N262 未落地**(工作区对应文件零改动、材料 ③ 亦未给其读数,详见 §二-附 A)。
8
+ > **首次编写**:本文件此前不存在(本席实跑 `ls docs/eval/ | grep 缺陷挖掘_自主迭代_v2` → 最大为 `v28`)。
9
+
10
+ **行号口径**:全文行号一律为**本席亲读的现工作区行号**(工作区含本轮 N251–N255 的未提交改动,故 `scripts/verify_discipline.py`、`scripts/check_publish_artifact.py` 等件行号较材料 ① 的缺陷时点行号有偏移);与材料不一致处逐条注明「材料时点行号」。
11
+
12
+ ---
13
+
14
+ ## 一、执行摘要
15
+
16
+ 1. **扫描面**:候选池 18 条(材料 ① 四区复核席):**属实(real)17 条**、**已被既有缺陷号覆盖(already_covered)1 条**(#10 `scripts/rank_parity.py:294-324`,coveredBy = `docs/eval/优化第二批_依赖透传与对拍口径与负缓存_v1.0.md` 的 CH-1 复核 uncovered 第 1 条 / §6.2 残余面第 1 条)、`false_positive` 0 条。
17
+ 2. **分诊**(材料 ② 分诊席):属实 17 条 → `fix 12`(编号 **N251–N262**)/ `defer 5` / `rejected 0`。分诊时点编号实占最大 = **N250**(N248/N249/N250 仅出现于 `docs/eval/缺陷挖掘_自主迭代_v28.md`,系「分诊已定/建议未落地」号,仍占号,故本轮自 N251 起连续编)。
18
+ 3. **实际落地**(本席实跑核验工作区):**已落地 5 条 = N251 / N252 / N253 / N254 / N255**,源码注释与新建守卫均在位(`git grep -n` 逐号命中,见 §四-3);**分诊列出的 N256–N262 七条未落地**——对应文件(`scripts/check_registry_tarball.py` / `scripts/gate_rust_crate_test.py` / `scripts/verify_discipline.py` 的 semantic 面 / `scripts/discipline_nodes.py` / `scripts/check_unreachable.py` / `scripts/cogmap_sync.py`)**不在** `git status --porcelain` 的改动面内,材料 ③ 亦**只**提供 N251–N255 五条的红/绿守卫读数。**本席如实并列「分诊 fix 12 / 落地 5」这一缺口**,不把未落地项写成已修。
19
+ 4. **编号实占核对(硬要求 ③)**:分诊时点(② 席)最大 = **N250**;本席现跑 `git grep -ohE 'N[0-9]{3,4}' | tr -d 'N' | sort -n -u | tail -20` → `237 … 255 / 802`(`802` 为 `# noqa: N802` lint 码,非缺陷号,已剔除),其中 **N251–N255 即本轮已落地五条**。故本席现跑实占最大 = **N255**,与「已落地 5 条」自洽。
20
+ 5. **回归与门禁(本席实跑,硬要求 ⑤ 同见 §二-附 B)**:全量回归 `python scripts/run_tests.py --jobs 4` → **332/332 通过、5 跳过、退出码 0**;`package.json` 的九腿门禁逐腿单独跑 → **九腿全绿、`GATE_RC=0`**,其中 `check_publish_artifact.py` 腿输出 `VERDICT=PASS`、`verify_discipline.py --allow-missing` 腿输出 `结论:10/10 目标一致`。
21
+ 6. **严重度不一致(如实并列)**:材料 ① 判 N253/N254/N255 为 **medium**,材料 ③ 修复席同三条标 **high**——两处不一致,本报告逐条并列,不擅自归一。
22
+
23
+ ---
24
+
25
+ ## 二、修复清单
26
+
27
+ > **读数来源声明**:本节各条「红基线/绿态」命令与输出均**来自材料 ③(修复席)**,**并非本席实跑**(红基线须先把产品源码回退到 HEAD 版,本 ask 明令「不得改动任何产品源码文件」);本席实跑部分(工作区状态、现码行号、编号扫描、回归、门禁、守卫绿态)见 §四,逐条标注。材料 ③ 中未出现的 N256–N262 本节列入附 A「分诊已编号 · 未落地」,不给守卫读数。
28
+
29
+ ### 已落地 5 条(N251–N255)
30
+
31
+ #### N251 · 发布门禁内容面「清单内在、却未扫」被静默跳过(未扫 ≡ 干净)
32
+
33
+ - **where(现行)**:`scripts/check_publish_artifact.py` —— 新增单点 `read_local_text_detail(root, rel) → (text, 未扫成因)` `:303-333`(替代修前 `read_local_text_if_needed` 的三处静默 `return None`:`:320` 越根兜底 / `:324` stat 失败 / `:326` 超 `TEXT_SIZE_LIMIT` / `:331` open 失败);成因常量 `UNSCANNED_UNREADABLE :62`、`UNSCANNED_ESCAPE :65`;措辞单点 `unscanned_cause_oversize :68-70`、`unscanned_entry :73`;兼容包装 `read_local_text_if_needed :335-338`。local 调用侧 `:631-636`(`if cause: unscanned.append(...)`;原 `if text is None: continue` 不再静默);新规则「R7 扫描面完整性」local `:681-685` / registry `:847-850`;registry 成员收集 `:767-789`、扫描侧 `:815-819`。模块自述承诺同步 `:8`、`:15-18`。
34
+ - *材料时点行号*:`read_local_text_if_needed :274-294`(三处 `return None`)/调用侧 `:586-589`/registry `:723` 与 `:752-755`。
35
+ - **缺陷面**:内容面(R1 凭据 / R3 文本)对「清单里在、却读不到或超 `TEXT_SIZE_LIMIT = 3 MiB`(`:49`)」的件一律 `continue`,既不判负也不打 NOTE——与「已扫且干净」不可区分,被跳过的子集零 NOTE、零计数。
36
+ - **修复(材料 ③ 修复席)**:把「清单内却未扫」按成因记账并交新增 R7 规则判负(覆盖 stat 失败 / 超限 / open 失败 / 真实路径越根四成因);`read_local_text_if_needed` 降为语义逐字一致的兼容包装;非文本扩展名与越根条目(R5 已判负)仍返回 `(None, None)` 即「按设计不扫」,不刷屏。registry 侧同族收口(超限 / `extractfile` 读不出两条 `continue` 各按成因入 `unscanned`)。**未放宽任何既有判据**:`TEXT_SIZE_LIMIT`、三条 R1 内容规则、R5/R6、`_within_root`、`unsafe_rel_reason` 均未动,唯一行为变化是把原「未扫且无输出」变成 fail-closed 判负(严于修前)。
37
+ - **守卫**:`scripts/test_check_publish_artifact_coverage.py`(新增,本席实跑 **27 passed / 0 failed / 0 skipped**)。
38
+ - **红基线 → 绿态(材料 ③)**:
39
+ - 红(守卫 × HEAD 版门禁,`git show HEAD:` 覆盖到临时目录后跑):`14 passed / 13 failed / exit 1`。红读数即静默态:超限腿 stdout「发布清单:…,文件数=2 / [PASS] R1 凭据/密钥面;文件面=0 内容面=0 / [PASS] R2–R6 / exit 0」——3,145,741 B(> `TEXT_SIZE_LIMIT`)的文本件内**真形态令牌**随包出货(本报告不复制该字面量);postpack 腿「文件数=3 全 PASS exit 0」而现场核对 postpack 后盘上确无该件;单元读数 `(None, None)`(无成因概念);对照腿同令牌 53 B 小文件 R1 **FAIL**(判据随文件大小翻转)。
40
+ - 绿(同命令修后):**27 passed / 0 failed / 0 skipped / exit 0**(L1/L2 转 exit 1 + R7 点名两件;L4 对照腿 R1 判负且 R7 PASS;registry 桩腿 R0 保持 PASS 成因隔离;L3 干净仓 exit 0 / R7 PASS 不误伤)。
41
+ - **severity**:high(材料 ① 与材料 ③ 一致)。
42
+
43
+ #### N252 · 互验门禁放行判据只兑现 docstring 三态之一
44
+
45
+ - **where(现行)**:`scripts/interop_gate.py` —— `_load` 类型闸 `:55-75`(`verdict` 非字符串 → `ValueError` → exit 3 `:57-59`;`failure_reason` 非 `None`/`str` → 3 `:62-65`;`valid`/`assertions_ok` 布尔闸 `:66-68`;`passed`/`failed` 非负整数闸 `:72-75`);放行判据**唯一单点** `release_blockers(v) :79-99`(替代修前 `:73` 的 `if v["verdict"] == "pass" and v["valid"] is True:`);`main` 分派 `:118-129`(0/1 与逐条 `[阻因]`);模块 docstring 判定表 `:8-23`。
46
+ - *材料时点行号*:修前放行判据 `:73`(`v["verdict"] == "pass" and v["valid"] is True`)。
47
+ - **缺陷面**:docstring 承诺三态(exit 0 = `verdict=="pass"` 且 `valid is True`(断言 AND 套件皆过,唯一放行态);exit 1 = verdict 存在但非放行态;exit 3 = 形状非法含类型不对),实现只判 `verdict=="pass"` 且 `valid is True`——pass 分支完全不看 `assertions_ok`/`failed`/`failure_reason`,`_load` 也不校 `verdict` 类型。生产端公开 API `md_cg/interop.py` 的 `make_verdict(verdict='pass', failed=1)` 经 sanity+shape 双门禁正常产出 `verdict=pass / valid=True / assertions_ok=False / failure_reason='assertions_failed' / failed=1`,喂给门禁实测 **exit 0**,即被批准的产出路径即可造出被放行的自相矛盾 verdict。
48
+ - **修复(材料 ③ 修复席)**:放行判据收紧为契约全合取——`verdict=='pass'` 且 `valid is True` 且 `assertions_ok is True` 且 `failed==0` 且 `failure_reason` 为空(空列表 = 唯一放行态),`main` 由它分派 0/1 并逐条打印 `[阻因]`;`_load` 补 `verdict` 类型闸与 `failure_reason` 类型闸;docstring 判定表重写为与实现同源。**未放宽任何判据**:0/1/2/3 三态语义全部保留(exit 0 只会更严、绝不更宽),未删规则、未降阈值、未把 FAIL 改 WARN。承诺面同步:`docs/hive/蜂巢双实例互验_设计定稿.md:355` 由「exit 0=放行(pass+valid)」改为显式五条件合取并注明 N252 收紧。
49
+ - **守卫**:`scripts/test_interop_gate_release.py`(新增,本席实跑 **19 passed / 0 failed**)。
50
+ - **红基线 → 绿态(材料 ③)**:
51
+ - 红(守卫 × 工作区未改的 `interop_gate.py`):`10 passed / 9 failed / exit 1`。G1「生产端自相矛盾 verdict → exit 1」实测 `rc=0` 且 stdout 打印着 `failed=1` 仍放行;G4/G5(`failure_reason` 非空 / `failed=1` / `assertions_ok=False` 各只坏一处)`rc=0`;G6 `verdict=123 / null / ["pass"]` → `rc=1` 而非承诺的 3。
52
+ - 绿:**19 passed / 0 failed / exit 0**(G1 生产端自相矛盾 → exit 1;G4/G5 逐字段单坏 → exit 1;G6 类型闸 → exit 3×3;G7 阻因行输出;G2 真放行仍 exit 0 未误伤)。
53
+ - **severity**:high(材料 ① 与材料 ③ 一致)。**重复面(材料 ③ 原载)**:`docs/eval/缺陷挖掘_自主迭代_v26.md:90`(row16)与 `:141`(遗留清单第 11 项)已「留档 low」登记同一 where / 同一缺陷,但**无 N 号**且至今未修。
54
+
55
+ #### N253 · 渲染型产物的「陈化」硬失败只在能解析出指纹时成立
56
+
57
+ - **where(现行)**:`scripts/verify_discipline.py` —— 新增单点 `is_manual_target(target) :84-91`(矩阵 `render` 显式为 `false` 才算手工投影,缺声明 ≠ 豁免);渲染分支陈化面新增硬失败记录 `:282-287`(紧随 `:266-270` 的既有 `artifact_sha`/`stale` 计算);模块 docstring 硬失败四项说明 `:3-16`。
58
+ - *材料时点行号*:渲染分支陈化 `:250-253`(修改前)/指针分支对照 `:207-212`。
59
+ - **缺陷面**:渲染型(非 pointer)产物的「陈化」硬失败只在 `re.search(r"前16位[)::]*\s*([0-9a-f]{16})", text)` 能解析出内嵌指纹时才成立;解析不出时 `artifact_sha=None → stale=False`,且渲染分支**没有任何**「缺指纹即判负」的对照项,故 `ok` 仍为 `True`——门禁自陈的四项硬失败之一「陈化」(`.github/workflows/discipline-check.yml:4`)可被删行 / 大写(或混合大小写)十六进制 / 空白插在「前16位」与「):」之间(半角或全角)/ 16 位 hex 内含空白四种形态静默绕过;同一 `check()` 对指针件(`:224-228`)在无指纹时判硬失败并写明「无指纹即无法判陈化」,即**同一条件两套口径**。且无任何判据要求渲染型产物必须内嵌指纹——唯一强制该条件的是另一份守卫里**手工维护的 7 条路径清单**(`scripts/test_discipline_fingerprint_eol.py:80-88`),`dsh`(`transport: config-key`,产物 `~/.dsh/profiles/web/cordis.patch.yml:128` 确含指纹)不在该清单内。
60
+ - **修复(材料 ③ 修复席)**:渲染分支追加——`m` 为空且非手工投影时往 `missing` 记一条硬失败(`key=artifact_sha`,与指针分支 `pointer_sha` 同构),使 `ok` 转 `False`。**未放宽任何判据**:正则、`source_sha`/`stale` 口径、字段级逐字比对、孤儿/工具名/指针三条均未动,唯一变化是紧化(原先静默的形态现判负)。承诺面同步:`.github/workflows/discipline-check.yml:3-15`(仅注释)。
61
+ - **守卫**:`scripts/test_discipline_fingerprint_required.py`(新增,本席实跑 **17 passed / 0 failed / 0 skipped**)。
62
+ - **红基线 → 绿态(材料 ③)**:
63
+ - 红(守卫 × HEAD 版 `verify_discipline.py`):`11 passed / 6 failed / exit 1`。S3 五种破坏形态(删行 / 大写十六进制 / 空白插在全角或半角「):」之间 / 16 位 hex 内含空白)均 FAIL,读数 `{'ok': True, 'sha': None, 'missing': [], 'stale': False}`;独立探针另证「陈旧指纹(000…)→ `stale=True/ok=False`」(既有判据有效,故非全面失效)。
64
+ - 绿:**17 passed / 0 failed / 0 skipped / exit 0**(S3 五种破坏皆转 `ok=False` 且 `missing` 含 `artifact_sha`;S2/S5 对照与良性变体仍 `ok=True`;S6 `render:false` 豁免;S7 指针型未被削弱;S1 真实仓 8 个在役渲染目标指纹皆 == 真源)。
65
+ - **severity**:**材料 ① = medium / 材料 ③ = high(不一致,如实并列)**。
66
+
67
+ #### N254 · 容器验证入口退出码不传播(恒 0)
68
+
69
+ - **where(现行)**:`scripts/verify_linux.sh` —— 新增单点 `note`/`record` `:20-23`(逐字同 `scripts/linux_verify.sh:12-15`),hive/scripts 段 `:49-53`、gate 段 `:57`(`record "check_publish_artifact" $?`)/`:62-66` 改走 `record`,末行判据 `:69`(`[ "$fail" -eq 0 ]`)。`scripts/verify_linux_node.sh` —— 同款单点 `:10-13`、三步聚合 `:15-18`、末行判据 `:22`(`tail -6` 降级为日志尾,不再作末句)。
70
+ - *材料时点行号*:`verify_linux.sh:58`(末句 `echo "=== done ==="`)/`verify_linux_node.sh:12`(末句 `tail -6`)。
71
+ - **缺陷面**:两脚本仅 `set -u`(无 `set -e`)也无 `fail` 聚合,进程退出码恒 0——消费退出码的宿主(`docker run … && 下一步`)把「全失败」读成「成功」。**关键取舍(材料 ③ 原载)**:不是只在末尾补一行判据——`verify_linux.sh` 原 `fail` 计数器只覆盖 python 套件段,hive/scripts 段与 gate 段的退出码只 `echo` 不进聚合,仅补末行则「只 gate 段败」时退出码仍为 0;故四个原本只 `echo` 的段一律改走 `record`。同目录 `scripts/linux_verify.sh:128-129` / `scripts/newuser_sim.sh` 早已用同一单点正确传播(口径不一致)。
72
+ - **修复(材料 ③ 修复席)**:两脚本复用同目录既有单点(`note`/`record` + 末行判据),各判负段进同一 `fail` 聚合。**未放宽任何东西**:原有每段的命令、`/dev/null` 重定向、`pip … || true` 的宽松自择与 `command -v npm` 的 SKIP 分支均未动(SKIP 仍不判负);未删检查、未降阈值。
73
+ - **守卫**:`scripts/test_linux_verify_exit_code.py`(新增;**本席实跑 15 passed / 0 failed / 0 skipped**;材料 ③ 载「14 条 check / 13 断言」——**现文件为 15 断言,本席实测 15,如实并列**)。
74
+ - **红基线 → 绿态(材料 ③)**:
75
+ - 红(守卫 × HEAD 版两件 `.sh`):`7 passed / 6 failed / exit 1`。L1 `rc=0`(stdout 含 `python_suite pass=0 fail=46`)、L3/L4/L5/L7/L8 皆 `rc=0`;参照腿 L9 修前即 PASS(证明缺口只在这两件脚本)。
76
+ - 绿:**15 passed / 0 failed / 0 skipped / exit 0**(L1 全败 → 退出码 ≠ 0;L2 全过 → 0 不误伤;L3 仅 gate 段败 / L4 仅 hive/scripts 段败 / L7 仅 npm build 败 / L8 仅 ts test 败 → 均 ≠ 0;L5/L6 node 脚本;L9 `linux_verify.sh` 参照腿同契约;L0 两脚本 LF)。
77
+ - **severity**:**材料 ① = medium / 材料 ③ = high(不一致,如实并列)**。
78
+
79
+ #### N255 · 常驻进程体检的只读承诺被扫描期的删除副作用破坏 + 探测失败 fail-open
80
+
81
+ - **where(现行)**:`scripts/mdcg_stale_servers.py` —— 探测可用性单点 `probe_processes() :185-217`(替代修前 `_procs`);在役口径单点 `_is_mdcg_proc :221` / `_live_mdcg_pids :228`;`scan() :284-337` 返回 `(rows, err)` 且**删去**修前尾部的无条件 `_sr.purge(pids)`;显式清理 `purge_reports() :340`;`kill() :356`(探测不可用即拒);`main() :375`(list 探测不可用 → stderr + 退 2 / 新 `purge` 子命令 / `kill --purge-report`);`_ps() :140-152`(回传 rc)。`md_cg/selfreport.py` —— `purge(pids, *, allow_empty=False) :129-141`。
82
+ - *材料时点行号*:`mdcg_stale_servers.py:277-281`(scan 尾部无条件 purge)/`:132-141`(`_ps`)/`selfreport.py:130-152`(purge)。
83
+ - **缺陷面**:① `scan()` 末尾无条件 `from md_cg import selfreport as _sr; _sr.purge(pids)`,是删除自报文件的写副作用,与模块 docstring「只读枚举无副作用」(`:4`)及 `main` docstring「不改状态」直接矛盾;② 探测失败时 fail-open——`_ps` 超时/异常返回 `"<ERR Name: msg>"`,`_parse_ps` 因该串含 `:` 解析为一条伪记录(无 `Name` 键),`scan` 在 `name.lower().startswith("python")` 过滤处跳过 → `rows=[]` → `list --fail-on-stale` 的 `risky=[]` → 返回 0「前置守卫通过」,同时 `purge(pids=[])` 的 `keep` 为空集 → 删光目录下全部 `*.json`。**重建前置守卫在探不到进程时反而判绿**。
84
+ - **修复(材料 ③ 修复席)**:① `purge` 从 `scan()` 尾部移出(`scan` 恢复纯只读),改挂显式清理路径:新增 `purge` 子命令与 `kill --purge-report`(后者本就在 docstring 用法里写着但未实现);② 新增探测可用性单点 `probe_processes()`(四判据:PS 未能执行 / 非零退出 / `<ERR` 标记 / 输出不可解析含缺 `Name`·`ProcessId` 的伪记录),`_ps` 改回传退出码;`list` 探测不可用时 stderr 报环境错误并退 **2**、`kill` 记 `ok=False` 报「探测不可用」(不谎报「进程不存在」)、`purge` 退 2 且**不删任何文件**;③ `selfreport.purge` 加关键字专用开关 `allow_empty=False`(空 `keep` 默认不删)。**未放宽任何判据**:三级代际合同、`--fail-on-stale` 退 1、`kill` 的 PID 复用二次校验、`report/info/read_all` 契约全部原样保留,`list` 现在严格更严(新增退 2 态)。
85
+ - **守卫**:`scripts/test_mdcg_stale_servers_scan.py`(新增,本席实跑 **26 passed / 0 failed / 0 skipped**)。
86
+ - **红基线 → 绿态(材料 ③)**:
87
+ - 红(守卫 × HEAD 版 `mdcg_stale_servers.py` + `selfreport.py`):`10 passed / 11 failed / exit 1`。G2 `rc=0` 且 stdout 仅「污染源 0 个:无 / mtime 陈旧 0 个:无」而沙盒预置 3 件自报被 `purge([])` 删光(`[]`);G3 `list` 后同样 `[]`(只读承诺反例);G4 `purge` → argparse invalid choice(exit 2);G6 `kill` 探测不可用却报「进程不存在」;G8 `list --json` 探测不可用 `rc=0` + `[]`;G9 `purge([])` 返回 3 且目录清空。
88
+ - 绿:**26 passed / 0 failed / 0 skipped / exit 0**(G2 探测不可用 → 退出码 2 + stderr「[环境错误] 进程探测不可用」+ 沙盒 3 件自报原样在位;G3 list 只读;G4 `purge` 子命令 0 且确实清掉非在役自报;G5 探测不可用时 purge → 2 且不删任何文件;G6 kill 报「探测不可用」;G8 `--json` 形状兼容;G9 `purge([])` 默认不删;G10 `report/read_all` 契约未破)。
89
+ - **severity**:**材料 ① = medium / 材料 ③ = high(不一致,如实并列)**。
90
+
91
+ ### 附 A:分诊已编号但**未落地** 7 条(N256–N262)
92
+
93
+ > 材料 ② 分诊将下列 7 条列为 `fix` 并各配编号与修法,但**本席实跑确认工作区未含其改动**:对应文件(`scripts/check_registry_tarball.py`、`scripts/gate_rust_crate_test.py`、`scripts/discipline_nodes.py`、`scripts/check_unreachable.py`、`scripts/cogmap_sync.py`,及 `scripts/verify_discipline.py` 的 semantic 面)**均不在** `git status --porcelain` 的改动面(10 项 `M` 不含它们);`git grep -n 'N25[6-9]\|N26[0-2]'` 全树 **0 命中**。材料 ③ **未提供**这 7 条的红/绿守卫读数。故本节**不给读数**、不冒充实修,状态记「分诊已定 · 未落地」。
94
+
95
+ | 编号 | where(现行行号,本席亲读) | 缺陷面(材料 ①) | 修法(材料 ②) | ① 严重度 |
96
+ |---|---|---|---|---|
97
+ | **N256** | `scripts/check_registry_tarball.py:35`(`_TARBALL_RE` 行锚正则)+ `:60`(`search`)+ `:88-89`(`tarball is None → return 0`) | 同一份过期 tarball URL 改写成 YAML 合法别写法(缩进 / 行内注释 / 内联映射 / 冒号前空格 / 列表项)后正则失明,`read_entry_tarball` 返回 `None` → 走「未声明 tarball」出口,rc 与 stdout 逐字等于真·未声明(六形态夹具逐条对照) | 用既有 yaml 依赖解析条目取 `tarball` 字段(或放宽正则) | low |
98
+ | **N257** | `scripts/gate_rust_crate_test.py:93-99`(`:93-94` 已解析 `passed/failed`;`:96 if p.returncode == 0` → `:97 [PASS]`、`:99` 计入通过数 1) | 判定只取 cargo 退出码,`:93-94` 解析出的 `passed/failed` 完全不参与判定——0 测试的 crate 仍 `[PASS]` + 计入通过数 1 | `rc==0` 分支加 `if passed == 0: [FAIL]`(与 N9 同口径收口) | medium |
99
+ | **N258** | `scripts/verify_discipline.py:5`(docstring 正向承诺)+ `:45-46 FIELD_LABEL/FIELD_ORDER`(`field_value :50-60`)对照 `scripts/render_discipline.py:88-90 _title`、`:327`/`:343` | docstring 承诺「每条纪律的 semantic / 动作 / 声明 必须出现在产物中」,但 `FIELD_ORDER` 只含 `trigger/action/negative/declaration`——渲染器写出的「N. 语义」标题零判据(产物副本第 3 条标题被替换/删除,`check()` 仍 `ok=True`) | `FIELD_ORDER` 增 `semantic`(`field_value` 读 `n` 的 `semantic`),或对 18 个 `_title` 逐条做包含判据 | medium |
100
+ | **N259** | `scripts/discipline_nodes.py:190`(`out[int(...)]` 覆盖写)+ `:212-235`(`check_cg_nodes` 只遍历真源下标 1..N) | 投影面「多出/重复」节点永不被检、`sync` 也不清除(20 文件 / 19 tag 号下 `check` 仍 `ok=True drift=0`);对照产物面 `verify_discipline.py` 有 orphans 判据(`:260` 计 `ok`)而投影面无 | 比照产物面 orphans 判据,对 `scan_nodes` 收录的 tag 号做「多出/重复」检测并计入 `ok`;`sync_cg_nodes` 一并清除 | medium |
101
+ | **N260** | `scripts/discipline_nodes.py:225-235`(`check` 用 `condition_space.trigger` 归一化等值 + 期望行「被包含」)对照 `:302`/`:328-331`(`sync` 用正文规范化行「列表全等」+ `source_sha`,`same` 即 `continue`) | 守卫与同步器对「投影是否一致」两套判据:只改 frontmatter `trigger` → `check` 报 DRIFT 而 `sync --write` 报「已一致,无需改动」(文档指定修复链清不掉漂移);只追加正文行 → `check ok=True` 而 `sync changed=[1]` | `sync` 的 `same` 纳入 `trigger`/`id`(或 `check` 改用正文行等值),使「守卫判绿」与「重渲染空操作」同判 | medium |
102
+ | **N261** | `scripts/check_unreachable.py:51`(`ast.parse(p.read_text(encoding="utf-8"), …)`)+ `:53`(`except SyntaxError`) | docstring(`:13-15`)承诺「任一 .py `ast.parse` 失败计 FAIL」,但 `read_text` 遇非 UTF-8 字节抛 `UnicodeDecodeError`(`ValueError` 族,非 `SyntaxError` 子类)且 `read_text` 就在 `try` 内 → 异常穿出 `main`,整轮扫描崩溃(stdout 无 `[SYNTAX]`、无汇总) | `except` 扩为 `(SyntaxError, UnicodeDecodeError)`(或 `ValueError` 族),按承诺计 FAIL 并继续扫其余文件 | low |
103
+ | **N262** | `scripts/cogmap_sync.py:545-548`(`valid_ops = set(cg_ops) \| set(stg_ops)`,两循环共用) | `cg(op=<仅 stg 的 op>)` / `stg(op=<仅 cg 的 op>)` 跨基元误引零报错通过,错误文案仍写死「引用了不存在的 cg/stg op」 | 两循环各用各自集合(`:546-547` 用 `set(e["cg_ops"])`、`:548-549` 用 `set(e["stg_ops"])`) | low |
104
+
105
+ ### 附 B:本轮改动的门禁脚本仍 PASS 的验证腿(硬要求 ⑤)
106
+
107
+ > 本轮**改动了门禁/守卫脚本本体**(`check_publish_artifact.py` / `verify_discipline.py` / `interop_gate.py` / `verify_linux.sh` / `verify_linux_node.sh` / `mdcg_stale_servers.py` + `md_cg/selfreport.py`),故按硬要求 ⑤ 单列:**改动后门禁仍 PASS 是被哪条腿验证的**。
108
+
109
+ | 被改脚本(编号) | 该腿在门禁中的位置 | 本席实跑读数(§四) | 附带守卫(本席实跑) |
110
+ |---|---|---|---|
111
+ | `scripts/check_publish_artifact.py`(N251) | `package.json` 九腿门禁**第 2 腿** | `rc=0`;stdout `[PASS] R7 扫描面完整性;清单文件数=1558 未扫文本件=0` / `FAIL 规则数=0` / `VERDICT=PASS` | `scripts/test_check_publish_artifact_coverage.py` 27/0 |
112
+ | `scripts/verify_discipline.py`(N253) | 九腿门禁**第 7 腿** | `rc=0`;`结论:10/10 目标一致` | `scripts/test_discipline_fingerprint_required.py` 17/0 |
113
+ | `scripts/mdcg_stale_servers.py` + `md_cg/selfreport.py`(N255) | **不在**九腿门禁链内(常驻进程体检工具) | 由全量回归中 `md_cg` 组覆盖 → 332/332 通过 | `scripts/test_mdcg_stale_servers_scan.py` 26/0 |
114
+ | `scripts/interop_gate.py`(N252) | **不在**九腿门禁链内(合并钩子消费方) | 由全量回归覆盖 → 332/332 通过 | `scripts/test_interop_gate_release.py` 19/0 |
115
+ | `scripts/verify_linux.sh` / `verify_linux_node.sh`(N254) | **不在**九腿门禁链内(Docker 容器腿入口) | 由全量回归覆盖 → 332/332 通过 | `scripts/test_linux_verify_exit_code.py` 15/0 |
116
+
117
+ **「未放宽任何规则」的机械佐证(本席实跑,非采信)**:`git diff -U0` 对上述 7 件的**删除行**逐条列出——`check_publish_artifact.py` 删除的是三处 `return None` 与调用侧 `if text is None: continue`;`interop_gate.py` 删除的是 `if v["verdict"] == "pass" and v["valid"] is True:`;`verify_discipline.py` 删除的是一句「无指纹的产物…不受影响」注释;`mdcg_stale_servers.py` 删除的是 scan 尾部的 `_sr.purge(pids)` 与 `_procs`/旧 `_ps`;`selfreport.py` 仅 `purge` 签名增 `allow_empty`;两件 `.sh` 删除的是 `echo "…=$?"` 与末句 `echo "=== done ==="` / `tail -6`。**全部为「弱判据 → 强判据」或「写副作用 → 只读」方向,无一处阈值下调、规则删除或 FAIL→WARN 降级**;`TEXT_SIZE_LIMIT`、R1/R5/R6、`_within_root`、三级代际合同、`--fail-on-stale` 退 1、`kill` 的 PID 二次校验均未动(逐处读码 + diff 复核)。两个 workflow(`discipline-check.yml` / `publish-artifact-check.yml`)的 diff **仅注释**,触发面未改(本席 `git diff` 复核)。
118
+
119
+ **未入库提醒(材料 ③ 原载,本席 `git status` 复核)**:5 件新守卫为 **untracked**(`git status --porcelain` 列出为 `??`),**须随批次入库才在 CI 生效**;本轮改动全部落工作区未 commit。
120
+
121
+ ---
122
+
123
+ ## 三、发现明细(全量复核表 · 18 条)
124
+
125
+ > **结论与严重度来源**:均为材料 ①(四区候选与独立复核席);「去向/编号」列中,N251–N255 经本席实跑确认源码注释与守卫在位,N256–N262 经本席实跑确认未落地(见 §二-附 A),#10 的 coveredBy 见 `docs/eval/优化第二批_依赖透传与对拍口径与负缓存_v1.0.md`。
126
+
127
+ | # | where(材料时点 → 现行,本席亲读) | 结论 | severity(①) | 覆盖号 | 去向 / 编号 | 来源 |
128
+ |---|---|---|---|---|---|---|
129
+ | 1 | `verify_discipline.py:5`(判据面 `:39-40` → 现行 `:45-46`;`:220-228` → 现行 `:239-245`);`render_discipline.py:88-90 _title`、`:327`/`:343` | real | medium | — | **fix · N258 · 未落地** | 材料 ①;本席读核现码 |
130
+ | 2 | `verify_discipline.py:250-253` → 现行渲染分支 `:266-270`/`:282-287`(对照指针分支 `:207-212` → 现行 `:208-230`) | real | medium→**high**(①②③不一致) | — | **fix · N253 · 已落地** | 材料 ①③;本席读核现码 |
131
+ | 3 | `discipline_nodes.py:225-235`(check)对照 `:328-332`(sync same 短路)→ 现行 `:225`/`:302`/`:328-331` | real | medium | — | **fix · N260 · 未落地** | 材料 ①;本席读核现码 |
132
+ | 4 | `discipline_nodes.py:190`(覆盖写)+ `:212-235`(只遍历 1..N) | real | medium | — | **fix · N259 · 未落地** | 材料 ①;本席读核现码 |
133
+ | 5 | `discipline_nodes.py:51-73`(`resolve_root`,`:73 return root if isdir else None`)+ `:200-202`/`:290-292`(skipped)+ `verify_discipline.py:293`/`:300`/`:328-329` → 现行 `:326`/`:333`/`:361-362` | real | medium | — | **defer**(CI 策略待裁) | 材料 ①②;本席读核现码 |
134
+ | 6 | `link_check.py:36`(`LINK`)+ `:84`(`LINK.finditer` 无围栏感知) | real | low | — | **defer**(latent,0 现成触发点) | 材料 ①②;本席读核现码 |
135
+ | 7 | `cogmap_sync.py:545-549` → 现行 `:545-548` | real | low | — | **fix · N262 · 未落地** | 材料 ①;本席读核现码 |
136
+ | 8 | `check_unreachable.py:50-54`(docstring `:13-15`)→ 现行 `:51`/`:53` | real | low | — | **fix · N261 · 未落地** | 材料 ①;本席读核现码 |
137
+ | 9 | `check_publish_artifact.py:274-294`/`:586-589`/`:723`/`:752-755` → 现行 `:303-333`/`:631-636`/`:767-789`/`:847-850` | real | high | — | **fix · N251 · 已落地** | 材料 ①③;本席读核现码 |
138
+ | 10 | `rank_parity.py:294-324`(`:315` 读数标签、`:324` 无条件 `return 0`)对照 `:343` 的冲突判定 | already_covered | medium | CH-1 复核 uncovered 第 1 条 / §6.2 残余面第 1 条 | — | 材料 ①(读核见附注 A) |
139
+ | 11 | `check_registry_tarball.py:35`/`:60`/`:88-89` | real | low | — | **fix · N256 · 未落地** | 材料 ①;本席读核现码 |
140
+ | 12 | `gate_rust_crate_test.py:93-100` → 现行 `:93-99` | real | medium | — | **fix · N257 · 未落地** | 材料 ①;本席读核现码 |
141
+ | 13 | `gate_rust_crate_test.py:80-84`(SKIP/0)对照 `gate_rust_parity.py:119-142`(FAIL/1) | real | low | — | **defer**(口径统一取舍) | 材料 ①②;本席读核现码 |
142
+ | 14 | `interop_gate.py:73`(docstring `:9-12`)→ 现行放行单点 `:79-99` | real | high | — | **fix · N252 · 已落地** | 材料 ①③;本席读核现码 |
143
+ | 15 | `bootstrap_loop.py:16`(selfmod 承诺零实现) | real | medium | — | **defer**(补实现 vs 撤承诺待裁) | 材料 ①②;本席读核现码 |
144
+ | 16 | `mdcg_stale_servers.py:277-281`/`:132-141` → 现行 `scan :284-337`/`probe_processes :185-217`/`_ps :140-152`/`selfreport.py :129-141` | real | medium→**high**(①②③不一致) | — | **fix · N255 · 已落地** | 材料 ①③;本席读核现码 |
145
+ | 17 | `verify_linux.sh:58` / `verify_linux_node.sh:12` → 现行末行 `:69` / `:22` | real | medium→**high**(①②③不一致) | — | **fix · N254 · 已落地** | 材料 ①③;本席读核现码 |
146
+ | 18 | `run_tests.py:52-69` + `judgment_manifest.py:35-43`/`:75-94` → 现行 `PATTERNS :35-48`/`coverage_gap :75-95` | real | low | — | **defer**(是否收编 `test/` 待裁) | 材料 ①②;本席读核现码 |
147
+
148
+ **计数核对**:18 条 = real **17**(#1–#9、#11–#18)+ already_covered **1**(#10)+ false_positive **0** ✔(与材料 ① 逐条 verdict 一致)。
149
+ **去向核对**:fix 12(N251–N262)= 已落地 5(#2/#9/#14/#16/#17)+ 未落地 7(#1/#3/#4/#7/#8/#11/#12);defer 5(#5/#6/#13/#15/#18);already_covered 1(#10)。**12 + 5 = 17 = real 条数** ✔。
150
+
151
+ **附注 A(#10 already_covered 的本席读核)**:本席读 `scripts/rank_parity.py` —— `:294 if args.ab and dataset:`、`:315 print(f"A/B({n} 节点,top-1 变化;口径 {py_mode}(本 harness 钉住)):")`、`:324 return 0`、`:343 if py_conflict or py_mode != rs_mode:` —— `--ab` 分支确在 `:343` 的两侧口径对照闸**之前** `return 0`;材料 ① 已逐条登记于 `docs/eval/优化第二批_依赖透传与对拍口径与负缓存_v1.0.md`(其 `:190`/`:333`/`:489`/`:521`/`:596`),与 `md_cg/test_rank_parity_score_mode.py:379-380` 的 G3p(仅做静态字符串断言、不覆盖该路径)一致,故判 already_covered。
152
+
153
+ **附注 B(严重度不一致 3 条)**:N253(#2)/ N254(#17)/ N255(#16)材料 ① 判 **medium**、材料 ③ 修复席标 **high**——两处不一致,本报告逐条并列,不擅自归一。
154
+
155
+ ---
156
+
157
+ ## 四、实跑读数(本会话第一手,均为只读判定腿)
158
+
159
+ > **L1 直跑:`git status --porcelain` / `git diff` / `git grep` / `ls` / `python scripts/run_tests.py` / 九腿门禁逐腿 / 五件新守卫(只读判定,产物落点不改仓库、不改外部状态;守卫只写临时目录)— 风险:低;频次:本 ask 内一次性;可逆性:完全可逆(无仓内写入)。** 按工作纪律第 17 条留痕。
160
+
161
+ 1. **工作区状态**(`git status --porcelain`):
162
+ ```
163
+ M .github/workflows/discipline-check.yml
164
+ M .github/workflows/publish-artifact-check.yml
165
+ M docs/hive/蜂巢双实例互验_设计定稿.md
166
+ M md_cg/selfreport.py
167
+ M scripts/check_publish_artifact.py
168
+ M scripts/interop_gate.py
169
+ M scripts/mdcg_stale_servers.py
170
+ M scripts/verify_discipline.py
171
+ M scripts/verify_linux.sh
172
+ M scripts/verify_linux_node.sh
173
+ ?? .zcode/
174
+ ?? scripts/test_check_publish_artifact_coverage.py
175
+ ?? scripts/test_discipline_fingerprint_required.py
176
+ ?? scripts/test_interop_gate_release.py
177
+ ?? scripts/test_linux_verify_exit_code.py
178
+ ?? scripts/test_mdcg_stale_servers_scan.py
179
+ ```
180
+ **判读**:改动面 = N251–N255 的 5 条(含 `selfreport.py` 一处);`scripts/check_registry_tarball.py` / `scripts/gate_rust_crate_test.py` / `scripts/discipline_nodes.py` / `scripts/check_unreachable.py` / `scripts/cogmap_sync.py` **不在**改动面 → **N256–N262 未落地**据此判定。`.zcode/` 为未跟踪目录(**未被 `.gitignore` 忽略**,`git check-ignore -v` 无输出 → `git add .` 会纳入,见 §附)。
181
+ 2. **改动面规模**(`git diff --stat` 对 9 件):`9 files changed, 397 insertions(+), 62 deletions(-)`。
182
+ 3. **编号实占扫描(硬要求 ③)**:`git grep -ohE 'N[0-9]{3,4}' | tr -d 'N' | sort -n -u | tail -20` → `237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 802`。`802` = `# noqa: N802` lint 码(非缺陷号)。**现工作区实占最大 = N255**;`N251–N255` 即本轮已落地 5 条的源码注释号。`git grep -n 'N25[6-9]\|N26[0-2]'` → **0 命中**(N256–N262 未落地)。分诊时点(② 席)为 **N250**(材料 ②)。
183
+ 4. **五件新守卫绿态**(逐件 `python -X utf8 scripts/<件>`, `PYTHONUTF8=1`):
184
+ ```
185
+ test_check_publish_artifact_coverage → 27 passed, 0 failed, 0 skipped RC=0
186
+ test_interop_gate_release → 19 passed, 0 failed RC=0
187
+ test_discipline_fingerprint_required → 17 passed, 0 failed, 0 skipped RC=0
188
+ test_linux_verify_exit_code → 15 passed, 0 failed, 0 skipped RC=0
189
+ test_mdcg_stale_servers_scan → 26 passed, 0 failed, 0 skipped RC=0
190
+ ```
191
+ 注:`test_linux_verify_exit_code` 实测 **15** 断言(材料 ③ 载「13」——现文件为 15,本席以亲读现码为准并如实并列)。
192
+ 5. **全量回归**(`python -X utf8 scripts/run_tests.py --jobs 4`)→ `===== SUMMARY 332/332 通过,5 跳过(依赖缺失/平台不符) =====`,`REGRESSION_RC=0`。与材料 ④「332 条 PASS」一致。
193
+ 6. **九腿门禁**(按 `package.json` 的 `gate` 链逐腿单独跑):
194
+ ```
195
+ check_unreachable.py rc=0 | unreachable 扫描:565 文件,命中 0,语法失败 0
196
+ check_publish_artifact.py rc=0 | VERDICT=PASS
197
+ check_publish_smoke.py rc=0 | verdict": "PASS", "env_error": false, "exit_code": 0
198
+ cogmap_sync.py check rc=0 | cogmap check: 通过(cg 37 op / stg 4 op / whitebox 6 / mdcg_* 31 个)
199
+ link_check.py rc=0 | 结论:全部相对链接可达
200
+ workspace_index.py --check rc=0 | [OK ] 工作区索引与仓库一致(顶层目录 20 · 追踪 2194 件)
201
+ verify_discipline.py --allow-missing rc=0 | 结论:10/10 目标一致
202
+ gate_rust_crate_test.py rc=0 | 本腿汇总:计入通过数 1 / 跳过 0 / 退出码 0
203
+ gate_rust_parity.py rc=0 | 本腿汇总:计入通过数 1 / 跳过 0 / 退出码 0
204
+ GATE_RC=0
205
+ ```
206
+ 另单跑 `python -X utf8 scripts/check_publish_artifact.py` 取全读数:`发布清单:@furongjun1999/dsh-memory@0.7.2,文件数=1558` / `[PASS] R7 扫描面完整性;清单文件数=1558 未扫文本件=0` / `FAIL 规则数=0` / `VERDICT=PASS`。
207
+ 7. **守卫自动发现**(`python -X utf8 scripts/run_tests.py scripts --list`)→ 5 件新守卫全部在列(`scripts` 组共 23 件),证实已入 `run_tests` 自动发现(**但文件仍 untracked,须入库才在 CI 生效**)。
208
+ 8. **现码行号读核**(本席以 Read/`grep -n` 亲读并落为 §二/§三 的「现行行号」):`verify_discipline.py`(1-120 / 190-320 / `FIELD_LABEL :45` / `FIELD_ORDER :46` / `field_value :50-60` / `is_manual_target :84-91` / 指针分支 `:208-230` / 字段循环 `:239-245` / 渲染陈化 `:266-270`/`:282-287` / cg-nodes 调用 `:326`)、`check_publish_artifact.py`(`TEXT_SIZE_LIMIT :49` / 成因常量 `:62`/`:65` / 单点 `:303-333` / 兼容包装 `:335-338` / `local_mode :611` / `registry_mode :689` / selftest `:858`)、`interop_gate.py`(全文 133 行)、`verify_linux.sh`(全文 69 行)、`verify_linux_node.sh`(全文 22 行)、`mdcg_stale_servers.py`(`_ps :140` / `probe_processes :185` / `scan :284` / `purge_reports :340` / `kill :356` / `main :375`)、`md_cg/selfreport.py`(`purge :129-141`)、`discipline_nodes.py`(`resolve_root :51-73` / `scan_nodes :179-193` / `check_cg_nodes :212` / `sync :302-338`)、`check_registry_tarball.py`(`:35`/`:60`/`:88-89`)、`gate_rust_crate_test.py`(`:78`/`:83`/`:93-99`)、`gate_rust_parity.py`(`:119-142`)、`check_unreachable.py`(`:51`/`:53`)、`cogmap_sync.py`(`:545-548`)、`bootstrap_loop.py :16`、`run_tests.py :52-69`、`judgment_manifest.py :35-48`/`:75-95`、`rank_parity.py`(`:294`/`:315`/`:324`/`:343`)。
209
+
210
+ **未由本席实跑、全部标注来源的读数(不得冒充)**:
211
+ - 各条守卫**红基线 / 绿态**命令与输出 → **材料 ③(修复席)**;本席未复跑(红基线须先把产品源码回退到 HEAD 版,ask 明令「不得改动任何产品源码文件」)。本席**已复跑**的是 5 件新守卫的**绿态**(§四-4)。
212
+ - **候选复核结论、判据「real / already_covered」与逐条复现证据** → **材料 ①(四区复核席)**;本席仅读核其现码行号。
213
+ - **分诊编号与修法** → **材料 ②(分诊席)**。
214
+ - **全量回归「332 条 PASS」与九腿门禁「VERDICT=PASS」** → 材料 ④;本席**已独立复跑**(§四-5/6),读数与之一致。
215
+ - **双清单自检与命中清单** → **材料 ⑤(自检席)**;§附 的本报告自扫描为**本席实跑**。
216
+
217
+ ---
218
+
219
+ ## 五、遗留清单(defer 逐条给建议去向)
220
+
221
+ 1. **投影守卫 `resolve_root` 全自动化面空转**(材料 ① #5,real / medium):`scripts/discipline_nodes.py:51-73` —— 无 root 一律 `[SKIP]` 退 0(判据体从未执行);「提供但不存在的 root」与「未提供」**同分支**且文案误写「未提供」(`:201`/`:291`),而「存在但非认知图」却报满额 DRIFT 退 1——同属误配一绿一红;`scripts/verify_discipline.py:326` 取 `resolve_root(args.cg_root)`,`:333`/`:361-362` 在 skipped 时不计入 bad。仓内既有唯一相关登记是 `docs/eval/发布10_读面损坏UTF8家族收口_v1.0.md:54`「`gate` 未带 `--cg-root` 时 cg-nodes 投影校验跳过——既有观察,待裁」,**无 N 号**。**建议去向**:是否让全部自动化面(`package.json` 的 `gate` / `.github/workflows/discipline-check.yml` / `scripts/verify_linux.sh` / pre-commit)强制提供 `--cg-root`/`MDCG_ROOT` 并在缺省或无效 root 时 fail-closed——属 CI 策略裁决,**建议编排会话转使用者裁决**;除三脚本自身外无测试/工作流调用,改口径需先定 CI 策略。
222
+ 2. **`link_check` 无围栏代码块感知**(材料 ① #6,real / low):`scripts/link_check.py:36`/`:84` —— 围栏内或行内代码里出现的 Markdown 链接语法(方括号标注紧跟圆括号路径)被当真实相对链接,目标不存在即计入 broken → `main()` 返回 1(假红)。**本报告初稿在此处写出过该形态的实例并被本腿判 broken(即本条缺陷的当场实证,也是九腿门禁首跑 `GATE_EXIT=1` 的唯一原因),已改写为中文描述以免自伤**。**如实补充**:本席读核确认候选「两处链接扫描口径不一」不精确——`scripts/cogmap_sync.py` 的链接扫描同样是整文捕获、同样无围栏感知;围栏感知的是**标题/锚点**扫描——故是「链接 vs 标题」不同面,非「链接 vs 链接」分叉。**建议去向**:材料 ① 实测当时 1283 个受管 md 内围栏内相对链接实例为 **0**,属 latent;但本次自伤说明**行内代码/围栏内的写法同样能触发**,触发面比原判更宽——**建议下一轮把该腿收成「跳过行内代码与围栏内文本」单点**,或至少把此形态登记进 `cogmap_sync.FILE_LINK_ALLOWLIST`。
223
+ 3. **Rust 两腿对「被测对象缺失」口径相反**(材料 ① #13,real / low):`scripts/gate_rust_crate_test.py:80-84`(manifest 缺失 → `[SKIP]` return 0)对照 `scripts/gate_rust_parity.py:119-142`(exe 缺失 → `--build auto` → cargo build 失败 rc=101 → `[FAIL]` return 1)。**如实限定**:腿①此支为**已文档化设计决定**(`docs/eval/优化第三批_门禁转正与调度止血与门控收口_v1.0.md:247`),腿② fail-closed 亦在 `gate_rust_parity.py:19-27` 有书面论证;材料 ① 实测单独跑腿①时 `rust/` 缺失判绿,但 `package.json` gate 链上腿②把整链判红(`CHAIN_RC=1`)——**链整体仍红**。**建议去向**:是否统一两腿口径属设计取舍,**建议编排会话转使用者裁决**。
224
+ 4. **`bootstrap_loop.py:16` 的 selfmod 承诺零实现**(材料 ① #15,real / medium):docstring 第 16 行承诺「四机制安全闭环:selfmod 快照/审计/裁决 在每次固化前强制执行」,但全仓 `git grep selfmod` 仅命中该行自身;固化路径(通道 A `persist_triggers`、通道 B verified 落盘)零快照/审计/裁决调用。**建议去向**:是补实现 selfmod 机制(大设计)还是删/更正该承诺——**建议编排会话转使用者裁决**(承诺属安全机制,处置方向影响面大)。
225
+ 5. **`run_tests.py` 收集面不含 `test/`**(材料 ① #18,real / low):`scripts/run_tests.py:52-69` 的 glob 面(`md_cg/test_*.py` / `compiler|swarm/tests/*.py` / `scripts/test_*.py` / `hive/test_*.py`)不含 `test/`;`scripts/judgment_manifest.py:35-48` 的 `PATTERNS` 同样排除,故 `--check-coverage` 恒 PASS。**如实修正(材料 ① 原载)**:候选「该面新增/漂移结构性无机械面可发现」只对「新增 `test/` 文件」成立——若 `run_tests` 漂移去收 `test/`,`coverage_gap` 会报 FAIL(材料 ① 夹具已证);真实盲区仅是「落在 `test/` 且无任何 runner 收养的新文件」。**建议去向**:是否把 `test/` 收进收集面 / `PATTERNS` 属口径裁定,**建议编排会话转使用者裁决**。
226
+
227
+ ---
228
+
229
+ ## 六、纪律合规声明
230
+
231
+ 1. **工具面降级声明(第 7 条)**:本会话 `cg(op=route, intent=…)` 经 MCP 端 `mdcg` 正常返回(命中 v26/v27/v28 报告与编号口径知识),**未触发降级兜底**。
232
+ 2. **只读与不改产品源码**:本席**未改任何产品源码文件**——全部命令为只读判定腿(§四),唯一写入为本报告自身 `docs/eval/缺陷挖掘_自主迭代_v29.md`(属新建文档)。
233
+ 3. **命令执行(第 15 条)**:跨进程读写一律经 `python`(argv + 显式 UTF-8 + `PYTHONUTF8=1`);`grep`/`ls`/`git`/`sed` 等内置/MSYS 工具属豁免面;本席未在 shell 内直接跑原生 Windows 程序。
234
+ 4. **任务派发(第 17 条)**:本席为工作流内报告撰写席,只做编排与只读判定,**未派发**新的执行性任务;只读命令合并为一条 L1 留痕(§四 首行)。
235
+ 5. **归档(第 16 条)**:本席仅产出报告文件,**未写灵枢记忆**(材料 ③ 载明 N251–N255 五条归档节点由修复席落盘并读回确认;本报告的归档由编排会话按流程处置)。
236
+ 6. **编号一致性(硬要求 ③)**:全文编号(N251–N262、N250/N248/N249 引用、N9/N157/N160/N216/N217/N167、v26 留档面引用)与 §四-3 的编号实占扫描一致;`802` 已注明为 lint 码,不计入缺陷号。
237
+ 7. **路径脱敏(硬要求 ②)**:本报告全部路径为仓库**工作区相对路径**,不含任何本机盘符绝对路径、不含密钥/令牌/个人隐私字面量(自扫描见 §附)。
238
+ 8. **门禁脚本改动的单列说明(硬要求 ⑤)**:见 §二-附 B——逐件给出「改动后门禁仍 PASS 由哪条腿验证」与本席实跑读数,并附「未放宽任何规则」的 diff 机械佐证。
239
+
240
+ ---
241
+
242
+ ## 七、跳过项及原因
243
+
244
+ | 项 | 原因 |
245
+ |---|---|
246
+ | **未复跑各条「红基线」** | 红基线须先把产品源码回退到 HEAD 版再跑守卫;ask 明令「不得改动任何产品源码文件,只写这一份报告」。故红基线一律标注**材料 ③(修复席)**,本席未复跑、不冒充。 |
247
+ | **未落地 N256–N262 七条** | 本 ask 明令「只写这一份报告,不改任何产品源码」;且材料 ③ 未含其守卫读数、工作区对应文件零改动(§二-附 A / §四-1)。 |
248
+ | **未在活认知图 / 活 serve 上验证 N259「route 可命中孤儿节点」** | 会触碰在役面,超出只读边界(材料 ① 亦注明该项「未做」)。 |
249
+ | **未实跑 `check_publish_artifact.py --registry`(N251 registry 面)与真实上游条目以外的 registry 形态** | registry 面需联网访问 registry 服务;材料 ①/③ 对 registry 侧亦只读码(本节如实记录其结构同族)。 |
250
+ | **未端到端复现 §三 各候选** | 复现需构造夹具 / 起子进程 / 联网,属材料 ① 复核席职责;本席只读核其现码行号与判据。 |
251
+ | **未复核 N251 绿态的行级 diff 归属与 registry 侧实现细节** | 材料 ③ 已给改动面与守卫读数;本席按只读原则核对源码注释与守卫在位、并跑 `git diff -U0` 复核「无放宽」(§二-附 B)即可判「已落地」,未逐行 diff 复核实现细节。 |
252
+
253
+ ---
254
+
255
+ ## 附:双清单自查(内容政策 + 隐私)
256
+
257
+ **本席实跑扫描面 = 本报告自身**(`docs/eval/缺陷挖掘_自主迭代_v29.md`):
258
+
259
+ - 命令(逐项,**本席实跑**):盘符绝对路径正则 `grep -cE '(^|[^A-Za-z0-9])[A-Za-z]:[\\/]' docs/eval/缺陷挖掘_自主迭代_v29.md` → **0**;凭据字面量正则 `grep -cE 'sk-[A-Za-z0-9]{12,}|mdcg1\.|ghp_|tk_[0-9a-f]{8,}' docs/eval/缺陷挖掘_自主迭代_v29.md` → **1**——**该唯一命中即上一条命令所引的正则字面量自身(本附件的命令文本,自指;非任何真实凭据)**,剔除该自指行后真实凭据命中 **0**;人工复核无真实姓名/手机号/住址等个人隐私。行尾(本席以 `python` 逐字节计数,非 shell 文本模式):`CRLF=0 / bare_CR=0`(纯 LF)。
260
+ - `policyClean = true`(内容政策:无违规内容);`privacyClean = true`(隐私:剔除上述自指正则行后,无盘符绝对路径、无真实凭据、无个人隐私)。
261
+ - **本报告已剔除材料 ③ 中的凭据字面量**:材料 ③ 的 N251 红基线载有**真形态令牌**字面量(用于证明「令牌可随包出货」),本报告**不复制**该字面量,只描述其形态与字节数。
262
+
263
+ **材料 ⑤(自检席)所载命中清单(本轮具名扫描面,仅供编排会话处置,本报告不复制其内容)**:
264
+
265
+ - 材料 ⑤ 报 `policyClean = true`、`privacyClean = false`,命中集中在:① `scripts/test_linux_verify_exit_code.py:81/:82/:117`(本机盘符路径字面量);② 未跟踪目录 `.zcode/` 下的 workflow 脚本与 review 报告多处本机绝对路径(含私有目录语义)。
266
+ - **本席复核(与材料 ⑤ 不一致处,如实并列)**:① 项**已不复现**——本席**通读** `scripts/test_linux_verify_exit_code.py` 全文 285 行并 `grep -nE '[A-Za-z]:[\\/]'` 复扫,该文件**不含**任何盘符字面量(其 `_bash_candidates() :75-99` 明确「运行时推导,不写死任何本机安装路径」,`:137` 亦注明「此处不写字面绝对路径」);材料 ⑤ 的三处命中系对该件**较早修订版**的读数。② 项**复现属实**——`git check-ignore -v .zcode/workflows/lingshu-defect-fix.dwf.ts` 无输出(`.zcode/` 未被忽略,`git add .` 会纳入),故 `.zcode/` 下未脱敏件确有被误入库的风险。**处置建议**:提交前从暂存面排除 `.zcode/` 或对路径做占位替换;本轮改动面(9 件)与 5 件新守卫经本席复扫均 **0 命中**(唯一正则命中为 `https://…` 形式的 URL,非盘符)。
267
+
268
+ ---
269
+
270
+ *报告席产出:`docs/eval/缺陷挖掘_自主迭代_v29.md`。本席未改任何产品源码;全文数字凡非本席实跑均标注来源(① 复核席 / ② 分诊席 / ③ 修复席 / ④ 回归席 / ⑤ 自检席)。*