@furongjun1999/dsh-memory 0.7.0 → 0.7.2
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 +8 -6
- package/codebuddy/CODEBUDDY.md +5 -5
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/docs/eval//345/217/221/345/270/20310_/350/257/273/351/235/242/346/215/237/345/235/217UTF8/345/256/266/346/227/217/346/224/266/345/217/243_v1.0.md +71 -0
- 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
- 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
- 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
- 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
- package/docs//345/267/245/344/275/234/347/272/252/345/276/213_/350/256/244/347/237/245/345/233/276/346/235/241/347/233/256_v1.1.json +4 -4
- package/md_cg/admission.py +718 -0
- package/md_cg/autonomy_modes.py +642 -0
- package/md_cg/bench6_arms.py +10 -6
- package/md_cg/census.py +2 -1
- package/md_cg/consistency.py +133 -8
- package/md_cg/forgetting.py +38 -6
- package/md_cg/freshness.py +17 -1
- package/md_cg/lifecycle.py +30 -2
- package/md_cg/mcp_server.py +63 -7
- package/md_cg/mdcg.py +157 -31
- package/md_cg/mdcos.py +675 -19
- package/md_cg/mreview/locate.py +1 -1
- package/md_cg/protect.py +79 -4
- package/md_cg/provenance.py +1 -1
- package/md_cg/review_cli.py +31 -2
- package/md_cg/rollback.py +420 -0
- package/md_cg/rollback_cli.py +104 -0
- package/md_cg/routing.py +10 -1
- package/md_cg/stg.py +400 -50
- package/md_cg/stgidx.py +281 -0
- package/md_cg/test_autonomy_admission.py +1098 -0
- package/md_cg/test_autonomy_modes.py +1972 -0
- package/md_cg/test_b1_auto_id_multiproc.py +7 -0
- package/md_cg/test_b1b2_write_face.py +7 -0
- package/md_cg/test_b3_merge_keeps_content.py +7 -0
- package/md_cg/test_cons200_scan_selection.py +791 -0
- package/md_cg/test_corrupt_utf8_read_surfaces.py +451 -0
- package/md_cg/test_generation_guard.py +15 -9
- package/md_cg/test_health_corrupt_utf8.py +37 -0
- package/md_cg/test_i50a_half_dup_defer.py +408 -0
- package/md_cg/test_i50b_defer_to_review_queue.py +545 -0
- package/md_cg/test_i50c_meta_passthrough.py +608 -0
- package/md_cg/test_i50d_importance_source.py +531 -0
- package/md_cg/test_i50e_readside_protection.py +656 -0
- package/md_cg/test_index_crossprocess_reload.py +39 -24
- package/md_cg/test_issue39_utf8_stdio.py +9 -1
- package/md_cg/test_issue52_scan_condition_first.py +677 -0
- package/md_cg/test_issue53_cipher_health_hash.py +385 -0
- package/md_cg/test_linkref.py +7 -0
- package/md_cg/test_mode_parity.py +1393 -0
- package/md_cg/test_mutation_rollback.py +805 -0
- package/md_cg/test_n204_n205_n226_n227_n228_n229_exit_gates.py +1 -1
- package/md_cg/test_n214_n215_n221_n222_write_face_gates.py +7 -0
- package/md_cg/test_p2_mcp.py +8 -0
- package/md_cg/test_p9_forget_protect.py +7 -0
- package/md_cg/test_p9c_dedup_hints.py +7 -0
- package/md_cg/test_policy_required_ccg.py +5 -1
- package/md_cg/test_protocol.py +7 -0
- package/md_cg/test_stgidx_index_parity.py +1020 -0
- package/md_cg/test_writelimit.py +36 -9
- package/md_cg/test_writepipe.py +5 -2
- package/md_cg/weights.py +15 -1
- package/md_cg/writepipe.py +101 -2
- package/package.json +1 -1
- package/skills/plugin.json +1 -1
- package/zcode/AGENTS.md +5 -5
|
@@ -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())
|
package/md_cg/routing.py
CHANGED
|
@@ -314,7 +314,7 @@ def bucket_health(counts: dict, total_nodes: int = None) -> dict:
|
|
|
314
314
|
# 巨桶/期望扫描两条在 nb==1 时只是同一事实的两种写法,合并为一条如实读数。
|
|
315
315
|
# expected_scan 的**数值**仍在返回 dict 里(下游读的是数:test_p0 :92、
|
|
316
316
|
# bench_axis_domain :159),只有文案不再把「未分区」说成「巨桶退化」。
|
|
317
|
-
problems.append(f"
|
|
317
|
+
problems.append(f"单桶:仅 1 个分桶({n} 个已分桶节点同桶),"
|
|
318
318
|
"条件路由本就不可用(从未分区,非分区退化)")
|
|
319
319
|
elif expected_scan > 0.30:
|
|
320
320
|
problems.append(f"路由无效:期望扫描 {expected_scan:.1%}(接近全量)")
|
|
@@ -417,5 +417,14 @@ def classify_text(text, limit: int = 400):
|
|
|
417
417
|
|
|
418
418
|
返回 None 表示「无有效域信号」——此时**不写** big_domain 字段,
|
|
419
419
|
该节点留在 ORPHAN/兜底池(S1 收敛时必须能被兜底召回,见契约 §3 S1 不变量)。
|
|
420
|
+
|
|
421
|
+
issue #53-A:密文(`<!-- mdcg-enc:v1:…`)恒无域信号——无密钥的读面会把
|
|
422
|
+
密文**原样**交到这里,base64 噪声会碰巧命中词表(实测唯一命中形态=「经济」:
|
|
423
|
+
词表里唯一的拉丁词 GDP 被 base64 三连子串撞上),且假标签会被 backfill 的
|
|
424
|
+
already 幂等分支永久固化。判据收在此**唯一致敏点**:节点侧全部调用方
|
|
425
|
+
(add 写入面、backfill 回填面)自动同覆盖,无需各自设防。
|
|
420
426
|
"""
|
|
427
|
+
from . import crypto # 延迟导入:routing 是底层模块,避免加载序耦合
|
|
428
|
+
if crypto.is_encrypted(text):
|
|
429
|
+
return None
|
|
421
430
|
return big_domain_classify(domain_terms(text, limit))
|