@furongjun1999/dsh-memory 0.7.0 → 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 (65) hide show
  1. package/README.md +7 -6
  2. 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
  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.1.md +340 -0
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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 +25 -25
  18. 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
  19. 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
  20. package/md_cg/admission.py +718 -0
  21. package/md_cg/autonomy_modes.py +642 -0
  22. package/md_cg/consistency.py +133 -8
  23. package/md_cg/forgetting.py +38 -6
  24. package/md_cg/freshness.py +17 -1
  25. package/md_cg/lifecycle.py +30 -2
  26. package/md_cg/mcp_server.py +63 -7
  27. package/md_cg/mdcg.py +85 -17
  28. package/md_cg/mdcos.py +666 -16
  29. package/md_cg/protect.py +79 -4
  30. package/md_cg/provenance.py +1 -1
  31. package/md_cg/review_cli.py +31 -2
  32. package/md_cg/rollback.py +411 -0
  33. package/md_cg/rollback_cli.py +104 -0
  34. package/md_cg/stg.py +400 -50
  35. package/md_cg/stgidx.py +281 -0
  36. package/md_cg/test_autonomy_admission.py +1098 -0
  37. package/md_cg/test_autonomy_modes.py +1972 -0
  38. package/md_cg/test_b1_auto_id_multiproc.py +7 -0
  39. package/md_cg/test_b1b2_write_face.py +7 -0
  40. package/md_cg/test_b3_merge_keeps_content.py +7 -0
  41. package/md_cg/test_cons200_scan_selection.py +791 -0
  42. package/md_cg/test_i50a_half_dup_defer.py +408 -0
  43. package/md_cg/test_i50b_defer_to_review_queue.py +545 -0
  44. package/md_cg/test_i50c_meta_passthrough.py +608 -0
  45. package/md_cg/test_i50d_importance_source.py +531 -0
  46. package/md_cg/test_i50e_readside_protection.py +656 -0
  47. package/md_cg/test_issue39_utf8_stdio.py +9 -1
  48. package/md_cg/test_issue52_scan_condition_first.py +677 -0
  49. package/md_cg/test_linkref.py +7 -0
  50. package/md_cg/test_mode_parity.py +1393 -0
  51. package/md_cg/test_mutation_rollback.py +805 -0
  52. package/md_cg/test_n204_n205_n226_n227_n228_n229_exit_gates.py +1 -1
  53. package/md_cg/test_n214_n215_n221_n222_write_face_gates.py +7 -0
  54. package/md_cg/test_p2_mcp.py +8 -0
  55. package/md_cg/test_p9_forget_protect.py +7 -0
  56. package/md_cg/test_p9c_dedup_hints.py +7 -0
  57. package/md_cg/test_policy_required_ccg.py +5 -1
  58. package/md_cg/test_protocol.py +7 -0
  59. package/md_cg/test_stgidx_index_parity.py +1020 -0
  60. package/md_cg/test_writelimit.py +36 -9
  61. package/md_cg/test_writepipe.py +5 -2
  62. package/md_cg/weights.py +15 -1
  63. package/md_cg/writepipe.py +101 -2
  64. package/package.json +1 -1
  65. package/skills/plugin.json +1 -1
@@ -0,0 +1,104 @@
1
+ # -*- coding: utf-8 -*-
2
+ """rollback_cli · 变更单回滚命令行(三档自治 · 设计 v0.2 §四「回滚原语四条」)。
3
+
4
+ 用法(root 须与执行该变更单的部署一致:--root 或环境变量 MDCG_ROOT):
5
+ python -X utf8 -m md_cg.rollback_cli --root <root> --pid <pid>
6
+ python -X utf8 -m md_cg.rollback_cli --root <root> --pid <pid> --reason "..."
7
+
8
+ 本模块是**回滚命令串的载体**:变更单执行时点的 `rollback` 字段即指向本 CLI
9
+ (`md_cg.rollback.command_for` 构造,随执行记录落 decisions.jsonl 的
10
+ `rec["mutation"]["rollback"]`)。CLI 做的事:
11
+
12
+ 1. 从 `<root>/hippocampus/decisions.jsonl` 读回该 pid 最后一条
13
+ `decision="accept"` 的裁决记录,取其 `rec["mutation"]`(**执行时点载荷**
14
+ ——动作类/目标/前像/影响面/回滚命令由执行桥补全);
15
+ 2. 交统一回滚入口 `rollback.rollback_mutation` 按动作类分派:
16
+ · C 改写 → 从执行时点前像恢复(含第三方改动的那个版本);
17
+ · B 合并 → 聚合行定向剥离 + 前像 fm 恢复;
18
+ · D 删除 → 既有 restore(trash + 删除清单口径)+ 前像校准;
19
+ 3. 输出 JSON(stdout):`ok` + `bytes_equal_preimage`(逐字节比对前像读数)
20
+ + `residual`(残留核对:边/索引条目/聚合行三面)。
21
+
22
+ 退出码:0 = 回滚完成(读数照实打印,含校准等如实字段);1 = 未回滚
23
+ (错误体照实打印——绝不假装成功)。
24
+
25
+ 边界(如实):本 CLI 不做裁决(回滚是执行记录的既有授权动作——它的执行时点
26
+ 前像就是执行桥拍的);对**未执行**(reject / fail-closed / pending)的变更单,
27
+ 统一入口以 `rollback_gap` fail-closed 拒绝(无前像即不猜)。
28
+ """
29
+ import argparse
30
+ import json
31
+ import os
32
+ import sys
33
+
34
+ try:
35
+ sys.stdout.reconfigure(encoding="utf-8", errors="replace")
36
+ except AttributeError:
37
+ pass
38
+
39
+ _HERE = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
40
+ if _HERE not in sys.path:
41
+ sys.path.insert(0, _HERE)
42
+
43
+ from md_cg import rollback as _rb # noqa: E402
44
+ from md_cg.mdcos import MdCGOS # noqa: E402
45
+
46
+
47
+ # 生效条件:args 的 root 属性为真值(含 getattr 缺省 None 时回落)否则回落 os.environ.get("MDCG_ROOT", ""),两者皆空串或该值经 os.path.isdir 判定不是目录时 sys.exit 退出,否则返回该 root;
48
+ def _root(args):
49
+ root = getattr(args, "root", None) or os.environ.get("MDCG_ROOT", "")
50
+ if not root:
51
+ sys.exit("错误:未指定存储根(--root 或环境变量 MDCG_ROOT)。\n"
52
+ "root 必须与执行该变更单的部署一致——猜错会回滚到另一个库。")
53
+ if not os.path.isdir(root):
54
+ sys.exit("错误:root 不存在:%s" % root)
55
+ return root
56
+
57
+
58
+ # 生效条件:cg 与 pid 就绪时返回 decisions 记录中 pid 匹配、decision=="accept" 且 rec["mutation"] 为 dict 的最后一条记录;无匹配返回 None(调用方 fail-closed);
59
+ def _mutation_record(cg, pid):
60
+ """从裁决记录读回变更单的执行时点载荷(rec["mutation"])。"""
61
+ picked = None
62
+ for r in cg.decisions():
63
+ if r.get("pid") != pid:
64
+ continue
65
+ if r.get("decision") != "accept":
66
+ continue
67
+ if isinstance(r.get("mutation"), dict):
68
+ picked = r
69
+ return picked
70
+
71
+
72
+ # 生效条件:argv 为 None(默认)时由 argparse 解析 sys.argv、否则解析传入的 argv(--root/--pid 必填、--reason 可选),解析成功后取 root 构造 MdCGOS(root, autoflush=1),无匹配执行记录时打印 ok False error decision_not_found 并返回 1,否则调 rollback.rollback_mutation 打印其结果 JSON,按其 ok 真值返回 0、假值返回 1;finally 中执行 cg.close();
73
+ def main(argv=None):
74
+ ap = argparse.ArgumentParser(
75
+ prog="python -m md_cg.rollback_cli",
76
+ description="变更单回滚(设计 §四:从执行时点前像恢复)")
77
+ ap.add_argument("--root", help="存储根目录(默认环境变量 MDCG_ROOT)")
78
+ ap.add_argument("--pid", required=True, help="变更单的裁决 pid(accept 记录)")
79
+ ap.add_argument("--reason", default="", help="回滚理由(进返回体)")
80
+ args = ap.parse_args(argv)
81
+
82
+ cg = MdCGOS(_root(args), autoflush=1)
83
+ try:
84
+ rec = _mutation_record(cg, args.pid)
85
+ if rec is None:
86
+ out = {"ok": False, "error": "decision_not_found", "pid": args.pid,
87
+ "hint": "decisions.jsonl 中无该 pid 的 accept 执行记录"
88
+ "(或记录缺 mutation 载荷)——变更单未执行即无可"
89
+ "回滚的前像(fail-closed,不猜)。"}
90
+ print(json.dumps(out, ensure_ascii=False))
91
+ return 1
92
+ out = _rb.rollback_mutation(cg, rec["mutation"], reason=args.reason,
93
+ actor="rollback-cli")
94
+ print(json.dumps(out, ensure_ascii=False, default=str))
95
+ return 0 if out.get("ok") else 1
96
+ finally:
97
+ # 收尾(与 review_cli 同款):回滚落盘经 _dirty→flush→_index_log,
98
+ # 不 close 则「节点在盘上但索引无条目」;库层另有 atexit 兜底,显式
99
+ # 收尾才是正路。
100
+ cg.close()
101
+
102
+
103
+ if __name__ == "__main__":
104
+ sys.exit(main())