@a9i5k4/dsh-auto-memory 2.5.3 → 3.0.0

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 (104) hide show
  1. package/README.md +171 -1
  2. package/README.zh-CN.md +171 -1
  3. package/docs/CONTRIBUTORS.html +471 -0
  4. package/docs/HANDOFF-CRITERIA.md +92 -0
  5. package/docs/INTEGRATION-ANALYSIS.md +350 -348
  6. package/docs/USER-GUIDE.en.md +56 -1
  7. package/docs/USER-GUIDE.zh-CN.md +57 -2
  8. package/docs/internal/ACCEPT-35-LIVE.md +143 -0
  9. package/docs/internal/ACCEPTANCE-20260914.md +90 -0
  10. package/docs/internal/ARCH-REVIEW-BRIEF.md +411 -0
  11. package/docs/internal/ARCH-REVIEW-REQUEST.md +201 -0
  12. package/docs/internal/ARCH-REVIEW-ROUND2.md +169 -0
  13. package/docs/internal/ARCH-REVIEW-ROUND3.md +206 -0
  14. package/docs/internal/AUDIT-WB-GRAPH-FULL-20260916.md +314 -0
  15. package/docs/internal/CONCURRENCY-INVESTIGATION-20260917.md +192 -0
  16. package/docs/internal/CROSS-SESSION-SEARCH-PATH-DECISION.md +72 -0
  17. package/docs/internal/CROSS-SESSION-SEARCH-RESEARCH.md +131 -0
  18. package/docs/internal/DECISIONS-20260914-SESSION.md +269 -0
  19. package/docs/internal/DESIGN-P1-STATE-COMMIT-20260915.md +219 -0
  20. package/docs/internal/DIRECTION-CHECK-WB-GRAPH-20260916.md +132 -0
  21. package/docs/internal/FEEDBACK-TO-DSHAPI-RELAY.md +13 -0
  22. package/docs/internal/GH-DISCUSSION-5732-COMMENT.md +74 -0
  23. package/docs/internal/GPT-ACCEPTANCE-PROMPT-20260916.md +352 -0
  24. package/docs/internal/GPT-REVIEW-PROMPT.md +216 -0
  25. package/docs/internal/GROUP-WEBHOOK-SETUP.md +33 -0
  26. package/docs/internal/KICKOFF-P0.md +254 -0
  27. package/docs/internal/MASTER-PLAN-3.0.md +411 -0
  28. package/docs/internal/MEMORY-MUTATION-AND-INDEX-DESIGN.md +85 -0
  29. package/docs/internal/MERGE-CONFLICT-SCAN-20260914.md +222 -0
  30. package/docs/internal/PENDING-FIXES-20260916.md +289 -0
  31. package/docs/internal/RAG-KARPATHY-PROGRAM.md +229 -0
  32. package/docs/internal/REPORT-P0-NIGHTLY.md +212 -0
  33. package/docs/internal/REPORT-P5-ACCEPTANCE.md +31 -0
  34. package/docs/internal/REPORT-WB-GRAPH-NIGHTLY.md +153 -0
  35. package/docs/internal/REVIEW-WB-GRAPH-SELF.md +81 -0
  36. package/docs/internal/ROADMAP-20260917-WEEK.md +305 -0
  37. package/docs/internal/ROADMAP.md +106 -0
  38. package/docs/internal/RUN-P0-NIGHTLY.md +227 -0
  39. package/docs/internal/S10-CONSTRUCTION-HANDOFF-20260917.md +175 -0
  40. package/docs/internal/S10-GAPS-PLAIN-20260917.md +125 -0
  41. package/docs/internal/SEMANTIC-ARCHITECTURE-SPEC.md +360 -0
  42. package/docs/internal/SESSION-FILE-REPAIR-PROTOCOL.md +90 -0
  43. package/docs/internal/THREE-LAYER-CONTRACT.md +210 -0
  44. package/docs/internal/TODO-BACKLOG.md +263 -142
  45. package/docs/internal/TODO-GRAPH.html +715 -0
  46. package/docs/internal/TODO-GRAPH.html.bak-20260914-v2 +493 -0
  47. package/docs/internal/TODO-GRAPH.html.bak-20260915-alsfix +710 -0
  48. package/docs/internal/TODO-GRAPH.html.bak-20260915-p1 +710 -0
  49. package/docs/internal/TODO-GRAPH.html.bak-20260915-p6a-rev +703 -0
  50. package/docs/internal/TODO-GRAPH.html.bak-20260915-wshint +710 -0
  51. package/docs/internal/TODO-GRAPH.html.bak-20260916-batch +715 -0
  52. package/docs/internal/WB-FORMAT-CONVENTION.md +112 -0
  53. package/docs/internal/WB-GRAPH-DECISIONS-20260914.md +71 -0
  54. package/docs/internal/reviews/CLAIM-VERIFICATION-20260914.md +56 -0
  55. package/docs/internal/reviews/PLAN-gpt6astra-round2-20260914.md +787 -0
  56. package/docs/internal/reviews/REVIEW-gpt6astra-20260914.md +112 -0
  57. package/docs/internal/reviews/ROUND3-REVIEW-INTEGRATION-20260914.md +230 -0
  58. package/docs/prompts/M8-3-enable-verify.md +49 -49
  59. package/lib/acceptance.js +71 -0
  60. package/lib/activation-host.js +90 -9
  61. package/lib/activation-inbox.js +25 -7
  62. package/lib/board-mode.js +30 -0
  63. package/lib/client.js +878 -75
  64. package/lib/context-bridge.js +2 -2
  65. package/lib/context-host.js +70 -6
  66. package/lib/engine-identity.js +149 -0
  67. package/lib/engine-switch.js +247 -0
  68. package/lib/episodic-store.js +11 -10
  69. package/lib/evidence-store.js +2 -2
  70. package/lib/fact-store.js +1 -1
  71. package/lib/fs-retry.js +46 -0
  72. package/lib/index.js +1987 -153
  73. package/lib/intent-clean-safe.js +40 -0
  74. package/lib/intent-clean.js +12 -16
  75. package/lib/l0-extract.js +263 -149
  76. package/lib/l0-index-sync.js +195 -0
  77. package/lib/l0-index.js +349 -239
  78. package/lib/ledger-criteria.js +142 -0
  79. package/lib/m7-index-sync-host.js +65 -4
  80. package/lib/m7-wire.js +3 -3
  81. package/lib/memory-anchor.js +56 -1
  82. package/lib/memory-envelope.js +252 -0
  83. package/lib/memory-hub.js +14 -4
  84. package/lib/memory-mutation.js +246 -0
  85. package/lib/memory-writer.js +204 -24
  86. package/lib/procedure-observation.js +48 -0
  87. package/lib/procedure-store.js +34 -17
  88. package/lib/python-setup.js +1 -1
  89. package/lib/rerank-host.js +160 -0
  90. package/lib/rules-layer.js +261 -0
  91. package/lib/semantic-js.js +15 -0
  92. package/lib/shadow-retrieval.js +3 -3
  93. package/lib/state-commit.js +245 -0
  94. package/lib/subagent-gc.js +4 -8
  95. package/lib/tier-layer-inject.js +650 -0
  96. package/lib/tier0-catalog.js +693 -0
  97. package/lib/water-window.js +263 -186
  98. package/lib/wb-contract.js +495 -0
  99. package/lib/wb-sidecar.js +839 -0
  100. package/lib/ws-overview-rank.js +2 -2
  101. package/package.json +1 -1
  102. package/python/m7_embedding_v1.py +5 -5
  103. package/python/worker_semantic_v1.py +17 -6
  104. package/python/worker_v1.py +38 -4
@@ -0,0 +1,216 @@
1
+ # GPT 全量测试任务书 · dsh-auto-memory「WB-GRAPH 白板线」改动审查
2
+
3
+ > 交付对象:一个具备文件读取与命令执行能力的 AI 审查者(GPT)。
4
+ > 你的角色:**独立第三方审查者**。不要相信作者的自述,一切以代码、配置、命令输出为准。
5
+ > 产出:一份可执行的缺陷报告 + 规划合规清单。**禁止修改任何代码/配置**(只读审查)。
6
+
7
+ ---
8
+
9
+ ## 0. 环境与边界(硬约束,务必遵守)
10
+
11
+ | 项 | 值 |
12
+ | --- | --- |
13
+ | 代码仓库(pre 开发线) | `D:\dsh-auto-memory` |
14
+ | 宿主插件主体 | `lib/index.js`(约 9800 行,单文件巨兽) |
15
+ | 浏览器半边 | `lib/client.js`(约 4700 行) |
16
+ | 用户配置文件(**只读,不要改**) | `C:\Users\JH Z\.dsh\dsh-auto-memory-pre.json` |
17
+ | 全量回归命令 | `cd D:\dsh-auto-memory && node tools/run-smoke.mjs` |
18
+ | 当前回归基线 | `PASS 95 / FAIL 0 / TIMEOUT 0 (145.4s)` |
19
+
20
+ **禁止事项**(违反即审查失败):
21
+ 1. 不要修改、创建、删除仓库内任何文件;不要改配置文件。
22
+ 2. **不要重启、停止任何 dsh 进程**(该进程承载审查者本体,杀它会中断审查)。不要执行 `Stop-Process` / `taskkill` / 任何按进程名批量杀进程的命令。
23
+ 3. 不要 `git commit` / `git push` / `npm publish`。
24
+ 4. 不要为"验证"而写入用户真实记忆目录(`C:\Users\JH Z\.dsh\memory\...`)——如需文件系统测试,只用系统临时目录。
25
+ 5. 允许:读文件、grep、跑测试命令、写临时脚本到系统临时目录后执行。
26
+
27
+ ---
28
+
29
+ ## 1. 项目背景(30 秒版)
30
+
31
+ `dsh-auto-memory` 是 DeepSeek Harness(DSH)的记忆插件。它有两条「白板线」形态:
32
+
33
+ - **旧版(legacy)**:白板 = `handoff/PLAN.md`(人可读全貌)+ `handoff/handoff-*.md`(四段式交接账本),纯 Markdown,无结构化索引。
34
+ - **新版(graph)**:引入 `boardMode` 开关,切换到 graph 档后应额外启用:① 结构化 sidecar 索引 `handoff/index.json`;② 两个遍历工具 `memory_expand_pre`(按 tag 正向展开)/ `memory_trace_pre`(按 id 反向回溯);③ 预留接入第三方看板插件 `dsh-graph`(已 vendor 到 `vendor/dsh-graph/`,**尚未接线**)。
35
+
36
+ **本窗口(2026-09-16 凌晨)新交付**,全部在未提交的 pre 线:
37
+
38
+ | 文件 | 性质 | 说明 |
39
+ | --- | --- | --- |
40
+ | `lib/board-mode-pre.js` | 新增 | 总开关解析:`legacy`(默认)/`graph`,非法值 fail-closed 回 legacy |
41
+ | `lib/wb-sidecar-pre.js` | 新增 | sidecar 纯函数:条目 id 派生、tag 提取、index 重建、expand/trace |
42
+ | `lib/ledger-criteria-pre.js` | 新增 | P1 判据对账 + 从 `wb-contract-pre.js` 转发再导出(单一真源) |
43
+ | `lib/index.js` | 修改 | `DEFAULT_CONFIG.boardMode='legacy'`;两咽喉挂 `writeSidecarEntryPre`;新增 `rebuildSidecarIndexPre` / `expandWhiteboardByTagPre` / `traceWhiteboardByIdPre`;条件注册 2 个新工具 |
44
+ | `lib/client.js` | 修改 | 设置页双按钮 + 接续面板快捷按钮(同一配置键 `boardMode`) |
45
+ | `vendor/dsh-graph/` | 新增 | dsh-graph v0.11.0 搬运(MIT),含 `NOTICE-VENDOR.md` |
46
+ | `tests/smoke/smoke-test-p1-ledger-criteria-pre.mjs` | 新增 | 10 断言 |
47
+ | `tests/smoke/smoke-test-p23-wb-sidecar-pre.mjs` | 新增 | 10 断言 |
48
+ | `artifacts/_mutate-p23-sidecar.mjs` | 新增 | 变异演示脚本(3 例) |
49
+
50
+ **权威规划文档**(合规审查的唯一依据,请先读它们):
51
+ 1. `docs/internal/WB-GRAPH-INTEGRATION-PLAN.md` —— 逐项改动清单(P2-1…P2-6、P3-1…P3-3)、判据 schema(§2.2)、改动清单与工程量
52
+ 2. `docs/internal/WB-FORMAT-CONVENTION.md` —— 格式契约(§2 锚点 id 契约、§3 索引派生、§4 写入门、§5 人机分区、§6 lint、§8 验收清单)
53
+ 3. `docs/internal/WB-GRAPH-DECISIONS-20260914.md` —— 用户拍板记录(§E 为最新裁定)
54
+ 4. `docs/internal/REVIEW-WB-GRAPH-SELF.md` —— **作者自审**(含作者已发现的疑点,请独立复核,不要照抄)
55
+ 5. `docs/internal/REPORT-WB-GRAPH-NIGHTLY.md` —— 作者交付报告(**注意:其中的"交付总览"含未完成项,可能与实际不符**)
56
+
57
+ ---
58
+
59
+ ## 2. 你的任务
60
+
61
+ ### 任务 A · 复核作者自审声称的 3 个致命 bug(首要,逐条给结论)
62
+
63
+ 作者在 `REVIEW-WB-GRAPH-SELF.md` 中声称发现 3 个致命 bug。**请独立验证每一条,给出「确认 / 证伪 / 部分成立」+ 代码证据(文件:行号 + 关键代码片段)**:
64
+
65
+ **A1(作者称):工具注册时机早于配置加载 ⇒ graph 档永不生效。**
66
+ 作者证据链:`lib/index.js` 内 `const tools = [...]`(约 :8506)在 `apply()`(约 :7633)中同步构建;注册闸门读 `engine.config.boardMode`;而 `engine.config` 在构造时只有 `DEFAULT_CONFIG`(`boardMode: 'legacy'`),真配置需 `loadConfig()` 合并,`loadConfig()` 唯一自动触发点是 `resolvePaths()`(懒加载,首次工具调用才发生)。
67
+ **请验证**:① `apply()` 全段内是否真的没有 `await ... loadConfig()`;② `tools` 数组构建与 `ctx.tools.register` 的先后;③ 结论是否成立(graph 档下 2 个新工具是否真的注册不了)。
68
+ **重要**:请进一步判断——如果 A1 成立,那么**回归是否应该变红**?为什么 95 个套件仍然全绿?(提示:想清楚测试跑在哪个 boardMode 下、以及"锁"是否真的建全)
69
+
70
+ **A2(作者称):P2/P3 取工作区路径的 API 用错。**
71
+ 作者证据:新增方法用 `agent && agent.cwd ? agent.cwd : process.cwd()`;`agent.cwd` 在全仓仅这 2 处命中;既有权威写法是 `await this.resolvePaths(agent)`(返回 `{ws, projectDir, handoffDir, planPath, ...}`,见约 :1738-1790,全仓 20+ 处在用)。
72
+ **请验证**:① `agent` 对象在 DSH 插件上下文里究竟有哪些字段(可从 `lib/index.js` 既有用法归纳);② `agent.cwd` 是否真不存在;③ 若成立,两个遍历工具的实际行为是什么(会去哪个目录找 `index.json`?会不会在错误目录创建文件?)。
73
+
74
+ **A3(作者称):设置页按钮"改了不保存就刷新" ⇒ 用户点完等于没点。**
75
+ 作者证据:设置页新按钮调用 `set('boardMode', m)` 后 `window.location.reload()`;`set()` 实现(`lib/client.js` 约 :4047)只做 `setCfg(next); setDirty(true)`(本地 state + 脏标记),真正写盘要靠"保存"按钮;而接续面板的按钮用的是 `saveConfigPatch(...)`(立即写盘)。
76
+ **请验证**:① 该 `set()` 语义是否属实;② 350ms reload 是否会丢脏数据;③ 用户配置文件里 `"boardMode": "graph"` 已存在(见 §3),据此反推用户实际点的是哪个按钮;④ 是否还有别的写入路径能让它落盘。
77
+
78
+ ---
79
+
80
+ ### 任务 B · 寻找作者**没有**发现的新缺陷(重点)
81
+
82
+ 请特别审查以下高风险区域,逐项给结论(有问题 → 给复现步骤 + 期望/实际):
83
+
84
+ **B1 · 新工具的参数与返回契约**
85
+ - `memory_expand_pre` / `memory_trace_pre` 的 `execute` 签名是否为 `(args, exec)`(对照既有工具,如 `memory_recall_pre` 等);`exec.agent` 是否存在(A2 相关)。
86
+ - 工具返回值的结构是否与 DSH 工具协议一致(既有哪些工具返回什么?新工具是否会被前端正常渲染)。
87
+ - `defineTool` 的 `parameters` 字段是否符合既有约定(注意作者手写的 `limit` 用了 `type: 'integer'`——既有工具怎么写?不匹配会怎样)。
88
+
89
+ **B2 · sidecar 写入路径**
90
+ - `writeSidecarEntryPre` 的 fail-soft 是否正确(try/catch 是否覆盖全部可能抛错点;`mkdir`/`writeFile` 是否都在 try 内)。
91
+ - **并发安全**:读 `index.json` → 改内存 → 写回,三步非原子。若两次写入并发(或账本与 PLAN 同轮各写一次),是否会丢条目?既有代码库有没有已确立的原子写/串行化约定(本仓库历史上有 `state-commit-pre.js` 等并发修复,请查)?
92
+ - 写入的 `relPath` 用的是 `path.relative(projectDir, p)` —— 在 Windows 上会产生**反斜杠**相对路径(如 `handoff\handoff-xxx.md`),而 PLAN 那条却写死正斜杠 `'handoff/PLAN.md'`。这会不会导致同一个文件两条记录、或 id 不一致、或 `source` 字段跨平台不一致?
93
+
94
+ **B3 · 条目 id 与锚点契约一致性**
95
+ - `wbEntryIdPre(workspaceKey, relPath, title)` 是否真的符合 `WB-FORMAT-CONVENTION.md` §2 的锚点契约(读文档原文对照:拼接顺序、分隔符、哈希算法、取前多少位)。
96
+ - `workspaceKey` 传入的是 `path.basename(projectDir)`(因为 `this.wsDirKey` 不存在,见 A 之外的 BUG-4)——这与 `resolvePaths()` 的 `ws` / `wsKey(ws)` 口径是否一致?会不会导致**同一工作区在不同入口算出不同 id**?
97
+ - `title` 参数:账本传的是 `'交接账本 ' + basename`,PLAN 传 `'白板 PLAN'`——与实际文件里的标题行是否一致?不一致会导致什么?
98
+
99
+ **B4 · tag 提取的鲁棒性**
100
+ - `extractTagsPre` 的正则 `/(^|\s)((?:tag|type|topic):[\w\u4e00-\u9fff-]{2,24})/g`:`\w` 在 JS 里是 `[A-Za-z0-9_]`,中文靠显式区间。请构造边界用例(标签紧贴标点、行首、全角冒号、长度超限、大小写、重复)看是否漏提/误提。
101
+ - 章节标题降 tag 用 `'sec:' + 标题.slice(0,24)` —— 若标题含 `:` 或空格,与 expand 的精确匹配是否会失配?
102
+
103
+ **B5 · legacy 档"字节级不变"是否成立**
104
+ - 作者声称默认档旧行为完全不变。请**实际验证**:检查所有新代码路径是否都被 `graphEnabled` 闸门罩住(含 `writeSidecarEntryPre`、两个工具的注册、`rebuildSidecarIndexPre` 的调用者)。
105
+ - 特别注意:新增的 `import`(`board-mode-pre.js` / `wb-sidecar-pre.js`)是否引入了任何**模块级副作用**(读文件、建目录、注册监听、改全局)。
106
+ - 特别注意:`DEFAULT_CONFIG` 新增字段,是否会影响配置序列化/比对/指纹(本仓库有"同输入同字节"的注入契约与配置指纹,请查有无受影响)。
107
+
108
+ **B6 · 测试有效性(是否存在假绿)**
109
+ - `tests/smoke/smoke-test-p23-wb-sidecar-pre.mjs`:作者在其中一条断言里把 `src.includes(...)` 改成了正则行首锚定 `/^\s*defineTool\(/`,理由是 includes 会被注释里的同名字符串骗过。请检查**其余断言**是否还有同类"被注释/字符串骗过"的假绿风险。
110
+ - 该套件是否真的会在实现被破坏时变红?请**实际做一次变异测试**:挑 2–3 处实现(例如把 `expandByTagPre` 的过滤条件改成恒真、把闸门去掉、把 tag 前缀去掉),改到**临时副本**上验证测试变红(**注意:不要改动仓库原文件**——请复制整个仓库到临时目录后再变异,或仅在临时目录操作;若无法安全变异,就静态论证并说明局限)。
111
+ - 三处工具数硬锁(`tests/smoke/smoke-test.mjs:67`、`smoke-test-m3b3-pre.mjs:43`、`smoke-test-context-observer.mjs:107`)当前都断言 `!== 14`。请判断:这是"锁对了"还是"锁没建全"?在 A1 成立的前提下,graph 档下这三个套件会怎样?
112
+
113
+ **B7 · dsh-graph vendor 的完整性与合规**
114
+ - `vendor/dsh-graph/` 是否包含运行所需的全部文件(对照 `dsh-graph-host/package.json` 的 `files` 字段与 `main`/`exports`)。
115
+ - MIT 许可文件是否保留、`NOTICE-VENDOR.md` 的记述是否准确(对照 `dsh-graph-host/LICENSE`)。
116
+ - vendor 目录是否残留 `.git`、绝对路径、构建产物缺失等搬运事故。
117
+ - 该 vendor 与主插件的命名空间是否有冲突(工具名前缀、REST 路径、client 槽位、存储目录)。
118
+
119
+ ---
120
+
121
+ ### 任务 C · 规划合规审查("什么没有按照规划完成")
122
+
123
+ 逐项对照 `docs/internal/WB-GRAPH-INTEGRATION-PLAN.md` §5 改动清单与 `WB-GRAPH-DECISIONS-20260914.md` §E 拍板,做出**完成 / 部分完成 / 未完成**三态判定,每项附证据:
124
+
125
+ | 编号 | 规划要求(摘要) | 请判定 |
126
+ | --- | --- | --- |
127
+ | P2-1 | 两咽喉落盘 sidecar:每账本同名 `.json` + 汇总 `index.json`;含 tag/cue 映射与 `criteria.passed/warned` 事件追加 | ? |
128
+ | P2-2 | `rebuildHandoffIndex()` 从 PLAN + 账本白名单确定性重建 | ? |
129
+ | P2-3 | 结构化检索升级 + `recall` scope 路由与 scope 枚举扩展 | ? |
130
+ | P2-4 | 注入端导航层加 tag 摘要行(保持"同输入同字节") | ? |
131
+ | P2-5 | GUI `handoffPanelData` 增加 tag/段视图;fileQ 白名单放行 `.json` | ? |
132
+ | P2-6 | 条目锚点(`<!-- memory:mem_... -->`)写入 | ? |
133
+ | P3-1 | 注册 `memory_expand_pre`/`memory_trace_pre`;**index.json 缺失时 fail-soft 回落 `searchHandoffCorpus`** | ? |
134
+ | P3-2 | 唤醒逻辑:`buildContinueCarry` 第 3 层 guide 加"可用遍历工具重建"提示 | ? |
135
+ | P3-3 | **三处工具数硬锁同步 14→16(标注为必须项)** | ? |
136
+ | A2 | sidecar 放 `memoryRoot/<ws>/handoff/` 旁挂 | ? |
137
+ | A6 | 水位骨架硬判据失败时"照写 + 警示行" | ? |
138
+ | B7 | 跳过试点直接实装 | ? |
139
+ | B4 | 搬 dsh-graph 接管看板层(**用户核心诉求:可视化看到立项至今全流程**) | ? |
140
+
141
+ **特别要求**:作者交付报告 `REPORT-WB-GRAPH-NIGHTLY.md` 的"交付总览"表把这些都列成了 ✅ 或有备注。请明确指出**哪些是作者高报/漏报的**,并给出该文档与实际代码的差异清单。
142
+
143
+ ---
144
+
145
+ ### 任务 D · 端到端可用性判定
146
+
147
+ 综合以上,回答三个问题(要给证据,不要给结论词):
148
+
149
+ 1. **如果把 `boardMode` 设成 `graph` 并重启 dsh web,用户会看到什么变化?**(逐项:配置文件、注册的工具、磁盘新文件、GUI 显示)
150
+ 2. **这些变化里,哪些是用户真正想要的"可视化看到全流程"?**(对照用户原话:「让用户可以实时、可视化地看到项目从立项到现在的所有流程、弯路、版本更迭等事无巨细的信息;同时也可以让 AI 看到,作为接续的重要参考之一」)
151
+ 3. **要达成该目标,还缺哪些步骤?**(请按依赖顺序列出,并标注哪些步骤涉及修改用户配置文件、哪些需要重启宿主)
152
+
153
+ ---
154
+
155
+ ## 3. 已知环境事实(供你交叉验证,不要盲信)
156
+
157
+ - 用户配置文件 `C:\Users\JH Z\.dsh\dsh-auto-memory-pre.json` 中当前存在 `"boardMode": "graph"` 与 `"handoffEnabled": true`。
158
+ - 全量回归当前为 `PASS 95 / FAIL 0 / TIMEOUT 0`。
159
+ - 用户报告症状:**"切换白板形态后什么都没发生,还是旧版的"**。
160
+ - 作者口头解释(待你验证):"需要重启 dsh web 才生效"。
161
+ - 本机 DSH 安装位置:`C:\Users\JH Z\AppData\Roaming\npm\node_modules\@deepseek-ai\dsh\`(可读,用于核对插件加载与 patch 机制)。
162
+
163
+ ---
164
+
165
+ ## 4. 产出格式(严格遵循)
166
+
167
+ ```markdown
168
+ # 审查报告 · dsh-auto-memory WB-GRAPH 白板线
169
+
170
+ ## 结论摘要
171
+ - 致命缺陷 N 个 / 高危 M 个 / 中低 K 个 / 规划未完成项 J 个
172
+ - 一句话结论:<这套改动当前能否达到用户目标?为什么>
173
+
174
+ ## A. 作者自审 3 条复核
175
+ ### A1 工具注册时机
176
+ - 判定:确认 / 证伪 / 部分成立
177
+ - 证据:<文件:行号 + 代码片段>
178
+ - 补充发现:<例如"回归为什么没红">
179
+
180
+ ### A2 路径 API
181
+ ### A3 设置页保存
182
+
183
+ ## B. 新发现缺陷(按严重度降序)
184
+ ### [致命] 标题
185
+ - 位置:<文件:行号>
186
+ - 证据:<代码/命令输出>
187
+ - 复现步骤:
188
+ - 期望 vs 实际:
189
+ - 修法建议(可给方向,不要改代码):
190
+
191
+ ## C. 规划合规清单
192
+ | 编号 | 判定 | 证据 | 与作者报告是否一致 |
193
+ (逐行填,不一致的必须点名)
194
+
195
+ ## D. 测试有效性评估
196
+ - 假绿风险点:
197
+ - 变异验证结果(做了哪些、结果如何;未做则说明局限):
198
+
199
+ ## E. 端到端可用性判定
200
+ (回答任务 D 的三问)
201
+
202
+ ## F. 修复优先级建议
203
+ 1. <第一优先:为什么>
204
+ 2. ...
205
+ ```
206
+
207
+ ---
208
+
209
+ ## 5. 审查纪律(重要)
210
+
211
+ 1. **每条结论必须有可复核证据**(文件:行号、命令、输出片段)。无证据的推测必须显式标注「推断」。
212
+ 2. **区分「确认」与「推断」**——不要把推断写成结论。
213
+ 3. **主动证伪**:对作者自审的每条声称,先尝试反驳它。
214
+ 4. **不修改任何文件**;若做了变异测试,必须在临时目录进行并说明。
215
+ 5. 若发现作者报告(`REPORT-WB-GRAPH-NIGHTLY.md`)存在高报,请**明确指出具体条目**——这比多找一个普通 bug 更重要。
216
+ 6. 报告用中文;代码/路径/命令保留原文。
@@ -58,3 +58,36 @@ GET ...?report=12&raw=1 # 只要原文不要 AI 总
58
58
  - 注意:每次日报(11:40/20:40)读完后会清空收集区,所以可查范围≈「自上次日报以来收集的反馈」(与 12h 窗口天然对齐)。
59
59
  - DeepSeek Harness 用法:直接 GET 该 URL(浏览器/curl/任意 HTTP 工具),把返回 JSON 交给模型出修复方案;或固化成 auto-memory 的 procedure。
60
60
 
61
+
62
+ ---
63
+
64
+ ## 2026-09-13 增量:定时班自触发 + @问答每小时限额(版本标记 20260913f)
65
+
66
+ **背景**:GitHub 的 schedule 定时触发对本仓库从未生效(全仓库 schedule 运行 0 次,成功的日报全是手动 dispatch)。改为「SCF 定时触发器 → 函数 → workflow_dispatch」:到点必达,GitHub 侧只当执行器。
67
+
68
+ ### 控制台要做的三件事
69
+
70
+ 1. **上传新 index.zip**(标记 `20260913e`;上传后 `?diag=1` 应显示 `"v":"webhook-gist-20260913e"`,并出现 `"ai"` 与 `"timer"` 两个配置块)。
71
+ 2. **新增环境变量**(函数配置):
72
+ - `LLM_BASE_URL` / `LLM_API_KEY` / `LLM_MODEL` —— 与日报 Actions secrets 同源(WorldCodes 中转 + minimax-m3),配了才有 @ 答疑;**注意 base 的变量名是 `LLM_BASE_URL`**(`LLM_API_BASE` 亦兼容,2026-09-13 曾因文档误写前者导致 base 一直是 DeepSeek 默认值的 401);
73
+ - `GH_DISPATCH_TOKEN` —— **Actions 读写权限**的 PAT(细粒度:Repository permissions → Actions: Read and write),定时班自触发必需;
74
+ - `TIMER_SECRET`(可选)—— `?timer=1&key=<值>` 手动测试时的口令;`TIMER_MIN_GAP_HOURS`(可选,默认 10)。
75
+ - `AI_MAX_PER_HOUR`(可选)—— @ 答疑每小时最多几次,**不配 = 不限额**;`AI_QUOTA_HOURS`(可选,默认 1)—— 限频时间窗(小时)。改额度只改环境变量,无需改代码。
76
+ 3. **添加定时触发器**(函数 → 触发管理 → 创建):类型=定时触发器,名称必须叫 **`digest-dispatch`**(与默认 TIMER_TRIGGER_NAME 一致),自定义 Cron(SCF 七段=秒 分 时 日 月 星期 年,按北京时间):
77
+ - `0 40 11 * * * *`(北京 11:40 主班)
78
+ - `0 40 20 * * * *`(北京 20:40 主班)
79
+ - 触发器 POST 到函数 URL(会带 Type:Timer 事件体),函数内部有 10 小时防重(落 gist 的 bot-state.json),不会重发。
80
+
81
+ ### 新行为
82
+
83
+ - **@ 答疑**:群成员 @机器人 + 任意问题(不含反馈触发词)→ AI(M3)**每小时限 1 次**详细回答(被动回复,带 msg_id,不占主动消息配额);超限回复一条限频提示;配额时间戳落 gist `bot-state.json`,冷启动不失忆。反馈触发词(反馈/问题/bug)的收集行为不变。
84
+ - **手动测试**:`GET …?timer=1&key=<TIMER_SECRET>` 可随时触发一班日报(同样受 10h 防重保护)。
85
+ - **成本**:SCF 侧 新增调用 ≤ 每天几十次,远在免费额度内;LLM 侧 M3 约 0.02 元/次,日报 2 次/天 + 答疑上限 24 次/天 → 最坏 ~0.5 元/天,实际远低。
86
+
87
+
88
+ ### 20260913f 追加:反馈文件钉死文件名(真 bug 修复)
89
+
90
+ - **问题**:反馈写入/日报读取/清空都用「gist 里第一个文件」当目标——`group-raw-debug.txt` 先建、或清空用 `content:''`(= **删除文件**)后,第一个文件就会换人,实测反馈行混进了原始调试文件。
91
+ - **修复**:三方(webhook 写入 / report 读取 / digest 收集清空)全部钉死 `group-feedback.jsonl`;清空改写 `'
92
+ '`(**保留文件本身**);report 的 LLM 失败不再静默,外显 `llmError` 字段(检查 base/model/key 就看它)。
93
+ - **迁移**:旧混写的历史行留在 `group-raw-debug.txt` 作为调试史,不再被 report 读取;新反馈从上传新包起进 `group-feedback.jsonl`。**务必确认 Actions secret `FEEDBACK_GIST_ID` 与云函数 `GIST_ID` 是同一个值**(真实值不写进仓库——`docs/` 会随 npm 包发布;从 `~/.dsh/memory/workspaces/--D--dsh_debug--/MEMORY.md` 取,secret 不可回读,不记得就重设)。
@@ -0,0 +1,254 @@
1
+ # 🚀 KICKOFF · P0 过夜托管运行(2026-09-14 深夜版)
2
+
3
+ > **这份文件是给「接续后的新窗口」的第一份指令。**
4
+ > 你是谁:接手 `dsh-auto-memory` 3.0 施工的 agent。**规划层已经全部封闭,不要重新规划、不要重新评审、不要问「我们从哪开始」。**
5
+ > 你的任务:**按本文开工,过夜连续施工,在指定停点停下来汇报。**
6
+ > 写这份文件的人(上一个窗口)已经把该定的都定了,该踩的坑都标了。**照做即可。**
7
+
8
+ ---
9
+
10
+ ## 0. 三十秒状态摘要
11
+
12
+ - 项目:DSH 插件 `dsh-auto-memory`(宿主 `lib/index.js` + 浏览器 `lib/client.js` + 可选 python 引擎)。
13
+ - **开发树就是活的宿主代码**(profile 以 `link:` 挂载)⇒ 你改的文件 = 用户下次重启后运行的代码。
14
+ - 规划:三轮外部评审(GPT-6 Astra)走完,产出**《合并总纲 3.0》v2**(施工蓝本)。
15
+ - 你的任务:**P0(注入边界 + 写入门 + 白板最小适配边界)**,然后 P6A。
16
+ - 已知基线:全量 **79 套件 PASS / 0 FAIL / ≈149s**;`verify-todo-graph` 47 卡;doc-code 守卫 44/0。
17
+
18
+ ---
19
+
20
+ ## 1. 第一步:按顺序读这些(**绝对路径,别猜**)
21
+
22
+ ```
23
+ D:\dsh-auto-memory\docs\internal\MASTER-PLAN-3.0.md
24
+ ← 【施工蓝本】先读 §0.5(v2 修订节)+ §4 Phase 0 + §6 交付纪律
25
+
26
+ D:\dsh-auto-memory\docs\internal\reviews\ROUND3-REVIEW-INTEGRATION-20260914.md
27
+ ← 【最重要】第三轮复核的逐条核实与采纳记录:
28
+ 你施工时要用的每一条 v2 修正、每个新增断言编号(T0-8B/T0-8C/T1-7B…)都在这里
29
+
30
+ D:\dsh-auto-memory\docs\internal\MERGE-CONFLICT-SCAN-20260914.md
31
+ ← 矛盾扫描(为什么这么调和)
32
+
33
+ D:\dsh-auto-memory\docs\internal\DECISIONS-20260914-SESSION.md
34
+ ← 用户 8 条裁决 + 三处被推翻的前提
35
+
36
+ D:\dsh-auto-memory\docs\internal\WB-GRAPH-INTEGRATION-PLAN.md
37
+ ← 白板线方案(386 行);P0 的「白板最小适配边界」要看 §2.2 判据表
38
+
39
+ D:\dsh-auto-memory\docs\internal\WB-GRAPH-DECISIONS-20260914.md
40
+ ← 白板 15 个拍板点(本文 §4 已给出**预授权默认值**,不用等用户)
41
+
42
+ D:\dsh-auto-memory\docs\internal\TODO-GRAPH.html
43
+ ← 项目管理看板(47 卡;用浏览器打开看更清楚,也可以只 grep 里面的卡)
44
+ ```
45
+
46
+ **按需查(不要通读)**:`SEMANTIC-ARCHITECTURE-SPEC.md`(S1–S10)、`THREE-LAYER-CONTRACT.md`(I1–I7)、`RAG-KARPATHY-PROGRAM.md`。
47
+
48
+ ---
49
+
50
+ ## 2. 第二步:主动恢复上下文(用户明确要求)
51
+
52
+ **接续流程会生成本窗口的转写包**,主动去找、去读:
53
+
54
+ ```powershell
55
+ Get-ChildItem "$env:USERPROFILE\.dsh\memory\workspaces\--D--dsh-auto-memory--\handoff\prev-session-*.md" |
56
+ Sort-Object LastWriteTime -Descending | Select-Object -First 3 Name, Length, LastWriteTime
57
+ ```
58
+
59
+ - 取**最新一份**读(约 70KB,**单条截断 2000 字符**,是上一个窗口的完整转写)。
60
+ - 注意:DSH 原生会话是 `~/.dsh/sessions/--D-dsh-auto-memory--/<id>/session.v3.jsonl.zstd`(**zstd 压缩,read 工具读不了**);`prev-session-*.md` 是插件解压后的可读版。
61
+ - **同时调用 `memory_recall_pre`** 检索本机所有工作区记忆(含本项目的项目笔记与用户级规则)。**用户说「有些还有问题」,所以不要只信本文,也要自己搜。**
62
+
63
+ ---
64
+
65
+ ## 3. 第三步:立刻开工(按此顺序,不要跳)
66
+
67
+ ### 3.1 第一件事:修 C8(**不依赖任何决策,现在就能做,且已证明是真危害**)
68
+
69
+ **事实**:`superseded` / `retracted` 状态的记忆条目**现在真的会进入注入文本**——违反契约不变式 **I5**(`THREE-LAYER-CONTRACT.md:183`:「非 `current` 的条目在**检索结果与注入内容两处**都被过滤」)。
70
+
71
+ **证据**(已跑出,不是推测):
72
+ ```powershell
73
+ cd D:\dsh-auto-memory; node tools\_redproof\red-proof-phase0-t01.mjs
74
+ # 当前输出:0 通过 / 4 报红,exit 1
75
+ # 其中一条实测:4 条候选(2 current + 1 superseded + 1 retracted)全部进了注入文本
76
+ ```
77
+
78
+ **你要做的**:
79
+ 1. 在**注入侧**加 `current` 过滤(检索侧已有——问题在注入侧)。落点候选:`lib/tier-layer-inject-pre.js` 的 `composeTieredInjectionPre` / `buildTier1SectionPre` 入参处,以及调用方 `lib/index.js`。
80
+ 2. **注意**:`tests/smoke/smoke-test-c5-tier-inject-pre.mjs:127/133/137` **把违反 I5 的现状锁成了「正确行为」**(`:133` 断言三条全留、`:137` 断言那条 superseded 带 0.55 分)。**这个测试必须改**——这是「断言锁死错误现状」的典型案例,改它时要留注释说明原因。
81
+ 3. 让 `red-proof-phase0-t01.mjs` **由红转绿**,然后**把它移进 `tests/smoke/`** 成为正式套件(命名建议 `smoke-test-i5-status-filter-pre.mjs`)。
82
+ 4. 跑全量,确认 79 套件仍全绿(**你改了一个断言与一个实现,套件数会变,允许变成 80**)。
83
+
84
+ ### 3.2 第二件事:T0-2 版本校验
85
+
86
+ - 现行 `lib/index.js:3894` 的命中复用**只查时间**(`Date.now() - gh.at < 30*60000`)与 session,不查 `miv`。
87
+ - 要改:`activation-host-pre.js` 的 `recordTierGateHits` 投影携带 `miv/contextVersion/observationId/requestKey`;复用前比对。
88
+ - 断言:**T0-2**(A 快照产生候选、B 快照准备输出 ⇒ A 正文不得出现且必须带版本降级原因;A/B 混装即失败)。
89
+
90
+ ### 3.3 第三件事:T0-3 预算单一口径
91
+
92
+ **两处实测缺陷**(已核过行号):
93
+ - `lib/tier-layer-inject-pre.js:327–335` —— 只裁下探段(`:329 lines.pop()` 只动 `drillParts`),`headParts`(目录 + 降级行)**从不动**;且 `:332–334` **在裁剪之后**又追加降级说明 ⇒ **最终长度可超 `maxTotal`**。
94
+ - `lib/index.js:3986` —— `catalogCost` 被 `Math.min(..., budget*0.35)` 封顶,**封顶的是"扣账成本"**;实际注入用的是全文 `s.tier0LayerText`(`:3957`),**不参与 `used` 记账**。
95
+
96
+ **v2 要求**:改为**分项账本**(仍由**同一个** `composeMemoryEnvelopePre` 生成):
97
+ ```
98
+ chars: { rules, memoryReferences, otherDynamic, total }
99
+ limits: { memoryReferences, otherDynamic }
100
+ ```
101
+ 规则段、参考段、其他动态**分项计量**;标题/分隔符/降级说明**必须归入某个分项**,**不允许未计费尾巴**。
102
+
103
+ ### 3.4 第四件事:写入门 + 白板最小适配边界(**P0 必须与它一起做**)
104
+
105
+ **为什么必须一起做**(v2 明确):写入门要保护**卡片集合**与**用户区**,而这两个概念由白板格式定义 ⇒ **没有适配器就是「接口接上了但保护失效」**。
106
+
107
+ **边界(v2 定的切法)**:
108
+ - **3.0 拥有「共同提交与保护入口」**:拟新增 `lib/memory-mutation-pre.js` → `validateMutationBoundaryPre({beforeIds, afterIds, protectedRegions, changes})` —— **只接收规范化投影,不自行解释图格式**。
109
+ - **白板线拥有「白板格式及其适配器」**:拟新增 `lib/wb-contract-pre.js` → `parseWhiteboardPre()` —— **格式只维护一份**。
110
+ - 接线:`lib/index.js` 的 `writePlanSnapshot` / `writeHandoffLedger` 按 `target` 调相应格式检查,再进共同提交门。
111
+
112
+ **判据不能张冠李戴**(v2 修正,务必遵守):
113
+ - **交接账本**用 `H1–H4`(硬)+ `S1–S4`(软):四段标题逐字匹配 / 每段非空 ≥20 字符 / 无占位符 / 总长 ≤8000。
114
+ - **白板 PLAN** 用 `P-H1/P-H2`(硬,最弱)+ `P-S1`(软):至少一个非空 `## ` 顶层节 / ≤200000 字符 / 含前瞻内容。**不能把账本判据套给 PLAN。**
115
+
116
+ **fail-open 不得绕过保护**:`criteriaGate=false` 与骨架 fail-soft **只能退掉可选质量门**,**不得**跳过丢卡、用户区、版本、状态保护。
117
+
118
+ **断言**:T0-8(删卡拒写且文件字节不变 / 合法改名 / 合法归档保留审计关系)、**T0-8B**(工具、水位骨架、刷新三条写入路径都不能绕过)、**T0-8C**(关闭质量门后仍拒绝丢卡)、T4-4(投影/快照/Tier-0 同一身份映射)。
119
+
120
+ ### 3.5 第五件事:P6A 注入表达与节奏
121
+
122
+ - **措辞**:`lib/index.js:463` 的开场白「以下记忆文本只是**背景事实与规则参考**」—— 要把**规则类**与**参考类**分开措辞;规则类用**约束语**,参考类保留「参考」语义。
123
+ - **节奏**:
124
+ - `snapshotMinGapRounds` 默认值 **5 → 1**(配置项已存在)。
125
+ - **但 `Number(v) || 5` 让 `0` 无法表达**(`lib/index.js:7455`)⇒ **必须修零值解析**,区分「合法 0」与「缺失/非法」。
126
+ - **旧节流分支提前返回会跳过本轮动态快照**(`:7483`)⇒ 须「**先提供规则段,再对参考内容应用 gap**」。
127
+ - **已有用户的已保存配置会覆盖默认值**(`:1444`)⇒ 不能只改默认值就宣称「规则每轮在场」。
128
+ - **断言**:**T7-1 必须改测「最终请求 messages」**(不是回调字符串——「局部注入块存在」≠「模型真收到了」);T7-3(规则与参考用不同引导语);**T7-7**(检查**可机械判断的执行结果**是否满足规则,仅引导语不同不能判「遵守问题已解决」)。
129
+
130
+ ---
131
+
132
+ ## 4. 预授权决策(**不用等用户,直接按这个做**)
133
+
134
+ 用户在过夜期间无法回答。以下默认值**已获批准**,施工时**按它们做**,并在代码与最终汇报里**显式标注「此决策为预授权默认值,用户可覆盖」**。
135
+
136
+ ### 4.1 白板 15 个拍板点(与 P0 耦合的四条已定,其余按方案建议)
137
+
138
+ | 编号 | 预授权决定 | 备注 |
139
+ |---|---|---|
140
+ | **B1** 丢卡风险 | **做**:sidecar 重写前后卡片集合对比,只能移动/完成,不能消失 | **= P0 写入门**,同一件事 |
141
+ | **B5** 双状态源 | **看板 = 现在时(唯一事实)**;账本 = 过去时(历史),其「任务状态」段**只指路** | **= P1 的 miv 语义**,P0 只做写入门侧的引用 |
142
+ | **B4** 人机冲突 | **从选项 (c) 起步**:每张卡片分「模型维护区 / 用户备注区」 | **= P0 写入门要保护什么** |
143
+ | **A8** 条目锚点 | **做**:`mem_` + sha256(workspaceKey + 页面相对路径 + 卡片标题) 前 32 位十六进制 | **白板进语料的前提** |
144
+ | A1 | P0-P1 立即做;P2-P3 等后端冻结解除 | |
145
+ | A2 | sidecar 位置 = `memoryRoot/<ws>/handoff/`(与现有 handoffDir 同目录) | |
146
+ | A3 | 静态纪律**随下一版一次性更新** | 代价:全量会话一次缓存重建 |
147
+ | A4 | 工具命名 = `memory_expand_pre` / `memory_trace_pre`(对齐 `*_pre` 惯例) | 对外契约,发布后难改 |
148
+ | A5 | P0-P1 进 2.6.0;P2-P3 进 2.7.x | |
149
+ | A6 | 水位骨架硬判据失败策略 = **照写 + 警示行** | 优先保证接续材料存在 |
150
+ | A7 | PLAN 判据**维持自由节名** + 最弱硬判据 P-H1 | 固定小节集会削弱老化机制 |
151
+ | B2 | 列顺序约定 + 完成卡归档;P7 老化升级为**列感知** | |
152
+ | B3 | 卡片带接续链 `contSeq` 时间轴;僵尸卡注入时打过期标记 | 复用现有 `cont-seq.json` |
153
+ | B6 | 卡带接续链标记,新窗口只展开自己链 | |
154
+ | B7 | **先试点两周**再定 P1/P2 交互方案 | |
155
+
156
+ ### 4.2 施工纪律(用户已裁定,不要问)
157
+
158
+ - **新旧并存 + 开关回退**:每个新路径一个配置开关,**默认关**。
159
+ - **每阶段必须有回滚动作**;没有回滚的阶段**不许开工**。
160
+ - **改动点写到 `文件:函数名`**。
161
+ - **新增守卫必须演示变红后再按字节还原**(本项目已被「源码接线守卫 ≠ 行为断言」咬过三次)。
162
+ - **上游同步冻结**:**不主动开 PR、不 push、不 commit**(用户明确「修复在开发端就行」)。
163
+
164
+ ---
165
+
166
+ ## 5. 🛑 停点清单(**到这些地方必须停下来问用户,不许自行决定**)
167
+
168
+ 1. **改动会破坏现有行为且无法用开关回退** —— 立即停,先报告。
169
+ 2. **需要改契约 / 规范条款本体**(`S1–S10` / `I1–I7` / `WB-FORMAT-CONVENTION`) —— **只能引用不能重写**,确需修改先提案。
170
+ 3. **全量回归无法回到全绿** —— 停下来,报告「哪个套件红了、卡在哪一步、你试了什么」,**不要为了让它绿而删断言**。
171
+ 4. **需要动 `~/.dsh/` 下的配置或宿主进程** —— 一律先问(**严禁 `Get-Process node | Stop-Process`**,曾杀穿 harness;宿主重启永远由用户自己做)。
172
+ 5. **要动超过 3 个文件的重构** —— 先问范围。
173
+ 6. **P0 全部做完** —— 停下来做一次完整汇报(见 §7),等待用户与 GPT 验收。
174
+ 7. **遇到本文与 `MASTER-PLAN-3.0.md` / `ROUND3-REVIEW-INTEGRATION` 冲突** —— 以那两份为准,并把冲突写进汇报。
175
+
176
+ ---
177
+
178
+ ## 6. 📝 记忆与注释纪律(**用户明确要求:多写记忆、多写注释**)
179
+
180
+ ### 6.1 写记忆(跨窗口续命的关键)
181
+
182
+ > **本会话可能过夜运行并中途压缩。压缩会吃掉你的思考过程,但吃不掉你写进文件的结论。**
183
+
184
+ | 时机 | 动作 |
185
+ |---|---|
186
+ | **每完成一个小步**(一个函数改完、一个断言转绿) | 调 `memory_log_pre` 追加一条(记:做了什么、结果、行号) |
187
+ | **每得出一个跨会话有用的结论**(口径、约定、踩坑) | 调 `memory_note_pre`(`kind=note`)写进项目笔记 |
188
+ | **方向变化 / 阶段完成** | 调 `memory_note_pre`(`kind=handoff`)写四段式交接账本 |
189
+ | **对项目全貌理解有实质变化** | 调 `memory_note_pre`(`kind=plan`)重写白板 |
190
+
191
+ **日志纪律**:客观陈述(第三人称中性句式),**只留可复用的事实/决策/规则/路径**,不写「我考虑/我排查」这类思考腔。
192
+
193
+ ### 6.2 写运行日志(**这是你被压缩后的救命绳**)
194
+
195
+ **新建并持续追加**:`D:\dsh-auto-memory\docs\internal\RUN-P0-NIGHTLY.md`
196
+
197
+ 每完成一步就追加一段:
198
+ ```markdown
199
+ ## [HH:MM] 步骤名
200
+ - 目标:
201
+ - 改了:文件:函数名
202
+ - 结果:断言 X 由红转绿 / 全量 N 套件 0 失败
203
+ - 卡住:无 / 具体卡点
204
+ - 下一步:
205
+ ```
206
+ **理由**:压缩后你只剩摘要,但这份文件在磁盘上,**你随时可以重读它恢复进度**。
207
+
208
+ ### 6.3 写代码注释(本项目已有的风格,务必遵守)
209
+
210
+ - **中文注释,解释「为什么」而不是「做了什么」**(代码已经说明做了什么)。
211
+ - **踩过的坑必须写进注释**,格式参考现有代码:写清「旧实现是什么 / 为什么错 / 实测证据」。
212
+ - 参考风格:`lib/index.js:1981-1991`(解耦那段)、`lib/client.js` 里 `configOf` 那段。
213
+ - **改动过测试断言时**,在断言旁注明为什么改(例:「原断言锁定了违反 I5 的现状,见 red-proof」)。
214
+
215
+ ---
216
+
217
+ ## 7. ✅ 完成判据(什么叫「今晚跑完了」)
218
+
219
+ **至少满足**:
220
+ 1. C8 修复完成:`red-proof-phase0-t01.mjs` 4/4 转绿,且已移入 `tests/smoke/`。
221
+ 2. T0-2、T0-3 实现并各有**能红的**断言。
222
+ 3. 写入门 + 白板最小适配边界完成(`memory-mutation-pre.js` + `wb-contract-pre.js` 的 P0 部分)。
223
+ 4. **全量 `node tools/run-smoke.mjs` 全绿**(套件数允许增加)。
224
+ 5. `RUN-P0-NIGHTLY.md` 完整记录每一步。
225
+ 6. 最终汇报(见下)。
226
+
227
+ **最终汇报必须包含**(给用户拿去喂 GPT 验收):
228
+ - 改动的文件清单(`文件:函数名`)
229
+ - 每条新断言的**编号 + 现状(绿/红/未做)+ 它证明什么**
230
+ - **实测数据**(跑了几次、耗时、套件数变化)
231
+ - **回滚方法**(关哪个开关、还原哪个文件)
232
+ - **未完成项与原因**
233
+ - **预授权默认值的实际使用情况**(哪些用了、哪些你觉得该改)
234
+ - **你认为最值得让 GPT 审的三个点**
235
+
236
+ ---
237
+
238
+ ## 8. ⛔ 安全红线(过夜期间绝不可越过)
239
+
240
+ 1. **严禁** `Get-Process node | Stop-Process` 或任何重启/关闭宿主进程的操作(**曾杀穿一次 harness**)。
241
+ 2. **严禁** `git commit` / `push` / `checkout` / `stash` / `reset`(约 98 个未提交文件是用户的工作状态)。
242
+ 3. **严禁**改 `~/.dsh/` 下的任何配置(除非用户当场同意)。
243
+ 4. **严禁**为了让测试变绿而**删除或弱化**既有断言。
244
+ 5. **严禁**在没有开关的情况下改掉正在生效的默认行为(开发树 = 活代码)。
245
+ 6. 写任何文件**严禁 BOM**;`lib/index.js` 与 `lib/client.js` 是 **CRLF**,`lib/*-pre.js` 与测试是 **LF** —— 改完做字节探测。
246
+ 7. **HTML/JS 字符串内禁用 ASCII 双引号**(用「」)—— 已有一次因此渲染报错的记录。
247
+
248
+ ---
249
+
250
+ ## 9. 现在就动手
251
+
252
+ 第一件事:**跑 `node tools\_redproof\red-proof-phase0-t01.mjs` 看它报红**,然后开始修 C8。
253
+
254
+ 不要重新规划。不要问「从哪里开始」。**本文就是答案。**