@furongjun1999/dsh-memory 0.7.4 → 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.
Files changed (30) hide show
  1. package/README.md +631 -630
  2. package/codebuddy/CODEBUDDY.md +5 -5
  3. package/docs/discipline/templates/zcode-user.md.tmpl +4 -1
  4. 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 +1 -1
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. package/lib/hooks.d.ts +34 -0
  12. package/lib/hooks.js +165 -0
  13. package/lib/index.js +22 -1
  14. package/lib/lib/mdcg_client.d.ts +37 -0
  15. package/lib/lib/mdcg_client.js +44 -0
  16. package/md_cg/audit.py +7 -1
  17. package/md_cg/bench_governance.py +4 -1
  18. package/md_cg/bench_locomo_zh.py +12 -2
  19. package/md_cg/bench_zh_mad.py +12 -2
  20. package/md_cg/interop.py +25 -9
  21. package/md_cg/sleep.py +223 -103
  22. package/md_cg/sustain.py +150 -4
  23. package/md_cg/test_sustain_bounded.py +624 -0
  24. package/md_cg/units.py +4 -1
  25. package/package.json +1 -1
  26. package/skills/plugin.json +1 -1
  27. package/src/hooks.ts +177 -0
  28. package/src/index.ts +22 -1
  29. package/src/lib/mdcg_client.ts +48 -0
  30. package/zcode/AGENTS.md +5 -5
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 本文件由 `scripts/render_discipline.py` 从真源
4
4
  > `docs/工作纪律_认知图条目_v1.1.json` 渲染生成,**请勿手改**;改真源后重跑渲染。
5
- > 真源指纹(SHA256 前16位):e8c979edba52de41
5
+ > 真源指纹(SHA256 前16位):9486668b0dadac39
6
6
 
7
7
  ## 概述
8
8
 
@@ -128,7 +128,7 @@
128
128
  ### 16. 任务收尾归档(记忆闭环)
129
129
 
130
130
  - **触发**:任务执行完成|修改落地后|交付后
131
- - **动作**:任务收尾→提炼核心修改(内容/原因/位置/验证结论四要素, 不写中间过程/试错/调试/重复确认)→按 CCG 六要素成文(# 功能名/# 生效条件/# 子功能/# 执行/# 验证方式/# 不适用条件 六行缺一不可, 与正文四要素并置)→写入灵枢记忆(认知图/MCP memory)——text 类缺要素即被写入闸门拒(REJECT, 当场返回缺失清单, 不是重试无用), 按清单补齐后重写即可→读回确认(写入后发起一次读取查询确认写入成功且可检索)→标注关联条目+更新 subgraph/depends_on
131
+ - **动作**:任务收尾→提炼核心修改(内容/原因/位置/验证结论四要素, 不写中间过程/试错/调试/重复确认)→按 CCG 六要素成文(# 功能名/# 生效条件/# 子功能/# 执行/# 验证方式/# 不适用条件 六行缺一不可, 与正文四要素并置)→写入灵枢记忆(认知图/MCP memory)——text 类缺要素即被写入闸门拒(REJECT, 当场返回缺失清单, 不是重试无用), 按清单补齐后重写即可→读回确认(写入后发起一次读取查询确认写入成功且可检索)→标注关联条目+更新 subgraph/depends_on; 长会话每10轮→同款间歇归档(写入+读回确认一次), 不等收尾
132
132
  - **不适用**:情感交互|闲聊|纯查询无改动
133
133
  - **声明**:按工作纪律第16条: 任务收尾归档——每次任务执行完只提炼核心修改(内容/原因/位置/验证结论)并按 CCG 六要素(功能名/生效条件/子功能/执行/验证方式/不适用条件)成文存入灵枢记忆(text 类六要素缺失会被写入闸门当场拒绝并返回缺失清单——补齐后重写即可, 不必等读回确认才发现), 写入后发起一次读取查询确认写入成功且可检索, 禁写中间过程/试错/调试等无效信息, 与第2条形成「查记忆→执行→写记忆→读回确认」闭环。
134
134
 
@@ -142,9 +142,9 @@
142
142
  ### 18. 工作区索引优先
143
143
 
144
144
  - **触发**:查找工作区文件|需要了解工作区结构|跨目录检索定位|长会话续接/上下文压缩后查找工作区文件
145
- - **动作**:定位工作区文件→先读 WORKSPACE_INDEX.md(仓根)→有则按表中职责/关键入口直接定位→无则先 python scripts/workspace_index.py --write 生成再读→守卫报陈化先重生成→不以重复全盘浏览代替; 新增顶层目录/根级文件须在脚本 DIR_ROLES/ROOT_FILES 登记后重生成; 上下文压缩/长会话续接后, 先 cg route『工作区索引』重建纪律视野(压缩会丢弃未留下执行痕迹的纪律, 只剩被声明过的条目——须主动召回)
145
+ - **动作**:定位工作区文件→先读 WORKSPACE_INDEX.md(仓根)→有则按表中职责/关键入口直接定位→无则先 python scripts/workspace_index.py --write 生成再读→守卫报陈化先重生成→不以重复全盘浏览代替; 新增顶层目录/根级文件须在脚本 DIR_ROLES/ROOT_FILES 登记后重生成; 上下文压缩/长会话续接后, 先 cg route『工作区索引』重建纪律视野(压缩会丢弃未留下执行痕迹的纪律, 只剩被声明过的条目——须主动召回); 压缩/续接后三步=route『工作区索引』→输出声明→回取本会话近10轮窗口重建上下文(cg(op=recent)/session_recall/会话 md 镜像)
146
146
  - **不适用**:已明确路径的单文件操作|纯会话内对话/问答(无文件查找)|仓外路径/系统路径(git 追踪面之外)
147
- - **声明**:按工作纪律第18条: 工作区索引优先——查工作区文件先读 WORKSPACE_INDEX.md(仓根, 管线生成); 无则先跑 scripts/workspace_index.py --write 生成再读, 不以重复全盘浏览代替。
147
+ - **声明**:按工作纪律第18条: 工作区索引优先——查工作区文件先读 WORKSPACE_INDEX.md(仓根, 管线生成); 无则先跑 scripts/workspace_index.py --write 生成再读, 不以重复全盘浏览代替。 压缩续接后并回取本会话窗口(最近10轮)重建上下文。
148
148
 
149
149
  ## 声明出口(`response.direct` 原文 · 未输出即未执行)
150
150
 
@@ -167,7 +167,7 @@
167
167
  | 15 | 按工作纪律第15条: 命令执行统一走python——argv列表+显式UTF-8+PYTHONUTF8=1, 不经Windows shell, 规避GBK解码异常。 另: 全仓文本与路径/文件名一律UTF-8(中文可进路径), 不做控制台兼容(取用走python, 控制台乱码属显示层)。 另: 公开面路径写相对路径——本机绝对路径以中性占位代(仓内 `<仓根>`/家目录 `~/`/临时 `%TEMP%`), 门禁 check_local_paths。 |
168
168
  | 16 | 按工作纪律第16条: 任务收尾归档——每次任务执行完只提炼核心修改(内容/原因/位置/验证结论)并按 CCG 六要素(功能名/生效条件/子功能/执行/验证方式/不适用条件)成文存入灵枢记忆(text 类六要素缺失会被写入闸门当场拒绝并返回缺失清单——补齐后重写即可, 不必等读回确认才发现), 写入后发起一次读取查询确认写入成功且可检索, 禁写中间过程/试错/调试等无效信息, 与第2条形成「查记忆→执行→写记忆→读回确认」闭环。 |
169
169
  | 17 | 按工作纪律第17条: 任务派发统一走蜂巢——任何执行性任务经蜂巢 spawn/submit 执行并留痕(spec/status/result), agent本体只做编排; 宿主自带subagent/team不是等价通道(zcode端的工作流工具为等效蜂巢工具——使用者2026-10-04裁定; 蜂巢功能完全完善之前, zcode端可优先使用zcode工作流处理), 兜底须声明。L1只读判定(产物落点=不改仓库/外部状态)可直跑, 须输出「L1 直跑:<命令> — 风险/频次/可逆性」留痕。 |
170
- | 18 | 按工作纪律第18条: 工作区索引优先——查工作区文件先读 WORKSPACE_INDEX.md(仓根, 管线生成); 无则先跑 scripts/workspace_index.py --write 生成再读, 不以重复全盘浏览代替。 |
170
+ | 18 | 按工作纪律第18条: 工作区索引优先——查工作区文件先读 WORKSPACE_INDEX.md(仓根, 管线生成); 无则先跑 scripts/workspace_index.py --write 生成再读, 不以重复全盘浏览代替。 压缩续接后并回取本会话窗口(最近10轮)重建上下文。 |
171
171
 
172
172
  ## 记忆接口速查(`cg` / `stg`)
173
173
 
@@ -8,6 +8,8 @@
8
8
 
9
9
  **会话起始第一件事——包含上下文压缩 / 长会话续接之后**:读该仓库的 `zcode/AGENTS.md`(18 条工作纪律 + 执行公约 + 声明出口表),并按其中的纪律执行。
10
10
 
11
+ **压缩 / 续接后的上下文重建三步**:①读纪律文件(上句)→ ②输出命中纪律的 `response.direct` 原文 → ③**回取本会话近 10 轮窗口重建上下文**(`cg(op=recent)` 或 `session_recall`;会话 md 镜像只留最后 10 条、超长优先遗忘最旧,由会话钩子每轮交互后自动维护),然后才动手。
12
+
11
13
  **怎么认出灵枢仓库(机器无关的特征文件法)**:自当前工作目录向上找到第一个**并存**以下四者的目录,那里就是仓根——`utf8_boot.py`、`WORKSPACE_INDEX.md`、`docs/工作纪律_认知图条目_v1.1.json`、`zcode/AGENTS.md`(四者同时在场即本仓;只看 `AGENTS.md` 会误认——本仓纪律产物落在子目录 `zcode/`,仓根另有本地私有件)。
12
14
 
13
15
  为什么需要这一步:`zcode/AGENTS.md` 位于仓库**子目录**,而 ZCode 的指令文件发现面是「用户级 `~/.zcode/AGENTS.md` + 工作区级 `<仓根>/AGENTS.md`,且工作区那份自 cwd **向上**搜到项目根」——向上搜索永远到不了子目录。因此它不会被自动注入;本文件(用户级)就是把它拉进上下文的那个钩子。
@@ -17,13 +19,14 @@
17
19
  - **0.1** 调 `cg(op=route, intent=<任务意图>)` 再动手,禁止跳过直接改码/跑命令。工具面若无 mdcg 工具,按第 7 条切等价兜底(进程内直调 `md_cg.mcp_server`)并声明降级,不得静默跳过。
18
20
  - **0.2** 命中纪律须在回复中输出该条 `response.direct` 原文(未声明即视为未执行)。**压缩只保留留下执行痕迹的条目——声明就是痕迹。**
19
21
  - **0.4 / 16** 违规即归档(第 4 条归因 + 第 16 条写入灵枢,六要素成文 + 读回确认);隐瞒违规是更严重的违规。
22
+ - **16(长会话节奏)** 每完成 10 轮交互做一次间歇归档(同款写入 + 读回确认一次),不等收尾;逢十轮由会话钩子自动提醒。
20
23
  - **8** 中文思考
21
24
  - **触发**:中文区域|中文项目开发过程
22
25
  - **动作**:判定复杂度(情绪: 新奇/挑战/曾受批评 + 信息差: 不确定度)→复杂?「我们需要」深思考+确认 | 简单?「让我」快速执行; 推理开篇即中文锚点; 全程中文, 仅代码/标识符/引用保留原文
23
26
  - **不适用**:需要英文编写的场景|英文环境|英文文档|国际接口
24
27
  - **声明**:按工作纪律第8条: 中文思考——中文书写; 复杂(新奇/挑战/曾受批评/高信息差)→「我们需要」交流确认互补盲区; 简单→「让我」快速执行不空耗; 每段推理开篇用中文短语锚定语言。
25
28
  - **17** 改状态类任务派发蜂巢并留痕;只读判定(跑门禁/测试/回归看结论)可直跑,须输出一行「L1 直跑:<命令> — 风险/频次/可逆性」。
26
- - **18** 查工作区文件先读仓根 `WORKSPACE_INDEX.md`,不以重复全盘浏览代替。
29
+ - **18** 查工作区文件先读仓根 `WORKSPACE_INDEX.md`,不以重复全盘浏览代替;**压缩续接后回取本会话近 10 轮窗口重建上下文**(见上文三步)。
27
30
 
28
31
  其它工作目录不受本段约束。
29
32
 
@@ -85,7 +85,7 @@
85
85
  | 本机门禁 | `npm run gate` **VERDICT=PASS**(11 腿,rc=0) |
86
86
  | E 盘空沙箱 | **VERDICT=PASS**(rc=0):空沙箱真装真握手——出货清单 1580 条目含 utf8_boot.py → `npm install` 装好 → 真启动 MCP 握手 `serverInfo.version=0.7.4`、`tools=[cg, stg]`;沙箱保留供复核 |
87
87
  | Linux 容器双栈 | **栈一 45 pass / 0 fail**(rust:bookworm `linux_verify.sh full`,含 12 项断言判别力自证与 smoke 22/0);**栈二 135 tests / pass 132 / fail 0 / skipped 3**(node:22-bookworm TS 套件) |
88
- | registry 回验 | 发布后执行 `check_publish_artifact --registry 0.7.4`(编排侧回验并回填) |
88
+ | registry 回验 | **VERDICT=PASS**(发布后轮询传播后实测):tarball 25,607,695 字节 / **1582 文件**与 registry fileCount 一致、R0 sha1/sha512 对拍通过、R1–R3/R5/R7 全过 |
89
89
 
90
90
  ## 七、复跑命令(中性占位路径)
91
91
 
@@ -0,0 +1,114 @@
1
+ # 发布 v0.7.5:上下文自管理机制(DSH 端 + zcode 端 + 系统提示词)+ issue #63 修复
2
+
3
+ > 版本 0.7.5 | 提交 `7475c2b5` 及其前 11 笔(本报告与版本递增为其后一笔)| 2026-10-06
4
+ > 前版 v0.7.4(世界模型功能端三批+DSH 会话归因治本)| 定位:「我们取代 zcode 成为管理上下文的 harness 组件」(使用者 2026-10-06)
5
+ > 下一版 0.8.0=与对外完整身体库 `FuRongJun-1999/lingshu` 组合、端到端可用(对接设计 v0.1 待签收)
6
+
7
+ ---
8
+
9
+ ## 一、本版范围(v0.7.4 → v0.7.5 共十二笔)
10
+
11
+ | 提交 | 内容 |
12
+ |---|---|
13
+ | `36654795` | **issue #63 修复**(批次117):常驻循环无界等待有界化+活体进度面 |
14
+ | `d291d826` | **批次118** DSH 端会话窗口:滑动沉淀+续接注入(两轨独立) |
15
+ | `c8f4d8ea` | **批次119** zcode 端同步器:会话库真人轮 → 灵枢运行态窗口(增量水位) |
16
+ | `dedef082` | **批次120** zcode 端三件:SessionStart 接续包钩子+全量 md 转写+doc_ref 索引 |
17
+ | `0ad463c7`/`ba31625a` | 白箱化理论 v0.2/v0.3 入库(文档,v0.3 为灵枢载体视角第三次迭代) |
18
+ | `b06f8f28` | 0.8.0 身体×脑:MCP 端到端冒烟固化(`scripts/body_e2e_smoke.py`)+对接设计 v0.1 |
19
+ | `717c6cb4` | **纪律真源修订**:压缩/续接三步重建+长会话每 10 轮间歇归档(8 端产物重渲染) |
20
+ | `9e02604d` | **批次121** zcode 窗口钩子:Stop 每轮镜像+UserPromptSubmit 压缩重建/逢十提醒 |
21
+ | `13762111` | 钩子去重补丁:SessionStart 注入后记压缩确认位(防 resume 双注入) |
22
+ | `7475c2b5` | 本机路径出门禁:转写/镜像根改动态解析(门禁第 11 腿抓出;另修一处 NameError 隐患) |
23
+ | `c26c1d2b` | 发布12 报告回填(0.7.4 registry 回验读数) |
24
+
25
+ ## 二、上下文自管理机制(核心)
26
+
27
+ ### 分层(一句话:注入取近 10,窗口滚 200,全文可回读)
28
+
29
+ | 层 | zcode 端 | DSH 端 |
30
+ |---|---|---|
31
+ | 注入面 | 近 10 轮窗口(SessionStart 接续包+UserPromptSubmit 压缩后重建) | 近 10 条(独立第二块注入,两轨独立) |
32
+ | 运行态窗口 | `_recent` 滚动 200 条(stop 每轮增量) | 同面(插件写入,真机验收) |
33
+ | 会话 md 镜像 | **只保留最近 10 轮**、超长优先遗忘最旧(Stop 钩子每轮刷新) | —(硬窗属身体侧会话引擎原生,0.8.0) |
34
+ | 完整原文 | 全量转写 md+`cg(op=ref)` 逐字节回读 | 宿主日志 |
35
+ | 纪律面 | 系统提示词三步(读纪律→输出声明→回取近 10 轮窗口)+每 10 轮间歇归档提醒 | — |
36
+
37
+ ### zcode 端三件钩子(各司其职,全部 fail-soft)
38
+
39
+ - **SessionStart**(startup/resume):增量同步+刷新镜像/转写 → 注入「灵枢接续包」(近 10 轮+在办任务/活跃目标/未解)。引擎侧语义已核实:每会话实例仅一次(`sessionStartHookRan` 闸)且本版本无 compact 触发点——压缩路径由提交面承担。
40
+ - **Stop**(每轮):静默维护三写(会话 md 镜像/全量转写/运行态窗口)。**刻意零输出**:引擎对 Stop 仅在 `decision=block` 时消费注入,普通输出无意义。
41
+ - **UserPromptSubmit**(每次提交前):①检测新压缩(`compact_summary` 结构性判据,不受正文提及污染)→ 注入重建包;②已完成轮数逢十 → 注入间歇归档提醒(同一轮数不重复,确认位落状态文件)。
42
+
43
+ ### 库根与预算(两处工程要害)
44
+
45
+ - **库根与 MCP 同源**:env `MDCG_ROOT` → zcode 配置 `mcp.servers.mdcg.env.MDCG_ROOT` → 缺省。修前缺省解析到 C 盘 profile 遗留库,与 MCP 实际服务的 AEIS 数据区库**分叉**(实测抓出,含历史误投清理+备份)。
46
+ - **注入预算 4000**:`session_recall` 默认 1200 在富库(未解 28 条+自我卡)下会把 recent 段**整段裁空**(实测 0 条);升 4000 后 recent=10 全保(实测 3050 tokens 内)。
47
+
48
+ ## 三、活体验收(重启后实测,2026-10-06)
49
+
50
+ | 面 | 读数 |
51
+ |---|---|
52
+ | SessionStart 注入 | 重启后首轮上下文出现「会话开始/压缩恢复」接续包段 |
53
+ | UserPromptSubmit 重建 | 同轮出现「检测到上下文压缩——重建近 10 轮窗口」段(预留的活体验收点被自然触发) |
54
+ | Stop 三写 | 会话 md 恰 10 轮(mtime 16:42:31)/转写追加 448 轮终版 +4.3KB/`_recent` 84 条 zcode-window、水位推进 |
55
+ | 逢十提醒 | 第 450 轮提交时**真实触发**(`win|` 确认位落盘 `last_reminded_turn=450`) |
56
+ | Stop 面复核 | 次轮核对:转写 mtime 16:49:20、末块=第 450 轮全文;`_recent` 88 条(尾部两轮齐全) |
57
+ | 双注入去重 | 修前 resume 场景双注入(约 3KB 重复)→ 确认位补丁后:SessionStart 注入 1608 字并写位,随后提交面**零输出** |
58
+
59
+ ## 四、实测抓出并修复的缺陷(诚实面)
60
+
61
+ 1. **双库分叉**(钩子缺省根 ≠ MCP 服务根):根解析改与配置同源;历史误投 200 行清理(备份在案)、转写按 DB 权威重建(水位回退)。
62
+ 2. **预算陷阱**(1200 裁空 recent):升 4000,富库实测保全。
63
+ 3. **resume 双注入**:`13762111` 确认位去重(复现→修复→复验链路齐)。
64
+ 4. **本机路径入追踪面**(门禁第 11 腿抓出 3 处):转写/镜像根改动态解析(env `MDCG_DATA_ROOT` → 库根父级 → 家目录兜底),**行为逐字等价断言通过**;顺带修 `--index` 分支裸名报错隐患。教训重申:**提交后必须复跑全量门禁**。
65
+
66
+ ## 五、issue #63 修复(批次117)
67
+
68
+ - 报告:常驻循环 `_git` 无界等待无超时 —— `Popen.wait()` 无 timeout,stdin 未隔离。
69
+ - 修复:`_git` 加 `timeout=120s`+`stdin=DEVNULL`;新增可区分的 `SleepGitTimeout` 异常;全库 subprocess 加固;活体进度面 `current_tick/stale_tick`。守卫 58 断言;回复已发(`issuecomment-6011170578`,线上回读 exact=True)。
70
+
71
+ ## 六、工程面读数(编排侧亲跑)
72
+
73
+ - python 全量 **356/356**(5 跳过)rc=0;npm test **143/0/1**。
74
+ - `npm run gate` **11 腿 VERDICT=PASS**(rc=0):含出货面冒烟(临时沙箱 pack→install→真握手 S1–S6)、R-7 rust 双腿(cargo 33 passed、rank_parity 两侧逐位一致 10/10)、本机路径门禁(追踪面零命中)。
75
+ - 纪律验证 10/10(真源指纹 `9486668b0dadac39`);工作区索引与仓库一致(追踪 2253 件)。
76
+
77
+ ## 七、边界与如实声明
78
+
79
+ - 钩子随**会话实例**装载:已验证(重启后实测);不装载的存量实例不生效(已如实入档)。
80
+ - 逢十提醒与压缩重建同为钩子面能力,依赖装载;提醒为提示性质,不强制。
81
+ - zcode 宿主无「截断历史」API——本版为**等价效果**(压缩瞬间接续+全量可回读);真·「只保留 10 条」硬窗属身体侧会话引擎原生能力(0.8.0)。
82
+ - 0.8.0 对接设计 v0.1 四条待裁:适配器归属/3D 坐标方案/tag 过滤读/smoke 进门禁。
83
+ - 同一压缩的首次重建注入在「resume+首提示」场景曾双发,已由确认位去重修复。
84
+
85
+ ## 八、发布三关(发布时点实测)
86
+
87
+ | 关 | 读数 |
88
+ |---|---|
89
+ | 本机门禁 | `npm run gate` **VERDICT=PASS**(11 腿,rc=0) |
90
+ | 出货面冒烟 | **VERDICT=PASS**:临时沙箱 pack→install→真握手(initialize→serverInfo;tools/list == ['cg','stg'];装后含 `utf8_boot.py`) |
91
+ | Linux 容器双栈 | 栈一 rust:bookworm(`linux_verify.sh full`)**45 pass / 0 fail**(含红基线判别力自证;smoke 22/0);栈二 node:22-bookworm(TS 套件)**144 tests / pass 141 / fail 0 / skipped 3** |
92
+ | registry 回验 | 发布后由使用者 publish → 编排侧轮询回验(VERDICT 读数回填) |
93
+
94
+ ## 九、复跑命令(中性占位路径)
95
+
96
+ ```bash
97
+ # 全量
98
+ python -X utf8 scripts/run_tests.py --jobs 4
99
+ cmd /c "npm test"
100
+ cmd /c "npm run gate"
101
+
102
+ # 钩子手测(stdin 喂载荷;Stop 静默、提交面出注入 JSON)
103
+ echo '{"hookEventName":"Stop","sessionId":"<sid>"}' | python -X utf8 scripts/zcode_window_hook.py
104
+ echo '{"hookEventName":"UserPromptSubmit","sessionId":"<sid>"}' | python -X utf8 scripts/zcode_window_hook.py
105
+ echo '{"sessionId":"<sid>"}' | python -X utf8 scripts/zcode_compact_hook.py
106
+
107
+ # 窗口镜像/转写单点
108
+ python -X utf8 scripts/sync_zcode_session.py --dry-run
109
+ python -X utf8 scripts/export_zcode_transcript.py
110
+ ```
111
+
112
+ ---
113
+
114
+ *本报告 v1.0 · 2026-10-06 · 编排侧编制;容器读数于发布三关节收录*
@@ -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 发版披露(§一–§八) |
@@ -0,0 +1,76 @@
1
+ # 灵枢「身体 × 脑」世界模型对接设计 v0.1
2
+
3
+ > 任务来源:使用者 2026-10-06「0.8.0 版本工作就是和之前的身体核心组合。让世界模型真正端到端可用。」
4
+ > 三步流程:**测试验证成功 → 脱敏 → 全部公开**(本稿完成第一步并出读数)。
5
+ > 状态:v0.1 未签收;本稿**不改一行码**(smoke 件为已验收验证工具,见 §一)。
6
+
7
+ ---
8
+
9
+ ## 一、测试验证读数(第一步已达成)
10
+
11
+ | 验证 | 内容 | 读数 |
12
+ |---|---|---|
13
+ | V1 身体包冒烟 | `lingshu` 包导入(python 3.12.10) | core 零依赖 ✓ · world(numpy 2.5.3)✓ · gen ✓ |
14
+ | V1b 既有连接 | `tools/coggraph/view_memory.py` 七步在当前库重跑 | rc=0、203s、**20135 节点**/5918 显式边/78685 推导边/4 会话链;只读真源、产物仓外 |
15
+ | V3 世界模型端到端 | 身体侧进程 → MCP stdio → 脑(v0.7.4) | 握手 ✓ → **写口 25/25 入账** → **查询 11 槽位**(含 2 退役、区间/变迁史全对);隔离库 |
16
+ | **固化件** | `scripts/body_e2e_smoke.py`(本仓) | 内置样本 3/3→2 槽位 ✓ · 真实事件 25/25→11 槽位 ✓(两遍 VERDICT=PASS,可复跑) |
17
+
18
+ ## 二、对接面盘点(读码级)
19
+
20
+ ### 2.1 身体侧(`lingshu/world` 24 件)关键面
21
+
22
+ - **`scene_model.py`=「语义时空图 ↔ 3D 场景绑定层」**——天然对接件:
23
+ - store 协议:`get_nodes_by_tag(tag, limit)`(读);节点带 `tags`(`spatial`+`cat:<类>`+`ent:<名>`)、`spatial_coordinates {x,y,z}`(米)、`state_attributes {"state": …}`;`ingest_scene` 写路径。
24
+ - `load_world_from_memory(store)`=世界重建("记忆即缓存:场景=记忆节点的实时投影")——**理念与脑侧「事件是源、槽位是投影」同构**。
25
+ - `semantic_anchor_graph.py`:3D 语义锚点图(节点=类别+坐标;边=关系;"事物是其关系的总和")。
26
+ - `seven_layer_loop.py`:感知→记忆→理解→预测→验证→物理→决策("记忆"层即对接位)。
27
+ - `spacetime_consistency / anchored_verification / anchor_verify`:时空一致性、锚定分级验证(多感知通道)。
28
+
29
+ ### 2.2 脑侧(本仓)对应面
30
+
31
+ - `stg` 五 op(`timeline / anchors[2D bbox] / consistency / relation / state_chain`);
32
+ - `state_events` 台账 + `state_slots` 投影 + `cg(op=state_event)` 写口 + 两个《秤》探针;
33
+ - MCP 面(V3 smoke 已证跨进程全链)。
34
+
35
+ ### 2.3 映射表与缺口
36
+
37
+ | 身体侧约定 | 脑侧对应 | 状态 |
38
+ |---|---|---|
39
+ | tags:`spatial` / `cat:` / `ent:` | 节点 tags(写侧可带) | 写 ✓;**读侧缺 tag 过滤维(缺口①)** |
40
+ | `spatial_coordinates {x,y,z}`(米) | `frontmatter.spatial.bbox`=2D 图像坐标四元组 | **缺口②:3D↔2D 方案待裁**(见 §四.2) |
41
+ | `state_attributes.state`(每实体状态) | **槽位寄存器**(subject=实体/slot=state/value)+状态事件台账 | **✓ 同构,直接对接**(世界模型的"状态追踪"=本版新地基:记账→台账→投影) |
42
+ | `ingest_scene` 写 | `cg(op=state_event)` / `mdcg_remember`(经 MCP,已证) | ✓ |
43
+ | `load_world_from_memory` 读 | 需"按 tag 读+坐标取回"的组合 | **缺口①③:标签过滤读;场景整体重建的组合接口** |
44
+
45
+ ## 三、最小闭环(两条路线)
46
+
47
+ - **M1(读向·身体重建世界)**:给 `scene_model` 提供"**脑版 store**"(实现 `get_nodes_by_tag` /
48
+ `state_attributes` 等 → 经 MCP `cg` 读+台账投影取值)→ `load_world_from_memory` 零改动直接以脑为底。
49
+ - **M2(写向·身体观测入脑)**:`ingest_scene` 的写落到 `cg(op=state_event)`(状态变迁)+场景节点
50
+ (坐标入库)→ 由脑的投影/查询供任意端消费(**smoke 已证全链**)。
51
+
52
+ 两条路线共用同一验证工具:`python -X utf8 scripts/body_e2e_smoke.py`(隔离库、零在役写入、退出码判据)。
53
+
54
+ ## 四、待裁清单(请逐条裁决)
55
+
56
+ 1. **适配器归属侧**:身体侧件(`lingshu/world/brain_store.py`,聚合仓工具面)vs 脑侧件(本仓)。
57
+ 推荐:**身体侧适配器**——章程口径"脑为包依赖、身侧件进身仓",且 `scene_model` 零改动即插。
58
+ 2. **3D 坐标方案**:推荐 **`spatial.coords3d` 自定义键直存米制+可选 bbox 投影**(不改既有
59
+ `spatial.bbox` 的 2D 语义、stg 四 op 零位移);不建议扩 bbox 为 3D(破坏既有语义)。
60
+ 3. **tag 过滤读(缺口①)**:脑侧给 `read/search` 加 tag 维(小活,进脑)vs 适配器侧读后过滤
61
+ (零脑改、性能略差)。推荐:**先适配器侧**(探针验证后再决定是否进脑)。
62
+ 4. **smoke 进门禁**:是否把 `scripts/body_e2e_smoke.py` 纳入发布链附加腿(与《秤》探针同列)。
63
+
64
+ ## 五、边界
65
+
66
+ - 不改 `scene_model` 既有语义(适配层在 store 接口外侧);不动在役库(smoke 全隔离);
67
+ 身体件入聚合仓走章程双清单与 `docs/intake/` 登记;脑侧改动一律走本仓批次纪律(守卫+变异+门禁)。
68
+
69
+ ## 六、三步位置
70
+
71
+ **测试验证 ✓(§一)** → 脱敏(readiness 扫描已 CLEAN;正式步骤=组合件入库时过双清单并登记)→
72
+ 全部公开(转公开时机属使用者操作;公开前终检清单可随时编制)。
73
+
74
+ ---
75
+
76
+ *v0.1 · 2026-10-06 · 编排侧编制(读码:身体侧 scene_model/semantic_anchor_graph/seven_layer_loop 等;脑侧 stg/state_slots)*