@a9i5k4/dsh-auto-memory 3.0.0 → 3.1.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.
- package/README.md +30 -13
- package/README.zh-CN.md +30 -13
- package/docs/FRONTEND-CO-CREATION.md +191 -0
- package/docs/GM53-HOMEPAGE-PROMPT.md +323 -0
- package/docs/HANDBOOK.md +88 -52
- package/docs/HOMEPAGE-CONTENT-FOR-GM53.md +299 -0
- package/docs/PROMO-PROMPT-3.0.md +100 -0
- package/docs/USER-GUIDE.en.md +11 -11
- package/docs/USER-GUIDE.zh-CN.md +11 -11
- package/docs/WHITEPAPER.md +207 -0
- package/docs/screenshots/promo/promo-0-banner-v3.png +0 -0
- package/docs/screenshots/promo/promo-0-banner-v4.png +0 -0
- package/docs/screenshots/promo/promo-1b-auto-recall.png +0 -0
- package/lib/activation-host.js +69 -10
- package/lib/board-mode.js +1 -1
- package/lib/client.js +1697 -285
- package/lib/config-io.js +156 -0
- package/lib/context-bridge.js +3 -0
- package/lib/context-host.js +23 -10
- package/lib/degrade.js +385 -0
- package/lib/dsh-home.js +143 -0
- package/lib/episodic-store.js +142 -18
- package/lib/evidence-store.js +8 -1
- package/lib/fact-store.js +484 -43
- package/lib/hub-io.js +217 -0
- package/lib/index-sync.js +13 -1
- package/lib/index.js +1730 -202
- package/lib/intent-clean-safe.js +258 -40
- package/lib/l0-extract.js +231 -16
- package/lib/m4-corpus.js +8 -2
- package/lib/m7-index-sync-host.js +8 -1
- package/lib/memory-envelope.js +6 -1
- package/lib/memory-hub.js +164 -17
- package/lib/memory-index.js +4 -2
- package/lib/note-status-apply.js +118 -0
- package/lib/note-status.js +204 -0
- package/lib/procedure-store.js +333 -31
- package/lib/procedure-switch.js +38 -0
- package/lib/python-sidecar-client.js +314 -11
- package/lib/recall-fusion.js +83 -12
- package/lib/rules-edit.js +159 -0
- package/lib/semantic-decide.js +41 -8
- package/lib/semantic-js.js +51 -6
- package/lib/shadow-host.js +3 -5
- package/lib/skill-export-host.js +153 -0
- package/lib/skill-export.js +239 -0
- package/lib/storage-manage.js +6 -0
- package/lib/temporal-parse.js +191 -159
- package/lib/tier0-catalog.js +45 -3
- package/lib/wb-contract.js +198 -2
- package/lib/wb-sidecar.js +54 -3
- package/package.json +6 -2
- package/docs/internal/ACCEPT-35-LIVE.md +0 -143
- package/docs/internal/ACCEPTANCE-20260914.md +0 -90
- package/docs/internal/ARCH-REVIEW-BRIEF.md +0 -411
- package/docs/internal/ARCH-REVIEW-REQUEST.md +0 -201
- package/docs/internal/ARCH-REVIEW-ROUND2.md +0 -169
- package/docs/internal/ARCH-REVIEW-ROUND3.md +0 -206
- package/docs/internal/ART-DIRECTION-WIREFRAME.md +0 -181
- package/docs/internal/AUDIT-WB-GRAPH-FULL-20260916.md +0 -314
- package/docs/internal/CONCURRENCY-INVESTIGATION-20260917.md +0 -192
- package/docs/internal/CROSS-SESSION-SEARCH-PATH-DECISION.md +0 -72
- package/docs/internal/CROSS-SESSION-SEARCH-RESEARCH.md +0 -131
- package/docs/internal/CUA-VISION-FIX-NOTES.md +0 -78
- package/docs/internal/DECISIONS-20260914-SESSION.md +0 -269
- package/docs/internal/DESIGN-OVERHAUL-PRE-RESEARCH.md +0 -292
- package/docs/internal/DESIGN-P1-STATE-COMMIT-20260915.md +0 -219
- package/docs/internal/DIRECTION-CHECK-WB-GRAPH-20260916.md +0 -132
- package/docs/internal/FEEDBACK-TO-DSHAPI-RELAY.md +0 -13
- package/docs/internal/GH-DISCUSSION-5732-COMMENT.md +0 -74
- package/docs/internal/GPT-ACCEPTANCE-PROMPT-20260916.md +0 -352
- package/docs/internal/GPT-REVIEW-PROMPT.md +0 -216
- package/docs/internal/GROUP-DIGEST-SETUP.md +0 -62
- package/docs/internal/GROUP-LISTENER-SETUP.md +0 -49
- package/docs/internal/GROUP-WEBHOOK-SETUP.md +0 -93
- package/docs/internal/HANDOFF-TO-ZCODE.md +0 -168
- package/docs/internal/KICKOFF-P0.md +0 -254
- package/docs/internal/MASTER-PLAN-3.0.md +0 -411
- package/docs/internal/MEMORY-MUTATION-AND-INDEX-DESIGN.md +0 -85
- package/docs/internal/MERGE-CONFLICT-SCAN-20260914.md +0 -222
- package/docs/internal/NEXT-VERSION-TODO.md +0 -95
- package/docs/internal/OFFICIAL-DISCUSSION-DRAFT.md +0 -80
- package/docs/internal/PENDING-FIXES-20260916.md +0 -289
- package/docs/internal/RAG-KARPATHY-PROGRAM.md +0 -229
- package/docs/internal/RELEASE-PROCESS.md +0 -99
- package/docs/internal/REPORT-P0-NIGHTLY.md +0 -212
- package/docs/internal/REPORT-P5-ACCEPTANCE.md +0 -31
- package/docs/internal/REPORT-WB-GRAPH-NIGHTLY.md +0 -153
- package/docs/internal/REVIEW-WB-GRAPH-SELF.md +0 -81
- package/docs/internal/ROADMAP-20260917-WEEK.md +0 -305
- package/docs/internal/ROADMAP.md +0 -106
- package/docs/internal/RUN-P0-NIGHTLY.md +0 -227
- package/docs/internal/S10-CONSTRUCTION-HANDOFF-20260917.md +0 -175
- package/docs/internal/S10-GAPS-PLAIN-20260917.md +0 -125
- package/docs/internal/SEMANTIC-ARCHITECTURE-SPEC.md +0 -360
- package/docs/internal/SESSION-FILE-REPAIR-PROTOCOL.md +0 -90
- package/docs/internal/SUBAGENT-REPORT-ROUTING-PRE-RESEARCH.md +0 -261
- package/docs/internal/THREE-LAYER-CONTRACT.md +0 -210
- package/docs/internal/TODO-BACKLOG.md +0 -263
- package/docs/internal/TODO-GRAPH.html +0 -715
- package/docs/internal/TODO-GRAPH.html.bak-20260914-v2 +0 -493
- package/docs/internal/TODO-GRAPH.html.bak-20260915-alsfix +0 -710
- package/docs/internal/TODO-GRAPH.html.bak-20260915-p1 +0 -710
- package/docs/internal/TODO-GRAPH.html.bak-20260915-p6a-rev +0 -703
- package/docs/internal/TODO-GRAPH.html.bak-20260915-wshint +0 -710
- package/docs/internal/TODO-GRAPH.html.bak-20260916-batch +0 -715
- package/docs/internal/WB-FORMAT-CONVENTION.md +0 -112
- package/docs/internal/WB-GRAPH-DECISIONS-20260914.md +0 -71
- package/docs/internal/WB-GRAPH-INTEGRATION-PLAN.md +0 -386
- package/docs/internal/WB-GRAPH-RESEARCH-BRIEF.md +0 -118
- package/docs/internal/WB-GRAPH-RESEARCH-EXTERNAL.md +0 -228
- package/docs/internal/WB-GRAPH-RESEARCH-LOCAL.md +0 -190
- package/docs/internal/reviews/CLAIM-VERIFICATION-20260914.md +0 -56
- package/docs/internal/reviews/PLAN-gpt6astra-round2-20260914.md +0 -787
- package/docs/internal/reviews/REVIEW-gpt6astra-20260914.md +0 -112
- package/docs/internal/reviews/ROUND3-REVIEW-INTEGRATION-20260914.md +0 -230
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
# 发版固定流程(dsh-auto-memory)
|
|
2
|
-
|
|
3
|
-
> 2026-09-10 固化。本文件是发版的唯一检查表;`tools/release.mjs` 已内置**版本标识一致性闸门**(缺任一项即拒绝构建),所以下面第 2、3 步不是"记得做",而是"不做就发不出去"。
|
|
4
|
-
|
|
5
|
-
## 角色分工(2026-09-13 固化,改点3)
|
|
6
|
-
|
|
7
|
-
- **任务书流向**:主对话读本检查表 → 角色分工指向任务书 → **主对话填入版本号后原文派发给执行子代理**。用户不必、也不要绕过主对话直接投喂子代理(两条入口并存=并发冲突之源)。
|
|
8
|
-
- **主对话 = 决策者,只做三件事**:①开闸前确认前置门(第 0 节:全量回归结果 + 脏树范围核实)②收到子代理回报后**放行或中止** ③失败时决定处置方向。**主对话不得逐步执行本清单**——发版这类固化流程交给子代理执行(主对话上下文最贵)。
|
|
9
|
-
- **子代理 = 执行者**:投喂 [`docs/prompts/RELEASE-AGENT.md`](../prompts/RELEASE-AGENT.md)(自包含任务书,填入版本号),按本清单全跑、**出错即停**,只回结构化结论 `{ ok, version, pre_sha, rel_sha, tag, npm_latest, failed_step, error_tail }`。
|
|
10
|
-
- **不得并发(冲突防线)**:主对话**派活后等待回报**,期间对同一工作区**只读**(看日志/读状态可以;改文件、git 写操作、跑发版命令、再派第二个执行子代理都不行);只读类任务书(回归/对账/巡检)之间可并行,但**不与发版执行并发**(回归占满 CPU 会污染计时敏感套件)。
|
|
11
|
-
- 凭据不经主对话转手:子代理按任务书自行从 `--D--dsh_debug--` 记忆文件读取,回报中一律 `<redacted>`。
|
|
12
|
-
- 同类固化流程的任务书:全量回归=[`REGRESSION-AGENT.md`](../prompts/REGRESSION-AGENT.md) · 双语对账=[`DOCS-AUDIT-AGENT.md`](../prompts/DOCS-AUDIT-AGENT.md) · 痕迹巡检=[`TRACE-PATROL-AGENT.md`](../prompts/TRACE-PATROL-AGENT.md)。
|
|
13
|
-
|
|
14
|
-
## 0. 前置门(不满足不许开工)
|
|
15
|
-
|
|
16
|
-
- [ ] 全量回归:`cd D:\dsh-auto-memory; Get-ChildItem tests\smoke -File -Filter *.mjs | ForEach-Object { node $_.FullName }` → **0 失败**
|
|
17
|
-
- [ ] `node --check lib/index.js` 与 `lib/client.js` 通过;改动文件无 BOM
|
|
18
|
-
- [ ] **脏树范围核实**:`git status --short` 里只有本次要发布的文件(`release.mjs` 的源就是工作区,脏树会整体进包且不可回溯)
|
|
19
|
-
|
|
20
|
-
## 1. 定版本号
|
|
21
|
-
|
|
22
|
-
- 纯修复 → patch;有新行为/新键 → minor。写在 `CHANGELOG.md` 与下文各处。
|
|
23
|
-
|
|
24
|
-
## 2. 必改 CHANGELOG(第 1 笔)
|
|
25
|
-
|
|
26
|
-
- [ ] `CHANGELOG.md` 顶部新增 `## [<ver>] — <日期> · <一句话主题>` 小节,含:覆盖范围 / 缺陷修复 / 内部重构(若有)/ 流程(若有)/ 验证
|
|
27
|
-
- 闸门校验:文件里必须出现 `## [<ver>]`,否则 `release.mjs` 拒绝构建
|
|
28
|
-
|
|
29
|
-
## 3. 必同步软件内版本标识(第 2 笔)
|
|
30
|
-
|
|
31
|
-
- [ ] **应用内更新说明字典**:`lib/client.js` 的 `var CHANGELOG = { ... }` 顶部新增 `'<ver>': { zh: [...], en: [...] }`(这是弹窗里的"更新说明",缺了用户升级后看不到本版说明)
|
|
32
|
-
- [ ] **界面指纹行**:`lib/client.js` 第 10 行 `console.log('[dsh-auto-memory] client v<ver> fingerprint: ...')`
|
|
33
|
-
- [ ] `package.json.version`:**由 `release.mjs` 自动回写开发树**(面板徽标与「检测更新」读的就是它),构建后复核输出里有 `开发树版本回写: x.y.z → <ver>`
|
|
34
|
-
- 闸门校验:以上三项任一与新版本号不一致 → **拒绝构建**(防止检测更新一直拿旧版本号去比对)
|
|
35
|
-
|
|
36
|
-
## 4. pre 线提交
|
|
37
|
-
|
|
38
|
-
```powershell
|
|
39
|
-
cd D:\dsh-auto-memory
|
|
40
|
-
git add lib tests CHANGELOG.md tools/release.mjs
|
|
41
|
-
git -c user.name="Aik358" -c user.email="aik358@users.noreply.github.com" commit -m "v<ver>: <一句话>"
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
## 5. 先 dry-run 验闸门
|
|
45
|
-
|
|
46
|
-
```powershell
|
|
47
|
-
node tools\release.mjs <ver> --dry-run # 走临时 staging,不碰发布基座
|
|
48
|
-
```
|
|
49
|
-
期望看到:`版本标识一致性: OK(CHANGELOG / 应用内更新说明 / 界面指纹行)` + `语法 ✓ BOM ✓ 无 pre/dev 残留 ✓` + `python/ 运行时完整 ✓ bench 已排除 ✓`
|
|
50
|
-
|
|
51
|
-
## 6. 真构建
|
|
52
|
-
|
|
53
|
-
```powershell
|
|
54
|
-
node tools\release.mjs <ver> # 写 D:\dsh_debug\_publish_dsh-auto-memory + 回写开发树版本
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## 7. REL 提交 + 打 tag
|
|
58
|
-
|
|
59
|
-
```powershell
|
|
60
|
-
cd D:\dsh_debug\_publish_dsh-auto-memory
|
|
61
|
-
git add -A
|
|
62
|
-
git -c user.name="Aik358" -c user.email="aik358@users.noreply.github.com" commit -m "v<ver>: <一句话>"
|
|
63
|
-
git tag -f v<ver>
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## 8. push(必须带 PAT 行内 URL)
|
|
67
|
-
|
|
68
|
-
```powershell
|
|
69
|
-
git -c credential.helper= push https://x-access-token:<PAT>@github.com/Aik358/dsh-auto-memory.git main --tags --force
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
## 9. npm publish(单向门,最后一步)
|
|
73
|
-
|
|
74
|
-
```powershell
|
|
75
|
-
cd D:\dsh_debug\_publish_dsh-auto-memory
|
|
76
|
-
npm publish . --registry=https://registry.npmjs.org/ --//registry.npmjs.org/:_authToken=<token> --access public
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## 10. 三处复核(缺一不算发完)
|
|
80
|
-
|
|
81
|
-
```powershell
|
|
82
|
-
npm view @a9i5k4/dsh-auto-memory version --registry=https://registry.npmjs.org # 必须显式指定官方 registry
|
|
83
|
-
git ls-remote https://github.com/Aik358/dsh-auto-memory.git refs/heads/main
|
|
84
|
-
git ls-remote https://github.com/Aik358/dsh-auto-memory.git refs/tags/v<ver>
|
|
85
|
-
```
|
|
86
|
-
三处 sha/版本必须一致。
|
|
87
|
-
|
|
88
|
-
**坑(2026-09-10 实测)**:`npm view` 会命中本地 npm 缓存 —— 刚发布后可能仍回读到**上一个版本**(本次 v2.4.2 发布成功后仍回读 2.4.1)。判定以 **registry 权威接口**为准:
|
|
89
|
-
|
|
90
|
-
```powershell
|
|
91
|
-
Invoke-RestMethod 'https://registry.npmjs.org/@a9i5k4%2Fdsh-auto-memory/latest' | Select-Object -ExpandProperty version
|
|
92
|
-
npm view @a9i5k4/dsh-auto-memory version --registry=https://registry.npmjs.org --prefer-online
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## 纪律
|
|
96
|
-
|
|
97
|
-
- **凭据只走行内 URL / 环境变量,严禁写进任何会上传 GitHub 或 npm 的文件**(本文件亦不写)。
|
|
98
|
-
- 本机 `~/.npmrc` 指向 npmmirror → 查询与发布都必须显式 `--registry=https://registry.npmjs.org`,否则会查到旧版本、误判发布失败。
|
|
99
|
-
- 发布后实机生效:宿主 `lib/index.js` 需重启;界面半边刷新页面即可。`update-check` 有落盘缓存(`~/.dsh/memory/update-check-pre.json`),需要时用「检查更新」强制刷新。
|
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
# P0 施工汇报 · 过夜托管运行结果(2026-09-15)
|
|
2
|
-
|
|
3
|
-
> **用途**:用户早上拿去给 GPT 验收。本文是**结论汇总**;逐步过程见 `RUN-P0-NIGHTLY.md`。
|
|
4
|
-
> **施工依据**:`KICKOFF-P0.md`(第一份指令)+ `MASTER-PLAN-3.0.md` v2 + `reviews/ROUND3-REVIEW-INTEGRATION-20260914.md`。
|
|
5
|
-
> **结论**:**P0 五步全部完成**,全量回归 **PASS 84 / FAIL 0 / TIMEOUT 0(153.7s)**。
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 1. 改动清单(`文件:函数名`)
|
|
10
|
-
|
|
11
|
-
### 新增模块(5 个)
|
|
12
|
-
|
|
13
|
-
| 文件 | 关键函数 | 作用 |
|
|
14
|
-
|---|---|---|
|
|
15
|
-
| `lib/tier-layer-inject-pre.js`(既有文件,新增) | `filterCurrentHitsPre` | **C8 修复**:注入侧 I5 状态过滤(import 检索侧 `isCurrentPre`,不复制) |
|
|
16
|
-
| 同上 | `selectReusableTierHitsPre` / `describeReuseReasonPre` / `TIER_HITS_REUSE_REASONS_PRE_V1` | **T0-2**:命中投影复用判定(五道门,fail closed) |
|
|
17
|
-
| **`lib/memory-envelope-pre.js`**(新) | `composeMemoryEnvelopePre` / `describeEnvelopeCharsPre` | **T0-3**:分项账本(E1/E2/E3 三条不变式) |
|
|
18
|
-
| **`lib/memory-mutation-pre.js`**(新) | `validateMutationBoundaryPre` / `mutationRefusalTextPre` / `validateProjectionPairPre` / `protectedRegionDigestPre` | **写入门**:共同提交与保护入口(只收规范化投影) |
|
|
19
|
-
| **`lib/wb-contract-pre.js`**(新) | `parseWhiteboardPre` / `computeWhiteboardCardIdPre` / `extractProtectedRegionsPre` / `toMutationProjectionPre` / `checkHandoffCriteriaPre` / `checkPlanCriteriaPre` / `criteriaRefusalTextPre` | **白板最小适配边界** + 判据门(格式只维护一份) |
|
|
20
|
-
| **`lib/rules-layer-pre.js`**(新) | `extractRulesLayerPre` / `renderRulesSectionPre` / `splitMemoryEntriesPre` / `ruleSummaryPre` | **P6A**:规则层抽取(规则 vs 参考) |
|
|
21
|
-
|
|
22
|
-
### 既有文件改动
|
|
23
|
-
|
|
24
|
-
| 文件:函数名 | 改动 |
|
|
25
|
-
|---|---|
|
|
26
|
-
| `lib/tier-layer-inject-pre.js:composeTieredInjectionPre` | 闸门**之前**插入 I5 过滤;`status-filtered` 降级项;返回体加 `hits` 过滤账;**总长门两处缺陷修复**(降级行先计入再裁、裁完真正回写、`headOverBudgetChars` 显式超额);返回体加 `textChars/maxTotalChars/claimedTotalChars` |
|
|
27
|
-
| `lib/activation-host-pre.js:recordTierGateHits` | 投影补 `contextVersion / miv / observationId / requestKey / workspaceKey`(T0-2 版本四元组) |
|
|
28
|
-
| `lib/activation-inbox-pre.js:makeFakeActivationRequestPre` | fixture 支持候选 `status` 与请求 `requestKey` |
|
|
29
|
-
| `lib/index.js:buildTierLayerInjection` | 删掉旧的 `fresh`/`sameSession`(只查时间 + 身份缺失时 fail **open**)⇒ 改调 `selectReusableTierHitsPre`;不复用时输出**可见**降级行;`tier0Meta` 暴露 `reuse`/`statusFiltered` |
|
|
30
|
-
| `lib/index.js:tierCurrentMivPre`(新方法) | 当前 miv 的**零重读**实现(只用 `sourceFingerprint`,不调 `CorpusRegistry.get()`,避免热路径重建语料) |
|
|
31
|
-
| `lib/index.js:peekRuntime`(新方法)+ `SessionRuntimeStore.peek` | **只读**取 runtime,**绝不创建**(修一处我引入的真实回归,见 §5) |
|
|
32
|
-
| `lib/index.js:renderMemoryDynamic` | 由 `lines[]+join('\n')` 改为**边推边归位**的 `segs[]` + 分项账本(**字节等价**);删掉 35% 封顶 `catalogCost` 与注水的 `used`;目录层按**实际注入全文长度**计入 `memoryReferences`;账本挂 `state.envelopeMeta`;超限降级行附尾部;新增 `otherDynamicBudgetChars` 派生逻辑 |
|
|
33
|
-
| `lib/index.js:renderRulesOnlySnapshotPre`(新方法) | P6A:只渲染规则段的最小外壳(节流期间仍随轮返回) |
|
|
34
|
-
| `lib/index.js:parseGapRoundsPre`(新函数) | P6A:零值安全的间隔解析(**0 可表达**) |
|
|
35
|
-
| `lib/index.js:DEFAULT_CONFIG` | `snapshotMinGapRounds: 5 → 1`;新增 `criteriaGate: true`、`rulesLayeringMode: 'off'` |
|
|
36
|
-
| `lib/index.js:DEFAULT_PROMPT_LAYERS` | 新增 `snapshotRulesTitle` / `snapshotRulesGuide`(约束语措辞) |
|
|
37
|
-
| `lib/index.js:checkMutationPre`(新方法) | 写入保护统一入口(判据门 → 保护门,顺序有意为之) |
|
|
38
|
-
| `lib/index.js:writePlanSnapshot` / `writeHandoffLedger` | 接入 `checkMutationPre`;签名加 `opts`(`skipCriteria`) |
|
|
39
|
-
| `lib/index.js:checkWaterLevel`(水位骨架路径) | A6 降级路径:`skipCriteria: true` **只跳判据门**;遇保护门拒绝**绝不绕过**并留痕 |
|
|
40
|
-
| `lib/index.js:memory_note_pre`(工具层) | 两类拒绝都返回**原始可执行文案**(不再是"白板写入失败(未知)") |
|
|
41
|
-
| `lib/index.js`(注入调用方) | P6A:`parseGapRoundsPre` 替换 `Number(v) || 5`;节流分支由"跳过整份快照"改为 `rulesOnlyText + renderReflectionRequest()` |
|
|
42
|
-
|
|
43
|
-
### 新增/修改测试(5 新增 + 4 修改)
|
|
44
|
-
|
|
45
|
-
| 文件 | 断言数 | 覆盖 |
|
|
46
|
-
|---|---|---|
|
|
47
|
-
| `tests/smoke/smoke-test-i5-status-filter-pre.mjs`(新,原红证明转正) | 45 | C8 / I5;取值域、同函数对照、过滤在闸门之前、挡下不静默 |
|
|
48
|
-
| `tests/smoke/smoke-test-t0-2-version-gate-pre.mjs`(新) | 68 | T0-2;★A 快照候选不得用于 B、五道门 fail closed、原因码可读 |
|
|
49
|
-
| `tests/smoke/smoke-test-t0-3-budget-ledger-pre.mjs`(新) | 64 | T0-3;E1/E2/E3、无未计费尾巴、rules 不参与裁剪 |
|
|
50
|
-
| `tests/smoke/smoke-test-t0-8-mutation-gate-pre.mjs`(新) | 110 | T0-8 / **T0-8B** / **T0-8C** / 判据不张冠李戴 / 职责不混 |
|
|
51
|
-
| `tests/smoke/smoke-test-p6a-rules-layer-pre.mjs`(新) | 94 | **T7-1 / T7-3 / T7-4 修订 / T7-6 / T7-7**;零值解析;先规则后 gap |
|
|
52
|
-
| `smoke-test-c5-tier-inject-pre.mjs` | 90 | **改掉 3 条锁死错误现状的断言**(`superseded` 被当成"正确行为") |
|
|
53
|
-
| `smoke-test-handoff-pre.mjs` / `smoke-test-p7-write-fix-pre.mjs` | 53 / 40 | 签名扩展同步 + `checkMutationPre` 桩 |
|
|
54
|
-
| `smoke-test-i5-status-filter-pre.mjs` | — | 接线断言由"写死单行文本"改为**参数语义** |
|
|
55
|
-
|
|
56
|
-
**总新增断言:381 条**(45+68+64+110+94)。
|
|
57
|
-
|
|
58
|
-
---
|
|
59
|
-
|
|
60
|
-
## 2. 每条新断言的编号 + 现状 + 它证明什么
|
|
61
|
-
|
|
62
|
-
| 编号 | 现状 | 证明什么 |
|
|
63
|
-
|---|---|---|
|
|
64
|
-
| **T0-1 / C8** | ✅ **绿**(原 4/4 报红) | 非 `current` 条目在**注入侧**也被过滤(契约 I5 的两处要求都落地) |
|
|
65
|
-
| **T0-2** | ✅ **绿** | A 快照产生的候选**不会**进 B 快照的注入(I6 同版);五道门任一不可证明即 fail closed |
|
|
66
|
-
| **T0-3** | ✅ **绿** | `chars.total === text.length`(逐字节);分项之和 = 总计(**无未计费尾巴**);分项上限是硬约束且裁剪可见 |
|
|
67
|
-
| **T0-8** | ✅ **绿** | 删卡无归档 → **拒写且文件字节不变**;合法归档 / 合法改名 / 加卡 / 重排 → 放行;用户区被吞或被改 → 拒 |
|
|
68
|
-
| **T0-8B** | ✅ **绿** | **三条写入路径都不能绕过共同保护**(工具 / 水位骨架直调 / 刷新仪式产物) |
|
|
69
|
-
| **T0-8C** | ✅ **绿** | **关掉质量门后仍拒绝丢卡**(`criteriaGate=false` 撤不掉共同保护) |
|
|
70
|
-
| **T7-1** | ✅ **绿**(范围内) | 连续 6 轮规则都在。**如实标注**:测的是**注入函数返回值**;"模型真收到"需宿主 U6 |
|
|
71
|
-
| **T7-3** | ✅ **绿** | 规则类与参考类引导语**不相同**(防改回统一措辞) |
|
|
72
|
-
| **T7-4(v2 修订)** | ✅ **绿** | 含「必须」但带引用/历史语境(`据文档写着`/`曾经`/`已取消`)**不自动升级为规则**,只作待确认候选 |
|
|
73
|
-
| **T7-6** | ✅ **绿**(措辞收紧) | 内容不变 ⇒ 前缀**字节稳定**。**不冒充**"缓存命中"或"按 1/10 计费" |
|
|
74
|
-
| **T7-7** | ✅ **绿**(部分) | 规则以 `rules` 分项进账本 + 代码里**不存在**对 rules 的裁剪调用。可机械判断的**执行结果**仅此;行为级遵守需 U6/U7 |
|
|
75
|
-
| **T4-4** | ❌ **未做** | 投影/快照/Tier-0 同一身份映射 —— 依赖 Phase 1 的 miv 单源,**不属 P0**(KICKOFF 未列入 P0 五步) |
|
|
76
|
-
| T0-6(数值守卫范围) | ❌ **未做** | `smoke-test-doc-code-consistency-pre.mjs` 现覆盖 7 字段,未扩到 `L1`/`K` —— KICKOFF 未列入 P0 五步 |
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
## 3. 实测数据
|
|
81
|
-
|
|
82
|
-
| 项 | 值 |
|
|
83
|
-
|---|---|
|
|
84
|
-
| **全量回归** | `node tools/run-smoke.mjs` ⇒ **PASS 84 / FAIL 0 / TIMEOUT 0,153.7s,exit 0** |
|
|
85
|
-
| 套件数变化 | **79 → 84**(+5 新套件;KICKOFF 预告"允许变成 80",实际 84) |
|
|
86
|
-
| **红证明** | `red-proof-phase0-t01.mjs`:修复前 **0 通过 / 4 报红** ⇒ 修复后 **4/4 绿** |
|
|
87
|
-
| 守卫 | `verify-todo-graph` exit 0(47 卡);`doc-code-consistency` 44/0 |
|
|
88
|
-
| 回归次数 | 全量跑 **4 次**(每步完成后 1 次 + 收尾 1 次),每次均 0 失败 |
|
|
89
|
-
| **变异演示** | i5 **12 红** / t0-2 **8 红** / t0-8 **15 红** / p6a **11 红**;每次均 SHA256 逐字节还原 |
|
|
90
|
-
| 字节卫生 | 全部改动文件 **无 BOM**;`lib/index.js` 保持 CRLF;新模块与新测试 LF |
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## 4. 回滚方法(每步一个开关 / 一个还原动作)
|
|
95
|
-
|
|
96
|
-
| 步骤 | 回滚 |
|
|
97
|
-
|---|---|
|
|
98
|
-
| C8 状态过滤 | **无开关**(这是契约 I5 的正确行为)。还原 `lib/tier-layer-inject-pre.js` 的 `filterCurrentHitsPre` 调用即可回退 |
|
|
99
|
-
| T0-2 版本校验 | 还原 `lib/index.js:buildTierLayerInjection` 的 `selectReusableTierHitsPre` 调用(旧 `fresh`/`sameSession` 代码片段已作为注释留在原位) |
|
|
100
|
-
| T0-3 分项账本 | 还原 `lib/index.js:renderMemoryDynamic` 为 `lines[]` 版(**旧实现全文在 git 工作区未提交状态中存在**,本步改动集中在该函数)。`otherDynamicBudgetChars` 未配置时自动派生,无副作用 |
|
|
101
|
-
| **写入门** | **`criteriaGate: false`** 退掉**判据门**(质量门)。⚠️ **丢卡/用户区/重复 id 三条共同保护无开关可退**——这是设计(ROUND3 §3.7 第 4 条)。要完全回退需还原 `writePlanSnapshot` / `writeHandoffLedger` 两个函数体 |
|
|
102
|
-
| 水位骨架降级 | A6 行为由 `criteriaGate` + 该分支的 `skipCriteria` 共管;不改则为"照写 + 警示行" |
|
|
103
|
-
| **P6A** | **`rulesLayeringMode: 'off'`**(**默认已是 off**)⇒ 完全回到旧行为(统一措辞 + 原节奏)。`snapshotMinGapRounds` 默认值改回 5 即回退节奏部分 |
|
|
104
|
-
|
|
105
|
-
**⚠️ 关键提醒(回滚不等于零影响)**:P6A 的**措辞**部分在 `rulesLayeringMode='off'` 时**不生效**
|
|
106
|
-
(规则段根本不注入),但 `snapshotMinGapRounds` 默认值 5→1 是**全局默认值变更** ——
|
|
107
|
-
已保存配置的用户不受影响(配置覆盖默认值),**新装用户**会拿到 1。
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
## 5. 施工中发生的两处真实缺陷(含我引入的一处)
|
|
112
|
-
|
|
113
|
-
### 5.1 我引入的回归:`runtimeFor` 在 `await` 之后复活已 dispose 的 runtime
|
|
114
|
-
|
|
115
|
-
- **现象**:`smoke-test-context-observer.mjs` P3f 报 `Error: runtime B survived dispose`。
|
|
116
|
-
- **根因**:我在 `buildTierLayerInjection` 里用 `this.runtimeFor(agent)` 读 `contextVersion`;
|
|
117
|
-
该方法底层 `SessionRuntimeStore.get()` **找不到时会 `createSessionRuntime()` 并重新登记**
|
|
118
|
-
⇒ 在 `await` 之后调用就**复活了已销毁的 runtime**。
|
|
119
|
-
这正是本项目硬纪律写死的那条坑("任何 `await` 之后再取 runtime/agent 句柄都可能复活已 dispose 的对象")。
|
|
120
|
-
- **修法**:新增**只读**的 `MemoryEngine.peekRuntime` / `SessionRuntimeStore.peek`(绝不创建),
|
|
121
|
-
注入路径改用它。
|
|
122
|
-
- **教训**:热路径读运行时状态必须用只读查询;`runtimeFor` 是"取或建"语义,不是 getter。
|
|
123
|
-
|
|
124
|
-
### 5.2 首跑抓到的真实实现缺陷:规则行只剩日期
|
|
125
|
-
|
|
126
|
-
- **现象**:`smoke-test-p6a-rules-layer-pre.mjs` 首跑,"连续 6 轮规则都在"报红(got=0)。
|
|
127
|
-
- **根因**:`ruleSummaryPre` 最初直接用 `firstLine`,而既有记忆条目结构是
|
|
128
|
-
「锚点 → `## 日期` → 正文」⇒ 规则行渲染成 `- ## 2026-08-14`,**规则内容全丢**,
|
|
129
|
-
而且**看起来还挺正常**(有内容、有格式)。
|
|
130
|
-
- **修法**:新增 `ruleSummaryPre` 跳过日期小节标题与锚点行,取第一条实质内容。
|
|
131
|
-
|
|
132
|
-
### 5.3 其它已留痕的踩坑
|
|
133
|
-
|
|
134
|
-
- **注释里的裸 ASCII 双花括号**会打断"花括号配平"式源码抽取(`smoke-test-handoff-pre.mjs:extractFn`
|
|
135
|
-
报 `unbalanced`)⇒ 注释改为文字描述。
|
|
136
|
-
- **源码接线守卫不要写死单行调用文本**:T0-3 给 `composeTieredInjectionPre({...})` 补参数并改多行后,
|
|
137
|
-
写死单行的断言变红,但接线仍在 ⇒ 改为断言**参数语义**。
|
|
138
|
-
- **源码抽取型测试必须注入该函数依赖的全部模块级符号**:`renderMemoryDynamic` 接入
|
|
139
|
-
`composeMemoryEnvelopePre` 后,`smoke-test-handoff-pre.mjs` 需把该模块源码一并注入。
|
|
140
|
-
- **字节卫生事故**:`smoke-test-handoff-pre.mjs` 编辑后变 CRLF(原为 LF)⇒ 已逐字节转回并复跑确认。
|
|
141
|
-
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
## 6. 未完成项与原因
|
|
145
|
-
|
|
146
|
-
| 项 | 状态 | 原因 |
|
|
147
|
-
|---|---|---|
|
|
148
|
-
| **T4-4**(投影/快照/Tier-0 同一身份映射) | 未做 | KICKOFF §3 未列入 P0 五步;其前提(miv 单源)属 **Phase 1** |
|
|
149
|
-
| **T0-6**(数值守卫范围扩到 `L1`/`K`) | 未做 | KICKOFF §3 未列入 P0 五步(总纲 Phase 0 提到,但施工顺序表未含) |
|
|
150
|
-
| **白板锚点实装** | 未做(**刻意**) | 锚点完备性属白板线 **P1/P2**。P0 若硬判锚点,**现存 `PLAN.md` 一个锚点都没有 ⇒ 所有既有白板立刻写不进去**(会把"保护"变成"锁死")。故写入门在"能证明丢卡"时才生效(before 侧解析出了卡片集合) |
|
|
151
|
-
| **UI 侧**(记忆窗格"当前受什么约束"页) | 未做 | 总纲归"UI 提质排期",非 P0 |
|
|
152
|
-
| **规则分类持久化 / 规则修改撤回 / 跨窗口失效** | 未做 | 这是 **P6B**(接在 P1 上),v2 明确"不能绕过状态提交" |
|
|
153
|
-
|
|
154
|
-
---
|
|
155
|
-
|
|
156
|
-
## 7. 预授权默认值的实际使用情况
|
|
157
|
-
|
|
158
|
-
| 编号 | 预授权决定 | 实际使用 | 我认为该改的地方 |
|
|
159
|
-
|---|---|---|---|
|
|
160
|
-
| **B1**(丢卡风险) | **做**:前后卡片集合对比,只能移动/完成,不能消失 | ✅ **完全按此实现**(M1) | 无 |
|
|
161
|
-
| **B5**(双状态源) | 看板=现在时(唯一事实);账本=过去时,其"任务状态"段只指路 | ⚠️ **P0 只做了写入门侧的引用**(B5 的 miv 语义属 P1,KICKOFF 如此规定) | 无 |
|
|
162
|
-
| **B4**(人机冲突) | 从选项 (c) 起步:每卡分「模型维护区 / 用户备注区」 | ✅ 适配器实现分区解析 + M2 保护 | **建议**:`<!-- model -->` 为可选(未加标记的卡片不报错),但**一旦用了就严格校验闭合**。这个宽容度是我加的,需 GPT 确认是否过宽 |
|
|
163
|
-
| **A8**(条目锚点) | 做:`mem_` + sha256(workspaceKey + 页面相对路径 + 卡片标题) 前 32 位 | ✅ `computeWhiteboardCardIdPre` 按此实现 | 无 |
|
|
164
|
-
| **A6**(水位骨架硬判据失败策略) | 照写 + 警示行 | ✅ 按此实现,且**收紧了一处**:遇**保护门**拒绝时**不绕过**(A6 只覆盖判据门) | **建议 GPT 审**:我把 A6 的"照写"限定在判据门内,这是我的判断(依据 ROUND3 §3.7 第 4 条"开关不能撤掉共同保护")。若 GPT 认为 A6 也应覆盖保护门,则该处需改 |
|
|
165
|
-
| 其余 A1–A7 / B2/B3/B6/B7 | 按方案建议 | 未触及(P1/P2 范围) | — |
|
|
166
|
-
| **Q3b 的 `Bo`** | 新增为独立配置;未配置时以 `Bm` 作派生初值,不另设魔数 | ✅ `otherDynamicBudgetChars`,未配置时 = `injectBudgetChars` | 无 |
|
|
167
|
-
| **P6A 的"改默认值"** | 默认 5 → 1 | ✅ 已改;并**额外实现**了"先规则后 gap"(v2 要求,光改默认值不足以声称"规则每轮在场") | 无 |
|
|
168
|
-
| **P6A 的规则真源** | 既有用户级 `MEMORY.md`,不新增 `RULES.md` | ✅ 严格遵守 | 无 |
|
|
169
|
-
| **`rulesLayeringMode` 默认值** | KICKOFF 未指定(新配置项) | ⚠️ **我选了 `'off'`(默认关)** | **建议 GPT 审**:按"新旧并存 + 开关回退"纪律,默认关是对的;但**用户的痛正是"规矩不在场"**,默认关意味着新用户**仍然**拿不到收益。这是一个纪律与疗效的张力点 |
|
|
170
|
-
|
|
171
|
-
---
|
|
172
|
-
|
|
173
|
-
## 8. 🎯 我认为最值得让 GPT 审的三个点
|
|
174
|
-
|
|
175
|
-
### ① 写入门在「before 侧没有卡片集合」时 fail-soft 放行,是否留下了一个长期缺口?
|
|
176
|
-
|
|
177
|
-
**我的判断**:P0 若硬判锚点,**现存 `PLAN.md` 一个锚点都没有** ⇒ 所有既有白板立刻写不进去。
|
|
178
|
-
故我的实现是:**当 before 侧解析出卡片集合时**才做丢卡比对;解析不出(无锚点)则不放行丢卡检查
|
|
179
|
-
(但用户区检查仍跑,若 before 有受保护区域)。
|
|
180
|
-
**风险**:这意味着**在用户给白板加锚点之前,丢卡事故仍然拦不住** —— 也就是"规范已批准、代码从未实现"
|
|
181
|
-
这个事故根因**只是部分关闭**。
|
|
182
|
-
**请审**:这个过渡策略对不对?有没有更安全又不会锁死既有白板的做法(例如"首次重写时自动补锚点 + 建档基线")?
|
|
183
|
-
|
|
184
|
-
### ② 「规则每轮在场」的可验证边界在哪里?我是否把 U6 依赖标注得够诚实?
|
|
185
|
-
|
|
186
|
-
**我的实现**:`rulesLayeringMode='off'` 时规则段不注入;开启后规则段**每轮**随注入函数返回
|
|
187
|
-
(节流只作用于参考内容),进 `rules` 分项且**代码里不存在对 rules 的裁剪**。
|
|
188
|
-
**我没有声称的**:模型**真的收到了**规则 —— 那需要宿主最终请求 messages 的确认(**U6**,未具备)。
|
|
189
|
-
T7-7 要求"可机械判断的执行结果",我只能给到"规则进了最终注入文本的分项账本"。
|
|
190
|
-
**请审**:这个边界够不够?在 U6 之前,是否还有**其他**可机械判断、且能证明"规则确实在场"的证据?
|
|
191
|
-
|
|
192
|
-
### ③ A6(水位骨架照写)与"共同保护不可绕过"的边界,我划对了吗?
|
|
193
|
-
|
|
194
|
-
**背景**:A6 预授权决定的水位骨架失败策略 = **照写 + 警示行**(优先保证接续材料存在)。
|
|
195
|
-
ROUND3 §3.7 第 4 条要求"新旧开关不能撤掉共同保护"。
|
|
196
|
-
**我的划法**:`skipCriteria: true` **只跳判据门**(质量门);遇**保护门**拒绝时
|
|
197
|
-
**放弃本次写入并留痕**(绝不绕过)。即"宁可这次没有接续材料,也不静默丢卡"。
|
|
198
|
-
**请审**:这与 A6 的原意("优先保证接续材料存在")是否冲突?两个原则(I4 绝不阻塞接续 vs 保护不可绕过)
|
|
199
|
-
在这里谁优先?我的选择是**保护优先**,但这使 A6 的"照写"承诺在我实现里**打了折扣**,需要 GPT 明确裁定。
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
## 9. 附:本次施工的文件清单(供验收时逐个打开)
|
|
204
|
-
|
|
205
|
-
**新增源码**:`lib/memory-envelope-pre.js`、`lib/memory-mutation-pre.js`、`lib/wb-contract-pre.js`、`lib/rules-layer-pre.js`
|
|
206
|
-
**改动源码**:`lib/index.js`、`lib/tier-layer-inject-pre.js`、`lib/activation-host-pre.js`、`lib/activation-inbox-pre.js`
|
|
207
|
-
**新增测试**:`tests/smoke/smoke-test-i5-status-filter-pre.mjs`、`smoke-test-t0-2-version-gate-pre.mjs`、`smoke-test-t0-3-budget-ledger-pre.mjs`、`smoke-test-t0-8-mutation-gate-pre.mjs`、`smoke-test-p6a-rules-layer-pre.mjs`
|
|
208
|
-
**改动测试**:`smoke-test-c5-tier-inject-pre.mjs`、`smoke-test-handoff-pre.mjs`、`smoke-test-p7-write-fix-pre.mjs`
|
|
209
|
-
**过程留痕**:`docs/internal/RUN-P0-NIGHTLY.md`(逐步记录,含每次变异演示与踩坑)
|
|
210
|
-
|
|
211
|
-
**未提交改动**:本工作区仍有约 98+ 个用户的未提交文件。**全程未执行任何 git 写操作**
|
|
212
|
-
(无 commit / push / checkout / stash / reset),未触碰 `~/.dsh/` 配置,未重启任何宿主进程。
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# P5 验收报告 · 分档运行验收与发布(2026-09-16)
|
|
2
|
-
|
|
3
|
-
依据:`MASTER-PLAN-3.0.md` §Phase 5 + `TODO-GRAPH.html` V2-P5 卡。
|
|
4
|
-
纪律(卡内原文):**发布材料逐项记录通过/失败/未执行 —— 不把「没测试环境」写成「已验收」**;U1(兼容档实测)未完成时不能填写「兼容已验收」;T6-3 资源界限必须事前登记。
|
|
5
|
-
|
|
6
|
-
## 结论
|
|
7
|
-
|
|
8
|
-
- **releaseReady = false(如实记录)**——兼容档 U1 尚未实测(无登记设备与负载的实测流程),按 V2-P5 卡口径不得宣称「兼容已验收」。
|
|
9
|
-
- 3.0 主体八阶段(P0/P6A/P1/P6B/P2/P3/P4/P5)代码与测试侧全部结项;**发布动作(npm publish / git tag)待用户明示节奏**(用户级既有约定:UI/功能改动先本地联调,未经明确要求不发布)。
|
|
10
|
-
|
|
11
|
-
## 逐项验收状态(acceptance_pre_v1 清单,7 项必需)
|
|
12
|
-
|
|
13
|
-
| 项 | 状态 | 证据 / 理由 |
|
|
14
|
-
|---|---|---|
|
|
15
|
-
| T6-1 兼容配置拦截生成式调用=0 | **通过(代码+测试侧)** | P1 兼容档真值表断言(`smoke-test-p1-concurrency-pre.mjs` T1-8/T1-9)+ 兼容档目录/词法展开路径在 92 套件回归全绿(PASS 92 / FAIL 0 / TIMEOUT 0,147.1s) |
|
|
16
|
-
| T6-2 前台/后台时间分开测 | **通过(结构侧)** | P4 rerank-host:offer 即返 accepted(前台绝不等待),后台完成只进缓存 — `smoke-test-p4-rerank-window-pre.mjs` T5-3R 断言 |
|
|
17
|
-
| T6-3 资源界限事前登记 | **通过(登记侧)** | 实测数据已登记:bge P95 37.4s/RSS 3.84GB、qwen P95 8.8s/RSS 4.95GB、torch 2.13.0+cpu(`artifacts/m7-rerank-pre/results.json` + `results-qwen-probe.json`);P4 killGrace 5s 机制化 |
|
|
18
|
-
| T6-5 最终动态文本全量计费/尾注不重复/交付幂等 | **通过(代码+测试侧)** | P6A/P0 分项账本(`memory-envelope-pre.js`)+ 注入断言套件;92 套件回归全绿 |
|
|
19
|
-
| T6-6 开关退回后撤回不出现/预算守住 | **通过(代码+测试侧)** | P6B kind 持久化+撤回套件、P2 引擎开关解耦(identity 门=indexing 开关、复用=delta 开关);legacy 回滚路径=P3 `opts.fusion:'legacy'`、P4 rerank 档位 off |
|
|
20
|
-
| T6-7 隔离目录发行产物入口测试 + 工具能力矩阵 | **未执行(如实)** | 未在隔离目录从 npm 发行产物运行入口测试(需发布产物先打包;发布节奏由用户明示)——不写成「已验收」 |
|
|
21
|
-
| compat-U1 兼容档实测(冷启动/P95/RSS/峰值/磁盘/积压年龄) | **未执行(如实)** | 无登记设备与负载的实测流程;本机仅有 bge/qwen 精排基准(T6-3),不构成兼容档全量实测 |
|
|
22
|
-
|
|
23
|
-
## 变异演示(守卫真失败证明)
|
|
24
|
-
|
|
25
|
-
`artifacts/_mutate-p5.mjs`:撤 U1 兼容门 → 红;撤 release-ready 门 → 红;撤未知项拒绝 → 红(3/3,SHA256 逐字节还原)。
|
|
26
|
-
|
|
27
|
-
## 后续(待用户明示)
|
|
28
|
-
|
|
29
|
-
1. 兼容档实测流程(登记设备+负载 → 跑 U1 → 回填 acceptance 清单 → releaseReady 翻 true)。
|
|
30
|
-
2. 隔离目录发行产物入口测试(T6-7)——随首次发布一并执行。
|
|
31
|
-
3. 发布节奏由用户裁定;本窗口不发布、不推送、不建 tag。
|
|
@@ -1,153 +0,0 @@
|
|
|
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
|
-
- 全量回归复跑结果见本轮对话记录(本节写作时后台进行中)。
|
|
@@ -1,81 +0,0 @@
|
|
|
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)**,所以从用户视角"什么都没发生"是完全符合代码现状的。
|