@furongjun1999/dsh-memory 0.7.2 → 0.7.3
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 +56 -47
- package/codebuddy/CODEBUDDY.md +6 -6
- package/docs/README.md +148 -144
- package/docs/discipline/harnesses.yaml +16 -8
- package/docs/discipline/templates/zcode-user.md.tmpl +49 -0
- package/docs/eval/AGI/344/270/203/347/273/264/350/257/204/345/210/206/346/212/245/345/221/212_/345/205/255/345/256/266/350/256/260/345/277/206/347/263/273/347/273/237/345/220/214/345/260/272/345/256/236/346/265/213_v3.1.md +340 -0
- package/docs/eval/N225_/347/264/242/345/274/225/346/227/245/345/277/227/351/235/236/345/257/271/350/261/241/350/243/205/350/275/275/351/235/242/347/261/273/345/236/213/351/227/270_v1.0.md +2 -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 +1 -1
- 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 +1 -1
- package/docs/eval/issue43_/351/273/230/350/256/244/347/255/226/347/225/245/344/270/216/351/224/256/347/261/273/345/236/213/351/227/270_v1.1.md +1 -1
- package/docs/eval/issue43_/351/273/230/350/256/244/347/255/226/347/225/245/345/212/240/350/275/275/344/270/216/345/207/255/346/215/256/346/230/216/346/226/207/351/230/237/345/210/227_v1.0.md +2 -2
- 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 +5 -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 +9 -9
- 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 +4 -4
- 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 +1 -1
- 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 +1 -1
- 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 +3 -3
- 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 +3 -3
- 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 +7 -7
- package/docs/eval//344/274/230/345/214/226/347/254/254/344/270/200/346/211/271_/346/216/245/347/272/277/344/270/216/347/255/211/344/273/267/345/217/230/346/215/242_v1.0.md +2 -2
- package/docs/eval//344/274/230/345/214/226/347/254/254/344/270/211/346/211/271_/351/227/250/347/246/201/350/275/254/346/255/243/344/270/216/350/260/203/345/272/246/346/255/242/350/241/200/344/270/216/351/227/250/346/216/247/346/224/266/345/217/243_v1.0.md +1 -1
- package/docs/eval//344/274/230/345/214/226/347/254/254/344/272/214/346/211/271_/344/276/235/350/265/226/351/200/217/344/274/240/344/270/216/345/257/271/346/213/215/345/217/243/345/276/204/344/270/216/350/264/237/347/274/223/345/255/230_v1.0.md +7 -7
- 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 +10 -10
- package/docs/eval//345/217/221/345/270/20307_/345/244/226/351/203/250/346/212/245/345/221/212/345/233/233/346/211/271/344/277/256/345/244/215/344/270/216/346/217/222/344/273/266/351/235/242/345/212/240/345/233/272_v1.0.md +4 -0
- 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 +1 -1
- package/docs/eval//345/217/221/345/270/20311_/345/244/226/346/212/245/345/205/255/350/277/236/344/277/256/344/270/216/344/270/226/347/225/214/346/250/241/345/236/213/345/272/225/345/272/247_v1.0.md +91 -0
- 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 +2 -2
- package/docs/eval//347/224/250/346/210/267/350/243/201/345/206/263/345/244/204/347/275/256_/347/254/254/344/270/200/346/211/271_v1.0.md +195 -0
- package/docs/eval//347/224/250/346/210/267/350/243/201/345/206/263/345/244/204/347/275/256_/347/254/254/344/272/214/346/211/271B6_/346/234/254/346/234/272/350/267/257/345/276/204/347/233/270/345/257/271/345/214/226_v1.0.md +78 -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 +1 -1
- 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 +3 -3
- 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 +1 -1
- package/docs/eval//347/274/226/347/240/201/351/235/242/345/211/215/347/275/256_/345/205/245/345/217/243/350/207/252/344/277/235/350/257/201UTF8/344/270/216/346/226/207/346/234/254open/345/256/210/345/215/253_v1.0.md +1 -1
- 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_v26.md +196 -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_v27.md +259 -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_v28.md +217 -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_v29.md +270 -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_v30.md +231 -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_v31.md +281 -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 +1 -1
- package/docs/hive//350/234/202/345/267/242M6_ingest/345/256/236/346/226/275/350/256/241/345/210/222_v0.1.md +1 -1
- 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 +1 -1
- package/docs/hive//350/234/202/345/267/242/350/256/276/350/256/241_/347/220/206/350/256/272/345/257/271/351/275/220_v0.1.md +17 -17
- package/docs/hive//350/234/202/345/267/242/350/277/255/344/273/243_/345/256/217/350/247/202/344/270/216/347/276/244/344/275/223/350/260/203/345/272/246_v0.1.md +1 -1
- package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +2 -2
- 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 +42 -41
- package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +29 -8
- 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 +71 -1
- package/docs/plans//345/205/250/344/270/255/346/226/207/347/274/226/347/240/201/344/270/216/350/234/202/345/267/242/344/273/273/345/212/241/346/240/207/350/257/206/345/245/221/347/272/246_v2.0.md +1 -1
- package/docs/plans//345/244/232/344/270/273/344/275/223/344/270/226/347/225/214/346/250/241/345/236/213_/345/257/271/351/275/220/350/257/204/344/274/260/344/270/216/350/220/275/345/234/260/350/256/276/350/256/241_v0.1.md +141 -0
- 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 +2 -2
- package/docs/plans//350/257/255/344/271/211/346/227/266/347/251/272/345/233/276/350/241/245/345/205/250_/344/270/226/347/225/214/346/250/241/345/236/213/345/212/237/350/203/275/347/253/257_/350/256/276/350/256/241_v0.1.md +107 -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 +6 -5
- package/docs//347/247/244_/350/256/260/345/277/206/347/263/273/347/273/237/350/257/204/346/265/213/350/247/204/350/214/203_v2.1.md +225 -0
- package/dsh/cordis-patch-profile-web.example.yml +2 -2
- package/lib/bridge.js +9 -0
- package/lib/hooks.d.ts +8 -1
- package/lib/hooks.js +94 -32
- package/lib/lib/hook_audit.d.ts +55 -0
- package/lib/lib/hook_audit.js +208 -0
- package/lib/lib/mutual.js +5 -1
- package/lib/lib/roleplay_web.js +17 -2
- package/md_cg/auditview.py +248 -0
- package/md_cg/bench_e2e_judge.py +4 -2
- package/md_cg/branches.py +29 -3
- package/md_cg/consistency.py +38 -13
- package/md_cg/datapath.py +38 -11
- package/md_cg/forgetting.py +15 -2
- package/md_cg/freshness.py +32 -11
- package/md_cg/ghostref.py +130 -0
- package/md_cg/judgment_manifest.py +7 -0
- package/md_cg/mcp_server.py +58 -1
- package/md_cg/mdcg.py +4923 -4822
- package/md_cg/mdcos.py +31 -12
- package/md_cg/nodefile.py +77 -13
- package/md_cg/readcache.py +29 -4
- package/md_cg/selfreport.py +12 -3
- package/md_cg/sleep.py +129 -13
- package/md_cg/sources.py +1 -1
- package/md_cg/state_events.py +131 -0
- package/md_cg/sustain.py +1436 -1436
- package/md_cg/test_auditview.py +277 -0
- package/md_cg/test_autonomy_modes.py +2 -1
- package/md_cg/test_boot_openblas_guard.py +197 -0
- package/md_cg/test_ccg_form_parity.py +95 -4
- package/md_cg/test_cons200_scan_selection.py +4 -2
- package/md_cg/test_datapath_device_name.py +62 -3
- package/md_cg/test_generation_guard.py +5 -2
- package/md_cg/test_ghostref.py +182 -0
- package/md_cg/test_interop.py +1 -1
- package/md_cg/test_issue52_scan_condition_first.py +1 -1
- package/md_cg/test_lock.py +16 -7
- package/md_cg/test_m3_h9_semantic_guard.py +1 -1
- package/md_cg/test_n230_dirty_replay.py +375 -375
- package/md_cg/test_n238_body_text_parity.py +156 -0
- package/md_cg/test_n276_probe_hoist.py +199 -0
- package/md_cg/test_p4_freshness.py +95 -1
- package/md_cg/test_policy_required_ccg.py +3 -1
- package/md_cg/test_readcache_prodpath.py +66 -0
- package/md_cg/test_sleep.py +58 -1
- package/md_cg/test_sleep_p1.py +218 -2
- package/md_cg/test_state_events.py +178 -0
- package/md_cg/test_time_core_lint.py +8 -1
- package/md_cg/test_writepipe.py +8 -5
- package/md_cg/tokens.py +11 -2
- package/md_cg/writepipe.py +76 -0
- package/package.json +2 -2
- package/skills/plugin.json +1 -1
- package/src/bridge.ts +9 -0
- package/src/hooks.ts +576 -517
- package/src/lib/hook_audit.ts +243 -0
- package/src/lib/mutual.ts +5 -1
- package/src/lib/roleplay_web.ts +17 -2
- package/zcode/AGENTS.md +6 -6
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""状态事件账本(append-only)——多主体世界模型 L0「事件必记账」的最小承载。
|
|
3
|
+
|
|
4
|
+
背景(对齐评估 v0.1,§2 L0):CD-WHALE-01(鲸娘语料 731 轮)的六类缺陷全部落在
|
|
5
|
+
「迁移/撤回/启用/来源」四个**状态操作**上(属性记得住、状态记不住);CTP-P5
|
|
6
|
+
回放的敏感性边界一证明「现行侧若只有状态陈述(T2)而无事件记录(T1),设施回滚
|
|
7
|
+
只能判 DEFER」——故「事件必记账」是状态链(基线→变更→后续引用)与退役/否定
|
|
8
|
+
语义的前置(跨切纪律 1)。
|
|
9
|
+
|
|
10
|
+
设计约束(对齐评估 v0.1 复核修订后的口径):
|
|
11
|
+
· **append-only**:`_recent.jsonl` 为窗口滚动面(`DEFAULT_RECENT_WINDOW=200`,
|
|
12
|
+
`roll_recent` 超限即截断),不可作一等记录;本账本只追加、不读改写、不截断。
|
|
13
|
+
· **单一真源**:事件是源、槽位现值是投影(未来 L2 寄存器由本账本物化;
|
|
14
|
+
落盘位置与 `_evolution` 台账/审计同级:`<root>/_state_events.jsonl`)。
|
|
15
|
+
· **五元结构**:主体 subject / 槽位 slot / 旧值 old → 新值 new / 轮或序号
|
|
16
|
+
seq / 出处 evidence(+ kind 五类变迁事件 + actor 断言者 + t 时间戳)。
|
|
17
|
+
|
|
18
|
+
KINDS 五类对齐《角色扮演一致性锚调研 v0.1》§3.4「变迁事件」:
|
|
19
|
+
迁移 migration / 撤回 retraction / 启用 enablement / 购买获得 acquisition /
|
|
20
|
+
替换 replacement。「撤回」语义:old 有值而 new 为空(值作废、无新值);
|
|
21
|
+
「启用」:old 空而 new 有值;「迁移/替换」:old 与 new 皆有值。
|
|
22
|
+
分类本身不进判据(记账不判语义),只作检索面标签。
|
|
23
|
+
"""
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
import json
|
|
27
|
+
import os
|
|
28
|
+
import sys
|
|
29
|
+
import time
|
|
30
|
+
|
|
31
|
+
from .fsutil import FileLock
|
|
32
|
+
|
|
33
|
+
#: 账本文件名(库根下,与 `_recent.jsonl`/`_write_2pc.jsonl` 同级)。
|
|
34
|
+
STATE_EVENTS_NAME = "_state_events.jsonl"
|
|
35
|
+
|
|
36
|
+
#: 五类变迁事件(角色扮演一致性锚调研 v0.1 §3.4)。
|
|
37
|
+
KINDS = ("migration", "retraction", "enablement", "acquisition", "replacement")
|
|
38
|
+
|
|
39
|
+
#: 坏行容忍记账(容忍 ≠ 静默——本仓 N225 已确立的判据:跳过要可观测)。
|
|
40
|
+
BAD_ROWS = 0 # 累计**跳过动作次数**(同一坏行每次 read 均计一次;非按行去重)
|
|
41
|
+
_BAD_ROW_SAMPLES = [] # 有界样本:(行号, 行首 80 字符, 异常类型名)
|
|
42
|
+
_BAD_ROW_SAMPLE_CAP = 8
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _note_bad_row(lineno: int, line: str, exc: Exception):
|
|
46
|
+
global BAD_ROWS
|
|
47
|
+
BAD_ROWS += 1
|
|
48
|
+
if len(_BAD_ROW_SAMPLES) < _BAD_ROW_SAMPLE_CAP:
|
|
49
|
+
_BAD_ROW_SAMPLES.append((lineno, line[:80], type(exc).__name__))
|
|
50
|
+
sys.stderr.write(
|
|
51
|
+
f"[state_events] 跳过坏行(第 {lineno} 行,累计 {BAD_ROWS}):"
|
|
52
|
+
f"{type(exc).__name__}: {exc}\n")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# 生效条件:cg 可解析出 root 时,返回 os.path.join(cg.root, STATE_EVENTS_NAME)。
|
|
56
|
+
def ledger_path(cg) -> str:
|
|
57
|
+
return os.path.join(cg.root, STATE_EVENTS_NAME)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
# 生效条件:subject 与 slot 去空白后必须非空(否则 ValueError);kind 非 None 时必须属于
|
|
61
|
+
# KINDS(否则 ValueError);old 与 new 不得同时为 None(否则 ValueError);通过后在
|
|
62
|
+
# FileLock(ledger_path) 内以追加模式写一行 JSON(ensure_ascii=False,flush+fsync),
|
|
63
|
+
# 返回落盘记录 dict(不改任何既有文件、不读改写、不截断)。
|
|
64
|
+
def append(cg, subject, slot, old=None, new=None, kind=None, seq=None,
|
|
65
|
+
evidence="", actor="", extra=None) -> dict:
|
|
66
|
+
"""追加一条状态事件(append-only;跨进程锁;崩溃不留半截文件)。"""
|
|
67
|
+
sub = str(subject or "").strip()
|
|
68
|
+
sl = str(slot or "").strip()
|
|
69
|
+
if not sub:
|
|
70
|
+
raise ValueError("状态事件必须声明主体(subject)")
|
|
71
|
+
if not sl:
|
|
72
|
+
raise ValueError("状态事件必须声明槽位(slot)")
|
|
73
|
+
if kind is not None and kind not in KINDS:
|
|
74
|
+
raise ValueError(f"未知变迁事件类型:{kind}(允许:{KINDS})")
|
|
75
|
+
if old is None and new is None:
|
|
76
|
+
raise ValueError("状态事件 old 与 new 不能同时为空(空事件无意义)")
|
|
77
|
+
rec = {
|
|
78
|
+
"t": time.time(),
|
|
79
|
+
"subject": sub,
|
|
80
|
+
"slot": sl,
|
|
81
|
+
"old": old,
|
|
82
|
+
"new": new,
|
|
83
|
+
"kind": kind,
|
|
84
|
+
"seq": seq,
|
|
85
|
+
"evidence": str(evidence or ""),
|
|
86
|
+
"actor": str(actor or ""),
|
|
87
|
+
}
|
|
88
|
+
if extra:
|
|
89
|
+
rec.update(extra)
|
|
90
|
+
p = ledger_path(cg)
|
|
91
|
+
os.makedirs(os.path.dirname(p) or ".", exist_ok=True)
|
|
92
|
+
with FileLock(p):
|
|
93
|
+
with open(p, "a", encoding="utf-8") as f:
|
|
94
|
+
f.write(json.dumps(rec, ensure_ascii=False) + "\n")
|
|
95
|
+
f.flush()
|
|
96
|
+
os.fsync(f.fileno())
|
|
97
|
+
return rec
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
# 生效条件:ledger_path 不存在时返回 [];存在时逐行 json.loads(空行跳过;非对象载荷或
|
|
101
|
+
# JSON 解析失败按坏行处置——计数+有界样本+stderr 告警后跳过,不中断读);subject/slot/kind
|
|
102
|
+
# **非 None** 时按对应字段过滤(空串亦为合法过滤值,2026-10-05 复核口径钉正);limit 为
|
|
103
|
+
# 真值时只保留最后 limit 条;返回记录列表(落盘序)。
|
|
104
|
+
def read(cg, subject=None, slot=None, kind=None, limit=0) -> list:
|
|
105
|
+
"""读回(可按 subject/slot/kind 过滤;limit=0 不截断)。坏行跳过并记账。"""
|
|
106
|
+
p = ledger_path(cg)
|
|
107
|
+
out = []
|
|
108
|
+
if not os.path.exists(p):
|
|
109
|
+
return out
|
|
110
|
+
with open(p, encoding="utf-8", errors="replace") as f:
|
|
111
|
+
for i, line in enumerate(f, 1):
|
|
112
|
+
line = line.strip()
|
|
113
|
+
if not line:
|
|
114
|
+
continue
|
|
115
|
+
try:
|
|
116
|
+
rec = json.loads(line)
|
|
117
|
+
if not isinstance(rec, dict):
|
|
118
|
+
raise ValueError("行载荷非对象")
|
|
119
|
+
except Exception as e: # noqa: BLE001 —— 容忍≠静默:记账后跳过
|
|
120
|
+
_note_bad_row(i, line, e)
|
|
121
|
+
continue
|
|
122
|
+
if subject is not None and rec.get("subject") != subject:
|
|
123
|
+
continue
|
|
124
|
+
if slot is not None and rec.get("slot") != slot:
|
|
125
|
+
continue
|
|
126
|
+
if kind is not None and rec.get("kind") != kind:
|
|
127
|
+
continue
|
|
128
|
+
out.append(rec)
|
|
129
|
+
if limit:
|
|
130
|
+
out = out[-int(limit):]
|
|
131
|
+
return out
|