@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
package/docs/README.md CHANGED
@@ -99,6 +99,7 @@ docs/
99
99
  | [概念分层对齐表 v0.1](theory/概念分层对齐表_v0.1.md) | 概念层级对齐 |
100
100
  | [认知代理与收敛结构·条件论重构 v0.1](theory/认知代理与收敛结构_条件论重构_v0.1.md) | 条件论 |
101
101
  | [理论·机制·代码·实验·缺口矩阵 v0.1](theory/理论_机制_代码_实验_缺口矩阵_v0.1.md) | 全景矩阵 |
102
+ | [不可靠定理与失效优先框架 v0.3](theory/不可靠定理与失效优先框架_v0.3.md) | Fail-First Theorems:T0 失效定理推导链(T0–T14/A1–A4)· 14 行理论×机制×代码矩阵(2026-09-26 工程核验)· 落地清单含 v0.1 承接节 |
102
103
  | [理论仓拆分与白箱知识库内迁 v0.1](theory/理论仓拆分与白箱知识库内迁_v0.1.md) | 拆分方案 |
103
104
 
104
105
  ## eval/ · 评测与第三方验证
@@ -0,0 +1,140 @@
1
+ # -*- coding: utf-8 -*-
2
+ """灵枢自库端到端检索评测(中文 · 自然问句 vs 关键词对照 · 生产读路径)
3
+
4
+ 实测方式(用户指定):mdcg 的读检索——spawn python -m md_cg.mcp_server(stdio JSON-RPC,
5
+ 与 DSH 插件 src/lib/mdcg_client.ts 同款生产路径),逐题调 cg(op=read, query=...),
6
+ 只收 top-10 候选的 node.id 与 score,判 gold 节点命中。
7
+
8
+ gold = 已落盘(索引可见)的已知节点;审核队列 pending 提案对检索不可见(如实记录为
9
+ 发现,不进评测集)。运行环境继承 MDCG_TOKEN(designer/internal 档)。
10
+ """
11
+ import json, subprocess, sys, os, time
12
+
13
+ REPO = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
14
+
15
+ # ── 测试集:20 题 · 自然问句 → gold(已落盘节点)──────────────────────────
16
+ CASES = [
17
+ # (自然问句, [gold_node_ids], 关键词对照组)
18
+ ("hive 的 serve 怎么判断还活着?", ["mem_1789612355948"], "serve 存活 判据 三层 心跳 pid"),
19
+ ("双实例互验怎么防止验证者作弊?", ["mem_1789602635975"], "互验 判据冻结 A3 验证者 指纹"),
20
+ ("任务派发应该按什么原则分层决策?", ["mem_1789605410646"], "任务派发 三层决策 L1 L2 L3 分层原则"),
21
+ ("蜂群健康评分的 integrity 因子是怎么算的?", ["swarm_v061_integrity_fix"], "蜂群 integrity 健康评分 验签 aggregate_report"),
22
+ ("全局截断 cap 会造成哪些检索可见性问题?", ["mem_1789511615088"], "GLOBAL_CAP 截断 检索 可见性 T3 importance"),
23
+ ("冷验证队列的回执什么情况下会报假成功?", ["mem_1789897251107"], "冷队列 回执 诚实 patrol_check propagate_depth"),
24
+ ("英文语料用中文索引检索效果怎么样?", ["mem_1789132609619"], "LongMemEval 中文层 探针 英文原文 载荷回填"),
25
+ ("检索扩散 reach 功能默认是开的吗?", ["mem_1789795794376"], "reach opt-in MDCG_REACH 收敛层 接线"),
26
+ ("记忆怎么按热度分层来加速检索?", ["mem_1789803443800"], "热温冷 分层检索 热路径缓存 冷路径 异步验证"),
27
+ ("LLM 批次修复第二轮还是不过怎么办?", ["mem_1789666192335"], "fix pass 二轮 REJECT held 重生成"),
28
+ ("子任务上下文快满了怎么交接?", ["mem_1789548798424"], "handoff 满上下文 换人续跑 progress.jsonl"),
29
+ ("记忆条目的过期和观测变旧怎么区分?", ["mem_1789539356385"], "stale 时间窗 失效判据 observation_aged observation_aged 信息差"),
30
+ ("代码提交推送到公开仓库前要做什么检查?", ["mem_1789612355948"], "提交 推送 双清单 门禁 隐私脱敏 扫描"),
31
+ ("多个智能体共用一份权限时怎么区分是谁干的?", ["mem_1789122153945"], "嵌套身份 权限域 归因 进程 会话"),
32
+ ("DSH 的会话 id 关机重启后会变吗?", ["mem_1789100285255"], "DSH 会话 id 持久 projcache resume"),
33
+ ("对话日志怎么自动挖出错误和修复的配对?", ["node_02fe882d_1788905562143", "doc_4a3accff94d6"], "fix pairs 自动挖掘 行为日志 错误 修复 负记忆"),
34
+ ("令牌放在系统环境变量里有什么安全风险?", ["mem_1789099723060"], "MDCG_TOKEN Machine 作用域 部署 按 身份授权 缺口"),
35
+ ("服务进程的随机会话 id 会带来什么问题?", ["mem_1789099936556"], "Principal.session 进程随机 uuid 会话身份 前置缺口"),
36
+ ("查询词完全命不中桶的时候检索会怎么走?", ["mem_1789511615088"], "no_key_match T3 全量兜底 importance 排序"),
37
+ ("白箱知识库在进程里怎么被调用?", ["code_d98d1f5aa78e", "doc_3942cfca7bdf"], "白箱 引擎 进程内 门面 engine call_tool"),
38
+ ]
39
+
40
+
41
+ class Client:
42
+ def __init__(self):
43
+ env = dict(os.environ)
44
+ if not env.get("MDCG_ROOT"):
45
+ raise SystemExit("须设 MDCG_ROOT 指向被测记忆库根(见同目录实测报告的复现节)")
46
+ self.p = subprocess.Popen(
47
+ [sys.executable, "-X", "utf8", "-m", "md_cg.mcp_server"],
48
+ cwd=REPO, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
49
+ stderr=subprocess.DEVNULL, env=env,
50
+ )
51
+ self._id = 0
52
+ self._call("initialize", {"protocolVersion": "2024-11-05", "capabilities": {},
53
+ "clientInfo": {"name": "self-bench", "version": "1.0"}})
54
+ self.p.stdin.write((json.dumps({"jsonrpc": "2.0", "method": "notifications/initialized"}) + "\n").encode())
55
+ self.p.stdin.flush()
56
+
57
+ def _call(self, method, params):
58
+ self._id += 1
59
+ req = {"jsonrpc": "2.0", "id": self._id, "method": method, "params": params}
60
+ self.p.stdin.write((json.dumps(req, ensure_ascii=False) + "\n").encode("utf-8"))
61
+ self.p.stdin.flush()
62
+ deadline = time.time() + 120
63
+ while time.time() < deadline:
64
+ line = self.p.stdout.readline().decode("utf-8", "replace").strip()
65
+ if not line:
66
+ continue
67
+ try:
68
+ return json.loads(line)
69
+ except json.JSONDecodeError:
70
+ continue # 启动横幅等非 JSON 行
71
+ return {"error": "timeout-waiting-json-line"}
72
+
73
+ def read(self, query):
74
+ r = self._call("tools/call", {"name": "cg", "arguments": {"op": "read", "query": query}})
75
+ # 返回 {result:{content:[{type:text,text:json串}]}} 或 error
76
+ if "error" in r:
77
+ return {"error": str(r["error"])[:120]}
78
+ try:
79
+ txt = r["result"]["content"][0]["text"]
80
+ return json.loads(txt)
81
+ except Exception as e:
82
+ return {"error": f"parse:{e}"}
83
+
84
+ def close(self):
85
+ try:
86
+ self.p.stdin.close(); self.p.wait(timeout=5)
87
+ except Exception:
88
+ self.p.kill()
89
+
90
+
91
+ def top_ids(resp, k=10):
92
+ if not isinstance(resp, dict) or "results" not in resp:
93
+ return [], (resp.get("error") if isinstance(resp, dict) else "no-results")[:80], None
94
+ rs = resp["results"][:k]
95
+ ids = [x["node"]["id"] for x in rs]
96
+ meta = resp.get("meta", {})
97
+ return ids, meta.get("tier"), [round(x.get("score", 0), 4) for x in rs]
98
+
99
+
100
+ def hit_stats(hits_pos):
101
+ h1 = sum(1 for p in hits_pos if p is not None and p < 1)
102
+ h5 = sum(1 for p in hits_pos if p is not None and p < 5)
103
+ h10 = sum(1 for p in hits_pos if p is not None and p < 10)
104
+ return h1, h5, h10
105
+
106
+
107
+ def main():
108
+ cli = Client()
109
+ rows = []
110
+ for nat_q, golds, kw_q in CASES:
111
+ row = {"q": nat_q, "golds": golds}
112
+ for arm, q in (("nat", nat_q), ("kw", kw_q)):
113
+ resp = cli.read(q)
114
+ ids, tier, scores = top_ids(resp)
115
+ pos = next((i for i, nid in enumerate(ids) if nid in golds), None)
116
+ row[arm] = {"pos": pos, "tier": tier, "top1": ids[0] if ids else None,
117
+ "top1_is_gold": bool(ids and ids[0] in golds),
118
+ "n_res": len(ids)}
119
+ time.sleep(0.1)
120
+ rows.append(row)
121
+ m = row["nat"]
122
+ print(f"[{m['tier'] or '?':>16}] nat pos={str(m['pos']):>4} kw pos={str(row['kw']['pos']):>4} {nat_q[:34]}")
123
+ cli.close()
124
+
125
+ for arm in ("nat", "kw"):
126
+ h1, h5, h10 = hit_stats([r[arm]["pos"] for r in rows])
127
+ n = len(rows)
128
+ print(f"\n===== {arm}: hit@1={h1}/{n} ({h1/n:.0%}) hit@5={h5}/{n} ({h5/n:.0%}) hit@10={h10}/{n} ({h10/n:.0%})")
129
+ tiers = {}
130
+ for r in rows:
131
+ tiers[r["nat"]["tier"]] = tiers.get(r["nat"]["tier"], 0) + 1
132
+ print("nat tier 分布:", tiers)
133
+ out = os.path.join(os.path.dirname(os.path.abspath(__file__)), "self_bench_result.json")
134
+ with open(out, "w", encoding="utf-8") as f:
135
+ json.dump(rows, f, ensure_ascii=False, indent=1)
136
+ print("明细 →", out)
137
+
138
+
139
+ if __name__ == "__main__":
140
+ main()
@@ -0,0 +1,404 @@
1
+ [
2
+ {
3
+ "q": "hive 的 serve 怎么判断还活着?",
4
+ "golds": [
5
+ "mem_1789612355948"
6
+ ],
7
+ "nat": {
8
+ "pos": null,
9
+ "tier": "T2_global_like",
10
+ "top1": "mem_1789552857538",
11
+ "top1_is_gold": false,
12
+ "n_res": 10
13
+ },
14
+ "kw": {
15
+ "pos": null,
16
+ "tier": "T2_global_like",
17
+ "top1": "mem_1789612140901",
18
+ "top1_is_gold": false,
19
+ "n_res": 10
20
+ }
21
+ },
22
+ {
23
+ "q": "双实例互验怎么防止验证者作弊?",
24
+ "golds": [
25
+ "mem_1789602635975"
26
+ ],
27
+ "nat": {
28
+ "pos": 1,
29
+ "tier": "T2_global_like",
30
+ "top1": "mem_1789603603896",
31
+ "top1_is_gold": false,
32
+ "n_res": 10
33
+ },
34
+ "kw": {
35
+ "pos": 0,
36
+ "tier": "T3_global_scan",
37
+ "top1": "mem_1789602635975",
38
+ "top1_is_gold": true,
39
+ "n_res": 10
40
+ }
41
+ },
42
+ {
43
+ "q": "任务派发应该按什么原则分层决策?",
44
+ "golds": [
45
+ "mem_1789605410646"
46
+ ],
47
+ "nat": {
48
+ "pos": 0,
49
+ "tier": "T2_global_like",
50
+ "top1": "mem_1789605410646",
51
+ "top1_is_gold": true,
52
+ "n_res": 10
53
+ },
54
+ "kw": {
55
+ "pos": 0,
56
+ "tier": "T3_global_scan",
57
+ "top1": "mem_1789605410646",
58
+ "top1_is_gold": true,
59
+ "n_res": 10
60
+ }
61
+ },
62
+ {
63
+ "q": "蜂群健康评分的 integrity 因子是怎么算的?",
64
+ "golds": [
65
+ "swarm_v061_integrity_fix"
66
+ ],
67
+ "nat": {
68
+ "pos": 0,
69
+ "tier": "T3_global_scan",
70
+ "top1": "swarm_v061_integrity_fix",
71
+ "top1_is_gold": true,
72
+ "n_res": 10
73
+ },
74
+ "kw": {
75
+ "pos": 0,
76
+ "tier": "T3_global_scan",
77
+ "top1": "swarm_v061_integrity_fix",
78
+ "top1_is_gold": true,
79
+ "n_res": 10
80
+ }
81
+ },
82
+ {
83
+ "q": "全局截断 cap 会造成哪些检索可见性问题?",
84
+ "golds": [
85
+ "mem_1789511615088"
86
+ ],
87
+ "nat": {
88
+ "pos": 2,
89
+ "tier": "T3_global_scan",
90
+ "top1": "node_132deca4_1789537606255",
91
+ "top1_is_gold": false,
92
+ "n_res": 10
93
+ },
94
+ "kw": {
95
+ "pos": 1,
96
+ "tier": "T2_global_like",
97
+ "top1": "node_41abeae8_1789510901539",
98
+ "top1_is_gold": false,
99
+ "n_res": 10
100
+ }
101
+ },
102
+ {
103
+ "q": "冷验证队列的回执什么情况下会报假成功?",
104
+ "golds": [
105
+ "mem_1789897251107"
106
+ ],
107
+ "nat": {
108
+ "pos": 2,
109
+ "tier": "T2_global_like",
110
+ "top1": "mem_1789722858540",
111
+ "top1_is_gold": false,
112
+ "n_res": 10
113
+ },
114
+ "kw": {
115
+ "pos": 0,
116
+ "tier": "T3_global_scan",
117
+ "top1": "mem_1789897251107",
118
+ "top1_is_gold": true,
119
+ "n_res": 10
120
+ }
121
+ },
122
+ {
123
+ "q": "英文语料用中文索引检索效果怎么样?",
124
+ "golds": [
125
+ "mem_1789132609619"
126
+ ],
127
+ "nat": {
128
+ "pos": null,
129
+ "tier": "T2_global_like",
130
+ "top1": "mem_1789354548231",
131
+ "top1_is_gold": false,
132
+ "n_res": 10
133
+ },
134
+ "kw": {
135
+ "pos": 0,
136
+ "tier": "T2_global_like",
137
+ "top1": "mem_1789132609619",
138
+ "top1_is_gold": true,
139
+ "n_res": 10
140
+ }
141
+ },
142
+ {
143
+ "q": "检索扩散 reach 功能默认是开的吗?",
144
+ "golds": [
145
+ "mem_1789795794376"
146
+ ],
147
+ "nat": {
148
+ "pos": null,
149
+ "tier": "T3_global_scan",
150
+ "top1": "code_3d03ed70458d",
151
+ "top1_is_gold": false,
152
+ "n_res": 10
153
+ },
154
+ "kw": {
155
+ "pos": 0,
156
+ "tier": "T2_global_like",
157
+ "top1": "mem_1789795794376",
158
+ "top1_is_gold": true,
159
+ "n_res": 10
160
+ }
161
+ },
162
+ {
163
+ "q": "记忆怎么按热度分层来加速检索?",
164
+ "golds": [
165
+ "mem_1789803443800"
166
+ ],
167
+ "nat": {
168
+ "pos": null,
169
+ "tier": "T2_global_like",
170
+ "top1": "mem_1789274628336",
171
+ "top1_is_gold": false,
172
+ "n_res": 10
173
+ },
174
+ "kw": {
175
+ "pos": 1,
176
+ "tier": "T2_global_like",
177
+ "top1": "code_0602d0907acc",
178
+ "top1_is_gold": false,
179
+ "n_res": 10
180
+ }
181
+ },
182
+ {
183
+ "q": "LLM 批次修复第二轮还是不过怎么办?",
184
+ "golds": [
185
+ "mem_1789666192335"
186
+ ],
187
+ "nat": {
188
+ "pos": null,
189
+ "tier": "T2_global_like",
190
+ "top1": "mem_1789274628336",
191
+ "top1_is_gold": false,
192
+ "n_res": 10
193
+ },
194
+ "kw": {
195
+ "pos": 3,
196
+ "tier": "T2_global_like",
197
+ "top1": "mem_1789665204611",
198
+ "top1_is_gold": false,
199
+ "n_res": 10
200
+ }
201
+ },
202
+ {
203
+ "q": "子任务上下文快满了怎么交接?",
204
+ "golds": [
205
+ "mem_1789548798424"
206
+ ],
207
+ "nat": {
208
+ "pos": 7,
209
+ "tier": "T2_global_like",
210
+ "top1": "mem_1789599787541",
211
+ "top1_is_gold": false,
212
+ "n_res": 10
213
+ },
214
+ "kw": {
215
+ "pos": 0,
216
+ "tier": "T2_global_like",
217
+ "top1": "mem_1789548798424",
218
+ "top1_is_gold": true,
219
+ "n_res": 10
220
+ }
221
+ },
222
+ {
223
+ "q": "记忆条目的过期和观测变旧怎么区分?",
224
+ "golds": [
225
+ "mem_1789539356385"
226
+ ],
227
+ "nat": {
228
+ "pos": null,
229
+ "tier": "T2_global_like",
230
+ "top1": "node_ef7bc1ee_1786918581699",
231
+ "top1_is_gold": false,
232
+ "n_res": 10
233
+ },
234
+ "kw": {
235
+ "pos": null,
236
+ "tier": "T3_global_scan",
237
+ "top1": "mem_1789540113805",
238
+ "top1_is_gold": false,
239
+ "n_res": 10
240
+ }
241
+ },
242
+ {
243
+ "q": "代码提交推送到公开仓库前要做什么检查?",
244
+ "golds": [
245
+ "mem_1789612355948"
246
+ ],
247
+ "nat": {
248
+ "pos": 9,
249
+ "tier": "T2_global_like",
250
+ "top1": "mem_1789806369843",
251
+ "top1_is_gold": false,
252
+ "n_res": 10
253
+ },
254
+ "kw": {
255
+ "pos": 0,
256
+ "tier": "T2_global_like",
257
+ "top1": "mem_1789612355948",
258
+ "top1_is_gold": true,
259
+ "n_res": 10
260
+ }
261
+ },
262
+ {
263
+ "q": "多个智能体共用一份权限时怎么区分是谁干的?",
264
+ "golds": [
265
+ "mem_1789122153945"
266
+ ],
267
+ "nat": {
268
+ "pos": null,
269
+ "tier": "T2_global_like",
270
+ "top1": "node_76728d45_1786918560368",
271
+ "top1_is_gold": false,
272
+ "n_res": 10
273
+ },
274
+ "kw": {
275
+ "pos": 0,
276
+ "tier": "T2_global_like",
277
+ "top1": "mem_1789122153945",
278
+ "top1_is_gold": true,
279
+ "n_res": 10
280
+ }
281
+ },
282
+ {
283
+ "q": "DSH 的会话 id 关机重启后会变吗?",
284
+ "golds": [
285
+ "mem_1789100285255"
286
+ ],
287
+ "nat": {
288
+ "pos": 0,
289
+ "tier": "T2_global_like",
290
+ "top1": "mem_1789100285255",
291
+ "top1_is_gold": true,
292
+ "n_res": 10
293
+ },
294
+ "kw": {
295
+ "pos": 0,
296
+ "tier": "T2_global_like",
297
+ "top1": "mem_1789100285255",
298
+ "top1_is_gold": true,
299
+ "n_res": 10
300
+ }
301
+ },
302
+ {
303
+ "q": "对话日志怎么自动挖出错误和修复的配对?",
304
+ "golds": [
305
+ "node_02fe882d_1788905562143",
306
+ "doc_4a3accff94d6"
307
+ ],
308
+ "nat": {
309
+ "pos": 3,
310
+ "tier": "T2_global_like",
311
+ "top1": "node_030c84b7_1786688525595",
312
+ "top1_is_gold": false,
313
+ "n_res": 10
314
+ },
315
+ "kw": {
316
+ "pos": 1,
317
+ "tier": "T2_global_like",
318
+ "top1": "code_4297379afe64",
319
+ "top1_is_gold": false,
320
+ "n_res": 10
321
+ }
322
+ },
323
+ {
324
+ "q": "令牌放在系统环境变量里有什么安全风险?",
325
+ "golds": [
326
+ "mem_1789099723060"
327
+ ],
328
+ "nat": {
329
+ "pos": 0,
330
+ "tier": "T2_global_like",
331
+ "top1": "mem_1789099723060",
332
+ "top1_is_gold": true,
333
+ "n_res": 10
334
+ },
335
+ "kw": {
336
+ "pos": 0,
337
+ "tier": "T2_global_like",
338
+ "top1": "mem_1789099723060",
339
+ "top1_is_gold": true,
340
+ "n_res": 10
341
+ }
342
+ },
343
+ {
344
+ "q": "服务进程的随机会话 id 会带来什么问题?",
345
+ "golds": [
346
+ "mem_1789099936556"
347
+ ],
348
+ "nat": {
349
+ "pos": 3,
350
+ "tier": "T2_global_like",
351
+ "top1": "mem_1789100285255",
352
+ "top1_is_gold": false,
353
+ "n_res": 10
354
+ },
355
+ "kw": {
356
+ "pos": 0,
357
+ "tier": "T2_global_like",
358
+ "top1": "mem_1789099936556",
359
+ "top1_is_gold": true,
360
+ "n_res": 10
361
+ }
362
+ },
363
+ {
364
+ "q": "查询词完全命不中桶的时候检索会怎么走?",
365
+ "golds": [
366
+ "mem_1789511615088"
367
+ ],
368
+ "nat": {
369
+ "pos": null,
370
+ "tier": "T2_global_like",
371
+ "top1": "node_subject_4939401561_1787018087635",
372
+ "top1_is_gold": false,
373
+ "n_res": 10
374
+ },
375
+ "kw": {
376
+ "pos": 0,
377
+ "tier": "T3_global_scan",
378
+ "top1": "mem_1789511615088",
379
+ "top1_is_gold": true,
380
+ "n_res": 10
381
+ }
382
+ },
383
+ {
384
+ "q": "白箱知识库在进程里怎么被调用?",
385
+ "golds": [
386
+ "code_d98d1f5aa78e",
387
+ "doc_3942cfca7bdf"
388
+ ],
389
+ "nat": {
390
+ "pos": 1,
391
+ "tier": "T2_global_like",
392
+ "top1": "code_a53cb473e34f",
393
+ "top1_is_gold": false,
394
+ "n_res": 10
395
+ },
396
+ "kw": {
397
+ "pos": 0,
398
+ "tier": "T3_global_scan",
399
+ "top1": "code_d98d1f5aa78e",
400
+ "top1_is_gold": true,
401
+ "n_res": 10
402
+ }
403
+ }
404
+ ]
@@ -0,0 +1,38 @@
1
+ # 灵枢自库端到端检索实测 v1.0(原生中文 · 自然问句 vs 关键词 · 生产读路径)
2
+
3
+ > **口径**:被测库=灵枢自身在役记忆库(14095 节点 · 原生中文 · CCG 六要素为主写入面 · audit 23.9 万事件的真实累积库);实测方式=mdcg 读检索生产路径——spawn `python -m md_cg.mcp_server`(stdio JSON-RPC,与 DSH 插件同款链路),逐题调 `cg(op=read, query=…)`,取 top-10 候选判 gold 命中。评测令牌为专用 designer 令牌(`tk_70f633dc8398`,internal 以上可见)。
4
+ > **题集**:20 道自然中文问句(口语化、非节点原文词),gold=16 个已落盘已知节点(多题一 gold / 一题多 gold);对照组=同题关键词版(从 gold 六要素词面构造)。脚本:`bench_self.py`(本目录);逐题明细:`self_bench_result.json`。
5
+
6
+ ## 结果
7
+
8
+ | 臂 | hit@1 | hit@5 | hit@10 |
9
+ | ---- | ---- | ---- | ---- |
10
+ | 自然问句 | 4/20(**20%**) | 10/20(**50%**) | 12/20(**60%**) |
11
+ | 关键词对照 | 14/20(**70%**) | 18/20(**90%**) | 18/20(**90%**) |
12
+
13
+ ## 三条对照解读
14
+
15
+ 1. **与 LoCoMo 翻译语料口径对照(自然问句 40.2% / 派生题面 92%)**:原生中文 CCG 库上自然问句 **60% > 40.2%(+19.8pp)**——CCG 六要素写入面(功能名/生效条件等结构化中文槽)确实部分缩小了问句-答案词汇差,翻译噪声也被排除。
16
+ 2. **鸿沟同构成立**:自库上自然问句与关键词之间仍有 **30pp**(60% vs 90%)——与 LoCoMo 口径的 51.8pp 鸿沟同向。词汇差瓶颈不依赖语料来源,是词法检索的固有边界;**认知图概念桥接(自然问句 → 92%±)的必要性在本口径下再次成立**,且 60% 是桥接实施的自库基线起点。
17
+ 3. **失败定性(8 题 hit@10 外)**:6 题 kw 臂能命中(典型词汇差:问句「过期/变旧」vs 节点 `stale/observation_aged`、问句「快满了怎么交接」vs 节点 `handoff 满上下文`)——词面不同构是主因;2 题双臂皆败(Q1 serve 存活、Q12 stale 区分)经直读验证 gold 在库可检索,属**排序区分度问题**——「hive/serve」词面在众多蜂巢节点同现,gold 特异词(存活判据/三层)未入问句时被主题相近节点淹没(top-3 全为蜂巢编排类节点,score 0.44-0.59)。
18
+
19
+ ## 过程发现(评测副产物,两条)
20
+
21
+ 1. **审核队列对检索不可见**:`review_pending=22`——缺陷迭代九轮的归档提案全部 pending、索引不可见,`cg(op=read)` 检索不到(例:问「MCP 如何防打崩」返回的 top-10 全为授权/身份主题无关节点,第 10 轮 MCP 入口守卫归档不在候选)。知识从 propose 到可检索依赖设计者裁决,裁决积压=知识不可用。**建议:设计者批量裁决积压提案(review_cli),或为 pending 提案建立降级可见通道(另行设计)。**
22
+ 2. **自然问句零桶收敛**:tier 分布 17/20 走 `T2_global_like`(全局扫 13550 节点)、3/20 走 `T3_global_scan`,**没有一题走桶收敛(T0/T1)**——自然问句不命中英文桶键;#33 的 `backfill_bucket_zh` 中文别名回填未在本库执行过。全局兜底路径承担了全部自然问句流量,S1b 桶收敛对真实问句形态未起作用。
23
+
24
+ ## 复现
25
+
26
+ ```bash
27
+ MDCG_ROOT=<真实库根> MDCG_TOKEN=<designer 令牌> \
28
+ python -X utf8 docs/eval/bench_lingshu_self/bench_self.py
29
+ ```
30
+
31
+ > 本报告不含库根绝对路径与令牌明文;评测令牌 token_id `tk_70f633dc8398` 保留复测用,可随时 `python -m md_cg.tokens revoke` 吊销。
32
+
33
+ ## 边界
34
+
35
+ - 20 题小样本,百分比仅作量级参考(±1 题 = ±5pp);
36
+ - gold 由编排会话指定(已知答案节点),非全库抽样;问句风格单一(工程事实型),未覆盖时间/条件/否定类问句;
37
+ - 关键词臂由 gold 六要素词面构造,含轻度答案侧词汇先验(与 LoCoMo 口径的派生题面同性质);
38
+ - 被测库持续增长(audit 在写),两次运行数字可能小幅漂移。