@furongjun1999/dsh-memory 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/README.md +572 -465
  2. package/docs/README.md +1 -0
  3. package/docs/eval/DSH/346/227/245/345/277/227/347/264/242/345/274/225v2_/345/217/202/350/200/203dsh-TUI_v1.0.md +248 -0
  4. package/docs/eval/DSH/346/227/245/345/277/227/347/264/242/345/274/225/346/225/210/346/236/234/351/252/214/350/257/201_v1.0.md +209 -0
  5. package/docs/eval/DSH/347/253/257/347/274/272/351/231/267/344/270/223/351/241/271_v1.0.md +254 -0
  6. package/docs/eval/P1b2_/350/257/273/351/235/242/344/273/243/351/231/205/344/277/256/345/244/215_v1.0.md +124 -0
  7. package/docs/eval/bench_lingshu_self/bench_self.py +140 -0
  8. package/docs/eval/bench_lingshu_self/self_bench_result.json +404 -0
  9. 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
  10. 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
  11. package/docs/eval//345/217/221/345/270/20306_/344/270/200/351/224/256/351/205/215/347/275/256/344/270/216DSH0172_v1.0.md +171 -0
  12. 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
  13. 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
  14. 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
  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_v1.md +156 -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_v10.md +210 -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_v11.md +227 -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_v12.md +203 -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_v13.md +233 -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_v14.md +191 -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_v15.md +213 -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_v16.md +214 -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_v17.md +199 -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_v18.md +183 -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_v19.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_v2.md +156 -0
  27. 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
  28. 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. package/docs/images/lingshu-moonlight-covenant-poster-preview.jpg +0 -0
  37. package/docs/images/lingshu-moonlight-covenant-poster.png +0 -0
  38. 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
  39. 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
  40. 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
  41. package/dsh/cordis-patch-profile-web.example.yml +35 -0
  42. package/lib/bridge.d.ts +9 -0
  43. package/lib/bridge.js +35 -0
  44. package/lib/cli.d.ts +3 -0
  45. package/lib/cli.js +66 -0
  46. package/lib/index.js +7 -1
  47. package/lib/init.d.ts +88 -0
  48. package/lib/init.js +287 -0
  49. package/lib/lib/roleplay_web.js +530 -443
  50. package/lib/lib/token_store.d.ts +7 -1
  51. package/lib/lib/token_store.js +12 -3
  52. package/md_cg/audit.py +12 -1
  53. package/md_cg/backfill.py +16 -15
  54. package/md_cg/backfill_bucket_zh.py +35 -0
  55. package/md_cg/bench_e2e_judge.py +532 -0
  56. package/md_cg/bench_e2e_locomo_qa.py +368 -0
  57. package/md_cg/bench_e2e_qa.py +256 -0
  58. package/md_cg/branches.py +18 -2
  59. package/md_cg/ccgc.py +3 -2
  60. package/md_cg/chain.py +19 -4
  61. package/md_cg/consolidate.py +7 -6
  62. package/md_cg/crosscheck.py +4 -3
  63. package/md_cg/crypto.py +439 -437
  64. package/md_cg/datapath.py +395 -335
  65. package/md_cg/evidence.py +8 -3
  66. package/md_cg/export.py +3 -1
  67. package/md_cg/forgetting.py +2 -2
  68. package/md_cg/fsutil.py +48 -0
  69. package/md_cg/hotcache.py +255 -238
  70. package/md_cg/interop.py +161 -22
  71. package/md_cg/judgment_manifest.py +177 -0
  72. package/md_cg/links.py +655 -622
  73. package/md_cg/mcp_server.py +282 -31
  74. package/md_cg/mdcg.py +702 -126
  75. package/md_cg/mdcos.py +454 -68
  76. package/md_cg/mreview/govern.py +5 -4
  77. package/md_cg/postings.py +4 -2
  78. package/md_cg/readcache.py +76 -18
  79. package/md_cg/reconcile.py +228 -0
  80. package/md_cg/review_cli.py +215 -0
  81. package/md_cg/routing.py +28 -0
  82. package/md_cg/run_tests.py +211 -0
  83. package/md_cg/scrub.py +862 -852
  84. package/md_cg/security.py +385 -275
  85. package/md_cg/selfreport.py +3 -2
  86. package/md_cg/signer.py +565 -562
  87. package/md_cg/sources.py +3 -2
  88. package/md_cg/stg.py +6 -0
  89. package/md_cg/sustain.py +1168 -1138
  90. package/md_cg/test_access_hints.py +147 -0
  91. package/md_cg/test_branch_discard_tombstone.py +136 -0
  92. package/md_cg/test_branches.py +259 -249
  93. package/md_cg/test_chain_read_isolate.py +168 -0
  94. package/md_cg/test_datapath_device_name.py +203 -0
  95. package/md_cg/test_emit_negtail_cache.py +156 -0
  96. package/md_cg/test_en_pipeline.py +186 -166
  97. package/md_cg/test_govern_directread.py +421 -0
  98. package/md_cg/test_i32_hotcache_env_key.py +218 -0
  99. package/md_cg/test_identity_attribution.py +228 -147
  100. package/md_cg/test_index_crossprocess_reload.py +301 -0
  101. package/md_cg/test_index_durability.py +238 -224
  102. package/md_cg/test_interop.py +4 -2
  103. package/md_cg/test_interop_judgment.py +228 -0
  104. package/md_cg/test_issue39_utf8_stdio.py +273 -0
  105. package/md_cg/test_links_concurrent_write.py +188 -0
  106. package/md_cg/test_merge_upsert.py +168 -0
  107. package/md_cg/test_n123_derive_expiry_chain.py +205 -0
  108. package/md_cg/test_n130_verify_falsified_protect.py +185 -0
  109. package/md_cg/test_n131_merge_gate.py +205 -0
  110. package/md_cg/test_none_id_write_guard.py +165 -0
  111. package/md_cg/test_p1x_ref_root.py +160 -0
  112. package/md_cg/test_p27_docindex.py +774 -765
  113. package/md_cg/test_p2_mcp.py +3 -0
  114. package/md_cg/test_p32_backfill.py +304 -298
  115. package/md_cg/test_p39_verify_flow.py +90 -50
  116. package/md_cg/test_p47_session_view.py +60 -25
  117. package/md_cg/test_propose_tail_index.py +157 -0
  118. package/md_cg/test_read_scope_b27.py +277 -0
  119. package/md_cg/test_readcache_default_on.py +168 -0
  120. package/md_cg/test_readcache_precise_inval.py +270 -0
  121. package/md_cg/test_readcache_prodpath.py +55 -7
  122. package/md_cg/test_reconcile_v0.py +294 -0
  123. package/md_cg/test_retr_s1.py +6 -2
  124. package/md_cg/test_retr_s1b.py +67 -0
  125. package/md_cg/test_retr_s7.py +8 -0
  126. package/md_cg/test_retr_s9_entity_ctx.py +181 -175
  127. package/md_cg/test_retr_score_once.py +208 -0
  128. package/md_cg/test_review_cli_attribution.py +177 -0
  129. package/md_cg/test_review_cli_visibility.py +235 -0
  130. package/md_cg/test_review_onepass.py +170 -0
  131. package/md_cg/test_rrf_graph_seed_cache.py +154 -0
  132. package/md_cg/test_security_audit.py +155 -0
  133. package/md_cg/test_security_audit_b26.py +161 -0
  134. package/md_cg/test_security_audit_v21.py +250 -0
  135. package/md_cg/test_semantic_canonical.py +255 -241
  136. package/md_cg/test_session_isolation.py +168 -0
  137. package/md_cg/test_snapshot_autoclose.py +187 -0
  138. package/md_cg/test_tail_watermark_race.py +208 -0
  139. package/md_cg/test_tenant_env_override_warn.py +139 -0
  140. package/md_cg/test_tenant_registry_corrupt_warn.py +151 -0
  141. package/md_cg/test_v14_fixes.py +415 -397
  142. package/md_cg/test_verify_dirty_reconcile.py +157 -0
  143. package/md_cg/theory.py +276 -273
  144. package/md_cg/tokens.py +734 -677
  145. package/md_cg/units.py +3 -2
  146. package/md_cg/vision_evidence.py +4 -3
  147. package/md_cg/whitebox_kb/wisdom/code_solidified.json +6195 -6195
  148. package/md_cg/whitebox_kb/wisdom/multilang_ir.py +128 -124
  149. package/md_cg/writepipe.py +554 -550
  150. package/package.json +11 -2
  151. package/src/bridge.ts +434 -401
  152. package/src/cli.ts +65 -0
  153. package/src/index.ts +526 -518
  154. package/src/init.ts +347 -0
  155. package/src/lib/roleplay_web.ts +1019 -932
  156. package/src/lib/token_store.ts +202 -192
@@ -0,0 +1,157 @@
1
+ # -*- coding: utf-8 -*-
2
+ """verify() 直写分支索引对账守卫(缺陷:confirmed/weakened 直写盘后不置 _dirty)。
3
+
4
+ 缺陷形态(缺陷报告 2026-09-25 复现证实,medium):verify() 的
5
+ confirmed/weakened 直写分支(mdcg.py:3166-3170)`_write_node` 落盘后只原地改
6
+ index 条目 `evidence_count`,不置 `self._dirty[node_id]`。当节点已在目标验证态
7
+ (verified→verified / doubted→doubted)时,尾部 set_verification 走 stamp
8
+ noop 提前返回(trust.py:192-193 / 695-696,不写盘、不调 _sync_index)——
9
+ 本次写盘对索引增量日志(_dirty → flush → _index_log 重放)完全不可见:
10
+
11
+ ① 重开后索引 evidence_count 与盘面漂移(forgetting.py:358、
12
+ scrub.py:181/582/716、metacognition.py:176/193 均按索引条目
13
+ evidence_count 决策)——计数对账只对账 .md 数量(compact_index
14
+ :1003),内容级改写不触发重扫;
15
+ ② readcache 代际(_DirtyDict.write_gen)不推进 → 同实例 _read 命中旧
16
+ frontmatter(缓存视图 vs 盘上真值不一致)。
17
+
18
+ 复现形态(与缺陷报告一致的三段会话):S1 预置验证态并 close 落快照 →
19
+ S2 noop 形态 verify(已在目标验证态)→ S3 重开对账索引与盘面。
20
+
21
+ 修复:直写分支落盘并原地更新条目后显式 `self._dirty[node_id] = e`
22
+ (与 mdcg.py 边域同步 :1664 / goal 状态 :1902 同款口径)。
23
+
24
+ 红项 = V3-V6(代际推进 / 标脏 / 缓存视图 / 重开对账);V1/V2 锁语义不变
25
+ (noop 幂等、返回载荷形态不变)。
26
+ 运行:python -m md_cg.test_verify_dirty_reconcile
27
+ """
28
+ from __future__ import annotations
29
+
30
+ import os
31
+ import shutil
32
+ import sys
33
+ import tempfile
34
+
35
+ from .mdcos import MdCGOS
36
+
37
+ PASS = FAIL = 0
38
+ FAILS = []
39
+
40
+
41
+ def ok(cond, label):
42
+ global PASS, FAIL
43
+ if cond:
44
+ PASS += 1
45
+ print(f" OK {label}")
46
+ else:
47
+ FAIL += 1
48
+ FAILS.append(label)
49
+ print(f" FAIL {label}")
50
+
51
+
52
+ def _disk_fm(root, nid):
53
+ """盘上真值直读(新实例首触 = 磁盘当前内容)。"""
54
+ cg = MdCGOS(root)
55
+ e = (cg.index.get("nodes") or {}).get(nid)
56
+ if not e:
57
+ return None, None
58
+ fn = getattr(cg, "_read_uncached", None) or cg._read
59
+ fm, content = fn(e)
60
+ cg.close()
61
+ return fm, content
62
+
63
+
64
+ def _noop_session(root, nid, verdict, label, want_conf):
65
+ """S2:节点已在目标验证态 → verify 的 set_verification 为 noop 直写分支。"""
66
+ cg = MdCGOS(root)
67
+ entry = cg.index["nodes"][nid]
68
+ cg._read(entry) # 检索装载缓存(生产形态)
69
+ g0 = cg._dirty.write_gen
70
+
71
+ r = cg.verify(nid, f"{label}的外部证据", verdict)
72
+ ok(r["action"] == verdict,
73
+ f"{label}1 verify 返回 action={verdict}")
74
+ ok(r["verification"].get("code") == "noop"
75
+ and r["verification"].get("changed") is False,
76
+ f"{label}2 已在目标验证态 → 幂等 noop(语义不变,不写验证态)")
77
+
78
+ ok(cg._dirty.write_gen > g0,
79
+ f"{label}3 写代际推进(write_gen {g0}→{cg._dirty.write_gen})")
80
+ ok(nid in cg._dirty,
81
+ f"{label}4 直写分支已标脏(_dirty 含 {nid} → flush 落增量日志)")
82
+ fm_cached, _ = cg._read(entry) # 缓存视图
83
+ ok(fm_cached.get("evidence_count") == 1,
84
+ f"{label}5 同实例缓存视图不陈旧(evidence_count="
85
+ f"{fm_cached.get('evidence_count')},应 1)")
86
+ cg.close()
87
+
88
+ # S3:重开对账——索引条目与盘面一致
89
+ cg2 = MdCGOS(root)
90
+ idx = (cg2.index.get("nodes") or {}).get(nid) or {}
91
+ fm_disk, _ = _disk_fm(root, nid)
92
+ ok(idx.get("evidence_count") == 1 and fm_disk.get("evidence_count") == 1,
93
+ f"{label}6 重开后索引与盘面对账一致(索引 {idx.get('evidence_count')}"
94
+ f" / 盘面 {fm_disk.get('evidence_count')},应均为 1)")
95
+ ok(fm_disk.get("confidence") == want_conf,
96
+ f"{label}7 盘面置信度正确({want_conf})")
97
+ cg2.close()
98
+
99
+
100
+ def _confirmed_shape(tmp):
101
+ """confirmed 复现(缺陷报告原样:先 set_verification(verified) 再 noop verify)。"""
102
+ root = os.path.join(tmp, "cf")
103
+ os.makedirs(root)
104
+ # S1:预置验证态并 close 落快照(此后 noop 会话走 compact 而非 rebuild)
105
+ cg1 = MdCGOS(root)
106
+ cg1.add("n1", "# 功能名:对账守卫\n\n正文。\n", layer="knowledge")
107
+ cg1.flush()
108
+ r0 = cg1.set_verification("n1", "verified", reason="守卫预置",
109
+ actor="guard")
110
+ ok(r0.get("ok") and r0.get("changed"),
111
+ "cf0 S1 预置 verified(unverified→verified 非 noop)")
112
+ cg1.close()
113
+ _noop_session(root, "n1", "confirmed", "cf", 0.65)
114
+ fm, _ = _disk_fm(root, "n1")
115
+ ok(fm.get("verification_state") == "verified",
116
+ "cf8 盘面验证态保持 verified(noop 未改态)")
117
+
118
+
119
+ def _weakened_shape(tmp):
120
+ """weakened 复现:doubted→doubted 同为 noop 直写分支(置信度不触降级)。"""
121
+ root = os.path.join(tmp, "wk")
122
+ os.makedirs(root)
123
+ cg1 = MdCGOS(root)
124
+ cg1.add("n2", "# 功能名:对账守卫二\n\n正文。\n", layer="knowledge",
125
+ confidence=0.9)
126
+ cg1.flush()
127
+ r0 = cg1.set_verification("n2", "doubted", reason="守卫预置",
128
+ actor="guard")
129
+ ok(r0.get("ok") and r0.get("changed"),
130
+ "wk0 S1 预置 doubted(unverified→doubted 非 noop)")
131
+ cg1.close()
132
+ _noop_session(root, "n2", "weakened", "wk", 0.75) # 0.9−0.15
133
+ fm, _ = _disk_fm(root, "n2")
134
+ ok(fm.get("layer") == "knowledge" and fm.get("verification_state") == "doubted",
135
+ "wk8 未误降级(0.75 > DEMOTE_CONFIDENCE 0.2)且态保持 doubted")
136
+
137
+
138
+ def main():
139
+ os.environ.pop("MDCG_READ_CACHE", None)
140
+ tmp = tempfile.mkdtemp(prefix="mdcg_verify_dirty_")
141
+ try:
142
+ _confirmed_shape(tmp)
143
+ _weakened_shape(tmp)
144
+ finally:
145
+ os.environ.pop("MDCG_READ_CACHE", None)
146
+ shutil.rmtree(tmp, ignore_errors=True)
147
+
148
+ print("\n" + "=" * 60)
149
+ print(f"结果:PASS {PASS} / FAIL {FAIL}")
150
+ if FAILS:
151
+ for f in FAILS:
152
+ print(f" - {f}")
153
+ return 0 if FAIL == 0 else 1
154
+
155
+
156
+ if __name__ == "__main__":
157
+ sys.exit(main())