@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.
Files changed (116) hide show
  1. package/README.md +30 -13
  2. package/README.zh-CN.md +30 -13
  3. package/docs/FRONTEND-CO-CREATION.md +191 -0
  4. package/docs/GM53-HOMEPAGE-PROMPT.md +323 -0
  5. package/docs/HANDBOOK.md +88 -52
  6. package/docs/HOMEPAGE-CONTENT-FOR-GM53.md +299 -0
  7. package/docs/PROMO-PROMPT-3.0.md +100 -0
  8. package/docs/USER-GUIDE.en.md +11 -11
  9. package/docs/USER-GUIDE.zh-CN.md +11 -11
  10. package/docs/WHITEPAPER.md +207 -0
  11. package/docs/screenshots/promo/promo-0-banner-v3.png +0 -0
  12. package/docs/screenshots/promo/promo-0-banner-v4.png +0 -0
  13. package/docs/screenshots/promo/promo-1b-auto-recall.png +0 -0
  14. package/lib/activation-host.js +69 -10
  15. package/lib/board-mode.js +1 -1
  16. package/lib/client.js +1697 -285
  17. package/lib/config-io.js +156 -0
  18. package/lib/context-bridge.js +3 -0
  19. package/lib/context-host.js +23 -10
  20. package/lib/degrade.js +385 -0
  21. package/lib/dsh-home.js +143 -0
  22. package/lib/episodic-store.js +142 -18
  23. package/lib/evidence-store.js +8 -1
  24. package/lib/fact-store.js +484 -43
  25. package/lib/hub-io.js +217 -0
  26. package/lib/index-sync.js +13 -1
  27. package/lib/index.js +1730 -202
  28. package/lib/intent-clean-safe.js +258 -40
  29. package/lib/l0-extract.js +231 -16
  30. package/lib/m4-corpus.js +8 -2
  31. package/lib/m7-index-sync-host.js +8 -1
  32. package/lib/memory-envelope.js +6 -1
  33. package/lib/memory-hub.js +164 -17
  34. package/lib/memory-index.js +4 -2
  35. package/lib/note-status-apply.js +118 -0
  36. package/lib/note-status.js +204 -0
  37. package/lib/procedure-store.js +333 -31
  38. package/lib/procedure-switch.js +38 -0
  39. package/lib/python-sidecar-client.js +314 -11
  40. package/lib/recall-fusion.js +83 -12
  41. package/lib/rules-edit.js +159 -0
  42. package/lib/semantic-decide.js +41 -8
  43. package/lib/semantic-js.js +51 -6
  44. package/lib/shadow-host.js +3 -5
  45. package/lib/skill-export-host.js +153 -0
  46. package/lib/skill-export.js +239 -0
  47. package/lib/storage-manage.js +6 -0
  48. package/lib/temporal-parse.js +191 -159
  49. package/lib/tier0-catalog.js +45 -3
  50. package/lib/wb-contract.js +198 -2
  51. package/lib/wb-sidecar.js +54 -3
  52. package/package.json +6 -2
  53. package/docs/internal/ACCEPT-35-LIVE.md +0 -143
  54. package/docs/internal/ACCEPTANCE-20260914.md +0 -90
  55. package/docs/internal/ARCH-REVIEW-BRIEF.md +0 -411
  56. package/docs/internal/ARCH-REVIEW-REQUEST.md +0 -201
  57. package/docs/internal/ARCH-REVIEW-ROUND2.md +0 -169
  58. package/docs/internal/ARCH-REVIEW-ROUND3.md +0 -206
  59. package/docs/internal/ART-DIRECTION-WIREFRAME.md +0 -181
  60. package/docs/internal/AUDIT-WB-GRAPH-FULL-20260916.md +0 -314
  61. package/docs/internal/CONCURRENCY-INVESTIGATION-20260917.md +0 -192
  62. package/docs/internal/CROSS-SESSION-SEARCH-PATH-DECISION.md +0 -72
  63. package/docs/internal/CROSS-SESSION-SEARCH-RESEARCH.md +0 -131
  64. package/docs/internal/CUA-VISION-FIX-NOTES.md +0 -78
  65. package/docs/internal/DECISIONS-20260914-SESSION.md +0 -269
  66. package/docs/internal/DESIGN-OVERHAUL-PRE-RESEARCH.md +0 -292
  67. package/docs/internal/DESIGN-P1-STATE-COMMIT-20260915.md +0 -219
  68. package/docs/internal/DIRECTION-CHECK-WB-GRAPH-20260916.md +0 -132
  69. package/docs/internal/FEEDBACK-TO-DSHAPI-RELAY.md +0 -13
  70. package/docs/internal/GH-DISCUSSION-5732-COMMENT.md +0 -74
  71. package/docs/internal/GPT-ACCEPTANCE-PROMPT-20260916.md +0 -352
  72. package/docs/internal/GPT-REVIEW-PROMPT.md +0 -216
  73. package/docs/internal/GROUP-DIGEST-SETUP.md +0 -62
  74. package/docs/internal/GROUP-LISTENER-SETUP.md +0 -49
  75. package/docs/internal/GROUP-WEBHOOK-SETUP.md +0 -93
  76. package/docs/internal/HANDOFF-TO-ZCODE.md +0 -168
  77. package/docs/internal/KICKOFF-P0.md +0 -254
  78. package/docs/internal/MASTER-PLAN-3.0.md +0 -411
  79. package/docs/internal/MEMORY-MUTATION-AND-INDEX-DESIGN.md +0 -85
  80. package/docs/internal/MERGE-CONFLICT-SCAN-20260914.md +0 -222
  81. package/docs/internal/NEXT-VERSION-TODO.md +0 -95
  82. package/docs/internal/OFFICIAL-DISCUSSION-DRAFT.md +0 -80
  83. package/docs/internal/PENDING-FIXES-20260916.md +0 -289
  84. package/docs/internal/RAG-KARPATHY-PROGRAM.md +0 -229
  85. package/docs/internal/RELEASE-PROCESS.md +0 -99
  86. package/docs/internal/REPORT-P0-NIGHTLY.md +0 -212
  87. package/docs/internal/REPORT-P5-ACCEPTANCE.md +0 -31
  88. package/docs/internal/REPORT-WB-GRAPH-NIGHTLY.md +0 -153
  89. package/docs/internal/REVIEW-WB-GRAPH-SELF.md +0 -81
  90. package/docs/internal/ROADMAP-20260917-WEEK.md +0 -305
  91. package/docs/internal/ROADMAP.md +0 -106
  92. package/docs/internal/RUN-P0-NIGHTLY.md +0 -227
  93. package/docs/internal/S10-CONSTRUCTION-HANDOFF-20260917.md +0 -175
  94. package/docs/internal/S10-GAPS-PLAIN-20260917.md +0 -125
  95. package/docs/internal/SEMANTIC-ARCHITECTURE-SPEC.md +0 -360
  96. package/docs/internal/SESSION-FILE-REPAIR-PROTOCOL.md +0 -90
  97. package/docs/internal/SUBAGENT-REPORT-ROUTING-PRE-RESEARCH.md +0 -261
  98. package/docs/internal/THREE-LAYER-CONTRACT.md +0 -210
  99. package/docs/internal/TODO-BACKLOG.md +0 -263
  100. package/docs/internal/TODO-GRAPH.html +0 -715
  101. package/docs/internal/TODO-GRAPH.html.bak-20260914-v2 +0 -493
  102. package/docs/internal/TODO-GRAPH.html.bak-20260915-alsfix +0 -710
  103. package/docs/internal/TODO-GRAPH.html.bak-20260915-p1 +0 -710
  104. package/docs/internal/TODO-GRAPH.html.bak-20260915-p6a-rev +0 -703
  105. package/docs/internal/TODO-GRAPH.html.bak-20260915-wshint +0 -710
  106. package/docs/internal/TODO-GRAPH.html.bak-20260916-batch +0 -715
  107. package/docs/internal/WB-FORMAT-CONVENTION.md +0 -112
  108. package/docs/internal/WB-GRAPH-DECISIONS-20260914.md +0 -71
  109. package/docs/internal/WB-GRAPH-INTEGRATION-PLAN.md +0 -386
  110. package/docs/internal/WB-GRAPH-RESEARCH-BRIEF.md +0 -118
  111. package/docs/internal/WB-GRAPH-RESEARCH-EXTERNAL.md +0 -228
  112. package/docs/internal/WB-GRAPH-RESEARCH-LOCAL.md +0 -190
  113. package/docs/internal/reviews/CLAIM-VERIFICATION-20260914.md +0 -56
  114. package/docs/internal/reviews/PLAN-gpt6astra-round2-20260914.md +0 -787
  115. package/docs/internal/reviews/REVIEW-gpt6astra-20260914.md +0 -112
  116. package/docs/internal/reviews/ROUND3-REVIEW-INTEGRATION-20260914.md +0 -230
@@ -1,49 +0,0 @@
1
- # 群反馈闭环(GROUP-REPORT)部署说明
2
-
3
- > 2026-09-13 搭建。日报(见 `GROUP-DIGEST-SETUP.md`)之外的第二条链路:**群员在 QQ 群里汇报问题
4
- > → 自动建 GitHub issue → 状态回执「收到 ✅ / 正在处理 🔧 / 处理完毕 ✅」双端同步(QQ 群一句话 + issue 结构化评论)**。
5
- > 修理工可以是 Copilot(把 issue 分配给 @copilot),也可以是人。
6
-
7
- ## 状态词汇表(和群主口头回复一致)
8
-
9
- | 状态 | 触发点 | QQ 群播报 | GitHub issue |
10
- | --- | --- | --- | --- |
11
- | 收到 ✅ | 群反馈建单 | `收到 ✅ 群反馈已建单 #N「…」,处理进度会同步` | 「收到 ✅」评论 |
12
- | 正在处理 🔧 | PR 开出且引用该 issue | `正在处理 🔧 群反馈 #N → PR #M「…」` | 「正在处理 🔧」评论 |
13
- | 处理完毕 ✅ | issue 关闭(合并自动关单也算) | `处理完毕 ✅ 群反馈 #N「…」已解决` | 「处理完毕 ✅」评论 |
14
-
15
- ## 组成
16
-
17
- | 文件 | 作用 |
18
- | --- | --- |
19
- | `.github/workflows/group-report-status.yml` | 状态机:issues opened/labeled/closed + PR opened/reopened → 双端同步 |
20
- | `.github/scripts/report-sync.mjs` | 状态判定 + issue 评论 + QQ 播报(云端) |
21
- | `.github/scripts/qq-send.mjs` | QQ 发送共享模块 |
22
- | `.github/scripts/group-listener.mjs` | 「耳朵」:常开设备上连官方网关收群消息 → 建单 → 群里回收到 |
23
-
24
- ## 群员怎么报问题(两种都通)
25
-
26
- 1. **在群里说**(需要耳朵在跑):@机器人 并带触发词,如「@automemory 反馈助手 反馈 导出按钮点了没反应」→ 自动建单;
27
- 2. **直接提 GitHub issue**:标题随意,打上 `group-report` 标签 → 同样进入状态闭环(适合贴日志/截图)。
28
-
29
- ## 耳朵部署(旧安卓手机 Termux)
30
-
31
- 1. Termux(F-Droid 版)里:`pkg install nodejs-lts git`;
32
- 2. `git clone https://github.com/Aik358/dsh-auto-memory && cd dsh-auto-memory/.github/scripts`;
33
- 3. 建 `.env`(模板见 `group-listener.mjs` 头注释;GH_TOKEN 用**仅 issues:write 的细粒度 PAT**,别复用推送 PAT);
34
- 4. `node group-listener.mjs` → 看到「已上线,监听触发词」即可;
35
- 5. 常驻:关闭 Termux 电池优化 + `termux-wake-lock`;进阶用 Termux:Boot 开机自启。
36
-
37
- **约束**:同一机器人同时只允许一个网关连接——耳朵在跑时,勿再跑 `qq-capture-openid.mjs` 或绑定 WorkBuddy(二者互踢)。
38
-
39
- ## Copilot 当修理工
40
-
41
- 1. 前提:仓库 Settings → Copilot 开启 coding agent;账号需 Copilot 付费档(GitHub 学生包通常自带 Copilot Pro);
42
- 2. 在群反馈 issue 里 assign `@copilot` → 它开工并开出草稿 PR(正文引用本 issue)→ 状态机自动播「正在处理 🔧」;
43
- 3. 人审合并 → issue 自动关闭 → 自动播「处理完毕 ✅」。
44
-
45
- ## 测试方法(需先 push 到 main)
46
-
47
- 1. 建一个测试 issue 打上 `group-report` → 群里应出现「收到 ✅」+ issue 出现评论;
48
- 2. 开个 PR 正文写 `fixes #<测试issue号>` → 群里「正在处理 🔧」;
49
- 3. 关闭测试 issue → 群里「处理完毕 ✅」。
@@ -1,93 +0,0 @@
1
- # 群反馈云端耳朵(Webhook)部署说明
2
-
3
- > 2026-09-13 搭建(同日改为 AI 归纳路线):**不再自动建 GitHub issue**。云端耳朵把群里命中
4
- > 反馈词/问题关键词的消息静默收进一个**秘密 Gist**;每天 12:00/21:00 的日报(group-digest)读取
5
- > gist、调用大模型归纳成带标题的「群内反馈(AI 归纳)」清单随日报发群,并清空 gist 防重复。
6
- > 前置阅读:状态闭环词汇表见 `GROUP-LISTENER-SETUP.md`(issue 状态机保留但处于休眠,当前无建单方)。
7
-
8
- ## 组成
9
-
10
- | 文件 | 作用 |
11
- | --- | --- |
12
- | `.github/cloud/qq-webhook/index.js` | Webhook 接收端(Web 函数,零依赖,任何 Node>=18 环境可跑) |
13
- | `.github/scripts/group-listener.mjs` | WS 版耳朵(备用:有常开设备时的等价实现,二选一) |
14
-
15
- ## 部署步骤(腾讯云函数 · Web 函数)
16
-
17
- 1. 注册腾讯云并完成实名认证 → 控制台搜「函数服务 SCF」;
18
- 2. 新建函数:函数类型选 **Web 函数**,运行环境 **Node.js 18 或 20**,地域就近(如广州/上海);
19
- 3. 函数代码:把 `.github/cloud/qq-webhook/index.js` 打成 zip(就一个文件)上传,执行方法保持默认(`index.main_handler` 不适用 Web 函数,Web 函数看监听端口);
20
- 4. 环境变量(函数配置里加):
21
- ```
22
- QQ_APP_ID=1905260114
23
- QQ_APP_SECRET=<机器人secret>
24
- QQ_GROUP_OPENID=D4D52BA3A7412F88E9192011CD4B935A
25
- GH_TOKEN=<细粒度PAT,Account permissions → Gists: Read and write(收集用,不碰仓库)>
26
- GIST_ID=<秘密 gist 的 32 位 id,文件名 group-feedback.jsonl>
27
- REPO=Aik358/dsh-auto-memory
28
- ROUTE_TOKEN=<自造一段随机字符串,防扫描>
29
- FEEDBACK_KEYWORDS=问题,bug,报错,error,异常,失效,崩溃,闪退,不能用,出错了,坏了,修复 <可选,收集关键词>
30
- LLM_API_KEY=<可选;配了才启用「@ 消息大模型应答」(DeepSeek key 或任意 OpenAI 兼容端点)>
31
- LLM_MODEL=deepseek-chat <可选,默认 deepseek-chat>
32
- LLM_BASE_URL=https://api.deepseek.com <可选,换其他 OpenAI 兼容服务时改>
33
- ```
34
- 5. 部署后,函数详情页拿「**访问服务 URL**」(默认公网域名,HTTPS),在末尾拼上 `/<ROUTE_TOKEN>/`;
35
- 6. QQ 新版控制台 → 开发设置 → 「事件订阅与回调地址」→ 接收方式切换 **Webhook** → 粘贴上面的 URL;
36
- 平台立刻发 op=13 验证请求,我们的服务会自动应答(用 AppSecret 派生 Ed25519 密钥签名),通过即绑定;
37
- 7. 真实验证:群里发「反馈 这是一条测试」→ 应出现:新建 issue(带 group-report 标签)+ 群里「收到 ✅」。
38
-
39
- ## 关键事实(来自官方文档,2026-09 核对)
40
-
41
- - 回调只要求 **HTTPS + 端口 80/443/8080/8443**;文档未要求 ICP 备案(腾讯云函数默认域名可直用;若校验被拒,改用 API 网关触发器或 CloudBase 云接入的默认域名,再不行换 VPS 跑同一份代码);
42
- - **签名**:seed = AppSecret 自我拼接补足 32 字节 → 派生 Ed25519 密钥对;op=13 用私钥签 `event_ts+plain_token` 回 `{plain_token, signature}`;事件推送用公钥验 `X-Signature-Ed25519`(原文 = 时间戳+原始 body);
43
- - **切换即生效**:Webhook 与 WebSocket 互斥——切过去后,`qq-capture-openid.mjs`/`group-listener.mjs` 这类 WS 工具就收不到事件了(切回来同理);
44
- - 建议在函数配置里把 `STRICT_VERIFY=1`(验签严格模式)等真实验证跑通后再开。
45
-
46
- ## 与 Copilot/修理工的关系
47
-
48
- 建出的 issue 分配给 @copilot(需 Copilot 付费档,学生包免费)或自行认领;PR 引用 issue 自动播「正在处理 🔧」,关闭自动播「处理完毕 ✅」——由 `group-report-status.yml` 负责,与本耳朵解耦。
49
-
50
- ## 按需报告接口(给 DeepSeek Harness / 人工用)
51
-
52
- ```
53
- GET https://<函数URL>/<ROUTE_TOKEN>/?report=N # 最近 N 小时(1-48)群反馈
54
- GET ...?report=12&raw=1 # 只要原文不要 AI 总结
55
- ```
56
- 返回 JSON:`{ window_hours, total, items:[{t,u,w,m}], summary?, v }`。
57
- - items=带时间戳的原始反馈;配了云函数 LLM_API_KEY 时附 summary(AI 分诊:问题清单+修复优先级),没配则只有原文——harness 的模型可直接读原文自己分析。
58
- - 注意:每次日报(11:40/20:40)读完后会清空收集区,所以可查范围≈「自上次日报以来收集的反馈」(与 12h 窗口天然对齐)。
59
- - DeepSeek Harness 用法:直接 GET 该 URL(浏览器/curl/任意 HTTP 工具),把返回 JSON 交给模型出修复方案;或固化成 auto-memory 的 procedure。
60
-
61
-
62
- ---
63
-
64
- ## 2026-09-13 增量:定时班自触发 + @问答每小时限额(版本标记 20260913f)
65
-
66
- **背景**:GitHub 的 schedule 定时触发对本仓库从未生效(全仓库 schedule 运行 0 次,成功的日报全是手动 dispatch)。改为「SCF 定时触发器 → 函数 → workflow_dispatch」:到点必达,GitHub 侧只当执行器。
67
-
68
- ### 控制台要做的三件事
69
-
70
- 1. **上传新 index.zip**(标记 `20260913e`;上传后 `?diag=1` 应显示 `"v":"webhook-gist-20260913e"`,并出现 `"ai"` 与 `"timer"` 两个配置块)。
71
- 2. **新增环境变量**(函数配置):
72
- - `LLM_BASE_URL` / `LLM_API_KEY` / `LLM_MODEL` —— 与日报 Actions secrets 同源(WorldCodes 中转 + minimax-m3),配了才有 @ 答疑;**注意 base 的变量名是 `LLM_BASE_URL`**(`LLM_API_BASE` 亦兼容,2026-09-13 曾因文档误写前者导致 base 一直是 DeepSeek 默认值的 401);
73
- - `GH_DISPATCH_TOKEN` —— **Actions 读写权限**的 PAT(细粒度:Repository permissions → Actions: Read and write),定时班自触发必需;
74
- - `TIMER_SECRET`(可选)—— `?timer=1&key=<值>` 手动测试时的口令;`TIMER_MIN_GAP_HOURS`(可选,默认 10)。
75
- - `AI_MAX_PER_HOUR`(可选)—— @ 答疑每小时最多几次,**不配 = 不限额**;`AI_QUOTA_HOURS`(可选,默认 1)—— 限频时间窗(小时)。改额度只改环境变量,无需改代码。
76
- 3. **添加定时触发器**(函数 → 触发管理 → 创建):类型=定时触发器,名称必须叫 **`digest-dispatch`**(与默认 TIMER_TRIGGER_NAME 一致),自定义 Cron(SCF 七段=秒 分 时 日 月 星期 年,按北京时间):
77
- - `0 40 11 * * * *`(北京 11:40 主班)
78
- - `0 40 20 * * * *`(北京 20:40 主班)
79
- - 触发器 POST 到函数 URL(会带 Type:Timer 事件体),函数内部有 10 小时防重(落 gist 的 bot-state.json),不会重发。
80
-
81
- ### 新行为
82
-
83
- - **@ 答疑**:群成员 @机器人 + 任意问题(不含反馈触发词)→ AI(M3)**每小时限 1 次**详细回答(被动回复,带 msg_id,不占主动消息配额);超限回复一条限频提示;配额时间戳落 gist `bot-state.json`,冷启动不失忆。反馈触发词(反馈/问题/bug)的收集行为不变。
84
- - **手动测试**:`GET …?timer=1&key=<TIMER_SECRET>` 可随时触发一班日报(同样受 10h 防重保护)。
85
- - **成本**:SCF 侧 新增调用 ≤ 每天几十次,远在免费额度内;LLM 侧 M3 约 0.02 元/次,日报 2 次/天 + 答疑上限 24 次/天 → 最坏 ~0.5 元/天,实际远低。
86
-
87
-
88
- ### 20260913f 追加:反馈文件钉死文件名(真 bug 修复)
89
-
90
- - **问题**:反馈写入/日报读取/清空都用「gist 里第一个文件」当目标——`group-raw-debug.txt` 先建、或清空用 `content:''`(= **删除文件**)后,第一个文件就会换人,实测反馈行混进了原始调试文件。
91
- - **修复**:三方(webhook 写入 / report 读取 / digest 收集清空)全部钉死 `group-feedback.jsonl`;清空改写 `'
92
- '`(**保留文件本身**);report 的 LLM 失败不再静默,外显 `llmError` 字段(检查 base/model/key 就看它)。
93
- - **迁移**:旧混写的历史行留在 `group-raw-debug.txt` 作为调试史,不再被 report 读取;新反馈从上传新包起进 `group-feedback.jsonl`。**务必确认 Actions secret `FEEDBACK_GIST_ID` 与云函数 `GIST_ID` 是同一个值**(真实值不写进仓库——`docs/` 会随 npm 包发布;从 `~/.dsh/memory/workspaces/--D--dsh_debug--/MEMORY.md` 取,secret 不可回读,不记得就重设)。
@@ -1,168 +0,0 @@
1
- # 交接说明 · 给 ZCode(dsh-auto-memory)
2
-
3
- > 写于 2026-09-11 21:4x(UTC+8)· 交接方:DSH 主对话(DeepSeek Harness)
4
- > **本文件自包含**:ZCode 看不到写这份文档的那个会话的上下文与记忆,读完这一份 + 文末「关键路径表」里的文件即可开工。
5
- > 一句话项目:**DeepSeek Harness Web GUI 的「主动联想记忆 + 上下文管理」插件**(npm 公开包,1 万+ 下载),当前 **v2.4.2 已发布**。
6
-
7
- ---
8
-
9
- ## 0. 现在的状态(先对账,别信旧文档)
10
-
11
- | 事项 | 值 |
12
- | --- | --- |
13
- | npm 包 | `@a9i5k4/dsh-auto-memory` · latest = **2.4.2**(发布包 218 files / 10.9 MB) |
14
- | pre 线(开发) | `D:\dsh-auto-memory`,HEAD = `f83e144`(docs 收编)· 已跟踪文件**无未提交改动** |
15
- | REL 线(发布基座) | `D:\dsh_debug\_publish_dsh-auto-memory`,HEAD = `243dee1`(= tag `v2.4.2` = GitHub main) |
16
- | GitHub | https://github.com/Aik358/dsh-auto-memory(main = 243dee1) |
17
- | 本机运行形态 | 插件以**符号链接**挂载:`~/.dsh/profiles/web/node_modules/@a9i5k4/dsh-auto-memory` → `D:\dsh-auto-memory` |
18
- | 宿主 | 官方 `dsh` **0.1.5-rc.1**,Web GUI 在 `http://127.0.0.1:3080` |
19
-
20
- **两条线是平行历史**:pre 线有 `-pre` 后缀(`lib/*-pre.js`、配置 `dsh-auto-memory-pre.json`、路由前缀 `/api/dsh-auto-memory-pre/`),`tools/release.mjs` 会在发布时把它们**裸名化**并重建 REL 树。
21
- 👉 **严禁把 pre 直接 push 到远端 main**;发布只能走下面的固定流程。
22
-
23
- ---
24
-
25
- ## 1. 代码结构(没有构建步骤)
26
-
27
- | 文件 | 作用 | 规模 |
28
- | --- | --- | --- |
29
- | `lib/index.js` | **宿主半边**:记忆引擎 + 配置表 + 全部 HTTP 路由 + 工具注册 | ~8,200 行 |
30
- | `lib/client.js` | **界面半边**:浏览器 bundle(手写 `__ModuleLoader__`,React + 原生 DOM,零依赖) | ~4,600 行 |
31
- | `lib/*-pre.js` | 其余宿主模块(检索/水位/接续/语义/Python 侧车…),多数有对应的裸名孪生文件 | — |
32
- | `python/` | 可选 Python 语义引擎(BGE-M3 int8)+ worker,随包发布 | — |
33
- | `tests/smoke/*.mjs` | **69 个**冒烟套件(全量回归就是逐个 `node` 跑) | — |
34
- | `tools/release.mjs` | 发布构建器(pre→正式转换 + 校验闸门) | — |
35
- | `docs/` | 会被打进 npm 包(**注意**:内部文档目前也在里面) | — |
36
-
37
- **关键结构约束**:两个半边是**独立 bundle**,`client.js` 不能 `import` 宿主模块 → 「同一份事实」只能靠**测试锁**保证(已有 `tests/smoke/smoke-test-api-paths-pre.mjs`)。
38
-
39
- ---
40
-
41
- ## 2. 怎么验证改动(发版前置门)
42
-
43
- ```powershell
44
- cd D:\dsh-auto-memory
45
- # 全量回归(约 2-3 分钟,必须 0 失败)
46
- Get-ChildItem tests\smoke -File -Filter *.mjs | ForEach-Object { node $_.FullName > $null 2>&1; if ($LASTEXITCODE -ne 0) { "FAIL: " + $_.Name } }
47
- # 语法 + 编码
48
- node --check lib\index.js; node --check lib\client.js
49
- # 写文件必须 UTF-8 无 BOM(用户硬性规则,BOM 会让 dsh web 起不来)
50
- ```
51
-
52
- - **路由数(46)与工具数(14)被多个用例硬锁**;加减路由/工具必须同步改测试。
53
- - `smoke-test-autocont-host-pre.mjs` 用「方法白名单」式夹具:给被抽方法新增 `this.xxx()` 调用要同步加进白名单,否则 TypeError 被外层 `try/catch` 吞成"没反应"。
54
- - 单跑原则:个别套件(如 `m53`)在批量连跑时会受机器负载影响,历史上是**单跑**确认。
55
-
56
- ---
57
-
58
- ## 3. 发版固定流程(10 步,唯一检查表 `docs/internal/RELEASE-PROCESS.md`)
59
-
60
- 1. **前置门**:全量回归 0 失败 + **脏树范围核实**(`release.mjs` 的源就是工作区,**脏树会整体进包且不可回溯**)。
61
- 2. 定版本号(纯修复 patch / 有新行为 minor)。
62
- 3. **必改 `CHANGELOG.md`**:新增 `## [<ver>] — <日期> · <主题>` 小节。
63
- 4. **必同步软件内版本标识**:①应用内更新说明字典 `lib/client.js` 的 `var CHANGELOG = { '<ver>': { zh: [...], en: [...] } }` ②界面指纹行 `console.log('[dsh-auto-memory] client v<ver> fingerprint: ...')` ③`package.json.version`(由 release.mjs 自动回写开发树)。
64
- 5. pre 线提交:`git add lib tests CHANGELOG.md tools/release.mjs`(+ 视情况 docs)→ commit(身份 `Aik358 <aik358@users.noreply.github.com>`)。
65
- 6. `node tools\release.mjs <ver> --dry-run` —— 验闸门(应输出 `版本标识一致性: OK(CHANGELOG / 应用内更新说明 / 界面指纹行)`)。
66
- 7. `node tools\release.mjs <ver>` —— 真构建(写 REL 树 + 回写开发树版本)。
67
- 8. REL:`git add -A` → commit → `git tag -f v<ver>`。
68
- 9. push(**必须带 PAT 行内 URL**,见 §5)→ `npm publish`。
69
- 10. **三处复核**:registry `/latest`、`git ls-remote ... refs/heads/main`、`refs/tags/v<ver>` 三者一致。
70
-
71
- **第 3、4 步已做成机制**:`tools/release.mjs` §5.05「版本标识一致性闸门」——三项任一不符即 `process.exit(1)` **拒绝构建**(防止"检测更新"一直拿旧版本号比对)。
72
-
73
- ---
74
-
75
- ## 4. 环境、凭据与两个坑
76
-
77
- - **本机 `~/.npmrc` 指向 npmmirror** → 查询与发布都必须显式 `--registry=https://registry.npmjs.org`,否则会查到旧版本、误判发布失败。
78
- - **`npm view` 会命中本地缓存**:发布成功后可能仍回读上一版(v2.4.2 发布后回读 2.4.1)。判定用权威接口:
79
- `Invoke-RestMethod 'https://registry.npmjs.org/@a9i5k4%2Fdsh-auto-memory/latest' | Select-Object -ExpandProperty version`
80
- - **凭据不在本仓库**:GitHub PAT 与 npm token 存在另一个工作区的记忆文件里 ——
81
- `~/.dsh/memory/workspaces/--D--dsh_debug--/MEMORY.md`(该文件明确标注"只存本地,**严禁写入任何会上传 GitHub/npm 的文件**")。
82
- npm 发布需带 bypass-2FA 的那个 token;推送用 `git -c credential.helper= push https://x-access-token:<PAT>@github.com/Aik358/dsh-auto-memory.git main --tags --force`。
83
- - **发布后生效**:宿主半边(`lib/index.js`)改动需**用户自己重启 dsh web**;界面半边刷新页面即可。
84
-
85
- ---
86
-
87
- ## 5. 不可碰的契约 & 用户硬性规则
88
-
89
- - **后端冻结(用户明确要求,大排期期间生效)**:记忆引擎逻辑、**46 条路由**契约、**85 个配置键**语义与默认值、prompt 层、Python worker、14 个工具名 —— 改外观/文档时**一律不动**。
90
- - **未经明确同意,严禁停止/重启 dsh web 宿主进程**(会截断工具调用);host 改完只改文件并提示用户重启。
91
- - **未经明确要求,不要 `npm publish` / push GitHub / 打 tag**。
92
- - **写任何文件严禁 BOM**(保持 UTF-8 无 BOM;写完可用前三字节校验)。
93
- - 界面文案与文档的**文风**遵循 `docs/PROMO-STYLE-GUIDE.md`(产品拟人称"她"、厂商腔黑名单、母比喻=一本书)。
94
-
95
- ---
96
-
97
- ## 6. 下一版要做的三件事(已记录,未开工)
98
-
99
- 完整清单(含行号、改法、验收)在 **`docs/internal/NEXT-VERSION-TODO.md`**。摘要:
100
-
101
- 1. **水位判据口径**:现在触发用的是「可用额度」分母 `effectiveWin = win − reserve`(`lib/index.js:1900`,本机 1,048,576 − 384,000 = 664,576),导致**上下文刚过半就触发接续**,比官方压缩点(≈80% ≈ 83.9 万)**早约 45%**,用户判定太浪费。
102
- **改法**:正常触发线改用官方声明窗口为分母(或 `min(win, hardWin)`),阈值 0.75–0.78;`reserve` **不再参与分母**,只保留"距硬墙余量"展示 + 硬判据(`estTokens + reserve > win` 才硬触发)。补反向锁:断言"不得把 reserve 计入分母"。
103
- 2. **接续序号**:`contSeq = handoff 目录里 prev-session-*.md 文件数 + 1`(`lib/index.js:2646-2648`),在落盘失败 / 跨工作区(handoffDir 按工作区解析)/ carry 复用缓存时会**不递增、重复或为空**(为空即不 rename → 标题退回自动生成,用户已两次观察到"新窗口序号不对")。
104
- **改法**:改**持久计数器** `handoff/cont-seq.json`(键 = workspaceId),缺失时从现有 `接续 #N` 标题/包名解析最大值 +1 兼容老数据;序号分配与包落盘做成同序事务;三条入口(面板一键 / 宿主兜底 / 重启后)全覆盖。
105
- 3. **固定流程外包给子代理**(用户提出的想法):发版这类已固化的流程**不由主对话逐步执行**(主对话上下文最贵)→ 交给子代理(思考强度不必高),它做完/出错后只回结构化结论,主对话只做三件事:开闸前确认前置门 / 放行或中止 / 失败时处置。
106
- 落地物:`docs/prompts/RELEASE-AGENT.md`(自包含任务书)+ `RELEASE-PROCESS.md` 顶部「角色分工」段 + 同类流程(全量回归 / 双语对账 / 痕迹巡检)各配任务书。回报格式 `{ ok, version, pre_sha, rel_sha, tag, npm_latest, failed_step, error_tail }`。
107
-
108
- > 现状补充:**v2.4.2 已把 `autoContinueEnabled` 出厂默认改为 `false`**(并加反向锁 `smoke-test-autocont-host-pre.mjs` 断言默认必须为 false)。用户本机也已关闭。所以上述 ① 是"改好再考虑翻回默认开"的前置。
109
-
110
- ---
111
-
112
- ## 7. 待开工的大排期(界面 × 文档 × 首页)
113
-
114
- 用户已拍板方向,**设计优先、功能说明最后核对**,**后端冻结**:
115
-
116
- - 排期与现状硬数据:`docs/internal/DESIGN-OVERHAUL-PRE-RESEARCH.md`(含诊断、P0-P6 排期、5 条验收判据、6 个待用户拍板点)
117
- - 美术方向与动效规格:`docs/internal/ART-DIRECTION-WIREFRAME.md`(线框稿 + EVA 式克制线描色板 + 线宽四档 + 工程图元素 + **24fps 动效时序表** + 性能预算 + **可直接转发给 Astra 的交付契约**)
118
- - 三条线:①界面与设置页大改(12 页签塞进 440×560 浮层 = 容器错配;DSH 有 ~58 个原生插槽可用,`slots.inject/register` 是通用 API,挂原生位**不需要改后端**)②README/用户说明书/项目文档大改 ③`docs/landing/index.html` 首页大改(现为 1,745 行自包含单文件,靠 `preview` 分支 + `htmlpreview` 第三方代理发布;无 `.github/`、无 Pages)
119
- - 设计主张:面板向 **DSH 原生 `--dsw-*` 令牌**靠(DSH 自己的 UI 包是打包后 CSS Modules,类名私有**不可复用**,只有公开 CSS 变量 + 插槽位可用);首页保留现代主义品牌色(暖纸 `#F4F1EB` / 墨 `#17171A` / 信号橙 `#E9470C`)。
120
- - 角色动画(24 帧逐帧)**交给 Astra**:`ART-DIRECTION-WIREFRAME.md` §5 是完整交付契约(画布 1200×1200@1x、锚点 `(600,1080)`、PNG-24 + alpha、命名 `hero_0000.png`、分层导出、7 条验收)。
121
-
122
- ---
123
-
124
- ## 8. 血泪坑清单(照着躲)
125
-
126
- 1. **脏树进包**:`release.mjs` 的 DEV 源就是 `D:\dsh-auto-memory` 工作区 —— 发版前必须核实 `git status` 范围(本机曾两次发现工作区混有其他会话的未发布改动)。
127
- 2. **两半边独立 bundle**:`client.js` 是手写 `__ModuleLoader__`,不能用相对 `import`;跨半边一致性只能靠测试锁。
128
- 3. **同一文件一次消息发两个 edit 会丢前者**(实测过)→ 同文件改动串行,或写「替换清单 JSON + 计数断言脚本」一次做(不符即整体不写盘)。
129
- 4. **`edit` 工具会被全角引号/缩进差异绊住** → 大文件批量改推荐脚本 + 动态识别缩进(别写死空格数)。
130
- 5. **JS 正则不支持 `(?m)` 内联标志**(要用 `/.../m`;写进测试会直接 SyntaxError)。
131
- 6. **水位/接续相关**:判据优先级 = provider 错误文本 > 官方 `request/context.contextWindow` > 本地 tokenMeter > 启发式估算;本地估算在"中文+代码+大工具输出"会话里**偏乐观约 2×**。撞墙报错原文含 `CONTEXT_WINDOW_EXCEEDED`,是本机校准的唯一权威来源。
132
- 7. **接续有两条路径且行为不同**:宿主 `hostAutoContinue()`(无刷新仪式)与面板 `runContinueFlow()`(注入刷新仪式)。改任一侧要同步评估另一侧。排查"接续没反应"先看 `~/.dsh/dsh-auto-memory-pre-diagnose.log`。
133
- 8. **`docs/` 会被打进 npm 包**,而 README/USER-GUIDE 的图片走相对路径 `docs/screenshots/…` → 想收窄 `files` 必须**分层**(保留 screenshots + 论文 + 架构图),不能整目录删。
134
- 9. **`npm view` 命中本地缓存** + **本机 .npmrc 是 npmmirror**(见 §4)。
135
- 10. **凭据只走行内 URL / 环境变量**,绝不写进任何会上传 GitHub 或 npm 的文件。
136
-
137
- ---
138
-
139
- ## 9. 建议 ZCode 的第一件事
140
-
141
- ```powershell
142
- cd D:\dsh-auto-memory
143
- git log --oneline -5 # 确认在 pre 线
144
- git status --short # 确认没有别人的未提交改动
145
- Get-ChildItem tests\smoke -File -Filter *.mjs | ForEach-Object { node $_.FullName > $null 2>&1; if ($LASTEXITCODE -ne 0) { "FAIL: " + $_.Name } } # 回归基线
146
- ```
147
- 然后二选一:**A. 深改**(照 `docs/internal/NEXT-VERSION-TODO.md` 从改点 ① 开始)或 **B. 大排期**(照 `docs/internal/DESIGN-OVERHAUL-PRE-RESEARCH.md`,但需先向用户取三样:官方 DSH 网页 URL/截图、角色基准图、风格探针许可)。
148
-
149
- **别做**:不要 `npm publish`/push/tag(除非用户明确要求);不要重启 dsh web;不要改 §5 冻结清单里的任何契约。
150
-
151
- ---
152
-
153
- ## 10. 关键路径表
154
-
155
- | 路径 | 用途 |
156
- | --- | --- |
157
- | `docs/internal/RELEASE-PROCESS.md` | 发版 10 步唯一检查表(含凭据纪律、npm 缓存坑) |
158
- | `docs/internal/NEXT-VERSION-TODO.md` | 下一版三点待改(水位口径 / 接续序号 / 流程外包)+ 验收 |
159
- | `docs/internal/DESIGN-OVERHAUL-PRE-RESEARCH.md` | 界面×文档×首页大排期预研(诊断 + P0-P6 + 判据) |
160
- | `docs/internal/ART-DIRECTION-WIREFRAME.md` | 美术方向 + 24fps 规格 + Astra 交付契约 |
161
- | `docs/PROMO-STYLE-GUIDE.md` | 文风守则(README/landing/公告必须遵循) |
162
- | `docs/UI-INVENTORY-RAW.md` | 界面逐条盘点(12 页签 / 85 键 / 46 端点,带行号) |
163
- | `docs/USER-GUIDE.{en,zh-CN}.md` · `README{,.zh-CN}.md` | 面向用户的四份文档(待大改) |
164
- | `docs/landing/index.html` | 首页(单文件、双语) |
165
- | `tools/release.mjs` | 发布构建器 + 版本标识闸门(§5.05) |
166
- | `tests/smoke/smoke-test-api-paths-pre.mjs` | 路径表一致性锁(客户端 ⊆ 宿主) |
167
- | `~/.dsh/dsh-auto-memory-pre-diagnose.log` | 插件诊断日志(接续/水位/降级线索都在这) |
168
- | `~/.dsh/dsh-auto-memory-pre.json` | **pre 线**实际配置文件(别读成非 `-pre` 的那个) |
@@ -1,254 +0,0 @@
1
- # 🚀 KICKOFF · P0 过夜托管运行(2026-09-14 深夜版)
2
-
3
- > **这份文件是给「接续后的新窗口」的第一份指令。**
4
- > 你是谁:接手 `dsh-auto-memory` 3.0 施工的 agent。**规划层已经全部封闭,不要重新规划、不要重新评审、不要问「我们从哪开始」。**
5
- > 你的任务:**按本文开工,过夜连续施工,在指定停点停下来汇报。**
6
- > 写这份文件的人(上一个窗口)已经把该定的都定了,该踩的坑都标了。**照做即可。**
7
-
8
- ---
9
-
10
- ## 0. 三十秒状态摘要
11
-
12
- - 项目:DSH 插件 `dsh-auto-memory`(宿主 `lib/index.js` + 浏览器 `lib/client.js` + 可选 python 引擎)。
13
- - **开发树就是活的宿主代码**(profile 以 `link:` 挂载)⇒ 你改的文件 = 用户下次重启后运行的代码。
14
- - 规划:三轮外部评审(GPT-6 Astra)走完,产出**《合并总纲 3.0》v2**(施工蓝本)。
15
- - 你的任务:**P0(注入边界 + 写入门 + 白板最小适配边界)**,然后 P6A。
16
- - 已知基线:全量 **79 套件 PASS / 0 FAIL / ≈149s**;`verify-todo-graph` 47 卡;doc-code 守卫 44/0。
17
-
18
- ---
19
-
20
- ## 1. 第一步:按顺序读这些(**绝对路径,别猜**)
21
-
22
- ```
23
- D:\dsh-auto-memory\docs\internal\MASTER-PLAN-3.0.md
24
- ← 【施工蓝本】先读 §0.5(v2 修订节)+ §4 Phase 0 + §6 交付纪律
25
-
26
- D:\dsh-auto-memory\docs\internal\reviews\ROUND3-REVIEW-INTEGRATION-20260914.md
27
- ← 【最重要】第三轮复核的逐条核实与采纳记录:
28
- 你施工时要用的每一条 v2 修正、每个新增断言编号(T0-8B/T0-8C/T1-7B…)都在这里
29
-
30
- D:\dsh-auto-memory\docs\internal\MERGE-CONFLICT-SCAN-20260914.md
31
- ← 矛盾扫描(为什么这么调和)
32
-
33
- D:\dsh-auto-memory\docs\internal\DECISIONS-20260914-SESSION.md
34
- ← 用户 8 条裁决 + 三处被推翻的前提
35
-
36
- D:\dsh-auto-memory\docs\internal\WB-GRAPH-INTEGRATION-PLAN.md
37
- ← 白板线方案(386 行);P0 的「白板最小适配边界」要看 §2.2 判据表
38
-
39
- D:\dsh-auto-memory\docs\internal\WB-GRAPH-DECISIONS-20260914.md
40
- ← 白板 15 个拍板点(本文 §4 已给出**预授权默认值**,不用等用户)
41
-
42
- D:\dsh-auto-memory\docs\internal\TODO-GRAPH.html
43
- ← 项目管理看板(47 卡;用浏览器打开看更清楚,也可以只 grep 里面的卡)
44
- ```
45
-
46
- **按需查(不要通读)**:`SEMANTIC-ARCHITECTURE-SPEC.md`(S1–S10)、`THREE-LAYER-CONTRACT.md`(I1–I7)、`RAG-KARPATHY-PROGRAM.md`。
47
-
48
- ---
49
-
50
- ## 2. 第二步:主动恢复上下文(用户明确要求)
51
-
52
- **接续流程会生成本窗口的转写包**,主动去找、去读:
53
-
54
- ```powershell
55
- Get-ChildItem "$env:USERPROFILE\.dsh\memory\workspaces\--D--dsh-auto-memory--\handoff\prev-session-*.md" |
56
- Sort-Object LastWriteTime -Descending | Select-Object -First 3 Name, Length, LastWriteTime
57
- ```
58
-
59
- - 取**最新一份**读(约 70KB,**单条截断 2000 字符**,是上一个窗口的完整转写)。
60
- - 注意:DSH 原生会话是 `~/.dsh/sessions/--D-dsh-auto-memory--/<id>/session.v3.jsonl.zstd`(**zstd 压缩,read 工具读不了**);`prev-session-*.md` 是插件解压后的可读版。
61
- - **同时调用 `memory_recall_pre`** 检索本机所有工作区记忆(含本项目的项目笔记与用户级规则)。**用户说「有些还有问题」,所以不要只信本文,也要自己搜。**
62
-
63
- ---
64
-
65
- ## 3. 第三步:立刻开工(按此顺序,不要跳)
66
-
67
- ### 3.1 第一件事:修 C8(**不依赖任何决策,现在就能做,且已证明是真危害**)
68
-
69
- **事实**:`superseded` / `retracted` 状态的记忆条目**现在真的会进入注入文本**——违反契约不变式 **I5**(`THREE-LAYER-CONTRACT.md:183`:「非 `current` 的条目在**检索结果与注入内容两处**都被过滤」)。
70
-
71
- **证据**(已跑出,不是推测):
72
- ```powershell
73
- cd D:\dsh-auto-memory; node tools\_redproof\red-proof-phase0-t01.mjs
74
- # 当前输出:0 通过 / 4 报红,exit 1
75
- # 其中一条实测:4 条候选(2 current + 1 superseded + 1 retracted)全部进了注入文本
76
- ```
77
-
78
- **你要做的**:
79
- 1. 在**注入侧**加 `current` 过滤(检索侧已有——问题在注入侧)。落点候选:`lib/tier-layer-inject-pre.js` 的 `composeTieredInjectionPre` / `buildTier1SectionPre` 入参处,以及调用方 `lib/index.js`。
80
- 2. **注意**:`tests/smoke/smoke-test-c5-tier-inject-pre.mjs:127/133/137` **把违反 I5 的现状锁成了「正确行为」**(`:133` 断言三条全留、`:137` 断言那条 superseded 带 0.55 分)。**这个测试必须改**——这是「断言锁死错误现状」的典型案例,改它时要留注释说明原因。
81
- 3. 让 `red-proof-phase0-t01.mjs` **由红转绿**,然后**把它移进 `tests/smoke/`** 成为正式套件(命名建议 `smoke-test-i5-status-filter-pre.mjs`)。
82
- 4. 跑全量,确认 79 套件仍全绿(**你改了一个断言与一个实现,套件数会变,允许变成 80**)。
83
-
84
- ### 3.2 第二件事:T0-2 版本校验
85
-
86
- - 现行 `lib/index.js:3894` 的命中复用**只查时间**(`Date.now() - gh.at < 30*60000`)与 session,不查 `miv`。
87
- - 要改:`activation-host-pre.js` 的 `recordTierGateHits` 投影携带 `miv/contextVersion/observationId/requestKey`;复用前比对。
88
- - 断言:**T0-2**(A 快照产生候选、B 快照准备输出 ⇒ A 正文不得出现且必须带版本降级原因;A/B 混装即失败)。
89
-
90
- ### 3.3 第三件事:T0-3 预算单一口径
91
-
92
- **两处实测缺陷**(已核过行号):
93
- - `lib/tier-layer-inject-pre.js:327–335` —— 只裁下探段(`:329 lines.pop()` 只动 `drillParts`),`headParts`(目录 + 降级行)**从不动**;且 `:332–334` **在裁剪之后**又追加降级说明 ⇒ **最终长度可超 `maxTotal`**。
94
- - `lib/index.js:3986` —— `catalogCost` 被 `Math.min(..., budget*0.35)` 封顶,**封顶的是"扣账成本"**;实际注入用的是全文 `s.tier0LayerText`(`:3957`),**不参与 `used` 记账**。
95
-
96
- **v2 要求**:改为**分项账本**(仍由**同一个** `composeMemoryEnvelopePre` 生成):
97
- ```
98
- chars: { rules, memoryReferences, otherDynamic, total }
99
- limits: { memoryReferences, otherDynamic }
100
- ```
101
- 规则段、参考段、其他动态**分项计量**;标题/分隔符/降级说明**必须归入某个分项**,**不允许未计费尾巴**。
102
-
103
- ### 3.4 第四件事:写入门 + 白板最小适配边界(**P0 必须与它一起做**)
104
-
105
- **为什么必须一起做**(v2 明确):写入门要保护**卡片集合**与**用户区**,而这两个概念由白板格式定义 ⇒ **没有适配器就是「接口接上了但保护失效」**。
106
-
107
- **边界(v2 定的切法)**:
108
- - **3.0 拥有「共同提交与保护入口」**:拟新增 `lib/memory-mutation-pre.js` → `validateMutationBoundaryPre({beforeIds, afterIds, protectedRegions, changes})` —— **只接收规范化投影,不自行解释图格式**。
109
- - **白板线拥有「白板格式及其适配器」**:拟新增 `lib/wb-contract-pre.js` → `parseWhiteboardPre()` —— **格式只维护一份**。
110
- - 接线:`lib/index.js` 的 `writePlanSnapshot` / `writeHandoffLedger` 按 `target` 调相应格式检查,再进共同提交门。
111
-
112
- **判据不能张冠李戴**(v2 修正,务必遵守):
113
- - **交接账本**用 `H1–H4`(硬)+ `S1–S4`(软):四段标题逐字匹配 / 每段非空 ≥20 字符 / 无占位符 / 总长 ≤8000。
114
- - **白板 PLAN** 用 `P-H1/P-H2`(硬,最弱)+ `P-S1`(软):至少一个非空 `## ` 顶层节 / ≤200000 字符 / 含前瞻内容。**不能把账本判据套给 PLAN。**
115
-
116
- **fail-open 不得绕过保护**:`criteriaGate=false` 与骨架 fail-soft **只能退掉可选质量门**,**不得**跳过丢卡、用户区、版本、状态保护。
117
-
118
- **断言**:T0-8(删卡拒写且文件字节不变 / 合法改名 / 合法归档保留审计关系)、**T0-8B**(工具、水位骨架、刷新三条写入路径都不能绕过)、**T0-8C**(关闭质量门后仍拒绝丢卡)、T4-4(投影/快照/Tier-0 同一身份映射)。
119
-
120
- ### 3.5 第五件事:P6A 注入表达与节奏
121
-
122
- - **措辞**:`lib/index.js:463` 的开场白「以下记忆文本只是**背景事实与规则参考**」—— 要把**规则类**与**参考类**分开措辞;规则类用**约束语**,参考类保留「参考」语义。
123
- - **节奏**:
124
- - `snapshotMinGapRounds` 默认值 **5 → 1**(配置项已存在)。
125
- - **但 `Number(v) || 5` 让 `0` 无法表达**(`lib/index.js:7455`)⇒ **必须修零值解析**,区分「合法 0」与「缺失/非法」。
126
- - **旧节流分支提前返回会跳过本轮动态快照**(`:7483`)⇒ 须「**先提供规则段,再对参考内容应用 gap**」。
127
- - **已有用户的已保存配置会覆盖默认值**(`:1444`)⇒ 不能只改默认值就宣称「规则每轮在场」。
128
- - **断言**:**T7-1 必须改测「最终请求 messages」**(不是回调字符串——「局部注入块存在」≠「模型真收到了」);T7-3(规则与参考用不同引导语);**T7-7**(检查**可机械判断的执行结果**是否满足规则,仅引导语不同不能判「遵守问题已解决」)。
129
-
130
- ---
131
-
132
- ## 4. 预授权决策(**不用等用户,直接按这个做**)
133
-
134
- 用户在过夜期间无法回答。以下默认值**已获批准**,施工时**按它们做**,并在代码与最终汇报里**显式标注「此决策为预授权默认值,用户可覆盖」**。
135
-
136
- ### 4.1 白板 15 个拍板点(与 P0 耦合的四条已定,其余按方案建议)
137
-
138
- | 编号 | 预授权决定 | 备注 |
139
- |---|---|---|
140
- | **B1** 丢卡风险 | **做**:sidecar 重写前后卡片集合对比,只能移动/完成,不能消失 | **= P0 写入门**,同一件事 |
141
- | **B5** 双状态源 | **看板 = 现在时(唯一事实)**;账本 = 过去时(历史),其「任务状态」段**只指路** | **= P1 的 miv 语义**,P0 只做写入门侧的引用 |
142
- | **B4** 人机冲突 | **从选项 (c) 起步**:每张卡片分「模型维护区 / 用户备注区」 | **= P0 写入门要保护什么** |
143
- | **A8** 条目锚点 | **做**:`mem_` + sha256(workspaceKey + 页面相对路径 + 卡片标题) 前 32 位十六进制 | **白板进语料的前提** |
144
- | A1 | P0-P1 立即做;P2-P3 等后端冻结解除 | |
145
- | A2 | sidecar 位置 = `memoryRoot/<ws>/handoff/`(与现有 handoffDir 同目录) | |
146
- | A3 | 静态纪律**随下一版一次性更新** | 代价:全量会话一次缓存重建 |
147
- | A4 | 工具命名 = `memory_expand_pre` / `memory_trace_pre`(对齐 `*_pre` 惯例) | 对外契约,发布后难改 |
148
- | A5 | P0-P1 进 2.6.0;P2-P3 进 2.7.x | |
149
- | A6 | 水位骨架硬判据失败策略 = **照写 + 警示行** | 优先保证接续材料存在 |
150
- | A7 | PLAN 判据**维持自由节名** + 最弱硬判据 P-H1 | 固定小节集会削弱老化机制 |
151
- | B2 | 列顺序约定 + 完成卡归档;P7 老化升级为**列感知** | |
152
- | B3 | 卡片带接续链 `contSeq` 时间轴;僵尸卡注入时打过期标记 | 复用现有 `cont-seq.json` |
153
- | B6 | 卡带接续链标记,新窗口只展开自己链 | |
154
- | B7 | **先试点两周**再定 P1/P2 交互方案 | |
155
-
156
- ### 4.2 施工纪律(用户已裁定,不要问)
157
-
158
- - **新旧并存 + 开关回退**:每个新路径一个配置开关,**默认关**。
159
- - **每阶段必须有回滚动作**;没有回滚的阶段**不许开工**。
160
- - **改动点写到 `文件:函数名`**。
161
- - **新增守卫必须演示变红后再按字节还原**(本项目已被「源码接线守卫 ≠ 行为断言」咬过三次)。
162
- - **上游同步冻结**:**不主动开 PR、不 push、不 commit**(用户明确「修复在开发端就行」)。
163
-
164
- ---
165
-
166
- ## 5. 🛑 停点清单(**到这些地方必须停下来问用户,不许自行决定**)
167
-
168
- 1. **改动会破坏现有行为且无法用开关回退** —— 立即停,先报告。
169
- 2. **需要改契约 / 规范条款本体**(`S1–S10` / `I1–I7` / `WB-FORMAT-CONVENTION`) —— **只能引用不能重写**,确需修改先提案。
170
- 3. **全量回归无法回到全绿** —— 停下来,报告「哪个套件红了、卡在哪一步、你试了什么」,**不要为了让它绿而删断言**。
171
- 4. **需要动 `~/.dsh/` 下的配置或宿主进程** —— 一律先问(**严禁 `Get-Process node | Stop-Process`**,曾杀穿 harness;宿主重启永远由用户自己做)。
172
- 5. **要动超过 3 个文件的重构** —— 先问范围。
173
- 6. **P0 全部做完** —— 停下来做一次完整汇报(见 §7),等待用户与 GPT 验收。
174
- 7. **遇到本文与 `MASTER-PLAN-3.0.md` / `ROUND3-REVIEW-INTEGRATION` 冲突** —— 以那两份为准,并把冲突写进汇报。
175
-
176
- ---
177
-
178
- ## 6. 📝 记忆与注释纪律(**用户明确要求:多写记忆、多写注释**)
179
-
180
- ### 6.1 写记忆(跨窗口续命的关键)
181
-
182
- > **本会话可能过夜运行并中途压缩。压缩会吃掉你的思考过程,但吃不掉你写进文件的结论。**
183
-
184
- | 时机 | 动作 |
185
- |---|---|
186
- | **每完成一个小步**(一个函数改完、一个断言转绿) | 调 `memory_log_pre` 追加一条(记:做了什么、结果、行号) |
187
- | **每得出一个跨会话有用的结论**(口径、约定、踩坑) | 调 `memory_note_pre`(`kind=note`)写进项目笔记 |
188
- | **方向变化 / 阶段完成** | 调 `memory_note_pre`(`kind=handoff`)写四段式交接账本 |
189
- | **对项目全貌理解有实质变化** | 调 `memory_note_pre`(`kind=plan`)重写白板 |
190
-
191
- **日志纪律**:客观陈述(第三人称中性句式),**只留可复用的事实/决策/规则/路径**,不写「我考虑/我排查」这类思考腔。
192
-
193
- ### 6.2 写运行日志(**这是你被压缩后的救命绳**)
194
-
195
- **新建并持续追加**:`D:\dsh-auto-memory\docs\internal\RUN-P0-NIGHTLY.md`
196
-
197
- 每完成一步就追加一段:
198
- ```markdown
199
- ## [HH:MM] 步骤名
200
- - 目标:
201
- - 改了:文件:函数名
202
- - 结果:断言 X 由红转绿 / 全量 N 套件 0 失败
203
- - 卡住:无 / 具体卡点
204
- - 下一步:
205
- ```
206
- **理由**:压缩后你只剩摘要,但这份文件在磁盘上,**你随时可以重读它恢复进度**。
207
-
208
- ### 6.3 写代码注释(本项目已有的风格,务必遵守)
209
-
210
- - **中文注释,解释「为什么」而不是「做了什么」**(代码已经说明做了什么)。
211
- - **踩过的坑必须写进注释**,格式参考现有代码:写清「旧实现是什么 / 为什么错 / 实测证据」。
212
- - 参考风格:`lib/index.js:1981-1991`(解耦那段)、`lib/client.js` 里 `configOf` 那段。
213
- - **改动过测试断言时**,在断言旁注明为什么改(例:「原断言锁定了违反 I5 的现状,见 red-proof」)。
214
-
215
- ---
216
-
217
- ## 7. ✅ 完成判据(什么叫「今晚跑完了」)
218
-
219
- **至少满足**:
220
- 1. C8 修复完成:`red-proof-phase0-t01.mjs` 4/4 转绿,且已移入 `tests/smoke/`。
221
- 2. T0-2、T0-3 实现并各有**能红的**断言。
222
- 3. 写入门 + 白板最小适配边界完成(`memory-mutation-pre.js` + `wb-contract-pre.js` 的 P0 部分)。
223
- 4. **全量 `node tools/run-smoke.mjs` 全绿**(套件数允许增加)。
224
- 5. `RUN-P0-NIGHTLY.md` 完整记录每一步。
225
- 6. 最终汇报(见下)。
226
-
227
- **最终汇报必须包含**(给用户拿去喂 GPT 验收):
228
- - 改动的文件清单(`文件:函数名`)
229
- - 每条新断言的**编号 + 现状(绿/红/未做)+ 它证明什么**
230
- - **实测数据**(跑了几次、耗时、套件数变化)
231
- - **回滚方法**(关哪个开关、还原哪个文件)
232
- - **未完成项与原因**
233
- - **预授权默认值的实际使用情况**(哪些用了、哪些你觉得该改)
234
- - **你认为最值得让 GPT 审的三个点**
235
-
236
- ---
237
-
238
- ## 8. ⛔ 安全红线(过夜期间绝不可越过)
239
-
240
- 1. **严禁** `Get-Process node | Stop-Process` 或任何重启/关闭宿主进程的操作(**曾杀穿一次 harness**)。
241
- 2. **严禁** `git commit` / `push` / `checkout` / `stash` / `reset`(约 98 个未提交文件是用户的工作状态)。
242
- 3. **严禁**改 `~/.dsh/` 下的任何配置(除非用户当场同意)。
243
- 4. **严禁**为了让测试变绿而**删除或弱化**既有断言。
244
- 5. **严禁**在没有开关的情况下改掉正在生效的默认行为(开发树 = 活代码)。
245
- 6. 写任何文件**严禁 BOM**;`lib/index.js` 与 `lib/client.js` 是 **CRLF**,`lib/*-pre.js` 与测试是 **LF** —— 改完做字节探测。
246
- 7. **HTML/JS 字符串内禁用 ASCII 双引号**(用「」)—— 已有一次因此渲染报错的记录。
247
-
248
- ---
249
-
250
- ## 9. 现在就动手
251
-
252
- 第一件事:**跑 `node tools\_redproof\red-proof-phase0-t01.mjs` 看它报红**,然后开始修 C8。
253
-
254
- 不要重新规划。不要问「从哪里开始」。**本文就是答案。**