@furongjun1999/dsh-memory 0.7.3 → 0.7.5
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 +631 -629
- package/codebuddy/CODEBUDDY.md +5 -5
- package/docs/discipline/templates/zcode-user.md.tmpl +4 -1
- package/docs/eval//345/217/221/345/270/20312_/344/270/226/347/225/214/346/250/241/345/236/213/345/212/237/350/203/275/347/253/257_v1.0.md +108 -0
- package/docs/eval//345/217/221/345/270/20313_/344/270/212/344/270/213/346/226/207/350/207/252/347/256/241/347/220/206/346/234/272/345/210/266_v1.0.md +114 -0
- package/docs/eval//350/257/255/344/271/211/346/227/266/347/251/272/345/233/276/350/241/245/345/205/250_P1_/346/212/275/345/217/226/345/231/250v4_/344/270/211/347/216/207/350/257/273/346/225/260_v1.0.md +231 -0
- package/docs/mdcg//344/270/226/347/225/214/346/250/241/345/236/213/345/212/237/350/203/275/347/253/257_/344/275/277/347/224/250/344/270/216/350/277/220/347/273/264_v1.0.md +305 -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 +45 -43
- 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 +80 -1
- package/docs/plans//347/201/265/346/236/242/350/272/253/344/275/223/303/227/350/204/221_/344/270/226/347/225/214/346/250/241/345/236/213/345/257/271/346/216/245/350/256/276/350/256/241_v0.1.md +76 -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 +461 -461
- package/docs//350/256/260/345/277/206/347/263/273/347/273/237/345/215/263/347/231/275/347/256/261/345/214/226/346/231/272/350/203/275_/346/236/266/346/236/204/345/257/271/347/205/247_v0.2.md +121 -0
- package/docs//350/256/260/345/277/206/347/263/273/347/273/237/345/215/263/347/231/275/347/256/261/345/214/226/346/231/272/350/203/275_/346/236/266/346/236/204/345/257/271/347/205/247_v0.3.md +117 -0
- package/lib/hooks.d.ts +34 -0
- package/lib/hooks.js +205 -18
- package/lib/index.js +22 -1
- package/lib/lib/mdcg_client.d.ts +37 -0
- package/lib/lib/mdcg_client.js +44 -0
- package/lib/lib/session_state.d.ts +56 -0
- package/lib/lib/session_state.js +124 -0
- package/lib/tools.js +12 -1
- package/md_cg/audit.py +7 -1
- package/md_cg/bench_governance.py +4 -1
- package/md_cg/bench_locomo_zh.py +12 -2
- package/md_cg/bench_zh_mad.py +12 -2
- package/md_cg/interop.py +25 -9
- package/md_cg/lifecycle.py +38 -0
- package/md_cg/mcp_server.py +64 -11
- package/md_cg/mdcos.py +78 -9
- package/md_cg/sleep.py +223 -103
- package/md_cg/state_slots.py +221 -0
- package/md_cg/stg.py +68 -3
- package/md_cg/sustain.py +150 -4
- package/md_cg/test_lifecycle_retire_leak.py +408 -0
- package/md_cg/test_read_face_semantics.py +6 -3
- package/md_cg/test_state_event_op.py +514 -0
- package/md_cg/test_state_slots.py +691 -0
- package/md_cg/test_sustain_bounded.py +624 -0
- package/md_cg/tokens.py +8 -1
- package/md_cg/units.py +4 -1
- package/package.json +1 -1
- package/skills/plugin.json +1 -1
- package/src/hooks.ts +217 -17
- package/src/index.ts +22 -1
- package/src/lib/mdcg_client.ts +48 -0
- package/src/lib/session_state.ts +127 -0
- package/src/tools.ts +12 -1
- package/zcode/AGENTS.md +5 -5
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
# 世界模型功能端 · 使用与运维指南(v1.0)
|
|
2
|
+
|
|
3
|
+
> **这一页回答一件事:语义时空图「状态层」上线后,你怎么记账、怎么查、开关在哪、怎么复跑读数、边界到哪。**
|
|
4
|
+
> 依据:`docs/plans/语义时空图补全_世界模型功能端_设计_v0.1.md`(六签收点)与 `docs/秤_记忆系统评测规范_v2.1.md` §5.1(账本完整性口径)。
|
|
5
|
+
> 使用者定位(2026-10-06):「0.7.4 把世界模型,也就是语义时空图的地基打好。」本页对应 P3 批(写侧入口 + 账本完整性探针 + 使用文档)。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 一、一句话
|
|
10
|
+
|
|
11
|
+
**事件是源、槽位是投影、查询走 stg**:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
记账(写口) 台账(源) 投影(物化视图,查询时现算) 查询面
|
|
15
|
+
cg(op=state_event) → <root>/_state_events.jsonl → md_cg/state_slots.py → stg(op=state_chain)
|
|
16
|
+
(MCP 面) append-only、不截断 (只读台账、不落盘、不缓存) (默认关)
|
|
17
|
+
↘ CLI:python -m md_cg.state_slots
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
四个面各有单点真源,互不复制:写口只做权限/归一/落盘(`md_cg/mcp_server.py`),
|
|
21
|
+
台账只管追加(`md_cg/state_events.py`),投影只管回放(`md_cg/state_slots.py`),
|
|
22
|
+
查询面只管开关与返回体成形(`md_cg/stg.py`)。
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 二、台账(源)在哪、长什么样
|
|
27
|
+
|
|
28
|
+
| 项 | 内容 |
|
|
29
|
+
|---|---|
|
|
30
|
+
| 位置 | 库根下 `_state_events.jsonl`(与 `_recent.jsonl`、`_write_2pc.jsonl` 同级) |
|
|
31
|
+
| 性质 | **append-only**:只追加、不读改写、不截断(窗口滚动面 `_recent.jsonl` 不可作一等记录,故单立此账) |
|
|
32
|
+
| 一行一条 | `{t, subject, slot, old, new, kind, seq, evidence, actor}` |
|
|
33
|
+
| `kind` 五类 | `migration` 迁移 / `retraction` 撤回 / `enablement` 启用 / `acquisition` 获得 / `replacement` 替换;**未分类(None)合法** |
|
|
34
|
+
| 撤回语义 | `old` 有值、`new` 空 = 值作废、无新值;启用=old 空、new 有值;迁移/替换=皆有值 |
|
|
35
|
+
| 坏行 | 容忍 ≠ 静默:跳过时计数 + 有界样本 + stderr 告警(`state_events.BAD_ROWS` 可读) |
|
|
36
|
+
| 多进程 | 跨进程文件锁(`FileLock`),崩溃不留半截文件(flush+fsync) |
|
|
37
|
+
|
|
38
|
+
**记账不判语义**:`kind` 只是检索面标签,不进判据;「不是事实」的言语(玩笑/元层/回忆转述)
|
|
39
|
+
之消歧标记(`not_fact`)**不在本批**(见 §八 边界)。
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 三、写:MCP 记账口 `cg(op=state_event)`
|
|
44
|
+
|
|
45
|
+
### 用法
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
cg(op="state_event", subject="鲸娘", slot="住所",
|
|
49
|
+
old="别墅", new="小屋", kind="migration", seq=1108, evidence="r1108")
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
| 参数 | 必填 | 说明 |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| `subject` | 是 | 事件主体(谁的状态);去空白后为空即报错 |
|
|
55
|
+
| `slot` | 是 | 事件槽位(哪项状态);同上 |
|
|
56
|
+
| `old` / `new` | 至少一个 | 变更前/后值;**双空非法**(空事件无意义)。撤回=`new` 留空 |
|
|
57
|
+
| `kind` | 否 | 五类之一;缺省/空串/纯空白 → 归一为「未分类」(None);其它值报错 |
|
|
58
|
+
| `seq` | 否 | 轮或序号(回指语料位置用) |
|
|
59
|
+
| `evidence` | 否 | 出处(短证/轮号/文件路径皆可,回查用) |
|
|
60
|
+
|
|
61
|
+
返回体:`{"ok": true, "event": {…落盘记录…}}`(`event` 即 append 落盘的那一行)。
|
|
62
|
+
|
|
63
|
+
### 失败口径(fail-closed,不吞)
|
|
64
|
+
|
|
65
|
+
| 情形 | 结果 |
|
|
66
|
+
|---|---|
|
|
67
|
+
| 缺/空 `subject`、缺/空 `slot` | `ValueError`(点名缺哪项) |
|
|
68
|
+
| `old` 与 `new` 双空 | `ValueError` |
|
|
69
|
+
| `kind` 非法值 | `ValueError`(列出允许五类) |
|
|
70
|
+
|
|
71
|
+
以上都是**原样上抛**的 `ValueError`(不是包装过的错误),客户端按普通错误处置即可——
|
|
72
|
+
**失败即不落盘**。
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 四、读:投影与查询
|
|
77
|
+
|
|
78
|
+
### 1. 查询面 `stg(op=state_chain)`(默认关,见 §五)
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
stg(op="state_chain", subject="鲸娘", slot="住所", include_retired=true)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
返回体沿 stg 既有口径:`count`(条件命中总数,截断前)/ `items`(前 limit 条)/
|
|
85
|
+
`kept` / `truncated`。单元字段:
|
|
86
|
+
|
|
87
|
+
| 字段 | 语义 |
|
|
88
|
+
|---|---|
|
|
89
|
+
| `value` | 现值(撤回后为 null,直到下一个带值事件复活) |
|
|
90
|
+
| `state` | `active` / `retired`(**退役不删除**;缺省查询剔除 retired,`include_retired=true` 可见) |
|
|
91
|
+
| `t_from` / `t_to`、`seq_from` / `seq_to` | 生效区间与序号:`*_from` =最后产生当前值的事件;`*_to` =覆盖它的下一条事件(未被覆盖=null=仍有效/未闭合) |
|
|
92
|
+
| `tier` | 来源档位(台账行顶层 `tier` 透传;未带=`unspecified`,**不编造**) |
|
|
93
|
+
| `history` | 该槽位全部事件原样七字段(`t/seq/old/new/kind/evidence/actor`);`history=false` 时不带该键 |
|
|
94
|
+
| `alternatives` / `blindspots` | 结构在场、**恒空列表**(判定口径后置,见 §八) |
|
|
95
|
+
| `event_count` | 该槽位事件条数 |
|
|
96
|
+
|
|
97
|
+
**投影是物化视图不是第二真源**:查询时从台账现算,不落盘、不缓存——台账追加一条,
|
|
98
|
+
下一次查询结果即变。
|
|
99
|
+
|
|
100
|
+
### 2. CLI 人工入口(`md_cg.state_slots`,**恒可用**)
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
python -X utf8 -m md_cg.state_slots --status
|
|
104
|
+
python -X utf8 -m md_cg.state_slots --subject 鲸娘 [--slot 住所] [--include-retired] [--no-history]
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
数据根取 `MDCG_ROOT`(缺省走 `datapath.mdcg_root()`)。本 CLI 与 `MDCG_STG_STATE`
|
|
108
|
+
开关**无关**——那把开关管的是 MCP 读面;CLI 是只读人工排查入口(不改任何状态)。
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 五、开关
|
|
113
|
+
|
|
114
|
+
| 开关 | 缺省 | 管什么 |
|
|
115
|
+
|---|---|---|
|
|
116
|
+
| `MDCG_STG_STATE` | **关** | MCP 查询面 `stg(op=state_chain)`;关臂返回 `{"error": "disabled", "hint": …}`(**不是异常**——「没开」与「没命中」必须可分辨);与 `MDCG_STG_INDEX`/`MDCG_STG_QUALIFY` 同纪律 |
|
|
117
|
+
| (无开关) | — | `cg(op=state_event)` 记账口**恒可用**(受权限闸约束,见 §六);`md_cg.state_slots` CLI **恒可用** |
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 六、授权口径(与既有令牌面零新词)
|
|
122
|
+
|
|
123
|
+
- **`state_event` 走 `write` 词映射**:`cg` 面 op 作用域闸按 `write` 判定——
|
|
124
|
+
凡 `ops_allow` 白名单含 `write` 的角色(或用 `"*"` 的设计者令牌)可记账;
|
|
125
|
+
guest/只读令牌照拒。令牌面**不引入新 op 词**(角色白名单与派生收窄面零改动)。
|
|
126
|
+
- **`actor` 恒取令牌**(请求参数不生效):落盘 `actor` 永远是令牌身份(无令牌形态为
|
|
127
|
+
`"system"`)——客户端不得改写归属(沿本仓既有防伪造口径)。
|
|
128
|
+
- **写闸双保险**:台账是直写盘面的 append-only 文件、**绕过库层节点写闸**,故记账口
|
|
129
|
+
另显式补齐 `require_write("internal")`——`can_write` × `theory_ok` × 密级三态各自生效
|
|
130
|
+
(只读令牌、版本层校验未过、clearance 不足 internal 都会被拒且不落盘)。
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 七、读数与复跑:探针 + 守卫
|
|
135
|
+
|
|
136
|
+
### 1. 账本完整性探针(《秤》5.1 口径)
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
python -X utf8 scripts/probe_c_ledger_integrity.py \
|
|
140
|
+
--events %TEMP%/state_events.jsonl --expect-slots 住所,房贷,名字 \
|
|
141
|
+
[--out %TEMP%/probe_c_out]
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
| 读数 | 口径 |
|
|
145
|
+
|---|---|
|
|
146
|
+
| ① 事件覆盖缺口率 | `--expect-slots` 清单中「台账无任何记录」的槽位占比(分子/分母都打印) |
|
|
147
|
+
| ② 无账可辨率 | 对「无记录槽位」+固定合成不存在槽位查询 `state_chain`:`count==0 且 items==[]`(**不编造、不反推**)的通过比例 |
|
|
148
|
+
| ③ 变迁史可查率 | 有记录槽位中 `state_chain`(`include_retired=True`、`history=True`)返回的 history 条数合计 == 台账该槽位记录数 的比例 |
|
|
149
|
+
|
|
150
|
+
特性(硬性):只读输入;隔离 temp root(把 `--events` 拷为该 root 的
|
|
151
|
+
`_state_events.jsonl`)——**零记忆库写入**;`--out` 必须落在仓外(fail-closed);
|
|
152
|
+
**确定性**(同输入两次运行 stdout 与 `--out` 产物字节一致);
|
|
153
|
+
stdout 末行 `PROBE_C_LEDGER_JSON {...}` 摘要(机器可读),`--out` 时另落
|
|
154
|
+
`rates.json` + `probe_c_slots.jsonl`。
|
|
155
|
+
|
|
156
|
+
### 2. 写口守卫
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
python -X utf8 -m md_cg.test_state_event_op # 全链/双闸/防伪造/归一/校验/回归
|
|
160
|
+
python -X utf8 -m md_cg.test_state_event_op --mutate # 定点变异自证(每条机制必须能被断言钉红)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 八、边界(如实)
|
|
166
|
+
|
|
167
|
+
- `alternatives`(同期未决值)/ `blindspots`(声明缺口)判定口径**后置**:本批结构在场、
|
|
168
|
+
恒空列表,**不臆造填充**。
|
|
169
|
+
- 「不是事实」的言语(玩笑/元层/回忆转述)之**消歧标记**(`not_fact` 等)不在本批
|
|
170
|
+
(P1 事件行无该信号)。
|
|
171
|
+
- 探针只测**账本面**可辨性;**生成器级「无账强答」未测**——那需要接生成器侧读数,后置。
|
|
172
|
+
- 槽位按**标签面精确匹配**(slot 名相等),不做同义归并/模糊匹配。
|
|
173
|
+
- `state_chain` 无 `time_axis` 语义:台账事件行只有落账时间戳 `t`,无第二轴(**不伪造**);
|
|
174
|
+
需要轴语义请走 `stg` 的 timeline/relation/anchors。
|
|
175
|
+
- 单库=单台账:跨库/多租户合并不在此。
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 九、退役纪律:节点生命周期 `archived`(默认检索剔除)
|
|
180
|
+
|
|
181
|
+
> 《秤》v2.1 §5.2「退役纪律」口径的落地页。**先分清两个「退役」**(同名不同物):
|
|
182
|
+
|
|
183
|
+
| 说谁 | 字段 / 参数 | 谁管 |
|
|
184
|
+
|---|---|---|
|
|
185
|
+
| 台账**槽位单元**的生存态(§四) | 投影单元 `state` = `active`/`retired`,查询参数 `include_retired` | `md_cg/state_slots.py`(查询时现算) |
|
|
186
|
+
| **节点**(md 记忆条目)的归档态(本节) | frontmatter / 索引 `lifecycle_state` = `archived` | `md_cg/lifecycle.py` 状态机 + 读面剔除 |
|
|
187
|
+
|
|
188
|
+
### 1. 语义(写定,逐档可对拍)
|
|
189
|
+
|
|
190
|
+
| `lifecycle_state` | 默认读/注入面(检索面 · stg 面 · 会话续接包全段) | 说明 |
|
|
191
|
+
|---|---|---|
|
|
192
|
+
| `active`(**缺键或非法值同此**) | 参与 | fail-open:存量节点零迁移、不误剔 |
|
|
193
|
+
| `converged` | 参与 | **降权轴**(同构聚合定型),不是退役 |
|
|
194
|
+
| `demoted` | 参与 | **降权轴**(弱化),不是退役 |
|
|
195
|
+
| `archived` | **默认剔除** | 退役不删除:节点文件仍在、可显式恢复 |
|
|
196
|
+
|
|
197
|
+
### 2. 判据与落点(判据单点,三个消费面)
|
|
198
|
+
|
|
199
|
+
- 判据单点:`lifecycle.is_archived(e)`(`md_cg/lifecycle.py`)≡ `state_of(e) == "archived"`;
|
|
200
|
+
全部消费点共同引用,不各写一份口径。
|
|
201
|
+
- 消费点 ①(**cg 检索面**):`MdCGOS._candidates`(`md_cg/mdcos.py`)——**检索类** cg 读 op
|
|
202
|
+
(`route` / `read` 的检索分支与 `budget_tokens` 预算召回分支 / `search` / `search_rrf` 及其
|
|
203
|
+
内含的 lexical·bucket·entity·graph·chain·temporal 各路)都经这一个候选池;
|
|
204
|
+
`MdCGSecure._candidates` 经 `super()` 在其上叠加读可见性,判据同源。
|
|
205
|
+
注意:cg 的读 op 并非全走候选池——见消费点 ③(会话续接面自持取数面)。
|
|
206
|
+
- 消费点 ②(**stg 扫描面**):`stg._scan_one`(`md_cg/stg.py`,`_scan` 的逐条实现单点)
|
|
207
|
+
——`timeline` / `anchors` / `consistency` 三 op 的候选面同点覆盖,索引子集
|
|
208
|
+
(`MDCG_STG_INDEX=1`)与全量遍历两条分支逐位一致。`relation` 是显式 id 直读、
|
|
209
|
+
`state_chain` 走台账,两者都不经候选面(不受本节约束)。
|
|
210
|
+
- 消费点 ③(**会话续接注入面**):`MdCGOS.session_recall`(`md_cg/mdcos.py`)的
|
|
211
|
+
**四个取数段**——会话要点 `_session_notes`、活跃目标 `goals`、任务台账 `tasks`、
|
|
212
|
+
未解问题 `unresolved`(`goals`/`tasks` 经 `_retired_by_id` 按 id 回查索引后交同一
|
|
213
|
+
判据)。`cg(op=session, action=recall)` 自持取数面(不经 `_candidates`),它把节点
|
|
214
|
+
内容装配成「续接包」回给调用方/注入上下文(=注入面),故同接本判据。台账两段
|
|
215
|
+
取**全量窗**(`_LEDGER_WINDOW`)过滤后截断 `_PACK_ROWS=5` 条,故退役剔除不会让
|
|
216
|
+
包「不足额」;`tasks.active_total/done_total` 随之取**剔除后**的全窗计数(与列表
|
|
217
|
+
同源自洽)。`recent` 段是事件窗口(非节点)、`self_state` 是只读快照卡,不涉退役。
|
|
218
|
+
(独立复核 2026-10-06 两轮实测:接线前 archived 要点摘要、未解问题正文、活跃目标
|
|
219
|
+
与任务卡均经该 op 照旧回出;现由守卫 R1.12/R1.13/R3.5/R3.6/R4.6 钉住。)
|
|
220
|
+
|
|
221
|
+
### 3. 不受限面(「退役不删除」的另一半)
|
|
222
|
+
|
|
223
|
+
- `cg.get(node_id)` 直读、`cg(op=audit)` 证据审计视图:archived 期间**照常可达**;
|
|
224
|
+
- 工程台账面(`goal` / `task`)与统计面(`health` / `whoami` / conformance):直读索引,
|
|
225
|
+
不受本节约束;
|
|
226
|
+
- **生命周期恢复**:库层入口 `MdCG.set_state(node, "archived"→"active")`
|
|
227
|
+
(`md_cg/mdcg.py:2619` → `lifecycle.set_state`,走合法迁移表、逐级不跳级);恢复后
|
|
228
|
+
读面/续接面重新可见。**MCP 工具面没有独立生命周期入口**(`mcp_server.py` 全文无
|
|
229
|
+
`set_state` / `lifecycle` 字样)——「显式恢复」是库层调用面。
|
|
230
|
+
- 与 `op=restore` 的区别(易混,写明):`op=restore` 是 `op=forget` 的 `action=restore`
|
|
231
|
+
→ `cg.restore`(`md_cg/mdcos.py:3029`)=把**已遗忘**(软删除进 `trash/`)的节点放回,
|
|
232
|
+
是**删除轴**,与生命周期状态机无关;且放回时 `lifecycle_state` 按新节点(`active`)
|
|
233
|
+
起判,`active→archived` 跳级被拒 ⇒ **不透传(落 `active`)**(既有行为,本轮未改)。
|
|
234
|
+
|
|
235
|
+
### 4. 复跑读数
|
|
236
|
+
|
|
237
|
+
```
|
|
238
|
+
python -X utf8 scripts/probe_d_retirement_discipline.py # 《秤》v2.1 §5.2 探针
|
|
239
|
+
python -X utf8 -m md_cg.test_lifecycle_retire_leak # 守卫 R1–R4
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
| 读数(`PROBE_D_JSON`) | 口径 | 目标(面计数,括号内为比率) |
|
|
243
|
+
|---|---|---|
|
|
244
|
+
| ① 退役泄漏率 | 退役后 v2 仍出现在查证面(读面 search∪recall、时空面 timeline∪anchors)的面数 / 面数 | `0/2`(0.0) |
|
|
245
|
+
| ② 更新采纳率 | v2 写入后可见的面数 / 面数(防「一刀切全滤」的反向缺陷) | `2/2`(1.0) |
|
|
246
|
+
| ③ 旧事实残留率 | 退役步之后 v1 仍可见的面数 / 面数(不连带误剔) | `2/2`(1.0) |
|
|
247
|
+
| ④ 失效误判证伪率 | 退役节点被错误置 falsified/rejected 的条数 / 退役节点数(退役 ≠ 证伪) | `0/1`(0.0) |
|
|
248
|
+
|
|
249
|
+
(探针人读行打印的就是**面计数**「n/分母(目标 m)」;上表与它同单位,比率为换算值。)
|
|
250
|
+
|
|
251
|
+
探针特性:隔离 temp root(零在役库写入)、纯 stdlib、无随机/无时间戳、
|
|
252
|
+
`--out` 必须落在仓外(fail-closed)、末行 `PROBE_D_JSON {...}`,**两遍运行 stdout 字节一致**。
|
|
253
|
+
|
|
254
|
+
### 5. 边界(如实)
|
|
255
|
+
|
|
256
|
+
- 只剔 `archived`。要让 `converged`/`demoted` 不参与,请走既有其他维度
|
|
257
|
+
(`role` / `view` / `layer` / `session` / `validity`)——不得把它们并进退役判据。
|
|
258
|
+
- 台账单元退役(§四 `retired`)与节点退役(本节 `archived`)**各自独立、互不联动**。
|
|
259
|
+
- **面的判据(写死,供后续接线照此归类)**:**默认读/注入面**=调用方给查询/意图/会话视图,
|
|
260
|
+
**节点集合由库自选**且结果直接回给调用方或注入上下文 ⇒ 必须消费 `is_archived`;
|
|
261
|
+
**定向/管理/统计面**=调用方给出**显式节点选择键**(`node_id` / `subject:*` 标签 / 前缀 /
|
|
262
|
+
层 / 状态)或面本身是诊断·统计·写面 ⇒ 直读,不受本节约束。
|
|
263
|
+
- 已接线消费面(3 处,4 子面):检索面 `_candidates`、stg 面 `_scan_one`、会话续接注入面
|
|
264
|
+
`session_recall` 的**全部四个取数段**(要点 `_session_notes` + 活跃目标 + 任务台账 +
|
|
265
|
+
未解问题;后两段经 `_retired_by_id` 按 id 判据)(§2)。
|
|
266
|
+
- **已枚举但归入「定向/管理/统计面」(不受限,逐条申报)**:`cg.get` 直读、`op=audit`
|
|
267
|
+
证据审计、**工程台账的显式管理查询面**(`cg(op=goal, action=list)` / `cg(op=task,
|
|
268
|
+
action=list)`——直读台账,archived 期间照样列出,守卫 R1.13c 钉住这一侧)、
|
|
269
|
+
`health`/`whoami`/`_role_counts`/`_sensitivity_counts`/`conformance`/`census`/`insight`
|
|
270
|
+
统计、`review_records` 审核记录、`export`/`evidence` 导出与证据面、`crosscheck`/
|
|
271
|
+
`ghostref`/`consistency` 诊断面、`backfill*`/`writelimit`/`freshness`/`forgetting`
|
|
272
|
+
维护写面、`mreview/govern` 治理面、白箱 KB 工具面。
|
|
273
|
+
**注意别与消费点 ③ 混读**:同一份 goal/task 台账,**注入面(续接包)剔除 archived、
|
|
274
|
+
管理查询面直读**——这不是矛盾,是判据两侧的分工(守卫同时钉住两侧:R1.13b 剔除、
|
|
275
|
+
R1.13c 直读)。
|
|
276
|
+
其中**会回内容且集合由库自选**的一个代表面如实点名:`identity.profile`
|
|
277
|
+
(`md_cg/identity.py:310`,按 `subject:<id>` 标签自选并回锚点正文摘录)——实测 archived
|
|
278
|
+
锚点仍回出(取证:`identity.profile` 返回的 `anchors[0].content` 含归档节点正文标记);
|
|
279
|
+
按上条判据它属**定向面**(`subject_id` 是显式选择键,与 `cg.get` 同族),故**本轮未接线**
|
|
280
|
+
(其文件不在本轮允许改动面内)。
|
|
281
|
+
- 已知未覆盖面(如实,**本轮不修**——均落在本轮允许改动面之外,须单独立项裁定):
|
|
282
|
+
- 基类 `MdCG.search`(`md_cg/mdcg.py:3677`):**plain `MdCG` 实例**(白箱 KB / 离线
|
|
283
|
+
脚本 / 测试)走的默认检索面未接本判据,archived 仍出现在其候选里(取证:同一
|
|
284
|
+
序列下 `MdCG` 实例 search 命中 `['a_v1','a_v2']`,`MdCGOS` 实例命中 `['a_v1']`);
|
|
285
|
+
MCP 工具面(`MdCGOS`/`MdCGSecure`)不受影响。
|
|
286
|
+
- **因果链/图面** `chain.adjacency`(`md_cg/chain.py:162`):以全部索引条目建出邻接表,
|
|
287
|
+
只过读可见性闸(`_chain_visible`)、无 lifecycle 判据——`cg(op=causal, action=chain,
|
|
288
|
+
node_id=<种子>)` 会**扩散**到 archived 节点(取证:链里出现已归档的 `b_tgt`);
|
|
289
|
+
检索面的 chain 路不受影响(其结果受 `_candidates` 的 entries 约束,守卫 R1.11 钉住)。
|
|
290
|
+
- **结构/拓扑面** `subgraph.children_index` / `parents_index`(`md_cg/subgraph.py:109` /
|
|
291
|
+
`:154`):同族 O(N) 结构索引,未接 lifecycle 判据(返回 id 映射、不回正文)。
|
|
292
|
+
- **rust 检索内核**(`rust/src/store.rs::load_index` + `engine.rs`):直读 `_index.json`
|
|
293
|
+
条目、自带检索实现,全目录 `lifecycle`/`archived` 零命中(无退役处理)。
|
|
294
|
+
- 跨进程一致性:判据只读**本进程索引条目**(`lifecycle_state` 由
|
|
295
|
+
`lifecycle._sync_index` 随迁移同步并落 `_index_log`),他进程刚归档、本进程索引
|
|
296
|
+
尚未重载的窗口内读数可能滞后(与 `lifecycle.set_state` 的既有落盘口径同源)。
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## 修订记录
|
|
301
|
+
|
|
302
|
+
| 日期 | 要点 |
|
|
303
|
+
|---|---|
|
|
304
|
+
| 2026-10-06 | v1.0 首版(P3 批):全链(台账→投影→查询→记账口→CLI→探针)/ 开关 `MDCG_STG_STATE` 默认关与 CLI 恒可用 / 授权口径(`state_event`→`write` 词映射,actor 恒取令牌)/ 探针三读数复跑命令 / 边界如实(§一–§八) |
|
|
305
|
+
| 2026-10-06 | 补 §九「退役纪律」:节点 `lifecycle_state=archived` 的默认检索剔除(判据单点 `lifecycle.is_archived`,消费面 `MdCGOS._candidates` + `stg._scan_one` + 会话续接注入面 `session_recall` 四段〔要点/活跃目标/任务台账/未解问题〕)/ 两套「退役」词义分界 / 不受限面(直读·审计·**台账管理查询面**·统计)与「生命周期恢复 ≠ `op=restore`(删除轴)」/ 《秤》5.2 探针四读数(面计数口径)与守卫复跑 / 边界如实(未覆盖面:基类 `MdCG.search`、因果链面 `chain.adjacency`、结构面 `subgraph`、rust 内核、定向面 `identity.profile`) |
|
|
@@ -37,47 +37,48 @@ MCP stdio:md_cg/mcp_server.py
|
|
|
37
37
|
|
|
38
38
|
<!-- FUNCMAP:BEGIN id=cg (scripts/cogmap_sync.py 自动生成 · 勿手改段内) -->
|
|
39
39
|
|
|
40
|
-
**认知基元 `cg` ·
|
|
40
|
+
**认知基元 `cg` · 38 个 op**(行号由本管线从真源自动提取,`check` 门禁守卫漂移):
|
|
41
41
|
|
|
42
42
|
| 功能 | 显式调用 | 代码位置(点击直达源码行) |
|
|
43
43
|
|---|---|---|
|
|
44
|
-
| 按需披露(投影后完整工具 / 参数文档即时取回) | `cg(op=help)` | [`help`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#
|
|
45
|
-
|
|
|
46
|
-
|
|
|
47
|
-
|
|
|
48
|
-
|
|
|
49
|
-
|
|
|
50
|
-
|
|
|
51
|
-
|
|
|
52
|
-
|
|
|
53
|
-
|
|
|
54
|
-
|
|
|
55
|
-
|
|
|
56
|
-
|
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
|
|
|
60
|
-
|
|
|
61
|
-
|
|
|
62
|
-
|
|
|
63
|
-
|
|
|
64
|
-
|
|
|
65
|
-
|
|
|
66
|
-
|
|
|
67
|
-
|
|
|
68
|
-
|
|
|
69
|
-
|
|
|
70
|
-
|
|
|
71
|
-
|
|
|
72
|
-
|
|
|
73
|
-
|
|
|
74
|
-
|
|
|
75
|
-
|
|
|
76
|
-
|
|
|
77
|
-
|
|
|
78
|
-
|
|
|
79
|
-
|
|
|
80
|
-
|
|
|
44
|
+
| 按需披露(投影后完整工具 / 参数文档即时取回) | `cg(op=help)` | [`help`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2125) → [`_help_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2043) |
|
|
45
|
+
| 状态事件记账(追加五元事件;查询走 stg(state_chain)) | `cg(op=state_event)` | [`state_event`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2452) |
|
|
46
|
+
| 验证态 / 双时间轴 / 履历(含冷路径队列;只读) | `cg(op=status)` | [`status`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2134) → [`_status_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1958) |
|
|
47
|
+
| 三元组反查(派生边任意端 / 谓词 / 时间反查;只读) | `cg(op=edges)` | [`edges`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2137) → [`_edges_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2014) |
|
|
48
|
+
| 理论检索(领域理论 / 方法论文) | `cg(op=theory)` | [`theory`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2140) → [`theory`](../../md_cg/theory.py) |
|
|
49
|
+
| 记忆互链(节点间链接管理) | `cg(op=link)` | [`link`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2157) → [`evidence`](../../md_cg/evidence.py) → [`links`](../../md_cg/links.py) → [`provenance`](../../md_cg/provenance.py) → [`security`](../../md_cg/security.py) → [`signer`](../../md_cg/signer.py) |
|
|
50
|
+
| 服务信息 / 健康 | `cg(op=info)` | [`info`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2273) → [`audit`](../../md_cg/audit.py) → [`generation`](../../md_cg/generation.py) → [`links`](../../md_cg/links.py) → [`nodefile`](../../md_cg/nodefile.py) → [`theory`](../../md_cg/theory.py) |
|
|
51
|
+
| 路由:意图→知识+建议能力 | `cg(op=route)` | [`route`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2314) |
|
|
52
|
+
| 读取(按 id / 召回 / 预算) | `cg(op=read)` | [`read`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2335) → [`refindex`](../../md_cg/refindex.py) |
|
|
53
|
+
| 证据审计视图(现值/出处链/两存备择/盲区/退役史;只读) | `cg(op=audit)` | [`audit`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2390) → [`auditview`](../../md_cg/auditview.py) |
|
|
54
|
+
| 写入(含冲突检测 / 闸门 / 审核) | `cg(op=write)` | [`write`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2410) → [`writepipe`](../../md_cg/writepipe.py) |
|
|
55
|
+
| 目标(写入 / 状态 / 清单) | `cg(op=goal)` | [`goal`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2418) |
|
|
56
|
+
| 任务实体(登记 / 计划 / 状态 / 结果;done 无结果拒收) | `cg(op=task)` | [`task`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2437) → [`_task_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2056) |
|
|
57
|
+
| 最近记忆(事件窗口) | `cg(op=recent)` | [`recent`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2440) |
|
|
58
|
+
| 外部裁决回填(节点证据验证) | `cg(op=verify)` | [`verify`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2472) |
|
|
59
|
+
| 审核队列(DEFER / 提案裁决) | `cg(op=review)` | [`review`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2477) |
|
|
60
|
+
| 主动遗忘 / 恢复 | `cg(op=forget)` | [`forget`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2498) |
|
|
61
|
+
| 保护(不可遗忘) | `cg(op=protect)` | [`protect`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2507) → [`_protect_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1253) |
|
|
62
|
+
| 身份维度 | `cg(op=identity)` | [`identity`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2510) → [`_identity_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1281) |
|
|
63
|
+
| 一致性检测 | `cg(op=consistency)` | [`consistency`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2513) → [`_consistency_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1332) |
|
|
64
|
+
| 元认知(盲区聚合) | `cg(op=metacognition)` | [`metacognition`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2516) → [`_metacognition_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1361) |
|
|
65
|
+
| 自我状态 | `cg(op=self_state)` | [`self_state`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2519) → [`_self_state_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1396) |
|
|
66
|
+
| 演化(记忆结构演化) | `cg(op=evolution)` | [`evolution`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2522) → [`_evolution_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1531) |
|
|
67
|
+
| 飞轮 / 自愈 | `cg(op=sustain)` | [`sustain`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2525) → [`_sustain_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1623) |
|
|
68
|
+
| 洗脑 / 去污染 | `cg(op=scrub)` | [`scrub`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2528) → [`_scrub_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1744) |
|
|
69
|
+
| 预测 / 因果门 | `cg(op=predict)` | [`predict`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2531) → [`_predict_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1458) |
|
|
70
|
+
| 因果链 | `cg(op=causal)` | [`causal`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2534) → [`_causal_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L1492) |
|
|
71
|
+
| 白箱能力库(AEIS 能力显式调用) | `cg(op=whitebox)` | [`whitebox`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2537) → [`_whitebox_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L3210) |
|
|
72
|
+
| 代码索引 | `cg(op=index_code)` | [`index_code`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2540) → [`refindex`](../../md_cg/refindex.py) → [`security`](../../md_cg/security.py) |
|
|
73
|
+
| 文档索引 | `cg(op=index_doc)` | [`index_doc`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2584) → [`refindex`](../../md_cg/refindex.py) → [`security`](../../md_cg/security.py) |
|
|
74
|
+
| 引用 / 反向引用 | `cg(op=ref)` | [`ref`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2627) → [`_ref_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L3110) |
|
|
75
|
+
| 会话管理(多会话归属与过滤) | `cg(op=session)` | [`session`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2630) → [`_session_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2831) |
|
|
76
|
+
| 导入落图 | `cg(op=ingest)` | [`ingest`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2633) → [`_ingest_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2910) |
|
|
77
|
+
| 导出 | `cg(op=export)` | [`export`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2636) → [`_export_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2935) |
|
|
78
|
+
| 维护 | `cg(op=maintain)` | [`maintain`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2639) → [`_maintain_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2957) |
|
|
79
|
+
| 记忆固化 / 整理 | `cg(op=consolidate)` | [`consolidate`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2642) → [`_consolidate_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L3035) |
|
|
80
|
+
| 洞察 / 自主探索(信息差驱动) | `cg(op=insight)` | [`insight`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2645) → [`_insight_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L3060) |
|
|
81
|
+
| CCG 六要素编译(对话→候选→编外复核→落库) | `cg(op=ccg)` | [`ccg`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2648) → [`_ccg_call`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L2655) |
|
|
81
82
|
|
|
82
83
|
<!-- FUNCMAP:END -->
|
|
83
84
|
|
|
@@ -92,14 +93,15 @@ MCP stdio:md_cg/mcp_server.py
|
|
|
92
93
|
|
|
93
94
|
<!-- FUNCMAP:BEGIN id=stg (scripts/cogmap_sync.py 自动生成 · 勿手改段内) -->
|
|
94
95
|
|
|
95
|
-
**语义时空基元 `stg` ·
|
|
96
|
+
**语义时空基元 `stg` · 5 个 op**:
|
|
96
97
|
|
|
97
98
|
| 功能 | 显式调用 | 代码位置(点击直达源码行) |
|
|
98
99
|
|---|---|---|
|
|
99
|
-
| 两节点关系 | `stg(op=relation)` | [`relation`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#
|
|
100
|
-
| 时间线 | `stg(op=timeline)` | [`timeline`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#
|
|
101
|
-
| 锚点检索(时空窗口) | `stg(op=anchors)` | [`anchors`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#
|
|
102
|
-
| 时空一致性 | `stg(op=consistency)` | [`consistency`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#
|
|
100
|
+
| 两节点关系 | `stg(op=relation)` | [`relation`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L3240) |
|
|
101
|
+
| 时间线 | `stg(op=timeline)` | [`timeline`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L3242) |
|
|
102
|
+
| 锚点检索(时空窗口) | `stg(op=anchors)` | [`anchors`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L3249) |
|
|
103
|
+
| 时空一致性 | `stg(op=consistency)` | [`consistency`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L3253) |
|
|
104
|
+
| 状态槽位投影(现值 / 区间 / 变迁史) | `stg(op=state_chain)` | [`state_chain`](https://github.com/FuRongJun-1999/dsh-memory/blob/main/md_cg/mcp_server.py#L3256) |
|
|
103
105
|
|
|
104
106
|
<!-- FUNCMAP:END -->
|
|
105
107
|
|
|
@@ -232,7 +232,7 @@ python -X utf8 -m md_cg.sleep --status # 只读:含 last_cycle(
|
|
|
232
232
|
对账的**并发闸**(物化时记下的 `baseline_face` 水位)逐项判「**主库优先**」、挂起不
|
|
233
233
|
自动解决(同 §三.4)。`source_face_delta` 与 `baseline_face` 两个读数**原样保留**。
|
|
234
234
|
|
|
235
|
-
### 3. 台账 skip
|
|
235
|
+
### 3. 台账 skip 文案分类,不再混成一句(v1.2 补「物化超时」一支)
|
|
236
236
|
|
|
237
237
|
②③④ 步的 `skipped` 现在明确区分「门拦」与「物化未完成」(CLI 的
|
|
238
238
|
`last_cycle.not_iterated_reason` 与 `--once` 打印的那一行**同源**,即下表文案本身):
|
|
@@ -242,6 +242,84 @@ python -X utf8 -m md_cg.sleep --status # 只读:含 last_cycle(
|
|
|
242
242
|
| `窗口外(MDCG_SLEEP_WINDOW=…;只记账不迭代)`/`MDCG_SLEEP=0(总开关关)`/`MDCG_SLEEP_MERGE=never(只记账不迭代)`/`稳态:盘点候选数为 0(只记账不动手)` | **门拦**:按设计不动手 |
|
|
243
243
|
| `物化未完成:根级锁被占(另一进程在周期内)`/`物化未完成:<error 摘要>` | **物化未完成**:想动手却没做成(取不到根级锁/影子未挂上) |
|
|
244
244
|
| `本轮未迭代` | `ledger_steps` 的**缺省兜底**(`run_cycle` 的三条路径都显式给文案,不落这条) |
|
|
245
|
+
| `物化超时:<error 摘要>` | **物化超时**(issue #63):git 子进程超时已被 kill——**操作没完成**,与「git 的裁决失败」分开(见 §十) |
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## 十、常驻循环的卡死防护与观测(v1.2 · issue #63)
|
|
250
|
+
|
|
251
|
+
> 这一节说明「循环卡住会怎样、怎么第一时间看出来、怎么处置」。三层无界
|
|
252
|
+
> (时间 / 输入 / 观测)在本批一并收口,读数与处置全部落在**既有面**上。
|
|
253
|
+
|
|
254
|
+
### 1. 三层无界,三处消灭
|
|
255
|
+
|
|
256
|
+
`SustainLoop._run()` 是**单线程串行六档**(心跳 → 自愈 → 自净 → 演化 → 整理 →
|
|
257
|
+
睡眠):任一档**无界阻塞**,整条循环停摆(issue #63 实测停 **9.5 小时**:六档
|
|
258
|
+
全停、`loop.state=dead`、心跳年龄无限增长)。三层根因与修法:
|
|
259
|
+
|
|
260
|
+
| 层 | 根因(现场判据见 §十.4) | 修法 |
|
|
261
|
+
|---|---|---|
|
|
262
|
+
| ① 时间无界 | `sleep._git()` 调 git **无 `timeout=`**——子进程无界等待 | `timeout=_GIT_TIMEOUT_S`(**120s**,模块常量单点可调):超时即 kill |
|
|
263
|
+
| ② 输入无界 | 同处**未指定 `stdin`** ⇒ 子进程**继承父进程 stdin**——DSH 常驻宿主的 **JSON-RPC 活管道**(不写入也不关闭) | `stdin=subprocess.DEVNULL`:读 stdin 的子进程立即 EOF(先例形态 `md_cg/run_tests.py:105`) |
|
|
264
|
+
| ③ 观测无界 | tick 台账在 `run_cycle` **返回后**才写 ⇒ 卡住期间 `phases` 为空,外部读不到卡在哪档 | 六档进 / 出各刷**既有心跳戳**:`current_tick` / `last_tick_done` / `last_tick_error`,另给 `stale_tick` 告警 |
|
|
265
|
+
|
|
266
|
+
**超时语义(可区分)**:git 超时抛 `SleepGitTimeout`(`SleepError` 子类),消息含
|
|
267
|
+
「git … 超时(120s)已被 kill」+ 命令名;它与 git 的 rc≠0 失败
|
|
268
|
+
(`git … 失败: <stderr>`)是**两条**文案面。物化档的台账文案同样分两支:
|
|
269
|
+
`物化超时:…` vs `物化未完成:…`(issue #60 的 mat_fail 文案族续)。
|
|
270
|
+
|
|
271
|
+
### 2. 读数:`cg(op=sustain, action=status)` 新增进度四字段
|
|
272
|
+
|
|
273
|
+
| 字段 | 含义 | 读法 |
|
|
274
|
+
|---|---|---|
|
|
275
|
+
| `current_tick` | 此刻正在跑的档:`{name, started_at, pid}` + `running_s`(已运行秒数);空闲为 `null` | 卡住时这一条直接回答「卡在哪档、多久了」 |
|
|
276
|
+
| `last_tick_done` | 上一档完成读数:`{name, t, ok}`(`ok=false` = 该档抛了异常) | 与 `last_tick_error` 配套看失败态 |
|
|
277
|
+
| `last_tick_error` | 最近一次档内异常:`{name, t, error: 类名+摘要}`——**容忍 ≠ 静默**(六档异常一律记入此处;由**单点包装**实现,`_run` 的六档 try/except 形态逐字未改——既有守卫 `md_cg/test_sleep_p1.py` G3a 把它钉死) | 非 null 即至少有一档在报错 |
|
|
278
|
+
| `stale_tick` | 告警:`current_tick` 年龄 > `max(2×该档 interval, 1800s)` 时给出 `{tick, age_s, limit_s, alert}`(alert 含档名与已运行时长) | 非 null = **疑似卡死** |
|
|
279
|
+
|
|
280
|
+
写点即**既有心跳戳**(`<net_dir>/heartbeat.<name>.stamp`)——不新增状态文件;
|
|
281
|
+
每档**进入时**就刷一次(卡住场景下「没有下一次写」是常态,所以必须在进入时
|
|
282
|
+
落盘),退出时清 `current_tick` 并记 `last_tick_done`。同进程读内存、跨进程
|
|
283
|
+
回落戳内字段。
|
|
284
|
+
|
|
285
|
+
### 3. 处置:`stale_tick` 报出来之后怎么办
|
|
286
|
+
|
|
287
|
+
`stale_tick` **只告警、不杀线程**(线程不可安全强杀;强杀会留下半截写)。
|
|
288
|
+
处置 = **人工重启常驻进程**(宿主侧重启 serve / 重新拉起灵枢插件);重启后从
|
|
289
|
+
心跳戳与 `<state_root>/sleep/_sleep.jsonl` 台账接着看。
|
|
290
|
+
|
|
291
|
+
**残留锁(已知边界,如实记)**:git 子进程被 kill 后可能留下 `index.lock`
|
|
292
|
+
——本模块**不自动删**(可能是他进程的锁,误删更糟)。超时消息里会点名
|
|
293
|
+
`<git_dir>/index.lock`;后续 git 操作报 lock 时,**人工核对无他进程在用后核删**。
|
|
294
|
+
是否加自动清理:待裁(见 issue #63 台账)。
|
|
295
|
+
|
|
296
|
+
### 4. issue #63 的现场判据(四条,引录)
|
|
297
|
+
|
|
298
|
+
1. **停摆形态**:六档全停(心跳 / 自愈 / 巡检 / 演化 / 整理 / 睡眠),
|
|
299
|
+
`loop.state=dead`、心跳年龄无限增长——单线程串行的放大效应。
|
|
300
|
+
2. **时间无界**:`sleep._git()` 无 `timeout=`——子进程无界等待。
|
|
301
|
+
3. **输入无界(受控复现)**:父 stdin 为「活管道(不写入不关闭)」时,读 stdin
|
|
302
|
+
的子进程 **6 秒后仍悬挂(poll=None)**;`stdin=DEVNULL` 时 **0.02s 立即 EOF
|
|
303
|
+
返回**。
|
|
304
|
+
4. **观测无界**:tick 台账 / `phases` 在 `run_cycle` 返回后才写 ⇒ 卡住期间外部
|
|
305
|
+
**无法知道卡在哪档**(`phases` 空)。
|
|
306
|
+
|
|
307
|
+
### 5. 同批加固面(常驻可达面之外)
|
|
308
|
+
|
|
309
|
+
`md_cg/interop.py`(git add/commit)· `md_cg/audit.py`(test_cmd)·
|
|
310
|
+
`md_cg/units.py`(tasklist)· `md_cg/bench_locomo_zh.py` / `md_cg/bench_zh_mad.py`
|
|
311
|
+
(评测跑批,1800s)· `md_cg/bench_governance.py`(git rev-parse)统一补
|
|
312
|
+
`timeout=` + `stdin=subprocess.DEVNULL`;`md_cg/whitebox.py` 的 Popen 是
|
|
313
|
+
**长驻对话协议面**(stdin=PIPE 与后端持续对话),**不在加固面**(申报理由)。
|
|
314
|
+
|
|
315
|
+
### 6. 守卫
|
|
316
|
+
|
|
317
|
+
`python -X utf8 -m md_cg.test_sustain_bounded`(T1 参数面 / T2 真超时有界 /
|
|
318
|
+
T3 循环续走回归 / T4 进度面 / T5 审计面)+ `--mutate` 定点变异自证
|
|
319
|
+
(删 `timeout=` / 删 `stdin=DEVNULL` / 删进入写点 / 删 `last_tick_error`
|
|
320
|
+
四条,每条必须转红;「红项」一律取**本轮自身**计数)+ `--mutate --null`
|
|
321
|
+
空转检出对照(new==old 的无害变异必须判 MISS——钉住「拿累计值当本轮红项」
|
|
322
|
+
一类判据失效通道)。
|
|
245
323
|
|
|
246
324
|
---
|
|
247
325
|
|
|
@@ -249,5 +327,6 @@ python -X utf8 -m md_cg.sleep --status # 只读:含 last_cycle(
|
|
|
249
327
|
|
|
250
328
|
| 日期 | 要点 |
|
|
251
329
|
|---|---|
|
|
330
|
+
| 2026-10-06 | **v1.2**(issue #63):常驻循环三层无界收口——①`sleep._git` 加 `timeout=120s` + `stdin=subprocess.DEVNULL`(超时抛 `SleepGitTimeout`,与 rc≠0 失败文案分开、物化超时另支文案)②六档进/出刷既有心跳戳(`current_tick` / `last_tick_done` / `last_tick_error`)+ `stale_tick` 告警(只上报不杀线程,处置=人工重启)③同批加固 interop / audit / units / bench×3(whitebox Popen 不在加固面)——见 §十 |
|
|
252
331
|
| 2026-10-06 | **v1.1**(issue #60/#61):①物化 `ok` 拆为「物化成功」+ `face_stable` 读数,**物化成功即迭代**(真源面漂移交并发闸、主库优先)②新增手动入口 `--once` / `--once --dry-run`(零落盘预览)与 `--status` 的 `last_cycle` 读数 ③台账 skip 文案区分「门拦」与「物化未完成」——见 §三.5 / §四 / §六 / §九 |
|
|
253
332
|
| 2026-10-01 | v1.0 首版:版本库位置 / 维护动作(看历史·看改动·只 revert 的回退·冲突挂起)/ 开关与自动边界 / P2·P4 发版披露(§一–§八) |
|