@furongjun1999/dsh-memory 0.6.1 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/README.md +49 -18
  2. package/docs/README.md +1 -0
  3. package/docs/eval/cons200_/345/206/262/347/252/201/346/243/200/346/265/213/351/200/211/351/235/242_/345/256/236/346/226/275/350/256/260/345/275/225_v1.0.md +223 -0
  4. package/docs/eval/cons200_/345/206/262/347/252/201/346/243/200/346/265/213/351/200/211/351/235/242_/345/256/236/346/226/275/350/256/260/345/275/225_v1.1.md +340 -0
  5. package/docs/eval/issue50_/345/205/203/346/225/260/346/215/256/351/200/217/344/274/240/344/270/216/345/205/234/345/272/225_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +437 -0
  6. package/docs/eval/issue50_/345/215/212/351/207/215/345/244/215/345/276/205/345/256/232/345/244/215/346/240/270_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +488 -0
  7. package/docs/eval/issue50_/345/276/205/345/256/232/345/244/215/346/240/270/345/205/245/351/230/237_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +428 -0
  8. package/docs/eval/issue50_/350/257/273/351/235/242/344/277/235/346/212/244/345/217/252/350/256/244/346/230/276/345/274/217/346/235/245/346/272/220_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +271 -0
  9. package/docs/eval/issue50_/351/207/215/350/246/201/345/272/246/345/220/214/346/272/220/344/270/216/344/277/235/346/212/244/350/257/255/344/271/211_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +306 -0
  10. package/docs/eval/issue51_/344/270/200/351/224/256/345/256/211/350/243/205/345/244/261/350/264/245_/345/275/222/345/261/236/345/210/244/345/256/232_v1.0.md +58 -0
  11. package/docs/eval/issue52_/346/235/241/344/273/266/345/205/210/350/241/214/344/270/216/346/210/252/346/226/255/345/217/257/350/247/202/346/265/213_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +360 -0
  12. package/docs/eval//344/270/211/346/241/243/350/207/252/346/262/273_/346/255/245/351/252/244/342/221/241/346/241/243/344/275/215/345/215/225/344/270/200/345/205/245/345/217/243_/350/220/275/347/240/201/350/256/260/345/275/225_v1.0.md +651 -0
  13. package/docs/eval//344/270/211/346/241/243/350/207/252/346/262/273_/346/255/245/351/252/244/342/221/242/345/217/230/346/233/264/345/215/225/344/270/216/345/233/236/346/273/232/345/216/237/350/257/255_/350/220/275/347/240/201/350/256/260/345/275/225_v1.0.md +439 -0
  14. package/docs/eval//344/270/211/346/241/243/350/207/252/346/262/273_/346/255/245/351/252/244/342/221/243/345/207/206/345/205/245/350/257/273/346/225/260_/350/220/275/347/240/201/350/256/260/345/275/225_v1.0.md +1337 -0
  15. package/docs/eval//344/270/211/346/241/243/350/207/252/346/262/273_/346/255/245/351/252/244/342/221/244/346/224/266/345/256/230/344/270/216/345/205/250/351/223/276/351/252/214/346/224/266_/350/220/275/347/240/201/350/256/260/345/275/225_v1.0.md +1817 -0
  16. package/docs/eval//345/207/272/350/264/247/351/235/242/345/206/222/347/203/237_/350/277/233/350/264/247/351/227/250/347/246/201_v1.0.md +460 -0
  17. package/docs/eval//345/217/221/345/270/20308_/350/207/252/350/277/255/344/273/243/344/270/216/347/235/241/347/234/240_/345/233/276/346/243/200/347/264/242/350/267/257/344/270/216/346/235/203/351/207/215_v1.0.md +97 -0
  18. package/docs/eval//345/217/221/345/270/20309_/346/243/200/347/264/242/351/235/242/344/270/211/346/211/271/346/224/266/345/217/243_v1.0.md +66 -0
  19. package/docs/eval//345/275/222/344/270/200/345/261/202/347/274/272/347/234/201/347/277/273/345/205/263_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +458 -0
  20. package/docs/eval//347/254/2543/345/261/202stg/347/273/223/346/236/204/347/264/242/345/274/225_/345/256/236/346/226/275/350/256/260/345/275/225_v1.0.md +250 -0
  21. package/docs/hive//346/243/200/347/264/242/347/256/227/346/263/225/345/217/243/345/276/204/345/257/271/347/205/247_v0.1.md +136 -11
  22. package/docs/hive//346/243/200/347/264/242/350/267/257/345/276/204/344/270/216/350/256/244/347/237/245/347/273/223/346/236/204/345/245/221/347/272/246_v0.1.md +32 -2
  23. package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +88 -0
  24. package/docs/mdcg//345/212/237/350/203/275/350/260/203/347/224/250/346/230/240/345/260/204/350/241/250_v0.1.md +40 -40
  25. package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +47 -11
  26. package/docs/mdcg//347/235/241/347/234/240/345/221/250/346/234/237_/350/277/220/347/273/264/345/211/215/346/217/220/344/270/216/347/273/264/346/212/244/346/214/207/345/215/227_v1.0.md +183 -0
  27. package/docs/plans/stg/346/235/241/344/273/266/345/214/226/344/270/216/347/273/223/346/236/204/347/264/242/345/274/225_/350/256/276/350/256/241_v0.1.md +124 -0
  28. package/docs/plans//347/235/241/347/234/240/344/270/216/350/207/252/350/277/255/344/273/243_/345/212/237/350/203/275/344/274/230/345/214/226/350/256/276/350/256/241_v0.4.md +547 -0
  29. package/docs/plans//350/256/260/345/277/206/350/207/252/345/244/204/347/220/206/344/270/211/346/241/243/350/207/252/346/262/273_/350/256/276/350/256/241_v0.2.md +207 -0
  30. package/md_cg/admission.py +718 -0
  31. package/md_cg/autonomy_modes.py +642 -0
  32. package/md_cg/bench_e2e_locomo_qa.py +11 -4
  33. package/md_cg/chain.py +47 -0
  34. package/md_cg/consistency.py +133 -8
  35. package/md_cg/forgetting.py +38 -6
  36. package/md_cg/freshness.py +527 -0
  37. package/md_cg/generation.py +409 -0
  38. package/md_cg/hotcache.py +4 -1
  39. package/md_cg/lifecycle.py +30 -2
  40. package/md_cg/mcp_server.py +191 -26
  41. package/md_cg/mdcg.py +594 -39
  42. package/md_cg/mdcos.py +869 -38
  43. package/md_cg/nodefile.py +74 -1
  44. package/md_cg/protect.py +79 -4
  45. package/md_cg/provenance.py +1 -1
  46. package/md_cg/review_cli.py +31 -2
  47. package/md_cg/rollback.py +411 -0
  48. package/md_cg/rollback_cli.py +104 -0
  49. package/md_cg/semantic/canonical.py +22 -0
  50. package/md_cg/semantic/unify.py +73 -22
  51. package/md_cg/semantic/unify_fixture.json +25 -0
  52. package/md_cg/sleep.py +1297 -0
  53. package/md_cg/stg.py +400 -50
  54. package/md_cg/stgidx.py +281 -0
  55. package/md_cg/sustain.py +146 -9
  56. package/md_cg/test_auto_defaults.py +424 -0
  57. package/md_cg/test_autonomy_admission.py +1098 -0
  58. package/md_cg/test_autonomy_modes.py +1972 -0
  59. package/md_cg/test_b1_auto_id_multiproc.py +7 -0
  60. package/md_cg/test_b1b2_write_face.py +7 -0
  61. package/md_cg/test_b3_merge_keeps_content.py +7 -0
  62. package/md_cg/test_boundary_hit.py +410 -0
  63. package/md_cg/test_cons200_scan_selection.py +791 -0
  64. package/md_cg/test_en_pipeline.py +22 -13
  65. package/md_cg/test_generation_guard.py +352 -0
  66. package/md_cg/test_h4_sustain_snapshot.py +14 -4
  67. package/md_cg/test_i50a_half_dup_defer.py +408 -0
  68. package/md_cg/test_i50b_defer_to_review_queue.py +545 -0
  69. package/md_cg/test_i50c_meta_passthrough.py +608 -0
  70. package/md_cg/test_i50d_importance_source.py +531 -0
  71. package/md_cg/test_i50e_readside_protection.py +656 -0
  72. package/md_cg/test_issue39_utf8_stdio.py +9 -1
  73. package/md_cg/test_issue52_scan_condition_first.py +677 -0
  74. package/md_cg/test_linkref.py +7 -0
  75. package/md_cg/test_mode_parity.py +1393 -0
  76. package/md_cg/test_mutation_rollback.py +805 -0
  77. package/md_cg/test_n204_n205_n226_n227_n228_n229_exit_gates.py +1 -1
  78. package/md_cg/test_n212_n213_n224_generation_gates.py +14 -8
  79. package/md_cg/test_n214_n215_n221_n222_write_face_gates.py +7 -0
  80. package/md_cg/test_n230_dirty_replay.py +375 -0
  81. package/md_cg/test_p2_mcp.py +8 -0
  82. package/md_cg/test_p2_six_elements.py +463 -0
  83. package/md_cg/test_p3_legacy_closure.py +433 -0
  84. package/md_cg/test_p4_freshness.py +680 -0
  85. package/md_cg/test_p8_subgraph_chain.py +14 -1
  86. package/md_cg/test_p9_forget_protect.py +7 -0
  87. package/md_cg/test_p9c_dedup_hints.py +7 -0
  88. package/md_cg/test_policy_required_ccg.py +5 -1
  89. package/md_cg/test_protocol.py +7 -0
  90. package/md_cg/test_rank_parity_score_mode.py +6 -0
  91. package/md_cg/test_semantic_canonical.py +5 -3
  92. package/md_cg/test_sleep.py +611 -0
  93. package/md_cg/test_sleep_p1.py +784 -0
  94. package/md_cg/test_stgidx_index_parity.py +1020 -0
  95. package/md_cg/test_time_core_lint.py +968 -0
  96. package/md_cg/test_unify_default_off.py +701 -0
  97. package/md_cg/test_unify_scope.py +182 -0
  98. package/md_cg/test_writelimit.py +36 -9
  99. package/md_cg/test_writepipe.py +5 -2
  100. package/md_cg/weights.py +15 -1
  101. package/md_cg/whitebox_kb/aeis_core/time_core.py +8 -0
  102. package/md_cg/writepipe.py +101 -2
  103. package/package.json +3 -2
  104. package/skills/plugin.json +1 -1
  105. package/utf8_boot.py +237 -0
@@ -0,0 +1,547 @@
1
+ # 睡眠与自迭代 · 功能优化设计(v0.4 · 规格已冻结)
2
+
3
+ > **状态:规格已冻结(§十 待签收项全部裁定)· 0.7.0 实现线。**
4
+ > **起因**:使用者实测反馈四症状(召回被旧的历史记忆干扰 / 反思未生效 / 遗忘未生效 / 按时间与因果等六要素重建索引未生效)。
5
+ > **v0.1 → v0.2**:使用者就第一轮六个待裁定项给出裁定,逐条落地;并补两轮专项调研(因果与时间的图检索、访问刷新与衰减权重)。**两条与直觉不同的调研结论已如实标注**(见 §1.4/§1.5 的「⚠ 与直觉不同」)。
6
+ > **v0.2 → v0.3**:使用者就 §十 的五个待定项给出裁定——合并**沿用 git 的方式自动进行**、窗口取 `23:00-07:00`、六要素**全进默认检索**、权重**进主分数**;并追问 τ 口径(§6.3 作答,**并更正 v0.2 里我写错的那个公式**)。§四 因此整章改写为 **git 机制**(含九条硬冲突的逐条应对)。
7
+ > **v0.3 → v0.4**:使用者就 §十 剩余四项给出裁定(见 §〇.3),**规格冻结**;并定发版口径——本线实现随 **0.7.0** 出货,测评面 = `D:\1_ai\membench\dist\因果分析基准_v1.0`。
8
+
9
+ ---
10
+
11
+ ## 〇、六条裁定的落地索引
12
+
13
+ | # | 使用者裁定(原话要点) | 落在本件 | 一句话结论 |
14
+ |---|---|---|---|
15
+ | 1 | 「周期性改库不用担心。开启时使用**一个副本**进行迭代整理,完成后**周期性合并**。周期**一小时一次**,且在**睡眠时间**开启,**可由用户调整**」 | **§四** | 影子副本迭代 + 周期合并;新增 `MDCG_SLEEP_INTERVAL`(缺省 3600s)与 `MDCG_SLEEP_WINDOW`(睡眠时段,可调) |
16
+ | 2 | 「『验证方式/不适用条件』**是赋予索引角色**——以什么方式验证、什么条件下不适用,**这是需要检索的**」 | **§五** | 把理论那张 4 行的「图的索引角色」表**补成 6 行**,后两行成为**检索维度**(含与既有负路由语义的耦合约束) |
17
+ | 3 | 「因果、时间是**图检索**的方式,你进行调研后做方案。理论设计是有的」 | **§六** | 方案已出;但**⚠ 理论里没有图检索的执行模型**(0 命中),真正可执行的是**契约层 S3**,理论给的是授权与形态依据——详见 §1.4 |
18
+ | 4 | 「**显然是分数**;被经常调用的记忆其权重被刷新,不被调用的记忆其权重衰减。这个也是本来就有的理论设计」 | **§七** | 按裁定做**分数乘子**;**⚠ 该机制的成文实现在随包 AEIS 源码、且未接线**,理论层无「随访问刷新」条款——详见 §1.5 |
19
+ | 5 | 「`bootstrap_loop` 写入面:**先调研,当前不改**」 | §1.6 第 4 行 | 只登记站点与后果,**本轮不动** |
20
+ | 6 | 「你需要**完善设计稿**」 | 全件 | v0.2 → 本件 v0.3 |
21
+
22
+ ### 〇.2 第二轮五项裁定的落地(v0.2 → v0.3)
23
+
24
+ | # | 使用者裁定(原话要点) | 落在本件 | 一句话结论 |
25
+ |---|---|---|---|
26
+ | 7 | 「**合并还是得做验证,留下修改历史,和最新版本。沿用 git 的方式,自动进行。**」 | **§四(整章改写)** | 影子工作树 + **独立 git 目录**(`.git` 不落进数据根)+ 每周期一个提交(历史)+ `--no-ff` 合并回 `main`(最新版);**但 git 只做记录者,准入仍走语义四闸** |
27
+ | 8 | 「23:00–07:00 不错」 | §4.6 | `MDCG_SLEEP_WINDOW` 缺省 **`23:00-07:00`**(跨午夜支持) |
28
+ | 9 | 「**全进默认检索,要做就做全。**」 | **§5.4** | 六要素 6 行索引**全部进默认检索路径**(不再走 opt-in 新路);published 读数会变,需双侧同改 + 对拍守卫 + 如实披露 |
29
+ | 10 | 「**进主分数。**」 | **§7.2** | 权重刷新/衰减做成**主分数乘子**(取消 v0.2 的"先新路零位移"两段法) |
30
+ | 11 | 「这是什么?需要详细说明。」(指 τ) | **§6.3** | τ 口径已详细作答;**且 v0.2 的 `exp(-|Δt|/τ)` 写法作废**——仓内明令核形状唯一(`time_core.py` 直点名 `exp(-t/τ)` 为 bug),法定形态是 `cred_factor(γ, Δt)` |
31
+
32
+ ### 〇.3 第三轮四项裁定的落地(v0.3 → v0.4,**规格冻结**)
33
+
34
+ | # | 使用者裁定(原话要点) | 落在本件 | 一句话结论 |
35
+ |---|---|---|---|
36
+ | 12 | 「**γ = ln2/30天、Δt 用 created_at**」 | **§6.3(c)(d)** | 半衰期 30 天档(与 `links.py:53` 同刻度);Δt 取写入时刻 `created_at`(最稳,不依赖未落主链的 `temporal_coordinate`) |
37
+ | 13 | 「**回滚只给 revert**」 | **§4.4 / §7.4** | 只提供 `git revert`(留历史、可追);**不提供 `reset --hard`**(抹历史) |
38
+ | 14 | 「**进行登记,让用户知道怎么维护记忆**」 | **§4.2-9 / §十.3** | 睡眠周期的 git 前提与维护动作登记进对外文档(README / 运维文档):版本库位置、只覆盖真源面、回滚方式、冲突挂起语义 |
39
+ | 15 | 「**同意**」(基线落盘方式) | **§5.4 / §7.2 附带** | 照仓内惯例:把改前 commit 检出到独立 worktree 跑同一守卫,读数落盘后再改默认链路 |
40
+
41
+ ---
42
+
43
+ ## 一、调研:这两个功能在本仓"本来是什么"
44
+
45
+ > 本节所有结论带 `文件:行号`。凡查不到处直接写"未查到"。
46
+
47
+ ### 1.1 自迭代
48
+
49
+ **(a)理论定义:八步闭环,且刻意不自闭**
50
+
51
+ `docs/theory/智能论3.4.md:2257`「### 3.10 自迭代机制(v2.0 新增步骤8)」:
52
+
53
+ ```
54
+ 1 感知 / 2 识别 / 3 分析 / 4 验证 / 5 固化 / 6 记录 / 7 反馈 / 8 方向性自检
55
+ ```
56
+
57
+ - `:2276` 步骤 8 =「系统定期(默认每 100 轮)执行一次『方向正确性』评估」。
58
+ - `:2282` **关键纪律**:「方向性自检由反思单元发起,验证单元独立复核结果,维生系统确认后记录。**自检结果不自动触发修改**」。
59
+ - `:2334` 三层:局部迭代 / 完整迭代 / 外部迭代。
60
+ - `docs/mdcg/release_v0.3.0.md:15` 对外复述为「自迭代闭环(八步)」。
61
+
62
+ **(b)三支工程投影**:5 固化 → `md_cg/consolidate.py`(promote/induce/contextualize);重要性重算 → `md_cg/weights.py`;去污染 → `md_cg/scrub.py`;6 记录 → `md_cg/evolution.py` + `<记忆根>/_evolution/ledger.md`(append-only,含 `pattern/missing/action/state/evidence`,**回滚也记一条**)。
63
+
64
+ **(c)另一支:白箱自举(别与自迭代混)**
65
+
66
+ - 定义 `docs/theory/白箱智能是什么?.md:535-537`:「『自举』**不是**简单地让 AI 修改自己的源代码」「**系统开始使用自身的认知机制描述、验证和扩展自身**」。
67
+ - 工程落点 `scripts/bootstrap_loop.py` + `md_cg/whitebox_kb/wisdom/*`;**自举纪律 = 未验证不固化**。
68
+ - 与自迭代的关系:`md_cg/whitebox_kb/wisdom/docs/方向性抉择_自举vs自迭代.md:69-71` 判定二者「同一主线的前后半段」;该文本身是**待裁定提案**(`:76-81`)。
69
+ - ⚠ **同一个词在本仓至少三种用法**:①理论八步(自迭代)②白箱自举(描述/验证/扩展自身)③抉择文档里的**窄义编译器自举**。本件一律用 ①「自迭代」、②「白箱自举」,不使用 ③。
70
+
71
+ **(d)工程台账:缺陷挖掘·自主迭代(v1…v26)**:形态为轮次台账 + 修复报告 + 守卫清单 + 门禁记录(`docs/eval/缺陷挖掘_自主迭代_v9.md:1-8`);**驱动力 = 人工编排 + ZCode 工作流,无任何定时器**(`.zcode/workflow-drafts/灵枢缺陷迭代第N轮*.dwf.ts` 与 `docs/eval/缺陷挖掘_自主迭代_vN.md` 一一对应;`v25.md:3/:187`、`v20.md:3`)。
72
+
73
+ **(e)仓内自认的缺口(原话)**
74
+
75
+ | 出处 | 原文(摘) |
76
+ |---|---|
77
+ | `md_cg/sustain.py:26-33` | 「自我演化的三类动作(固化 / 重算重要性 / 去污染)**早已具备,缺的是驱动源**」 |
78
+ | `md_cg/sustain.py:47-48` | 「**依赖 LLM 的固化永不自动跑**——巡检报出候选数,交人工另批」 |
79
+ | `docs/eval/AGI七维评分报告_md_cg_v2.0.md:222` | 「**缺的只是自动放行策略**」 |
80
+ | `docs/mdcg/源码级架构审计_GPT批评对照_v1.0.md:33` | 「确实**缺**『预测误差→模型更新』这一环」 |
81
+
82
+ ### 1.2 睡眠
83
+
84
+ **(a)本仓没有它的设计文档。** 全 `docs/` 里"睡眠"只有 6 行出处,且都是工具行级说明:
85
+
86
+ | 文件:行号 | 原文 |
87
+ |---|---|
88
+ | `docs/mdcg/灵枢MCP工具总表_v3.4.md:18` | `promote_memories`|情境层批量提升扫描(**睡眠巩固**) |
89
+ | `docs/mdcg/tool_table_v0.3.0.md:19` | `promote_memories`|…(**睡眠巩固/会话结束**):够格者升知识层/长期层 |
90
+ | `docs/mdcg/灵枢MCP工具总表_v3.4.md:78` | `nightly_cleanup`|知识层**夜间**整理(分拣迁移无边孤岛→情境层+联想补边+情境层随机联想) |
91
+ | `docs/theory/理论_机制_代码_实验_缺口矩阵_v0.1.md:53` | #27 **睡眠整理/联想保留**|🟡「**机制在,本仓无治理前后数字**」 |
92
+ | `docs/theory/智能论3.4.md:4420` | 涨落|**睡眠状态中的随机条件空间匹配**(协同学映射表,全表仅此一行与睡眠有关) |
93
+
94
+ **(b)唯一有步骤序列的定义在随包 AEIS 源码**:`md_cg/whitebox_kb/aeis_core/core.py:4833` `run_maintenance_cycle()` = **衰减 → 巩固 → 归纳**。
95
+
96
+ **(c)「知识飞轮」的步骤在文档间互相冲突**(三说并存):
97
+
98
+ | 出处 | 序列 |
99
+ |---|---|
100
+ | `docs/theory/智能的公理化基石.md:725`、`README详细版:100`、`智能的认知过程.md:373` | 验证 → 归纳 → 联想 → 蒸馏 → 推演 |
101
+ | `docs/theory/智能论3.4.md:2949` | 验证 → 归纳 → **蒸馏 → 迁移 → 固化** |
102
+ | `md_cg/whitebox_kb/seed_knowledge/白箱协议.md:15` | 验证 → 归纳 → **固化 → 复用 → 再验证** |
103
+
104
+ 机制定义(唯一一段)`docs/theory/智能论3.4.md:3029`:「**知识飞轮(误差 → 补条件 → 更新结构)**」。⇒ 本设计须先把序列钉成真源(§三)。
105
+
106
+ **(d)现状驱动力**:`md_cg/sustain.py:1052-1098` 五档 tick;`md_cg/mcp_server.py:4153` `main()` 在 stdin 读循环**之前**调 `_start_sustain(cg)`;`MDCG_SUBSTAIN` 缺省 `"1"`(`:3571`)⇒ **常驻循环默认自启**(`docs/mdcg/记忆操作系统_MdCGOS与MCP接入_v0.1.md:111`)。缺省只开 heal 与 tidy;`MDCG_AUTO_SCRUB`(`:3585`)/ `MDCG_AUTO_EVOLVE`(`:3589`)缺省 0(只读巡检)。⚠ 两入口 `auto_tidy` 缺省相反(op 路径 `:1639` False / env 路径 `:3595` True)。
107
+
108
+ ### 1.3 六要素与索引
109
+
110
+ **(a)六要素本来就有"图的索引角色"** —— `docs/theory/智能论3.4.md:3053-3059` 表头「要素 \| 标记 \| 内容 \| **图的索引角色**」,**只有 4 行**(功能名/生效条件/子功能/执行)。配套 `:3043-3045`「**注释 = 节点的名(以名举实):图的检索 = 条件词 → 节点**……无注释 = 节点无名 = 图断裂」;`docs/theory/白箱智能是什么?.md:423/804` CCG =「以『条件词 → 节点』为检索面的代码能力索引」。
111
+
112
+ **(b)条件空间是 4 维**(`docs/mdcg/认知图_条件空间合成与生效条件口径_v0.1.md:4`):载体/位置 · **时间** · 方法 · 约束。**因果不在其中。**
113
+
114
+ **(c)时间与因果的现存身份**:时间 = 条件空间 4 槽之一 + 双时间轴 `valid_from/valid_until`(**已入索引**但**只在显式 `validity=True` 时过滤**);因果 = `edges` 的 `relation=="causal"` + 时空图 `temporal_coordinate`/`sequential` 边(**不进索引、不进默认检索**)。
115
+
116
+ **(d)索引现状**:`_index.json = {nodes, buckets, _fingerprint}` 扁平快照(`md_cg/mdcg.py:1646-1651`);与条件空间有关的只有 `time_window`(:1572) 与 `observation_position`(:1590) 两个标量。**无六要素轴、无时间轴、无因果轴。**
117
+
118
+ **(e)结论**:「按六要素/按时间与因果重建索引」在文档里**零处** ⇒ 本设计是**新提案**;其合法性来自 §1.3(a) 那张表——**六要素本来就是"图的检索面"**,我们要做的是把表从 4 行长成 6 行、并把它从"注释即索引"落成真正的索引结构。
119
+
120
+ ### 1.4 因果与时间作为**图检索**的方式(裁定 3 的调研)
121
+
122
+ > **⚠ 与直觉不同**:使用者说"理论设计是有的"。**调研结果:理论里有授权与形态依据,但《智能论3.4.md》里没有任何"图检索执行模型"**——我对该文件逐词 grep:「图检索」「图扩散」「扩散激活」「种子」「逐跳」「跳数」**全部 0 命中**。可执行的模型在**契约层**。
123
+
124
+ **(a)理论给的是授权(原文)**
125
+
126
+ | 出处 | 原文 |
127
+ |---|---|
128
+ | `智能论3.4.md:3096` | 「**因果推理**:从已有关系推导新的因果关系,支持『如果 A 则 B』的推理」 |
129
+ | `智能论3.4.md:2952-2956` | 「**条件路由图 = 条件 → 知识 → 条件 → 知识 → 结论**的连接方式……每一步都有自己的条件和知识」 |
130
+ | `智能论3.4.md:3060-3061` | 「**语义时空图三维结构**:语义(功能名/生效条件/子功能)→ 语义节点;**时间(子功能①②③ 执行顺序)→ 时序边**;空间 → 结构边」 |
131
+ | `智能论3.4.md:3124` | 演化边 `relation_type`:`sequential / causal / correlated / cyclic` |
132
+ | `智能论3.4.md:3109/3123` | 节点 `temporal_coordinate`(时间轴上的唯一位置)/ 边 `time_delta`(时间差秒) |
133
+ | `智能论3.4.md:4790-4792` | 附录声明:图/路径/遍历是对物理-信息层的**有损投影** |
134
+
135
+ **(b)可执行的图检索模型在契约层**:`docs/hive/检索路径与认知结构契约_v0.1.md`
136
+
137
+ - `:21-30` 六阶段收敛:`S1 大域先验 → S2 条件空间前置门控 → S3 图扩散激活 → S4 层级激活优先级 → S5 负记忆抑制 → S6 一致性交叉验证`。
138
+ - `:25`「**S3 图扩散激活**:以 (S1∩S2) 命中为种子,沿 edges 双向扩散 N 跳、按跳数衰减;**不走全表**」。
139
+ - `:49-53` S3 契约:种子 1.0,**第 n 跳 × 衰减^n**;不变量「**不得引入未通过 S2 门控的节点**;边方向/关系类型权重可配」。
140
+ - `:77`「规则:**默认关**;每阶段可单独开」。
141
+
142
+ **(c)工程现状(对齐到行号)**
143
+
144
+ | 项 | 现状 | 行号 |
145
+ |---|---|---|
146
+ | 因果链原语 | **已完整实现**:`chain.py` 模块命题「**因果链就是条件链**」;边权 `EDGE_WEIGHTS`(14 键,causal .85 / sequential .60 / …);`edge_weight = 类型 base × 边 confidence`;`MAX_DEPTH=5`、`decay=0.9`、`expand_from_seeds` = `种子分 × 链累积权重 × decay^跳数` | `md_cg/chain.py:2-10`、`:28-47`、`:82-91`、`:55-57`、`:281-316` |
147
+ | 关系链检索路 | `_path_chain`:沿 causal/sequential/applies_to 多跳,种子取 `ranked["lexical"]+ranked["entity"]`,默认 5 跳 | `md_cg/mdcos.py:1160-1211`、`:1492-1494` |
148
+ | **但它不在默认路** | `search_rrf` 缺省 `paths=("lexical","bucket","entity","graph")`;`mdcg_recall` 也从不 append `"chain"` | `md_cg/mdcos.py:1347`、`md_cg/mcp_server.py:3351-3358` |
149
+ | S3 图扩散 | `search` 内**已实现**,但**必须显式 =1**(有意的非对称),且**不看边类型/边权**(纯 `decay**hop`) | `md_cg/mdcg.py:3392-3425`、`:3164-3169`、`:3470-3511` |
150
+ | 因果查询 | `cg(op=causal)` → `predict.causal_path`(BFS 可达性)+ `causal_gate`(D-002 伪因果门:须有 causal/sequential 边、或共同父节点、或偏好权重>0.5) | `md_cg/mcp_server.py:1433-1468`、`md_cg/predict.py:1020-1059`、`:206-224` |
151
+ | **因果为什么不进候选池** | 它只能经 `op=causal` / `mdcg_causal` 到达,**既不写进 `search_rrf` 的 `ranked` 字典,也不注册为 `paths` 取值** ⇒ 与融合链路零交集 | `md_cg/mdcos.py:1481-1503` |
152
+ | `stg` 三个 op | `relation`/`timeline`/`anchors` 都是**查询**(全库扫描 + 排序),**不产出候选分** | `md_cg/stg.py:197-320`、`:5-13` |
153
+ | 边的 relationship 写入面 | `MdCG.append_edge()`(幂等键 `(target, relation_type)`);`consolidate` 写 `generalizes`/`instance_of`;`linkref` 写 `reference` | `md_cg/mdcg.py:2299-2320`、`md_cg/consolidate.py:1210-1211`、`md_cg/linkref.py:102` |
154
+ | ⚠ 易混 | **`cg(op=link)` 管的是跨节点信任(`_links.json` / P_trust),不是图谱边** | `md_cg/mcp_server.py:2083-2135`、`md_cg/links.py:46-47` |
155
+ | 在册缺陷 1 | `_move_layer` 的 `_stage` 条目缺 `edges`/`subgraph`/双时间轴 ⇒ 降级搬迁后**新路会静默拿不到边**(N137,未修) | `docs/eval/缺陷挖掘_自主迭代_v16.md:89` |
156
+ | 在册缺陷 2 | 归并成员边在检索面长期不可达(审计偏差 1) | `md_cg/mdcg.py:3392-3393` 注释原文 |
157
+
158
+ **(d)结论**
159
+
160
+ **理论对「时间」与「因果」的授权 = 边类型取值 + 节点/边字段 + 推导语义(因果推理);检索方式是「条件路由下的边遍历」。** 把它们提为**索引结构**属**新增设计**(理论只有 `:3053-3059` 那张索引角色表与 `:3060-3061` 的时序边可作锚点),而**可执行模型应照抄契约层 S3**(种子=已过 S1/S2 门控者、沿 edges 扩散 N 跳、跳数衰减、不得引入未过门控节点)。**方案见 §六。**
161
+
162
+ ### 1.5 访问刷新 / 不访问衰减(裁定 4 的调研)
163
+
164
+ > **⚠ 与直觉不同**:使用者说"这个本来就有的理论设计"。**调研结果分两半**:①「高重要度演练刷新 + 低重要度降权」**有成文实现,但在随包 AEIS 源码里,且全仓无调用者**("有实现、未接线");②**理论层没有"importance 随访问刷新"的条款**——理论只有"未验证的**关系 confidence** 随时间衰减",而"以分数进入检索"在本仓**至今是未裁定的开放问题**(v0.1 §七-4 就是这一条)。
165
+
166
+ **(a)理论层有什么**
167
+
168
+ | 出处 | 内容 |
169
+ |---|---|
170
+ | `智能论3.4.md:3098` / `:3158` | 「持续验证:新关系经验证单元复核;**未验证的关系随时间衰减**」(对象=**关系 confidence**) |
171
+ | `智能论3.4.md:2122-2125` | 【DEV-005】「stable 租约的 TTL 与时空记忆图 confidence 字段**衰减共享同一指数衰减核 `exp(-γ·t)`**,γ 由验证单元按条件空间校准」(**唯一显式公式**,γ 无数值) |
172
+ | `智能论3.4.md:3180-3181` | 第五章状态动力学:`d(c_i)/dt = -γ_i·(c_i − c_baseline)`(向 baseline 回归的指数核) |
173
+ | `智能论3.4.md:1750-1751` | 置信刷新是**贝叶斯**:`c_i ~ Beta(a_i0 + n_eff_hit, b_i0 + n_eff_miss)`——**刷新驱动=验证命中/失手,不是调用次数** |
174
+ | `智能论3.4.md:1801-1804` | 交互频率只影响**统计窗口** `N_effective`,不影响记忆权重 |
175
+ | `智能论3.4.md:1666-2005` | EVENT-VALUE-COOLING-012 已被理论自我更正为"**不是冷却,是迁移**"(对象=情感/信任,**与记忆权重不是同一机制**) |
176
+
177
+ **(b)成文的"刷新/降权"实现(随包 AEIS 源码,未接线)**
178
+
179
+ `md_cg/whitebox_kb/aeis_core/core.py:4801-4831` `consolidate_cycle(rehearsal_threshold=0.7, degrade_threshold=0.2, gain=0.01)`,docstring 逐字:「**P1-4 巩固周期:高重要度演练(刷新访问)+ 低重要度降权 + 压缩候选标记**」:
180
+
181
+ - 跳过 `anchor`/`structure` 层、跳过 `protected`/`no_forget`(`:4811-4814`)。
182
+ - **刷新**:`importance ≥ 0.7` → `increment_access`;且 `access_count % 10 == 0` → `+0.01`(`:4815-4820`)。
183
+ - **降权**:`importance < 0.2` 且 `access_count ≤ 2` → `−0.01`(`:4821-4825`)。
184
+ - **压缩候选**:`importance < 0.08` → 打 `compressible` 标(`:4826-4827`)。
185
+ - 衰减:`decay_cycle(factor=0.02, min_confidence=0.1)`(`:850-903`):未验证边与 **context 层**节点每周期 `×(1−0.02)`,**`< 0.1` 直接删**(**无 floor**);KNOWLEDGE 层不衰减。
186
+ - **唯一合法衰减核**:`md_cg/whitebox_kb/aeis_core/time_core.py:29-35` `cred_step(x, f) = x·(1−f)`;该模块 docstring 自述「**任何在本模块之外出现的衰减核实现(`exp(-t/τ)`、`×(1−factor)`、EMA 保持率)都是 bug**」。
187
+ - ⚠ **这套在 md_cg 生产路径里零调用者**(除自身与本文档,全仓 grep 无外部调用)。
188
+
189
+ **(c)工程现状(md_cg 侧)**
190
+
191
+ | 项 | 现状 | 行号 |
192
+ |---|---|---|
193
+ | `access_count`/`last_access` | **只记账**:读路径 append-only 写 `_access.log`(不碰节点文件);维护路径 `compact_access()` 折叠落 frontmatter | `md_cg/mdcg.py:4127-4131`、`:4146-4164` |
194
+ | 谁读它们 | 只有三处**非检索面**:scrub 抽检分层、consolidate 升层热度门槛、导出 | `md_cg/scrub.py:109-113`、`md_cg/consolidate.py:927-929`、`md_cg/md_whitebox.py:202-203` |
195
+ | **卡点** | 索引条目构造函数 `_node_entry` 的键集**不含**这两个字段 ⇒ 检索想用也拿不到(除非读盘,违反"检索不写少读"纪律) | `md_cg/mdcg.py:1532-1563` |
196
+ | `importance` 在检索里 | **只作并列键 + 兜底池主键,零乘子形态** | `md_cg/mdcg.py:177-187`、`:3703-3706`、`:3420-3422`;`md_cg/mdcos.py:1057-1067`、`:1512-1515` |
197
+ | `weights.recalc` 公式 | `0.40·basis_trust + 0.35·cov + 0.25·(1−rr)`——**无时间项、无访问项**;有 floor 0.70、预演、`_maintain.jsonl`、rollback | `md_cg/weights.py:452-457`、`:459`、`:472-568`、`:572-616` |
198
+ | scrub 的"陈旧" | 只决定**查谁**(分层抽样),**不改权重** | `md_cg/scrub.py:160-226` |
199
+ | 乘子位现状 | 被"分池权重表"与"S5 负记忆抑制 λ"占用(**两个都缺省关**);层级影响是**加法**不是乘法 | `md_cg/mdcg.py:3575-3577`、`:3695`、`:3578-3579`;`md_cg/pooling.py:44-48` |
200
+ | ⚠ 移植隐患 | AEIS 衰减**无 floor**,而 md_cg 保护判定是**即时读 `importance ≥ 0.70`** ⇒ 衰减穿过 0.70 会让节点**自动失去保护**;两套保护口径不同源 | `md_cg/protect.py:135-151`、`:46` |
201
+
202
+ **(d)结论**:「按访问刷新 / 不访问衰减」在 md_cg 生产路径中**不存在**(access 只记账、importance 只作并列键);现成实现(AEIS 内置)**有实现未接线**;**以分数乘子进入检索**是本仓**首次裁定**(理论无先例,且改动主分数会动 published 读数与 Rust 侧 `sort_path` 对拍)。**方案见 §七**——按使用者裁定做分数,但形态上取**风险最小**的实现路径(§七.2)。
203
+
204
+ ### 1.6 与本设计直接相关的既有缺陷(已实察)
205
+
206
+ | # | 缺陷 | 站点 | 关系 |
207
+ |---|---|---|---|
208
+ | 1 | **跨进程无互斥** | `md_cg/sustain.py:1214-1227`(`_LOOPS` 进程内字典)、`start()` `:1015-1024` 不读心跳戳、`sustain.py` 未 import FileLock | **P0**:副本机制正是为绕开它而设计(§四) |
209
+ | 2 | **N230 `_dirty` 重放遮蔽**(未修) | `md_cg/mdcg.py:1353-1357`;`docs/eval/缺陷挖掘_自主迭代_v25.md:132/178` | 旧盖新 ⇒ 使用者报的"旧记忆干扰" |
210
+ | 3 | 两入口 `auto_tidy` 缺省相反 | `mcp_server.py:1639` vs `:3595` | 收口 |
211
+ | 4 | **`bootstrap_loop` 写入面在包内** | `scripts/bootstrap_loop.py:32-33`(`WISDOM=BRAIN/md_cg/whitebox_kb/wisdom`)、`persist_triggers` `:150-185` 直改 `*_units.py`、`:518-535` 重建包内 db | **按裁定 5:先调研、本轮不改**,只登记(装机态下等于改 `node_modules`,pnpm 更新即丢) |
212
+ | 5 | N137 `_stage` 条目缺 `edges` | `docs/eval/缺陷挖掘_自主迭代_v16.md:89` | 图检索路的前置(§六.4) |
213
+ | 6 | README 承诺过时 | `README.md:38`「九轮/49 项/179 套」实为第 26 轮 / 245 套(`docs/eval/缺陷挖掘_自主迭代_v25.md:155`) | 顺手订正 |
214
+
215
+ ---
216
+
217
+ ## 二、设计目标(可判)
218
+
219
+ 1. **睡眠成为一条有真源步骤序列的周期**(本仓从"欠定义"到"有设计正身")。
220
+ 2. **自迭代获得驱动源**:只在纪律允许的范围内自动(确定性 + 可预演 + 可回滚;**LLM 依赖动作永不自动**)。
221
+ 3. **按六要素的索引重建落地**:六要素从"4 行索引角色 + 只当资格门槛"升级为**6 行 + 真正的重建轴**;并补**时间**与**因果**两条图检索面。
222
+ 4. **自动整理不碰主库**:一切改动先落在**影子副本**上,周期合并(裁定 1)。
223
+ 5. **可观测**:每轮睡眠/自迭代都有台账与判据读数(补 `缺口矩阵 #27` 的"无治理前后数字")。
224
+ 6. **不破既有纪律**:索引仍是派生物、可重建、逐字节确定;不自动删节点;不改 `forget` 的显式语义。
225
+
226
+ ---
227
+
228
+ ## 三、周期引擎:把睡眠与自迭代合成一个闭环
229
+
230
+ ### 3.1 步骤序列(对齐理论八步,并**钉为真源**)
231
+
232
+ | 序 | 步骤 | 对齐八步 | 现状机制 | 本设计的动作 |
233
+ |---|---|---|---|---|
234
+ | 1 | **感知盘点**(只读) | 1 感知 / 2 识别 | `_tick_evolve` → `evolution_candidates()`(恒只读) | 扩展盘点对象:索引陈旧度 / 六要素缺口 / 时间轴缺口 / 因果边增量 |
235
+ | 2 | **归纳** | 2 / 5 | `consolidate.induce` | 纳入周期(确定性) |
236
+ | 3 | **升层**(情境→知识/长期) | 5 固化 | `consolidate.promote`(三门槛:CCG 齐 / 非密文 / 热度) | 纳入周期(**首个自动化对象**:无密钥、可预演、可回滚) |
237
+ | 4 | **巩固与去污染** | 5 | `scrub.sweep`(现缺省 dry_run) | 按 §3.3 门槛决定是否放行实改 |
238
+ | 5 | **权重刷新与衰减** | 5 | `weights.recalc`(无时间/访问项) | **新增**:按 §七 接入刷新与衰减项 |
239
+ | 6 | **索引重建**(六要素 / 时间 / 因果) | 5 | **不存在** | **新增**,见 §五、§六 |
240
+ | 7 | **记录** | 6 | `evolution.record` + `_sustain.jsonl` | 扩展:记录本轮轴增量、指纹与本轮改动集 |
241
+ | 8 | **反馈** | 7 | 缺 | 最小反馈:本轮改动 → 下一轮盘点候选数的变化(可判) |
242
+ | 9 | **方向性自检** | 8 方向性自检 | 理论有、工程缺 | 每 N 轮(对齐"默认每 100 轮")产出自检记录,**不自动触发修改** |
243
+
244
+ ### 3.2 触发与稳态
245
+
246
+ - **触发**:挂既有 `sustain` 常驻循环(零新机制);新增 `MDCG_SLEEP_INTERVAL`(缺省 **3600s = 1 小时**,裁定 1)+ `MDCG_SLEEP_WINDOW`(睡眠时段,见 §四.4)。
247
+ - **稳态判据(防"无限改):沿用仓内范式——"指纹变化才做事"**。照抄 `scripts/bootstrap_loop.py:509-548` `csre_freshness()`「指纹变化才重建,首轮只取指纹」。本轮盘点候选数为 0 ⇒ 只记账、不动手。
248
+
249
+ ### 3.3 自动放行门槛(守理论纪律)
250
+
251
+ | 动作 | 是否可自动 | 依据 |
252
+ |---|---|---|
253
+ | 索引重建(派生物) | ✅ | 「索引是派生物,可安全重建」(`sustain.py:12-14`) |
254
+ | 权重重算 / 刷新衰减(确定性 + 可回滚) | ✅ | `sustain.py:26-33` 明列"确定性且可回滚" |
255
+ | 归纳 / 升层(门槛式 `consolidate`) | ✅(以可预演 + 可回滚为前提) | promote 路径不调 LLM(`md_cg/consolidate.py:899-960`) |
256
+ | 去污染实改(`scrub` apply) | ⚠ 在**副本上**可放行(裁定 1 使风险可控);合并前须人工可复核 | §四(**「合并前」窗口由 `MDCG_SLEEP_MERGE=ask` 提供;缺省 `auto` 会在同轮内合并,故最侵入的那一档缺省就关:`MDCG_SLEEP_SCRUB_APPLY=0`**) |
257
+ | **任何依赖 LLM 的固化** | ❌ **永不自动** | `sustain.py:47-48` |
258
+ | 不可回滚的删除 | ❌ **永不自动** | 五环承诺「遗忘只能由显式 `cg(op=forget)` 发起」 |
259
+
260
+ ---
261
+
262
+ ## 四、副本迭代与周期合并(裁定 1;v0.3 改为 **git 机制**)
263
+
264
+ > 裁定原话(第一轮):「周期性改库不用担心。在开启时,使用一个副本进行迭代整理。完成后才周期性合并。周期设为一小时一次,且在睡眠时间开启,可由用户调整。」
265
+ > 裁定原话(第二轮):「**合并还是得做验证,留下修改历史,和最新版本。沿用 git 的方式,自动进行。**」
266
+
267
+ ### 4.1 形态:影子工作树 + **独立 git 目录**(`.git` 不落进数据根)
268
+
269
+ ```
270
+ 主库 <root>/ ← 生产读写面;睡眠周期绝不在此迭代
271
+ anchor/ structural/ knowledge/ contextual/ self/ rejected/ unresolved/ goals/
272
+ ← 唯一真源(LAYERS 8 目录下的 .md,mdcg.py:38-39/:1609-1642)
273
+ _index.json / _index_log/ / _access.log / _keys.json / trash/ / _deletions.jsonl / …
274
+ ← 派生 / 运行态 / 密钥面(一律不进版本库)
275
+ 影子 <state_root>/sleep/shadow/ ← git worktree(分支 sleep/<ts>),每轮物化
276
+ 历史 <state_root>/sleep/lib.git ← git 目录放在数据根**之外**,用 --git-dir 显式指定
277
+ ```
278
+
279
+ **三条切法都是硬约束倒推的(逐条见 §4.2)**:
280
+ 1. **git 只覆盖真源面**(那 8 个 LAYERS 目录的 `.md`);派生/运行态/密钥一律不入版本库。
281
+ 2. **不用"在数据根里放 `.git`"**,改用 `git --git-dir=<state_root>/sleep/lib.git --work-tree=<root>` + **显式 pathspec 白名单**(只 `add` 那 8 个目录)——于是 `<root>/_keys.json`、`mkstemp` 临时件、`*.lock` **结构性不可能**被 `git add -A` 误收。
282
+ 3. **影子是 `git worktree`**:迭代在影子上做 → 每轮一个提交(=**修改历史**)→ `--no-ff` 合并回 `main`(=**最新版本**)。
283
+
284
+ ### 4.2 为什么不能"直接 `git init` 数据根":九条硬冲突与逐条应对
285
+
286
+ | # | 硬冲突(证据) | 本设计的应对 |
287
+ |---|---|---|
288
+ | 1 | **无根级锁**,写方是长驻 serve + hive + sustain + 批处理 ⇒ git 只能看到"移动中的树"(`mcp_server.py:4058`、`hive/exec.py:953`、`sustain.py:639-641`;锁粒度=`fsutil.py:106-165`) | 「物化 / 对账 / 合并」三段**串行**且持**根级锁**(§八 P0-1);迭代段完全不碰主库 |
289
+ | 2 | 数据根**无 `.gitignore`**,`mkstemp` 临时件与 `*.lock` 会漏进工作区(`fsutil.py:58`、`:124`、`mdcos.py:561`) | 用**显式 pathspec 白名单**而非 ignore 面;临时件/锁件不在白名单内 ⇒ 进不去 |
290
+ | 3 | **`<root>/_keys.json` 就在数据根下**(DEK 信封,`crypto.py:66`/`:259-261`)⇒ `git add -A` 会提交密钥 | 同 2:白名单只含 8 个真源目录 ⇒ **密钥结构性不可达**;另设机械判据(§4.5) |
291
+ | 4 | 若数据根落进仓内:`files` 含 `md_cg`,而 R1 明列 `_index.json`/`_keys.json`/`_index_log/` 为包内禁止件、R4 只放行 `lib/`、R2 点名 `md_cg/knowledge/orphan` ⇒ 三道门禁同时拦(`check_publish_artifact.py:49-67`、`:46/549-553`、`:197-220`) | 数据根**本就在插件包之外**(`datapath.py:13-24`),本设计不改这一点;git 目录另落在 `state_root` |
292
+ | 5 | 整库 `git checkout` 回滚会让所有长驻进程走"指纹失配 → 全库扫描"(1.4 万文件;签名只含 `(mtime_ns,size)`,`mdcg.py:1284-1299`) | **回滚不走 `checkout`**:回滚 = `git revert` 出一个新提交 + 语义重放回主库;且回滚须显式发起 |
293
+ | 6 | `_index_log/` 与 `_audit.jsonl` append-only 且无界(已实测 15.9MB/7.4 万行,`conformance.py:252`),`_index.json` 7.97MB 每次重建全量 diff | 它们**不在版本库里**(同 2);版本库只承担真源 md 的历史 |
294
+ | 7 | **冲突是语义的而非文本的**:同 id 覆盖须过 `protect.guard_write`/`is_immutable`(`protect.py:244-268`)、层迁移须过 `lifecycle.can_transition`(`mdcos.py:2555-2559`)、密文按 `(tenant,actor)` AAD(`crypto.py:311-330`)——`git merge` 的自动合并会**绕过这些闸门** | **两层分工**:git 只做「历史 + 版本」;**准入不经 git 的文本自动合并**,而是先算**语义差异集**逐项过四闸(保护 / tombstone / 并发 / 生命周期),通过者才重放到主库,随后让 git 把这次变更记成历史。冲突项**挂起不自动解决** |
295
+ | 8 | Windows `os.replace` 与 git 索引互造 `PermissionError`(已实证需 20 次重试,`fsutil.py:26-44`) | 三段 git 操作在**根级锁**内做(同 1),不并发于写方 |
296
+ | 9 | 纪律面:无既有登记位;L1 口径是"产物落点为只读判定" | git 目录落 `state_root`(非仓非包);并把「睡眠周期的 git 前提」登记进运维文档(§十-1) |
297
+
298
+ **已具备的保护(不冲突,可依赖)**:`_scan_nodes` 只走 `LAYERS`(`mdcg.py:1609-1612`)、`census` 只剪枝 `ARCHIVE_DIRS`(`census.py:31`)、`codeindex/docindex/refindex` 的 `SKIP_DIRS` **已含 `.git`**(`codeindex.py:28`/`:401`、`docindex.py:36`、`refindex.py:324`;注释明写"否则一次参数写错就能把版本库元数据索引进认知图")⇒ 数据根附近出现 `.git` 是**被预期过**的,不会被误索引/误当节点。
299
+
300
+ ### 4.3 仓内现成实现:`hive/wm.py` —— 照它的形态抄,不新造
301
+
302
+ `hive/wm.py` 就是"影子分支 + 自动合并"的**同构实现**,三条设计裁决都已定过:
303
+
304
+ - `cmd_snapshot`(`wm.py:116-233`):凭证闸 → 拷白名单产物 → `checkout -B task/<id>` → `add` → `commit` → `finally` 无条件 `checkout main`。
305
+ - `cmd_merge`(`wm.py:332-349`):`git merge --no-ff`,**冲突诚实报错、不自动解决**。
306
+ - `cmd_revert`(`wm.py:352-359`):`git revert`(merge commit 自动 `-m 1`),"历史不丢"。
307
+ - 既有裁决:**git 操作面只在串行主代理侧**、worker 零 git 依赖、冲突手交人工(`docs/hive/蜂巢工作记忆_项目计划.md:12-35`/`:80-85`)。
308
+
309
+ 本设计**照抄其形态**(分支 `sleep/<时间戳>`、`--no-ff`、冲突不自动解决、git 面串行),只把工作树换成数据根真源面、把"合并准入"换成 §4.2 第 7 行的语义四闸。
310
+
311
+ > 边界说明:`wm.py` 的对象是**蜂巢任务产物**(`hive/jobs/<id>`),不是认知图;其计划文档明写"工作记忆=易变层,认知图=长期层"(`docs/hive/蜂巢工作记忆_项目计划.md:42`)。本设计借的是**形态**,不是它的数据面。
312
+
313
+ ### 4.4 四阶段协议(v0.3:把 git 与语义闸串起来)
314
+
315
+ | 阶段 | 动作 | 判据 |
316
+ |---|---|---|
317
+ | **① 物化**(持根级锁) | `git worktree add`(分支 `sleep/<ts>`)→ 取真源面 → 记录**基准水位**(`_index.json` 指纹 + `_index_log` 各分片 stat + `_deletions.jsonl` 偏移) | 影子可独立开库;主库真源面**逐字节未变**(可判) |
318
+ | **② 迭代** | 在影子上跑 §3.1 的 2–7 步(归纳/升层/去污染/权重/索引重建/记录) | 影子内每步读数与台账完整 |
319
+ | **③ 对账 + 提交**(持根级锁) | 算**语义差异集** `Δ = {id → (before, after)}`,逐项过四闸:<br>· 保护闸(`protect.py` 三层;衰减须有 floor,见 §7.3)<br>· tombstone 闸(主库在迭代期间被 `forget` 的 id **不得复活**:读 `_deletions.jsonl` 增量)<br>· 并发闸(主库在迭代期间改动过的同一 id → **主库优先**,记 `conflict` 挂起)<br>· 生命周期闸(`lifecycle.can_transition`)<br>→ 通过者在影子上 `commit`(**一条睡眠周期 = 一个提交**,message 含本轮台账摘要) | Δ 为空 ⇒ 整轮跳过(零提交、零写入) |
320
+ | **④ 合并**(持根级锁) | ①语义重放 Δ 到主库(走正常写路径 + `evolution.record` 每条 before/after)→ ②`git merge --no-ff sleep/<ts>` 回 `main` | **幂等**(批次 id 落台账);**可回退**(`git revert` + 语义重放——**已裁只给 revert,§〇.3-13;不提供 `reset --hard`**);冲突项挂起并出清单 |
321
+
322
+ **为什么"语义重放"排在 `git merge` 之前**:git 是**记录者**不是**裁决者**(§4.2 第 7 行)。先过闸再重放,最后让 git 把这次变更记成历史——**"留下修改历史与最新版本"由 git 保证,"改得合法"由仓内既有闸门保证**。
323
+
324
+ ### 4.5 机械判据(新增守卫面)
325
+
326
+ - **密钥不可达**:`git --git-dir=<lib.git> log --all --name-only` 的输出中 `_keys.json` / `_access.log` / `_index.json` / `*.tmp` / `*.lock` **零命中**。
327
+ - **真源面完整**:版本库追踪集合 ⊆ 8 个 LAYERS 目录,且 ⊇ 该 8 目录下全部 `.md`。
328
+ - **历史可回**:任取一轮的**内容提交**(台账 `phases.merge.round_commit`——语义重放落主库那一刻)`git revert` 后,主库可回到该轮之前(对拍检索读数)。⚠ **不是** revert 那个 `--no-ff` 合并提交:按 §4.4 的次序(先重放、后合并),合并提交只记拓扑、其树与内容提交同,对它 `revert -m 1` 对内容零影响(git 报 nothing added to commit)。
329
+ - **合并幂等**:同一批次 id 再合并一次 = 零改动。
330
+
331
+ ### 4.6 合并要复用的既有三件套(不新造)
332
+
333
+ - **预演**:`weights.recalc(apply=False)` 先出报表 + samples(`md_cg/weights.py:472-568`)。
334
+ - **逐节点留痕**:`_maintain.jsonl` 每节点一条(`:544-549`)+ `evolution.record` 的 `pattern/missing/action/state/evidence`(`md_cg/evolution.py:2-28`)。
335
+ - **反向 apply**:`weights.rollback`(按 batch 或 entry_ids 写回 `before`,自己再记一条 `importance_rollback`,`:572-616`)。
336
+
337
+ ### 4.7 周期与睡眠时段(可由用户调整)
338
+
339
+ | env | 缺省 | 语义 |
340
+ |---|---|---|
341
+ | `MDCG_SLEEP` | `"1"`(**开**,对齐裁定"显式开启") | 睡眠周期总开关 |
342
+ | `MDCG_SLEEP_INTERVAL` | `"3600"`(秒) | 周期,**一小时一次**(裁定 1) |
343
+ | `MDCG_SLEEP_WINDOW` | `"23:00-07:00"`(**已裁**) | **睡眠时段**(本地时间);留空 = 全时段;支持跨午夜;窗口外只记账不迭代 |
344
+ | `MDCG_SLEEP_MERGE` | `"auto"`(**已裁:自动进行**) | 合并策略;`ask`/`never` 保留为可选档。**自动=自动执行四阶段**,但**冲突项仍挂起、不自动解决**(照 `wm.py` 既有裁决) |
345
+ | `MDCG_SLEEP_GITDIR` | `""` | git 目录(缺省 `state_root()/sleep/lib.git`) |
346
+ | `MDCG_SLEEP_SHADOW` | `""` | 影子工作树(缺省 `state_root()/sleep/shadow`) |
347
+ | `MDCG_SLEEP_SCRUB_APPLY` | `"0"`(**缺省关**) | 第④步「去污染实改」的闸门;关闭时只在副本上 dry_run 盘点(§3.3 的 ⚠ 档) |
348
+
349
+ **两处取值口径(P1 落地后补,与同表既有回落惯例一致)**:
350
+ - `MDCG_SLEEP_WINDOW` **留空**=全时段(唯一的显式全时段入口);**非法形态**(如 `23:00-99:99`)**回落缺省 `23:00-07:00`**——照 `INTERVAL`(非法/非正回落 3600)与 `MERGE`(越界回落 auto)的同一惯例,避免打错字变成全天迭代。
351
+ - 读取点收成**单一真源**(`sleep.SLEEP_ENV_DEFAULTS` / `SLEEP_ENV_KEYS` + 读取器族),`_start_sustain`(env 路径)与 op 路径(`sustain action=start`)共用同一组读取器,`SustainLoop.__init__` 的五个形参缺省同样回流该真源。
352
+
353
+ ---
354
+
355
+ ## 五、六要素索引(裁定 2)
356
+
357
+ > 裁定原话:「『验证方式 / 不适用条件』是赋予索引角色,**以什么方式验证,什么条件下不适用。这是需要检索的。**」
358
+
359
+ ### 5.1 把理论那张表从 4 行补成 6 行
360
+
361
+ | 要素 | 图的索引角色(理论 `智能论3.4.md:3053-3059` 原文) | 索引键(本设计) | 检索用法 |
362
+ |---|---|---|---|
363
+ | 功能名 | 条件节点(语义) | 语义符号 | 已有 |
364
+ | 生效条件 | 条件节点(when——路由门槛) | 条件词 | 已有(S2 门控) |
365
+ | 子功能 | 子功能节点(结构——可检索) | 结构词 | 已有 |
366
+ | 执行 | 执行词节点(how——机制检索) | 机制词 | 已有 |
367
+ | **验证方式**(新增) | —— | **后置条件词** | 「**是怎么验证的 / 用什么方法证明的**」——按验证手段检索 |
368
+ | **不适用条件**(新增) | —— | **拒绝域词** | 「**什么条件下不适用**」——按边界检索 |
369
+
370
+ ### 5.2 一个必须处理的既有耦合(关键约束)
371
+
372
+ 仓内检索面已有一条**负条件判据**:`md_cg/mdcg.py::judge_qualification` 会把 frontmatter 的 `non_applicable_conditions` **按空白切词、任一词命中当前情境即判 REJECT**。若把"不适用条件"同时做成**正面检索键**,两条语义会在同一个字段上打架。
373
+
374
+ **设计约束**:拒绝域命中**必须标记为"边界命中"**,与资格判定的 REJECT 分开计数、分开呈现——即:
375
+
376
+ - 检索"什么条件下不适用" → 该节点以 **`boundary_hit` 命中**(可召回、可展示);
377
+ - 该节点的**正例资格**不受影响(不因边界命中就 REJECT 它)。
378
+
379
+ 这条必须在实现前落成判据,否则会重现记忆里那次「检索面 REJECT 46→0」的返工。
380
+
381
+ ### 5.3 重建协议(四条硬约束)
382
+
383
+ 1. **幂等**:同源重建必得同一索引 ⇒ 以 `_fingerprint` 对拍。
384
+ 2. **增量优先**:指纹未变则跳过(照抄 `csre_freshness`)。
385
+ 3. **可回退**:重建只覆盖派生物,源面逐字节不变(可判)。
386
+ 4. **可对拍**:守卫断言"重建前后合法次序逐位不变"。
387
+
388
+ ### 5.4 与检索的关系(**v0.3 按裁定改向:全进默认检索**)
389
+
390
+ 裁定原话:「**全进默认检索,要做就做全。**」⇒ 六要素的 6 行索引**全部进默认检索路径**,不再走 v0.2 建议的 opt-in 新路。
391
+
392
+ **"做全"必须付的三条代价(逐条可判)**:
393
+ 1. **双侧同改**:主分数形态变化 ⇒ Python(`_score`,`md_cg/mdcg.py:3561-3581`)与 Rust(`sort_path`,`rust/src/retrieval.rs:201-220`)必须同改,并保留逐位对拍守卫(先例 `docs/eval/优化第一批…_v1.0.md:218-221`)。
394
+ 2. **published 读数会变且须披露**:README/`VERSION.json` 的公开检索数字需一并复跑与回填;变更幅度**如实披露**,不得只报新数。
395
+ 3. **§5.2 的拒绝域双语义从"应该做"升为"前置必做"**:六要素进默认检索后,`不适用条件` 会同时是"检索键"与"负条件判据"的输入——两条语义必须在同一字段上可分(`boundary_hit` vs 资格 REJECT),否则默认链路上就会出现自否定。
396
+
397
+ > 附带一条基线保护:改默认链路前先把**改动前的对照读数**落盘(仓内惯例:把改前 commit 检出到独立 worktree 跑同一守卫),否则"读数变了"无法归因。
398
+
399
+ ---
400
+
401
+ ## 六、图检索路:因果与时间(裁定 3)
402
+
403
+ ### 6.1 定位(照调研结论写)
404
+
405
+ - **理论给授权,契约给模型**:照抄 `docs/hive/检索路径与认知结构契约_v0.1.md:21-53` 的 **S3** ——「以 (S1∩S2) 命中为种子,沿 edges 双向扩散 N 跳、按跳数衰减;**不走全表**」「**不得引入未通过 S2 门控的节点**」,**默认关**。
406
+ - **不新造遍历原语**:因果链遍历**已有完整实现**(`md_cg/chain.py`,含 14 类边权、`MAX_DEPTH=5`、`decay=0.9`),直接复用;**禁止**另写一套边权表(仓内"真源唯一"纪律)。
407
+
408
+ ### 6.2 因果路(`causal`)
409
+
410
+ | 项 | 取值 | 来源 |
411
+ |---|---|---|
412
+ | 种子 | `ranked["lexical"] + ranked["entity"]`(复用既有口径)或改走 S3 口径 `(S1∩S2) 命中` | `md_cg/mdcos.py:1493`、`md_cg/mdcg.py:3482-3486` |
413
+ | 边权 | `chain.edge_weight()` = 类型 base × 边 confidence | `md_cg/chain.py:82-91`(表 `:28-47`) |
414
+ | 跳数/衰减 | `MAX_DEPTH_DEFAULT=5` / `decay=0.9` | `md_cg/chain.py:55`、`:283` |
415
+ | 打分 | `种子分 × 链累积权重 × decay^跳数` | `md_cg/chain.py:289`、`:311` |
416
+ | 融合位置 | `search_rrf` 的 `ranked` 字典,按 `w/(RRF_K+rank)` 融合 | `md_cg/mdcos.py:1481-1503`、`:1519-1525` |
417
+ | 融合口径 | 缺省 **`max`**(单路独有召回型,`sum` 会系统性低估) | 先例 `md_cg/mcp_server.py:3359-3362` |
418
+ | 默认 | **关**(显式 `paths=(...,'causal')` 才跑) | 契约 `:77`、`:115` |
419
+
420
+ **顺带可解的旧缺口**:`cg(op=causal)` 现在只能逐跳导航、**不进候选池**(`md_cg/mdcg.py` 那句「edges 一直只被写入、检索从不使用(审计偏差 1)」,现址 `:3392-3393`)。本路正是把"边的写入"接到"检索的读取"上。
421
+
422
+ ### 6.3 时间路(`temporal`)——含 **τ 口径详解**(v0.3 更正)
423
+
424
+ > **先更正**:v0.2 这里写的是 `exp(-|Δt| / τ)`。**这个写法作废。** 仓内对衰减核有明文禁令——`md_cg/whitebox_kb/aeis_core/time_core.py` 的 docstring 逐字写着:「全库一切时间演化必须经本模块。核形状唯一(指数族)……**任何在本模块之外出现的衰减核实现(`exp(-t/τ)`、`×(1-factor)`、EMA 保持率)都是 bug**——由 `tools/time_core_lint.py` 按 E5 口径机械化审计」。即 `exp(-|Δt|/τ)` 是被**点名**的违例形态;**参数应是 γ(衰减率)而不是 τ**,且必须调用该模块的函数。
425
+
426
+ **(a)τ 是什么**:它是"时间邻近度"的**时间常数**——回答"两条记忆在时间上算不算近"。数学上:`w(Δt) = e^(-γ·Δt)`,则在 Δt = 1/γ 处权重降到 1/e ≈ 0.37;若习惯用半衰期 t½,则 `γ = ln2 / t½ ≈ 0.693 / t½`。所以 τ(或其倒数 γ)是"多久算远"的刻度,**不是可随手取的常数**。
427
+
428
+ **(b)仓内已用法定形态**(`time_core.py` 三个函数,本路该用第二个):
429
+ - **`cred_factor(gamma, dt, floor=0.0, ceil=1.0) -> e^(-γ·dt)`** —— docstring 逐字:「适用于 x0=1、x_inf=0 的**新近度加权形态(如知识飞轮 recency factor)**」← **正是本路的用法**;
430
+ - `cred(x0, x_inf, gamma, dt)`:向终值回归的完整形态(本路不需要终值);
431
+ - `cred_step(x, factor)`:离散形态 `x·(1-factor)`,`γ = -ln(1-factor)` 每周期(常驻循环逐轮用它)。
432
+
433
+ **(c)γ 的取值不应自行发明——仓内已有三把尺子**(照"真源唯一"纪律,取值应锚定):
434
+
435
+ | 既有常量 | 值 | 出处 | 换算 |
436
+ |---|---|---|---|
437
+ | 无观测**半衰期**(P_trust 向初值回归) | **30 天** | `md_cg/links.py:53`(`factor = 0.5 ** (days / DECAY_DAYS)`,`:500`) | γ = ln2/30天 ≈ **0.0231 /天** |
438
+ | 「陈旧」判定(抽检口径) | 30 天 | `md_cg/scrub.py:56`(`STALE_DAYS`) | 与上者同刻度 |
439
+ | 「长期未验证」判定 | 14 天 | `md_cg/scrub.py:57`(`UNVERIFIED_DAYS`) | γ = ln2/14天 ≈ 0.0495 /天 |
440
+
441
+ ⇒ **已裁(§〇.3-12):缺省 γ = `ln2 / 30天`(半衰期 30 天)**,与 `links.py:53` 的半衰期同刻度;`UNVERIFIED_DAYS=14` 留作可选严格档(`MDCG_TEMPORAL_GAMMA` 可覆盖,见下)。
442
+
443
+ **(d)三个子决定(签收时一并定)**:
444
+ 1. **Δt 取哪一对时间**:**已裁(§〇.3-12)取 a) `created_at`**(写入时刻,最稳、主链必有);b) 双时间轴 `valid_from/valid_until`(成立时间窗,须先定"窗口 vs 时刻"的比较规则)与 c) 时空图 `temporal_coordinate`(理论字段,但 **md_cg 主链未落此字段**,见 §1.4(c))均留作后续可选档。
445
+ 2. **γ 是否可配**:**已裁(§〇.3-12)缺省 `ln2/30天`**;建议 `MDCG_TEMPORAL_GAMMA` 可覆盖,与既有 `MDCG_SPREAD_DECAY`(`md_cg/mdcg.py:3183`)同形。
446
+ 3. **平滑核 vs 硬窗口**:本路取**平滑核**(`cred_factor`);若更想要"只取 N 天内",那是**过滤**(走既有的 `validity=True` 时间过滤路径,`md_cg/mdcos.py:738`),不是本路的替代品——两者可并存。
447
+
448
+ **(e)形态与其余口径**:
449
+ - 时间天然是"1 跳",无多跳语义 ⇒ 它更像 **S4 层级激活的同类(排名项)**,而非扩散路。
450
+ - 种子不能来自词法命中(时间类问句常词面零重叠)⇒ 取**时间算子/区间命中集**(把 `stg.anchors` 的 `during/contains/overlaps/equals` 语义改成从**索引标量**直读,不再 `_scan` 全库)。
451
+ - **默认**:按裁定 9("全进默认检索")本路进默认路径;仍须满足 §5.4 的三条硬要求(双侧同改 / 披露读数 / 前置判据)。
452
+ - ⚠ **理论边界仍须标注**:理论原文的 `exp(-γ·t)`(`智能论3.4.md:2122-2125`,DEV-005)说的是 **confidence 衰减**;把它用于"时间邻近度"是**工程口径的类比迁移**,不是理论原话。实现时必须显式标注。
453
+
454
+ ### 6.4 前置(不修则会带病上线)
455
+
456
+ 1. **N137**:`_move_layer` 的 `_stage` 条目缺 `edges`/`subgraph`/双时间轴(`docs/eval/缺陷挖掘_自主迭代_v16.md:89`)⇒ 降级搬迁后新路静默拿不到边。
457
+ 2. **归并成员边读侧不可达**:若因果/结构路要含 `generalizes`/`instance_of`(`md_cg/consolidate.py:1210-1211`),必须先确认边类型覆盖面。
458
+
459
+ ---
460
+
461
+ ## 七、权重刷新与衰减(裁定 4)
462
+
463
+ > 裁定原话:「**显然是分数**,被经常调用的记忆其权重被刷新,不被调用的记忆,其权重衰减。这个也是本来就有的理论设计。」
464
+
465
+ ### 7.1 按裁定定形态
466
+
467
+ - **形态 = 分数乘子**(不是并列键):`score ← score × w_refresh(node)`,其中 `w_refresh` 由"访问刷新 + 时间衰减"合成。
468
+ - **刷新来源**:`access_count` / `last_access`(现只记账、且**不在索引条目里** — §1.5(c) 卡点)。
469
+ - **衰减核**:**必须复用** `md_cg/whitebox_kb/aeis_core/time_core.py` 的 `credit` 族(该模块 docstring 明令「任何在它之外出现的衰减核实现都是 bug」);形态与 `智能论3.4.md:2122-2125` 的 `exp(-γ·t)` 同族。
470
+ - **刷新/降权的门槛与步长**:照抄 AEIS `consolidate_cycle` 的既有取值(`rehearsal_threshold=0.7`、`degrade_threshold=0.2`、`gain=0.01`、`access_count % 10 == 0` 才 +gain),因为这些是本仓**已成文**的参数,不自行发明。
471
+
472
+ ### 7.2 实现路径(**v0.3 按裁定:进主分数**)
473
+
474
+ > 裁定原话:「**进主分数。**」⇒ 取消 v0.2 的"先新路零位移、后乘子"两段法,直接做成**主分数乘子**。
475
+
476
+ **主分数形态**:`score ← score × cred_factor(γ, Δt) × refresh(access_count, last_access)`,`refresh` 按 §7.1 的 AEIS 既有门槛与步长实现。落位取"分池权重乘数"**同一乘子位**(`md_cg/mdcg.py:3575-3577` 的 `raw = clamp(raw * pooling.weight_of(...))`)——**不新开乘子链**。
477
+
478
+ **三个卡点必须先解**:
479
+ 1. **数据可得**:把 `access_count` / `last_access`(或派生的 `refresh` 分数)**加进索引条目**(`_node_entry` 现无这两个键,`md_cg/mdcg.py:1532-1563`;先例是同为扁指标量的 `time_window`/`observation_position`,`:1572`/`:1590`)——否则检索只能读盘,违反"检索不写少读"。
480
+ 2. **双侧同改**:Python `_score`(`md_cg/mdcg.py:3561-3581`)与 Rust `sort_path`(`rust/src/retrieval.rs:201-220`)必须同改,并保留逐位对拍守卫(先例 `docs/eval/优化第一批…_v1.0.md:218-221`)。
481
+ 3. **published 读数必变且须披露**:主分数一动,README/`VERSION.json` 的公开检索数字即变——**改前基线必须先落盘**(仓内惯例:把改前 commit 检出到独立 worktree 跑同一守卫),否则"变了多少"无法归因;变更幅度**如实披露**,不得只报新数。
482
+
483
+ > 与 §5.4 的三条硬要求**是同一套**(双侧同改 / 披露读数 / 前置判据),两处改动应**同批**做、共用一套对拍守卫。
484
+
485
+ ### 7.3 必须补的第二道闸(移植隐患)
486
+
487
+ AEIS 的 `decay_cycle` **没有 floor**,而 md_cg 的保护判定是**即时读 `importance ≥ 0.70`**(`md_cg/protect.py:135-151`)⇒ **衰减穿过 0.70 会让节点自动失去保护**。移植时必须:
488
+
489
+ - 给衰减项加 **floor**(照 `md_cg/weights.py:459` 的 `IMPORTANCE_PROTECT=0.70` 用法);
490
+ - 保留 `weights.recalc` 已有的"`after ≥ 0.70` 自动补写 `protected`"(`:531-534`)行为;
491
+ - 记忆里那条语义边界:**不可遗忘 ≠ 不可覆盖**,衰减属"降级/搬迁"族,须走 `guard_move` 语义(`md_cg/protect.py:272-282`),且"降级不得误实现为删除记录"。
492
+
493
+ ### 7.4 回滚与预演(照既有三件套)
494
+
495
+ `weights.recalc(apply=False)` 预演 → `_maintain.jsonl` 逐节点 before/after → `weights.rollback` 反向 apply。**衰减/刷新机制必须自带同款三件套**(AEIS 侧没有预演/回滚,这是移植时的净增工作量)。
496
+
497
+ ---
498
+
499
+ ## 八、前置硬化(P0:不做就不能开闸)
500
+
501
+ | # | 项 | 判据 |
502
+ |---|---|---|
503
+ | 1 | **根级锁 + 影子工作树 + 独立 git 目录**(§四)——影子同时是"跨进程无互斥"的结构性绕开;**git 操作必须串行且持根级锁**(否则 Windows 上 `os.replace` 与 git 索引互造 `PermissionError`,§4.2-8) | 迭代期间主库真源面逐字节不变;git 历史里 `_keys.json`/`*.tmp`/`*.lock` **零命中**;两进程同时触发睡眠只有一个拿到锁 |
504
+ | 2 | **两入口缺省收口**(`mcp_server.py:1639` vs `:3595`) | 同一 `(root,name)` 两入口得到同一组 auto_* 取值 |
505
+ | 3 | **N230 `_dirty` 重放遮蔽**(未修) | 合并阶段会跨进程写主库 ⇒ 开闸前必须先修,否则"旧盖新"会被合并放大 |
506
+ | 4 | **拒绝域双语义判据**(§5.2) | `boundary_hit` 与资格 REJECT 分开计数 |
507
+
508
+ ---
509
+
510
+ ## 九、分期与验收判据
511
+
512
+ | 期 | 内容 | 验收读数 |
513
+ |---|---|---|
514
+ | **P0** | 前置硬化 4 项 | 影子可物化/可独立开库、主库真源面逐字节不变;两入口缺省逐项一致;N230 守卫红→绿;拒绝域双语义判据在位 |
515
+ | **P1** | 周期引擎步骤显式化 + **副本迭代 + git 周期合并**(`auto` 自动进行) | 每轮一个提交(历史可查);候选数 0 即跳过;语义差异集可出;合并幂等且 `git revert` 可回;冲突项挂起并出清单 |
516
+ | **P2** | **六要素 6 行索引角色**(**全进默认检索**) | 重建幂等对拍逐字节;「什么条件下不适用」类查询能召回且标 `boundary_hit`;双侧对拍逐位一致;published 读数变更已披露 |
517
+ | **P3** | **图检索路** `causal` / `temporal`(**进默认检索**) | S3 契约六项不变量逐条满足;`temporal` 的核走 `time_core.cred_factor`(γ 取 `ln2/30天`);双侧对拍逐位一致 |
518
+ | **P4** | **权重刷新/衰减**(**进主分数**) | 乘子落位与分池权重同一位;`access_count`/`last_access` 已入索引条目;双侧对拍逐位一致 + 披露读数变化;治理前后数字(补 `缺口矩阵 #27`) |
519
+ | **P5** | 方向性自检(八步第 8 步)与反馈环 | 每 N 轮自检记录;"预测误差→模型更新"那一环有可判读数 |
520
+
521
+ **发版挂载**:**0.7.0 承载 P0–P4**(自迭代与睡眠的功能面)+ 出稿前的累积缺陷修复;P5 视进度并入或顺延。发版前三关:`npm run gate` 九条腿全绿 → Linux 容器双栈实测 → E 盘空文件夹沙箱模拟新用户安装成功(**三关过后才发布**)。
522
+
523
+ ---
524
+
525
+ ## 十、待裁定项
526
+
527
+ **已裁(第一轮)**:①副本迭代 + 周期合并 ②六要素补 2 行索引角色 ③因果/时间是图检索路 ④权重是分数 ⑤`bootstrap_loop` 只登记不改 ⑥出设计稿。
528
+ **已裁(第二轮,v0.3)**:⑦**合并沿用 git、自动进行**,且要留修改历史与最新版本 ⑧窗口 `23:00-07:00` ⑨六要素**全进默认检索** ⑩权重**进主分数** ⑪τ 口径(§6.3 已答,**并更正了 v0.2 的错式**)。
529
+ **已裁(第三轮,v0.4 · 规格冻结)**:⑫**γ = ln2/30天、Δt 用 `created_at`** ⑬**回滚只给 `revert`** ⑭**git 运维前提登记进对外文档** ⑮**基线落盘照仓内惯例**。
530
+
531
+ **已裁(P1 落地后补 · 编排侧按既有惯例裁定)**:⑯**回退目标是该轮的「内容提交」(`round_commit`)**,不是拓扑用的合并提交(§4.5 已注明);⑰**窗口值非法形态回落缺省 `23:00-07:00`**(照同表 `INTERVAL`/`MERGE` 的回落惯例;「留空=全时段」仍是唯一的显式全时段入口);⑱**第④步实改闸门登记为第七个 env `MDCG_SLEEP_SCRUB_APPLY`(缺省 0)**,「合并前人工可复核」在缺省配置下由「该档缺省关 + `MDCG_SLEEP_MERGE=ask`」共同满足(§3.3 已注明)。
532
+
533
+ **发版口径(第三轮同批)**:本线实现随 **0.7.0** 出货;测评面 = `D:\1_ai\membench\dist\因果分析基准_v1.0`(因果分析基准:语料 23 章 + 主轮 92 题 + 干预轮;判分包 `sut.py`/`judge.py`/`semantic.py`/`score_sut.py`)。**检索能力已全面占优,本版针对因果推理栏。**
534
+
535
+ **(此前待签收项现全部关闭)**:1 γ/Δt → ⑫;2 回滚方式 → ⑬;3 git 运维前提入库 → ⑭;4 基线落盘 → ⑮;5 版本节奏 → 本件升版为 v0.4(文件名同步为 `_v0.4.md`,历史由 git 保留)。
536
+
537
+ ---
538
+
539
+ ## 十一、不做的事
540
+
541
+ - 不改 `forget` 的软删语义与「遗忘只由显式发起」的承诺。
542
+ - 不把 LLM 依赖动作自动化。
543
+ - 不引入语义向量检索(守"零重依赖")。
544
+ - **本轮不动 `bootstrap_loop` 写入面**(裁定 5:先调研、当前不改)。
545
+ - 不在本件动任何代码;不在本件动在役记忆库与在役 serve。
546
+ - 不把 `BLINDSPOT` 混进索引轴。
547
+ - 不新造衰减核、不新造边权表(复用 `time_core.py` 与 `chain.EDGE_WEIGHTS`)。