# R1 · 长期记忆可读性 · 取证报告（2026-09-19）

> **本文件回答 R1 的待答问题一（取证）与问题三（归因）。**
> 方法：`artifacts/_probe-r1-readability.mjs`（可重跑），对两份真实记忆文件做**无预设**的六类缺陷量化。
> **不声称已解决**——修法属问题四，需用户拍板。

---

## 0. 结论先行（三句话）

1. **可读性差的主因在「写入/整理侧」，不在「渲染侧」** —— 空行、重复标题、缺主语都是**文件本身**的属性。
2. **但渲染侧确有一处独立的、结构性的可读性缺陷**：注入文本**保留了对人无意义的 `<!-- memory:mem_<32hex> -->` 锚点注释**，且**每条各自带一个 `## <日期>`**，导致同一天出现 N 个重复日期标题。
3. **⇒ 修法是两个方向各自独立的改法**（写入侧结构模板 + 渲染侧呈现），**不是一个**。这正是 R1 问题三要分清的。

---

## 1. 取证数据（真实文件，可复跑）

| 指标 | 用户级 `~/.dsh/memory/MEMORY.md` | 项目 `.../workspaces/--D--dsh-auto-memory--/MEMORY.md` |
|---|---|---|
| 体量 | 13,160 字符 / 290 行 | 23,693 字符 / 444 行 |
| **开头连续空行** | 3 行 | **50 行** ← ★ **打开即空白** |
| ≥5 行空行块 | 0 处 | 1 处（第 1–50 行） |
| **空行占比** | 92/290 = **32%** | 165/444 = **37%** |
| `## ` 段数 | 55 | 27 |
| **纯日期标题重复** | **15 种**（`2026-08-19`×5、`2026-08-16`×4、`2026-08-17`×3…） | **2 种**（`2026-09-18`×**19**、`2026-09-19`×5） |
| 缺主语（以标识符/文件名/编号开头） | 0/40 = 0% | **10/66 = 15%** |
| 过短或无完整句 | 10/40 = 25% | 20/66 = **30%** |
| 术语密度 ≥1.2/20 字 | 5/40 = 13% | 9/66 = 14% |
| 单条含 ≥3 分号 | 1 条 | 1 条 |

### 典型样本（逐字取自真机）

**A. 缺主语**（读者不知「谁」）：
```
M1 契约行渲染设计定案：不新建独立文件（那会新增状态源，违反 S10.4「不建状态机」）…
`lib/tier0-catalog-pre.js`：新增 `TIER0_ANCHOR_ID_RE = /^mem_[0-9a-f]…
isRetrievablePre 只对**未知值** fail-closed（防未来新增枚举时静默放行）。
```
⇒ 这三条**都对**，但读者要先知道「M1 是什么」「这个文件在项目里干什么」才能读懂。
**缺的不是信息，是入口**：一句话说明「这是什么、为什么有这条」。

**B. 无背景**（只有结论）：
```
本轮无新增跨项目通用规则。
无
无
```
⇒ 这类**空转条目**在用户级笔记里占了相当比例（25% 过短），它们不承载信息却占版面。

**C. 结构污染**：
项目笔记**前 50 行纯空行**；两份文件空行都占三分之一 ⇒ 人工翻阅时大量「翻页无内容」。

---

## 2. 归因（R1 问题三）

### 2.1 主因：写入/整理侧（占绝大多数症状）

| 症状 | 归属 | 证据 |
|---|---|---|
| 开头 50 行空行 | **整理侧** | 归档/折叠后未回收空占位（体积从大变小，行号槽位留下） |
| 同日 N 个重复日期标题 | **写入/整理侧** | 每次 append 都新起一个 `## <日期>`（见 §3 渲染样本） |
| 空转条目「无」「本轮无新增」 | **写入侧** | 模型在无内容时仍写一条 |
| 缺主语 / 堆术语 / 无完整句 | **写入侧** | 条目语体无约束（本仓记忆纪律已要求「客观陈述」，但**未要求「自解释」**） |

### 2.2 次因：渲染侧（独立且真实，但症状不同）

**从本会话系统提示逐字摘录**（这是模型实际收到的样子）：
```
[项目长期笔记 …\MEMORY.md]
<!-- memory:mem_cbd99fb31f5045e29ccef19f2eb94615 -->
## 2026-09-18
- M1 契约行渲染设计定案：…
<!-- memory:mem_c0e799eb1cfa4247949733b481a9bece -->
## 2026-09-18
- 本仓降级纪律（长期）：…
```

**三个可读性问题（渲染侧独有）**：
1. **`<!-- memory:mem_<32hex> -->` 直接进正文** —— 这是给**系统**用的锚点 ID，**对人类读者零信息量**，却每两条占一行；
2. **每条前各带一个 `## <日期>`** —— 同一天被切成 N 段（项目笔记 `2026-09-18` 出现 **19 次**）；
3. **超长内容被截断**（本会话可见 `…(截断,完整内容用 memory_recall_pre 或 GUI 面板)`）—— 属**有意的预算控制**，不算缺陷，但用户读到的确实不是全貌。

⇒ **渲染侧的修法是独立的**：锚点可改为不可见/尾注；日期可合并为「同日分组」。

---

## 3. 判据建议（R1 问题二，供拍板时参考）

一条「好读的记忆」应满足（可验收）：
1. **一句话可答「这是什么」** —— 条目首句必须是自解释的完整句（不是标识符开头）；
2. **有适用范围** —— 说清「在哪个项目/哪一层用」；
3. **结论与来源可分离** —— 来源（路径/行号/commit）可折叠或后置；
4. **不依赖隐藏上下文** —— 不需要读者先知道 M1/R4/G3 是什么。

**可自动化验收的候选探针**（本报告脚本已实现前三条）：
- 开头空行 = 0、空行占比 < 15%
- 同日重复 `## ` 标题 = 0（或渲染时合并）
- 缺主语条目占比 < 5%
- 空转条目（「无」「无新增」）占比 = 0

---

## 4. 待用户拍板（问题四 · 修法）

| # | 方案 | 改哪里 | 成本 | 影响面 |
|---|---|---|---|---|
| **A** | **写入侧结构模板**：强制条目自解释（首句完整句 + 可选「适用范围」） | `index.js` 写侧提示 + 整理器 | 低 | 新条目变好；**旧条目不变**（除非批量重写） |
| **B** | **渲染侧呈现**：隐藏锚点注释、同日合并标题、清理空行 | `tier0-catalog-pre.js` / 注入渲染 | 低 | 立刻改善**已存在的**条目观感 |
| **C** | **整理侧清理**：压缩空行、合并同日段、删空转条目 | 整理器（`maintain`/折叠） | 中 | 一次性改善存量；需防误删 |
| **D** | 检索侧逐条摘要句 | 检索侧 | 高 | 需模型调用，成本最高 |

**Agent 倾向（供参考，不作结论）**：**B + C 先做**（立竿见影且不动写入语义），**A 随后**（防新增）。
理由：B/C 不改变任何记忆**内容**，只改呈现与排版 ⇒ 风险最低、可回退；A 属写入语义变更，按本仓纪律**需用户拍板**。

---

## 5. 与 ⑪（skill 导出）的关系

⑪ 的导出物是给人/给模型读的 `SKILL.md`。
**若 ⑩ 的 A 方案落地，⑪ 的导出模板可直接复用同一套「自解释条目」判据** ⇒ 两项有复用价值，但**互不阻塞**。

---

**取证脚本**：`artifacts/_probe-r1-readability.mjs`（可重跑，零依赖）
**本报告不修改任何代码或记忆内容**，仅取证。
