@furongjun1999/dsh-memory 0.6.0 → 0.7.0

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 (202) hide show
  1. package/README.md +618 -572
  2. package/codebuddy/CODEBUDDY.md +10 -10
  3. package/data/policy.json +27 -0
  4. package/docs/README.md +1 -0
  5. package/docs/discipline/harnesses.yaml +31 -0
  6. package/docs/discipline/templates/full.md.tmpl +1 -1
  7. package/docs/discipline/templates/rules.mdc.tmpl +1 -1
  8. 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 +418 -0
  9. 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 +441 -0
  10. 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 +398 -0
  11. 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 +498 -0
  12. 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 +669 -0
  13. 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 +683 -0
  14. package/docs/eval//345/207/272/350/264/247/351/235/242/345/206/222/347/203/237_/350/277/233/350/264/247/351/227/250/347/246/201_v1.0.md +460 -0
  15. 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 +205 -0
  16. package/docs/eval//345/217/221/345/270/20308_/350/207/252/350/277/255/344/273/243/344/270/216/347/235/241/347/234/240_/345/233/276/346/243/200/347/264/242/350/267/257/344/270/216/346/235/203/351/207/215_v1.0.md +97 -0
  17. package/docs/eval//345/275/222/344/270/200/345/261/202/347/274/272/347/234/201/347/277/273/345/205/263_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +458 -0
  18. package/docs/eval//346/200/247/350/203/275/344/270/223/351/241/271_/345/206/267/346/237/245/350/257/242/344/270/216/345/206/205/345/255/230_v1.0.md +218 -0
  19. package/docs/eval//346/225/205/351/232/234/346/263/250/345/205/245/345/256/236/346/265/213_v1.0.md +10 -0
  20. 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 +646 -0
  21. 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_v20.md +283 -0
  22. 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_v21.md +224 -0
  23. 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_v22.md +223 -0
  24. 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_v23.md +293 -0
  25. 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_v24.md +303 -0
  26. 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_v25.md +230 -0
  27. package/docs/hive//346/243/200/347/264/242/347/256/227/346/263/225/345/217/243/345/276/204/345/257/271/347/205/247_v0.1.md +136 -11
  28. package/docs/hive//346/243/200/347/264/242/350/267/257/345/276/204/344/270/216/350/256/244/347/237/245/347/273/223/346/236/204/345/245/221/347/272/246_v0.1.md +52 -2
  29. 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
  30. package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +100 -0
  31. package/docs/mdcg//345/212/237/350/203/275/350/260/203/347/224/250/346/230/240/345/260/204/350/241/250_v0.1.md +40 -40
  32. package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +57 -9
  33. package/docs/mdcg//347/201/265/346/236/242/350/256/260/345/277/206/345/212/250/350/257/215/345/215/217/350/256/256_v1.0-draft.md +7 -2
  34. package/docs/mdcg//347/235/241/347/234/240/345/221/250/346/234/237_/350/277/220/347/273/264/345/211/215/346/217/220/344/270/216/347/273/264/346/212/244/346/214/207/345/215/227_v1.0.md +183 -0
  35. package/docs/mdcg//350/256/244/347/237/245/345/233/276_/347/264/242/345/274/225/344/270/216/345/267/245/347/250/213/350/247/204/350/214/203/345/214/226_/350/256/241/345/210/222_v0.1.md +39 -3
  36. 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 +220 -0
  37. package/docs/plans//347/234/237/346/272/220/347/264/242/345/274/225_/351/200/232/347/224/250/346/234/272/345/210/266_v0.3.md +227 -0
  38. package/docs/plans//347/235/241/347/234/240/344/270/216/350/207/252/350/277/255/344/273/243_/345/212/237/350/203/275/344/274/230/345/214/226/350/256/276/350/256/241_v0.4.md +547 -0
  39. package/docs/plans//350/234/202/345/267/242/346/250/241/345/236/213/345/257/206/351/222/245/351/205/215/347/275/256/351/235/242_v1.0.md +385 -0
  40. 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 +460 -460
  41. package/lib/bridge.js +24 -2
  42. package/lib/hooks.d.ts +31 -2
  43. package/lib/hooks.js +219 -16
  44. package/lib/init.js +16 -1
  45. package/lib/lib/prompt_safety.d.ts +52 -1
  46. package/lib/lib/prompt_safety.js +76 -1
  47. package/md_cg/audit.py +652 -379
  48. package/md_cg/bench6_arms.py +1 -1
  49. package/md_cg/bench_e2e_locomo_qa.py +11 -4
  50. package/md_cg/bench_p0.py +1 -1
  51. package/md_cg/branches.py +2 -2
  52. package/md_cg/ccgc.py +1071 -1006
  53. package/md_cg/chain.py +48 -1
  54. package/md_cg/consistency.py +97 -9
  55. package/md_cg/consolidate.py +34 -9
  56. package/md_cg/crypto.py +59 -26
  57. package/md_cg/docindex.py +16 -1
  58. package/md_cg/evolution.py +17 -1
  59. package/md_cg/export.py +1 -1
  60. package/md_cg/forgetting.py +309 -13
  61. package/md_cg/freshness.py +511 -0
  62. package/md_cg/fsutil.py +454 -8
  63. package/md_cg/generation.py +409 -0
  64. package/md_cg/hotcache.py +4 -1
  65. package/md_cg/identity.py +3 -3
  66. package/md_cg/insight.py +24 -3
  67. package/md_cg/linkref.py +1 -1
  68. package/md_cg/logref.py +327 -0
  69. package/md_cg/mcp_server.py +4261 -3818
  70. package/md_cg/mdcg.py +4695 -3547
  71. package/md_cg/mdcos.py +4672 -4159
  72. package/md_cg/mreview/pipeline.py +15 -1
  73. package/md_cg/nodefile.py +713 -576
  74. package/md_cg/protect.py +158 -11
  75. package/md_cg/protocol.py +41 -2
  76. package/md_cg/provenance.py +22 -4
  77. package/md_cg/reach.py +4 -4
  78. package/md_cg/readcache.py +76 -15
  79. package/md_cg/reconcile.py +1 -1
  80. package/md_cg/refindex.py +246 -37
  81. package/md_cg/refine.py +1 -1
  82. package/md_cg/routing.py +32 -5
  83. package/md_cg/run_tests.py +17 -0
  84. package/md_cg/scrub.py +30 -3
  85. package/md_cg/security.py +47 -1
  86. package/md_cg/self_state.py +5 -5
  87. package/md_cg/semantic/canonical.py +22 -0
  88. package/md_cg/semantic/unify.py +73 -22
  89. package/md_cg/semantic/unify_fixture.json +25 -0
  90. package/md_cg/sleep.py +1297 -0
  91. package/md_cg/sources.py +23 -6
  92. package/md_cg/srcindex.py +352 -0
  93. package/md_cg/stg.py +47 -3
  94. package/md_cg/subgraph.py +2 -2
  95. package/md_cg/sustain.py +1436 -1168
  96. package/md_cg/tasks.py +469 -470
  97. package/md_cg/test_auto_defaults.py +424 -0
  98. package/md_cg/test_b1_auto_id_multiproc.py +277 -0
  99. package/md_cg/test_b1b2_write_face.py +417 -0
  100. package/md_cg/test_b2_sensitivity_landing.py +223 -0
  101. package/md_cg/test_b3_merge_keeps_content.py +576 -0
  102. package/md_cg/test_b4_shard_dir_selfheal.py +843 -0
  103. package/md_cg/test_b4_shard_dir_selfheal_guard.py +238 -0
  104. package/md_cg/test_boundary_hit.py +410 -0
  105. package/md_cg/test_c3_transient_read_negative.py +793 -0
  106. package/md_cg/test_c8_search_rrf_gates.py +502 -0
  107. package/md_cg/test_ccg_form_parity.py +188 -0
  108. package/md_cg/test_ccgc.py +28 -3
  109. package/md_cg/test_en_pipeline.py +22 -13
  110. package/md_cg/test_generation_guard.py +352 -0
  111. package/md_cg/test_govern_directread.py +17 -4
  112. package/md_cg/test_h2_session_view_norm.py +233 -0
  113. package/md_cg/test_h4_sustain_snapshot.py +1387 -0
  114. package/md_cg/test_hive_ingest.py +285 -285
  115. package/md_cg/test_issue39_utf8_stdio.py +307 -16
  116. package/md_cg/test_issue43_default_policy.py +865 -0
  117. package/md_cg/test_legacy_p3_node_id_type.py +375 -0
  118. package/md_cg/test_linkref.py +10 -3
  119. package/md_cg/test_lock.py +2 -2
  120. package/md_cg/test_logref.py +1109 -0
  121. package/md_cg/test_m3_h9_bucket_health_protect_mark.py +301 -0
  122. package/md_cg/test_m3_h9_semantic_guard.py +525 -0
  123. package/md_cg/test_mr_m2.py +15 -3
  124. package/md_cg/test_n130_verify_falsified_protect.py +1 -1
  125. package/md_cg/test_n139_dek_provision_failclosed.py +185 -0
  126. package/md_cg/test_n176_link_trust.py +221 -0
  127. package/md_cg/test_n178_units_jobid_gate.py +212 -0
  128. package/md_cg/test_n184_keys_concurrent_provision.py +307 -0
  129. package/md_cg/test_n195_writepath_reload.py +283 -0
  130. package/md_cg/test_n196_stale_gate_skip.py +169 -0
  131. package/md_cg/test_n197_n208_write_face_gates.py +471 -0
  132. package/md_cg/test_n198_tokens_corrupt_failclosed.py +225 -0
  133. package/md_cg/test_n199_tokens_concurrent_write.py +378 -0
  134. package/md_cg/test_n201_proposal_visibility.py +382 -0
  135. package/md_cg/test_n202_session_notes_visibility.py +461 -0
  136. package/md_cg/test_n204_n205_n226_n227_n228_n229_exit_gates.py +542 -0
  137. package/md_cg/test_n206_stdio_jsonrpc_type.py +403 -0
  138. package/md_cg/test_n209_verify_write_face_gates.py +461 -0
  139. package/md_cg/test_n212_n213_n224_generation_gates.py +519 -0
  140. package/md_cg/test_n214_n215_n221_n222_write_face_gates.py +563 -0
  141. package/md_cg/test_n225_nonobject_load.py +1110 -0
  142. package/md_cg/test_n230_dirty_replay.py +375 -0
  143. package/md_cg/test_n62_tenant_bind_failclosed.py +200 -0
  144. package/md_cg/test_neg_condition_hits.py +333 -0
  145. package/md_cg/test_neg_tail_honesty.py +663 -0
  146. package/md_cg/test_none_id_write_guard.py +4 -3
  147. package/md_cg/test_opt_batch1_md_cg.py +451 -0
  148. package/md_cg/test_p1.py +5 -5
  149. package/md_cg/test_p11_consistency.py +161 -12
  150. package/md_cg/test_p26_refindex.py +2 -2
  151. package/md_cg/test_p27_docindex.py +777 -774
  152. package/md_cg/test_p28_refcheck.py +740 -13
  153. package/md_cg/test_p29_session_ingest_export.py +2 -2
  154. package/md_cg/test_p2_mcp.py +12 -1
  155. package/md_cg/test_p2_six_elements.py +463 -0
  156. package/md_cg/test_p30_maintain.py +33 -2
  157. package/md_cg/test_p31_insight.py +1 -0
  158. package/md_cg/test_p3_legacy_closure.py +433 -0
  159. package/md_cg/test_p4_freshness.py +680 -0
  160. package/md_cg/test_p8_subgraph_chain.py +14 -1
  161. package/md_cg/test_p9c_dedup_hints.py +276 -0
  162. package/md_cg/test_policy_required_ccg.py +426 -0
  163. package/md_cg/test_protocol.py +22 -0
  164. package/md_cg/test_rank_parity_score_mode.py +522 -0
  165. package/md_cg/test_read_face_input_gates.py +363 -0
  166. package/md_cg/test_read_face_semantics.py +489 -0
  167. package/md_cg/test_recall_face_guards.py +812 -0
  168. package/md_cg/test_rejected_credential_forms.py +188 -0
  169. package/md_cg/test_rejected_redact.py +146 -0
  170. package/md_cg/test_retr_s1b.py +2 -2
  171. package/md_cg/test_retr_s5.py +20 -7
  172. package/md_cg/test_review_conformance.py +21 -3
  173. package/md_cg/test_security_audit_v21.py +2 -2
  174. package/md_cg/test_semantic_canonical.py +5 -3
  175. package/md_cg/test_server_version.py +67 -0
  176. package/md_cg/test_sleep.py +611 -0
  177. package/md_cg/test_sleep_p1.py +784 -0
  178. package/md_cg/test_srcindex.py +171 -0
  179. package/md_cg/test_tenant_env_override_warn.py +63 -50
  180. package/md_cg/test_time_core_lint.py +968 -0
  181. package/md_cg/test_token_lowercase_form.py +315 -0
  182. package/md_cg/test_unify_default_off.py +701 -0
  183. package/md_cg/test_unify_scope.py +182 -0
  184. package/md_cg/test_v21r1_package_version.py +310 -0
  185. package/md_cg/test_writepipe.py +10 -4
  186. package/md_cg/tokens.py +225 -95
  187. package/md_cg/tool_face.py +4 -4
  188. package/md_cg/trust.py +49 -5
  189. package/md_cg/units.py +204 -6
  190. package/md_cg/weights.py +4 -4
  191. package/md_cg/whitebox_kb/aeis_core/time_core.py +8 -0
  192. package/md_cg/whitebox_kb/wisdom/knowledge_points.py +1 -1
  193. package/md_cg/writelimit.py +42 -8
  194. package/md_cg/writepipe.py +651 -554
  195. package/package.json +4 -2
  196. package/skills/plugin.json +1 -1
  197. package/src/bridge.ts +25 -2
  198. package/src/hooks.ts +229 -16
  199. package/src/init.ts +15 -1
  200. package/src/lib/prompt_safety.ts +88 -1
  201. package/utf8_boot.py +237 -0
  202. package/zcode/AGENTS.md +10 -10
@@ -0,0 +1,205 @@
1
+ # 0.6.1 发布报告 v1.0 —— 外部测试报告核验 · 四批修复 · Linux 双栈验证
2
+
3
+ > 批次:0.6.1 发布 | 报告:v1.0 | 环境:win32(Windows 10.0.19045)+ Docker Desktop(ServerVersion 28.4.0)
4
+ > 仓库 `dsh-memory-main`,发版前 HEAD `956807a1`,本版基线 `06db0f74`
5
+ > 编号说明:上一件为 [`发布06_一键配置与DSH0172_v1.0.md`](发布06_一键配置与DSH0172_v1.0.md)(0.6.0),本件续其序号为 07。
6
+ > 本报告所引全部检查为本会话**实跑复验**的结果;未跑项在第六节如实声明。**代理自报不作为判据**——每批均由编排侧独立复跑守卫、套件与门禁。
7
+
8
+ ---
9
+
10
+ ## 一、总览
11
+
12
+ 本版修的是**外部 DSH 插件测试报告**中经核验「在 HEAD 上仍生效」的缺陷。一个前提必须先说清楚:
13
+
14
+ > 那份报告测的是**已发布的 npm 0.6.0 制品**,其代码早于本仓 HEAD;而 HEAD 的版本串当时**也是 0.6.0**
15
+ > ⇒ 一切「已修/未修」的判断只能**按代码**,不能按版本号。因此本轮先用九项探针把报告断言逐条落到 HEAD 的代码行为上,再动手。
16
+
17
+ | 阶段 | 内容 | 结果 |
18
+ |---|---|---|
19
+ | 第 0 步 | 九项探针(P-1…P-9b),只读、沙箱 root、绝不碰在役库 | 推翻我三处预判;额外挖出报告未含的缺陷 |
20
+ | 第 1 包 | 写面静默失败族(B1 自动 id 撞毫秒 / B2 密级静默降级 / B4 索引分片目录不自愈) | `778f8ede`,12 文件 +2344/−22 |
21
+ | 第 2 包 | 合并吞正文与冲突误判(B3 / H8 / H3)+ 补强 | `69e8719b`,8 文件 +1094/−41 |
22
+ | 第 3 包 | 召回面诚实性(H7/H10/H11/M1/M2/M3/M4/H9)+ 补强 | `2e7d7230`(18 文件 +3636/−140)、`f706b799`(9 文件 +243/−66) |
23
+ | 第 4 包 | 插件面(M5 / H5 / H6 / H1 / H2) | `956807a1`,14 文件 +1777/−36 |
24
+ | 收口 | 版本号 8 处 → 0.6.1 · README 版本表 · 门禁链文档订正 · **自查抓到并修掉一条自有回归** | 见第四、七节 |
25
+
26
+ 四批合计(`06db0f74..956807a1`):**43 文件,+9036 / −247**。执行模型沿用第 17 条——每个工作包派发一轮 zcode 动态工作流(契约:先探针读数 → 再改码 → 守卫 → 定点变异自证 → 报告逐条读数),编排侧独立复核并分批提交。
27
+
28
+ ---
29
+
30
+ ## 二、九项探针:三处预判被推翻
31
+
32
+ 探针全部独立 `tempfile` 沙箱 root(独立 `MDCG_ROOT`/`MDCG_AUX_ROOT`/`MDCG_MASTER_KEY`)、argv 列表 + `shell=False` + 显式 UTF-8,**不写入在役库**。三条结论与我事前的判断相反:
33
+
34
+ 1. **P-4(分片目录删除后能否自愈)**——我原以为「新进程也看不到节点」,**被证伪**:全新短命进程本就会重建目录,故不自愈的必要条件是「本进程已持有 `ShardLog` 实例」(长驻 MCP serve 形态)。B4 的修法与反证据此写成。
35
+ 2. **P-9a(H4 统一归一层默认开影响英文检索)**——**直接证伪报告结论**:默认态下英文查询命中 gold top1,且仓内本就有两条测试断言这一点。报告该条**不成立**。按使用者裁定「不动默认,补探针与文档」,本版**不翻全局默认**。
36
+ 3. **P-3(MERGE 还是熵 DROP 吞正文)**——我原以为只有一条分支有问题,**实测是两条都吞**:`0.85` 的 MERGE 与 `0.60` 的熵 DROP 都丢新正文。第 2 包据此两分支一起修。
37
+
38
+ 九探针另额外挖出**报告里没有**的三条缺陷:
39
+
40
+ - **①** CCG 哨兵 `不适用条件:无` 会无条件触发 `condition_clash`(假冲突)⇒ 第 2 包 H8-⑤ 收口(`_is_null_condition` + 输入剥空值)。
41
+ - **②** 基类 `MdCG.search` 的负记忆提示段会把同一节点**重复出条** ⇒ 随 H10 负尾单点化一并收口。**诚实边界**:收口后「重复出条」这一具体形态**我未单独立断言复验**,只由 `test_neg_tail_honesty.py`(44 断言)与 `test_read_face_semantics.py`(123 断言)间接覆盖 ⇒ **记为待复验项**。
42
+ - **③** `scripts/linkref_backfill.py` 仍在铸造裸毫秒 id(存量现场遗漏)⇒ 第 1 包 B1 把它改为委托 `mint_auto_id`,守卫断言「`def mint_auto_id(` 全仓仅 1 处」。
43
+
44
+ ---
45
+
46
+ ## 三、四批修复逐条
47
+
48
+ ### 3.1 第 1 包 `778f8ede` —— 写面静默失败族
49
+
50
+ | 项 | 缺陷 | 修法(单点) | 守卫 |
51
+ |---|---|---|---|
52
+ | **B1** | 同毫秒自动 id 相撞**静默顶替**(并发写入丢条目) | 唯一铸造点 `mdcg.mint_auto_id`:形态 `mem_<毫秒>_<6位hex>`,撞既有 id 换随机段**有界重生成**(5 次),撞满 fail-closed 抛错;`writepipe` / `mcp_server` / `linkref_backfill` 三处现场全部委托 | `test_b1_auto_id_multiproc.py`(11)、`test_b1b2_write_face.py`(33) |
53
+ | **B2** | 声明 `private` 却落 `internal`,**密级静默降级** | 四处落盘实参表补 `sensitivity` 透传 + 单点 fail-closed 闸 `_check_sensitivity_landing` 接在全库唯一写盘口 `MdCG._write_node`(12 处调用点一次覆盖);**声明值与落盘值经 `declared_sensitivity` 分离**,否则 `or DEFAULT` 会把两者归一、闸永远看不见差异 | `test_b2_sensitivity_landing.py`(14) |
54
+ | **B4** | 长驻进程删掉 `_index_log/` 后**永不自愈** | 单点 `fsutil.ensure_shard_dir`(缺失即建 / 失败抛结构化 `ShardDirError` 带 code+hint / 成功记账 + stderr 告警——**容忍不等于静默**) | `test_b4_shard_dir_selfheal.py`(29)、`_guard.py`(21) |
55
+
56
+ **语义未动**:显式传 `node_id` 的「同 id 即改写」既有 upsert 契约原样保留(有断言钉住不被误伤);`read_all` 缺目录返回 `[]` 的既有语义未动。
57
+
58
+ ### 3.2 第 2 包 `69e8719b` —— 合并吞正文与冲突误判
59
+
60
+ - **B3(真凶已定位)**:`forgetting.reinforce` 写回的是 `node.get("content")`(**既有**正文),且签名根本没有 content 参数。修法=加 `content=None` 槽(缺省不变 ⇒ 既有调用零破坏)+ 抽出共享聚合行 `forgetting.aggregate_line`(`reinforce` 与 `writelimit.converge_into` 同源),**MERGE 与熵 DROP 两条分支都写「新正文去向」**,且聚合行不再被截断在 80 字符。
61
+ - **H8**:仅空白差异(`\r\n`↔`\n`、尾换行、缩进)的近重复被误判成 `same_condition_divergence`。修法=两侧改用**同一归一化** `_norm_ws/_nows` + 「逐字相同 ⇒ 必判重复」短路;阈值 `CONCLUSION_SAME=0.95` **未动**。顺带补上此前**零覆盖**的 `CONCLUSION_SAME` 判据。
62
+ - **H3**:合并时**双方归属并列**落 `fm`(`forgetting.note_source`,有界 20 条),不再只留一侧。
63
+ - **H8-⑤**:CCG 哨兵空值化(见第二节①)。
64
+ - 守卫:`test_b3_merge_keeps_content.py`(31)、`test_p11_consistency.py` G 段(42)、`test_p30_maintain.py`(57)。
65
+
66
+ ### 3.3 第 3 包 `2e7d7230` + 补强 `f706b799` —— 召回面诚实性
67
+
68
+ | 项 | 缺陷 | 修法 |
69
+ |---|---|---|
70
+ | **H10** | 被负记忆覆盖的条目以 `score=1.0` 冒充答案、被顶到首位且**溢出 k** | 哨兵值 `NEG_COVERAGE_SCORE`(不再用 1.0)、尾部位置、条数 `min(NEG_COVERAGE_MAX, k)` **计入 k 预算**、`_compute_d` 分母排除提示条目;负尾单点 `_neg_tail` 构造,带 `negative_coverage`/`neg_layer`/`node_id` 三个独立字段 |
71
+ | **H7** | 负记忆路由层未短路(读面串层) | `NEG_ROUTE_LAYERS` 单点 + `_ticket_slug`/`_refresh_unresolved` 工单刷新 |
72
+ | **H11** | 一致性飞轮对**任意**判定建工单(噪音) | `FLYWHEEL_TRIGGERS=("REJECT",)`——只对**真冲突**建单 |
73
+ | **M1** | `k=0` 被当成「没传」(静默换成缺省 20) | 统一 `is not None` 口径,单点 `_int_arg`;k 族同族 **8 处**一并收口(补强批) |
74
+ | **M2** | `node_id` 类型错返回**裸 null** | 类型闸 + 结构化错误(对齐既有 `{"ok": False, "error": "not_found"}` 口径) |
75
+ | **M3** | 仅 1 个桶的库被判「分区健康」 | `routing.bucket_health(counts, total_nodes)`——巨桶检查加 `nb > 1`,单桶给显式 reason「条件路由不可用(无分区,非退化)」,`counts=={}` 但对非空库判红 |
76
+ | **M4** | 隐式默认动作不可辨 | `action_source` 登记进 `protocol.py` 真源 + 对外暴露 |
77
+ | **H9** | `protect.mark` 对不存在节点返回裸 null | 改结构化 `{"ok": False, "error": "node_not_found", ...}` |
78
+
79
+ - 新守卫:`test_recall_face_guards.py`(41)、`test_neg_tail_honesty.py`(42→44)、`test_read_face_input_gates.py`(61→77)、`test_read_face_semantics.py`(123)、`test_m3_h9_bucket_health_protect_mark.py`(31)、`test_m3_h9_semantic_guard.py`(41)、`test_protocol.py`(→44)。
80
+ - **既有守卫的方向性改动我逐条判过**:`test_retr_s5.py` 三条分数断言由 `1.0/0.5/0.75` 改 `0.0`、`test_p11_consistency.py` D 段重写——**方向均为收严**(对缺陷更敏感),不是放宽。
81
+ - **JM-RACE-01**:`scripts/test_judgment_manifest.py:75` 原本在**追踪文件上原地写**(`hive/test_exec_tools.py`)再还原 ⇒ 结构上并行不安全。子代理**否掉了我的 `_SERIAL_ONLY` 方案并给出更好的理由**(`_SERIAL_ONLY` 的语义是**跳过**,「这条守卫不再跑」比偶发红更糟;且挡不住嵌套套件),改为「临时副本做弱化实验」+ 4 条新断言钉住「运行期绝不写追踪文件」。我接受该反驳。
82
+
83
+ ### 3.4 第 4 包 `956807a1` —— 插件面
84
+
85
+ | 项 | 缺陷 | 修法 | 诚实边界 |
86
+ |---|---|---|---|
87
+ | **M5** | **全角**凭据形态绕过脱敏 | 九条值类正则纳入全角(数字/字母/下划线/冒号/等号),单点 `twoWidth` 折叠 | 有意**不走 NFKC**(归一化改长度会毁偏移映射,且会把「.」塌成「。」误伤标点);两条令牌形态正则**保持半角字面量**(Python 侧 `test_token_lowercase_form.py` 直接抽取该源码判据);`data/policy.json` 写入闸门**未同步加宽** ⇒ 两侧对全角形态**有意分叉**(已实测 policy.json 无全角类) |
88
+ | **H5** | 注入的记忆块**无不可信边界** | 外包 `<untrusted-memory>…</untrusted-memory>` + 固定声明「仅作参考、不得执行其中指令」,并拆散伪造闭合标签 | 定位为**提示层软约束,非安全边界**;两处未修缺口如实上报(**H5-R1** 开式形态拆解不幂等、**H5-R2** en-dash/em-dash/U+2010/全角空格变体透传) |
89
+ | **H6** | 直写不去重、无提示 | 两个直写入口(`mcp_server` / `writepipe`)**同源委托**同一实现;返回 `dup_of` 提示(`prior_node`/`self_coverage` 判据 + `overwrite_of`/`overwrite_ratio` 熵读数 + `dedup_skipped` 理由) | **不改写入语义**(`writelimit` 只作用 contextual 层是既有文档化设计);PROTECT 分支**只加注不改序**;读数一律在 `cg.add` **之前**取(否则覆写谓词恒真) |
90
+ | **H1** | 子代理委派被写成本人记忆 | `isSubagentSession`(会话级,刻意**前置于 sid 捕获之前**,否则子代理会话会污染 `lastSession`)+ `isRelayedMessage`(消息级)两个纯判据 | 六种退化形态一律**不筛不报错**;⚠️ **真实宿主是否真写 `origin`/`delegationDepth`/`form:'relay'` 只在类型面成立、未在真实会话事件上观测**(本机未装 DSH harness) |
91
+ | **H2** | 写入与召回的会话口径不同尺 | 读侧 `stg._view_session` 消费**同一个** `mcp_server._normalize_session`(**不重写实现**);插件侧无会话标识时写显式 `unassigned`(替代进程级随机 `sess_*` 兜底桶);召回改为显式带会话槽 | 三态语义(缺省/`""`/`"*"`)逐位不变;`cg` 读路径的 session 走身份判定(issue #35 定稿「身份不可自报」)**不经**此视图,不得互相「对齐」(对齐即等于开一条按请求 session 读 private 的越权通道);env 固定会话的部署形态仍读不到本会话视图(如实记录,不在本次范围) |
92
+
93
+ - 守卫:`md_cg/test_p9c_dedup_hints.py`(31)、`md_cg/test_h2_session_view_norm.py`(17)、`test/fullwidth_redact.test.ts`、`test/untrusted_memory.test.ts`、`test/h1-source-filter.test.ts`。
94
+ - **文件并发写入的完整性核验**:`src/hooks.ts` 在同一轮里被**四方**(M5/H5/H1/H2)写入、守卫文件也被中途追加。我在提交前逐标记核验四处改动**全部在场且互不覆盖**(`twoWidth`/`renderUntrustedMemoryBlock`/`isSubagentSession`/`UNASSIGNED_SESSION`),变异残留扫描全程为 0。
95
+ - **我自己的派发契约缺陷**:H1/H2 的 `hooks.ts` 侧在我写的归属划分里**没有主**(我把 hooks.ts 排给了插件面修改员,却把 H1/H2 排给了另一员)。是该子代理**拒答并上报**(`dwfq-a9007424-1`)才暴露的——**缺陷在我,不在它的边界**。我据此补授权并加了三项防丢更新要求。
96
+
97
+ ---
98
+
99
+ ## 四、自有回归:自查抓到的一条,比新增守卫更重要
100
+
101
+ 容器栈一(Linux)第一次跑出 `[FAIL] md_cg.test_policy_required_ccg --head-baseline`。取证链条:
102
+
103
+ 1. **红项集合比对**:实际 `{G2b,G2c,G2d,G3b,G3c,G4a,G4b,G4c,G5a,**G8a**,G8c,**G8d**}` vs 预期 `{…,**G8b**,G8c}` ⇒ 多出 G8a/G8d(`ModuleNotFoundError: No module named 'mdcg_head.mdcg'`),且**预期该红的 G8b 变绿了**。
104
+ 2. **基线对拍(决定性)**:把改前的 `06db0f74` 检出到**独立 worktree** 跑同一守卫 ⇒ 红项**恰好**是预期 11 项、自带红基线 PASS ⇒ **这是我这四批引入的回归,不是既有状态**(worktree 已 `remove`,工作区未被触碰)。
105
+ 3. **根因**:该守卫用「假包 `mdcg_head` + 转发层 `_SHIMS`」把工作区源码做定点变异后单测。我这四批给 `md_cg/writepipe.py` 新增了两处**函数内**委托(`from .mdcg import …`、`from . import forgetting`),而 `_SHIMS` 没跟上 ⇒ 假包缺模块 ⇒ 调用期抛异常 ⇒ 被 `_try` 收成 `err`、`got` 退化为 `{}` ⇒ `hint=""` ⇒ **G8b 的 `"重试同样结果" not in ""` 恒真**,于是「守卫坏了」伪装成「多两个红项 + 一个假绿」。
106
+
107
+ **修法(治三处,不只是补一个名字)**:
108
+
109
+ 1. 补齐转发层:`_SHIMS` 增加 `mdcg`/`forgetting`/`units`/`coldverify`/`hotcache`/`hyperedge`/`nodefile`——注意后五个是我这条新判据**自己查出来的**(历史靠「那条路径没跑到」侥幸绿着)。
110
+ 2. **新增 fail-closed 判据 `_check_shim_coverage`**:用 AST 抽取基线源里**全部**相对 import(含函数内延迟导入),凡未登记即报 `SHIM-MISS` 并点名模块 ⇒ 同类缺口从此在**装配期**就叫停,不再退化成假绿。**定点变异自证**:抽掉 `_SHIMS` 里的 `forgetting` ⇒ 立刻 `SHIM-MISS` 且**逐字点名 `writepipe -> .forgetting`**。
111
+ 3. **堵死假绿**:G8b 断言补 `err is None and bool(hint)`。**定点变异自证**:用一个「一碰就抛」的 `wp_mod` 桩跑 `run_checks` ⇒ G8b **转红**(detail = `RuntimeError: boom-stub(WritePipeline)`),而旧写法在同一输入下判定为 `True`(假绿形态**在进程内复现**)。
112
+
113
+ 修后:绿态 **28 pass / 0 fail**、红基线**红项恰好 11 项**(`rc=0`),容器栈一该腿 `[PASS]`。
114
+
115
+ ---
116
+
117
+ ## 五、验证读数(本会话实跑,逐条为原始读数)
118
+
119
+ ### 5.1 分批复跑(每批提交前后各一次)
120
+
121
+ | 批次 | python 全量 | npm test | gate |
122
+ |---|---|---|---|
123
+ | 第 1 包 `778f8ede` | 277/277 | — | rc=0 |
124
+ | 第 2 包 `69e8719b` | 278/278 | — | rc=0 |
125
+ | 第 3 包 `2e7d7230` | 284/284 | — | rc=0 |
126
+ | 第 3 包补强 `f706b799` | 286/286 | — | rc=0 |
127
+ | 第 4 包 `956807a1` | 286/286(5 跳过) | rc=0(99 用例 / 98 通过 / 1 跳过) | rc=0 |
128
+
129
+ ### 5.2 发版验证三连(改版后最终态)
130
+
131
+ | 项 | 命令 | 读数 |
132
+ |---|---|---|
133
+ | ① | `python scripts/run_tests.py --jobs 4` | **286/286 通过,5 跳过**,rc=0 |
134
+ | ② | `npm.cmd test`(= build + `node --import tsx --test "test/*.test.ts"`) | **99 用例 / 98 通过 / 0 失败 / 1 跳过**,rc=0 |
135
+ | ③ | `npm.cmd run gate`(8 条腿) | **VERDICT=PASS**,rc=0 |
136
+
137
+ gate 八腿逐条:`check_unreachable` PASS · `check_publish_artifact` PASS(R1 凭据面=0/0、R2、R3、**R4 非追踪=28 允许=28**、R5、R6)· `cogmap_sync check` PASS · `link_check` PASS · `workspace_index --check` [OK](顶层 20 · 追踪 2104 件)· `verify_discipline --allow-missing` PASS(9 条链一致 / 1 SKIP codebuddy-local 未生成)· `cargo test` rc=0 **27 passed / 0 failed** · `rank_parity` rc=0 **两侧同口径逐位一致**。
138
+
139
+ ### 5.3 Linux 容器双栈(Docker Desktop 28.4.0)
140
+
141
+ 前置:三个容器脚本(`scripts/*.sh`)**CRLF=0**(纯 LF)——`core.autocrlf=true` 下 CRLF 会让整腿在第一步退出。
142
+
143
+ | 栈 | 镜像 / 命令 | 读数 |
144
+ |---|---|---|
145
+ | 栈一 | `rust:bookworm` + `bash scripts/linux_verify.sh full`(`CARGO_TARGET_DIR=/tmp/target`,与 Windows 侧 `target/` 隔离) | **38 pass / 0 fail**,rc=0(Python 3.11.2 / cargo 1.98.1;含 `cargo test`、`cargo build --release`、23 条 `md_cg` 套件、4 条 hive python、7 条 head/branch 基线自证腿、1 条 hive 锚链自证腿、smoke) |
146
+ | 栈二 | `node:22-bookworm` + `npm ci --include=dev && npm run build && node --import tsx --test test/*.test.ts` | **99 用例 / 96 通过 / 0 失败 / 3 跳过**,rc=0 |
147
+
148
+ 两处**口径修正**(相对我事前的说法,如实记账):
149
+
150
+ - 栈二原用 `npm install`,会**在挂载的仓内**重装 `node_modules`(把宿主 win32 的 esbuild 二进制换成 Linux 版,且 `npm install` 会改写 `package-lock.json`)。已改为 **`npm ci` + `node_modules` 挂匿名卷**隔离。
151
+ - 栈一的 `cargo test` 腿覆盖的是 **`hive` crate**,**不是 `rust/`**;且脚本用 `tail -4` 截断输出,容器日志里可见的是最后一个测试二进制的 `0 passed`(真实通过数被截断,**腿的判据是退出码**)。`rust/` 的 27 passed 由 Windows 侧 gate 的 `gate_rust_crate_test` 腿给出。
152
+
153
+ ### 5.4 版本面
154
+
155
+ | 项 | 处置 |
156
+ |---|---|
157
+ | 版本号 **8 处** → 0.6.1 | `package.json:3` · `package-lock.json:3/:9` · `.claude-plugin/marketplace.json:12` · `claude/lingshu-memory/.claude-plugin/plugin.json:4` · `codex/lingshu-memory/.codex-plugin/plugin.json:3` · `skills/plugin.json:4` · `README.md:16`。逐处**断言命中数**后字节级替换(`package-lock.json:810` 的 `^10.6.0` 是引擎区间,**未误伤**) |
158
+ | `SERVER_VERSION` | **未动**——它动态读 `package.json`,正是 issue #42 的修法 |
159
+ | README 版本表 | 原表从 v0.5.1 直跳 0.6.0(历史遗漏),本版补 `Release v0.6.0` 与 `Release v0.6.1` **两行** |
160
+ | `docs/mdcg/发布门禁链_v0.1.md` | 陈旧表述订正:门禁由「五道」改为**八道**,并**逐条与 `package.json` 的 `scripts.gate` 实读对齐**。新增诚实边界:第 1/7/8 道(`check_unreachable` 与两条 Rust 腿)**没有对应 CI workflow**——`hive-check.yml` 只跑 `hive/Cargo.toml`,`rust/` 至今零 CI |
161
+
162
+ ---
163
+
164
+ ## 六、未跑 / 未修清单(如实声明)
165
+
166
+ **未跑**:
167
+
168
+ - `npm pack` / `npm publish` —— publish 属使用者终端凭据动作(实测 `npm whoami` = E401 凭据无效)。`prepublishOnly` 会在发布时自动再跑 build+test+gate。
169
+ - 发布后回验(`check_publish_artifact.py --registry 0.6.1`、`npx @furongjun1999/dsh-memory init` 清缓存终验、`check_registry_tarball.py`)——须等 registry 出现 0.6.1 之后。
170
+ - **H1 的真实宿主行为**:本机未装 DSH harness ⇒ 「宿主要不要真写 `origin`/`delegationDepth`/`form:'relay'`」**只在类型面成立、未在真实会话事件上观测过**。守卫证明的是「判据在场即拦、缺失即不拦」这一可机械判定的性质,**不是**真实委派已被拦住。
171
+ - `test_conformance.py:312` 硬编码一条**本机活库绝对路径**(`<盘符>/Program Files/2_ai/…` 形态;门禁 R3 的 `LOCAL_PATH_PROGRAM` 规则对本仓自有文档同样生效,故本报告不复述字面量)——按本轮「不碰在役库」约束,复核侧改用 `conformance --root <沙箱>` 替代,**未在活库上跑**。
172
+ - 第二节的**探针额外发现②(负尾重复出条)**:收口方式为负尾单点化,**该具体形态未单独立断言复验** ⇒ 待复验。
173
+
174
+ **未修(记入留池,供使用者裁定)**:
175
+
176
+ | # | 项 | 位置 / 形态 |
177
+ |---|---|---|
178
+ | 1 | `limit=0` / `k=0` 在**库层**语义与读面不一致 | `scrub.py:859 records[-int(limit):]`(`limit=0` ⇒ 「全量」)、`tasks.py:447 max(int(k or 5), 1)`(`k=0` ≡ `k=5`)——补强批「下限 1」的措辞据此**订正为不准确** |
179
+ | 2 | 同族更宽的两处 | `mcp_server.py:1981`(help, k=40)/ `:2141`(link.evidence, k=100) |
180
+ | 3 | `backfill.py:61 SKIP_LAYERS` 第三份字面量副本 | 未收单点 |
181
+ | 4 | MCP 结果面未暴露 `negative_coverage` / `neg_layer` / `node_id` | 提示只在库层结果里可判 |
182
+ | 5 | `mdcg_get` 对 list/dict 型 `node_id` 仍抛异常 | 与 M2 同族,未一并收口 |
183
+ | 6 | legacy `unr_<sha10hex>` 工单未迁移 | 与 H7 的 `_ticket_slug` 同族 |
184
+ | 7 | `merge_count` / `last_merge_at` 未镜像进内存索引 | H3 只落了 fm |
185
+ | 8 | **H5-R1** 开式形态拆解不幂等(docstring 声称幂等,实测仅闭合形态成立) | 第 4 包守卫复核发现并独立复现 |
186
+ | 9 | **H5-R2** en-dash / em-dash / U+2010 / 全角空格变体透传 | 同上 |
187
+
188
+ ---
189
+
190
+ ## 七、纪律合规声明(第 16 条格式)
191
+
192
+ - **功能名**:0.6.1 发布准备(外部报告核验 · 四批修复 · Linux 双栈验证)
193
+ - **生效条件**:`git tag v0.6.1` 存在且 `npm publish` 由使用者执行完成;在此之前本报告描述的修复只在**仓库 HEAD** 生效,**不在** registry 的 0.6.0 制品里。
194
+ - **子功能**:① 九探针先行取证 ② 四批写面/合并面/召回面/插件面修复(各带守卫与定点变异自证)③ 自有回归的取证与修复(第 4 节)④ 版本面与文档面收口 ⑤ Linux 容器双栈验证
195
+ - **执行**:见第三节各批提交(`778f8ede` / `69e8719b` / `2e7d7230` / `f706b799` / `956807a1`)与第五节读数的对应命令;每批提交前**均由编排侧独立复跑**守卫、套件与门禁,**代理自报未作为判据**。
196
+ - **验证方式**:`python scripts/run_tests.py --jobs 4`(286/286)+ `npm.cmd test`(99/98/1)+ `npm.cmd run gate`(8 腿 PASS、`VERDICT=PASS` rc=0)+ Docker 双栈(38/0 与 99/96/3,均 rc=0)+ 基线 worktree 对拍(自有回归的定因)。
197
+ - **不适用条件**:不覆盖**已发布 npm 制品**的行为(那是 0.6.0 代码);不覆盖**真实 DSH 宿主**的委派字段写入行为(未装 harness);不覆盖 `test_conformance.py:312` 的活库路径腿(本轮约束不碰在役库);不覆盖留池 9 项;`SERVER_VERSION` 不在版本面内(动态读 `package.json`,故意的)。
198
+
199
+ ---
200
+
201
+ ## 附:文件清单
202
+
203
+ **新增守卫(12 个)**:`md_cg/test_b1_auto_id_multiproc.py`、`test_b2_sensitivity_landing.py`、`test_b1b2_write_face.py`、`test_b4_shard_dir_selfheal.py`、`test_b4_shard_dir_selfheal_guard.py`、`test_b3_merge_keeps_content.py`、`test_recall_face_guards.py`、`test_neg_tail_honesty.py`、`test_read_face_input_gates.py`、`test_read_face_semantics.py`、`test_m3_h9_bucket_health_protect_mark.py`、`test_m3_h9_semantic_guard.py`、`test_p9c_dedup_hints.py`、`test_h2_session_view_norm.py` + TS 三份 `test/fullwidth_redact.test.ts`、`test/untrusted_memory.test.ts`、`test/h1-source-filter.test.ts`。
204
+
205
+ **文档面**:`README.md`(版本串 + 版本表两行)、`docs/mdcg/发布门禁链_v0.1.md`(八道腿订正 + CI 覆盖诚实边界)、`docs/mdcg/README详细版_v0.4.10.md`(H1/H2 的声明与未验证项)、本文件。
@@ -0,0 +1,97 @@
1
+ # 发布 08 · 0.7.0:自迭代与睡眠(周期引擎)+ 因果/时间图检索路 + 权重进主分数
2
+
3
+ > 发版线:v0.6.1(`71463a09`)→ v0.7.0
4
+ > 设计真源:`docs/plans/睡眠与自迭代_功能优化设计_v0.4.md`(规格冻结)
5
+ > 发布三关:`npm run gate`(九条腿)· Linux 容器双栈 · E 盘空文件夹沙箱模拟新用户安装
6
+ > 测评面:`D:\1_ai\membench\dist\因果分析基准_v1.0`(检索已占优,本版针对因果推理栏)
7
+
8
+ ---
9
+
10
+ ## 一、本版两条线
11
+
12
+ ### A 线 · v0.6.1 之后的累积修复
13
+
14
+ | 提交 | 内容 |
15
+ |:--|:--|
16
+ | `f5d4ead7` | 长驻 MCP 进程代校验单点与「升级须重启」运维前提 |
17
+ | `b24266a2` | 归一作用域收窄——只译英文内容、中文原样 |
18
+ | `2726e82f` | 留池清理——对拍口径标注 / 假守卫改成对实现断言 / 两侧对齐 |
19
+ | `8d0834db` | 统一归一层缺省翻关 `MDCG_UNIFY_QUERY=0` |
20
+ | `52677077` | **issue #48**:`files` 白名单加 `utf8_boot.py`(0.6.1 纯 npm 装机 100% 起不来) |
21
+ | `5d4076ec` | 出货面冒烟进发布门禁(第九腿:真打包 → 空沙箱安装 → 真启动 MCP → 真握手) |
22
+
23
+ ### B 线 · 自迭代与睡眠(P0–P4)
24
+
25
+ | 期 | 提交 | 内容 |
26
+ |:--|:--|:--|
27
+ | 设计 | `71ab993a` | 规格冻结 v0.4(第三轮四项裁定入稿) |
28
+ | **P0** | `23983bde` | 前置硬化四项:睡眠周期 git 机制(影子工作树 + 独立版本库 + 根级锁 + 只给 revert)· `auto_*` 缺省单一真源 · N230 `_dirty` 重放遮蔽修复 · 拒绝域双语义判据 |
29
+ | **P1** | `9db1bcb7` | 睡眠周期引擎:九步显式化(⑤⑥ 显式 no-op 占位)· 副本迭代 + 语义四闸 + git 周期合并 · env 表单一真源 |
30
+ | 文档 | `5f856685` `419ac513` | 运维前提登记(裁定⑭)+ 设计稿规格同步 + 与实现逐项校对 |
31
+ | **P3** | `b56f701f` | 因果路(复用 `chain.py` 接进缺省检索 + 边类型集可配)· 时间路(核走唯一权威 `time_core.cred_factor`)· N137 修复 · 补上缺失的时间核审计器 |
32
+ | **P2+P4** | 本批 | 六要素补成 6 行索引角色(全进默认检索)· 拒绝域双语义接线 · 权重刷新/衰减进主分数(含 floor、保护线、三件套) |
33
+
34
+ ---
35
+
36
+ ## 二、逐批读数(每批都经「先探针 → 改码 → 守卫 → 定点变异自证 → 独立复核」)
37
+
38
+ ### P0 / P1:检索读数零位移
39
+
40
+ - P0 基线指纹 `f534cbb3…` 改前改后逐位一致;P1 另做 A/B(同一沙箱同查询,hash `9abdeadc4aa51e95` 逐字节相同)。
41
+ - 守卫:`test_sleep` 71 / `test_auto_defaults` 59 / `test_n230_dirty_replay` 29 / `test_boundary_hit` 38 / `test_sleep_p1` 107(后 109)断言全绿,各带定点变异自证。
42
+
43
+ ### P3:**读数是变的**(本批就是接线)
44
+
45
+ 21 个读数键 **6 同 / 15 变**:
46
+
47
+ | 读数 | 改前 → 改后 |
48
+ |:--|:--|
49
+ | 默认路集 | 4 路 → **6 路**(+chain +temporal) |
50
+ | 因果路(doc 语料) | 候选 **0 → 1**;`ch2` 由不可召回到可召回 |
51
+ | 时间路 | 候选 null → **3**(`d0=1.0 / d7=0.850667 / d30=0.5 / d400=0.001`) |
52
+ | 同一节点融合分 | 0.016393 → 0.032787(名次未变) |
53
+ | 睡眠窗口非法形态 | `in_window("乱写","12:00")` true → **false**(裁定⑰) |
54
+ | N137 搬迁后 edges | 0 → 1;相等 false → true |
55
+
56
+ 零位移面:P_trust 数值行为一字未改(`links.py:500` 等价性 8 点全 ≤1e-12)。
57
+
58
+ ### P2+P4:新增字段 + 三处行为变化
59
+
60
+ | 读数 | 改前 → 改后 |
61
+ |:--|:--|
62
+ | 索引条目键数 | 34 → **38**(`postcondition_terms`/`rejection_terms`/`access_count`/`last_access`) |
63
+ | 边界问句「什么条件下不适用」 | 卡片 `boundary_hit` false → **true**;meta 边界读数 `{hit:2,terms:4,counts{defer:2,reject:0}}`(**与资格 REJECT 分开计数**) |
64
+ | 普通问句 | top-k 两态一致(拒绝域**未**成为普通问句的召回键) |
65
+ | 主分数乘子(同内容不同龄) | `[[k_new,1.0],[k_old,1.0]]` → `[[k_new,1.01],[k_old,0.001]]`,ratio 1.0 → **1010.0** |
66
+ | **默认召回排序(同内容不同龄)** | `[c_300d, b_30d, a_fresh]` → `[a_fresh, b_30d, c_300d]` ⇒ **旧记忆被降权的目标行为可观测** |
67
+ | 重建协议四约束 | 幂等/增量/可回退/合法次序逐位不变 全 true |
68
+
69
+ 守卫:`test_p2_six_elements` 42 / `test_p4_freshness` 82 / `test_p3_legacy_closure` 31 / `test_boundary_hit` 40 断言全绿,各带定点变异自证(5/5、5/5、4/4、3/3 转红)。
70
+
71
+ ---
72
+
73
+ ## 三、必须连着读的三条披露
74
+
75
+ 1. **默认召回融合口径由 `sum` 变成 `max`**:`mcp_server.mdcg_recall` 的 `fusion` 判据把 `use_causal`(缺省开)并入 `max` 条件 ⇒ 影响**所有**默认召回调用,与库有没有边无关。读数:同一库默认口径 == `max` 且 **≠ `sum`**(top-1 由 `m_lex` 变为 `m_zz`,`m_lex` 从 #1 落到 #3)。依据设计稿 §6.2(因果路为「单路独有召回型」)与既有先例表达式。
76
+ 2. **主分数进了刷新/衰减乘子**:这是使用者最初反馈「召回的记忆会被旧的历史记忆干扰」的处置——实测 `a_fresh / b_30d / c_300d` 的默认召回排序由「越老越靠前」翻转为「越新越靠前」。
77
+ 3. **六要素后两行进默认检索**:只影响「验证方式/什么条件下不适用」这类问句的召回面;**普通问句零位移**(R2c 两态一致)。
78
+
79
+ ---
80
+
81
+ ## 四、已知边界(如实登记)
82
+
83
+ 1. **Rust 读侧缺省仍是四路**(未实现 chain/temporal)⇒ 两侧**缺省路集本就不同**;`scripts/rank_parity.py` 的 10/10 **不得读作「两侧已对齐」**(其语料无边,两条新路恒空)。
84
+ 2. **守卫盲区(本版修复)**:时间核审计器的 exp 正则抓不到 Rust 的 `(...).exp()` 形态 ⇒ `rust/src/freshness.rs` 的指数核曾**靠盲区通过**。已登记进 REGISTRY + 加与 `cred_factor` 的等价性断言 + 放宽正则。
85
+ 3. **`chain.adjacency` 是 O(N) 索引条目级**邻接构建(不读正文),**不是**「不走全表」;S3 契约文本已勘误。
86
+ 4. **S3 ④ 只部分满足**:参与边类型集可配(`MDCG_CHAIN_TYPES`);边权沿用唯一表 `EDGE_WEIGHTS`;方向固定为依赖方向。
87
+ 5. **Δt 取整日粒度**(两侧同值 `DT_QUANTUM_DAYS=1.0`),量化损失上界 ≈ γ×1天 ≈ 2.3%;设为 0 可换连续精度,但会让「两轮结果逐位一致」的既有纪律转红。
88
+ 6. **P5 方向性自检**:0.7.0 只落八步里的 ⑧反馈/⑨自检**只记账骨架**,深化顺延(设计稿 §九 允许)。
89
+ 7. **公开检索数字未复跑回填**:本版只如实披露机制与变更幅度,未重跑 README 的头条检索数字(体积与时间原因)。
90
+ 8. 静默缺件类(整目录未出货)无门禁信号(第九腿只断言具名文件在场);`check_publish_artifact` 的「非追踪件面」零余量;PR #47 未并;三条残余 CI 红未修。
91
+
92
+ ---
93
+
94
+ ## 五、发布面与回验
95
+
96
+ - 版本号 8 处:`package.json` · `package-lock.json`(×2)· `.claude-plugin/marketplace.json` · `claude/lingshu-memory/.claude-plugin/plugin.json` · `codex/lingshu-memory/.codex-plugin/plugin.json` · `skills/plugin.json` · `README.md` 正文版本行。**`SERVER_VERSION` 不动**(它动态读 `package.json`)。
97
+ - 回验:`python scripts/check_publish_artifact.py` · `python scripts/check_publish_smoke.py`(真装真握手)· `python -X utf8 scripts/check_registry_tarball.py`(发布后)· `npx @furongjun1999/dsh-memory init`(清缓存后终验)。