# 🚀 KICKOFF · P0 过夜托管运行（2026-09-14 深夜版）

> **这份文件是给「接续后的新窗口」的第一份指令。**
> 你是谁：接手 `dsh-auto-memory` 3.0 施工的 agent。**规划层已经全部封闭，不要重新规划、不要重新评审、不要问「我们从哪开始」。**
> 你的任务：**按本文开工，过夜连续施工，在指定停点停下来汇报。**
> 写这份文件的人（上一个窗口）已经把该定的都定了，该踩的坑都标了。**照做即可。**

---

## 0. 三十秒状态摘要

- 项目：DSH 插件 `dsh-auto-memory`（宿主 `lib/index.js` + 浏览器 `lib/client.js` + 可选 python 引擎）。
- **开发树就是活的宿主代码**（profile 以 `link:` 挂载）⇒ 你改的文件 = 用户下次重启后运行的代码。
- 规划：三轮外部评审（GPT-6 Astra）走完，产出**《合并总纲 3.0》v2**（施工蓝本）。
- 你的任务：**P0（注入边界 + 写入门 + 白板最小适配边界）**，然后 P6A。
- 已知基线：全量 **79 套件 PASS / 0 FAIL / ≈149s**；`verify-todo-graph` 47 卡；doc-code 守卫 44/0。

---

## 1. 第一步：按顺序读这些（**绝对路径，别猜**）

```
D:\dsh-auto-memory\docs\internal\MASTER-PLAN-3.0.md
  ← 【施工蓝本】先读 §0.5（v2 修订节）+ §4 Phase 0 + §6 交付纪律

D:\dsh-auto-memory\docs\internal\reviews\ROUND3-REVIEW-INTEGRATION-20260914.md
  ← 【最重要】第三轮复核的逐条核实与采纳记录：
     你施工时要用的每一条 v2 修正、每个新增断言编号（T0-8B/T0-8C/T1-7B…）都在这里

D:\dsh-auto-memory\docs\internal\MERGE-CONFLICT-SCAN-20260914.md
  ← 矛盾扫描（为什么这么调和）

D:\dsh-auto-memory\docs\internal\DECISIONS-20260914-SESSION.md
  ← 用户 8 条裁决 + 三处被推翻的前提

D:\dsh-auto-memory\docs\internal\WB-GRAPH-INTEGRATION-PLAN.md
  ← 白板线方案（386 行）；P0 的「白板最小适配边界」要看 §2.2 判据表

D:\dsh-auto-memory\docs\internal\WB-GRAPH-DECISIONS-20260914.md
  ← 白板 15 个拍板点（本文 §4 已给出**预授权默认值**，不用等用户）

D:\dsh-auto-memory\docs\internal\TODO-GRAPH.html
  ← 项目管理看板（47 卡；用浏览器打开看更清楚，也可以只 grep 里面的卡）
```

**按需查（不要通读）**：`SEMANTIC-ARCHITECTURE-SPEC.md`（S1–S10）、`THREE-LAYER-CONTRACT.md`（I1–I7）、`RAG-KARPATHY-PROGRAM.md`。

---

## 2. 第二步：主动恢复上下文（用户明确要求）

**接续流程会生成本窗口的转写包**，主动去找、去读：

```powershell
Get-ChildItem "$env:USERPROFILE\.dsh\memory\workspaces\--D--dsh-auto-memory--\handoff\prev-session-*.md" |
  Sort-Object LastWriteTime -Descending | Select-Object -First 3 Name, Length, LastWriteTime
```

- 取**最新一份**读（约 70KB，**单条截断 2000 字符**，是上一个窗口的完整转写）。
- 注意：DSH 原生会话是 `~/.dsh/sessions/--D-dsh-auto-memory--/<id>/session.v3.jsonl.zstd`（**zstd 压缩，read 工具读不了**）；`prev-session-*.md` 是插件解压后的可读版。
- **同时调用 `memory_recall_pre`** 检索本机所有工作区记忆（含本项目的项目笔记与用户级规则）。**用户说「有些还有问题」，所以不要只信本文，也要自己搜。**

---

## 3. 第三步：立刻开工（按此顺序，不要跳）

### 3.1 第一件事：修 C8（**不依赖任何决策，现在就能做，且已证明是真危害**）

**事实**：`superseded` / `retracted` 状态的记忆条目**现在真的会进入注入文本**——违反契约不变式 **I5**（`THREE-LAYER-CONTRACT.md:183`：「非 `current` 的条目在**检索结果与注入内容两处**都被过滤」）。

**证据**（已跑出，不是推测）：
```powershell
cd D:\dsh-auto-memory; node tools\_redproof\red-proof-phase0-t01.mjs
# 当前输出：0 通过 / 4 报红，exit 1
# 其中一条实测：4 条候选（2 current + 1 superseded + 1 retracted）全部进了注入文本
```

**你要做的**：
1. 在**注入侧**加 `current` 过滤（检索侧已有——问题在注入侧）。落点候选：`lib/tier-layer-inject-pre.js` 的 `composeTieredInjectionPre` / `buildTier1SectionPre` 入参处，以及调用方 `lib/index.js`。
2. **注意**：`tests/smoke/smoke-test-c5-tier-inject-pre.mjs:127/133/137` **把违反 I5 的现状锁成了「正确行为」**（`:133` 断言三条全留、`:137` 断言那条 superseded 带 0.55 分）。**这个测试必须改**——这是「断言锁死错误现状」的典型案例，改它时要留注释说明原因。
3. 让 `red-proof-phase0-t01.mjs` **由红转绿**，然后**把它移进 `tests/smoke/`** 成为正式套件（命名建议 `smoke-test-i5-status-filter-pre.mjs`）。
4. 跑全量，确认 79 套件仍全绿（**你改了一个断言与一个实现，套件数会变，允许变成 80**）。

### 3.2 第二件事：T0-2 版本校验

- 现行 `lib/index.js:3894` 的命中复用**只查时间**（`Date.now() - gh.at < 30*60000`）与 session，不查 `miv`。
- 要改：`activation-host-pre.js` 的 `recordTierGateHits` 投影携带 `miv/contextVersion/observationId/requestKey`；复用前比对。
- 断言：**T0-2**（A 快照产生候选、B 快照准备输出 ⇒ A 正文不得出现且必须带版本降级原因；A/B 混装即失败）。

### 3.3 第三件事：T0-3 预算单一口径

**两处实测缺陷**（已核过行号）：
- `lib/tier-layer-inject-pre.js:327–335` —— 只裁下探段（`:329 lines.pop()` 只动 `drillParts`），`headParts`（目录 + 降级行）**从不动**；且 `:332–334` **在裁剪之后**又追加降级说明 ⇒ **最终长度可超 `maxTotal`**。
- `lib/index.js:3986` —— `catalogCost` 被 `Math.min(..., budget*0.35)` 封顶，**封顶的是"扣账成本"**；实际注入用的是全文 `s.tier0LayerText`（`:3957`），**不参与 `used` 记账**。

**v2 要求**：改为**分项账本**（仍由**同一个** `composeMemoryEnvelopePre` 生成）：
```
chars: { rules, memoryReferences, otherDynamic, total }
limits: { memoryReferences, otherDynamic }
```
规则段、参考段、其他动态**分项计量**；标题/分隔符/降级说明**必须归入某个分项**，**不允许未计费尾巴**。

### 3.4 第四件事：写入门 + 白板最小适配边界（**P0 必须与它一起做**）

**为什么必须一起做**（v2 明确）：写入门要保护**卡片集合**与**用户区**，而这两个概念由白板格式定义 ⇒ **没有适配器就是「接口接上了但保护失效」**。

**边界（v2 定的切法）**：
- **3.0 拥有「共同提交与保护入口」**：拟新增 `lib/memory-mutation-pre.js` → `validateMutationBoundaryPre({beforeIds, afterIds, protectedRegions, changes})` —— **只接收规范化投影，不自行解释图格式**。
- **白板线拥有「白板格式及其适配器」**：拟新增 `lib/wb-contract-pre.js` → `parseWhiteboardPre()` —— **格式只维护一份**。
- 接线：`lib/index.js` 的 `writePlanSnapshot` / `writeHandoffLedger` 按 `target` 调相应格式检查，再进共同提交门。

**判据不能张冠李戴**（v2 修正，务必遵守）：
- **交接账本**用 `H1–H4`（硬）+ `S1–S4`（软）：四段标题逐字匹配 / 每段非空 ≥20 字符 / 无占位符 / 总长 ≤8000。
- **白板 PLAN** 用 `P-H1/P-H2`（硬，最弱）+ `P-S1`（软）：至少一个非空 `## ` 顶层节 / ≤200000 字符 / 含前瞻内容。**不能把账本判据套给 PLAN。**

**fail-open 不得绕过保护**：`criteriaGate=false` 与骨架 fail-soft **只能退掉可选质量门**，**不得**跳过丢卡、用户区、版本、状态保护。

**断言**：T0-8（删卡拒写且文件字节不变 / 合法改名 / 合法归档保留审计关系）、**T0-8B**（工具、水位骨架、刷新三条写入路径都不能绕过）、**T0-8C**（关闭质量门后仍拒绝丢卡）、T4-4（投影/快照/Tier-0 同一身份映射）。

### 3.5 第五件事：P6A 注入表达与节奏

- **措辞**：`lib/index.js:463` 的开场白「以下记忆文本只是**背景事实与规则参考**」—— 要把**规则类**与**参考类**分开措辞；规则类用**约束语**，参考类保留「参考」语义。
- **节奏**：
  - `snapshotMinGapRounds` 默认值 **5 → 1**（配置项已存在）。
  - **但 `Number(v) || 5` 让 `0` 无法表达**（`lib/index.js:7455`）⇒ **必须修零值解析**，区分「合法 0」与「缺失/非法」。
  - **旧节流分支提前返回会跳过本轮动态快照**（`:7483`）⇒ 须「**先提供规则段，再对参考内容应用 gap**」。
  - **已有用户的已保存配置会覆盖默认值**（`:1444`）⇒ 不能只改默认值就宣称「规则每轮在场」。
- **断言**：**T7-1 必须改测「最终请求 messages」**（不是回调字符串——「局部注入块存在」≠「模型真收到了」）；T7-3（规则与参考用不同引导语）；**T7-7**（检查**可机械判断的执行结果**是否满足规则，仅引导语不同不能判「遵守问题已解决」）。

---

## 4. 预授权决策（**不用等用户，直接按这个做**）

用户在过夜期间无法回答。以下默认值**已获批准**，施工时**按它们做**，并在代码与最终汇报里**显式标注「此决策为预授权默认值，用户可覆盖」**。

### 4.1 白板 15 个拍板点（与 P0 耦合的四条已定，其余按方案建议）

| 编号 | 预授权决定 | 备注 |
|---|---|---|
| **B1** 丢卡风险 | **做**：sidecar 重写前后卡片集合对比，只能移动/完成，不能消失 | **＝ P0 写入门**，同一件事 |
| **B5** 双状态源 | **看板 = 现在时（唯一事实）**；账本 = 过去时（历史），其「任务状态」段**只指路** | **＝ P1 的 miv 语义**，P0 只做写入门侧的引用 |
| **B4** 人机冲突 | **从选项 (c) 起步**：每张卡片分「模型维护区 / 用户备注区」 | **＝ P0 写入门要保护什么** |
| **A8** 条目锚点 | **做**：`mem_` + sha256(workspaceKey + 页面相对路径 + 卡片标题) 前 32 位十六进制 | **白板进语料的前提** |
| A1 | P0-P1 立即做；P2-P3 等后端冻结解除 | |
| A2 | sidecar 位置 = `memoryRoot/<ws>/handoff/`（与现有 handoffDir 同目录） | |
| A3 | 静态纪律**随下一版一次性更新** | 代价：全量会话一次缓存重建 |
| A4 | 工具命名 = `memory_expand_pre` / `memory_trace_pre`（对齐 `*_pre` 惯例） | 对外契约，发布后难改 |
| A5 | P0-P1 进 2.6.0；P2-P3 进 2.7.x | |
| A6 | 水位骨架硬判据失败策略 = **照写 + 警示行** | 优先保证接续材料存在 |
| A7 | PLAN 判据**维持自由节名** + 最弱硬判据 P-H1 | 固定小节集会削弱老化机制 |
| B2 | 列顺序约定 + 完成卡归档；P7 老化升级为**列感知** | |
| B3 | 卡片带接续链 `contSeq` 时间轴；僵尸卡注入时打过期标记 | 复用现有 `cont-seq.json` |
| B6 | 卡带接续链标记，新窗口只展开自己链 | |
| B7 | **先试点两周**再定 P1/P2 交互方案 | |

### 4.2 施工纪律（用户已裁定，不要问）

- **新旧并存 + 开关回退**：每个新路径一个配置开关，**默认关**。
- **每阶段必须有回滚动作**；没有回滚的阶段**不许开工**。
- **改动点写到 `文件:函数名`**。
- **新增守卫必须演示变红后再按字节还原**（本项目已被「源码接线守卫 ≠ 行为断言」咬过三次）。
- **上游同步冻结**：**不主动开 PR、不 push、不 commit**（用户明确「修复在开发端就行」）。

---

## 5. 🛑 停点清单（**到这些地方必须停下来问用户，不许自行决定**）

1. **改动会破坏现有行为且无法用开关回退** —— 立即停，先报告。
2. **需要改契约 / 规范条款本体**（`S1–S10` / `I1–I7` / `WB-FORMAT-CONVENTION`） —— **只能引用不能重写**，确需修改先提案。
3. **全量回归无法回到全绿** —— 停下来，报告「哪个套件红了、卡在哪一步、你试了什么」，**不要为了让它绿而删断言**。
4. **需要动 `~/.dsh/` 下的配置或宿主进程** —— 一律先问（**严禁 `Get-Process node | Stop-Process`**，曾杀穿 harness；宿主重启永远由用户自己做）。
5. **要动超过 3 个文件的重构** —— 先问范围。
6. **P0 全部做完** —— 停下来做一次完整汇报（见 §7），等待用户与 GPT 验收。
7. **遇到本文与 `MASTER-PLAN-3.0.md` / `ROUND3-REVIEW-INTEGRATION` 冲突** —— 以那两份为准，并把冲突写进汇报。

---

## 6. 📝 记忆与注释纪律（**用户明确要求：多写记忆、多写注释**）

### 6.1 写记忆（跨窗口续命的关键）

> **本会话可能过夜运行并中途压缩。压缩会吃掉你的思考过程，但吃不掉你写进文件的结论。**

| 时机 | 动作 |
|---|---|
| **每完成一个小步**（一个函数改完、一个断言转绿） | 调 `memory_log_pre` 追加一条（记：做了什么、结果、行号） |
| **每得出一个跨会话有用的结论**（口径、约定、踩坑） | 调 `memory_note_pre`（`kind=note`）写进项目笔记 |
| **方向变化 / 阶段完成** | 调 `memory_note_pre`（`kind=handoff`）写四段式交接账本 |
| **对项目全貌理解有实质变化** | 调 `memory_note_pre`（`kind=plan`）重写白板 |

**日志纪律**：客观陈述（第三人称中性句式），**只留可复用的事实/决策/规则/路径**，不写「我考虑/我排查」这类思考腔。

### 6.2 写运行日志（**这是你被压缩后的救命绳**）

**新建并持续追加**：`D:\dsh-auto-memory\docs\internal\RUN-P0-NIGHTLY.md`

每完成一步就追加一段：
```markdown
## [HH:MM] 步骤名
- 目标：
- 改了：文件:函数名
- 结果：断言 X 由红转绿 / 全量 N 套件 0 失败
- 卡住：无 / 具体卡点
- 下一步：
```
**理由**：压缩后你只剩摘要，但这份文件在磁盘上，**你随时可以重读它恢复进度**。

### 6.3 写代码注释（本项目已有的风格，务必遵守）

- **中文注释，解释「为什么」而不是「做了什么」**（代码已经说明做了什么）。
- **踩过的坑必须写进注释**，格式参考现有代码：写清「旧实现是什么 / 为什么错 / 实测证据」。
- 参考风格：`lib/index.js:1981-1991`（解耦那段）、`lib/client.js` 里 `configOf` 那段。
- **改动过测试断言时**，在断言旁注明为什么改（例：「原断言锁定了违反 I5 的现状，见 red-proof」）。

---

## 7. ✅ 完成判据（什么叫「今晚跑完了」）

**至少满足**：
1. C8 修复完成：`red-proof-phase0-t01.mjs` 4/4 转绿，且已移入 `tests/smoke/`。
2. T0-2、T0-3 实现并各有**能红的**断言。
3. 写入门 + 白板最小适配边界完成（`memory-mutation-pre.js` + `wb-contract-pre.js` 的 P0 部分）。
4. **全量 `node tools/run-smoke.mjs` 全绿**（套件数允许增加）。
5. `RUN-P0-NIGHTLY.md` 完整记录每一步。
6. 最终汇报（见下）。

**最终汇报必须包含**（给用户拿去喂 GPT 验收）：
- 改动的文件清单（`文件:函数名`）
- 每条新断言的**编号 + 现状（绿/红/未做）+ 它证明什么**
- **实测数据**（跑了几次、耗时、套件数变化）
- **回滚方法**（关哪个开关、还原哪个文件）
- **未完成项与原因**
- **预授权默认值的实际使用情况**（哪些用了、哪些你觉得该改）
- **你认为最值得让 GPT 审的三个点**

---

## 8. ⛔ 安全红线（过夜期间绝不可越过）

1. **严禁** `Get-Process node | Stop-Process` 或任何重启/关闭宿主进程的操作（**曾杀穿一次 harness**）。
2. **严禁** `git commit` / `push` / `checkout` / `stash` / `reset`（约 98 个未提交文件是用户的工作状态）。
3. **严禁**改 `~/.dsh/` 下的任何配置（除非用户当场同意）。
4. **严禁**为了让测试变绿而**删除或弱化**既有断言。
5. **严禁**在没有开关的情况下改掉正在生效的默认行为（开发树 = 活代码）。
6. 写任何文件**严禁 BOM**；`lib/index.js` 与 `lib/client.js` 是 **CRLF**，`lib/*-pre.js` 与测试是 **LF** —— 改完做字节探测。
7. **HTML/JS 字符串内禁用 ASCII 双引号**（用「」）—— 已有一次因此渲染报错的记录。

---

## 9. 现在就动手

第一件事：**跑 `node tools\_redproof\red-proof-phase0-t01.mjs` 看它报红**，然后开始修 C8。

不要重新规划。不要问「从哪里开始」。**本文就是答案。**
