@furongjun1999/dsh-memory 0.6.1 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/README.md +49 -18
  2. package/docs/README.md +1 -0
  3. package/docs/eval/cons200_/345/206/262/347/252/201/346/243/200/346/265/213/351/200/211/351/235/242_/345/256/236/346/226/275/350/256/260/345/275/225_v1.0.md +223 -0
  4. package/docs/eval/cons200_/345/206/262/347/252/201/346/243/200/346/265/213/351/200/211/351/235/242_/345/256/236/346/226/275/350/256/260/345/275/225_v1.1.md +340 -0
  5. package/docs/eval/issue50_/345/205/203/346/225/260/346/215/256/351/200/217/344/274/240/344/270/216/345/205/234/345/272/225_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +437 -0
  6. package/docs/eval/issue50_/345/215/212/351/207/215/345/244/215/345/276/205/345/256/232/345/244/215/346/240/270_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +488 -0
  7. package/docs/eval/issue50_/345/276/205/345/256/232/345/244/215/346/240/270/345/205/245/351/230/237_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +428 -0
  8. package/docs/eval/issue50_/350/257/273/351/235/242/344/277/235/346/212/244/345/217/252/350/256/244/346/230/276/345/274/217/346/235/245/346/272/220_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +271 -0
  9. package/docs/eval/issue50_/351/207/215/350/246/201/345/272/246/345/220/214/346/272/220/344/270/216/344/277/235/346/212/244/350/257/255/344/271/211_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +306 -0
  10. package/docs/eval/issue51_/344/270/200/351/224/256/345/256/211/350/243/205/345/244/261/350/264/245_/345/275/222/345/261/236/345/210/244/345/256/232_v1.0.md +58 -0
  11. package/docs/eval/issue52_/346/235/241/344/273/266/345/205/210/350/241/214/344/270/216/346/210/252/346/226/255/345/217/257/350/247/202/346/265/213_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +360 -0
  12. package/docs/eval//344/270/211/346/241/243/350/207/252/346/262/273_/346/255/245/351/252/244/342/221/241/346/241/243/344/275/215/345/215/225/344/270/200/345/205/245/345/217/243_/350/220/275/347/240/201/350/256/260/345/275/225_v1.0.md +651 -0
  13. package/docs/eval//344/270/211/346/241/243/350/207/252/346/262/273_/346/255/245/351/252/244/342/221/242/345/217/230/346/233/264/345/215/225/344/270/216/345/233/236/346/273/232/345/216/237/350/257/255_/350/220/275/347/240/201/350/256/260/345/275/225_v1.0.md +439 -0
  14. package/docs/eval//344/270/211/346/241/243/350/207/252/346/262/273_/346/255/245/351/252/244/342/221/243/345/207/206/345/205/245/350/257/273/346/225/260_/350/220/275/347/240/201/350/256/260/345/275/225_v1.0.md +1337 -0
  15. package/docs/eval//344/270/211/346/241/243/350/207/252/346/262/273_/346/255/245/351/252/244/342/221/244/346/224/266/345/256/230/344/270/216/345/205/250/351/223/276/351/252/214/346/224/266_/350/220/275/347/240/201/350/256/260/345/275/225_v1.0.md +1817 -0
  16. package/docs/eval//345/207/272/350/264/247/351/235/242/345/206/222/347/203/237_/350/277/233/350/264/247/351/227/250/347/246/201_v1.0.md +460 -0
  17. package/docs/eval//345/217/221/345/270/20308_/350/207/252/350/277/255/344/273/243/344/270/216/347/235/241/347/234/240_/345/233/276/346/243/200/347/264/242/350/267/257/344/270/216/346/235/203/351/207/215_v1.0.md +97 -0
  18. package/docs/eval//345/217/221/345/270/20309_/346/243/200/347/264/242/351/235/242/344/270/211/346/211/271/346/224/266/345/217/243_v1.0.md +66 -0
  19. package/docs/eval//345/275/222/344/270/200/345/261/202/347/274/272/347/234/201/347/277/273/345/205/263_/344/277/256/345/244/215/350/256/260/345/275/225_v1.0.md +458 -0
  20. package/docs/eval//347/254/2543/345/261/202stg/347/273/223/346/236/204/347/264/242/345/274/225_/345/256/236/346/226/275/350/256/260/345/275/225_v1.0.md +250 -0
  21. package/docs/hive//346/243/200/347/264/242/347/256/227/346/263/225/345/217/243/345/276/204/345/257/271/347/205/247_v0.1.md +136 -11
  22. package/docs/hive//346/243/200/347/264/242/350/267/257/345/276/204/344/270/216/350/256/244/347/237/245/347/273/223/346/236/204/345/245/221/347/272/246_v0.1.md +32 -2
  23. package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +88 -0
  24. package/docs/mdcg//345/212/237/350/203/275/350/260/203/347/224/250/346/230/240/345/260/204/350/241/250_v0.1.md +40 -40
  25. package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +47 -11
  26. package/docs/mdcg//347/235/241/347/234/240/345/221/250/346/234/237_/350/277/220/347/273/264/345/211/215/346/217/220/344/270/216/347/273/264/346/212/244/346/214/207/345/215/227_v1.0.md +183 -0
  27. package/docs/plans/stg/346/235/241/344/273/266/345/214/226/344/270/216/347/273/223/346/236/204/347/264/242/345/274/225_/350/256/276/350/256/241_v0.1.md +124 -0
  28. package/docs/plans//347/235/241/347/234/240/344/270/216/350/207/252/350/277/255/344/273/243_/345/212/237/350/203/275/344/274/230/345/214/226/350/256/276/350/256/241_v0.4.md +547 -0
  29. package/docs/plans//350/256/260/345/277/206/350/207/252/345/244/204/347/220/206/344/270/211/346/241/243/350/207/252/346/262/273_/350/256/276/350/256/241_v0.2.md +207 -0
  30. package/md_cg/admission.py +718 -0
  31. package/md_cg/autonomy_modes.py +642 -0
  32. package/md_cg/bench_e2e_locomo_qa.py +11 -4
  33. package/md_cg/chain.py +47 -0
  34. package/md_cg/consistency.py +133 -8
  35. package/md_cg/forgetting.py +38 -6
  36. package/md_cg/freshness.py +527 -0
  37. package/md_cg/generation.py +409 -0
  38. package/md_cg/hotcache.py +4 -1
  39. package/md_cg/lifecycle.py +30 -2
  40. package/md_cg/mcp_server.py +191 -26
  41. package/md_cg/mdcg.py +594 -39
  42. package/md_cg/mdcos.py +869 -38
  43. package/md_cg/nodefile.py +74 -1
  44. package/md_cg/protect.py +79 -4
  45. package/md_cg/provenance.py +1 -1
  46. package/md_cg/review_cli.py +31 -2
  47. package/md_cg/rollback.py +411 -0
  48. package/md_cg/rollback_cli.py +104 -0
  49. package/md_cg/semantic/canonical.py +22 -0
  50. package/md_cg/semantic/unify.py +73 -22
  51. package/md_cg/semantic/unify_fixture.json +25 -0
  52. package/md_cg/sleep.py +1297 -0
  53. package/md_cg/stg.py +400 -50
  54. package/md_cg/stgidx.py +281 -0
  55. package/md_cg/sustain.py +146 -9
  56. package/md_cg/test_auto_defaults.py +424 -0
  57. package/md_cg/test_autonomy_admission.py +1098 -0
  58. package/md_cg/test_autonomy_modes.py +1972 -0
  59. package/md_cg/test_b1_auto_id_multiproc.py +7 -0
  60. package/md_cg/test_b1b2_write_face.py +7 -0
  61. package/md_cg/test_b3_merge_keeps_content.py +7 -0
  62. package/md_cg/test_boundary_hit.py +410 -0
  63. package/md_cg/test_cons200_scan_selection.py +791 -0
  64. package/md_cg/test_en_pipeline.py +22 -13
  65. package/md_cg/test_generation_guard.py +352 -0
  66. package/md_cg/test_h4_sustain_snapshot.py +14 -4
  67. package/md_cg/test_i50a_half_dup_defer.py +408 -0
  68. package/md_cg/test_i50b_defer_to_review_queue.py +545 -0
  69. package/md_cg/test_i50c_meta_passthrough.py +608 -0
  70. package/md_cg/test_i50d_importance_source.py +531 -0
  71. package/md_cg/test_i50e_readside_protection.py +656 -0
  72. package/md_cg/test_issue39_utf8_stdio.py +9 -1
  73. package/md_cg/test_issue52_scan_condition_first.py +677 -0
  74. package/md_cg/test_linkref.py +7 -0
  75. package/md_cg/test_mode_parity.py +1393 -0
  76. package/md_cg/test_mutation_rollback.py +805 -0
  77. package/md_cg/test_n204_n205_n226_n227_n228_n229_exit_gates.py +1 -1
  78. package/md_cg/test_n212_n213_n224_generation_gates.py +14 -8
  79. package/md_cg/test_n214_n215_n221_n222_write_face_gates.py +7 -0
  80. package/md_cg/test_n230_dirty_replay.py +375 -0
  81. package/md_cg/test_p2_mcp.py +8 -0
  82. package/md_cg/test_p2_six_elements.py +463 -0
  83. package/md_cg/test_p3_legacy_closure.py +433 -0
  84. package/md_cg/test_p4_freshness.py +680 -0
  85. package/md_cg/test_p8_subgraph_chain.py +14 -1
  86. package/md_cg/test_p9_forget_protect.py +7 -0
  87. package/md_cg/test_p9c_dedup_hints.py +7 -0
  88. package/md_cg/test_policy_required_ccg.py +5 -1
  89. package/md_cg/test_protocol.py +7 -0
  90. package/md_cg/test_rank_parity_score_mode.py +6 -0
  91. package/md_cg/test_semantic_canonical.py +5 -3
  92. package/md_cg/test_sleep.py +611 -0
  93. package/md_cg/test_sleep_p1.py +784 -0
  94. package/md_cg/test_stgidx_index_parity.py +1020 -0
  95. package/md_cg/test_time_core_lint.py +968 -0
  96. package/md_cg/test_unify_default_off.py +701 -0
  97. package/md_cg/test_unify_scope.py +182 -0
  98. package/md_cg/test_writelimit.py +36 -9
  99. package/md_cg/test_writepipe.py +5 -2
  100. package/md_cg/weights.py +15 -1
  101. package/md_cg/whitebox_kb/aeis_core/time_core.py +8 -0
  102. package/md_cg/writepipe.py +101 -2
  103. package/package.json +3 -2
  104. package/skills/plugin.json +1 -1
  105. package/utf8_boot.py +237 -0
@@ -1,45 +1,96 @@
1
1
  #!/usr/bin/env python3
2
2
  # -*- coding: utf-8 -*-
3
- """灵枢 · 检索 query 统一归一层(批次 15,2026-09-23 使用者口径定案)
4
-
5
- 口径:**统一翻译为中文 → 归一化到标准中文集(atoms.json)→ 检索**。
6
- 任何语言的 query 先归一为标准原子序列(空格 join)再进检索各路:
7
- - 英文:en_normalizer(时态还原→停用词剔除→en→zh 语素映射)→
8
- segment 展开为标准原子(「牛肉」→「牛 肉」,与 doc 侧 fm.semantic
9
- 原子形态同构);
10
- - 中文:segment 贪心最长匹配归一到 atoms.json 标准概念;
11
- - 纯中文 query **原样返回**——segment+join+bigrams(去空白) 后与原文
12
- 等价,归一只对跨语 query 有信息增益(beef 与「牛肉」零共享字符,
13
- 形态归一救不了跨语),纯中文零变更纪律;
3
+ """灵枢 · 检索 query 统一归一层(批次 15 立;2026-09-30 使用者裁定收窄作用域)
4
+
5
+ 口径:**只对英文内容做翻译归一,中文内容原样不动**。
6
+ query 先按「中文段 / 非中文段」切开,只有**非中文段里的英文**进归一链路:
7
+ - 非中文段(含 ASCII 字母):en_normalizer(时态还原→停用词剔除→en→zh 语素
8
+ 映射)→ segment 展开为标准原子(「牛肉」→「牛 肉」,与 doc 侧
9
+ fm.semantic 原子形态同构);
10
+ - 中文段(CJK 统一表意文字基本区 U+4E00–U+9FFF,判据单点 =
11
+ `canonical.is_zh_char`):**逐字保留、绝不切分、绝不送 segment**;
12
+ - 非英文段(数字/标点等,段内无 ASCII 字母):原样保留(不是英文即不翻译);
13
+ - 两段按原顺序以单空格 join,空白(段内/段间)一律折叠为单空格;
14
14
  - 专名/未登录词原样保留(词表边界 unknown_keep,非错误)。
15
15
 
16
- 开关:MDCG_UNIFY_QUERY 默认 "1"(2026-09-23 使用者拍板口径转正);
17
- "=0" 显式关回退。两侧同步:rust/mcdg-eval 读同一 env + 同一份
18
- atoms.json(scripts/rank_parity.py --dataset 对拍在两侧同开关态进行,
19
- A/B 差异归档为转正证据)。
16
+ 为什么收窄(2026-09-30 定因,实测于 locomo-zh-500 公开题池 500 题 / 567 池、
17
+ eval_common jaccard + GLOBAL_CAP 解除、k=5):旧口径「query 含任一 ASCII 字母
18
+ 即整条归一」会把**中夹英** query 的中文部分逐字切开(「自我接纳」→
19
+ 「自 我 接 纳」、「慈善跑」→「慈 善 跑」);500 题里含 ASCII 字母的 145 条
20
+ **全部**也含中文(无纯英文 query)。单点实测:整条归一 lexical hit@1 = 94.4% /
21
+ lexical,fuzzy = 87.2%;只译英文片段 lexical = 95.8% / lexical,fuzzy = 96.6%;
22
+ 归一层全关 lexical = 96.4% / lexical,fuzzy = 97.2%。
23
+
24
+ 开关:MDCG_UNIFY_QUERY **默认关**(2026-09-30 使用者裁定,缺省由 "1" 翻为 "0")。
25
+ 定因:本层本职是让**英文** query 命中中文节点,对中文检索池是**纯开销**——
26
+ locomo-zh-500 公开题池(池 567 / 题 500)缺省关态 lexical hit@1 96.4% /
27
+ lexical+fuzzy 97.2%,开态 95.8% / 96.6%(各跑两遍逐位相同)。
28
+
29
+ 三态判据(两侧同语义,唯一开态 = 显式 "1"):
30
+
31
+ MDCG_UNIFY_QUERY Python unify_on() Rust Atoms::from_env()
32
+ 未设 False None(不载入)
33
+ "0" False None(不载入)
34
+ "1" True Some(Atoms)(载入)
35
+
36
+ 显式 "1" 仍能开回(英文对照路要用);两侧同源 en_zh_map.json
37
+ (scripts/rank_parity.py --dataset 对拍在两侧同开关态进行)。
20
38
 
21
39
  归一失败(semantic 模块缺失等)静默原样返回——与 en_zh_terms 同降级
22
40
  风格,不阻断检索主链路。
41
+
42
+ 两侧同构:rust/src/atoms.rs::Atoms::unify 同语义、同中文判据;逐位对拍 fixture
43
+ = `md_cg/semantic/unify_fixture.json`(本侧守卫 md_cg/test_unify_scope.py 与
44
+ Rust 单测 unify_mixed_fixture_matches_python 钉同一份期望值)。
23
45
  """
24
46
  import os
25
47
  import re
26
48
 
27
- # 生效条件:无 required 形参,锚定环境变量名 MDCG_UNIFY_QUERY;当 os.environ.get("MDCG_UNIFY_QUERY", "1") == "1" 时返回 True,否则返回 False。
49
+ from .canonical import is_zh_char
50
+
51
+ # 生效条件:无 required 形参,锚定环境变量名 MDCG_UNIFY_QUERY;**未设**时取缺省 "0"(2026-09-30 使用者裁定:缺省关),当 os.environ.get("MDCG_UNIFY_QUERY", "0") == "1" 时返回 True,其余(未设 / "0" / 任何非 "1" 取值)返回 False。
28
52
  def unify_on() -> bool:
29
- """统一归一层开关(默认开=口径定案转正;=0 显式关回退)。"""
30
- return os.environ.get("MDCG_UNIFY_QUERY", "1") == "1"
53
+ """统一归一层开关(**默认关**;显式 =1 才开,=0/未设一律关)。"""
54
+ return os.environ.get("MDCG_UNIFY_QUERY", "0") == "1"
55
+
56
+
57
+ # 生效条件:单参 text 为任意字符串(空串返回空列表),按 canonical.is_zh_char 逐字符判中文段,相邻同判据字符归并为一个连续段,返回 [(是否中文段, 段文本), ...] 的保序列表。
58
+ def _runs(text):
59
+ """按中文判据切连续段:[(True, "中文段"), (False, "非中文段"), ...]。"""
60
+ out = []
61
+ cur = None
62
+ buf = []
63
+ for ch in text:
64
+ k = is_zh_char(ch)
65
+ if buf and k != cur:
66
+ out.append((cur, "".join(buf)))
67
+ buf = []
68
+ cur = k
69
+ buf.append(ch)
70
+ if buf:
71
+ out.append((cur, "".join(buf)))
72
+ return out
31
73
 
32
74
 
33
- # 生效条件:text 为 None/空串或开关关闭或不含 [A-Za-z] 时原样返回;否则经 canonical.query_atoms 归一为标准原子序列并以单空格 join 返回(归一产物为空或抛异常时原样返回)。
75
+ # 生效条件:text 为 None/空串、或开关 MDCG_UNIFY_QUERY 取值不为 "1"(含**未设**——缺省 "0",2026-09-30 起关)、或 strip 后不含 [A-Za-z] 时,原样返回 text(未 strip 的入参);否则按中文段(canonical.is_zh_char)切分——中文段与不含 ASCII 字母的非中文段逐字保留、含 ASCII 字母的非中文段经 canonical.query_atoms 归一——各段折空白后按原顺序单空格 join;归一产物为空(trim 后)或抛异常时原样返回 text。
34
76
  def unify_query(text):
35
- """检索入口统一归一:任意语言 query → 标准原子序列。"""
77
+ """检索入口统一归一:只译英文内容,中文段逐字原样。"""
36
78
  t = (text or "").strip()
37
79
  if not t or not unify_on() or not re.search(r"[A-Za-z]", t):
38
80
  return text
39
81
  try:
40
82
  from .canonical import query_atoms
41
- atoms = query_atoms(t)
83
+ parts = []
84
+ for is_zh, run in _runs(t):
85
+ if is_zh or not re.search(r"[A-Za-z]", run):
86
+ seg = run # 中文段 / 非英文段:逐字保留
87
+ else:
88
+ atoms = query_atoms(run) # 非中文段里的英文:既有链路
89
+ seg = " ".join(a for a in atoms if a)
90
+ seg = " ".join(seg.split()) # 段内空白折叠为单空格
91
+ if seg:
92
+ parts.append(seg)
42
93
  except Exception:
43
94
  return text
44
- u = " ".join(a for a in atoms if a).strip()
95
+ u = " ".join(parts)
45
96
  return u if u else text
@@ -0,0 +1,25 @@
1
+ {
2
+ "_note": "统一归一层(unify_query / Atoms::unify)作用域收窄(2026-09-30 使用者裁定:只对英文内容做翻译归一,中文内容原样不动)的逐位对拍 fixture。两侧同源钉死:Python 守卫 md_cg/test_unify_scope.py 与 Rust 单测 rust/src/atoms.rs::tests::unify_mixed_fixture_matches_python 都读本文件(Rust 侧 include_str! 编译期嵌入)。任一侧实现漂移即红。含「空产物回退」例(入参含首尾空白且归一产物为空 → 两侧逐位回退**原入参本身**,2026-09-30 清理批次乙1 钉住;Python 侧语义为 unify_query 尾行 `return text`)。",
3
+ "_caveat": "非中文段一律用「两侧处理同构」的形态:全小写英文词(或命中 en_zh_map 的形)。两侧**既有非对称**共三条(非 2026-09-30 收窄引入,亦非本清理批次引入——HEAD 对照实测同分歧),故不入本 fixture:①未登录大写英文词——Python 保留原 case(`领养 LGBTQ 群体`→原样、`AI 记忆 系统`→原样),Rust 经 normalize_en 一律 lower(→`领养 lgbtq 群体`/`ai 记忆 系统`);②命中词表的专名——Python 双原子保留原词+译词(`Paris 报告`→`Paris 巴 黎 报告`),Rust 只出译词(→`巴 黎 报告`);③字母与数字同段——Python 丢数字(`beef 2024 报告`→`牛肉 报告`),Rust 保数字(→`牛肉 2024 报告`)。**真源 = `docs/hive/检索算法口径对照_v0.1.md` 正文「两侧既有非对称」表**(含两侧原始读数、fixture 为何避开、以及「统一到哪一侧」的待裁定项);本文件只钉两侧同构形态。",
4
+ "cases": [
5
+ {"name": "纯英·跨语归一冒烟", "in": "I eat beef yesterday", "out": "我 吃 牛肉 昨天"},
6
+ {"name": "纯英·单动词时态还原", "in": "wrote", "out": "写"},
7
+ {"name": "纯英·多词", "in": "compiler tests", "out": "编 辑 家 测 试"},
8
+ {"name": "纯中·复合词不切", "in": "自我接纳", "out": "自我接纳"},
9
+ {"name": "纯中·旧口径会切开的两字三字词", "in": "慈善跑", "out": "慈善跑"},
10
+ {"name": "纯中·带空格", "in": "蜂群调度 依赖门禁", "out": "蜂群调度 依赖门禁"},
11
+ {"name": "中夹英·英文在首", "in": "beef 报告", "out": "牛肉 报告"},
12
+ {"name": "中夹英·未登录英文片段+中文段逐字保留", "in": "领养 xyzzy 群体", "out": "领养 xyzzy 群体"},
13
+ {"name": "英夹中·英文译中文段原样", "in": "beef 牛肉", "out": "牛肉 牛肉"},
14
+ {"name": "前后空白·折叠", "in": " beef 报告 ", "out": "牛肉 报告"},
15
+ {"name": "空产物回退·原样返回原入参(不 trim)", "in": " the is ", "out": " the is "},
16
+ {"name": "多空格·折叠为单空格", "in": "beef 报告", "out": "牛肉 报告"},
17
+ {"name": "数字·非英文段原样", "in": "2024 报告", "out": "2024 报告"},
18
+ {"name": "数字+中文+英文混合", "in": "2024 年 beef 报告", "out": "2024 年 牛肉 报告"},
19
+ {"name": "半角标点·非英文段原样", "in": "beef 阅读,写作", "out": "牛肉 阅读 , 写作"},
20
+ {"name": "全角标点·非英文段原样", "in": "报告。很好 beef", "out": "报告 。 很好 牛肉"},
21
+ {"name": "未登录词·unknown_keep", "in": "xyzzy 报告", "out": "xyzzy 报告"},
22
+ {"name": "单字母词 I", "in": "I 支持", "out": "我 支持"},
23
+ {"name": "英中粘连·无空格混合", "in": "beef报告", "out": "牛肉 报告"}
24
+ ]
25
+ }