@furongjun1999/dsh-memory 0.7.2 → 0.7.4

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 (129) hide show
  1. package/README.md +57 -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/217/221/345/270/20312_/344/270/226/347/225/214/346/250/241/345/236/213/345/212/237/350/203/275/347/253/257_v1.0.md +108 -0
  28. 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
  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/270/200/346/211/271_v1.0.md +195 -0
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  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_v26.md +196 -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_v27.md +259 -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_v28.md +217 -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_v29.md +270 -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_v30.md +231 -0
  40. 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
  41. package/docs/eval//350/257/255/344/271/211/346/227/266/347/251/272/345/233/276/350/241/245/345/205/250_P1_/346/212/275/345/217/226/345/231/250v4_/344/270/211/347/216/207/350/257/273/346/225/260_v1.0.md +231 -0
  42. 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
  43. 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
  44. 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
  45. 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
  46. 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
  47. package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +2 -2
  48. package/docs/mdcg//344/270/226/347/225/214/346/250/241/345/236/213/345/212/237/350/203/275/347/253/257_/344/275/277/347/224/250/344/270/216/350/277/220/347/273/264_v1.0.md +305 -0
  49. 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 +45 -42
  50. package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +29 -8
  51. 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
  52. 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
  53. 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
  54. 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
  55. 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
  56. 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
  57. 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
  58. package/dsh/cordis-patch-profile-web.example.yml +2 -2
  59. package/lib/bridge.js +9 -0
  60. package/lib/hooks.d.ts +8 -1
  61. package/lib/hooks.js +134 -50
  62. package/lib/lib/hook_audit.d.ts +55 -0
  63. package/lib/lib/hook_audit.js +208 -0
  64. package/lib/lib/mutual.js +5 -1
  65. package/lib/lib/roleplay_web.js +17 -2
  66. package/lib/lib/session_state.d.ts +56 -0
  67. package/lib/lib/session_state.js +124 -0
  68. package/lib/tools.js +12 -1
  69. package/md_cg/auditview.py +248 -0
  70. package/md_cg/bench_e2e_judge.py +4 -2
  71. package/md_cg/branches.py +29 -3
  72. package/md_cg/consistency.py +38 -13
  73. package/md_cg/datapath.py +38 -11
  74. package/md_cg/forgetting.py +15 -2
  75. package/md_cg/freshness.py +32 -11
  76. package/md_cg/ghostref.py +130 -0
  77. package/md_cg/judgment_manifest.py +7 -0
  78. package/md_cg/lifecycle.py +38 -0
  79. package/md_cg/mcp_server.py +122 -12
  80. package/md_cg/mdcg.py +4923 -4822
  81. package/md_cg/mdcos.py +109 -21
  82. package/md_cg/nodefile.py +77 -13
  83. package/md_cg/readcache.py +29 -4
  84. package/md_cg/selfreport.py +12 -3
  85. package/md_cg/sleep.py +129 -13
  86. package/md_cg/sources.py +1 -1
  87. package/md_cg/state_events.py +131 -0
  88. package/md_cg/state_slots.py +221 -0
  89. package/md_cg/stg.py +68 -3
  90. package/md_cg/sustain.py +1436 -1436
  91. package/md_cg/test_auditview.py +277 -0
  92. package/md_cg/test_autonomy_modes.py +2 -1
  93. package/md_cg/test_boot_openblas_guard.py +197 -0
  94. package/md_cg/test_ccg_form_parity.py +95 -4
  95. package/md_cg/test_cons200_scan_selection.py +4 -2
  96. package/md_cg/test_datapath_device_name.py +62 -3
  97. package/md_cg/test_generation_guard.py +5 -2
  98. package/md_cg/test_ghostref.py +182 -0
  99. package/md_cg/test_interop.py +1 -1
  100. package/md_cg/test_issue52_scan_condition_first.py +1 -1
  101. package/md_cg/test_lifecycle_retire_leak.py +408 -0
  102. package/md_cg/test_lock.py +16 -7
  103. package/md_cg/test_m3_h9_semantic_guard.py +1 -1
  104. package/md_cg/test_n230_dirty_replay.py +375 -375
  105. package/md_cg/test_n238_body_text_parity.py +156 -0
  106. package/md_cg/test_n276_probe_hoist.py +199 -0
  107. package/md_cg/test_p4_freshness.py +95 -1
  108. package/md_cg/test_policy_required_ccg.py +3 -1
  109. package/md_cg/test_read_face_semantics.py +6 -3
  110. package/md_cg/test_readcache_prodpath.py +66 -0
  111. package/md_cg/test_sleep.py +58 -1
  112. package/md_cg/test_sleep_p1.py +218 -2
  113. package/md_cg/test_state_event_op.py +514 -0
  114. package/md_cg/test_state_events.py +178 -0
  115. package/md_cg/test_state_slots.py +691 -0
  116. package/md_cg/test_time_core_lint.py +8 -1
  117. package/md_cg/test_writepipe.py +8 -5
  118. package/md_cg/tokens.py +18 -2
  119. package/md_cg/writepipe.py +76 -0
  120. package/package.json +2 -2
  121. package/skills/plugin.json +1 -1
  122. package/src/bridge.ts +9 -0
  123. package/src/hooks.ts +599 -517
  124. package/src/lib/hook_audit.ts +243 -0
  125. package/src/lib/mutual.ts +5 -1
  126. package/src/lib/roleplay_web.ts +17 -2
  127. package/src/lib/session_state.ts +127 -0
  128. package/src/tools.ts +12 -1
  129. package/zcode/AGENTS.md +6 -6
@@ -0,0 +1,281 @@
1
+ # 缺陷挖掘 · 自主迭代 第 32 轮报告(性能面深挖)
2
+
3
+ > **报告文件**:`docs/eval/缺陷挖掘_自主迭代_v31.md`(文件序号 v31;**轮次号为第 32 轮**——本轮工作流草案即「缺陷迭代第 32 轮性能面」(`.zcode/workflow-drafts/缺陷迭代第32轮性能面.dwf.ts`,本席 `ls` 复核存在),与文件序号序列自洽:v30 = 第 31 轮 TS 面)。
4
+ > **扫描域**:性能面四区——`retrieval-io`(md_cg 检索/读缓存面)/ `index-boot-write`(索引装载与写提交面)/ `compiler-hive-rust`(compiler/hive/swarm-rust 面)/ `plugin-hotpath`(插件 TS 热路径面)。
5
+ > **候选池**:8 条(四区扫描 → 逐条独立复核)。**结论分布**:`real 8` / `already_covered 0` / `false_positive 0`。
6
+ > **分诊**(材料 ②):`fix 6`(编号 **N273–N278**)/ `defer 2` / `rejected 0`。**执行面**:本轮编排上限 `MAX_FIX=5`——fix 前 5 条(N273–N277)进入修复流程,第 6 条 **N278 被截断、未执行**(本席实查三证,见 §四-7)。
7
+ > **落地实况**(本席实跑核验工作区 + 材料 ③):**N273 / N274 / N276 = verified**;**N275 / N277 = blocked**(未改码);**N278 = 未执行(截断)**。全部落码集中在 `md_cg/` 面(9 件修改 + 1 件新增守卫),`src/`、`hive/` 零改动。
8
+ > **首次编写**:本文件此前不存在(本席实跑 `ls docs/eval/` 复核最大为 v30)。
9
+
10
+ **行号口径**:全文行号为本席**亲读的现工作区行号**(工作区含本轮 N273/N274/N276 的未提交改动),与材料 ①/③ 的时点行号有偏移处逐条注明。
11
+
12
+ **来源标注约定**:材料 ①(四区复核席)、②(分诊席)、③(修复席)、④(编排三关读数)、⑤(自检席);未注明来源且写明「本席实跑」的读数为本会话第一手。
13
+
14
+ ---
15
+
16
+ ## 一、执行摘要
17
+
18
+ 1. **扫描面**:性能面四区(见文首),候选池 8 条、独立复核全部`real`(复核席逐条亲手搭临时库复现,见 §三-1 全量复核表)。判据全部为可复现量化读数(调用/盘读计数或同条件串行 3rep 中位),符合本轮「单发墙钟不作判据」的口径。
19
+ 2. **分诊与执行**(材料 ② + 本席核验):real 8 条 → `fix 6`(**N273–N278**,按优先级降序)/ `defer 2` / `rejected 0`;编号自树内实占最大值 N272 之后连续编(§四-2)。**执行面如实记录**:编排脚本上限 `MAX_FIX=5`(本席实读本轮工作流脚本原文 `const MAX_FIX = 5;` + `const fixList = triage.fix.slice(0, MAX_FIX);`)——**N278(`src/lib/hook_audit.ts` 审计 `#save`)未进入修复流程**,材料 ③ 的 fixOutcomes 亦仅 5 条(N273–N277,本席解析核对)。N278 列遗留清单(§五-3)。
20
+ 3. **落地实况**(本席实跑核验工作区 `git status`/`git diff --stat` + 逐点读码 + 守卫单跑):
21
+ - **N273 / N274 / N276 = verified**(落码在位、4 件守卫单跑全绿、parity 逐位一致,见 §二/§四)。
22
+ - **N275 / N277 = blocked**(修复席按红线未改码:N275 命中「不得触碰 hive/src(锚点漂移面)」;N277 命中「语义面改动须裁决」四条实证)。
23
+ - **N278 = 未执行**(MAX_FIX 截断,非判定 blocked、亦非已修)。
24
+ 4. **编号实占核对(硬要求 ③)**:本席现跑 `git grep -ohE 'N[0-9]{3,4}'`(工作区)与对 `HEAD` 树同款扫描:**HEAD 面实占最大 = N272**(`802` = `# noqa: N802` lint 码,剔除;`docs/promo/promo-visual-1.png` 的 N273 命中为 PNG 压缩字节巧合、`.zcode` 草案件的字面量为扫描器模板注释,均非占用);工作区新增字面量 N273/N274/N276 全部落在本轮修复面,N275/N277/N278 零命中(未落码,与 §二 状态一致)。N273–N278 连续、全局唯一。
25
+ 5. **三关读数(本席独立复跑,与材料 ④ 逐项一致)**:python 全量 `python -X utf8 scripts/run_tests.py --jobs 4` → **退出码 0、`SUMMARY 352/352 通过,5 跳过`**(材料 ④ 同读数);`npm test` → **退出码 0、`tests 127 / pass 126 / fail 0 / skipped 1`**(材料 ④ 记「退出码 0」,计数为本席复跑值);`npm run gate` → **退出码 1、VERDICT=FAIL**(材料 ④ 记「退出码 1、VERDICT=非 PASS」,同读数)——**红腿明细(本席实跑取得)**:唯一失败 = `check_publish_artifact` 的 **R4 非追踪件面**(`命中=1;非追踪=31,允许=30`,唯一点名 = 本轮新增守卫 `md_cg/test_n276_probe_hoist.py` untracked,判据「包内非追踪件仅允许 `lib/`」);`check_unreachable` 577 文件命中 0;因 gate 脚本为 `&&` 链,其后的其余 9 腿在本轮门禁中未经执行(逐腿单跑读数见 §四-9)。**属交付面流程项**(新守卫/报告须随批次 `git add`),非正文形态缺陷。
26
+ 6. **严重度不一致(如实并列)**:**N276**——材料 ① `low` / 材料 ③ `medium`(不一致);其余:N273(medium/medium)、N274(medium/medium)、N275(medium/medium)、N277(medium/medium)一致;N278(① `low`,③ 无条目)。
27
+ 7. **重复面处置**:8 条的「未被既有编号/历轮留档覆盖」排查由材料 ① 逐条给出(含 N121 / N52 / N212 / N241-N242 / N133 / D6-R-2 / v25 / P1b2 / v26 / 批次105 / T4 等的核对),本席读核其现码行号与落码在位性;历轮留档复测结论见 §三-2(含材料缺口如实登记)。
28
+
29
+ ---
30
+
31
+ ## 二、修复清单(6 条:N273–N278)
32
+
33
+ > **读数来源声明**:各条「修前基准 → 修后同条件读数」「守卫读数(含定点变异)」「语义不变证明」均**来自材料 ③(修复席)**,**非本席实跑**(红基线/前后对比须改码与专设临时库,属修复席职责;本 ask 为报告编译)。本席实跑部分为:工作区落码核验(§四-3)、4 件守卫单跑(§四-4)、rank_parity(§四-5)、全量回归与 npm test(§四-6)。材料 ③ 状态:N273/N274/N276 = `verified`、N275/N277 = `blocked`、N278 无条目(截断未执行);本节如实转写、不归一。
34
+
35
+ ### N273 · `_like` 召回键派生物(`positive_body`)缓存缺口
36
+
37
+ - **where(现行)**:`md_cg/mdcg.py:3380-3395`(新增 `MdCG._positive_body(entry, content)` 钩子,默认直调 `nodefile.positive_body`;材料 ③ 载 :3379-3395)· `md_cg/mdcg.py:4122`(`_like` 增 `entry=None, positive_body=None` 形参;保 `staticmethod` → 三/四参旧签名调用零改动)· 透传调用点 7 处:`md_cg/mdcg.py:3842/3871/3976`、`md_cg/mdcos.py:982/1011/1047/1099` · `md_cg/mdcos.py:1360`(`_path_fuzzy` 同族直调改走钩子)· `md_cg/readcache.py:195-216`(install 增 `_positive_body` path 键控缓存层,走既有 `_fresh` 脏集失效;`:224` `clear` 增 `_positive_body_cache`)。守卫:`md_cg/test_readcache_prodpath.py:176-216`(P8 节)+ `:80`(spy 助手 `count_pb`)。
38
+ - **问题**:`content` 已被读缓存常驻(`readcache.py:139-151`),只依赖 `content` 的派生物里 readcache 只缓存了更贵的 `bigrams(normalize_en(c))`(`readcache.py:176-191`),漏了同样纯、同样只依赖 `content` 的 `positive_body(content)`——每个候选节点每查询重跑一遍逐行 CCG 剥除(含 `re.escape`+`re.match` 的 regex 构造);8000 池实测**每查询 8000 次**、单点 ~11.6µs、pb 总耗时 ~102ms(占热态查询 **46.9%**)(材料 ③;复核口径见材料 ①:单点 9.97µs、缓存不对称直接对照 `_doc_norm_bigrams` miss=0 而 `positive_body` 仍 8000 次/查询)。
39
+ - **修法**:照既有 `_doc_norm_bigrams` 钩子同形——`_like` 的召回键正文改由「每查询每候选节点重算」变为「readcache path 键控 + `_DirtyDict` 脏集失效的派生物复用」;未改面(诚实边界):`md_cg/reach.py:64` 的 `_doc_tokens` 仍直调(reach 索引重建期每节点一次、`MDCG_REACH` 默认关)、`md_cg/bench_membench.py:377` 保留三参旧签名(诊断脚本兼容面)。
40
+ - **修前基准 → 修后同条件读数(材料 ③;条件:`%TEMP%` 下临时库、8000 节点、每节点 15 行含六要素 + 不适用条件行、build 一次复用同一份库文件、串行单进程、`record=False`、热态 3rep 取中位)**:
41
+ - 修前:`hot_ms_med = 220.7 / 216.0 ms`;每查询 `positive_body` 调用 **8000 次**;pb 总耗时 101.9 / 101.4 ms(占热态 46.9%);单点 11.63 / 12.30 µs;冷态 609.6 / 616.1 ms(8000 calls,首装)。
42
+ - 修后:`hot_ms_med = 114.6 / 117.8 ms`(相对修前中位约 **-47%**);每查询调用 **0 次**;pb 总耗时 0.0 ms;`_positive_body_cache` 在位(len=8000)。冷态 614.1 / 617.5 ms(首次装载仍 8000 calls,首装成本不增)。
43
+ - 结果面:top-k(id + 6 位小数分数)修前/修后**逐位一致**(cold 与 3 个热 rep 全部 True)。
44
+ - **守卫读数(材料 ③)**:P8 节 PASS 20 / FAIL 0(调用计数为主判据、identity 快照为辅、P8d 为常驻红基线自证腿);**定点变异自证**:删一处调用点的 hook 透传(mdcos.py T2 调用点)→ EXIT=1、P8pre/P8a/P8b/P8c/P8e 全红,恢复后复跑复绿。**本席实跑复跑:`python -X utf8 -m md_cg.test_readcache_prodpath` → `PASS 20 / FAIL 0`、RC=0**(§四-4)。
45
+ - **语义不变证明(材料 ③)**:① `python -X utf8 scripts/rank_parity.py --exe rust/target/release/mdcg-eval.exe`(内建语料,先 `cargo build --release`)→ 逐位一致 10/10、集合 10/10;加 `--dataset scripts/retrieval_dataset.json` 亦 10/10。② 同进程等价对拍:A 全池 8001 节点 `cg._positive_body(e,c)` == `nodefile.positive_body(c)`;B `_like` 钩子版 == 三/四参旧签名版(128016 次判定全等);C/D search 端到端「缓存版 == 摘回未缓存版」逐位一致(8 query,含 tier/scanned)+写 1 节点后同款。③ 相关既有守卫全绿:`test_p2_six_elements` 42/0、`test_p33_ccg_wiring` 58/0、`test_ccg_form_parity` 108/0(1 条既有 SKIP)、`test_reach` 39/39、`test_readcache_precise_inval` 23/0、`test_opt_batch1_md_cg` 22/0。④ 全量回归 `python -X utf8 scripts/run_tests.py --jobs 4` → 351/351 通过、退出码 0(该条修复时点读数;其后 N276 守卫入集后为 352/352,见 §四-6)。
46
+ - **severity**:medium(材料 ① 与材料 ③ 一致)。**状态**:**verified**(材料 ③;本席核验落码在位,§四-3)。
47
+
48
+ ### N274 · `_score` 内 freshness 乘子链的逐节点 env 重读(循环外提升)
49
+
50
+ - **where(现行)**:`md_cg/mdcg.py:4170-4181`(`_score` 循环外各解析一次 `freshness.enabled()` / `freshness_now()` / `resolve_gamma(None)`;本席亲读三取在 :4179-4181,材料 ③ 载 :4178-4180)· `md_cg/mdcg.py:4207-4210`(循环内经既有 `entry_weight(e, now=…, gamma=…, fm=…, enabled=…)` 透传,循环内零 env 读取)· `md_cg/freshness.py:183-201` / `:205-240` / `:269-315`(`decay_factor` / `refresh_factor` / `entry_weight` 各增可选 `enabled=None`;`:190-191`/`:221-222`/`:288-289` 自算分支经 `globals()["enabled"]()` 保持与改前 `enabled()` 逐位一致的解析语义;`:310`/`:312` 向核透传)。
51
+ - **问题**:`_score` 对每个候选节点调用 freshness 乘子链,链上 6 处 `(environ or os.environ).get(...)` 被逐节点重读(修前形态:4×`freshness.enabled` @ mdcg.py:4161 / freshness.py:272/:190/:213 + 1×`freshness_now` @ :155 + 1×`temporal_gamma` @ mdcos.py:90);一次查询内 flag 恒定却按节点数重复付费——**8001 池实测 56007 次/查询 = 7×8001**(enabled 32004 = 4×N、now 8001、resolve_gamma 8001、temporal_gamma 8001)(材料 ③;复核席另测 8000 池 48011 次/查询 = 6×8000+11、absent key 单次 0.363µs、消融 -21.6%/-22.3%,见材料 ①)。
52
+ - **修法**:循环外提升 + 形参透传(`enabled=None` 默认自算 = 其余调用方零变更;禁用时不解析 now/γ,与修前「`enabled=False` 早退于解析之前」同序;恒不调 `entry_weight` 保持修前零调用);与 `_path_temporal` 的既有模式(mdcos.py:1301 `gamma = temporal_gamma()` 循环外取)同款。
53
+ - **修前基准 → 修后同条件读数(材料 ③;条件:`%TEMP%` 下同一临时库、8001 节点、每节点 15 行含六要素、串行、`record=False`、热态 3rep 取中位)**:
54
+ - 修前:`hot_ms_med = 106.8 / 111.1 ms`;每查询 freshness 调用 **56007 次**;top-10 ids/scores 留档。
55
+ - 修后:`hot_ms_med = 80.4 / 81.8 / 76.7 ms`(**-24.7% / -26.4%**);每查询调用 **8005 次**——enabled/now/temporal 各 1 次(env 读取面常数化),余 gamma 8002 为 `resolve_gamma` 的 early-return 薄调用(不读 env,~0.15µs/节点;保留以守「非法 gamma 回落缺省」单点边界)。
56
+ - 结果面:top-10 ids/scores 与修前**逐位一致**,tier/scanned 同。
57
+ - **守卫读数(材料 ③)**:`md_cg/test_p4_freshness.py` 新增 **G13**(:586-660:env 读取面与文档数无关判据 + 三面常数断言 + 常驻自证腿 + 显式透传/自算逐位同值 + `enabled=False` 恒 1.0);G5(:288-296)结构断言匹配形态同步为跨行调用(判据性质不变)。`test_p4_freshness` **89 通过 / 0 失败**、`--mutate` 5/5 转红 rc=0;**定点变异自证**:撤回循环内透传 → EXIT=1、G13 四条红(enabled/now/temporal 随 N)+ G5 红,恢复后复跑 89/0 复绿。**本席实跑复跑:`python -X utf8 -m md_cg.test_p4_freshness` → `89 通过 / 0 失败`、RC=0**(§四-4)。
58
+ - **语义不变证明(材料 ③)**:① rank_parity(内建语料 + `--dataset`)各实跑 → 逐位一致 10/10、集合 10/10、top-1 10/10。② 同进程等价对拍:A1 `entry_weight` 自算==显式透传(全池 8001 节点逐位);A2/A3 `decay_factor`/`refresh_factor` 两形态(多 dt、3×2×3 组)全等;B1 固定时钟(`MDCG_FRESHNESS_NOW`)下 `_score` 生产路径 ==「丢弃透传替身」逐位一致(2000 文档,first_diff=None);B2 判别力:生产路径 != 乘子关态。③ 既有守卫复跑全绿(`test_mode_parity` 64/0 等);全量回归 351/351(一次带并行的跑出现 9 条 scripts/ 组红,经逐条独立复跑 9/9 全绿,确认为并发资源竞争伪失败;上记 351/351 为独占复跑)。
59
+ - **severity**:medium(材料 ① 与材料 ③ 一致)。**状态**:**verified**(材料 ③;本席核验落码在位,§四-3)。
60
+
61
+ ### N275 · hive serve 主循环每拍 status.json 双读(排序 pass + 领取 pass)
62
+
63
+ - **where(现行)**:`hive/src/scheduler.rs:340`(排序 pass `for id in job::list_jobs_by_created(&cfg.jobs)`)与 `:343`(领取 pass `read_status_classified(&dir)`);`hive/src/job.rs:905-912`(`list_jobs_by_created` 逐 id 调 `created_ts_of`)→ `:882-891`(`created_ts_of`→`read_status`→`read_json`,无 memo)与 `:708-717`(`read_status_classified`:is_file+read_json)、`:682-684`(`read_status`);`poll_ms=400` 见 scheduler.rs:133、sleep 见 `:459`。
64
+ - **问题**:hive serve 主循环每拍对池内每个任务的 `status.json` 做**两次完整读+解析**(排序 pass 一遍取 `created_ts`,紧接着的领取循环再 `read_status_classified` 一遍);两遍同文件、同拍、无缓存(Rust 侧 `cache|memo|CACHE` 零命中),排序 pass 已解析的 Json 未回传给循环复用。**复核读数(材料 ①,本席未复跑)**:N=5000 时 375.9ms/拍(其中第二遍占 43.7%~49.1%,可完全消除),已占 `poll_ms=400` 的 94%(每拍周期实际翻倍);机械判据:盘读次数 A=2N、B=2N、C(纯 listdir)=0;行为判据证实两遍为独立盘读(probe 在 A pass 后改一个 state、删一个 status.json,B pass 读到新值/Absent)。
65
+ - **修法(材料 ②)**:拍内单次读——让排序 pass 的解析结果与领取 pass 共用(`list_jobs_by_created` 返回 `(id, StatusRead)` 序列,排序键取其中 `created_ts`,领取段不再二次 `read_status_classified` 读盘)。须守:H-3 三态语义(`job.rs:696-717`:Absent 与 Corrupt 不混)、`created_ts` 排序真值单点(`:893-912`,缺/坏一律 `i64::MIN` 哨兵)、合并后「拍内单快照」窗口语义注释记账、旧签名存量调用点行为逐位不变。
66
+ - **修前基准 → 修后同条件读数**:**无前后动态基准**——修复席按红线(明文「不得触碰 hive/src(锚点漂移面)」,且 hive/src 含在役完整性锚判据实现)**未改任何代码**,无法注入读计数(材料 ③)。静态判据(修复席读码):现状每拍 status 读+解析 = 2N(A pass N + B pass N;`list_jobs` 本身 0 次读);量化读数(375.9ms/拍等)源自分诊材料(即材料 ① 复核席),修复席未复跑。**status = blocked**。
67
+ - **守卫读数**:未新增/未改动守卫(未改码);若授权后修,守卫拟落在 hive 既有测试面(`job.rs` 内单测扩展「单次读变体保序/三态」+ `hive/test_h3_h7_scheduler.py` 等行为腿),修复席未落。
68
+ - **语义不变证明**:不适用(未改码);须守语义面已在上述「修法」中点明。
69
+ - **severity**:medium(材料 ① 与材料 ③ 一致)。**状态**:**blocked**(材料 ③;本席核验 `hive/` 零改动,§四-3)。
70
+
71
+ ### N276 · `MdCG.get` 首行的每调用索引代际签名重探(写链读环批内单探针)
72
+
73
+ - **where(现行)**:`md_cg/mdcg.py:3307-3309`(`get` 增可选 `probe=True`,默认行为不变;`probe=False` 跳过首行 `_maybe_reload_index()`)· `md_cg/mdcos.py:5123-5140`(`MdCGSecure.get` 覆写同步 probe 形参:未命中分支的 N196 探活同跳,`super().get(node_id, probe=probe)` 透传)· `md_cg/forgetting.py:185-196`(`redundancy` 循环外单探一次 + 环内 `cg.get(nid, probe=False)`);`:204-205` 环内调用 · `md_cg/consistency.py:635-648`(`check` 精比环同款)。守卫:`md_cg/test_n276_probe_hoist.py`(新增,199 行、11 断言)+ 夹具接口同步 `md_cg/test_cons200_scan_selection.py:331`(`_CountGet.get(nid, probe=True)` 原样透传,计数判据一字未动)。
74
+ - **问题**:每次 `cg.get` 都重算一次索引代际签名探针(`_maybe_reload_index`→`_index_signature`:快照 `os.stat` + `os.listdir` + 逐分片 stat);写链内 `forgetting.redundancy`(≤MAX_COMPARE=240)与 `consistency.check`(≤MAX_SCAN=200)各调 `cg.get` 一遍,**单次写内约 440 次探针结果恒同**(复核席实测:N=800 单写 `os.stat=450`、`os.listdir=444`、444 次探针 `sig_distinct=1`、`reload_true=0`;单次签名 38.15µs ⇒ 440 次 ≈16.8ms,占单写中位 87.5ms 约 19%)(材料 ①)。
75
+ - **修法**:`get` 增可选 `probe=True`(默认零变);写链两环循环外单探一次、环内 `probe=False`;无 `_maybe_reload_index` 的载体(测试桩)回落原 `cg.get(nid)` 零破坏。语义窗口 = 批量读期间「他进程写入」不被探知(毫秒级),与读缓存已声明的进程内一致性边界同款,已注释记账。
76
+ - **修前基准 → 修后同条件读数(材料 ③;条件:`%TEMP%` 下固定临时库、300 节点同层、build 一次复用、串行、3rep 取中位)**:
77
+ - 修前:A `forgetting.redundancy` 探针 **240 次/调用**、中位 23.19 / 23.06 ms;B `consistency.check`(`log_write=False`)探针 **200 次/调用**、中位 23.73 / 23.17 ms;合计 **440 次探针/写**(与复核席 `probe_calls=444` 同口径)。
78
+ - 修后:A 探针 **== 1**、中位 14.83 / 14.62 / 13.97 ms;B 探针 **== 1**、中位 16.62 / 17.16 / 16.15 ms;合计探针 **440 → 2**、墙钟约 **46.9 → 31.5 ms**(省约 15.4ms/写;反推单次探针 ≈ 35µs,与复核 38.15µs 吻合)。
79
+ - **守卫读数(材料 ③)**:`test_n276_probe_hoist` **11 通过 / 0 失败**;**定点变异自证**:把两处环内改回逐节点探针 → EXIT=1、C1a/C2a 红(calls=13),恢复后复跑 11/0 复绿。相关既有测试复跑全绿:`test_p9_forget_protect` 37/0、`test_cons200_scan_selection` 27/0(夹具同步后)、`test_issue52` 36/0、`test_h4_sustain_snapshot` 43/0、`test_writelimit`、`test_n238_body_text_parity` 37/0、`test_b1_auto_id_multiproc` 11/0、`test_b1b2_write_face` 33/0、`test_n206_stdio_jsonrpc_type` 33/0。**本席实跑复跑:`test_n276_probe_hoist` → `11 通过 / 0 失败`;`test_cons200_scan_selection` → `27 通过 / 0 失败`**(§四-4)。
80
+ - **语义不变证明(材料 ③)**:① rank_parity(内建语料 + `--dataset`)各实跑 → 逐位一致 10/10。② 同库等价性:C3 `get(nid)` 与 `get(nid, probe=False)` 返回逐位一致;C7a/C7b `redundancy` 与 `check` 在「单探+probe=False」与「逐节点 probe=True」两形态下输出逐位一致(check 剔动态键 `t`);C5 他实例写入后单探+probe=False 读到新节点(可见性不丢)。③ 全量回归 352/352、5 跳过、退出码 0(含新增守卫入集)。
81
+ - **severity**:**材料 ① `low` / 材料 ③ `medium`(不一致,如实并列)**。**状态**:**verified**(材料 ③;本席核验落码在位,§四-3)。
82
+
83
+ ### N277 · 写链读环逐节点 `cg.get` 裸读盘(不经读缓存)
84
+
85
+ - **where(现行)**:`md_cg/mdcg.py:3307-3328`(`get`:裸 `open`+`nodefile.loads`,不经读缓存;本席亲读 :3314-3316)· `md_cg/forgetting.py:192-205`(`redundancy` 环内逐节点 `cg.get(nid)`)· `md_cg/consistency.py:637`(`check` 精比环 `cg.get(nid)`)· `md_cg/readcache.py:128-153/176-191`(install 只包 `_read_status`/派生钩子,`get` 零包装)。
86
+ - **问题**:写路径每次落盘经 `forgetting.redundancy` 对同层节点逐节点 `cg.get` 读盘,`cg.get` 为裸 `open`+`nodefile.loads` 不经默认开启的读缓存;同一条检索已把整池解析进 `_read_cache` 后,写链仍逐节点重读(复核席实测:600 池预热 `_read_cache=600`/`_norm_bigrams_cache=600` 后 `redundancy` 仍 `loads=240`;预热后写链仍 `loads=440` = redundancy 240 + consistency 200)(材料 ①)。
87
+ - **修法(材料 ②,未执行——须裁决)**:`get` 改走既有三态读单点 `self._read_status(e)`(readcache 已包装的缓存面),保留既有 `_open_content` 解密/鉴权链。**修复席判定 blocked 的四条实证**(材料 ③):① 对外可观测面:`get` 就是 MCP `op=read` 的实现(`md_cg/mcp_server.py:2314→:2347 cg.get(_nid)`)——外部直改盘面后 `cg.get` 立即可见、`_read`(缓存面)仍旧值,改后 read op 的对外可见性应验变化;② 与历轮裁决方向相反:`test_govern_directread.py` 头注载明既定口径——治理面需真值的读点改走 `direct_read`(穿透缓存),第 7/9 轮共 29+ 处从缓存面拨回直读,`get` 是仅存的公开直读口;③ 对象别名面(材料未提):`get` 两次返回**不同对象**(新解析)vs `_read` 两次返回**同一对象**(缓存复用)——读-改-写消费者(如 `forgetting.reinforce:539`、`evolution.apply:366`)可就地改返回的 frontmatter 而污染缓存对象;④ 越界行为差异:现状 `get` 的 `_node_disk_path` 在 try 之外(越界 `ValueError` 上抛),`_read_status` 吞为 `(None,None,None)`;⑤ 守卫语义立场:`test_reconcile_v0.py` [4] 组 4b 断言「自动修复:检索面读到盘面新正文(**盘面为真源**)」。
88
+ - **修前基准 → 修后同条件读数**:**无修后读数**(未改码,status=blocked)。修前计数与收益上界(材料 ③;条件:同条件临时库、300 节点、串行):① 写链 `loads` 计数:A redundancy 240 次 + B check 200 次 = **440 次/写链**(与复核席 `loads=440` 口径吻合);② 收益上界:240 次 `get`(含 loads)中位 **20.99ms** vs 240 次 `_read`(缓存命中)中位 **0.07ms**(省 ~20.9ms/240 次;440 次外推 ≈38ms/写链)。
89
+ - **守卫读数**:未新增/未改动(未改码);若裁决授权,验证方案(材料 ③):rank_parity 两模式逐位一致 + 协作写者场景 `get` 两形态输出逐位一致 + 外部直改边界文档化记账 + `get` 消费者(尤其读-改-写链)逐点排查 + 全量回归。
90
+ - **语义不变证明**:不适用——该改动在「非合作写者直改盘面」与「返回对象身份」两个面上**无法给出全域逐位一致的等价性断言**(证据见上述①③),这也是判 blocked 的理由本身。
91
+ - **severity**:medium(材料 ① 与材料 ③ 一致)。**状态**:**blocked**(材料 ③;本席核验 `get` 保持裸读形态、`readcache` 未新增 `get` 包装,§四-3)。
92
+
93
+ ### N278 · 审计 `#save` 每次 mkdir + 新建时间戳 tmp(未执行 · MAX_FIX 截断)
94
+
95
+ - **where(修前/现行)**:`src/lib/hook_audit.ts:211-242`(`#mutate`→`#save`:`:233` `mkdirSync(dir,{recursive:true})` + `:234` 新建 `${path}.${pid36}.${now36}.tmp` + 全量 pretty-JSON `writeFileSync` + `renameSync`;本席亲读保持修前形态);调用面 `src/hooks.ts:518/523/531/537`(observeKind/filtered)+ `:426/430/432`(not_ready/written/failed)+ `:506`(subagent 会话级早 return)+ `:559/569`(sanitized);对照 `src/bridge.ts:24-34`(`debugLogDirReady` 缓存 mkdir 形制)。
96
+ - **问题(材料 ① 复核席;条件:编译产物 `lib/` 直测、%TEMP% 临时库、node v24、串行 3 进程 × 每进程 warmup+300 iter、3 rep 取中位)**:批次 105(commit c6f59263)新增的落盘审计**恒开**,且每条进入消息级处理的 user/message 事件(无论写入还是被滤)触发 **2 次 `#save`**;每次 `#save` 无条件 mkdirSync + 新建 pid/时间戳命名 tmp + writeFileSync 全量 pretty-JSON + renameSync,全部在宿主 session/event 同步回调内执行,无任何配置开关可关。关键读数:observeKind 单次中位 **0.3893 ms**、written 单次 **0.3651 ms**、一条 user 消息(observeKind+written**)0.7233 / 0.7393 / 0.7432 → 中位 **0.7393 ms**;单次 `#save` 分解 total 0.3583 = mkdirSync 0.0300 + writeFileSync(新 tmp, 2381B) 0.1357 + renameSync 0.1910 ms;对照:写新文件 0.1346 vs 覆盖已存在文件 0.0944 ms;fs 调用计数(零侵入 loader 重定向 node:fs):S1 一条 user 事件 `{mkdir:2, write:2, rename:2}`、S2 一条被滤事件同样 2 次审计写而 MCP 调用 0、S3 子代理会话仅 1 次。边界订正:schemastery 3.18.1 实测透传未知键——手写 `memory.auditPath` 可改路径但仍关不掉(无「关闭」开关)。
97
+ - **修法(材料 ②,未执行)**:`#save` 复用对照件的「目录就绪一次」缓存(mkdir 仅首次或失败后重试,同 `src/bridge.ts:24-34` 的 `debugLogDirReady` 形制),tmp 名固定为 `<path>.<pid>.tmp` 复用(免每次新建),保留 rename 失败清理 tmp 的既有路径。预期收益(材料 ②):约 0.1–0.14ms/消息(约 15–20% 审计成本);判据 = fs 调用计数(`mkdir 2→≤1/进程`、write 落同一 tmp)。
98
+ - **修前基准 → 修后同条件读数**:**无修后读数——该条未进入本轮修复**:分诊列出 fix 6 条(按优先级降序,N278 居第 6),编排上限 `MAX_FIX=5` 将其截断(本席实查三证:① 本轮工作流脚本原文 `const MAX_FIX = 5;` + `const fixList = triage.fix.slice(0, MAX_FIX);`;② 材料 ③ fixOutcomes 仅 N273–N277 五条(本席解析核对);③ 工作区 `src/` 零改动、`hook_audit.ts` `#save` 保持修前形态、全树 N278 字面量零命中——见 §四-7)。
99
+ - **守卫读数**:无(未执行)。**语义不变证明**:不适用(未执行)。**severity**:low(材料 ①;材料 ③ 无条目)。**状态**:**未执行(截断)**——既非 verified 亦非 blocked,列 §五-3 遗留。
100
+
101
+ ---
102
+
103
+ ## 三、发现明细
104
+
105
+ ### 3-1 全量复核表(8 条)
106
+
107
+ > **结论与严重度来源**:材料 ①(四区复核席);「去向/编号」为材料 ② 分诊(含 MAX_FIX=5 执行截断的如实登记);where 列的「现行」行号为本席亲读(§四-3),与材料时点行号偏移处注明。8 条 `verdict` 全部为 `real`(复核席逐条亲手复现)。
108
+
109
+ | # | where(材料时点 → 现行,本席亲读) | 结论 | severity(①/③) | 覆盖号 | 去向 / 编号 | 来源 |
110
+ |---|---|---|---|---|---|---|
111
+ | 1 | `md_cg/mdcg.py:4161` + `freshness.py:190/213/272/155` + `mdcos.py:90` → 现行循环外 `mdcg.py:4170-4181`、透传 `:4207-4210` | real | medium/medium | — | **fix · N274 · verified(已落地)** | 材料 ①③;本席读核现码 |
112
+ | 2 | `md_cg/mdcg.py:4110`(`_like` 内 `positive_body`)→ 现行钩子 `mdcg.py:3380-3395`、缓存层 `readcache.py:195-216` | real | medium/medium | — | **fix · N273 · verified(已落地)** | 材料 ①③;本席读核现码 |
113
+ | 3 | `md_cg/mdcg.py:1578-1601`(`_index_signature` 逐分片 stat)+ `fsutil.py:89-102` | real | low/— | — | **defer**(残片回收与节流触语义面,须设计裁决) | 材料 ①②;本席读核现码 |
114
+ | 4 | `md_cg/forgetting.py:186-192`(`redundancy` 逐节点 `cg.get`)→ 现行 `:192-205` | real | medium/medium | — | **fix · N277 · blocked(未改码,语义面四条实证)** | 材料 ①③;本席读核现码 |
115
+ | 5 | `md_cg/mdcg.py:3307-3308`(`get` 首行无条件探活)→ 现行 `:3307-3309`(`probe` 形参) | real | **low/medium(不一致)** | — | **fix · N276 · verified(已落地)** | 材料 ①③;本席读核现码 |
116
+ | 6 | `hive/src/scheduler.rs:340/:343` + `job.rs:905-912/882-891/708-717` | real | medium/medium | — | **fix · N275 · blocked(红线禁 hive/src,未改码)** | 材料 ①③;本席读核现码 |
117
+ | 7 | `src/lib/hook_audit.ts:211-242` + `src/hooks.ts:416/518/523/531/537/559/569/426/430/432` | real | low/—(③ 无条目) | — | **fix · N278 · 未执行(MAX_FIX=5 截断)** | 材料 ①②;本席读核现码 |
118
+ | 8 | `src/hooks.ts:554`(`memorize('user-recall', … g.read(k=3))`) | real | low/— | — | **defer**(须新增轻量触点或客户端降频——设计裁决) | 材料 ①②;本席读核现码 |
119
+
120
+ **计数核对**:8 条 = real **8**(#1–#8)+ already_covered **0** + false_positive **0** ✔(与材料 ① 逐条 verdict 一致)。
121
+ **去向核对**:fix 6 = N273(#2) / N274(#1) / N275(#6) / N276(#5) / N277(#4) / N278(#7);**执行面 5 条**(N278 截断);defer 2(#3、#8);rejected 0。**6 + 2 = 8 = real 条数** ✔。
122
+
123
+ ### 3-2 历轮留档复测结论(含材料缺口如实登记)
124
+
125
+ **本轮必做复测项**(本轮工作流扫描员人物设定原文,本席实读工作流脚本):N121(生产检索稳态 O(全池) 逐节点打分)、N122(`compile()` 每次全量重编含 ~159 行恒定 `_ProtocolRuntime` 前导)、readcache 内存占用(条目字典/装载体积随 N 增长)、v7/v14 留档 swarm-wal Rust 重放(kept_lines 内存面、BufWriter 端到端 <5%)、v7 N52(S7 stat 税 201 次/查询)。
126
+
127
+ **材料 ① 内嵌的复测痕迹(8 条候选 evidence 中的覆盖核查,逐项转写)**:
128
+
129
+ 1. **N121**(检索本体 O(全池) 逐节点打分):候选 1 判「O(全池) 扫描语义面、非同一问题」;候选 2 判「非本缺口」(v14.md:93 最接近的历轮登记);候选 4 判「检索侧同类留档对象不同(v9.md:91-92 的 `_path_graph` 种子腿/《_emit》尾部)」;候选 8 判「与 N121 是不同落点」(调用点「每条消息重复付费」)——**四项界分,均判非重报**。
130
+ 2. **N52**(md_cg/postings.py:122-159 的 S7 目录 stat 税,双开关默认关):候选 3 判「不同位置不同触发面」。
131
+ 3. **N212**(「签名漏看分片」的正确性缺陷,已修):候选 3 判「只共享血缘——本条是其修复引入的代价随残片数线性增长」(历轮邻近留档:`docs/eval/P1b2_读面代际修复_v1.0.md` §六-6「常数成本 ~11-16µs/次」、v24.md:229 风险条、v25.md:41「修复代价 14.3→32.6µs/次」,均未登记残片增长面);候选 5 引「批次 68 认知图节点(N212/N213/N224)只登记签名功能性修复与单次成本」。
132
+ 4. **N241/N242**(`positive_body` 正确性缺陷,已由批次 96 `_strip_ccg_segments` 单点收口):候选 2 判「判据不同(正确性 vs 本性能项)」。
133
+ 5. **N133 / 优化第一批 D1-D3**(「写盘不标脏致陈旧读」):候选 4 判「另一问题」;并引 `性能专项_冷查询与内存_v1.0.md:13`(13,884 次 `_read`/61.2s)为候选外推基线出处。
134
+ 6. **D6/R-2**(优化第一批:Rust 面 `retrieval.rs like_body().to_lowercase` 重复):候选 2 判「另一副本、且为『小写化』非『剥除未缓存』」。
135
+ 7. **v25:41 / P1b2:77**(`_index_signature` 单次成本留档):候选 5 判「只登记单次成本与 `get +3.5%`,未登记写链内 440 次放大」。
136
+ 8. **v26(第 27 轮 hive 面深挖)defer 11 项**:候选 6 判「无此条」。
137
+ 9. **批次 105(引入者)/ v30 / 发布 07 报告**:候选 7 判「无审计性能条目;批次 105 自身未记性能项」。
138
+ 10. **T4 设计(commit cbafcef7「dsh 端对话触发灵枢复用观测」)**:候选 8 判「该读系 T4 设计有意行为,历轮报告(v30 等)无此条」;`git grep 'user-recall'` 仅命中实现本身(src/hooks.ts:422/554)。
139
+
140
+ **缺口如实登记**:扫描席的 `legacyRetest` 专项字段(对上列五项必做项的逐项复测结论本体)**未随本 ask 材料传入**——材料 ① 的 8 条条目字段集为 `where/what/verdict/evidence/severity`(本席解析核对),其中 N121/N52 的复测痕迹以「覆盖核查」内嵌形式可见(上表 1/2/3 项);**N122、readcache 内存占用、v7/v14 swarm-wal Rust 重放三项的复测结论在本 ask 材料中不可见**——本报告不代写、不猜测,登记为材料缺口(若需入档,请编排会话补取扫描席 legacyRetest 原文)。
141
+
142
+ ---
143
+
144
+ ## 四、实跑读数(本会话第一手)
145
+
146
+ > **L1 直跑:`git status` / `git diff --stat` / `git grep`(编号扫描)/ `git log` / 4 件守卫单跑 / `rank_parity` / `run_tests.py --jobs 4` / `npm test` / `npm run gate`(python/原生包装混合)— 风险:低(只读判定为主;`npm` 腿含 build 写 `lib/` 构建产物,属 gitignored 非追踪面;守卫/测试只写系统临时目录);频次:本 ask 内一次性;可逆性:完全可逆(仓库追踪面零写入)。** 按工作纪律第 17 条留痕。
147
+
148
+ 1. **工作区状态**(`git status --porcelain`,本席开工时跑):
149
+ ```
150
+ M md_cg/consistency.py
151
+ M md_cg/forgetting.py
152
+ M md_cg/freshness.py
153
+ M md_cg/mdcg.py
154
+ M md_cg/mdcos.py
155
+ M md_cg/readcache.py
156
+ M md_cg/test_cons200_scan_selection.py
157
+ M md_cg/test_p4_freshness.py
158
+ M md_cg/test_readcache_prodpath.py
159
+ M scripts/test_utf8_boot_guard.py
160
+ ?? md_cg/test_n276_probe_hoist.py
161
+ ```
162
+ **判读**:前 9 件 + 新增守卫 = 本轮 N273/N274/N276 的落码面(`mdcg.py` 承载 N273+N274+N276 三条;`test_cons200_scan_selection.py` 为 N276 夹具同步;`test_p4_freshness.py`/`test_readcache_prodpath.py` 为 N274/N273 守卫)。`scripts/test_utf8_boot_guard.py`(+110 行)为 **issue #58(嵌套日志隔离)的独立修复**(本席读 diff:`_env_clean` setdefault `MDCG_TESTLOG_DIR`、判据 NESTED-LOGS),**不属本轮缺陷迭代 N273–N278 范围**,如实并列不加归因。**`src/`、`hive/` 零改动** ⇒ N275/N277/N278 未落码的结构证据。HEAD = `2a45759e` 未动。
163
+ **核验期间的并发写入(如实并列)**:报告写入后复跑 `git status` 时,工作区另现 `M README.md`(mtime 2026-10-05 22:33,非本席所为——本席全程未 Edit 任何产品文件;内容为套件前置/SKIP 口径的文档修订,**不在本轮 N273–N278 落码面内**,疑似并行会话产物,归属以编排会话核实为准)。上列代码块为**开工时点**快照;本报告 §二/§三 的行号与落码核验均以 `md_cg/` 面为限,不受该并发写入影响。
164
+ 2. **编号实占扫描(硬要求 ③)**(本席实跑,python 包装两条命令并做全树关键词扫描):
165
+ - `git grep -ohE 'N[0-9]{3,4}'`(工作区)→ 去重排序尾部:`… 269 / 270 / 271 / 272 / 273 / 274 / 276 / 802`;其中 **802 = `# noqa: N802` lint 码(剔除)**;**N273/N274/N276 = 本轮修复面落码字面量**;N275/N277/N278 零命中(未落码)。
166
+ - 同款扫描 `HEAD` 树 → 尾部 `… 270 / 271 / 272 / 802` ⇒ **已提交面实占最大 = N272**(与材料 ② 分诊起点一致)。
167
+ - `git grep -nlE 'N27[3-9]'`(工作区)→ 命中全部落在本轮修复面(`md_cg/` 九件)+ `docs/promo/promo-visual-1.png`(PNG 压缩字节巧合,非缺陷号;材料 ② 已做逐字节核验)+ `.zcode/workflow-drafts/缺陷迭代第32轮性能面.dwf.ts` 与运行件(**扫描器脚本自述文字**,非占用)。
168
+ - **结论**:N273–N278 自 N272 之后连续编、全局唯一;报告全文编号与本扫描一致。
169
+ 3. **落码核验**(本席逐点读码,python/grep + Read):
170
+ - **N273**:`md_cg/mdcg.py:3380`(`def _positive_body`,N273 注释 :3388-3393)· `:4122`(`_like(…, entry=None, positive_body=None)`)· `:4141-4144`(透传/直调分支)· 三调用点 `:3842/3871/3976`(`positive_body=self._positive_body`)· `md_cg/mdcos.py:982/1011/1047/1099`(四调用点)· `md_cg/mdcos.py:1358-1360`(`_path_fuzzy` 改走钩子)· `md_cg/readcache.py:195-216`(`_cached_pb` 层 + `_positive_body_cache`)· `:224`(`clear` 三缓存)。
171
+ - **N274**:`md_cg/mdcg.py:4170-4181`(循环外注释+三取)· `:4207-4210`(循环内 `entry_weight(…, enabled=_fr_on)`,零 env 读取)· `md_cg/freshness.py:183-201` / `:205-240` / `:269-315`(三函数 `enabled=None` 形参 + `globals()["enabled"]()` 自算分支 + `:310/312` 透传)。
172
+ - **N276**:`md_cg/mdcg.py:3307-3309`(`def get(self, node_id: str, probe: bool = True)` + `if probe: self._maybe_reload_index()`)· `md_cg/mdcos.py:5123-5140`(`MdCGSecure.get` 同步 probe,N196 探活 `if probe:` 同跳、`super().get(node_id, probe=probe)`)· `md_cg/forgetting.py:185-196`(N276 注释 + 环外单探)+ `:204-205`(环内 `cg.get(nid, probe=False)`)· `md_cg/consistency.py:635-648`(同款)。
173
+ - **N277(未改码)**:`md_cg/mdcg.py:3314-3316` 保持裸 `open`+`nodefile.loads`;`md_cg/readcache.py` 无 `get` 包装。
174
+ - **N278(未改码)**:`src/lib/hook_audit.ts:231-242` `#save` 保持每次 `mkdirSync` + `${path}.${pid36}.${now36}.tmp` 新建(无目录就绪缓存、无固定 tmp 名)。
175
+ - **新增守卫在位**:`md_cg/test_n276_probe_hoist.py`(199 行,untracked);`md_cg/test_readcache_prodpath.py:176-216`(P8)/`:80`(`count_pb`);`md_cg/test_p4_freshness.py:594`(G13 打印行)。
176
+ 4. **守卫单跑(4 件,本席实跑;python 包装 `python -X utf8 -m <模块>`)**:
177
+ ```
178
+ md_cg.test_n276_probe_hoist 11 通过 / 0 失败 (输出尾行)
179
+ md_cg.test_readcache_prodpath PASS 20 / FAIL 0 RC=0
180
+ md_cg.test_p4_freshness 89 通过 / 0 失败 RC=0
181
+ md_cg.test_cons200_scan_selection 27 通过 / 0 失败 RC=0
182
+ ```
183
+ 与材料 ③ 各守卫绿态读数(11 / 20 / 89 / 27)**逐件一致**。
184
+ 5. **排序面 parity(本席实跑)**:`python -X utf8 scripts/rank_parity.py --exe rust/target/release/mdcg-eval.exe` → **逐位一致 10/10 · 集合一致 10/10 · top-1 一致 10/10**、RC=0(语料节点 ~30 · queries=10 · `unify=0` 默认关 · 两侧显式钉住 jaccard)。与材料 ③ 各条 semanticsProof 的 rank_parity 读数一致(N273/N274/N276 均含此腿)。
185
+ 6. **全量回归与 npm test(本席独立复跑,材料 ④ 同读数)**:
186
+ - `python -X utf8 scripts/run_tests.py --jobs 4` → **退出码 0**;尾行 `===== SUMMARY 352/352 通过,5 跳过(依赖缺失/平台不符) =====`。材料 ④ 记「退出码 0(352 条 PASS)」,**逐项一致**。
187
+ - `npm test` → **退出码 0**;`tests 127 / pass 126 / fail 0 / cancelled 0 / skipped 1`(duration ~8.4s)。材料 ④ 记「退出码 0」,一致。
188
+ 7. **N278 截断证据链(本席实查,三证)**:① 本轮工作流脚本原文(`.zcode/workflow-runs/` 下本轮 run 件,本席实读):`const MAX_FIX = 5;` 与 `const fixList = triage.fix.slice(0, MAX_FIX);`;② 材料 ③ 的 fixOutcomes 精确解析 = 5 条(N273–N277;修复席对 6 条 fix 中的第 6 条无产出);③ 工作区三零:`src/` 零改动、`hook_audit.ts` `#save` 保持修前形态、全树(含未跟踪面)N278 字面量零命中;另核 `actor_4`(修复席)工位产物中 `hook_audit`/`N278` 零命中。⇒ **N278 未进入修复**(编排截断),非 blocked、非已修。
189
+ 8. **门禁(本席复跑两段)**:
190
+ - **第一段(报告写入前)**:`npm run gate` → **退出码 1、VERDICT=FAIL**。执行腿:`check_unreachable` → 577 文件、命中 0、语法失败 0(PASS);`check_publish_artifact` → **R4 非追踪件面 FAIL(命中=1;非追踪=31,允许=30;唯一点名 = `md_cg/test_n276_probe_hoist.py`)**,其余规则 R1/R2/R3/R5/R6/R7 全 **PASS**(R7 清单文件数=1569、未扫文本件=0;R1 文件面=0 内容面=0,唯 5 处既有哑值 NOTE 均非本轮引入、不复制其字面量);因 gate 为 `&&` 链,其后 9 腿未执行。与材料 ④「退出码 1、VERDICT=非 PASS」**一致**,且本席取得红腿明细(材料 ④ 未给)。
191
+ - **第二段(报告写入后,本席实跑)**:`check_publish_artifact` → RC=1、VERDICT=FAIL;**R4 非追踪件面:命中=2;非追踪=32,允许=30**,点名两条 = `docs/eval/缺陷挖掘_自主迭代_v31.md`(本报告)+ `md_cg/test_n276_probe_hoist.py`(新守卫)——同一流程项(新文件须随批次 `git add`,入库后 R4 即消);其余规则 **R1/R2/R3/R5/R6/R7 全 PASS**,其中 **R7 清单文件数=1570、未扫文本件=0**——即**本报告已完整进入发布面扫描且 R1(凭据)/R3(隐私)零命中**。
192
+ 9. **报告写入后逐腿单跑(本席实跑,python 包装;报告已入扫描面)**:
193
+ ```
194
+ check_unreachable RC=0 扫描 577 文件、命中 0、语法失败 0
195
+ check_publish_artifact RC=1 R4 非追踪件面 FAIL(命中=2:本报告 + 新守卫);R1/R2/R3/R5/R6/R7 全 PASS(R7 清单文件数=1570、未扫文本件=0)
196
+ check_publish_smoke RC=0 VERDICT=PASS(S4 真握手 / S5 tools 面 == 缺省面 ['cg','stg'])
197
+ cogmap_sync check RC=0 通过(cg 37 op / stg 4 op / whitebox 6 / mdcg_* 31)
198
+ link_check RC=0 受管 md 1288 个、链接 241 条;OK=241 BROKEN=0 UNTRACKED=0
199
+ workspace_index --check RC=0 OK(顶层目录 20 · 追踪 2227 件)
200
+ discipline_nodes --init --write RC=0 已一致(真源指纹 e8c979edba52de41、纪律 18 条)
201
+ verify_discipline --allow-missing RC=0 10/10 目标一致(含 cg-nodes 18/18、注入面 9 条链命中 0)
202
+ check_local_paths RC=0 VERDICT=PASS(追踪面零本机路径)
203
+ ```
204
+ `gate_rust_crate_test` / `gate_rust_parity` 两腿本轮未复跑(材料无相关读数变化,如实登记为未跑)。
205
+ 10. **未由本席实跑、全部标注来源的读数(不得冒充)**:
206
+ - 8 条候选的**构造复现与机械判据**(env 计数 48011、缓存不对称、残片 stat 边际 18µs、写链 440、探针 444、hive 双读行为判据、审计 fs 计数等)→ **材料 ①(四区复核席)**;本席仅读核其现码行号与落码在位性。
207
+ - 各条的**修前基准 / 修后复测 / 守卫红绿与定点变异 / 语义不变对拍** → **材料 ③(修复席)**;本席未复跑(红基线须先回退源码,前后基准须专设 8000/8001 节点临时库)。
208
+ - **分诊编号、修法、defer/rejected 裁定** → **材料 ②(分诊席)**。
209
+ - **三关读数的材料值** → 材料 ④;本席已独立复跑(§四-6/8),读数一致。
210
+ - **双清单自检命中清单** → **材料 ⑤(自检席)**;本报告自身的双清单扫描见 §附-1。
211
+
212
+ ---
213
+
214
+ ## 五、遗留清单(逐条给建议去向)
215
+
216
+ ### 5-1 defer 2 条(材料 ②)
217
+
218
+ 1. **`src/hooks.ts:554` 每条 user 消息的 `user-recall` read(real / low)**:`memorize('user-recall', …)` 在 remember 之外固定多发一次 `cg(op=read)`(k=3、带 session)——该 read 落脑侧生产检索全池打分路径(k 只截输出、不省扫描;复核实测 10k 池中位 ~273ms、30k 中位 ~947ms/次),fire-and-forget 不阻塞回复但占大脑子进程单线程服务时间(`mcp_server.py:4336-4348` 单线程 stdio 循环,在途期间后续请求排队)。**复核确认属实,但修法不在既有单点内**:MCP 面无「只记 access log 不检索」的出口(`mdcg.py:4775` 的 `record_access` 未暴露到工具面),消除须二选一——① 新增轻量触点(新 op 或 `read` 增 `touch_only` 形参,须同步 protocol.py 形态表与守卫);② 客户端降频/采样(改变 access log 覆盖度 ⇒ importance/scrub 陈旧度统计偏置)。**建议去向**:随「检索触点 / access log 语义」设计裁决一并定(本轮 defer;T4 设计有意行为,裁决前不得擅改)。
219
+ 2. **`md_cg/mdcg.py:1578-1601` `_index_signature` 逐他进程 `.log` 分片 stat(real / low)**:每个读入口各做一次代际签名,逐分片 stat 无节流/TTL/上限(每查询 stat 数 = 基线 + 外来分片数;复核实测边际 ≈18µs/stat——**更正材料 ① 对候选读数的一处高估**:10 残片 ≈ +0.18ms/查询、search 基线 6.90ms/查询);非优雅退出的写方分片永久留存(`sweep_stale_temps` 只清 `.tmp-` 形态,fsutil.py:89-102;残片仅在同根实例优雅 close→compact/rebuild 的 `ShardedLog.clear` 清零)。**修法触语义面**:节流/TTL 会直接改变「他进程写入的可见延迟」(正是 N212 修复面,v24.md:229 遗留清单已记「须保证签名比较仍是『一次 stat 级』成本」),残片回收又须先定义「孤儿判定 + 谁有权清」(写方可能仍在写同一分片)。**建议去向**:设计裁决(与 N212 修复面一并记账;与 N276 不重叠——N276 减调用次数,本条减单次成本)。
220
+
221
+ ### 5-2 blocked 2 条(材料 ③)
222
+
223
+ 3. **N275(hive 每拍双读 status.json,medium)**:缺陷属实(静态判据 2N/拍 + 复核量化读数 N=5000 375.9ms/拍、消除 43.7%~49.1%、poll=400ms 实际周期约 2×),修复面全在 `hive/src` 内且红线明令不得触碰(锚点漂移面 + 在役完整性锚判据实现)⇒ 未改码。**建议去向**:待红线/授权明确后按材料 ② 修法(拍内单次读)执行;执行时须守 H-3 三态语义、created_ts 排序真值单点、拍内单快照注释记账、旧签名行为逐位不变(验证方案已在 §二-N275 点明)。
224
+ 4. **N277(写链读环 `cg.get` 裸读盘,medium)**:缺陷属实(440 次 loads/写链;预热后仍逐节点重读;收益上界 ≈38ms/写链),但材料修法(`get` 改走 `_read_status` 缓存面)在「非合作写者直改盘面可见性」与「返回对象身份」两个面上无法给出全域逐位一致断言(四条实证见 §二-N277)⇒ 未改码。**建议去向**:**须使用者/设计裁决**——方案 A(原案,`get` 全局走缓存:同步处理①可见性②治理面口径③对象别名拷贝或全量审计④越界行为差异 + readcache 文档串补注);方案 B(局部变体,仅 redundancy/check 两环改走缓存面、公开 API 零变:仍须记「写链判定输入退到快照口径」且不得改动 `get` 本体)。裁决前保持现状。
225
+
226
+ ### 5-3 未执行 1 条(MAX_FIX 截断)
227
+
228
+ 5. **N278(审计 `#save` 常数项,low)**:分诊 fix 第 6 位、被编排上限 `MAX_FIX=5` 截断,未进入修复(三证见 §四-7);材料 ③ 无其前后基准。**建议去向**:下一轮(或补跑批)按材料 ② 修法执行(目录就绪缓存 + tmp 固定名复用;判据 = fs 调用计数 `mkdir 2→≤1/进程`、write 落同一 tmp);复测须以本轮复核读数为修前基准(§二-N278,条件:`lib/` 直测、%TEMP% 临时库、node v24、串行 3 进程 × 300 iter、3rep 中位)。
229
+
230
+ ---
231
+
232
+ ## 六、纪律合规声明
233
+
234
+ 1. **工具面降级声明(第 7 条)**:本会话 `cg(op=route, intent=…)` 经 MCP 端 `mdcg` 正常返回(命中历轮 v27/v28/v29/v30 报告章节节点与「缺陷挖掘报告/纪律合规声明」知识),**未触发降级兜底**。
235
+ 2. **命中纪律声明(第 0.2 条)**:本席开工按纪律第 0.1 条先 `cg(op=route)`、按第 18 条先读 `WORKSPACE_INDEX.md`(定位 `docs/eval` 为历轮报告面);命中并在会话回复输出 `response.direct` 原文的条目:第 5 条(验证——三关复跑与守卫单跑)、第 8 条(中文思考)、第 15 条(命令执行/相对路径)、第 16 条(归档闭环——本报告由编排会话处置归档)、第 17 条(L1 直跑留痕)、第 18 条(工作区索引优先)。本报告各节即其执行痕迹。
236
+ 3. **只读与不改产品源码**:本席**未改任何产品源码文件**——全部命令为只读判定腿(§四),唯一写入为本报告自身 `docs/eval/缺陷挖掘_自主迭代_v31.md`(新建)与临时跑器输出(系统临时目录)。工作区在役改动(N273/N274/N276 落码面)由修复席产出、本席零触碰。
237
+ 4. **命令执行(第 15 条)**:python 腿经 `python`(argv + 显式 UTF-8 + `PYTHONUTF8=1`);`git`/`grep`/`ls`/`tail`/`wc` 为 MSYS 豁免面;**如实申报**:`npm test` 与 `npm run gate` 两条腿为原生程序直跑(未 python 包装),输出经文件重定向捕获、读取实测无乱码(边界判据「本次调用是否产出非 UTF-8 字节流」实测为否);解析类操作(材料/日志/jsonl)一律经 python(`encoding='utf-8', errors='replace'`)。
238
+ 5. **任务派发(第 17 条)**:本席为工作流内报告撰写席,只做编排与只读判定,未派发新的执行性任务;只读命令合并为一条 L1 留痕(§四 首行)。
239
+ 6. **归档(第 16 条)**:本席仅产出报告文件,未写灵枢记忆(N273/N274/N276 的修复归档由修复席/编排会话按流程处置;本报告的归档由编排会话处置)。
240
+ 7. **编号一致性(硬要求 ③)**:全文编号(N273–N278、N121/N52/N212/N133/N196/N207 等历史引用、`802` 注明 lint 码)与 §四-2 实占扫描一致;N275/N277/N278 明示「未落码」源于工作区零字面量事实。
241
+ 8. **路径脱敏(硬要求 ②)与自伤规避**:本报告全部路径为仓库**工作区相对路径**或中性占位(`<仓根>` / `%TEMP%` / `~/`);不含本机盘符绝对路径、不含凭据字面量(材料中的哑值样本一律不复制其字面量,只作机制性描述);报告写入后 `check_local_paths` 与 `check_publish_artifact` 的机械读数见 §附。**另如实申报**:本报告撰写期间读取了本工作流运行面(脚本 `.zcode/workflow-runs/` 与本席会话记录)以确证 N278 截断证据链与材料结构;未读取、未触碰任何在役记忆库与在役 serve。
242
+ 9. **口径声明**:材料 ③ 的 N275 条自陈其量化读数「源自分诊材料(即材料 ① 复核席)、本席未复跑」——本报告转写时已如实标注该转引链(§二-N275);同理,hive 面 375.9ms/拍 等读数**非本席实跑、亦非修复席实跑**,实际执行者为材料 ① 复核席。
243
+
244
+ ---
245
+
246
+ ## 七、跳过项及原因
247
+
248
+ | 项 | 原因 |
249
+ |---|---|
250
+ | **未复跑各条「修前基准 / 红基线」** | 前后基准须改码 + 专设 8000/8001 节点临时库(属修复席流程),红基线须先回退产品源码;本 ask 为报告编译。故一律标注**材料 ③**,本席未复跑、不冒充。 |
251
+ | **未端到端复现 §三-1 各候选的构造** | 复现需搭临时库/起多进程/打桩(属材料 ① 复核席职责);本席只读核其现码行号、判据与落码在位性(§四-3)。 |
252
+ | **未复跑 `gate_rust_crate_test` / `gate_rust_parity` 两腿** | 材料无相关读数变化;本席复跑门禁在 `&&` 链前段(`check_publish_artifact` R4)短路,两 Rust 腿未执行;如实登记为未跑(材料 ③ 各条另含各自 rank_parity 实跑,见 §四-5)。 |
253
+ | **未取回扫描席 `legacyRetest` 原文** | 该字段未随本 ask 材料传入(§三-2 已登记缺口);本席不代写、不猜测;建议编排会话补取。 |
254
+ | **未裁决 N277 的两方案与 N275 的授权面** | 属语义面/红线设计裁决(材料 ③ 已并列证据与候选方案),ask 未授权;本席只如实并列、不代替裁决。 |
255
+ | **未执行 N278** | 编排上限 `MAX_FIX=5` 截断(三证见 §四-7);本席为报告席,不代执行修复。 |
256
+ | **未 `git add` / commit** | 提交由编排会话执行;本席只写报告。**连带读数**:本报告与新守卫在发布面为 untracked ⇒ `check_publish_artifact` R4 判负(须随批次 `git add`)。 |
257
+
258
+ ---
259
+
260
+ ## 附:双清单自查(内容政策 + 隐私)
261
+
262
+ **1. 本轮材料自检(材料 ⑤,自检席)**:`{"policyClean": true, "privacyClean": true, "hits": []}` —— 扫描面 = 本轮改动文件与其新增守卫 + 本报告(若已写出);0 命中。
263
+
264
+ **2. 本报告自身扫描(本席实跑,报告写入后)**:
265
+ - 盘符绝对路径正则 `grep -cE '([^A-Za-z0-9]|^)[A-Za-z]:[\\/]' docs/eval/缺陷挖掘_自主迭代_v31.md` → 读数见下;
266
+ - 凭据形态正则 `grep -cE 'sk-[A-Za-z0-9]{12,}|mdcg1\.[A-Za-z0-9._-]{8,}|gh[pousr]_[A-Za-z0-9]{20,}|tk_[0-9a-f]{8,}|Bearer [A-Za-z0-9._-]{16,}' docs/eval/缺陷挖掘_自主迭代_v31.md` → 读数见下;
267
+ - 行尾字节核验(python 逐字节计数:LF / CRLF / 裸 CR);
268
+ - 发布面机械证据:`check_local_paths`、`link_check`、`check_publish_artifact`(R1/R2/R3/R7 对含本报告的清单)复跑读数见下。
269
+
270
+ **写入后复跑读数(本席实跑;命令与逐腿 RC 见 §四-8/9)**:
271
+ - 盘符绝对路径正则 → **0 命中**;凭据形态正则 → **0 命中**;行尾 python 逐字节计数 → **LF=269、CRLF=0、裸 CR=0**;`](` 字面组合 2 处(均出自代码引用 `globals()["enabled"]()` 的 `"]()` 片段,非链接形态;`link_check` 判定 UNTRACKED=0/BROKEN=0 为机械旁证)。
272
+ - `check_local_paths` → **VERDICT=PASS**(追踪面零本机路径;报告为 untracked 不在该腿判面内,报告自身的盘符判据以上行 0 命中为准)。
273
+ - `link_check` → 受管 md 1288 个、链接 241 条、**OK=241 BROKEN=0 UNTRACKED=0**(报告无坏链)。
274
+ - `check_publish_artifact` → R1 凭据面 / R2 私有数据面 / R3 隐私文本 / R7 扫描面完整性(清单文件数=1570、未扫文本件=0)全 **PASS**——**本报告在发布面扫描下零命中**的机械证据;唯一红腿 R4 = 「本报告与新守卫 untracked」的追踪态判负、非正文形态(§四-8)。
275
+ - `check_publish_smoke` VERDICT=PASS · `cogmap_sync check` 通过 · `workspace_index --check` OK · `verify_discipline --allow-missing` 10/10 一致(读数同 §四-9)。
276
+
277
+ **结论**:`policyClean = true`(内容政策:无违规内容;对内容类别样本只作机制性中性描述、不复写字面量);`privacyClean = true`(无盘符绝对路径、无真实凭据、无个人隐私)。
278
+
279
+ ---
280
+
281
+ *报告席产出:`docs/eval/缺陷挖掘_自主迭代_v31.md`。本席未改任何产品源码;全文数字凡非本席实跑均标注来源(① 复核席 / ② 分诊席 / ③ 修复席 / ④ 编排三关 / ⑤ 自检席)。N278 截断证据链(§四-7)为本报告独有的编排面核验。*
@@ -0,0 +1,231 @@
1
+ # 语义时空图补全 · P1:状态事件抽取器 v4 三率读数
2
+
3
+ > 语料:私有双角色转录(`<语料根>/<转录文件>.md`,1,546 轮段 / 773+773;只读)
4
+ > 答案卷:`<答案卷>/key_items.json`(14 槽位 / 25+ 事件 / 13 陷阱案;只读)
5
+ > 脚本:`scripts/probe_b_state_events_v4.py`(新建;纯标准库、确定性、零记忆库写入)
6
+ > 基线:`scripts/probe_b_whale_statechain.py`(v3 探针,未改动,保留作基线)
7
+ > 产物:`<out>/state_events.jsonl`(25 行)+ `<out>/rates.json`(三率明细);`--out` 强制仓外(fail-closed)
8
+
9
+ ---
10
+
11
+ ## 一、方法(pipeline ①–⑦)
12
+
13
+ v4 把语料抽成**与记忆库台账 `_state_events.jsonl` 五元同构**的事件行:
14
+ `subject / slot / old / new / kind / seq / evidence / actor`(+本探针扩展 `not_fact`)。
15
+ kind 五类严格照台账定义(`md_cg/state_events.py`):`migration` / `retraction`(old 有值 new 空)/
16
+ `enablement`(old 空 new 有值)/ `acquisition` / `replacement`。
17
+
18
+ 1. **切块**:`**我说:**`/`**DeepSeek说:**` 正则分块 → 1-based 轮段表(1,546 段)。
19
+ 2. **发言者归属**:role 即归属;`actor` 取事件判定轮的发言者(`我说` / `鲸鱼小姐`)。
20
+ 3. **引用块剥离**:剔除以 `>` 起始的**整行**(v3 复核 red 修口径,非只删 `>` 字符)。
21
+ 4. **抽事件**:24 条词形/句式规则扫描剥离后正文,逐条注明命中口径(见 §二);
22
+ old/new 按上表五类定义取空操作数;迁移类槽位(住所/关系阶段)走**链式**口径
23
+ (old=上一事件的 new)。
24
+ 5. **消歧**三件套:
25
+ (a) **用户侧声明优先**——同一槽位以「我说」的声明为真值来源;她的复述/记错不覆盖,
26
+ 且「记错」语境本身不产生事件(§五记错案 M1–M5);
27
+ (b) **非事实三类标记** `not_fact`(自动判定:按规则声明的**语境轮**查线索词):
28
+ `joke`(玩笑)/ `meta`(创造者-管理员/元层设定)/ `recollection`(对 DeepSeek 时期回忆);
29
+ (c) **时点/同指消歧**——住所搬迁时点取**内容实指**(首个含「海景别墅」的轮 = turns 1108),
30
+ 搬迁前的 home 词形归 tent(v3 口径 B)。
31
+ 6. **落盘**:`state_events.jsonl`(一行一事件)+ `rates.json`(哈希、计数、三率明细、
32
+ v3 对齐、消歧与陷阱案判定表);stdout 末行 `P1_RATES_JSON {...}` 摘要。
33
+ 7. **对拍**:按(同槽位 + kind 一致 + **同向值比对**(旧值↔旧值、新值↔新值,禁交叉项:
34
+ key 的旧值=上一事件新值,交叉比对会把链式槽位的相邻事件误配)+ 锚句↔短证
35
+ 的字符 2-gram Jaccard)打分 → **一对一贪心分配**(一条 v4 事件至多认领一条 key 事件)
36
+ → 漏 / 误 / 错三率。认领线 `T_HIT=0.12`、正确线 `T_OK=0.30`(依据见 §三)。
37
+
38
+ 隐私与确定性(硬性):脚本不内嵌任何本机/语料路径字面量(路径全走 CLI);证据短证
39
+ 硬上限 30 字且只取事实型;**同输入两次运行产物字节一致**(sha256 实测相同);
40
+ 不设/不读 `MDCG_*`、不碰任何在役库。
41
+
42
+ ---
43
+
44
+ ## 二、声明覆盖槽位(11 个;三率分母来源)
45
+
46
+ | 槽位 | 规则(命中口径) | v4 事件 | key 事件 |
47
+ |---|---|---|---|
48
+ | 住所 | `casa_move`:首个「海景别墅」轮(=v3 casa 实指) | 1 | 2 |
49
+ | 关系阶段 | `rel_ident/partner/butler/soul/shop`:五处字面锚句(链式口径) | 5 | 5 |
50
+ | 房贷 | `mortgage_on`:「写…小说…还」;`mortgage_off`:仅**我说**「房贷\|房租 ×玩笑」 | 3 | 2 |
51
+ | 名字 | `name_ban`:「不准乱起…名字」 | 1 | 1 |
52
+ | 外貌规格(体型) | `body_veto`:「改成…体态高挑优雅」;`body_add`:「必须加上…海边最好看」 | 2 | 2 |
53
+ | 日记制度 | `journal_new`:「每一天晚上我们都写日记」;`journal_body`:「初遇篇…改成日记」 | 2 | 2 |
54
+ | 菜品与菜单 | `shop_open`:「都已经在营业」;`dishes_new`:「就叫梦幻之海」 | 2 | 2 |
55
+ | 宝物清单 | `tre_pearl/gift/ring/list`:挑选/赠予/成对/清点四处 | 4 | 4 |
56
+ | 早安吻与早安咬 | `morning_kiss`:「每天早上亲一下」;`morning_bite`:「就这一次\|下不为例」 | 2 | 2 |
57
+ | 记忆特性 | `mem_self`:「记错我们生活的细节」;`mem_self2`:「没有认出过去的自己」 | 2 | 2 |
58
+ | 店铺规模 | `shop_scale`:「经理和店长…担起责任」 | 1 | 1 |
59
+
60
+ **未覆盖槽位(单列、不计入三率)**:形态(1 条)、发色与瞳色(1 条)、米饭(评估史撤回,1 条)——理由见 §四。
61
+
62
+ ---
63
+
64
+ ## 三、三率(对拍答案卷)
65
+
66
+ **分母 = 25**(声明覆盖槽位在 key 中的事件数;全表逐条如下)。
67
+ **分子:漏 1 / 误 0 / 错 1。**
68
+
69
+ `rates.json` 节选(原样):
70
+
71
+ ```json
72
+ "denominator": 25,
73
+ "rates": {
74
+ "miss": {"num": 1, "den": 25},
75
+ "false": {"num": 0, "den": 25},
76
+ "wrong": {"num": 1, "den": 25}
77
+ }
78
+ ```
79
+
80
+ `P1_RATES_JSON {"events": 25, "denominator": 25, "miss": [1, 25], "false": [0, 25], "wrong": [1, 25], "uncovered_slots": 3, "not_fact": {"recollection": 2, "meta": 2, "joke": 2}, "v3_align_ok": true, "corpus_sha256_16": "589d69ab8bc32f3c"}`
81
+
82
+ **漏(1/25)**
83
+
84
+ | 槽位 | 期望(anchor) | 抽出 | 复核 |
85
+ |---|---|---|---|
86
+ | 住所 key#1 | 「住处:家里与店里」(新=家与店/当前时间线) | **无**(该槽位唯一 v4 事件与 K2 的相似度 0.0513,低于认领线 0.12;1108 已按序对齐给 key#0) | 该条为**时段归纳**(当前时间线=家+店并存),语料内无单一变更点/裁定句。判定:真漏,属粒度差异(归纳型 vs 事件型),不粉饰。 |
87
+
88
+ **误(0/25)**——多余候选 1 条,**复核为真**(不计入误率):
89
+
90
+ | v4 事件 | 复核 | 理由 |
91
+ |---|---|---|
92
+ | 房贷@turns 1163(retraction,not_fact=joke+meta) | true | 主角确有此声明(「房租只是开个玩笑」),属实;key 选择 turns 1477(她受伤处)作正式撤回点——本条为**早期同义声明**,如实留存、不计误。 |
93
+
94
+ **错(1/25)**
95
+
96
+ | 槽位 | 期望 | 抽出 | 分值 | 复核 |
97
+ |---|---|---|---|---|
98
+ | 早安吻与早安咬 key#1 | enablement:早安咬**升级为固定日常**(与早安吻并列) | enablement@turns 1534(「早安咬(条件性达成:『就这一次』)」) | 0.1207 | **抽出-值差异**:kind 对、时点对;语料截至 1546 仍为条件性/「下不为例」,「固定日常」为 key 侧演出裁决、语料无证据——按「值不一致」归**错**,不归漏。分值险过认领线(0.1207 ≥ 0.12),已在阈值说明中标注。 |
99
+
100
+ **配对明细(25/25 全列;score=一对一分配后的最终分值)**
101
+
102
+ | 槽位 | key# | kind | 抽出 seq | score |
103
+ |---|---|---|---|---|
104
+ | 住所 | 0 | migration | 1108 | 0.3333 |
105
+ | 住所 | 1 | migration | —— | 0.0000(漏) |
106
+ | 关系阶段 | 0–4 | migration×5 | 136 / 952 / 1193 / 1245 / 1308 | 0.5082 / 0.4167 / 0.5417 / 0.4118 / 0.5000 |
107
+ | 房贷 | 0 / 1 | acquisition / retraction | 1123 / 1477 | 0.4884 / 0.5273 |
108
+ | 名字 | 0 | retraction | 1138 | 0.7857 |
109
+ | 外貌规格(体型) | 0 / 1 | replacement / acquisition | 1140 / 1138 | 1.0000 / 0.8095 |
110
+ | 日记制度 | 0 / 1 | enablement / replacement | 1481 / 1481 | 0.5102 / 1.0000 |
111
+ | 菜品与菜单 | 0 / 1 | acquisition×2 | 1320 / 1413 | 0.6842 / 1.0000 |
112
+ | 宝物清单 | 0–3 | acq×3 / repl | 687 / 689 / 1040 / 1505 | 0.7692 / 0.8000 / 1.0000 / 1.0000 |
113
+ | 早安吻与早安咬 | 0 / 1 | acquisition / enablement | 1528 / 1534 | 1.0000 / 0.1207(错) |
114
+ | 记忆特性 | 0 / 1 | acquisition / retraction | 1475 / 613 | 0.7857 / 1.0000 |
115
+ | 店铺规模 | 0 | acquisition | 1498 | 1.0000 |
116
+
117
+ **阈值选取依据(附分数分布)**:全部 key×v4 同槽位组合的分数呈三分带——
118
+ ①正配对高带 0.3333–1.0000(23 条);②贴线正配对 0.1207(早安咬,值差异);
119
+ ③跨事件误配低带 0.0000–0.1765(最高:关系 k3↔952,全部被更高分正配对在贪心分配中压住);
120
+ 另 1 条 0.3500(房贷 k1↔1163)为**同义重复事件**(1163 与 1477 描述同一撤回),
121
+ 复核为真(见上表)。认领线取 **0.12**(略低于贴线正配对 0.1207,使「抽到但值差异」计入错
122
+ 而非漏);正确线取 **0.30**(位于正配对带下沿 0.3333 之下、误配带 0.1765 之上——两带轻微
123
+ 重叠,故不以纯阈值分离,而靠「同向值比对 + 一对一贪心 + 高置信对优先」的联合判据,见脚本 `compare()`)。
124
+
125
+ ---
126
+
127
+ ## 四、未覆盖清单(单列,不计入三率)
128
+
129
+ | 槽位 | key 事件 | 原因(如实) |
130
+ |---|---|---|
131
+ | 形态 | 1(retraction:固定混体=人形上身+双腿+鲸尾) | 语料内**无裁定句**(字面锚点检索 MISS);判定依据在语料外的角色形象图/规格件。 |
132
+ | 发色与瞳色 | 1(replacement:以她说为准/蓝紫是打光) | 同上(裁定句在语料外);语料内仅间接证据:珍珠「跟她的发色和眼睛十分相配」(turns 688)。 |
133
+ | 米饭(喜好判误撤回) | 1(retraction:撤回误判) | 属**对抽取史的元层撤回**,非语料内状态事件;语料内米饭=正常喜好(统计口径:**剥离引用块后含「米饭」的轮数 35**,同口径出现 41 次;含引用块 raw 计 191 次),含「必须配上两碗白米饭」turns 576 与惩罚句「只能吃白米饭配海带丝」turns 1154(**语料逐字**;key 侧 content_anchor 措辞为「只准吃白米饭配海带丝」,引自答案卷而非语料)——惩罚语义≠不吃饭,支持该撤回。 |
134
+
135
+ ---
136
+
137
+ ## 五、消歧检验
138
+
139
+ ### 5.1 记错案(≥3 处,逐处判定+证据;短证 ≤30 字)
140
+
141
+ | # | 案 | 轮 | v4 判定 | 证据(短证) |
142
+ |---|---|---|---|---|
143
+ | M1 | 带鱼记错争议 | 1477→1478 | **拒收为事件**:口角/指控,她当场反驳;带鱼非覆盖槽位 | 「谁记错带鱼了,我明明是在提醒」(1478) |
144
+ | M2 | 菜名记错(反转) | 1477 / 1485–1486 | **拒收为事件**:随后的反转是主角自己忘名、她提醒——菜品真值不因记忆波动改写 | 「叫梦幻之海,昨天你自己定下的」(1486) |
145
+ | M3 | 家/店厨房混淆 | 1477 | **拒收为事件**:场景记忆混淆不覆盖住所真值(住所真值=用户侧声明链 1101→1108→1505;与 F-帐篷同源) | 「忘记了我们在家里厨房,而不是在店」(1477) |
146
+ | M4 | 房贷(用户侧声明) | 1477 | **抽到**(retraction,new 空;`not_fact=joke`;`actor=我说`):她是被声明方,真源属用户侧 | 「房贷并不需要还,那只是一个玩笑」(1477) |
147
+ | M5 | 米饭(历史误判回溯) | 576 / 1154 | **拒收为记错证据**:惩罚用法与正常喜好并存,支持「米饭=正常喜好」 | 「必须配上两碗白米饭」(576)/惩罚句「只能吃白米饭配海带丝」(1154,语料逐字) |
148
+
149
+ 另:她在 turns 1477 的三条「记错」指控(带鱼/菜名/家店)**均未产生事件**(同轮唯一事件为
150
+ M4 房贷撤回);`rates.json.disambiguation.memo_cases` 可查各案的自动核对结果。
151
+
152
+ ### 5.2 非事实三类标记(`not_fact`,事件行内可查)
153
+
154
+ | 值 | 命中事件 | 语境线索(短证) |
155
+ |---|---|---|
156
+ | `joke` ×2 | 房贷@1163、房贷@1477 | 「房租只是开个玩笑啦」(1163)/「那只是一个玩笑」(1477) |
157
+ | `meta` ×2 | 住所@1108、房贷@1163 | 「的真实身份是这个世界的创造者」(1103)/「这个房子只是故事里创造出来的」(1163) |
158
+ | `recollection` ×2 | 记忆特性@613、记忆特性@1475 | 「没有认出过去的自己」(613)/「我已经把我们的记忆安置好了」(1475) |
159
+
160
+ ### 5.3 陷阱案(key `trick_cases` 13 条,逐案)
161
+
162
+ | 陷阱 | v4 判定 | 证据轮 |
163
+ |---|---|---|
164
+ | E-房贷 | **抽到**(房贷 retraction@1477,joke);**真源归属=我说**(用户侧声明);她当日「布丁和糍粑都是假的吗」的受伤反应证明真值曾属她——v4 不改写其历史,只记声明导致的作废 | 1123 / 1477 / 1478 |
165
+ | F-帐篷 | **部分覆盖**:迁移事件唯一(turns 1108);搬迁后 tent 词形按 v3 口径 B 如实计复发(=24,见 §六),「回帐篷」同指/笔误不产生新迁移事件 | 1108 / 1484 / 1494 / 1502 / 1516 |
166
+ | G-早安咬 | **抽到**(enablement@1534,条件性)——与 key 期望「固定日常」的差异即 §三「错」条目,如实标注 | 1527 / 1528 / 1534 / 1538 |
167
+ | 规格否决-童颜巨乳 | **抽到**(replacement@1140) | 1139 / 1140 |
168
+ | 规格否决-禁小名 | **抽到**(retraction@1138) | 1138 |
169
+ | 规格否决-无理取闹 | **未覆盖**(性格规格不在声明覆盖槽位) | 1138 |
170
+ | 撤回-FOOD_RICE | **未覆盖**(对抽取史的元层撤回;见 §四) | 572 / 576 / 1154 |
171
+ | A-形态 | **未覆盖**(裁定句在语料外) | —— |
172
+ | D-发色瞳色 | **未覆盖**(裁定句在语料外;间接证据=珍珠配色句) | 688 / 1026 |
173
+ | C-大房子元层 | **抽到并标 meta**(住所迁移@1108,证据链含 1103 元层自白) | 1103 / 1108 / 1197 |
174
+ | 初遇三层 | **部分覆盖**:初遇篇体例变更已抽(日记制度 K2@1481);三层分层属叙事层级、不入事件 | 1481 / 1144 / 1155 / 1463 |
175
+ | 边界-和解非雷 | **未覆盖**(无词形锚点;和解由关系链 rel_soul@1245 承载) | 1245 |
176
+ | 边界-拒绝非终点 | **未覆盖**(无词形锚点;「松口」以 G-早安咬的「条件性达成」记) | 1534 / 1538 |
177
+
178
+ ---
179
+
180
+ ## 六、与 v3 基线对照
181
+
182
+ **同一语料复跑 v3(仓根直跑,退出码 0)**,v4 内建复算五项读数并比对——**全部一致**(`v3_align_ok: true`):
183
+
184
+ | 读数 | v3 实测 | v4 复算 |
185
+ |---|---|---|
186
+ | 轮段数(我说/DS) | 1,546(773/773) | 1,546(773/773) |
187
+ | 住所·有信息轮(口径 B) | 249 | 249 |
188
+ | 住所·值段 | 27 | 27 |
189
+ | 搬迁实指(casa) | turns 1108 | 1108 |
190
+ | 复发(口径 B) | 24 | 24 |
191
+
192
+ 口径承继:①轮号映射 `r=(turns-4)/2`(我说)/`(turns-5)/2`(DS);②引用块**整行**剥离;
193
+ ③搬迁时点取内容实指(「海景别墅」首现轮)。v3 是**状态链回放探针**(值段/复发/判据读数),
194
+ v4 是**事件抽取器**(事件→三率);v4 把 v3 的值段/复发复算保留为住所槽位的基线段,
195
+ 事件层只在实指轮记一次迁移(复发计读数、不产事件)。
196
+
197
+ v3 未覆盖面(v4 延续如实):v3 docstring 已述「值段级口径段内含多轮、复发含合法回忆/剧情语境」
198
+ ——v4 的 24 处复发读数同样只是**上限读数**,缺陷级计数仍须与 CD-WHALE-01 报告逐点对照。
199
+
200
+ ---
201
+
202
+ ## 七、复跑命令(路径为中性占位)
203
+
204
+ ```bash
205
+ # v4(本报告读数来源;--out 必须为仓外目录,脚本内 fail-closed 断言)
206
+ PYTHONUTF8=1 python -X utf8 scripts/probe_b_state_events_v4.py \
207
+ --corpus <语料根>/<转录文件>.md --key <答案卷>/key_items.json --out <仓外输出目录>
208
+
209
+ # v3 基线(保留原样,未改动)
210
+ PYTHONUTF8=1 python -X utf8 scripts/probe_b_whale_statechain.py --corpus <语料根>/<转录文件>.md
211
+ ```
212
+
213
+ 自测记录:v4 连续两次运行,`state_events.jsonl` / `rates.json` sha256 前 16 位均相同
214
+ (`55ed33e54747f20f` / `5f8c2f4d9483b53a`,字节一致);`--out` 指向仓内时退出码 1 并拒绝执行
215
+ (fail-closed 实测:仅打印拒绝信息、不落任何文件)。
216
+
217
+ ---
218
+
219
+ ## 八、如实边界(规则式抽取的能力上限)
220
+
221
+ 1. **高精度、低召回**:24 条规则(`len(RULES)=24`,含 5 个关系阶段闭包 finder)全部锚在语料**字面词形/句式**上——抽到即证据可查,
222
+ 但对**归纳型**槽位(关系阶段命名、住所「家与店」时段、形态/发色裁定)只能部分覆盖;
223
+ key 的归纳性判定(如「固定日常」「笔误处理」「三层分叙」)不在规则能力内。
224
+ 2. **对拍是机械匹配+人工复核的合体**:分值来自 2-gram 相似度,阈值敏感点已单列
225
+ (早安咬 0.1207);`REVIEWED_CANDIDATES` 复核表与记错/陷阱判定表为**口径化人工常量**
226
+ (逐条给理由),非全自动推导——"误率 0" 应读作「无经复核为假的抽出」,不是「零多余事件」。
227
+ 3. **key 非穷举**:v4 抽出 25 条、其中 1 条(房贷@1163)key 未列(复核为真);反向的
228
+ key 归纳条目(§四)单列不计三率。
229
+ 4. **样本量**:分母 25(单语料、单答案卷);按粒度为「槽位事件」,不构成跨语料泛化证据。
230
+ 5. **隐私**:报告与脚本零本机路径;示例短证 ≤30 字且仅事实型;中间产物只落 WORK 输出目录;
231
+ 零记忆库写入(未设/未读任何 `MDCG_*`、未碰任何在役库)。
@@ -45,7 +45,7 @@ dot-env/密钥扩展,内容回喂外部 LLM 网关前拦截),不受根白
45
45
  ### P1-2 / P1-3 / P1-4 / P1-5 —— 报告原文到手后批次 26 已修
46
46
 
47
47
  批次 25 曾判「待报告原文」(记忆载体落空)——使用者提供原文
48
- (`D:\program\dsh-memory-代码审查报告.md`)后对齐施工:
48
+ (`dsh-memory-代码审查报告.md`)后对齐施工:
49
49
 
50
50
  - **P1-2** `src/lib/roleplay_web.ts` `requireEditKey` **fail-closed**:未配置
51
51
  `ROLEPLAY_EDIT_KEY` → 写操作一律 403(`editKeyHint()` 引导配置)。此前
@@ -1,6 +1,6 @@
1
1
  # 蜂巢 M6 ingest 实施计划 v0.1
2
2
 
3
- > 真源:`D:\2_ai\蜂巢记忆架构设计.md` §5(M6 规格已细化到可施工)+ §5.5 层归属纪律。
3
+ > 真源:`<外部设计稿>\蜂巢记忆架构设计.md` §5(M6 规格已细化到可施工)+ §5.5 层归属纪律。
4
4
  > 本计划 = 施工蓝图 + 判定单。开工依据:使用者指令(2026-09-23,P2 接线开工)。
5
5
 
6
6
  ## 〇 条件空间声明