@a9i5k4/dsh-auto-memory 2.5.3 → 3.0.1
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 +189 -7
- package/README.zh-CN.md +189 -7
- package/docs/CONTRIBUTORS.html +471 -0
- package/docs/FRONTEND-CO-CREATION.md +191 -0
- package/docs/GM53-HOMEPAGE-PROMPT.md +323 -0
- package/docs/HANDOFF-CRITERIA.md +92 -0
- package/docs/HOMEPAGE-CONTENT-FOR-GM53.md +299 -0
- package/docs/INTEGRATION-ANALYSIS.md +350 -348
- package/docs/PROMO-PROMPT-3.0.md +100 -0
- package/docs/USER-GUIDE.en.md +58 -3
- package/docs/USER-GUIDE.zh-CN.md +59 -4
- package/docs/WHITEPAPER.md +207 -0
- package/docs/internal/ACCEPT-35-LIVE.md +143 -0
- package/docs/internal/ACCEPTANCE-20260914.md +90 -0
- package/docs/internal/ARCH-REVIEW-BRIEF.md +411 -0
- package/docs/internal/ARCH-REVIEW-REQUEST.md +201 -0
- package/docs/internal/ARCH-REVIEW-ROUND2.md +169 -0
- package/docs/internal/ARCH-REVIEW-ROUND3.md +206 -0
- package/docs/internal/ARCHITECTURE-FOR-ZCODE-20260920.md +397 -0
- package/docs/internal/ART-DIRECTION-DEEPSEEK-20260920.md +351 -0
- package/docs/internal/ART-DIRECTION-WIREFRAME.md +191 -181
- package/docs/internal/ART-DIRECTION-WIREFRAME.md.bak-superseded +181 -0
- package/docs/internal/AUDIT-WB-GRAPH-FULL-20260916.md +314 -0
- package/docs/internal/BATTLE-PLAN-20260917.md +871 -0
- package/docs/internal/CONCURRENCY-INVESTIGATION-20260917.md +192 -0
- package/docs/internal/CROSS-SESSION-SEARCH-PATH-DECISION.md +72 -0
- package/docs/internal/CROSS-SESSION-SEARCH-RESEARCH.md +131 -0
- package/docs/internal/DECISIONS-20260914-SESSION.md +269 -0
- package/docs/internal/DESIGN-P1-STATE-COMMIT-20260915.md +219 -0
- package/docs/internal/DIRECTION-CHECK-WB-GRAPH-20260916.md +132 -0
- package/docs/internal/FEATURE-INVENTORY.md +531 -0
- package/docs/internal/FEEDBACK-TO-DSHAPI-RELAY.md +13 -0
- package/docs/internal/G-SERIES-EXECUTION-20260917.md +248 -0
- package/docs/internal/G3-DESIGN-20260918.md +82 -0
- package/docs/internal/G3-DISK-FORMAT-GAP-20260919.md +92 -0
- package/docs/internal/GH-DISCUSSION-5732-COMMENT.md +74 -0
- package/docs/internal/GPT-ACCEPTANCE-PROMPT-20260916.md +352 -0
- package/docs/internal/GPT-REVIEW-PROMPT.md +216 -0
- package/docs/internal/GROUP-WEBHOOK-SETUP.md +33 -0
- package/docs/internal/HANDOFF-TO-ZCODE-20260920.md +309 -0
- package/docs/internal/HERMES-DATA-VERIFICATION-20260919.md +120 -0
- package/docs/internal/HERMES-LEGACY-STATUS-20260919.md +74 -0
- package/docs/internal/ISSUE-55-58-VERIFICATION-20260918.md +175 -0
- package/docs/internal/ISSUE10-FIX-EXECUTION-20260919.md +389 -0
- package/docs/internal/ISSUE10-PLAN-20260919.md +254 -0
- package/docs/internal/ISSUE10B-FORENSICS-20260919.md +468 -0
- package/docs/internal/ISSUE9-PURGE-AND-R1-PLAIN-20260919.md +150 -0
- package/docs/internal/ISSUE9-RESIDUAL-FORENSICS-20260919.md +114 -0
- package/docs/internal/KICKOFF-P0.md +254 -0
- package/docs/internal/LESSON-TO-CANDIDATE-STATUS-20260919.md +79 -0
- package/docs/internal/MASTER-PLAN-3.0.md +411 -0
- package/docs/internal/MEMORY-GOVERNANCE-20260917.md +309 -0
- package/docs/internal/MEMORY-MUTATION-AND-INDEX-DESIGN.md +85 -0
- package/docs/internal/MERGE-CONFLICT-SCAN-20260914.md +222 -0
- package/docs/internal/PENDING-FIXES-20260916.md +289 -0
- package/docs/internal/PRE-FRONTEND-CHECKLIST-20260919.md +705 -0
- package/docs/internal/PRE-FRONTEND-CHECKLIST-20260919.md.bak-s10 +649 -0
- package/docs/internal/PROCEDURAL-MEMORY-AND-APPROVAL-DESIGN-20260918.md +225 -0
- package/docs/internal/PROGRESS-20260917.md +93 -0
- package/docs/internal/PROMPT-GAP-AUDIT-20260920.md +128 -0
- package/docs/internal/R1-DEGRADE-AUDIT-20260918.md +163 -0
- package/docs/internal/R1-READABILITY-FORENSICS-20260919.md +127 -0
- package/docs/internal/R2-EVIDENCE-DEEP-AUDIT-20260918.md +140 -0
- package/docs/internal/R3-DEGRADE-LEDGER-DESIGN-20260918.md +138 -0
- package/docs/internal/R4-RECALL-QUOTA-PLAN-20260918.md +218 -0
- package/docs/internal/RAG-KARPATHY-PROGRAM.md +229 -0
- package/docs/internal/REPORT-P0-NIGHTLY.md +212 -0
- package/docs/internal/REPORT-P5-ACCEPTANCE.md +31 -0
- package/docs/internal/REPORT-WB-GRAPH-NIGHTLY.md +153 -0
- package/docs/internal/RESUME-20260918.md +171 -0
- package/docs/internal/RESUME-20260919.md +104 -0
- package/docs/internal/REVIEW-WB-GRAPH-SELF.md +81 -0
- package/docs/internal/RHINELAB-TO-DEEPSEEK-FEASIBILITY.md +198 -0
- package/docs/internal/ROADMAP-20260917-WEEK.md +439 -0
- package/docs/internal/ROADMAP.md +106 -0
- package/docs/internal/RUN-P0-NIGHTLY.md +227 -0
- package/docs/internal/S10-CONSTRUCTION-HANDOFF-20260917.md +185 -0
- package/docs/internal/S10-GAP-INVENTORY-20260917.md +239 -0
- package/docs/internal/S10-GAPS-PLAIN-20260917.md +125 -0
- package/docs/internal/SEMANTIC-ARCHITECTURE-SPEC.md +360 -0
- package/docs/internal/SESSION-FILE-REPAIR-PROTOCOL.md +90 -0
- package/docs/internal/T6-EXECUTION-20260920.md +130 -0
- package/docs/internal/TELEMETRY-EFFECT-REPORT-DESIGN-20260918.md +146 -0
- package/docs/internal/THESIS-GAP-ANALYSIS-20260918.md +89 -0
- package/docs/internal/THESIS-OUTLINE-20260918.md +147 -0
- package/docs/internal/THREE-LAYER-CONTRACT.md +219 -0
- package/docs/internal/TODO-BACKLOG.md +263 -142
- package/docs/internal/TODO-GRAPH.html +715 -0
- package/docs/internal/TODO-GRAPH.html.bak-20260914-v2 +493 -0
- package/docs/internal/TODO-GRAPH.html.bak-20260915-alsfix +710 -0
- package/docs/internal/TODO-GRAPH.html.bak-20260915-p1 +710 -0
- package/docs/internal/TODO-GRAPH.html.bak-20260915-p6a-rev +703 -0
- package/docs/internal/TODO-GRAPH.html.bak-20260915-wshint +710 -0
- package/docs/internal/TODO-GRAPH.html.bak-20260916-batch +715 -0
- package/docs/internal/UPSTREAM-ISSUE-PR-TRIAGE-20260919.md +297 -0
- package/docs/internal/UPSTREAM-ISSUES-3RD-AUDIT-20260920.md +104 -0
- package/docs/internal/WB-FORMAT-CONVENTION.md +112 -0
- package/docs/internal/WB-GRAPH-DECISIONS-20260914.md +71 -0
- package/docs/internal/reviews/CLAIM-VERIFICATION-20260914.md +56 -0
- package/docs/internal/reviews/PLAN-gpt6astra-round2-20260914.md +787 -0
- package/docs/internal/reviews/REVIEW-gpt6astra-20260914.md +112 -0
- package/docs/internal/reviews/ROUND3-REVIEW-INTEGRATION-20260914.md +230 -0
- package/docs/prompts/M8-3-enable-verify.md +49 -49
- package/docs/screenshots/promo/promo-0-banner-v3.png +0 -0
- package/lib/acceptance.js +71 -0
- package/lib/activation-host.js +153 -18
- package/lib/activation-inbox.js +25 -7
- package/lib/board-mode.js +30 -0
- package/lib/client.js +1758 -90
- package/lib/config-io.js +156 -0
- package/lib/context-bridge.js +5 -2
- package/lib/context-host.js +86 -15
- package/lib/degrade.js +385 -0
- package/lib/dsh-home.js +143 -0
- package/lib/engine-identity.js +149 -0
- package/lib/engine-switch.js +247 -0
- package/lib/episodic-store.js +63 -12
- package/lib/evidence-store.js +10 -3
- package/lib/fact-store.js +22 -3
- package/lib/fs-retry.js +46 -0
- package/lib/index-sync.js +13 -1
- package/lib/index.js +3446 -263
- package/lib/intent-clean-safe.js +258 -0
- package/lib/intent-clean.js +12 -16
- package/lib/l0-extract.js +478 -149
- package/lib/l0-index-sync.js +195 -0
- package/lib/l0-index.js +349 -239
- package/lib/ledger-criteria.js +142 -0
- package/lib/m4-corpus.js +8 -2
- package/lib/m7-index-sync-host.js +73 -5
- package/lib/m7-wire.js +3 -3
- package/lib/memory-anchor.js +56 -1
- package/lib/memory-envelope.js +257 -0
- package/lib/memory-hub.js +138 -13
- package/lib/memory-index.js +4 -2
- package/lib/memory-mutation.js +246 -0
- package/lib/memory-writer.js +204 -24
- package/lib/note-status-apply.js +118 -0
- package/lib/note-status.js +196 -0
- package/lib/procedure-observation.js +48 -0
- package/lib/procedure-store.js +118 -20
- package/lib/python-setup.js +1 -1
- package/lib/python-sidecar-client.js +29 -3
- package/lib/recall-fusion.js +83 -12
- package/lib/rerank-host.js +160 -0
- package/lib/rules-edit.js +159 -0
- package/lib/rules-layer.js +261 -0
- package/lib/semantic-decide.js +41 -8
- package/lib/semantic-js.js +66 -6
- package/lib/shadow-host.js +3 -5
- package/lib/shadow-retrieval.js +3 -3
- package/lib/skill-export-host.js +153 -0
- package/lib/skill-export.js +239 -0
- package/lib/state-commit.js +245 -0
- package/lib/storage-manage.js +6 -0
- package/lib/subagent-gc.js +4 -8
- package/lib/temporal-parse.js +191 -159
- package/lib/tier-layer-inject.js +650 -0
- package/lib/tier0-catalog.js +735 -0
- package/lib/water-window.js +263 -186
- package/lib/wb-contract.js +691 -0
- package/lib/wb-sidecar.js +890 -0
- package/lib/ws-overview-rank.js +2 -2
- package/package.json +1 -1
- package/python/m7_embedding_v1.py +5 -5
- package/python/worker_semantic_v1.py +17 -6
- package/python/worker_v1.py +38 -4
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# REPORT · WB-GRAPH 白板线一夜完工(2026-09-16 凌晨)
|
|
2
|
+
|
|
3
|
+
> 权威依据:`WB-GRAPH-DECISIONS-20260914.md` §E(拍板留痕)+ `WB-GRAPH-INTEGRATION-PLAN.md` §5 + `WB-FORMAT-CONVENTION.md` v1
|
|
4
|
+
> 用户裁定:一口气全做完,但**线先别接**——设置页/接续面板一键切换「旧版白板 / 新版看板」,默认旧版。
|
|
5
|
+
|
|
6
|
+
## 交付总览
|
|
7
|
+
|
|
8
|
+
| # | 交付物 | 状态 |
|
|
9
|
+
| --- | --- | --- |
|
|
10
|
+
| ① | `board_mode_pre_v1` 总开关(`lib/board-mode-pre.js`):legacy(默认)/ graph,非法值 fail closed | ✅ |
|
|
11
|
+
| ② | P1 判据门对账 + 单一真源再导出(`lib/ledger-criteria-pre.js`) | ✅ 10/10 |
|
|
12
|
+
| ③ | P2 sidecar(`lib/wb-sidecar-pre.js` + index.js 两咽喉挂接):index.json 完全可重建 | ✅ 10/10 |
|
|
13
|
+
| ④ | P3 两遍历工具 `memory_expand_pre`/`memory_trace_pre`(仅 graph 档注册,工具数 14→16) | ✅ |
|
|
14
|
+
| ⑤ | dsh-graph v0.11.0 vendor 搬入(`vendor/dsh-graph/`,MIT 留痕 NOTICE-VENDOR.md) | ✅ |
|
|
15
|
+
| ⑥ | GUI 一键切换(设置页双按钮 + 接续面板快捷键,同键 boardMode,即时回显) | ✅ |
|
|
16
|
+
| ⑦ | 验收套件 `smoke-test-p1-ledger-criteria-pre.mjs` / `smoke-test-p23-wb-sidecar-pre.mjs` | ✅ 10+10 |
|
|
17
|
+
|
|
18
|
+
## 验证证据
|
|
19
|
+
|
|
20
|
+
- 定向套件:P1 判据 **10/10**、P2/P3 sidecar **10/10** 全绿。
|
|
21
|
+
- 变异演示(`artifacts/_mutate-p23-sidecar.mjs`):**3/3 真失败**(删工具注册/tag 丢前缀/撤 sidecar 闸门),SHA256 逐字节还原。
|
|
22
|
+
- **全量回归:PASS 95 / FAIL 0 / TIMEOUT 0(145.4s)**,套件 92→95,零破坏。
|
|
23
|
+
- 施工中发现并修复 2 处抽取式测试套件缺 sidecar 桩(`smoke-test-handoff-pre.mjs` / `smoke-test-p7-write-fix-pre.mjs`,fake engine 无 `writeSidecarEntryPre` → TypeError);修复后 53/53、40/40。
|
|
24
|
+
|
|
25
|
+
## 关键勘误(施工实测推翻方案假设)
|
|
26
|
+
|
|
27
|
+
1. **P1 判据门主体在 P0 已交付**:`wb-contract-pre.js` 已实现 H1-H4/S1-S4,`checkMutationPre`(index.js:1990)已接线两咽喉 + skipCriteria 降级 + 丢卡门 + 人机分区——本窗口=对账验证+转发再导出,不重复造轮。
|
|
28
|
+
2. tag 提取须**保留前缀**(`type:dead-end` 整串),否则 expand 按 tag 查不到(M3 变异实证)。
|
|
29
|
+
3. 抽取式套件(bindMethod 沙箱)的 fake engine 需与新方法同步补桩——新增引擎方法时要排查所有 `bindMethod('async write…')` 套件。
|
|
30
|
+
|
|
31
|
+
## 用户使用方式
|
|
32
|
+
|
|
33
|
+
- **默认**:什么都不做 = 旧版白板,行为与 3.0 收官时完全一致(sidecar 不写、新工具不注册、graph_* 不激活)。
|
|
34
|
+
- **切新版**:设置页「记忆窗口→白板模式」或接续面板按钮 → 「新版看板(dsh-graph)」→ 重启 dsh web(用户自行重启)→ 生效:P2 sidecar 开始写 `handoff/index.json`、`memory_expand_pre`/`memory_trace_pre` 注册(14→16)。dsh-graph vendor 的 cordis 接线步骤见 `vendor/dsh-graph/NOTICE-VENDOR.md`(需在 profile patch 加 insert 行,升级动作待用户明示)。
|
|
35
|
+
- **回滚**:切回「旧版白板」+ 重启 = 完全回滚;sidecar 是派生物,删 `handoff/index.json` 不丢任何信息。
|
|
36
|
+
|
|
37
|
+
## 未做与待用户(如实)
|
|
38
|
+
|
|
39
|
+
- dsh-graph cordis patch 接线(profile 层动作,涉及用户配置文件,待用户明示节奏)。
|
|
40
|
+
- T6-7 发行产物测试、compat-U1 实测(沿用 P5 结论,releaseReady=false 不变)。
|
|
41
|
+
- 代码全部 pre 线,未 commit/push/publish。
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
# 勘误节 · 次日全量复检与修复(2026-09-16 白天)
|
|
46
|
+
|
|
47
|
+
> 触发:用户指出「15 号下午到 16 号凌晨的修改比较不严谨」,要求全量粗检 + 修 bug + 与规划对账。
|
|
48
|
+
> 本节**追加**、不修改上文(保留当时的判断,便于回溯)。
|
|
49
|
+
|
|
50
|
+
## 一、上文三处结论被实测推翻
|
|
51
|
+
|
|
52
|
+
| 上文原文 | 实测结论 | 证据 |
|
|
53
|
+
| --- | --- | --- |
|
|
54
|
+
| ③「P2 sidecar:index.json **完全可重建**」✅ | **不成立**。write 与 rebuild 两条路径算出**两个不同 id**(write 传 `path.relative` 反斜杠 + title 含 `handoff-` 前缀;rebuild 传正斜杠 + 去前缀)⇒ 同一条目在索引里出现两份 | `artifacts/_audit-id-repro.mjs`:write id `mem_95fc2c2404de55c0…` ≠ rebuild id `mem_7329b82cde69f937…` |
|
|
55
|
+
| ④「P3 两工具(仅 graph 档注册,工具数 14→16)」✅ | **永不注册**(两道独立致命缺陷叠加):① `apply()` **非 async** 且 cordis **不 await 其返回值**,构建 tools 时 `engine.config` 仍是构造期默认 `legacy` ⇒ 闸门恒假;② 闸门块里的 `defineTool(...)` 返回值**从未 push 进 tools 数组**(数组已在 `]` 处闭合) | `dsh-cordis-host-runner/lib/index.js` 的 `guardedPlugin`(`return objectPlugin.apply(...)`,无 await)+ 探针;修复后 graph 档实测 **16 tools** |
|
|
56
|
+
| ⑥「GUI 一键切换…即时回显」✅ | **设置页那条路径不落盘**:`pick()` 只改本地 React 态再 `location.reload()`,配置从未写到服务端 ⇒ 刷新后回跳原档,用户会判定"开关坏了" | 代码对照:接续面板走 `saveConfigPatch({boardMode})`(正确),设置页走 `set()`(缺陷) |
|
|
57
|
+
| ⑤「dsh-graph vendor 搬入」✅ | ✅ **成立**(唯一经受住复检的一条) | 目录与 `NOTICE-VENDOR.md` 均在,默认关闭声明完整 |
|
|
58
|
+
|
|
59
|
+
## 二、复检新发现(自审与首次交付均漏报)
|
|
60
|
+
|
|
61
|
+
- **BUG-15(致命,本轮新发现)**:即上表第二行的第 ② 条缺陷。**它比 BUG-1 更隐蔽**——修好「读到真配置」也仍然不注册;若不是补了 graph 档端到端套件,这条会带着"已修复"的标签活到发布。
|
|
62
|
+
- **BUG-12/13/14**:遍历工具返回契约与工具描述不符(缺 `preview/mtime/cues/criteria`);`index.json` 缺 `by_tag/by_cue/versions/ws` ⇒ 工具描述承诺的「版本链」**根本没有数据可返回**;tag 正则漏采中文标点紧邻写法(`(topic:登录流程)` → `[]`)。
|
|
63
|
+
- **BUG-2/4/8**:遍历工具用不存在的 `agent.cwd` 取路径(应为 `await this.resolvePaths(agent)`);`this.wsDirKey` 不存在(真名 `wsKey(ws)`,且对 `projectDir` 而言 `basename` 恰好恒等);tag 无命中时没有词法回落。
|
|
64
|
+
- **结构性**:`WB-FORMAT-CONVENTION §2` 的锚点**从未写进 Markdown**(只写进 sidecar)⇒ 规范承诺的"白板自动进 L0 语料"收益恒为零。
|
|
65
|
+
|
|
66
|
+
## 三、为何「全量回归 PASS 95 / FAIL 0」没抓到上面任何一条
|
|
67
|
+
|
|
68
|
+
这是本次最值得留档的一条**方法论教训**:
|
|
69
|
+
|
|
70
|
+
1. 新工具全部挂在 `boardMode==='graph'` 闸门后,而**回归整体跑 legacy 档** ⇒ graph 分支**一行都没执行**;
|
|
71
|
+
2. P23 套件的 M6 只比「**同源 rebuild 自洽**」(拿 rebuild 的输出和 rebuild 比),抓不到 write≠rebuild;
|
|
72
|
+
3. M7 端到端**手工拼 `index.json`**,绕过了引擎两个咽喉 ⇒ 接线通不通它不知道;
|
|
73
|
+
4. `client.js` 是浏览器侧,套件只做了源码字符串守卫(M10)⇒ 逻辑错也照样绿。
|
|
74
|
+
|
|
75
|
+
⇒ **结论:绿灯不是证据,覆盖率才是。** 本轮据此新增 `smoke-test-graph-mode-pre.mjs`(graph 档端到端,**13/13**),它一跑就抓出 BUG-15。
|
|
76
|
+
|
|
77
|
+
## 四、本轮修复清单(落点到函数名)
|
|
78
|
+
|
|
79
|
+
| # | 缺陷 | 修复落点 |
|
|
80
|
+
| --- | --- | --- |
|
|
81
|
+
| 1 | 闸门读到默认配置 | 新增 `MemoryEngine.loadConfigSync()`(与 `loadConfig` 共用 `_mergeConfigPre`);`apply` 构建 tools 前调用 |
|
|
82
|
+
| 2 | 注册返回值被丢弃 | `apply` 内 `tools.push(defineTool(...))` |
|
|
83
|
+
| 3 | write/rebuild 两个 id | 新增 `wbRefPre()` 作**唯一构造口径**;`writeSidecarEntryPre` / `rebuildSidecarIndexPre` 共用 |
|
|
84
|
+
| 4 | 契约缺字段 | `buildSidecarEntryPre` / `rebuildSidecarIndexPre` 补齐 §3.3+§4.1 全字段 |
|
|
85
|
+
| 5 | tag 正则漏采 | `extractTagsPre` 改左边界判定(拒绝 `xxxtype:` 假阳性,接受中文标点紧邻) |
|
|
86
|
+
| 6 | 路径取错 | `expandWhiteboardByTagPre` / `traceWhiteboardByIdPre` 改走 `resolvePaths` |
|
|
87
|
+
| 7 | 死分支 | 新增 `wbWsKeyPre(projectDir)` 并注明恒等依据 |
|
|
88
|
+
| 8 | 无词法回落 | `expandWhiteboardByTagPre` 无命中时回落 `searchHandoffCorpus` |
|
|
89
|
+
| 9 | 锚点从未写入 | 新增 `applyAnchorsPre()`(纯函数、幂等、重排不变 id);两咽喉在 graph 档写入 |
|
|
90
|
+
| 10 | events.jsonl 未实现 | 新增 `appendSidecarEventPre()`;两咽喉写入后追加事件 |
|
|
91
|
+
| 11 | 设置页不落盘 | `client.js` 的 `pick()` 改走 `saveConfigPatch(…, {onSaved, onError})` |
|
|
92
|
+
| 12 | 面板看不到 sidecar | `handoffPanelData` 的 `fileQ` 白名单放行 `index.json` / `events.jsonl`(仍是枚举式,不通配) |
|
|
93
|
+
|
|
94
|
+
**关于 P3-3(三处工具数硬锁 14→16)的一处主动偏离**:规划写这条时**闸门还不存在**。现设计要求「legacy 默认档字节级不变」⇒ 三处硬锁**保持 14**,graph 档的 16 由新套件独立断言。这是对规划的**有意修正**,不是漏做。
|
|
95
|
+
|
|
96
|
+
## 四点五、P2/P3 输入端与检索端补线(2026-09-16 第二批)
|
|
97
|
+
|
|
98
|
+
第一轮审计的结论是「白板线只做完**存储/写入**半边,**消费/检索**半边整体缺失」。本批补齐这半边,**默认仍走 legacy**。
|
|
99
|
+
|
|
100
|
+
| 项 | 规划原文要求 | 本次落点 | 验证 |
|
|
101
|
+
| --- | --- | --- | --- |
|
|
102
|
+
| **P0-1** | 新建 `docs/HANDOFF-CRITERIA.md`(判据表 + 正反例 + 引用关系) | 新文件(H1-H4/P-H1/P-S1 全表 + 正反例 + 5 处引用关系) | 文件存在 |
|
|
103
|
+
| **P2-3** | `searchHandoffCorpus` 升 **tag/段级优先 + 词法兜底** | 改为**两段式**:结构化臂消费 `by_tag`/`by_cue` 倒排(label `白板结构化/<source> [<id8>]`),词法臂原样保留作兜底 | E3 |
|
|
104
|
+
| **P2-4** | 注入端锚点表区扩展 **tag 摘要行** | `buildContinueCarry` 内调 `whiteboardTagMapPre(null, p)` 注入「【白板 tag 地图(结构化导航)】」+ 工具用法提示 | E1 |
|
|
105
|
+
| **P2-5** | GUI 加 **tag/段视图**;fileQ 放行 `.json` | 后端 `handoffPanelData` 返回 `structured`(tags 倒排 + 按 kind 段视图)与 `boardMode`;前端**条件渲染**两张卡 | E4 |
|
|
106
|
+
| **P3-2** | 第3层 guide 加**唤醒句** | 注入「【白板结构化检索(优先于通读第3层)】」并点名两工具与参数 | E2 |
|
|
107
|
+
| 白板页切换按键 | — | 复核确认**已存在**(`switchCard` 内 `data-dam-key: 'boardMode'`,走 `saveConfigPatch` + `location.reload`) | E5 |
|
|
108
|
+
|
|
109
|
+
**闸门纪律**:P2-3/P2-4/P3-2 与 `structured` **全部只在 `boardMode==='graph'` 生效**;
|
|
110
|
+
legacy 档注入文本与面板返回结构**逐字节不变**(后端 `structured:null` + 前端 `if (data.structured)` 双重保证)。
|
|
111
|
+
|
|
112
|
+
### 变异演示(第二批,3/3 真失败,逐字节还原)
|
|
113
|
+
|
|
114
|
+
| 变异 | 期望 | 实测 |
|
|
115
|
+
| --- | --- | --- |
|
|
116
|
+
| ① P2-4 调用点改成常量(退回「只定义不调用」) | E1 红 | **exit=1**,`实为 0 处` |
|
|
117
|
+
| ② 删掉 P3-2 唤醒句文案 | E2 红 | **exit=1**,`唤醒句不在场` |
|
|
118
|
+
| ③ 前端条件渲染改 `if (true)`(legacy 也渲染) | E4 红 | **exit=1**,`必须条件渲染` |
|
|
119
|
+
|
|
120
|
+
三次变异后 `lib/index.js` 与 `lib/client.js` **SHA256 均逐字节还原**。
|
|
121
|
+
|
|
122
|
+
### 套件
|
|
123
|
+
|
|
124
|
+
`smoke-test-graph-mode-pre.mjs` **13 → 18 断言**(新增 E1-E5)。
|
|
125
|
+
新增断言的**口径**值得记录:这四条缺陷的共同特征是「**函数写了但没人调用**」——无副作用,任何行为测试都测不出来。
|
|
126
|
+
所以 E 组断言的是**调用点在场**(`this.whiteboardTagMapPre(` 出现次数 ≥1、唤醒句字面量在场、`if (data.structured)` 在场),
|
|
127
|
+
而不是「函数存在」。
|
|
128
|
+
|
|
129
|
+
### 回归
|
|
130
|
+
|
|
131
|
+
**全量回归 PASS 96 / FAIL 0 / TIMEOUT 0(149.9s)**,无 BOM。
|
|
132
|
+
|
|
133
|
+
## 五、验证
|
|
134
|
+
|
|
135
|
+
- 新增套件 `smoke-test-graph-mode-pre.mjs`:**13 passed / 0 failed**(含 A1 graph=16、D1 legacy=14、D2 非法值 fail-closed=14、C1 两路径同 id、B6 锚点幂等/重排/改名)。
|
|
136
|
+
- 既有套件 P23 的 M9 断言语式随 BUG-15 修复同步更新(从「裸 `defineTool` 在场」升级为「`tools.push(defineTool(...))`」——前者会被注释骗过)。
|
|
137
|
+
- 补 2 处抽取式沙箱缺桩(`handoff-pre` / `p7-write-fix` 的 fake engine 加 `appendSidecarEventPre`)——**同类坑第二次踩**,已在本节留档。
|
|
138
|
+
- **全量回归:PASS 96 / FAIL 0 / TIMEOUT 0(143.2s)**,套件 95→96(新增 graph 套件),零破坏。
|
|
139
|
+
|
|
140
|
+
### 变异演示(§6 交付纪律:新增守卫必须演示变红后按字节还原)
|
|
141
|
+
|
|
142
|
+
| 变异 | 期望 | 实测 |
|
|
143
|
+
| --- | --- | --- |
|
|
144
|
+
| ① 把 `tools.push(defineTool('memory_expand_pre'…))` 还原成裸 `defineTool(…)`(BUG-15 复发) | graph 套件变红 | **exit=1,真失败** |
|
|
145
|
+
| ② 删掉 `engine.loadConfigSync()` 调用(BUG-1/11 复发) | graph 套件变红,且应看到 `ready: engine + 14 tools`(回落 legacy) | **exit=1,真失败**;A1/A2/A3 三条同时红,日志实证退化为 14 工具 |
|
|
146
|
+
|
|
147
|
+
两次变异后 `lib/index.js` **SHA256 逐字节还原**(`0E36650A08DF616B19C46CE65AD110CD72C8FD3BFFD86AEEFE916A0A6026898B`)。
|
|
148
|
+
|
|
149
|
+
## 六、仍未做(如实)
|
|
150
|
+
|
|
151
|
+
- dsh-graph profile 接线:**用户裁定「先不接线,先把 memory 侧修干净」**,故本轮不碰 `~/.dsh/profiles/web/`。
|
|
152
|
+
- 三处工具数硬锁仍为 14:系上节所述**有意偏离**。
|
|
153
|
+
- 全量回归复跑结果见本轮对话记录(本节写作时后台进行中)。
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# RESUME · 压缩后从这里开始(2026-09-18 22:40 固化)
|
|
2
|
+
|
|
3
|
+
> **这份文件是压缩上下文后的唯一入口。** 读完它 + 它指定的 2 份文档,即可无缝继续。
|
|
4
|
+
> 用户操作:压缩 → 说「开始」→ agent 读本文件 → 直接开工第 1 批。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 0. 30 秒状态
|
|
9
|
+
|
|
10
|
+
| 层 | 状态 |
|
|
11
|
+
|---|---|
|
|
12
|
+
| **L 层**(底层:界限+接线) | ✅ **全部完工并冻结**(L1–L7 + G4/M3) |
|
|
13
|
+
| **M 层** | ✅ M1 完工 · ✅ M2-lint 完工 · ⏸ **M2 的 G3 部分待做** |
|
|
14
|
+
| **M2.5**(检索质量) | ✅ a/b 完工,c 已撤销 |
|
|
15
|
+
| **R 系列**(降级留痕) | ✅ R1→R2→R2-E1→R3→R3-② 全绿 |
|
|
16
|
+
| **R4**(检索区分度+配额) | 📋 **已立项,未开工** ← 用户已批准第 1 批可立即做 |
|
|
17
|
+
| **S 层** | ⬜ 未开工(大项目) |
|
|
18
|
+
|
|
19
|
+
**全量回归**:`PASS 119 / FAIL 0 / TIMEOUT 0`(160.3s)
|
|
20
|
+
**宿主重启**:`lib/` 有改动(`wb-contract-pre.js` 等),**需用户自行重启**才生效。
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 1. ★ 压缩后必须读的两份文档(按顺序)
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
① docs/internal/BATTLE-PLAN-20260917.md ← 执行顺序的唯一权威(755 行)
|
|
28
|
+
② docs/internal/R4-RECALL-QUOTA-PLAN-20260918.md ← 下一批工作的完整设计(含行号证据)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**只在需要时读**:
|
|
32
|
+
- `docs/internal/G3-DESIGN-20260918.md` —— G3 状态写入设计(待用户拍板 2 个边界)
|
|
33
|
+
- `docs/internal/MEMORY-GOVERNANCE-20260917.md` §8 —— G3 的权威纲领
|
|
34
|
+
- `docs/internal/WB-FORMAT-CONVENTION.md` —— 白板格式契约
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 2. ★ 下一步做什么(用户已批准,可直接开工)
|
|
39
|
+
|
|
40
|
+
### 第 1 批(低风险,用户原话「分层显示可以先做」)
|
|
41
|
+
|
|
42
|
+
| 项 | 内容 | 关键位置 |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| **R4-B 分层展示** | `memory_recall_pre` 输出按层分组(结论层/流水层),**不改排序只改呈现** | `index.js:6093`(语义臂输出行)、`index.js:5977`(词法臂输出行) |
|
|
45
|
+
| **R4-留痕补齐** | `py→C2→词法` 三级降级**每一跳都 record**(现只有 diag) | `index.js:5867`(择优逻辑)、`:5882`(现为 `diag(...)`,应改 `_degradeSink.record(...)`)、`:5883`(只有外层失败才记录) |
|
|
46
|
+
|
|
47
|
+
**用户痛点的原话**:「区分度有点问题,更加有含金量的结论和每一次都有的日志会混在一起」
|
|
48
|
+
「如果它会有回退或者不可用的状态,记得及时在日志里面报告」
|
|
49
|
+
|
|
50
|
+
### 第 2 批
|
|
51
|
+
|
|
52
|
+
- **R4-配额锁死**(★ 用户实测踩到的真 bug):先写套件**复现** → 判定设计vs缺陷 → 修
|
|
53
|
+
```
|
|
54
|
+
:227 COMPACT_THROTTLE_MS = 10 分钟
|
|
55
|
+
:4655 ensureBudget 超限 → 整理循环(3 轮)
|
|
56
|
+
:4744 allowFold = !(last && now - last < THROTTLE)
|
|
57
|
+
:4832 this._lastCompactAt[layer] = Date.now() ← 整理成功后无条件上锁
|
|
58
|
+
:4689 「整理过但没腾够」路径同样上锁
|
|
59
|
+
```
|
|
60
|
+
**倾向判定为缺陷**:节流应只防"反复整理",不该阻止**合法写入**
|
|
61
|
+
- **R4-配额测量闭环**:复用 R3 degrade 台账采集 `state.tier0Meta.dropped/perLayer` 趋势
|
|
62
|
+
(数据**已在采集**:`index.js:5099`,只是没用来调参)
|
|
63
|
+
|
|
64
|
+
### 第 3 批(随 G3)· 第 4 批(单独评估)
|
|
65
|
+
|
|
66
|
+
- R4-A 作废条目「返回但标记」+ `supersededBy` 指针
|
|
67
|
+
- R4-C 层次保底配额(**会改排序,风险最高**)
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 3. ⏸ 待用户拍板的 3 件事(BATTLE-PLAN §7)
|
|
72
|
+
|
|
73
|
+
| # | 事项 | agent 倾向 |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| 5 | `superseded` 的可见后果:**剔除**(现状)/ **降权** / **返回但标记** | **返回但标记**(用户原话「明确告诉 AI 这是过时的结论」) |
|
|
76
|
+
| 6 | `supersededBy` 算不算违反 S10.4「不新建状态源」 | **不算** —— 是 `status` 的**伴生字段**,非平行账本 |
|
|
77
|
+
| 2 | S1.3 literature 理念:(a) 多处可挂载 / (b) 设置内切换归属 | 待定(S 层才需) |
|
|
78
|
+
|
|
79
|
+
> **问题 5 与 G3 是同一决策的两面**,定完即可实施 G3。
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 4. 铁律(压缩后仍需遵守)
|
|
84
|
+
|
|
85
|
+
### 用户硬性规则(不可违)
|
|
86
|
+
1. **严禁停止/重启 dsh web 宿主**(3080)—— 会截断思维链。改完 host 代码**只告知用户自行重启**,agent 绝不 `Stop-Process`/`Start-Process`
|
|
87
|
+
2. **严禁无差别杀进程**(`Get-Process node | Stop-Process`)—— DSH 自身跑在 node 上
|
|
88
|
+
3. **代码改动一律留在 pre 线**,不提交/不推送/不发布
|
|
89
|
+
4. **写文件分块**(一次工具调用不要写过大内容)
|
|
90
|
+
5. **编辑前备份**(`*.bak-YYYYMMDD-<tag>`);`edit` 的 `replace_all` 后必须核对命中数 + `node --check`
|
|
91
|
+
6. **无 BOM**
|
|
92
|
+
|
|
93
|
+
### 项目铁律(血泪换来的)
|
|
94
|
+
1. **fail-soft 路径必须返回可观察的成功/失败信号**(如 `persisted` 字段)—— 静默降级 = 结构性缺陷
|
|
95
|
+
2. **「源码接线正确 + 诊断数据齐全 + 回归全绿」不能证明功能存在** —— 必须**实机验证真实副作用**(如落盘文件真的出现)
|
|
96
|
+
3. **守卫判据键若同时存在于 `DEFAULT_CONFIG`**,判据必须读**磁盘原文**而非合并后 `config`(否则结构性恒真/恒假;已犯两次:M8、M9)
|
|
97
|
+
4. **判据纪律:宁可漏判,不可误伤**(漏判=维持现状;误伤=合法内容被改变行为路径)
|
|
98
|
+
5. **语义引擎铁律**:JS 引擎=默认形态,Python=发烧者进阶项,**两套可互换、严禁互相依赖**
|
|
99
|
+
6. **观测面三层边界**:`diag()`=过程日志 / `debugView()`=各域局部状态 / `degrade`=跨臂统一台账
|
|
100
|
+
|
|
101
|
+
### 每步固定收尾序列
|
|
102
|
+
```
|
|
103
|
+
备份 → 改码 → node --check → 写新套件 → 跑该套件(看红)
|
|
104
|
+
→ 变异演示(确认真红) → 还原(SHA256 校验) → 跑全量回归(0 失败) → 留痕
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 5. 当前代码状态(关键行号,均本次实测)
|
|
110
|
+
|
|
111
|
+
### 已改动的文件(pre 线未提交)
|
|
112
|
+
```
|
|
113
|
+
lib/tier0-catalog-pre.js ← M1:TIER0_ANCHOR_ID_RE + renderCatalogLinePre 两种渲染
|
|
114
|
+
lib/wb-sidecar-pre.js ← M1:buildSidecarEntryPre 增 layer/status + sidecarEntryToCatalogItemPre
|
|
115
|
+
lib/wb-contract-pre.js ← M2:lintWhiteboardPre(43/43)+ WB_LINT_* 常量
|
|
116
|
+
lib/recall-fusion-pre.js ← M2.5b:layer 臂
|
|
117
|
+
lib/l0-extract-pre.js ← M2.5a:L0 质量门
|
|
118
|
+
lib/index.js ← R 系列:degrade 台账接线
|
|
119
|
+
lib/client.js ← L 层
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 本次新增的套件
|
|
123
|
+
```
|
|
124
|
+
tests/smoke/smoke-test-m1-contract-line-pre.mjs (55/55)
|
|
125
|
+
tests/smoke/smoke-test-m2-lint-pre.mjs (43/43)
|
|
126
|
+
tests/smoke/smoke-test-m25a-l0-qualitygate-pre.mjs(39)
|
|
127
|
+
tests/smoke/smoke-test-m25b-layer-arm-pre.mjs (37)
|
|
128
|
+
tests/smoke/smoke-test-r2e1-evidence-guard-pre.mjs(20)
|
|
129
|
+
tests/smoke/smoke-test-r3-degrade-pre.mjs (77)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 本次新增的备份
|
|
133
|
+
```
|
|
134
|
+
lib/tier0-catalog-pre.js.bak-20260918-M1
|
|
135
|
+
lib/wb-sidecar-pre.js.bak-20260918-M1
|
|
136
|
+
lib/wb-contract-pre.js.bak-20260918-M2
|
|
137
|
+
lib/index.js.bak-20260918-M25b / -R2ev / -M9cap
|
|
138
|
+
lib/l0-extract-pre.js.bak-20260918-M25a
|
|
139
|
+
lib/recall-fusion-pre.js.bak-20260918-M25b
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 6. 本次会话(2026-09-18)完成的事
|
|
145
|
+
|
|
146
|
+
| 项 | 结果 |
|
|
147
|
+
|---|---|
|
|
148
|
+
| **M1 契约行渲染** | ✅ 三处改动,55/55,变异 5/5 真红,回归 117→118 |
|
|
149
|
+
| **M2-lint**(缺口 4) | ✅ 43/43,变异 6/6 真红,只读纪律有硬断言,回归 118→119 |
|
|
150
|
+
| **R4 立项** | ✅ 用户四个痛点全部定位代码级,产出 13KB 设计文档 |
|
|
151
|
+
| **BATTLE-PLAN** | ✅ 新增 §3.7(R4)· §8(远期清单)· §7 扩到 6 件待拍板 |
|
|
152
|
+
|
|
153
|
+
### M2-lint 的判据口径(重要,勿推翻)
|
|
154
|
+
| 契约 §6 | 实现口径 | 为什么收窄 |
|
|
155
|
+
|---|---|---|
|
|
156
|
+
| ① 孤立条目 | 全语料找不到其 id/标题 | 标题 <2 字符**不参与匹配**(防单字误命中) |
|
|
157
|
+
| ② 陈旧 | 状态直读 + 日期比较(严格 `<`) | **缺日期不报**(不猜) |
|
|
158
|
+
| ③ 被提及无卡 | **只判客观可证的悬空 `mem_` 引用** | 「什么算概念」无法零 token 判定 |
|
|
159
|
+
| ④ 缺交叉引用 | 共享 ≥2 个 tag 却互不引用 | 由 **tag 交集代言**,不猜语义 |
|
|
160
|
+
| ⑤ 矛盾检测 | **不判**,但 `counts.notChecked=['contradiction']` 显式声明 | 需 LLM,**不许静默省略** |
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 7. 踩过的两个坑(可复用)
|
|
165
|
+
|
|
166
|
+
1. **运算符优先级**:`'a' + x + 'b'.match(re)` 中 `.match` 只绑到 `'b'`(`.` 优先于 `+`)⇒ 得到字符串 `'...null'`。**必须先拼成变量再 `.match()`**
|
|
167
|
+
2. **源码级断言必须先剥离注释**:JSDoc 里提到函数名/文件名会造成假阳性(与 R3 裸 `join` 断言同源)。已加 `stripComments` + **反向自检**断言证明剥离有效
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
*固化时间:2026-09-18 22:40 · 全量回归 PASS 119 / FAIL 0 / TIMEOUT 0*
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# 接力入口 · 2026-09-19 00:30
|
|
2
|
+
|
|
3
|
+
> **压缩后第一动作 = 读本文件**。本文件是**唯一接力入口**;`RESUME-20260918.md` 已过时(其 §2/§5 写于 R4 开工前,行号漂移)。
|
|
4
|
+
> **权威执行顺序**:`docs/internal/BATTLE-PLAN-20260917.md`(§7 待拍板 / §8 远期 / §9 issue 批次 / §10 I5 修正)。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. 一句话现状
|
|
9
|
+
|
|
10
|
+
**R4 第 1、2 批已完工冻结;R4-A 边界全部拍板、代码已改但冻结未接线;下一步 = 先修合作方 4 条 issue,再落地 R4-A。**
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 2. ★ 接手第一件事(可直接执行)
|
|
15
|
+
|
|
16
|
+
> **前端重构之前的完整清单见 `PRE-FRONTEND-CHECKLIST-20260919.md`**(含划线依据 / 8 项 / 拍板项 / 执行序 / P0 防丢)。
|
|
17
|
+
> **下表是精简版**;两者冲突时以该清单为准(它更新)。
|
|
18
|
+
|
|
19
|
+
**当前无阻塞项。** 用户已拍板全部边界。按以下顺序推进:
|
|
20
|
+
|
|
21
|
+
| 序 | 任务 | 依据 | 状态 |
|
|
22
|
+
|---|---|---|---|
|
|
23
|
+
| **①** | 修 **issue #55–#58** | BATTLE-PLAN **§9** + `ISSUE-55-58-VERIFICATION-20260918.md` | ⬜ 可立即开工 |
|
|
24
|
+
| **②** | 落地 **R4-A**(I5 修正) | BATTLE-PLAN **§10** + 本文 §4 | ⚠️ 代码已改、**未接线**、需补备份 |
|
|
25
|
+
| ③ | Hermes 遗留问题修复 | 设计稿 §2.1 | ⬜ 打开 `procedurePromotionEnabled` 的前提 |
|
|
26
|
+
| ④ | 教训 → 观察型候选 | 设计稿 §2.3 | ⬜ 可检索、不自动晋升 |
|
|
27
|
+
| ⑤ | 前端重构(含审批界面 + 首次启动页 + 赞助商/中转站) | BATTLE-PLAN §8 第 5/6 条 | ⬜ 用户届时要求提醒 |
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 3. ⚠️ 冻结状态(**接手必读**)
|
|
32
|
+
|
|
33
|
+
**`lib/l0-extract-pre.js` 已改但未接线,线上行为零变化。**
|
|
34
|
+
|
|
35
|
+
- 已加:`isRetrievablePre()`(三态一律放行,只挡未知值)、`supersededMarkPre()`、`L0_SUPERSEDED_MARK_PRE_V1`、`buildL0IndexPre` 的**可选** `opts.statusOf` 注入器。
|
|
36
|
+
- **`index.js` 完全没有调用它们** ⇒ 死代码 ⇒ 行为不变。
|
|
37
|
+
- **冻结备份:`lib/l0-extract-pre.js.bak-20260919-R4A-frozen`**(23871 B)—— ⚠️ **注意**:`*.bak-20260918-R4a` 是 R4 第 1 批时的,**从它还原会连第 1 批的改动一起丢**。
|
|
38
|
+
- **验证探针:`artifacts/_probe-r4a.mjs`(33/33 全绿)** —— 含"无 `statusOf` 时逐字节兼容"与"本机 23 条真实笔记零影响"。
|
|
39
|
+
|
|
40
|
+
> **纪律失误记录**:agent 改码时**跳过了"先备份"**这一步(本仓固定收尾第一项)。接手时若继续动 `l0-extract-pre.js`,**先补备份**。
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 4. R4-A 落地要点(I5 修正 · 三态一律返回)
|
|
45
|
+
|
|
46
|
+
**用户裁定原文**:「这个 reacted **不是过滤掉**……**并不是挡,我感觉是备注**」
|
|
47
|
+
+ 「说明现在更正的内容在**哪个哈希值**里面,方便 AI 去搜索」。
|
|
48
|
+
|
|
49
|
+
| status | 呈现 |
|
|
50
|
+
|---|---|
|
|
51
|
+
| `current` | 原样(**逐字节向后兼容**) |
|
|
52
|
+
| `superseded` | `⚠已作废(已被 mem_<32hex> 取代)` |
|
|
53
|
+
| `retracted` | `⚠已撤回(原因:<reason>;更正见 mem_<32hex>)` |
|
|
54
|
+
|
|
55
|
+
**落地清单**:
|
|
56
|
+
1. `index.js:5873` 的 `if (!isCurrentPre(it)) continue` ⇒ 改用 `isRetrievablePre`
|
|
57
|
+
(⚠️ **会撞 `smoke-test-three-layer-pre.mjs:188` 的字面量正则** `/if \(!isCurrentPre\(it\)\) continue/` ⇒ 该断言须同步更新并注明原因)
|
|
58
|
+
2. 语义臂 `:6101` 的 `if (!cur(it)) continue` 同样处理(内含**内联兜底谓词** `:6094`,也要改)
|
|
59
|
+
3. 输出拼接处附 `supersededMarkPre(rec)` 后缀
|
|
60
|
+
4. **注入侧 `isCurrentPre` 保持不变**(`tier-layer-inject-pre.js` 不动 —— 常驻 800 token 不装过时条目)
|
|
61
|
+
5. 契约文档 `THREE-LAYER-CONTRACT.md:183` 的 I5 须改写(原为"两处都过滤"⇒ 检索侧改为"标注")
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 5. 已拍板的关键裁定(勿重新讨论)
|
|
66
|
+
|
|
67
|
+
| # | 裁定 | 出处 |
|
|
68
|
+
|---|---|---|
|
|
69
|
+
| 1 | `superseded`/`retracted` **一律返回但标记**;`supersededBy` **不算**违反 S10.4 | BATTLE-PLAN §7 第 5/6 项 |
|
|
70
|
+
| 2 | **教训**进观察型候选、**可检索、永不自动晋升** | 设计稿 §2.3 |
|
|
71
|
+
| 3 | **skill 是相对独立的系统**,晋升成功后**由本插件语义召回注入**(`act.skill` **保持不变**) | 设计稿 §2.4 |
|
|
72
|
+
| 4 | `procedurePromotionEnabled:false` 是**有意临时关闭**(Hermes 遗留),**修完自然打开** | 设计稿 §2.1 |
|
|
73
|
+
| 5 | issue #55–#58 **留到前端重构之前**一起改 | BATTLE-PLAN §9 |
|
|
74
|
+
| 6 | 合作方 `Minervaowl7` 后续会持续提 issue,机制摸熟后提 PR | BATTLE-PLAN §9 |
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 6. 铁律(改码前必读)
|
|
79
|
+
|
|
80
|
+
- **严禁停止/重启 3080 宿主**;严禁无差别杀 node 进程;代码留 pre 线不提交;**改码前先备份**;无 BOM;大文件分块写。
|
|
81
|
+
- fail-soft 必须返回**可观察**信号;「源码接线正确 + 诊断齐全 + 回归全绿」**不能**证明功能存在。
|
|
82
|
+
- 守卫判据键若同时在 `DEFAULT_CONFIG`,判据必须读**磁盘原文**(已犯两次:M8、M9)。
|
|
83
|
+
- **改 `lib/index.js` 前先看既有套件的字面量断言**(import 行、输出行格式、排序表达式),否则假红。
|
|
84
|
+
- 每步固定收尾:**备份 → 改码 → `node --check` → 写套件 → 看红 → 变异演示 → SHA256 还原 → 全量回归 → 留痕**。
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 7. 陷阱档案(本仓实测,勿重踩)
|
|
89
|
+
|
|
90
|
+
1. **`pwsh` + `node -e` 会静默吞转义**(`\n` 变字面量)⇒ 带正则/转义/`$` 的验证**必须写成 `.mjs` 文件跑**。
|
|
91
|
+
2. **改 import 行会撞契约守卫** ⇒ 新 import **独占一行**,不合并。
|
|
92
|
+
3. **`capacityLimit` 对 <500 的值视为脏值回落 24000** ⇒ 测试夹具用 `cap:300` 得假象。
|
|
93
|
+
4. **带 `## ` 标题的文件不是"单段"** ⇒ 会被切成空段+日期段。
|
|
94
|
+
5. **源码断言会被自己的注释误伤** ⇒ 注释引用旧公式会让 `!SRC.includes(旧公式)` 假红;两词分开断言(`/A/ && /B/`)是假绿,须**同句相邻**。
|
|
95
|
+
6. **`memoryAnchorEnabled` / `procedurePromotionEnabled` 默认 `false` 都承载未修依赖** ⇒ 看到"关着的开关"先查是否**故意关的**,别当 bug。
|
|
96
|
+
7. **CRLF**:多行变异/替换锚点必须用 `\r\n`。
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 8. 全量回归基线
|
|
101
|
+
|
|
102
|
+
**`PASS 122 / FAIL 0 / TIMEOUT 0`(157.4s)** —— 曲线:L111 → M9 113 → M2.5a 114 → R2-E1 115 → R3 116 → M2.5b 117 → M1 118 → M2lint 119 → R4-1 120 → 锁死 121 → 配额 122。
|
|
103
|
+
|
|
104
|
+
跑法:`node tools\run-smoke.mjs`
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# REVIEW · WB-GRAPH 白板线自审(2026-09-16 凌晨,施工方自审)
|
|
2
|
+
|
|
3
|
+
> 自审立场:**假设自己有错**,逐行回读本窗口写下的代码,只采信代码/配置/日志证据。
|
|
4
|
+
> 结论先行:**P1 判据对账是扎实的;P2/P3 与 GUI 开关存在 3 个致命 bug + 6 项未按规划完成**。"切了没反应"不是环境问题,是代码问题。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 一、致命 bug(会让功能整体失效)
|
|
9
|
+
|
|
10
|
+
### BUG-1 ★ 工具注册时机早于配置加载 ⇒ graph 档永不生效
|
|
11
|
+
|
|
12
|
+
**证据链**:
|
|
13
|
+
- `lib/index.js:8506` `const tools = [...]` 在 `apply()`(`:7633`)内**同步构建**;`:9763` `for (const tool of tools)` → `:9772 ctx.tools.register(tool)`。
|
|
14
|
+
- P3 注册闸门写的是 `resolveBoardModePre(engine.config.boardMode)`。而 `engine.config` 在 `MemoryEngine` 构造时(`:982` `this.config = { ...DEFAULT_CONFIG }`)是**默认值**,`DEFAULT_CONFIG.boardMode = 'legacy'`。
|
|
15
|
+
- 真配置只在 `loadConfig()` 里合并(`:1597`),而 `loadConfig()` 是**懒加载**:全仓唯一自动调用点是 `resolvePaths()`(`:1739` `if (!this.configLoaded) await this.loadConfig()`)——即"首次工具调用"才发生。
|
|
16
|
+
- 取证:`apply()` 段(7632–8510)内 **无** `await engine.loadConfig()`。
|
|
17
|
+
|
|
18
|
+
**后果**:不管配置里写 `graph` 还是 `legacy`,插件启动时读到的永远是默认 `legacy` ⇒ **`memory_expand_pre` / `memory_trace_pre` 永远不注册**。用户配置里 `"boardMode": "graph"` 是真写进去了(见 §四证据),但工具从未出现。
|
|
19
|
+
|
|
20
|
+
**修法**:`apply()` 内在构建 tools 之前 `await engine.loadConfig()`(必要时兜底 catch);或把注册闸门的判定改为"延迟到首次调用时再判"。
|
|
21
|
+
|
|
22
|
+
### BUG-2 ★ P2/P3 取工作区路径的 API 用错了 ⇒ 跑到 DSH 安装目录
|
|
23
|
+
|
|
24
|
+
**证据链**:
|
|
25
|
+
- 我写的 `expandWhiteboardByTagPre` / `traceWhiteboardByIdPre`(`:2041`、`:2054`)用 `agent && agent.cwd ? agent.cwd : process.cwd()`。
|
|
26
|
+
- 全仓 grep `agent.cwd` **只有这 2 处命中**(就是我新加的两行)⇒ 该字段不是本仓库既有约定,**几乎必然为 undefined**。
|
|
27
|
+
- 既有权威写法是 `await this.resolvePaths(agent)` → 返回 `{ ws, projectDir, planPath, handoffDir, ... }`(`:1738-1790`)。全仓 20+ 处都这么写(`:1835`/`:2483`/`:3809`/`:3990`/`:4062`…)。
|
|
28
|
+
- 于是回退到 `process.cwd()`:dsh web 宿主的工作目录是 **DSH 自己的安装/启动目录**,不是用户工作区。
|
|
29
|
+
|
|
30
|
+
**后果**:两个工具会在错误目录找 `handoff/index.json`,找不到就触发 `rebuildSidecarIndexPre` 在**错误目录建 handoff/**;即便 sidecar 已生成,查询也永远返回 0 条。
|
|
31
|
+
|
|
32
|
+
### BUG-3 ★ 设置页按钮"改了不保存就刷新" ⇒ 用户点完等于没点
|
|
33
|
+
|
|
34
|
+
**证据链**:
|
|
35
|
+
- 我在设置页加的双按钮调的是 `set('boardMode', m)`,然后 `setTimeout(() => window.location.reload(), 350)`。
|
|
36
|
+
- `set()` 的实现(`lib/client.js:4047`)是:`var next = {...cfg}; next[key]=value; setCfg(next); setDirty(true)` —— **只改本地 state 并标脏,不写盘**。真正写盘要靠设置页的"保存"按钮。
|
|
37
|
+
- 350ms 后 `location.reload()` ⇒ **脏数据被丢弃**,配置文件不变。
|
|
38
|
+
- 接续面板那个按钮用的是 `saveConfigPatch({...})`(立即写盘)⇒ 那个是对的。
|
|
39
|
+
|
|
40
|
+
**后果**:用户在**设置页**切换 = 无任何效果(连配置都没改)。用户看到配置里是 `graph`,说明他点的是**接续面板**那个按钮(或另有写入路径)。
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 二、高/中危缺陷
|
|
45
|
+
|
|
46
|
+
| # | 缺陷 | 证据 | 影响 |
|
|
47
|
+
| --- | --- | --- | --- |
|
|
48
|
+
| BUG-4 | sidecar 用了不存在的 `this.wsDirKey` | grep `wsDirKey` 全仓 0 命中;真名是 `wsKey(ws)`(`:1686`) | `workspaceKey` 退化为 `path.basename(projectDir)`,与 `WB-FORMAT-CONVENTION §2` 锚点契约的 workspaceKey 口径不一致;同一工作区换路径写法会算出不同 id |
|
|
49
|
+
| BUG-5 | 三处工具数硬锁未同步 | `smoke-test.mjs:67` / `smoke-test-m3b3-pre.mjs:43` / `smoke-test-context-observer.mjs:107` 仍是 `!== 14` | 方案 P3-3 标为"**必须项**"(漏改任一处即红)。当前全绿只因测试跑在 legacy 档、工具数确实是 14 —— **graph 档下这三个套件会红**,属"锁没建全"而非"锁对了" |
|
|
50
|
+
| BUG-6 | `events.jsonl` 未实现 | 方案 A2 与 P2-1 明确要求 `index.json` + `events.jsonl`(append-only `{ts,actor,event,target,details}`);实际只写了 index.json | P2 未按规划完成;`criteria.passed/warned` 确认事件链缺失(方案 §2.4 第 2 层) |
|
|
51
|
+
| BUG-7 | 遍历工具不返回正文 | 方案 §4.1 要求返回条目 Content;`expandByTagPre` 只回 `{id,title,source,tags,cue,chars,ts}` | "主动重建上下文"的核心价值(省去通读 18000 carryText)没落地 |
|
|
52
|
+
| BUG-8 | 无正文级检索兜底 | 方案 P3-1 要求"index.json 缺失时 fail-soft 回落 `searchHandoffCorpus`";实际只做重建,未回落词法检索 | 与规划不符 |
|
|
53
|
+
| BUG-9 | 未接线 dsh-graph | `vendor/dsh-graph/NOTICE-VENDOR.md` 自述"待用户明示" | 用户的核心诉求(可视化看板)未兑现;用户对此的抱怨成立 |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 三、确认「做对了」的部分(避免自审只挑刺)
|
|
58
|
+
|
|
59
|
+
- **P1 判据门对账**:`wb-contract-pre.js` 的 H1–H4/S1–S4 实现与 `checkMutationPre` 两咽喉接线**经实测确认存在**(不是假设),`ledger-criteria-pre.js` 只做转发再导出(单一真源),10/10 断言绿。
|
|
60
|
+
- **legacy 档零行为**:`writeSidecarEntryPre` 首行闸门 + 工具注册闸门 + `DEFAULT_CONFIG.boardMode='legacy'` 三处齐备;全量回归 **95/0/0(145.4s)** 证明既有 92 套件未破。
|
|
61
|
+
- **变异演示有效**:3/3 真失败(且发现 M9 断言被注释串骗过,已改用行首锚定 `/^\s*defineTool\(/`)—— 这个自我纠错是真实的。
|
|
62
|
+
- **抽取式套件补桩**:handoff-pre 53/53、p7-write-fix 40/40 修复到位(新增引擎方法必须同步补 fake engine 桩)。
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 四、外部可复核证据
|
|
67
|
+
|
|
68
|
+
| 项 | 值 |
|
|
69
|
+
| --- | --- |
|
|
70
|
+
| 用户配置文件 | `C:\Users\JH Z\.dsh\dsh-auto-memory-pre.json` 内 `"boardMode": "graph"`(**已落盘**) |
|
|
71
|
+
| 全量回归 | `PASS 95 / FAIL 0 / TIMEOUT 0(145.4s)`(`node tools/run-smoke.mjs`) |
|
|
72
|
+
| 工具数硬锁 | 三处仍 `!== 14` |
|
|
73
|
+
| `agent.cwd` | 全仓仅 2 处,均为本次新增 |
|
|
74
|
+
| `wsDirKey` | 全仓 0 处 |
|
|
75
|
+
| `apply()` 内 loadConfig | 0 处 |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 五、为什么"切了也什么都没有发生"(一句话归因)
|
|
80
|
+
|
|
81
|
+
**三重叠加**:① 设置页按钮不保存(BUG-3);② 即便保存了,工具注册时机早于配置加载(BUG-1)⇒ 新工具永不注册;③ 即便工具注册了,取路径 API 用错(BUG-2)⇒ 查询也查不到东西。**再加上 dsh-graph 看板本身还没接线(BUG-9)**,所以从用户视角"什么都没发生"是完全符合代码现状的。
|