@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.
- package/README.md +572 -465
- package/docs/README.md +1 -0
- 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
- 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
- package/docs/eval/DSH/347/253/257/347/274/272/351/231/267/344/270/223/351/241/271_v1.0.md +254 -0
- 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
- package/docs/eval/bench_lingshu_self/bench_self.py +140 -0
- package/docs/eval/bench_lingshu_self/self_bench_result.json +404 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/docs/images/lingshu-moonlight-covenant-poster-preview.jpg +0 -0
- package/docs/images/lingshu-moonlight-covenant-poster.png +0 -0
- 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
- 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
- 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
- package/dsh/cordis-patch-profile-web.example.yml +35 -0
- package/lib/bridge.d.ts +9 -0
- package/lib/bridge.js +35 -0
- package/lib/cli.d.ts +3 -0
- package/lib/cli.js +66 -0
- package/lib/index.js +7 -1
- package/lib/init.d.ts +88 -0
- package/lib/init.js +287 -0
- package/lib/lib/roleplay_web.js +530 -443
- package/lib/lib/token_store.d.ts +7 -1
- package/lib/lib/token_store.js +12 -3
- package/md_cg/audit.py +12 -1
- package/md_cg/backfill.py +16 -15
- package/md_cg/backfill_bucket_zh.py +35 -0
- package/md_cg/bench_e2e_judge.py +532 -0
- package/md_cg/bench_e2e_locomo_qa.py +368 -0
- package/md_cg/bench_e2e_qa.py +256 -0
- package/md_cg/branches.py +18 -2
- package/md_cg/ccgc.py +3 -2
- package/md_cg/chain.py +19 -4
- package/md_cg/consolidate.py +7 -6
- package/md_cg/crosscheck.py +4 -3
- package/md_cg/crypto.py +439 -437
- package/md_cg/datapath.py +395 -335
- package/md_cg/evidence.py +8 -3
- package/md_cg/export.py +3 -1
- package/md_cg/forgetting.py +2 -2
- package/md_cg/fsutil.py +48 -0
- package/md_cg/hotcache.py +255 -238
- package/md_cg/interop.py +161 -22
- package/md_cg/judgment_manifest.py +177 -0
- package/md_cg/links.py +655 -622
- package/md_cg/mcp_server.py +282 -31
- package/md_cg/mdcg.py +702 -126
- package/md_cg/mdcos.py +454 -68
- package/md_cg/mreview/govern.py +5 -4
- package/md_cg/postings.py +4 -2
- package/md_cg/readcache.py +76 -18
- package/md_cg/reconcile.py +228 -0
- package/md_cg/review_cli.py +215 -0
- package/md_cg/routing.py +28 -0
- package/md_cg/run_tests.py +211 -0
- package/md_cg/scrub.py +862 -852
- package/md_cg/security.py +385 -275
- package/md_cg/selfreport.py +3 -2
- package/md_cg/signer.py +565 -562
- package/md_cg/sources.py +3 -2
- package/md_cg/stg.py +6 -0
- package/md_cg/sustain.py +1168 -1138
- package/md_cg/test_access_hints.py +147 -0
- package/md_cg/test_branch_discard_tombstone.py +136 -0
- package/md_cg/test_branches.py +259 -249
- package/md_cg/test_chain_read_isolate.py +168 -0
- package/md_cg/test_datapath_device_name.py +203 -0
- package/md_cg/test_emit_negtail_cache.py +156 -0
- package/md_cg/test_en_pipeline.py +186 -166
- package/md_cg/test_govern_directread.py +421 -0
- package/md_cg/test_i32_hotcache_env_key.py +218 -0
- package/md_cg/test_identity_attribution.py +228 -147
- package/md_cg/test_index_crossprocess_reload.py +301 -0
- package/md_cg/test_index_durability.py +238 -224
- package/md_cg/test_interop.py +4 -2
- package/md_cg/test_interop_judgment.py +228 -0
- package/md_cg/test_issue39_utf8_stdio.py +273 -0
- package/md_cg/test_links_concurrent_write.py +188 -0
- package/md_cg/test_merge_upsert.py +168 -0
- package/md_cg/test_n123_derive_expiry_chain.py +205 -0
- package/md_cg/test_n130_verify_falsified_protect.py +185 -0
- package/md_cg/test_n131_merge_gate.py +205 -0
- package/md_cg/test_none_id_write_guard.py +165 -0
- package/md_cg/test_p1x_ref_root.py +160 -0
- package/md_cg/test_p27_docindex.py +774 -765
- package/md_cg/test_p2_mcp.py +3 -0
- package/md_cg/test_p32_backfill.py +304 -298
- package/md_cg/test_p39_verify_flow.py +90 -50
- package/md_cg/test_p47_session_view.py +60 -25
- package/md_cg/test_propose_tail_index.py +157 -0
- package/md_cg/test_read_scope_b27.py +277 -0
- package/md_cg/test_readcache_default_on.py +168 -0
- package/md_cg/test_readcache_precise_inval.py +270 -0
- package/md_cg/test_readcache_prodpath.py +55 -7
- package/md_cg/test_reconcile_v0.py +294 -0
- package/md_cg/test_retr_s1.py +6 -2
- package/md_cg/test_retr_s1b.py +67 -0
- package/md_cg/test_retr_s7.py +8 -0
- package/md_cg/test_retr_s9_entity_ctx.py +181 -175
- package/md_cg/test_retr_score_once.py +208 -0
- package/md_cg/test_review_cli_attribution.py +177 -0
- package/md_cg/test_review_cli_visibility.py +235 -0
- package/md_cg/test_review_onepass.py +170 -0
- package/md_cg/test_rrf_graph_seed_cache.py +154 -0
- package/md_cg/test_security_audit.py +155 -0
- package/md_cg/test_security_audit_b26.py +161 -0
- package/md_cg/test_security_audit_v21.py +250 -0
- package/md_cg/test_semantic_canonical.py +255 -241
- package/md_cg/test_session_isolation.py +168 -0
- package/md_cg/test_snapshot_autoclose.py +187 -0
- package/md_cg/test_tail_watermark_race.py +208 -0
- package/md_cg/test_tenant_env_override_warn.py +139 -0
- package/md_cg/test_tenant_registry_corrupt_warn.py +151 -0
- package/md_cg/test_v14_fixes.py +415 -397
- package/md_cg/test_verify_dirty_reconcile.py +157 -0
- package/md_cg/theory.py +276 -273
- package/md_cg/tokens.py +734 -677
- package/md_cg/units.py +3 -2
- package/md_cg/vision_evidence.py +4 -3
- package/md_cg/whitebox_kb/wisdom/code_solidified.json +6195 -6195
- package/md_cg/whitebox_kb/wisdom/multilang_ir.py +128 -124
- package/md_cg/writepipe.py +554 -550
- package/package.json +11 -2
- package/src/bridge.ts +434 -401
- package/src/cli.ts +65 -0
- package/src/index.ts +526 -518
- package/src/init.ts +347 -0
- package/src/lib/roleplay_web.ts +1019 -932
- 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())
|