@furongjun1999/dsh-memory 0.5.0 → 0.5.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 (138) hide show
  1. package/README.md +552 -465
  2. package/docs/README.md +1 -0
  3. package/docs/eval/bench_lingshu_self/bench_self.py +140 -0
  4. package/docs/eval/bench_lingshu_self/self_bench_result.json +404 -0
  5. package/docs/eval/bench_lingshu_self//347/201/265/346/236/242/350/207/252/345/272/223/347/253/257/345/210/260/347/253/257/346/243/200/347/264/242/345/256/236/346/265/213_v1.0.md +38 -0
  6. package/docs/eval//344/270/215/345/217/257/351/235/240/346/200/247/350/220/275/345/234/260_P0_v1.0.md +185 -0
  7. package/docs/eval//346/225/205/351/232/234/346/263/250/345/205/245/345/256/236/346/265/213_v1.0.md +422 -0
  8. 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 +100 -0
  9. 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 +197 -0
  10. 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_v1.md +156 -0
  11. 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_v10.md +210 -0
  12. 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_v11.md +227 -0
  13. 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_v12.md +203 -0
  14. 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_v13.md +233 -0
  15. 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_v14.md +191 -0
  16. 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_v15.md +213 -0
  17. 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_v16.md +214 -0
  18. 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_v17.md +199 -0
  19. 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_v2.md +156 -0
  20. 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_v3.md +152 -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_v4.md +128 -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_v5.md +114 -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_v6.md +192 -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_v7.md +187 -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_v8.md +207 -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_v9.md +203 -0
  27. package/docs/hive//345/256/211/345/205/250/345/256/241/350/256/241/345/256/236/351/224/232_v0.1.md +202 -0
  28. 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 +19 -3
  29. package/docs/images/lingshu-moonlight-covenant-poster-preview.jpg +0 -0
  30. package/docs/images/lingshu-moonlight-covenant-poster.png +0 -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/theory//344/270/215/345/217/257/351/235/240/345/256/232/347/220/206/344/270/216/345/244/261/346/225/210/344/274/230/345/205/210/346/241/206/346/236/266_v0.3.md +365 -0
  33. package/docs//344/270/215/345/217/257/351/235/240/346/200/247/347/220/206/350/256/272_v0.1.md +343 -0
  34. package/lib/bridge.d.ts +9 -0
  35. package/lib/bridge.js +35 -0
  36. package/lib/index.js +7 -1
  37. package/lib/lib/roleplay_web.js +530 -443
  38. package/lib/lib/token_store.d.ts +7 -1
  39. package/lib/lib/token_store.js +12 -3
  40. package/md_cg/audit.py +12 -1
  41. package/md_cg/backfill.py +16 -15
  42. package/md_cg/backfill_bucket_zh.py +35 -0
  43. package/md_cg/bench_e2e_judge.py +532 -0
  44. package/md_cg/bench_e2e_locomo_qa.py +368 -0
  45. package/md_cg/bench_e2e_qa.py +256 -0
  46. package/md_cg/branches.py +18 -2
  47. package/md_cg/ccgc.py +3 -2
  48. package/md_cg/chain.py +19 -4
  49. package/md_cg/consolidate.py +7 -6
  50. package/md_cg/crosscheck.py +4 -3
  51. package/md_cg/crypto.py +439 -437
  52. package/md_cg/datapath.py +395 -335
  53. package/md_cg/evidence.py +582 -580
  54. package/md_cg/export.py +3 -1
  55. package/md_cg/forgetting.py +2 -2
  56. package/md_cg/fsutil.py +48 -0
  57. package/md_cg/hotcache.py +255 -238
  58. package/md_cg/interop.py +161 -22
  59. package/md_cg/judgment_manifest.py +177 -0
  60. package/md_cg/links.py +655 -622
  61. package/md_cg/mcp_server.py +280 -29
  62. package/md_cg/mdcg.py +616 -125
  63. package/md_cg/mdcos.py +430 -66
  64. package/md_cg/mreview/govern.py +5 -4
  65. package/md_cg/postings.py +4 -2
  66. package/md_cg/readcache.py +76 -18
  67. package/md_cg/reconcile.py +228 -0
  68. package/md_cg/review_cli.py +170 -0
  69. package/md_cg/routing.py +28 -0
  70. package/md_cg/run_tests.py +211 -0
  71. package/md_cg/scrub.py +862 -852
  72. package/md_cg/security.py +385 -275
  73. package/md_cg/selfreport.py +3 -2
  74. package/md_cg/signer.py +565 -562
  75. package/md_cg/sources.py +3 -2
  76. package/md_cg/stg.py +6 -0
  77. package/md_cg/sustain.py +1168 -1138
  78. package/md_cg/test_access_hints.py +147 -0
  79. package/md_cg/test_branch_discard_tombstone.py +136 -0
  80. package/md_cg/test_branches.py +259 -249
  81. package/md_cg/test_chain_read_isolate.py +168 -0
  82. package/md_cg/test_datapath_device_name.py +203 -0
  83. package/md_cg/test_emit_negtail_cache.py +156 -0
  84. package/md_cg/test_en_pipeline.py +186 -166
  85. package/md_cg/test_govern_directread.py +421 -0
  86. package/md_cg/test_i32_hotcache_env_key.py +218 -0
  87. package/md_cg/test_identity_attribution.py +228 -147
  88. package/md_cg/test_index_durability.py +238 -224
  89. package/md_cg/test_interop.py +4 -2
  90. package/md_cg/test_interop_judgment.py +228 -0
  91. package/md_cg/test_issue39_utf8_stdio.py +273 -0
  92. package/md_cg/test_links_concurrent_write.py +188 -0
  93. package/md_cg/test_merge_upsert.py +168 -0
  94. package/md_cg/test_n123_derive_expiry_chain.py +205 -0
  95. package/md_cg/test_n130_verify_falsified_protect.py +185 -0
  96. package/md_cg/test_n131_merge_gate.py +205 -0
  97. package/md_cg/test_p1x_ref_root.py +160 -0
  98. package/md_cg/test_p27_docindex.py +774 -765
  99. package/md_cg/test_p2_mcp.py +3 -0
  100. package/md_cg/test_p32_backfill.py +304 -298
  101. package/md_cg/test_p39_verify_flow.py +90 -50
  102. package/md_cg/test_p47_session_view.py +60 -25
  103. package/md_cg/test_propose_tail_index.py +157 -0
  104. package/md_cg/test_read_scope_b27.py +277 -0
  105. package/md_cg/test_readcache_default_on.py +168 -0
  106. package/md_cg/test_readcache_precise_inval.py +270 -0
  107. package/md_cg/test_readcache_prodpath.py +55 -7
  108. package/md_cg/test_reconcile_v0.py +294 -0
  109. package/md_cg/test_retr_s1.py +6 -2
  110. package/md_cg/test_retr_s1b.py +67 -0
  111. package/md_cg/test_retr_s7.py +8 -0
  112. package/md_cg/test_retr_s9_entity_ctx.py +181 -175
  113. package/md_cg/test_retr_score_once.py +208 -0
  114. package/md_cg/test_review_onepass.py +170 -0
  115. package/md_cg/test_rrf_graph_seed_cache.py +154 -0
  116. package/md_cg/test_security_audit.py +155 -0
  117. package/md_cg/test_security_audit_b26.py +161 -0
  118. package/md_cg/test_security_audit_v21.py +250 -0
  119. package/md_cg/test_semantic_canonical.py +255 -241
  120. package/md_cg/test_session_isolation.py +168 -0
  121. package/md_cg/test_snapshot_autoclose.py +187 -0
  122. package/md_cg/test_tail_watermark_race.py +208 -0
  123. package/md_cg/test_tenant_env_override_warn.py +139 -0
  124. package/md_cg/test_tenant_registry_corrupt_warn.py +151 -0
  125. package/md_cg/test_v14_fixes.py +415 -397
  126. package/md_cg/test_verify_dirty_reconcile.py +157 -0
  127. package/md_cg/theory.py +276 -273
  128. package/md_cg/tokens.py +734 -677
  129. package/md_cg/units.py +3 -2
  130. package/md_cg/vision_evidence.py +4 -3
  131. package/md_cg/whitebox_kb/wisdom/code_solidified.json +6195 -6195
  132. package/md_cg/whitebox_kb/wisdom/multilang_ir.py +128 -124
  133. package/md_cg/writepipe.py +554 -550
  134. package/package.json +6 -2
  135. package/src/bridge.ts +434 -401
  136. package/src/index.ts +526 -518
  137. package/src/lib/roleplay_web.ts +1019 -932
  138. package/src/lib/token_store.ts +202 -192
@@ -0,0 +1,202 @@
1
+ # 安全审计实锚记录 v0.1
2
+
3
+ 外部审查报告(33 项)的逐项处置实锚。报告原文未随仓库分发,本文档是
4
+ **处置状态真源**:每项记「实锚证据 → 裁定 → 载体」。
5
+
6
+ ## 已修复(批次 24,提交 2a57c2a)
7
+
8
+ | 项 | 处置 | 载体 |
9
+ |---|---|---|
10
+ | P0-1 node_id 任意文件写入 | 三层纵深:白名单 + realpath 纵深闸 + schema pattern | `md_cg/mdcg.py` `_NODE_ID_RE`、`md_cg/mcp_server.py` |
11
+ | P1-1 mdcg_* 绕过 ops_allow | `_MDCG_OP_REQUIRE` 映射 + `_dispatch` 单点闸 + 完备性守卫 | 同上;守卫 `test_security_audit.py` 13 项 |
12
+ | P2-1 负记忆死调用双倍 IO | 删除死调用 + 注释改写 | `md_cg/mdcg.py` |
13
+ | P1-8 tarfile 解包越界 | `extractall(..., filter="data")` | `scripts/criteria_fingerprint.py` |
14
+
15
+ 字符集裁定(偏离报告建议的理由):白名单**不含冒号**——NTFS 文件名 `:` 是
16
+ 备用数据流(ADS)分隔符,`a:b.md` 实际写 `a` 主文件错位,Windows 硬约束;
17
+ **含 `@`**——无路径语义且存量在用(`mem_a@exp1` 形态)。
18
+
19
+ ## 本批实锚(批次 25)
20
+
21
+ ### P1-6 read_file 收敛 —— 部分分歧 + 增量已修(批次 26)
22
+
23
+ 实锚:`hive/exec.py` `tool_read_file` 已有 **`HIVE_READ_ROOTS`** 白名单机制
24
+ (`read_roots()` + `_under()` 前缀判定,越界即拒),默认放开是
25
+ **2026-09-19 使用者裁定**(docstring 留痕)。
26
+
27
+ **批次 25 裁定勘误**:本文件曾据此判「已闭环」——报告原文到手后确认报告
28
+ **明确建议默认收敛到 workdir**,与 2026-09-19 裁定构成真实分歧,不是闭环。
29
+ 处置(批次 26):默认放开维持使用者裁定不动;采纳报告建议 3 的增量——
30
+ **敏感凭据路径拒读**(`_sensitive_read`:SSH 私钥/云凭据/浏览器 Cookie/
31
+ dot-env/密钥扩展,内容回喂外部 LLM 网关前拦截),不受根白名单配置影响。
32
+ 分歧余项(默认是否收敛)留使用者决策。
33
+
34
+ ### P1-7 自举循环 exec —— 批次 25 实锚错误,批次 26 已修
35
+
36
+ **批次 25 裁定勘误**:曾把本项错锚到 hive 执行器并判「不适用」——报告原文
37
+ 确认真实载体是 `scripts/bootstrap_loop.py:228`:`exec(compile(code, ...), ns)`
38
+ 的 `code` 来自 LLM 返回 / `channel_b_queue.json`(模型可控输入),未沙箱。
39
+
40
+ 处置(批次 26):`_safe_exec_gen` AST denylist 沙箱——禁 import 面、危险
41
+ 内建名(eval/exec/compile/open/__import__/反射面)、dunder 属性逃逸链;
42
+ 命名空间 `__builtins__` 收窄到纯计算内建(双层防御)。自举循环的合法产出
43
+ (排序/查找类纯函数)不受影响,冒烟 10 恶意样本全拒。
44
+
45
+ ### P1-2 / P1-3 / P1-4 / P1-5 —— 报告原文到手后批次 26 已修
46
+
47
+ 批次 25 曾判「待报告原文」(记忆载体落空)——使用者提供原文
48
+ (`D:\program\dsh-memory-代码审查报告.md`)后对齐施工:
49
+
50
+ - **P1-2** `src/lib/roleplay_web.ts` `requireEditKey` **fail-closed**:未配置
51
+ `ROLEPLAY_EDIT_KEY` → 写操作一律 403(`editKeyHint()` 引导配置)。此前
52
+ 「未配置=开放」的 README 如实化被报告正确指出不够——网页面板是唯一
53
+ 浏览器开放面,默认必须关。
54
+ - **P1-3** 原型污染:角色 id 白名单 `validRoleId`(`^[A-Za-z0-9_.-]{1,64}$`
55
+ + 显式拒 `__proto__`/`constructor`/`prototype`)+ meta 字典统一 **null
56
+ 原型**(`toNullProto`——存量文件已含危险键也只是普通 own 属性)+
57
+ `/meta` 与 `setTranslations` 入口校验。
58
+ - **P1-4** 路径根白名单 `check_path_root`(`md_cg/security.py`):ingest /
59
+ export / link(export/import) / mdcg_ingest 五处接线;
60
+ `MDCG_INGEST_ROOT` / `MDCG_EXPORT_ROOT` **设置即 fail-closed**、未设置
61
+ 保持现状(与 HIVE_READ_ROOTS 同构的部署开关语义);`mdcg_ingest` 的
62
+ 权限闸已由批次 24 `_MDCG_OP_REQUIRE`(write)补上。
63
+ - **P1-5** `MDCG_LEGACY_ENV_AUTH` 身份不再能自授 admin:需
64
+ `MDCG_LEGACY_ENV_ADMIN=1` **显式二次开关**,只设 `MDCG_CAN_ADMIN` 时
65
+ 降级 recorder + stderr 提示(不静默)。
66
+
67
+ ### P0-1 同类残留扫 —— 清零确认
68
+
69
+ 对 `mdcg.py` / `mcp_server.py` / `mdcos.py` 全部 `os.path.join` 面(49 处)
70
+ 逐点核查:外部可控输入**仅 node_id 一处**(已三层闸);其余均为内部常量
71
+ 构造(`_index.json` / `_audit.jsonl` / 分片名 `%06d` 格式化串)或只读探测
72
+ (sessions 目录 `os.listdir` 枚举名 + `isdir` 探测,不落盘)。
73
+
74
+ ## 读权限分级(批次 27,使用者需求落地;表述经使用者 2026-09-24 澄清)
75
+
76
+ **private 的体系语义正名**:private ≠ 个人隐私保密,而是**错误处置标记**——
77
+ 工作区内容因错误相关、验证未过、待排查而被标记私有,目的是限制向平级/
78
+ 下级扩散。可见性是**故意的冲突设计**:平级/下级限读,但错误处置链路
79
+ (**设计者、上级节点、验证单元**)必须可读。缺口已于批次 28 按使用者裁定
80
+ **分型治本**:新增 `restricted` 档(阶梯
81
+ public<internal<**restricted**<private<secret),错误处置标记用 restricted
82
+ ——可见性按**错误处置链路角色集**(designer/orchestr/verify,或
83
+ can_admin)判定而非纯 rank;**不加密**(不在 ENCRYPTED_LEVELS——链路要
84
+ 明文读)。private 回归纯隐私/会话绑定语义(加密、仅归属会话+设计者
85
+ 豁免);verify 的初版 cap=private 豁免被分型取代、回滚 internal——
86
+ 验证单元不读真隐私。
87
+
88
+ **新发现——信封加密的第二层墙(批次 28 实验实锤)**:private/secret 节点
89
+ 落盘即加密(encrypted_levels),provision_dek 为每个 actor 发独立 DEK、
90
+ 节点用**写入者 DEK** 加密——跨 actor 读取解密失败静默空(实验:另一
91
+ designer 读 seed 的 private 节点亦空)。即 cap 豁免只过密级闸,跨 actor
92
+ 的 private 实际可读还需 **DEK 共享机制**,三选项待裁定:①DEK 信封共享
93
+ (写者 DEK 用读者身份再包信封——改 seal/envelope 结构);②设计者代查
94
+ 通道(designer 解密后受控转述);③private 分型(错误标记 vs 隐私加密
95
+ 拆开)。不在本批擅自改加密结构。
96
+
97
+ | 身份 | 文件读面(read_file) | 认知图读面(lingshu_cg read) |
98
+ |---|---|---|
99
+ | 设计者/主代理 | 全路径(2026-09-19 裁定)+ 部署可选 `HIVE_READ_ROOTS`;文本内容过 **PII 脱敏**(跳过个人敏感信息不入明文) | 其密级上限内全量(designer=secret:public/internal/private) |
100
+ | 子代理(worker) | **fail-closed 白名单**:工作区(job_dir)+ 定制工作目录(`spec.workdir`)+ 额外定制目录(`spec.read_roots`,新增)——其他会话/越界拒读;无根即无文件读权限 | 默认密级 **internal**(原 secret 降级):可读 public/internal,**错误处置标记(private)与 secret 拒读**——平级不消费未证实/已知有误内容 |
101
+
102
+ 实现:`hive/exec.py` `_worker_scope`/`tool_read_file(scope_roots=)`/`_redact_pii`
103
+ (邮箱/手机号/身份证/私钥块/API key 样式;正则脱敏是概率防线,新增类别在
104
+ `_PII_PATTERNS` 扩展)。编排器派生令牌(`_PRINCIPAL_FACTORY`)身份由调用方
105
+ 给定,不受默认密级影响。
106
+
107
+ ## 剩余项总览
108
+
109
+ - **P1 面已全清**(P1-1/2/3/4/5/6增量/7/8);
110
+ - P1-6 余项分歧:读默认是否从「放开」收敛到 workdir——留使用者决策
111
+ (2026-09-19 裁定 vs 报告建议,增量黑名单已先行);
112
+ - P2 剩余 13 项(性能 9 + 安全/健壮性 4,P2-1 已修):按报告优先序渐进;
113
+ - 部署建议:生产设 `HIVE_READ_ROOTS` / `MDCG_INGEST_ROOT` /
114
+ `MDCG_EXPORT_ROOT`(三组根开关的消费侧)。
115
+
116
+
117
+ ## P2-14 根源分析(批次 32,使用者要求查明根源)
118
+
119
+ **堆积链路**:新版 Windows 移除 wmic.exe → ind_bootstrap_procs 的
120
+ subprocess 抛 FileNotFoundError → except: pass 吞掉返回 [] → main
121
+ 停转分支把 [] 解读为「确认无进程」→ **不 kill 旧 loop 直接 restart** →
122
+ 每轮叠加一个新进程(堆积)。
123
+
124
+ **三层根源**:
125
+ 1. 组件层:wmic 已从新版 Windows 移除(本机实测 wmic.exe 存在且可运行
126
+ ——堆积在本机未发生;风险面向新部署);
127
+ 2. **语义层(真根因)**:探测失败(未知)被压平为「确认无进程」——
128
+ fail-open 的错误处理。修复 = 三态探测:成功返回 list / 失败返回
129
+ **None(未知)**,调用方对 None 跳过 kill/restart(fail-safe:不确定
130
+ 就不动);
131
+ 3. 历史层(实证):watchdog 日志 1316 条 100% 是 no_log——
132
+ ind_bootstrap_procs 在本机历史中从未执行过(bootstrap_log.jsonl
133
+ 不存在,no_log 分支短路),堆积从未发生。
134
+
135
+ **报告断言修正**:①「taskkill 模糊匹配误杀」不成立——kill_procs 是
136
+ /PID 精确击杀,find 的行过滤也必须含 bootstrap_loop.py;②「判活恒失败」
137
+ 在 wmic 存在的机器不成立(no_log 短路根本不进判活)。
138
+
139
+ **修复落地(批次 32)**:find_bootstrap_procs 升级 CIM 枚举
140
+ (Get-CimInstance+CSV,wmic 依赖消除)+ 三态返回(None=探测未知);
141
+ main 两个分支(degraded/停转)对 None 一律跳过 kill/restart、状态记
142
+ probe_unknown。行为验证:CIM 实测 [](当前无 loop 进程)、枚举故障
143
+ mock → None。顺带发现:loop 未部署的机器上 watchdog 每 10 分钟刷一条
144
+ no_log 噪声日志(1316 条)——调度侧应停用未部署机器的 watchdog 任务。
145
+
146
+
147
+ ## P2 面清账终态(批次 30/31/32 + 本批裁定,33 项报告收官)
148
+
149
+ P2 共 24 项,终态:**23 项修复/闭环 + 1 项裁定保留**。
150
+
151
+ | 项 | 终态 | 批次 |
152
+ |---|---|---|
153
+ | P2-1 死调用 | 修 | 24 |
154
+ | P2-2 检索双遍历 / P2-3 残留拷贝 / P2-4 重复打分 | 修(单遍双收集/回写自愈/pre_scored) | 31 |
155
+ | P2-5 候选无缓存 | 闭环(批次 21 readcache 先于报告) | 21 |
156
+ | P2-6~8 budget/列目录/context | 修(增量/先截断/读前查大小) | 31 |
157
+ | P2-9~11 transcript/原子写/meta 锁 | 修(尾 500 条/tmp+rename/同步段注记) | 31 |
158
+ | P2-12 UTF-8 截断 / P2-13 日志轮转 / P2-14 watchdog | 修(Buffer/轮转/根源修复三态+CIM) | 31/32 |
159
+ | P2-15~20 安壮面 | 修(fd/timeout/resp 上限/test_cmd env 化/验证器白名单/读路径单点收拢) | 30 |
160
+ | P2-22 schema 薄 | 示范点渐进(node_id pattern 等) | 24/30 |
161
+ | P2-23 role_id 白名单 / P2-24 笔误 | 修 | 30 |
162
+ | **P2-21 自研 ChaCha20-Poly1305** | **裁定保留(本批)** | — |
163
+
164
+ **P2-21 裁定记录**:报告建议长期换 cryptography 库,使用者裁定
165
+ **不引入第三方依赖**——保留自研实现。依据:报告自标「未见弱密钥或时序
166
+ 侧信道」;实现与 RFC 8439 逐段核查一致;仓库测试面(test_p13_encryption)
167
+ 覆盖正确性。残余风险如实登记:自研密码学无第三方审计背书,后续若引入
168
+ 依赖管理体系可重议。
169
+
170
+ **P2-13 PS 侧校正**:报告称 dsh-watchdog.ps1「日志追加无轮转」——实锚
171
+ 现状为**时间戳分片**(每次运行生成 dsh-\.out.log 新文件),天然无追加
172
+ 无轮转需求,主张与现状不符(登记不改)。观察项(报告未提):时间戳分片
173
+ 无限累积,可考虑启动时清理 30 天前旧分片(低优先级,未施工)。
174
+
175
+
176
+ ## V21 缺陷挖掘报告处置(批次 34/35,提交 1fd4b36+)
177
+
178
+ 第 21 轮对抗式缺陷挖掘(对象 00a2c70b)8 项全修:4 P0 + 4 P1。
179
+
180
+ | 项 | 级别 | 归属 | 处置 |
181
+ |---|---|---|---|
182
+ | V21-1 editKeyHint 无限自递归 | P0 | 批次 26 引入 | 两分支终止文案;附带修 verify_web mock 缺 ctx.get(空跑) |
183
+ | V21-2 _readable 密级回填 fail-open | P0 | 历史遗留 | 密级未知按最高档 secret(fail-closed) |
184
+ | V21-3 _NODE_ID_RE 只允许 ASCII | P0 | 批次 24 引入 | 放行中文+逗号;5 官方红同源转绿;P0-1 防线不变 |
185
+ | V21-4 run_channel_b 主体被掏空 | P0 | 批次 26 插入错位 | 沙箱段归位模块级,主体恢复 |
186
+ | V21-5 P2-3 回写永久 no-op | P1 | 批次 31 引入 | 就地剥离自愈(s1 断言随语义翻转) |
187
+ | V21-6 P2-4 不可哈希死代码 | P1 | 批次 31 引入 | doc_key[0] 取 node_id 作键 |
188
+ | V21-7 lingshu_cg 不过 PII 脱敏 | P1 | 批次 27 缺口 | _redact_deep 递归脱敏统一接线 |
189
+ | V21-8 _sensitive_read 改名即免检 | P1 | 批次 26 增量的界 | 族匹配(id_* 前缀/credential 子串/.env 后缀) |
190
+
191
+ 流程项落地:
192
+ - **check_unreachable.py** 进 gate 首位——AST 判终止语句后同块后继,
193
+ 一次拦住 s5(批次 33)与 V21-4 同族缺陷;反向样例验证两形态命中;
194
+ - **run_channel_b 全链路冒烟**并入 V21-4 守卫(队列→沙箱→verifier→
195
+ verified_units/队列回写/rejected_log 五断言)——首跑即暴露两个潜伏
196
+ 缺陷:verified 初始化空串(文件不存在时 TypeError)与前置拒绝路径
197
+ 不标 status(卡队列,与 2026-08-28 同型)——无测试覆盖模块的静默
198
+ 潜伏实证,已修。
199
+
200
+ 基线对照(报告第五节):旧 5 红(branches/en_pipeline/identity_attribution/
201
+ p32_backfill/semantic_canonical)与新 5 红(V21-3 同源)**全部清零**
202
+ (批次 34/35 实测:37 套 + en_pipeline 48 + semantic_canonical 33 全绿)。
@@ -326,18 +326,34 @@
326
326
  {
327
327
  "iter_id": "…",
328
328
  "verifier_instance": "verifier",
329
- "verifier_fingerprint": "<验证者二进制指纹>",
329
+ "verifier_fingerprint": "<验证者二进制指纹(12-64 位十六进制)>",
330
330
  "subject_instance": "main",
331
- "subject_fingerprint": "<候选二进制指纹>",
331
+ "subject_fingerprint": "<候选二进制指纹(自报值,形状受检,见下)>",
332
332
  "suite_origin": "<测试套件来源——必须是验证者自己的 worktree>",
333
333
  "frozen_at": "<本轮冻结时刻>",
334
334
  "verdict": "pass | fail",
335
335
  "passed": 0,
336
336
  "failed": 0,
337
- "details": []
337
+ "details": [],
338
+ "valid": false,
339
+ "assertions_ok": false,
340
+ "failure_reason": "suite_failed | assertions_failed | both | null"
338
341
  }
339
342
  ```
340
343
 
344
+ **字段语义(issue #37 定稿,2026-09-24)**:
345
+
346
+ | 字段 | 语义 |
347
+ |---|---|
348
+ | `valid` | **单一放行位** = 断言 AND 套件皆过(与 `verdict=="pass"` 同义)。旧语义「仅三断言」已废——实测中「套件全挂(编译失败)而 valid=true」的形态极易被误读为放行 |
349
+ | `assertions_ok` | 断言面(A1/A2/A3 是否成立)——承接旧 `valid` 的语义,供归因 |
350
+ | `failure_reason` | 失败成因枚举(`suite_failed` / `assertions_failed` / `both` / null)——「为什么失败」是结构化事实,不需消费方解析 `details` |
351
+ | `subject_fingerprint` | **self-reported**:由派发方经 `spec.env` 自报、A2 不核验其真伪(A2 为辅助断言——§7.5:A1/A2 起两进程即自动成立;防线在 A3 冻结值)。形状须为 12-64 位十六进制 |
352
+
353
+ **双门禁(落盘前)**:`sanity_check_verdict`(脱敏黑名单:盘符/UNC/unix 家目录/~/$HOME/密钥形态 ghp_·AIza·AKIA·xox/Bearer/prompt·content 文本形态)+ `shape_check_verdict`(形状白名单:顶层字段集 ⊆ 契约集、指纹形状、枚举、非负整数计数)。
354
+
355
+ **机械消费方(issue #37 J4 落地)**:`scripts/interop_gate.py`——合并/收尾流程在动 `task/<iter_id>` 分支前调用:exit 0=放行(pass+valid)、1=拒绝(fail)、2=未互验(fail-closed)、3=产物形状非法(拒绝猜测)。§7.4 第 7 步「verdict=pass → 合并」由此获得机械强制。
356
+
341
357
  **留痕位置(已裁定)**:**入库并同步 GitHub 仓库**——互验产物是本机制的**标准功能产物**,
342
358
  随仓版本控制、随 `push` 上 GitHub,公开可复核。
343
359
 
@@ -41,42 +41,42 @@ MCP stdio:md_cg/mcp_server.py
41
41
 
42
42
  | 功能 | 显式调用 | 代码位置(点击直达源码行) |
43
43
  |---|---|---|
44
- | 按需披露(投影后完整工具 / 参数文档即时取回) | `cg(op=help)` | [`help`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1934) → [`_help_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1853) |
45
- | 验证态 / 双时间轴 / 履历(含冷路径队列;只读) | `cg(op=status)` | [`status`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1940) → [`_status_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1768) |
46
- | 三元组反查(派生边任意端 / 谓词 / 时间反查;只读) | `cg(op=edges)` | [`edges`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1943) → [`_edges_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1824) |
47
- | 理论检索(领域理论 / 方法论文) | `cg(op=theory)` | [`theory`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1946) → [`theory`](../../md_cg/theory.py) |
48
- | 记忆互链(节点间链接管理) | `cg(op=link)` | [`link`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1963) → [`evidence`](../../md_cg/evidence.py) → [`links`](../../md_cg/links.py) → [`provenance`](../../md_cg/provenance.py) → [`signer`](../../md_cg/signer.py) |
49
- | 服务信息 / 健康 | `cg(op=info)` | [`info`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2072) → [`audit`](../../md_cg/audit.py) → [`links`](../../md_cg/links.py) → [`nodefile`](../../md_cg/nodefile.py) → [`theory`](../../md_cg/theory.py) |
50
- | 路由:意图→知识+建议能力 | `cg(op=route)` | [`route`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2089) |
51
- | 读取(按 id / 召回 / 预算) | `cg(op=read)` | [`read`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2110) → [`refindex`](../../md_cg/refindex.py) |
52
- | 写入(含冲突检测 / 闸门 / 审核) | `cg(op=write)` | [`write`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2144) → [`writepipe`](../../md_cg/writepipe.py) |
53
- | 目标(写入 / 状态 / 清单) | `cg(op=goal)` | [`goal`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2152) |
54
- | 任务实体(登记 / 计划 / 状态 / 结果;done 无结果拒收) | `cg(op=task)` | [`task`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2171) → [`_task_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1866) |
55
- | 最近记忆(事件窗口) | `cg(op=recent)` | [`recent`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2174) |
56
- | 外部裁决回填(节点证据验证) | `cg(op=verify)` | [`verify`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2186) |
57
- | 审核队列(DEFER / 提案裁决) | `cg(op=review)` | [`review`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2190) |
58
- | 主动遗忘 / 恢复 | `cg(op=forget)` | [`forget`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2210) |
59
- | 保护(不可遗忘) | `cg(op=protect)` | [`protect`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2216) → [`_protect_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1109) |
60
- | 身份维度 | `cg(op=identity)` | [`identity`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2219) → [`_identity_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1137) |
61
- | 一致性检测 | `cg(op=consistency)` | [`consistency`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2222) → [`_consistency_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1188) |
62
- | 元认知(盲区聚合) | `cg(op=metacognition)` | [`metacognition`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2225) → [`_metacognition_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1217) |
63
- | 自我状态 | `cg(op=self_state)` | [`self_state`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2228) → [`_self_state_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1252) |
64
- | 演化(记忆结构演化) | `cg(op=evolution)` | [`evolution`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2231) → [`_evolution_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1387) |
65
- | 飞轮 / 自愈 | `cg(op=sustain)` | [`sustain`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2234) → [`_sustain_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1479) |
66
- | 洗脑 / 去污染 | `cg(op=scrub)` | [`scrub`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2237) → [`_scrub_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1588) |
67
- | 预测 / 因果门 | `cg(op=predict)` | [`predict`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2240) → [`_predict_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1314) |
68
- | 因果链 | `cg(op=causal)` | [`causal`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2243) → [`_causal_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1348) |
69
- | 白箱能力库(AEIS 能力显式调用) | `cg(op=whitebox)` | [`whitebox`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2246) → [`_whitebox_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2860) |
70
- | 代码索引 | `cg(op=index_code)` | [`index_code`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2249) → [`refindex`](../../md_cg/refindex.py) |
71
- | 文档索引 | `cg(op=index_doc)` | [`index_doc`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2281) → [`refindex`](../../md_cg/refindex.py) |
72
- | 引用 / 反向引用 | `cg(op=ref)` | [`ref`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2317) → [`_ref_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2791) |
73
- | 会话管理(多会话归属与过滤) | `cg(op=session)` | [`session`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2320) → [`_session_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2521) |
74
- | 导入落图 | `cg(op=ingest)` | [`ingest`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2323) → [`_ingest_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2598) |
75
- | 导出 | `cg(op=export)` | [`export`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2326) → [`_export_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2619) |
76
- | 维护 | `cg(op=maintain)` | [`maintain`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2329) → [`_maintain_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2638) |
77
- | 记忆固化 / 整理 | `cg(op=consolidate)` | [`consolidate`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2332) → [`_consolidate_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2716) |
78
- | 洞察 / 自主探索(信息差驱动) | `cg(op=insight)` | [`insight`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2335) → [`_insight_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2741) |
79
- | CCG 六要素编译(对话→候选→编外复核→落库) | `cg(op=ccg)` | [`ccg`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2338) → [`_ccg_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2345) |
44
+ | 按需披露(投影后完整工具 / 参数文档即时取回) | `cg(op=help)` | [`help`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1955) → [`_help_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1874) |
45
+ | 验证态 / 双时间轴 / 履历(含冷路径队列;只读) | `cg(op=status)` | [`status`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1961) → [`_status_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1789) |
46
+ | 三元组反查(派生边任意端 / 谓词 / 时间反查;只读) | `cg(op=edges)` | [`edges`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1964) → [`_edges_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1845) |
47
+ | 理论检索(领域理论 / 方法论文) | `cg(op=theory)` | [`theory`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1967) → [`theory`](../../md_cg/theory.py) |
48
+ | 记忆互链(节点间链接管理) | `cg(op=link)` | [`link`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1984) → [`evidence`](../../md_cg/evidence.py) → [`links`](../../md_cg/links.py) → [`provenance`](../../md_cg/provenance.py) → [`security`](../../md_cg/security.py) → [`signer`](../../md_cg/signer.py) |
49
+ | 服务信息 / 健康 | `cg(op=info)` | [`info`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2100) → [`audit`](../../md_cg/audit.py) → [`links`](../../md_cg/links.py) → [`nodefile`](../../md_cg/nodefile.py) → [`theory`](../../md_cg/theory.py) |
50
+ | 路由:意图→知识+建议能力 | `cg(op=route)` | [`route`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2117) |
51
+ | 读取(按 id / 召回 / 预算) | `cg(op=read)` | [`read`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2138) → [`refindex`](../../md_cg/refindex.py) |
52
+ | 写入(含冲突检测 / 闸门 / 审核) | `cg(op=write)` | [`write`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2174) → [`writepipe`](../../md_cg/writepipe.py) |
53
+ | 目标(写入 / 状态 / 清单) | `cg(op=goal)` | [`goal`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2182) |
54
+ | 任务实体(登记 / 计划 / 状态 / 结果;done 无结果拒收) | `cg(op=task)` | [`task`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2201) → [`_task_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1887) |
55
+ | 最近记忆(事件窗口) | `cg(op=recent)` | [`recent`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2204) |
56
+ | 外部裁决回填(节点证据验证) | `cg(op=verify)` | [`verify`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2216) |
57
+ | 审核队列(DEFER / 提案裁决) | `cg(op=review)` | [`review`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2221) |
58
+ | 主动遗忘 / 恢复 | `cg(op=forget)` | [`forget`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2242) |
59
+ | 保护(不可遗忘) | `cg(op=protect)` | [`protect`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2248) → [`_protect_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1130) |
60
+ | 身份维度 | `cg(op=identity)` | [`identity`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2251) → [`_identity_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1158) |
61
+ | 一致性检测 | `cg(op=consistency)` | [`consistency`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2254) → [`_consistency_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1209) |
62
+ | 元认知(盲区聚合) | `cg(op=metacognition)` | [`metacognition`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2257) → [`_metacognition_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1238) |
63
+ | 自我状态 | `cg(op=self_state)` | [`self_state`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2260) → [`_self_state_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1273) |
64
+ | 演化(记忆结构演化) | `cg(op=evolution)` | [`evolution`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2263) → [`_evolution_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1408) |
65
+ | 飞轮 / 自愈 | `cg(op=sustain)` | [`sustain`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2266) → [`_sustain_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1500) |
66
+ | 洗脑 / 去污染 | `cg(op=scrub)` | [`scrub`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2269) → [`_scrub_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1609) |
67
+ | 预测 / 因果门 | `cg(op=predict)` | [`predict`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2272) → [`_predict_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1335) |
68
+ | 因果链 | `cg(op=causal)` | [`causal`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2275) → [`_causal_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1369) |
69
+ | 白箱能力库(AEIS 能力显式调用) | `cg(op=whitebox)` | [`whitebox`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2278) → [`_whitebox_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2921) |
70
+ | 代码索引 | `cg(op=index_code)` | [`index_code`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2281) → [`refindex`](../../md_cg/refindex.py) → [`security`](../../md_cg/security.py) |
71
+ | 文档索引 | `cg(op=index_doc)` | [`index_doc`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2318) → [`refindex`](../../md_cg/refindex.py) → [`security`](../../md_cg/security.py) |
72
+ | 引用 / 反向引用 | `cg(op=ref)` | [`ref`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2358) → [`_ref_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2841) |
73
+ | 会话管理(多会话归属与过滤) | `cg(op=session)` | [`session`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2361) → [`_session_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2562) |
74
+ | 导入落图 | `cg(op=ingest)` | [`ingest`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2364) → [`_ingest_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2641) |
75
+ | 导出 | `cg(op=export)` | [`export`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2367) → [`_export_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2666) |
76
+ | 维护 | `cg(op=maintain)` | [`maintain`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2370) → [`_maintain_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2688) |
77
+ | 记忆固化 / 整理 | `cg(op=consolidate)` | [`consolidate`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2373) → [`_consolidate_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2766) |
78
+ | 洞察 / 自主探索(信息差驱动) | `cg(op=insight)` | [`insight`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2376) → [`_insight_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2791) |
79
+ | CCG 六要素编译(对话→候选→编外复核→落库) | `cg(op=ccg)` | [`ccg`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2379) → [`_ccg_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2386) |
80
80
 
81
81
  <!-- FUNCMAP:END -->
82
82
 
@@ -95,10 +95,10 @@ MCP stdio:md_cg/mcp_server.py
95
95
 
96
96
  | 功能 | 显式调用 | 代码位置(点击直达源码行) |
97
97
  |---|---|---|
98
- | 两节点关系 | `stg(op=relation)` | [`relation`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2883) |
99
- | 时间线 | `stg(op=timeline)` | [`timeline`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2885) |
100
- | 锚点检索(时空窗口) | `stg(op=anchors)` | [`anchors`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2892) |
101
- | 时空一致性 | `stg(op=consistency)` | [`consistency`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2896) |
98
+ | 两节点关系 | `stg(op=relation)` | [`relation`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2944) |
99
+ | 时间线 | `stg(op=timeline)` | [`timeline`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2946) |
100
+ | 锚点检索(时空窗口) | `stg(op=anchors)` | [`anchors`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2953) |
101
+ | 时空一致性 | `stg(op=consistency)` | [`consistency`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2957) |
102
102
 
103
103
  <!-- FUNCMAP:END -->
104
104