@a9i5k4/dsh-auto-memory 3.0.1 → 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.
Files changed (124) hide show
  1. package/README.md +13 -8
  2. package/README.zh-CN.md +13 -8
  3. package/docs/HANDBOOK.md +88 -52
  4. package/docs/USER-GUIDE.en.md +9 -9
  5. package/docs/USER-GUIDE.zh-CN.md +9 -9
  6. package/docs/screenshots/promo/promo-0-banner-v4.png +0 -0
  7. package/docs/screenshots/promo/promo-1b-auto-recall.png +0 -0
  8. package/lib/activation-host.js +6 -1
  9. package/lib/client.js +819 -272
  10. package/lib/context-host.js +7 -1
  11. package/lib/episodic-store.js +90 -16
  12. package/lib/fact-store.js +463 -41
  13. package/lib/hub-io.js +217 -0
  14. package/lib/index.js +224 -45
  15. package/lib/intent-clean-safe.js +1 -1
  16. package/lib/memory-hub.js +37 -5
  17. package/lib/note-status.js +9 -1
  18. package/lib/procedure-store.js +252 -31
  19. package/lib/procedure-switch.js +38 -0
  20. package/lib/python-sidecar-client.js +285 -8
  21. package/package.json +6 -2
  22. package/docs/internal/ACCEPT-35-LIVE.md +0 -143
  23. package/docs/internal/ACCEPTANCE-20260914.md +0 -90
  24. package/docs/internal/ARCH-REVIEW-BRIEF.md +0 -411
  25. package/docs/internal/ARCH-REVIEW-REQUEST.md +0 -201
  26. package/docs/internal/ARCH-REVIEW-ROUND2.md +0 -169
  27. package/docs/internal/ARCH-REVIEW-ROUND3.md +0 -206
  28. package/docs/internal/ARCHITECTURE-FOR-ZCODE-20260920.md +0 -397
  29. package/docs/internal/ART-DIRECTION-DEEPSEEK-20260920.md +0 -351
  30. package/docs/internal/ART-DIRECTION-WIREFRAME.md +0 -191
  31. package/docs/internal/ART-DIRECTION-WIREFRAME.md.bak-superseded +0 -181
  32. package/docs/internal/AUDIT-WB-GRAPH-FULL-20260916.md +0 -314
  33. package/docs/internal/BATTLE-PLAN-20260917.md +0 -871
  34. package/docs/internal/CONCURRENCY-INVESTIGATION-20260917.md +0 -192
  35. package/docs/internal/CROSS-SESSION-SEARCH-PATH-DECISION.md +0 -72
  36. package/docs/internal/CROSS-SESSION-SEARCH-RESEARCH.md +0 -131
  37. package/docs/internal/CUA-VISION-FIX-NOTES.md +0 -78
  38. package/docs/internal/DECISIONS-20260914-SESSION.md +0 -269
  39. package/docs/internal/DESIGN-OVERHAUL-PRE-RESEARCH.md +0 -292
  40. package/docs/internal/DESIGN-P1-STATE-COMMIT-20260915.md +0 -219
  41. package/docs/internal/DIRECTION-CHECK-WB-GRAPH-20260916.md +0 -132
  42. package/docs/internal/FEATURE-INVENTORY.md +0 -531
  43. package/docs/internal/FEEDBACK-TO-DSHAPI-RELAY.md +0 -13
  44. package/docs/internal/G-SERIES-EXECUTION-20260917.md +0 -248
  45. package/docs/internal/G3-DESIGN-20260918.md +0 -82
  46. package/docs/internal/G3-DISK-FORMAT-GAP-20260919.md +0 -92
  47. package/docs/internal/GH-DISCUSSION-5732-COMMENT.md +0 -74
  48. package/docs/internal/GPT-ACCEPTANCE-PROMPT-20260916.md +0 -352
  49. package/docs/internal/GPT-REVIEW-PROMPT.md +0 -216
  50. package/docs/internal/GROUP-DIGEST-SETUP.md +0 -62
  51. package/docs/internal/GROUP-LISTENER-SETUP.md +0 -49
  52. package/docs/internal/GROUP-WEBHOOK-SETUP.md +0 -93
  53. package/docs/internal/HANDOFF-TO-ZCODE-20260920.md +0 -309
  54. package/docs/internal/HANDOFF-TO-ZCODE.md +0 -168
  55. package/docs/internal/HERMES-DATA-VERIFICATION-20260919.md +0 -120
  56. package/docs/internal/HERMES-LEGACY-STATUS-20260919.md +0 -74
  57. package/docs/internal/ISSUE-55-58-VERIFICATION-20260918.md +0 -175
  58. package/docs/internal/ISSUE10-FIX-EXECUTION-20260919.md +0 -389
  59. package/docs/internal/ISSUE10-PLAN-20260919.md +0 -254
  60. package/docs/internal/ISSUE10B-FORENSICS-20260919.md +0 -468
  61. package/docs/internal/ISSUE9-PURGE-AND-R1-PLAIN-20260919.md +0 -150
  62. package/docs/internal/ISSUE9-RESIDUAL-FORENSICS-20260919.md +0 -114
  63. package/docs/internal/KICKOFF-P0.md +0 -254
  64. package/docs/internal/LESSON-TO-CANDIDATE-STATUS-20260919.md +0 -79
  65. package/docs/internal/MASTER-PLAN-3.0.md +0 -411
  66. package/docs/internal/MEMORY-GOVERNANCE-20260917.md +0 -309
  67. package/docs/internal/MEMORY-MUTATION-AND-INDEX-DESIGN.md +0 -85
  68. package/docs/internal/MERGE-CONFLICT-SCAN-20260914.md +0 -222
  69. package/docs/internal/NEXT-VERSION-TODO.md +0 -95
  70. package/docs/internal/OFFICIAL-DISCUSSION-DRAFT.md +0 -80
  71. package/docs/internal/PENDING-FIXES-20260916.md +0 -289
  72. package/docs/internal/PRE-FRONTEND-CHECKLIST-20260919.md +0 -705
  73. package/docs/internal/PRE-FRONTEND-CHECKLIST-20260919.md.bak-s10 +0 -649
  74. package/docs/internal/PROCEDURAL-MEMORY-AND-APPROVAL-DESIGN-20260918.md +0 -225
  75. package/docs/internal/PROGRESS-20260917.md +0 -93
  76. package/docs/internal/PROMPT-GAP-AUDIT-20260920.md +0 -128
  77. package/docs/internal/R1-DEGRADE-AUDIT-20260918.md +0 -163
  78. package/docs/internal/R1-READABILITY-FORENSICS-20260919.md +0 -127
  79. package/docs/internal/R2-EVIDENCE-DEEP-AUDIT-20260918.md +0 -140
  80. package/docs/internal/R3-DEGRADE-LEDGER-DESIGN-20260918.md +0 -138
  81. package/docs/internal/R4-RECALL-QUOTA-PLAN-20260918.md +0 -218
  82. package/docs/internal/RAG-KARPATHY-PROGRAM.md +0 -229
  83. package/docs/internal/RELEASE-PROCESS.md +0 -99
  84. package/docs/internal/REPORT-P0-NIGHTLY.md +0 -212
  85. package/docs/internal/REPORT-P5-ACCEPTANCE.md +0 -31
  86. package/docs/internal/REPORT-WB-GRAPH-NIGHTLY.md +0 -153
  87. package/docs/internal/RESUME-20260918.md +0 -171
  88. package/docs/internal/RESUME-20260919.md +0 -104
  89. package/docs/internal/REVIEW-WB-GRAPH-SELF.md +0 -81
  90. package/docs/internal/RHINELAB-TO-DEEPSEEK-FEASIBILITY.md +0 -198
  91. package/docs/internal/ROADMAP-20260917-WEEK.md +0 -439
  92. package/docs/internal/ROADMAP.md +0 -106
  93. package/docs/internal/RUN-P0-NIGHTLY.md +0 -227
  94. package/docs/internal/S10-CONSTRUCTION-HANDOFF-20260917.md +0 -185
  95. package/docs/internal/S10-GAP-INVENTORY-20260917.md +0 -239
  96. package/docs/internal/S10-GAPS-PLAIN-20260917.md +0 -125
  97. package/docs/internal/SEMANTIC-ARCHITECTURE-SPEC.md +0 -360
  98. package/docs/internal/SESSION-FILE-REPAIR-PROTOCOL.md +0 -90
  99. package/docs/internal/SUBAGENT-REPORT-ROUTING-PRE-RESEARCH.md +0 -261
  100. package/docs/internal/T6-EXECUTION-20260920.md +0 -130
  101. package/docs/internal/TELEMETRY-EFFECT-REPORT-DESIGN-20260918.md +0 -146
  102. package/docs/internal/THESIS-GAP-ANALYSIS-20260918.md +0 -89
  103. package/docs/internal/THESIS-OUTLINE-20260918.md +0 -147
  104. package/docs/internal/THREE-LAYER-CONTRACT.md +0 -219
  105. package/docs/internal/TODO-BACKLOG.md +0 -263
  106. package/docs/internal/TODO-GRAPH.html +0 -715
  107. package/docs/internal/TODO-GRAPH.html.bak-20260914-v2 +0 -493
  108. package/docs/internal/TODO-GRAPH.html.bak-20260915-alsfix +0 -710
  109. package/docs/internal/TODO-GRAPH.html.bak-20260915-p1 +0 -710
  110. package/docs/internal/TODO-GRAPH.html.bak-20260915-p6a-rev +0 -703
  111. package/docs/internal/TODO-GRAPH.html.bak-20260915-wshint +0 -710
  112. package/docs/internal/TODO-GRAPH.html.bak-20260916-batch +0 -715
  113. package/docs/internal/UPSTREAM-ISSUE-PR-TRIAGE-20260919.md +0 -297
  114. package/docs/internal/UPSTREAM-ISSUES-3RD-AUDIT-20260920.md +0 -104
  115. package/docs/internal/WB-FORMAT-CONVENTION.md +0 -112
  116. package/docs/internal/WB-GRAPH-DECISIONS-20260914.md +0 -71
  117. package/docs/internal/WB-GRAPH-INTEGRATION-PLAN.md +0 -386
  118. package/docs/internal/WB-GRAPH-RESEARCH-BRIEF.md +0 -118
  119. package/docs/internal/WB-GRAPH-RESEARCH-EXTERNAL.md +0 -228
  120. package/docs/internal/WB-GRAPH-RESEARCH-LOCAL.md +0 -190
  121. package/docs/internal/reviews/CLAIM-VERIFICATION-20260914.md +0 -56
  122. package/docs/internal/reviews/PLAN-gpt6astra-round2-20260914.md +0 -787
  123. package/docs/internal/reviews/REVIEW-gpt6astra-20260914.md +0 -112
  124. package/docs/internal/reviews/ROUND3-REVIEW-INTEGRATION-20260914.md +0 -230
@@ -1,297 +0,0 @@
1
- # 上游 issue / PR 批次 · 逐条判断与落地台账(2026-09-19)
2
-
3
- > **背景**:合作方 `Minervaowl7` 于 2026-09-18 提交 issue **#75/#76** 与 PR **#77/#78/#79/#80**(来源:Qoder 审查报告 → 独立对抗复核)。
4
- > **用户指示(2026-09-19 03:0x)**:「逐个判断修复,记得**不要只看局部,要看总体**,不要造成修复的错误问题。**修好以后,都要回复**,然后所有的 pull request 都要**礼节性地 merge**。」
5
-
6
- ## ★ 0. 两条线的关系(决定处置顺序,务必先读)
7
-
8
- | | pre 开发线(本地 `D:\dsh-auto-memory`) | REL / main(远端正式版) |
9
- |---|---|---|
10
- | 文件名 | `lib/*-pre.js`(带 `-pre` 后缀) | `lib/*.js`(裸名,由 `tools/release.mjs` 转换) |
11
- | 状态 | **活宿主代码**(profile `link:` 挂载) | **已发布 npm 3.0.0**,有真实用户 |
12
- | 本批 PR 的 base | — | ✅ **PR 全部 base = `main`** |
13
-
14
- **⇒ 关键结论(易错点)**:PR 是打在 **main** 上的,merge 它们**不影响本地 pre**(用户已确认此点)。
15
- **但**用户后续「发大版本时用 pre 统一覆盖正式版」——**若 pre 线没有对应修复,覆盖时这些修复会丢**。
16
- **⇒ 因此每一批修复必须做两件事:① merge PR(礼仪)② 在 pre 线落地同等修复(保数据)。**
17
-
18
- **命名转换**:PR 里的 `lib/episodic-store.js` ↔ pre 线 `lib/episodic-store-pre.js`;`lib/memory-hub.js` ↔ `lib/memory-hub-pre.js`;以此类推。
19
-
20
- ---
21
-
22
- ## 1. 逐条判断
23
-
24
- ### PR #77 — episodic_candidate 改增量导入(**P0 数据丢失**)
25
- - **base/head**:`main` ← `fix/episodic-import-no-overwrite`;+113 −5;3 文件;mergeable ✅
26
- - **Fixes**:#63、#57
27
- - **判断**:✅ **内容正确,质量高**。与我方独立复核同源:
28
- `ingestJudgement` 对每行 `episodic_candidate` 调 `stores.episodic.restore({schemaVersion:1, episodes:[row]})`,
29
- 而 `restore()` 是**快照整体替换**(先 `episodes=[]`);候选行缺 `validateEpisodePre` 必填字段 ⇒ 校验拒(`restored:0`)
30
- 但 **episodes 已清空、current 已置 null**,且返回 `{ok:true}` ⇒ hub 记 `consumedEpisodic++`/`outcome:'restored'`
31
- ⇒ 下次 consolidate/flush 把清空态落盘 ⇒ **一次 ingest 抹掉全部已巩固 episode,不可逆**。
32
- - **修法**:新增 `importEpisodes(rows)`(逐条校验、合法才追加、**绝不清空既有状态**、按 episodeId 幂等);
33
- `restore()` 保留给启动全量恢复;hub 的 episodic 分支改走 `importEpisodes([row])`,outcome 如实区分 `restored`/`rejected:N`。
34
- - **pre 线现状**:**部分已修** —— #57(`restore` 形状校验)我方已修(`restoreCurrentPre`);
35
- **#63(episodic_candidate 清空)尚未修** ⇒ **待落地**。
36
-
37
- ### PR #78 — index-sync 页字节预算留信封余量(**P0 死锁**)
38
- - **base/head**:`main` ← `fix/index-sync-page-headroom`;+98 −2;2 文件;mergeable ✅
39
- - **Fixes**:#64
40
- - **判断**:✅ **内容正确**。`INDEX_SYNC_PAGE_BUDGET_V1.maxPageBytes` 与 `m7-wire` 的 `MAX_LINE_BYTES` **同为 256KiB**,
41
- 而分页闸只量 payload ⇒ 加上帧信封(实测约 **230B**)+ 换行后**必超限** ⇒ `worker_v1.py` 判 `line-oversize` fail-closed 退出;
42
- 终局错误帧 `requestId:''` 被当 unknownRequest 丢弃。死锁核心:熔断阈值 3,但每段 `index_sync_begin` 成功帧清零计数
43
- ⇒ 峰值 2 永不熔断;`syncId` 由 recordCount 确定性派生 ⇒ 重试恒重建同一坏页。
44
- - **修法**:`maxPageBytes` 取 **252KiB**(4KiB 余量 ≈ 信封的 18 倍),常量与文件头注明原因。
45
- - **pre 线现状**:**待落地**(需找到 pre 线对应常量)。
46
-
47
- ### PR #79 — 下载器每次镜像尝试前清空 tmp(**P1 静默损坏**)
48
- - **base/head**:`main` ← `fix/downloader-fresh-attempt`;+63 −0;2 文件;mergeable ✅
49
- - **Fixes**:#65
50
- - **判断**:✅ **内容正确**。`fetchToFile` 对同一 `tmp/<basename>` 反复 `flag:'a'` 追加,
51
- 但只在 `run()` 开始清一次 tmp ⇒ 单文件双镜像重试时,源 A 的半截文件被续上源 B 的完整流;
52
- **sha256 只对网络流累积、不回读文件** ⇒ 拼接体校验通过并 rename 落位,加载期才失败(118MB onnx)。
53
- - **修法**:每次尝试开始 `rmSync(dst, {force:true})`。
54
- - **pre 线现状**:**待落地**(需找到 pre 线 semantic-js 对应处)。
55
-
56
- ### PR #80 — 三处 store 数据完整性小修
57
- - **base/head**:`main` ← `fix/store-hardening-20260918`;+97 −2;5 文件;mergeable ✅
58
- - **Fixes**:#55、#56、#67
59
- - **判断**:✅ **内容正确**;其中 **#55/#56 我方 pre 线已修**(本批 ① 已完工),**#67 尚未修**。
60
- 1. **#55** `storage-manage`:`readSidecarPrev` 引用未定义 `docStore` ⇒ ReferenceError 被吞 ⇒ 恒返 null
61
- ⇒ `repair()` 永远 `rebuildSidecar(file, undefined)` ⇒ 每次修复产生新 epoch + sourceVersion 回退(**自愈反向制造 stale**)。
62
- **pre 线**:✅ 已修(补 `const docStore = docStoreOf()`)。
63
- 2. **#56** `evidence-store`:`_appended.add(id)` 在链式写入**执行前**,写失败无回滚 ⇒ 同 id 重试恒 `duplicate-evidence`(证据静默丢失)。
64
- **pre 线**:✅ 已修(`written===false` 时 `_appended.delete(id)`;`BoundedIdSet` 补 `delete()`)。
65
- 3. **#67** `fact-store`:`conflicts.push({left: existing,...})` 持**活引用** ⇒ 后续 merge 原地改写 `confidence` 并对 `provenance`
66
- **数组原地 push** ⇒ 已落盘(facts.json)的冲突左侧 ≠ 检测时值,**审计面失真**。
67
- **pre 线**:⬜ **待落地**(登记时取检测时快照,含 provenance 数组副本)。
68
-
69
- ---
70
-
71
- ## 2. issue(跟踪项,非 PR)
72
-
73
- ### Issue #75 — `[P3]` 低危时序打包(CC-9 / CC-11)
74
- 1. **CC-9 延后写绑定错 child**(`lib/python-sidecar-client.js:211-213`):`writeChain.then` 回调解引用**当时的** child 变量;
75
- writeChain 慢回调窗内 respawn ⇒ 旧 epoch 帧写入新 worker ⇒ 被判 staleEpoch 丢弃 ⇒ 请求挂满自身超时。
76
- **修**:建帧时捕获 child 引用,flush 时校验身份。
77
- 2. **CC-11 stepFor 双自增压缩 TTL 窗**(`lib/activation-host.js:351` 定义,`:217/:237/:286` offer/pump 各调一次):
78
- 自增器被**两次调用**而零时间流逝 ⇒ `expiresAtStep` 按第一次烘焙、判定用第二次 ⇒ ttl=3 的自然窗 2 次机会缩为 1。
79
- **修**:提供**只读** `currentStep` 给其中一处(「同步 offer+pump」不该消耗 2 步 TTL)。
80
-
81
- ### Issue #76 — `[P3]` 诊断盲区与卫生打包(6 项)
82
- | 代号 | 位置 | 问题 | 修 |
83
- |---|---|---|---|
84
- | CB-2 | `memory-index.js:58,61` | 读 `prev.version`,但缓存写 `{fileDigest, sourceVersion}` ⇒ 恒 undefined ⇒ 版本振荡(edit1→v2、edit2→v2 卡死、unchanged→v1 回退) | 对齐键名 |
85
- | CB-10 | `m7-index-sync-host.js:36` | `enabledKeys` 声明后**全仓无 `.add`** ⇒ `capturedPathKeys` 恒 `[]`;7 处 `drop` 第二参数全为字面量 `0` ⇒ `contextVersion` 恒 0 ⇒ 死锁在 `/state` 不可见 | drop 传真实 contextVersion;明确语义(注释与字段名矛盾) |
86
- | CC-4 | `semantic-decide.js:173-177` vs `python/m7_activation_features_v2.py:292-294` | 硬门 reason 取名顺序**互为反序** ⇒ 多门共触时归因名不同(决策同为 suppress,仅诊断失真) | 统一顺序 |
87
- | CC-6 | `semantic-js.js:428-479` | `bytesTotal` 用逐文件滚动基(每文件边界从 100% 回退);`verifying` 态无复位(黏滞);`opts.mirrors` 注入点被硬编码废掉 | 三处分别修 |
88
- | CC-12 | `memory-hub.js:81-84` | 检查 `stores.facts.factCandidateFromJudgementRow`,但 `createFactStorePre` 返回对象**不含该方法**(模块级导出才有) ⇒ 委托分支恒走本地副本(**丢 ttl**),两适配器从此各自演化 | 对齐委托来源 |
89
- | CC-13 | 三处零散 | a) `python-sidecar-client.js:280-287` `restart()` 注释称"全部 rejected"但函数体无结算;b) `memory-writer.js:297,483,486-498` `dirty` 标志**全仓无读者**;c) `fact-store.js:384` `clear()` 漏重置统计、`:256` `supersede()` 走 upsert 恒返回 `'created'` | 逐条修 |
90
-
91
- **判断**:✅ 全部**为诊断级/潜伏态**(作者自述"不影响主链路数据"),与 `TODO-BACKLOG §B` 的"跨会话跨 Agent 检索"同属大排期,**不阻塞前端重构**。
92
-
93
- ---
94
-
95
- ## 3. pre 线同步落地(✅ 全部完成 2026-09-19 04:0x)
96
-
97
- | 序 | 项 | pre 线文件 | 状态 |
98
- |---|---|---|---|
99
- | 1 | **#63 episodic_candidate 清空**(PR #77,**P0 数据丢失**) | `episodic-store-pre.js` + `memory-hub-pre.js` | ✅ **已落地** |
100
- | 2 | **#64 index-sync 页预算**(PR #78,**P0 死锁**) | `index-sync-pre.js`(252KiB + 注释说明原因) | ✅ **已落地** |
101
- | 3 | **#65 下载器 tmp 拼接**(PR #79,**P1 静默损坏**) | `semantic-js-pre.js`(每次尝试前 `rmSync(dst)`) | ✅ **已落地** |
102
- | 4 | **#67 fact-store 冲突左侧活引用**(PR #80 第 3 条) | `fact-store-pre.js`(登记时取快照 + provenance 副本) | ✅ **已落地** |
103
- | 5 | #55/#56/#57 | — | ✅ 已修(本批 ①) |
104
- | 6 | issue #75/#76(12 项 P3 诊断) | 多处 | ⬜ 未做(**不阻塞前端**,归大排期) |
105
- | 7 | issue #73(17 个 smoke 腐坏 + python import 失效 + 无 CI) | `tests/smoke/` | ⬜ 未做(**独立跟踪**) |
106
-
107
- ### pre 线落地的四条实现要点(供压缩后恢复)
108
-
109
- 1. **#63**:`episodic-store-pre.js` 新增 **`importEpisodes(rows)`** —— 逐条校验、只追加合法项、按 `episodeId` 幂等、**绝不清空既有状态**;`restore()` 仍保留给启动全量恢复。
110
- hub 的 episodic 分支改走它,**outcome 如实区分**(`imported` / `rejected:N` / `duplicate-episode`)。
111
- ⚠️ 加了 **fallback**:老 store 无 `importEpisodes` 时 fail-soft 返回 `no-import-episodes`,**绝不回退到 `restore`**。
112
- 2. **#64**:`INDEX_SYNC_PAGE_BUDGET_PRE_V1.maxPageBytes` 由 `256*1024` → **`252*1024`**,并写明原因(信封 202–230B + 换行,4KiB ≈ 18 倍余量)。
113
- 3. **#65**:`fetchToFile` 在建 hash **之前**加 `try { rmSync(dst, { force: true }) } catch (_) {}`。
114
- 4. **#67**:`conflicts.push` 的 `left` 由活引用 `existing` 改为 **`{ ...existing, provenance: [...existing.provenance] }`**(检测时快照);`right` 同样取副本。
115
-
116
- **验收**:`tests/smoke/smoke-test-prsync-20260919-pre.mjs` **30/30**(含 #67 的行为验证:merge 反复改写后冲突左侧仍等于检测时值);
117
- `artifacts/_mutate-prsync.mjs` **5/5 真红 + SHA256 逐字节还原**;**全量回归 PASS 128 / FAIL 0**(基线 127 → 128)。
118
-
119
- **备份**:`lib/*.bak-20260919-PRsync`(5 个文件)。
120
-
121
- ---
122
-
123
- ## 3.5 merge 与回复执行结果(✅ 全部完成 · 以 GitHub API 实测为准)
124
-
125
- ### PR(4/4 已合并 + 已回复)
126
- | PR | 状态 | merge commit | 评论 |
127
- |---|---|---|---|
128
- | #77 | `closed` / **merged=true** | `25c1e8da` | ✅ 1 条 |
129
- | #78 | `closed` / **merged=true** | `cb7e0c67` | ✅ 1 条 |
130
- | #79 | `closed` / **merged=true** | `3e0218da` | ✅ 1 条 |
131
- | #80 | `closed` / **merged=true** | `cc708392` | ✅ 1 条 |
132
-
133
- - **merge 方式**:GitHub API `PUT /pulls/{n}/merge`,`merge_method=squash`,带 sha 校验(防并发漂移)。
134
- - **凭据来源**:`git credential fill` 从 Windows Credential Manager 取(**不是** `~/.dsh/.credentials.yaml`,那里只有各家 API key)。
135
- `gh` CLI **未安装**;`git config credential.helper = manager`。
136
- - **★ 关键认知(用户已澄清)**:PR base = **main(正式版)** ⇒ **merge 不影响本地 pre**;用户发大版本时用 pre 统一覆盖。
137
- ⇒ 因此「merge 礼仪」与「pre 线落地」是**两件独立且都必须做**的事(见 §0 与 §3)。
138
-
139
- ### issue
140
- | issue | 状态 | 说明 |
141
- |---|---|---|
142
- | #55 / #56 / #57 / #67 | `closed` / reason=**completed** / 各 1 条评论 | 我方已修 ⇒ **回复 + 关闭** |
143
- | #63 / #64 / #65 | `closed` / reason=completed / **0 评论** | 由 PR body 的 `Fixes #N` **自动关闭**(本仓惯例,不额外补评论) |
144
- | #73 | **open** | 17 个 smoke 腐坏 + python import 失效 + 仓库无 CI —— **独立跟踪项,未做** |
145
- | #75 / #76 | **open** | 12 项 P3 诊断/卫生 —— **未做**,不阻塞前端 |
146
-
147
- **main 最新 4 条提交**(均已落入正式版):
148
- ```
149
- cc708392 fix(stores): repair 继承失效 / evidence 幂等缓存吞重试 / 冲突左侧活引用 (#80)
150
- 3e0218da fix(semantic-js): 下载器每次镜像尝试前清空 tmp 残留 (#79)
151
- cb7e0c67 fix(index-sync): 页字节预算为线帧信封留余量 (#78)
152
- 25c1e8da fix(episodic): episodic_candidate 改增量导入 (#77)
153
- ```
154
-
155
- ### 回复正文落盘位置
156
- 4 条 PR 评论 + 4 条 issue 评论的**完整正文**写在 `artifacts/_gh-reply-and-close.mjs`(`PR_COMMENTS` / `CLOSE` 两个对象),
157
- 已通过 API 发出;如需重发或改措辞,直接改该文件再跑即可。
158
-
159
- ---
160
-
161
- ---
162
-
163
- ## 3.6 第二批(2026-09-19 05:0x · 用户重启宿主后)
164
-
165
- **用户指示**:「还有 11 个 issue 和 PR,把他们全修。首先判断这个 bug 报告**是否适用于进行过一轮底层优化的版本**。如果问题还存在,就进行修复。修复以后:1) 如果是 issue,就回复关闭;2) 如果是 request,那就礼节性 merge。」
166
-
167
- ### 3.6.1 实测清单(11 issue + 4 PR = 15 条 open)
168
-
169
- | 类型 | 编号 |
170
- |---|---|
171
- | issue | **#58**, #66, #68, #69, #70, #71, #72, #73, #74, #75, #76 |
172
- | PR | **#59, #60, #61, #62** |
173
-
174
- ### 3.6.2 PR 处置结果(4/4 已处理)
175
-
176
- | PR | 对应 issue | 状态 | 处置 |
177
- |---|---|---|---|
178
- | **#62** | #58 | `clean` | ✅ **squash-merge** `06154146ea232ce9a7ee6d881c7811bc0dc97943` + 回复 |
179
- | **#59** | #55 | `dirty` | ⚠️ **内容已被 #80 等价覆盖** ⇒ 回复说明 + 关闭 |
180
- | **#60** | #56 | `dirty` | ⚠️ **内容已被 #80 等价覆盖** ⇒ 回复说明 + 关闭 |
181
- | **#61** | #57 | `dirty` | ⚠️ **内容已被 #77 等价覆盖** ⇒ 回复说明 + 关闭 |
182
-
183
- **★ 为什么 #59/#60/#61 是 dirty(关键事实,已实测)**:
184
- - 这三条 PR 与 #77/#80 在**同一文件的同一处**做了等价修复 ⇒ Git 判冲突。
185
- 对照证据:`#59` 改 `lib/storage-manage.js` 补 `const docStore = docStoreOf()` ↔ `#80` 同文件 +3−0;
186
- `#60` 改 `lib/evidence-store.js` + `lib/context-bridge.js` ↔ `#80` 同两文件;
187
- `#61` 新增 `validateEpisodeCurrentPre()` ↔ `#77` 的 `restoreCurrentPre()`(**函数名不同、语义相同**)。
188
- - **无法先同步 base 再合并**:`PUT /pulls/{n}/update-branch` 返回 **403** `user doesn't have permission to update head repository`
189
- —— PR 来自对方 **fork**,我方无权更新其分支。
190
- - 因此按「内容已生效」处理:**回复说明 + 关闭**(回复里明确说明此事,并承诺「若希望保留 PR 形式可重开一条基于当前 main 的分支」)。
191
- - **一个遗憾(已登记)**:`#59` 附带的 `tests/smoke/smoke-test-issue55-sidecar-prev-pre.mjs`(141 行)**未随 #80 进 main**,
192
- #80 带的是合并版 `smoke-test-store-hardening-pre.mjs`;前者更聚焦。
193
-
194
- ### 3.6.3 issue 存活核验(进行中)
195
-
196
- **核验口径(用户明确要求)**:「判断这个 bug 报告**是否适用于进行过一轮底层优化的版本**」——报告基于 `main@d816497`(v3.0.0) 写,
197
- 而 pre 线已经过 **L/M/R 多轮优化**,部分问题可能已被顺手修掉。
198
-
199
- **★ 先例**:**#58 在 ① 批次就已修好** —— `activation-host-pre.js:531` 已按登记的 `st.stepKey` 精确回收(不再重新拼键),
200
- `index.js:1088` 已接线 `this._activationHost.disposeRuntime(runtime.key)`。报告里的「根因 1 零调用方 + 根因 2 键错配」**两条都已在 pre 线解决**。
201
-
202
- **已实测确认仍存在的 3 条**:
203
- - **#66**(BOM 偏移 3 字节,P1):`memory-anchor-pre.js:125-126` 剥 BOM 后给偏移;`memory-writer-pre.js:106/109` 直接用于含 BOM buffer,**无 bomLen 对齐**。
204
- - **#69**(currentEpoch 采样在 spawn 前,P2):`m7-index-sync-host-pre.js:90` 的 `currentEpoch()` 仍在 `sendIndexSyncPlanPre` **之前**;`:101` 失效条件仍带 `epoch &&` 前置。
205
- - **#71**(growToMin 压空白,P2):`l0-extract-pre.js:461` 先 `.replace(/\s+/g,' ')`、`:463` 再用**含 `\n` 的** `SENTENCE_SPLIT_RE(:41)` split ⇒ 换行分支死代码成立。
206
-
207
- **其余 8 条**(#68/#70/#72/#73/#74/#75/#76)由两个只读子代理并行核验中。
208
-
209
- ### 3.6.4 纪律警示(本批次新增)
210
-
211
- - **★ PR 来自 fork 时无权 update-branch**(403)⇒ 若 PR 与已合并的等价修复冲突,**只能回复 + 关闭**,不能"先同步再合并"。
212
- - **★ 同一修复可能以不同函数名出现在两个 PR 里**(`validateEpisodeCurrentPre` vs `restoreCurrentPre`)⇒ 判 dirty 时必须**比对语义**而非只看名字。
213
- - **★ `git credential fill` 从 Windows Credential Manager 取 token 可用**(`gh` CLI 未安装)—— 本轮全部 GitHub 操作均走此路径。
214
-
215
- ---
216
-
217
- ## 4. 后续(未做,登记防遗忘)
218
-
219
- | 项 | 内容 | 阻塞前端? |
220
- |---|---|---|
221
- | **#73** | 17 个 smoke 腐坏 + `python/` 测试 import 失效 + 仓库无 CI | ❌ 不阻塞(但会让"回归全绿"的可信度打折,建议前端前处理) |
222
- | **#75** | CC-9 延后写绑定错 child / CC-11 stepFor 双自增压缩 TTL 窗 | ❌ 不阻塞(低危时序) |
223
- | **#76** | CB-2 / CB-10 / CC-4 / CC-6 / CC-12 / CC-13 六项诊断盲区与卫生 | ❌ 不阻塞 |
224
- | **#77 遗留一问** | 「熔断计数被成功帧清零」不只影响 page-oversize —— 任何"成功一次就重置"的熔断都会退化 ⇒ 建议单开跟踪 | ❌ 不阻塞 |
225
-
226
-
227
- ---
228
-
229
- ## 4. 回复与 merge(礼仪)
230
-
231
- - **回复要点**(每个 PR/issue):① 确认复核结论(我们独立验证过)② 说明落点(pre 线已同步 / 已随版本发布)③ 致谢。
232
- - **merge 政策**(用户 2026-09-19 明确):「我本地是 pre,远端是正式版 ⇒ **礼节性 merge 不会对本地造成影响**,等我发大版本时统一覆盖」⇒ **全部 merge**。
233
- - **凭据实测**:本机 `gh` CLI **未安装**;`git config credential.helper = manager`;2026-09-13 已验证「fine-grained PAT 可合并自己仓库的 PR」。
234
- ⇒ merge 走 GitHub API(`PUT /repos/Aik358/dsh-auto-memory/pulls/{n}/merge`),token 从本机凭据取。
235
- - **issue 关闭**:#63/#64/#65 由 PR merge 自动关闭(body 含 `Fixes #N`);**已修复但未关闭**的(#55/#56/#57/#67)需手动回复 + 关闭。
236
-
237
- ---
238
-
239
- ## 3.7 第二批 issue 最终处置结果(2026-09-19 17:5x)
240
-
241
- **全量回归基线**:128 → 131(①②③)→ 132(#72)→ 133(#76)→ 134(#74)→ **135**(#75)。
242
- **判据**:用户指令「先判断这个 bug 报告**是否适用于进行过一轮底层优化的版本**,如果问题还存在就修复」。
243
-
244
- ### 逐条结果
245
-
246
- | issue | 优先级 | 核验结论 | 处置 |
247
- |---|---|---|---|
248
- | **#58** | P1 | STILL_EXISTS | ✅ 由 PR **#62** squash-merge 关闭(`06154146`) |
249
- | **#66** | P2 | STILL_EXISTS | ✅ **已修**(BOM 剥离 · 消费侧)· batch3 21/21 · 变异 3/3 |
250
- | **#68** | P1 | STILL_EXISTS | ✅ **已修**(JS/Python 分叉 · `isAlnumPythonish`)· batch4 14/14 · 变异 3/3 |
251
- | **#69** | P2 | STILL_EXISTS | ✅ **已修**(index-sync epoch 判据)· batch2 · 变异真红 |
252
- | **#70** | P2 | STILL_EXISTS | ✅ **已修**(degraded 有界重试 + probe 暴露)· batch2 · 变异真红 |
253
- | **#71** | P2 | STILL_EXISTS | ✅ **已修**(`growToMin` 保留行界)· batch2 · 变异真红 |
254
- | **#72** | P2 | STILL_EXISTS | ✅ **已修**(epoch 门 fail-closed + 三条路径清 buffer)· batch5 12/12 · 变异 **3/3** |
255
- | **#73** | P1 | **部分不成立** | ✅ **已修可修部分**(新增 `.github/workflows/tests.yml` + `--exclude`);17 红 + import 失效在 pre 线**不存在** |
256
- | **#74** | P3 | STILL_EXISTS | ✅ **已修**(月末钳制 + 模糊量词 + 正则锚定 + 分量校验)· batch7 24/24 · 变异 **4/4** |
257
- | **#75** | P3 | STILL_EXISTS | ✅ **已修**(writeFrame 身份绑定 + currentStepOf 只读步)· batch8 15/15 · 变异 **3/3** |
258
- | **#76** | P3 | **部分成立** | ✅ **已修 2 项**(hub 死委托 + clear 统计)· batch6 12/12 · 变异 **2/2** |
259
-
260
- ### 关键核验发现(#73):**上游 issue 的根因清单可能整体过时**
261
-
262
- #73 声称「17 个 smoke 套件腐坏 + `tests/test_m7_features_v2.py` import 失效 + 仓库无 test CI」。
263
- 逐条在当前 pre 线实跑后:
264
-
265
- | #73 主张 | pre 线实况 |
266
- |---|---|
267
- | 17 个 smoke 红 | ❌ **不成立** — 17 个套件**全部存在且全绿**(PASS 134 / FAIL 0) |
268
- | `test_m7_features_v2.py` import 失效 | ❌ **不成立** — `python/m7_activation_features_pre_v2.py` **存在**,import 有效 |
269
- | python/bench/.venv 缺失 | ❌ **不成立** — 本机存在(但确在 `.gitignore:9`,CI 需排除) |
270
- | artifacts/release-c2-asset-pack 缺失 | ❌ **不成立** — 本机存在(确在 `.gitignore:25`) |
271
- | fixture 冻结值 `m7_chunk_pre_v1` vs 运行时 `m7_chunk_v1` | ⚠️ 差异**存在但属设计**(烟测 `:28` 正向断言该冻结值) |
272
- | **仓库无 test CI** | ✅ **成立**(两条线都有) ⇒ 这是 issue 自己列的第一条修复建议,**已落地** |
273
-
274
- **⇒ 纪律**:核验上游 issue 时,必须**逐条在当前线实跑**,只修仍然成立的部分。v3.0.0(main@d816497) 的事实经 L/M/R 多轮优化后可能整体失效。
275
-
276
- ### 本批新增的两条可复用纪律
277
-
278
- 1. **「上游 issue 的根因清单可能整体过时」** — 见上表。
279
- 2. **「`edit` 工具会改变文件行尾」** — 用 `edit` 写入 `lib/temporal-parse-pre.js` 后该文件从 CRLF 变**全 LF**(191 行),而本仓 `lib/*.js` 全是 CRLF。后果:① 基于 `\r\n` 的变异脚本锚点**全部不命中**(表现为「变异未命中源码」SKIP)② 污染 git diff。修法:`[System.IO.File]::WriteAllText` + `UTF8Encoding($false)` 转回;验收:`(s.match(/\r\n/g)||[]).length` 应等于总行数。**排查信号**:变异脚本报「未命中源码」而人工确认文本存在 ⇒ 先查行尾。
280
-
281
- ### 新增测试资产(本批 5 个套件 + 4 个变异脚本)
282
-
283
- | 文件 | 覆盖 | 结果 |
284
- |---|---|---|
285
- | `tests/smoke/smoke-test-batch5-20260919-pre.mjs` | #72 | 12/12 |
286
- | `tests/smoke/smoke-test-batch6-20260919-pre.mjs` | #76-5 / #76-6c | 12/12 |
287
- | `tests/smoke/smoke-test-batch7-20260919-pre.mjs` | #74 四项 | 24/24 |
288
- | `artifacts/_mutate-batch5.mjs` | #72 三处 | **3/3 真红** |
289
- | `artifacts/_mutate-batch6.mjs` | #76 两处 | **2/2 真红** |
290
- | `artifacts/_mutate-batch7.mjs` | #74 四处 | **4/4 真红** |
291
-
292
- (batch2/3/4 见 §3.6;全部变异演示均 SHA256 逐字节还原。)
293
-
294
- ### 未做(登记待办,不阻塞前端)
295
-
296
- - ~~**#75**~~(P3)✅ **已修**(2026-09-19):CC-9 `writeFrame` 建帧时捕获 `child` 引用 + flush 校验身份;CC-11 新增只读 `currentStepOf` 供 `pumpClaimed` 使用(同一步不再消耗 2 步 TTL)。
297
- - **#76 剩余 4 项**(P3 诊断级):CB-2 memory-index 版本振荡 · CB-10 index-sync `enabledKeys` 恒空 · CC-4 硬门归因序反序 · CC-6 下载进度显示 · CC-12 已修 · CC-13a/b 卫生。
@@ -1,104 +0,0 @@
1
- # 上游 issue 第三批核验(2026-09-20)· pre 线适用性判定
2
-
3
- > 来源:https://github.com/Aik358/dsh-auto-memory/issues
4
- > 背景:用户问「能不能合并一起改」+「逐步改完逐步回归时间太长就明天再说」
5
- > **纪律**:先实跑核验是否适用于当前 pre 线版本,**不照单全修**(仓库既有铁律)
6
-
7
- ---
8
-
9
- ## 一、分类结论
10
-
11
- ### A 类 · pre 线已重构掉,**不适用**(4 条,零动作)
12
-
13
- | issue | 上游说法 | pre 线实测 |
14
- |---|---|---|
15
- | **#83** | `lib/ledger-criteria.js` 与 `wb-contract.js` 同名异体重复实现 | **`lib/ledger-criteria.js` 根本不存在** ⇒ 已重构掉 |
16
- | **#86-1** | `rerank-host.js` 的 `sha256Hex` 实为 FNV-1a 同名异义 | **`lib/rerank-host.js` 不存在** ⇒ 已移除 |
17
- | **#86-2** | `canonicalJson` 双份(`m7-wire.js` + `state-commit.js`) | **`lib/state-commit.js` 不存在** ⇒ 双份已消解 |
18
- | **#100-⑦** | 倒计时小数秒 `Math.ceil(msDiff)/1000` | **`Math.ceil(msDiff)` 零命中** ⇒ 已重构 |
19
-
20
- ### B 类 · **确实适用**,但风险分级不同(5 条)
21
-
22
- | issue | pre 线实测 | 风险 | 今晚做? |
23
- |---|---|---|---|
24
- | **#82** | 写侧 `:10528` 仍裸 `readFileSync→writeFileSync` 非原子、无队列;加载侧 `:1861/:1878` 仍 `_mergeConfigPre(null)` 静默回落 | **中**(配置写路径,触及启动) | ⏸ 明天 |
25
- | **#86-4** | 水位 `0.75` **7 处内联**(`:2989 :3318 :3504 :4111 :4117 :4136 :5489`),真源 `:366` | **低**(纯常量化) | ✅ 可做 |
26
- | **#86-3** | `DSH_HOME` 解析 **20 处**(跨 6+ 文件) | **中**(跨文件重构) | ⏸ 明天 |
27
- | **#84** | `volatileEvents ≤16`(`:48`);`unhandledRejection` 守卫 `:8896` 无计数 | **中低**(新增诊断文件) | ⏸ 明天 |
28
- | **#99-③** | **已有** `removeArm` 两步武装(`:3559-3561`) | 待核 | ⏸ 明天 |
29
-
30
- ### C 类 · 已在早前批次处理过(历史)
31
-
32
- `#73`(17 个 smoke 红)— pre 线全量回归 **PASS 134 / FAIL 0**,该 issue 基于 `main@d816497(v3.0.0)`,结论**整体过时**。
33
-
34
- ---
35
-
36
- ## 二、今晚执行:**#86-4 水位常量化**(唯一低危项)
37
-
38
- ### 为什么单独做这一条
39
-
40
- 1. **零行为变更**:`|| 0.75` 与常量 `DEFAULT_WATER_LEVEL_THRESHOLD = 0.75` **取值完全相同**,只是把散落的魔法数字收敛到一处;
41
- 2. **价值成立**:该默认值历史上**全局调过一次**(0.8 → 0.75),下次再调极易漏站点——7 处任何一处漏改就是静默不一致;
42
- 3. **可验证**:改后全量回归必须仍然 **134/0**,且新增断言锁住「内联 0.75 归零」。
43
-
44
- ### 改动方式(最小改法)
45
-
46
- - 在 `DEFAULT_CONFIG` 附近新增 `export const DEFAULT_WATER_LEVEL_THRESHOLD = 0.75`;
47
- - 7 处 `|| 0.75` 全部替换为 `|| DEFAULT_WATER_LEVEL_THRESHOLD`;
48
- - `DEFAULT_CONFIG.waterLevelThreshold` 引用该常量(消除「真源也没引用常量」的漏洞);
49
- - **不动** `Math.max(..., 0.1)` 的下限逻辑(那是另一件事)。
50
-
51
- ### 验收(已实跑完成)
52
-
53
- | 项 | 结果 |
54
- |---|---|
55
- | `node --check` | ✅ |
56
- | 新增套件 `smoke-test-t7a-defaults-pre.mjs` | ✅ **5 / 5** |
57
- | 变异验证 `artifacts/_mutate-t7a.mjs` | ✅ **4 / 4 真红**(含「耦合」靶点) |
58
- | 字节一致还原 | ✅ SHA256 `E3271975…2B45` |
59
- | **全量回归** | ✅ **PASS 135 / FAIL 0 / TIMEOUT 0(136.5s)**(134→135,新增 T7-a 套件) |
60
-
61
- ### ★ 执行中的两个重要发现(都已处置)
62
-
63
- **① 差点把两个独立开关耦合成一个(初版错误,当场修正)**
64
-
65
- 首版脚本用一条正则 `\|\| 0\.75(?=[,)])` 全量替换,把 `autoContinueThreshold` 的两处兜底
66
- **也**换成了 `DEFAULT_WATER_LEVEL_THRESHOLD`。但 `autoContinueThreshold` 是**独立配置项**
67
- (注释只说它俩历史上被同时下调过一次)——共用常量会让「只调水位、不动自动接续」变成不可能,
68
- **违反本仓「功能开关必须解耦」纪律**。
69
-
70
- 处置:建**第二个**常量 `DEFAULT_AUTO_CONTINUE_THRESHOLD = 0.75`(附注释说明为何故意不复用),
71
- 并新增断言 **T7-4** 专门锁「两个开关不得共用同一常量」——变异验证确认该断言真红。
72
-
73
- **② 新增模块级常量会打破所有「源码抽取式」测试(连锁 3 个套件)**
74
-
75
- `lib/index.js` 里有若干套件用 `new Function` 把方法体从源码里抽出来执行(`extractFn` + `new Function(...names, ...)`),
76
- 作用域里**没有模块级绑定**。常量一抽,这些套件立刻 `ReferenceError: DEFAULT_..._THRESHOLD is not defined`:
77
-
78
- | 套件 | 表现 | 处置 |
79
- |---|---|---|
80
- | `smoke-test-switch-decouple-pre.mjs` | 组件常量未注入,直接崩 | 注入 2 个常量(同值 0.75) |
81
- | `smoke-test-handoff-pre.mjs` | `renderMemoryDynamic` 抽取体引用崩 | `helperCode` 拼上常量声明 |
82
- | `smoke-test-autocont-host-pre.mjs` | **最隐蔽**:`ReferenceError` 被 `armAutoContinue` 自身 catch 吞掉 ⇒ 表现为「水位达标却不 arm」,报 `Cannot read properties of undefined (reading 'armed')` | 注入 2 个常量 |
83
-
84
- ⇒ **纪律**:此后凡被抽出的函数新增外部依赖(模块级绑定/全局),都必须同步加进该套件的注入表,
85
- 否则以「静默不生效」形式失败。已写入技能库。
86
-
87
- ---
88
-
89
- ## 三、明天待办(登记防遗忘)
90
-
91
- 1. **#82 配置读写链**(中):写侧原子化 + 队列串行;加载侧损坏文件改名 `.corrupt-<ts>` 保留 + 面板可见
92
- 2. **#86-3 `resolveDshHome()` 统一**(中):20 处、三种口径(trim 与否 / 回退次序)
93
- 3. **#84 诊断留痕**(中低):有界 NDJSON + diag 行补 ID + rejection 计数入 debugView
94
- 4. **#86-5 `scanZstdFrames` 双解析器**(低)
95
- 5. **#99-③ 核实**:三联动删除的二次确认现状
96
- 6. **上游 PR #96–#100 的评阅**:它们是同一审计员的提交,**基线都是 `upstream/main@11f0d98`**,需逐条核验是否已在我的 pre 线修复(本次已核 4 条不适用)
97
-
98
- ---
99
-
100
- ## 四、给用户的判断
101
-
102
- **「合并一起改」不建议**——理由:这 5 条 B 类触及**三个不同子系统**(配置读写 / 诊断通道 / 水位),合并成一个 PR 会让「回归红了定位不到是哪条引起」的成本远高于收益。
103
-
104
- **建议按子系统分三批**:① 水位(今晚,已完成)② 配置读写(明天)③ 诊断通道(明天)。每批独立回归,基线清晰。
@@ -1,112 +0,0 @@
1
- # 白板格式约定(WB-FORMAT-CONVENTION)v1
2
-
3
- > **效力**:白板/看板/handoff 账本的**格式与写入契约**。零代码,P0 级。任何改白板结构的实现(`lib/client.js` 渲染、sidecar schema、判据校验)都必须先符合本约定。
4
- > **上位规范**:`SEMANTIC-ARCHITECTURE-SPEC.md` §8 与 **S10.1–S10.6**(wiki 层契约);接口与预算见 `THREE-LAYER-CONTRACT.md`。
5
- > **边界(沿用既有拍板,不可越)**:**白板不建状态机**(只在"写入"一个门设防);不搬 dsh-graph 代码(只借范式);不引入跨目标依赖图;不复制 MRAgent 代码。
6
- > **建立**:2026-09-14(用户批准 S10 后落地)。
7
-
8
- ---
9
-
10
- ## 1. 三种页面,三种时态
11
-
12
- | 页面 | 时态 | 谁写 | 用途 |
13
- | --- | --- | --- | --- |
14
- | **PLAN 白板** | **现在时**(唯一事实) | 模型维护区 + 用户备注区 | 当前全貌、在做的事、卡在哪 |
15
- | **handoff 账本** | 过去时(append-only 历史) | 模型 | 交接;其"任务状态"段**只指路**,不复制白板状态(消解双状态源) |
16
- | **笔记(MEMORY.md / 日志)** | 累积时(知识) | 模型(自动沉淀) | 长期事实、决策、规则 |
17
-
18
- **索引(index)不单独手写**:由上述页面**派生**(S10.2),与检索侧 Tier-0 目录同源。
19
-
20
- ---
21
-
22
- ## 2. 锚点契约(S10.1 落地)——**最重要的一条**
23
-
24
- **规则**:白板页面里的每一个**卡片/小节**,必须在其标题行下方紧跟一行锚点:
25
-
26
- ```markdown
27
- ### 卡片标题
28
- <!-- memory:mem_<32hex> -->
29
- ```
30
-
31
- - `id` 必须匹配 `^mem_[0-9a-f]{32}$`(与 L0 抽取的 `MEM_ANCHOR_RE` 完全一致)。
32
- - **id 怎么算(内容寻址,可复算)**:`mem_` + `sha256(workspaceKey + '\u0000' + 页面相对路径 + '\u0000' + 卡片标题)` 的前 32 位十六进制。
33
- → 卡片**重排/移动不影响 id**;**标题改名 = 新 id**(旧 id 走 supersede 留痕,不得默默消失)。
34
- - **收益**:白板内容凭锚点**自动进入检索语料**(L0 抽取按锚点切条),无需任何新机制;同时白板保持"现在时视图"的定位,状态仍归记忆条目。
35
- - **禁止**:手写裸 `mem_` 前缀的其他形态、复用同一个 id 指两个卡片、把锚点写在卡片正文中间。
36
-
37
- ---
38
-
39
- ## 3. 索引派生格式(S10.2)
40
-
41
- 每条一行,供 Tier-0 目录与人读:
42
-
43
- ```markdown
44
- - [卡片标题](<页面路径>#mem_<32hex>) — 一句话摘要 · layer=whiteboard · status=current · 2026-09-14
45
- ```
46
-
47
- 派生规则:**同日多卡按白板内顺序**;`status` 取卡片状态(`current` / `superseded` / `retracted`);缺 `status` 视为 `current`(与 `isCurrentPre` 口径一致)。
48
-
49
- ---
50
-
51
- ## 4. 写入门("只在写入一个门设防")
52
-
53
- 只做**一件事**:**重写前后比对卡片集合**。
54
-
55
- - 允许:移动、改状态、改正文、加卡。
56
- - 不允许:卡片**凭空消失**。要"消失"必须显式移入 `archived` 集合并留痕(时间 + 原因)。
57
- - 违反 → 拒绝写入并报出差异清单(不是静默接受)。
58
-
59
- ---
60
-
61
- ## 5. 人机分区(B4 的解法)
62
-
63
- 每张卡片分两区,**永不互相覆盖**:
64
-
65
- ```markdown
66
- ### 卡片标题
67
- <!-- memory:mem_<32hex> -->
68
- <!-- model -->
69
- (模型维护:状态、进展、下一步)
70
- <!-- /model -->
71
- <!-- user -->
72
- (你的备注;模型只读不改)
73
- <!-- /user -->
74
- ```
75
-
76
- 模型整篇重写时**必须原样带回 `<!-- user -->` 段**。
77
-
78
- ---
79
-
80
- ## 6. lint 清单(S10.3)——试点期用这份逐条查
81
-
82
- **零 token 可判的四类**(应做成自动检查,只读 + 留痕,不新增状态):
83
-
84
- 1. **孤立条目**:无入站引用(没有任何其他卡片/笔记引用它的 id 或标题)。
85
- 2. **陈旧**:`status=superseded|retracted`,或日期超出阈值仍标 `current`。
86
- 3. **被提及却无独立卡**:正文反复提到的概念没有自己的卡片。
87
- 4. **缺交叉引用**:相关卡片之间没有互链。
88
-
89
- **需要 LLM 的一类(必须手动触发,不进自动路径)**:
90
-
91
- 5. **矛盾检测**:两条卡片给出互相冲突的结论。
92
-
93
- > 纪律:lint **只报告**,不自动改。任何自动修正都会把白板变成状态机(违反边界)。
94
-
95
- ---
96
-
97
- ## 7. 答案归档回流(S10.5)
98
-
99
- 一次分析/检索的结论,必须能**一键**沉淀为:① 白板新卡(带锚点),或 ② 记忆条目(`memory_note_pre`),或 ③ handoff 账本一条。
100
-
101
- **判据**:任何"只活在对话里"的结论,都算流程不合格——知识复利就断在这里。
102
-
103
- ---
104
-
105
- ## 8. 验收清单(能失败)
106
-
107
- - [ ] 白板每张卡都有合法锚点(正则校验通过),**且由页面派生出的 index 与 Tier-0 目录条目一致**。
108
- - [ ] 故意删掉一张卡 → 写入被拒并报出差异(**丢卡可检出**)。
109
- - [ ] 卡片重排后 id 不变;改标题后 id 变且旧 id 有 supersede 留痕。
110
- - [ ] 模型整篇重写后,`<!-- user -->` 段逐字节保留。
111
- - [ ] 造一个孤立条目 → lint 报出;造一对矛盾结论 → lint(手动触发时)报出。
112
- - [ ] 上述每一条都在 `tests/smoke/` 有对应套件,且**故意改坏实现时会红**。
@@ -1,71 +0,0 @@
1
- # WB-GRAPH 拍板点 · 一页纸(2026-09-14 整理)
2
-
3
- > **用途**:把散在 `WB-GRAPH-INTEGRATION-PLAN.md`(386 行)里的决策点集中到一页,你**直接在"结论"列写 yes/no 或回我一句**即可。
4
- > **来源**:方案 §8(8 点)+ §10(看板化 7 点);**你的方向已定**:把看板/流程图 **combine 进自己的白板**,让用户实时看到进展与整个项目的流程(= §10 的看板化)。
5
- > 状态约定:✅ 已定 / 🎯 待拍板 / ⏸ 冻结后再说。**P0-P1 不等这些拍板点,可立即做。**
6
-
7
- ---
8
-
9
- ## A. 方案 §8 的 8 个拍板点
10
-
11
- | # | 问题 | 选项 | 方案建议 | 影响 / 代价 | 结论 |
12
- | --- | --- | --- | --- | --- | --- |
13
- | A1 | **P2/P3 是否立项** | 立项 / 等冻结解除 / 不做 | P0-P1 立即做;**P2-P3 等后端冻结解除后按方案执行** | P2/P3 都改 `lib/index.js` 本体,冻结期内禁改引擎 | 🎯 |
14
- | A2 | **sidecar 位置** | `memoryRoot/<ws>/handoff/` vs 工作区 `.dsh-memory/handoff/` | **前者**(与现有 handoffDir 同目录;GUI 白名单只放行 `.json`,备份/迁移自动覆盖) | 选错则备份/迁移要另写规则 | 🎯 |
15
- | A3 | **静态纪律是否随下一版一次性更新** | 更新 / 不更新 | **更新**(把判据纪律写进固定 section,而不只在工具描述里) | 代价:全量会话一次缓存重建 | 🎯 |
16
- | A4 | **工具命名** | `memory_expand_pre`/`memory_trace_pre`(对齐现有 14 工具 `*_pre` 惯例)vs 任务书直译 `expand_tag`/`trace_back` | **前者** | 命名一旦发布就难改(对外契约) | 🎯 |
17
- | A5 | **是否进 2.6.0** | P0-P1 进 2.6.0 / 全部等 2.7.x | **P0-P1 进 2.6.0;P2-P3 进 2.7.x**(工具数变化 + 存储格式新增,宜独立回归窗口) | 影响发版节奏与回归范围 | 🎯 |
18
- | A6 | **P1 水位骨架硬判据失败策略** | 照写 + 警示行 / 跳过写入 | **照写 + 警示行**(优先保证接续材料存在) | 跳过写入更"干净"但接续会缺材料 | 🎯 |
19
- | A7 | **PLAN 判据强度** | 维持自由节名 + 最弱硬判据 P-H1 / 固定 PLAN 小节集 | **维持自由节名**(P7 老化和"全貌图"用途依赖节名灵活性) | 固定小节集会削弱老化机制 | 🎯 |
20
- | A8 | **P2-6 条目锚点是否做** | 做 / 不做 | **做**(它是"按 id 展开"的地基;+30 行) | 涉及锚点写法与 `sanitizeReservedSyntax` 豁免约定 | 🎯 |
21
-
22
- ---
23
-
24
- ## B. 看板化(§10)的 7 个待解点 —— 你已定方向,这些必须一起解决
25
-
26
- | # | 问题 | 方案给的解法 | 我的补充建议 | 结论 |
27
- | --- | --- | --- | --- | --- |
28
- | B1 | **丢卡风险(最严重)**:白板是整篇重写,看板丢卡 = 任务蒸发 | sidecar 重写前后**卡片集合对比**(只能移动/完成,不能消失)→ **看板化使 P2 从"可选"变"刚需"** | 与 P0-④ 的 `supersede` 同源:**任何"消失"都要留痕** | 🎯(P2 顺位因此上调) |
29
- | B2 | **旧卡撑爆截断**:`carryText` 第 0 层 `slice(0,3000)` 被已完成卡挤占 | 列顺序约定 + 完成卡归档;**P7 老化(按标题关键词)对看板列名失配,需升级为列感知** | 归档 = 移到 sidecar 的 `archived` 集合,白板只留活跃卡 | 🎯 |
30
- | B3 | **卡片腐烂**:状态漂移误导接续 | 卡片带接续链 `contSeq` 时间轴 + 刷新仪式逐卡对状态 + 僵尸卡注入时打过期标记 | 复用现有 `cont-seq.json` | 🎯 |
31
- | B4 | **人机冲突(核心新问题)**:你改卡 vs 模型整篇重写互相覆盖 | (a) 只读 (b) 卡 id + 接口合并(依赖 P2-6,工程最大)(c) **卡片分「模型维护区 / 用户备注区」** | **从 (c) 起步**,稳定后再评估 (b) | 🎯 |
32
- | B5 | **双状态源**:账本四段与看板并存 | 看板 = 现在时(唯一事实)、账本 = 过去时(历史);账本「任务状态」段改为指路 | 写进判据,由 P1 中间件校验 | 🎯 |
33
- | B6 | **多任务混板** | 卡带接续链标记(Cue/contSeq),新窗口只展开自己链 | 与 §3 的 Cue 设计闭环 | 🎯 |
34
- | B7 | **节奏** | P0 级零成本验证:**先出看板格式约定文档,真实工作区试两周**(模型守格式?接续取任务顺不顺?)再定 P1/P2 | 同意先试点 | 🎯 |
35
-
36
- ---
37
-
38
- ## C. 我的推荐组合(你只需说"按推荐来"或指出要改的点)
39
-
40
- 1. **A1**:P0-P1 立即;**A5**:P0-P1 进 2.6.0,P2-P3 进 2.7.x;**A2/A4/A6/A7/A8** 均按方案建议。
41
- 2. **B4 从 (c) 起步**(模型维护区 + 用户备注区),**B7 先试点两周**;**B1 使 P2 顺位上调**(与 P0-④ 的 supersede 同源,可同版实现)。
42
- 3. 界面渲染属 `lib/client.js`(**冻结外**),可与大排期合流;**引擎侧(P2/P3)等冻结解除**。
43
-
44
- ## D. 拍完我就做什么
45
-
46
- | 拍板结果 | 立即动作 | 工程量 |
47
- | --- | --- | --- |
48
- | 按推荐 | ①写 `docs/HANDOFF-CRITERIA.md` 判据约定(P0,零代码)②实现 P1 判据校验中间件(≈190 行,咽喉 `writeHandoffLedger`/`writePlanSnapshot`)+ 回归(**工具数不变**) | 半天~1 天 |
49
- | 允许 P2/P3 | 按方案 §5 改动清单执行(sidecar + 两工具;**工具数 14→16,三处测试硬锁同步**:`smoke-test.mjs:67` / mapi-paths 等) | 约 2 天 |
50
- | 看板化 | 出「看板格式约定文档」→ 真实工作区试两周 → 再定交互方案 (a/b/c) | 试点期 |
51
-
52
- ---
53
-
54
- ## E. 2026-09-16 凌晨拍板结果(本轮已定,覆盖上方 🎯)
55
-
56
- | # | 结论 | 备注 |
57
- | --- | --- | --- |
58
- | A1 | ✅ **P2/P3 立项**(用户选「立项」) | 3.0 主体收官,引擎冻结实质解除 |
59
- | A2 | ✅ sidecar 放 `memoryRoot/<ws>/handoff/`(按建议) | |
60
- | A3 | ✅ 静态纪律随下一版一次性更新(按建议) | |
61
- | A4 | ✅ 工具命名 `memory_expand_pre`/`memory_trace_pre`(按建议) | |
62
- | A5 | ✅ P0-P1 与 P2-P3 分期(按建议) | |
63
- | A6 | ✅ 硬判据失败照写+警示行(按建议) | |
64
- | A7 | ✅ PLAN 维持自由节名+最弱硬判据 P-H1(按建议) | |
65
- | A8 | ✅ 条目锚点做(按建议) | |
66
- | B4 | ✅ **裁定变更:搬 dsh-graph 接管看板层**(用户原话:「MIT协议说明可以直接将它的插件搬过来。按照原来的调研,直接让他接管记忆白板。让用户可以实时、可视化地看到项目从立项到现在的所有流程、弯路、版本更迭等事无巨细的信息;同时也可以让 AI 看到,作为接续的重要参考之一」) | 实测 v0.11.0 兼容性后用户拍板;**覆盖原「只借范式不搬代码」的自设边界**——MIT(`dsh-graph-host/LICENSE`)允许搬代码;MRAgent 无 LICENSE 的零复制约束不变。兼容性实测:Windows 原生 OK(v0.11 修复)、cordis 标准接线(name/inject/apply)、40 个 `graph_*` 工具与 14 个 `memory_*` 零重名、存储 `.dsh-graph/` 与 `memoryRoot/` 不重叠、运行时零 `@deepseek-ai/*` 硬 import |
67
- | B7 | ✅ **跳过试点期直接实装**(用户原话:「跳过试点,直接实装,有bug,用户自然会报」) | WB-FORMAT-CONVENTION v1 已批准为实装依据,验收清单能失败断言兜底 |
68
- | P1 范围 | ✅ **P1 全量**:判据校验中间件(两咽喉 ≈190 行)+ 锚点实装(A8)+ 丢卡门(B1)+ 静态纪律(A3),工具数不变 | 用户选「P1 全量(推荐)」 |
69
- | 看板层 | ✅ dsh-graph 搬入接管:用户实时可视化全流程(立项/弯路/版本更迭)+ AI 可见作为接续参考 | 与 P1 判据门并行:P1 管写入质量,dsh-graph 管可视与流程展示 |
70
-
71
- **立即动作序列(本窗口)**:①P1 判据校验中间件 + 锚点 + 丢卡门(`writeHandoffLedger`/`writePlanSnapshot` 两咽喉)→ ②dsh-graph v0.11.0 搬入(vendor 到本仓库 + profile 接线)→ ③全量回归 + 留痕 → 明晨交 GPT 验收。