# S1：科学性补强与跨项目借鉴规划

> 写于 2026-09-06。上位文档：[NEXT-MAJOR-VISION.md](NEXT-MAJOR-VISION.md)（愿景权威）、[M-CM-PLAN.md](M-CM-PLAN.md)（当前大版本实施蓝图）。
> **本文件是并行线，不打断 M-CM1..4。** 定位：把 M7 已有的工程严谨度升级为可对外发表、可横向比较的科研产出。
> 对标对象：OpenViking（volcengine，AGPLv3，35.7k★）、Hindsight（vectorize-io，MIT，22.7k★，ACL 2026 Demo）。

---

## 0. 许可证：务实分级（2026-09-06 修订，取代此前"禁读源码"的保守立场）

> **修订说明**：初版写"禁止阅读源码"过于保守，会因噎废食——照做只能临摹个样子，拿不到真正的质量。以下为务实分级。

### 法律事实（不是法律意见，建议重大决策前咨询律师）

- 版权保护**表达**，不保护**思想、程序、方法、系统、算法**。AGPLv3 约束的是"衍生作品"，不是"知识"。
- 真正的红线不是"能不能读"，而是"**你的实现是不是它的衍生作品**"。
- AGPLv3 的传染性触发于**分发/提供网络服务**时的衍生作品；**阅读本身不构成侵权**（无 NDA/EULA 禁止反向工程的前提下）。

### 三档操作边界

| 档 | 行为 | 风险 | 说明 |
|---|---|---|---|
| **绿区** | 读源码理解原理；学算法思想；学参数选择（BM25 k1=1.2 是行业默认值，非其独创）；**学它踩过的坑与实测数据**（issue #3956 / #3250 / 线程池 benchmark） | **无** | 经验知识不受版权保护。**且这恰恰是最值钱的部分** |
| **黄区** | 对齐数据结构字段名；照搬 prompt 模板措辞 | **中** | prompt 具独创性，接近"表达"；字段名对齐会成为"接触+实质相似"的佐证 |
| **红区** | 复制代码块；逐行翻译式改写；fork 后改 | **高** | 明确构成衍生作品 |

### 结论：合规与高质量不矛盾

**质量的来源是理解深度，不是复制粘贴。** 真正拉开差距的是他们踩过的坑（RRF 加权为何崩、长查询 BM25 为何超时、中文时间解析为何要单开 86KB 规则文件）——这些是纯经验知识，全部落在绿区，且比代码本身更值钱。

### 优先级策略

1. **Hindsight（MIT）优先深挖** —— 协议风险低，实现深度最高（`consolidator.py` 157KB + 测试 138KB）。
2. **OpenViking（AGPLv3）取架构不取代码** —— 其核心卖点（文件系统隐喻、L0/L1/L2、目录递归检索）在论文 VikingMem arXiv:2605.29640 与公开 README 中已完整描述，无需读源码即可获得架构层价值。
3. 实现纪律：**用不同的数据结构与代码组织独立实现，不复制任何片段**。黄区行为（照搬 prompt 措辞）一律避免——改写成我们自己的表达。

---

## 1. 诊断：别妄自菲薄，你已经有四件硬资产

你的自评是"科学性欠缺"，但对账下来，**M7 的 rigor 已经超过大多数 ACL/EMNLP 投稿**：

| 资产 | 已有证据 | 学术圈怎么看 |
|------|---------|-------------|
| **预注册** | `M7-BENCHMARK-PLAN.md` 冻结版：研究问题先写、决策规则先写、阈值先定、事后**零重调参** | 这是很多论文做不到的。叫 preregistration，是可写进 method 的加分项 |
| **人工金标 held-out** | 69 条 proposed 全部人工审核，含 2 条 override 如实转写、2 条 deferred 明示不计 | 比"合成标签冒名 gold"强得多，而你已经主动废弃了那份 |
| **统计 rigor** | actPrecision 0.917，CI95 [0.727, 1.0]，**pairId 聚类 bootstrap B=2000** | 聚类 bootstrap 是对的（样本非独立），多数记忆系统论文只报点估计 |
| **分层报告 + 泄漏覆盖披露** | 9 个分层，主动声明"本批无 harmful 专项样本，由训练侧重放覆盖" | 主动披露覆盖缺口，这是诚实性加分 |

**真正的 gap 只有三个，且都不在"态度"而在"可比较性"：**

1. **没有对外可比的数字** —— 外界只看到"内部 67 条 held-out 上 0.917"，无法与 Hindsight 的 LongMemEval 91.4%、OpenViking 的 LoCoMo 82.08% 放到同一张表上。
2. **没有消融实验（ablation）** —— 证明不了"每个组件各自贡献多少"。审稿人第一问就是这个。
3. **检索层缺时间维度** —— `shadow-retrieval-pre.js` 里有 lexical（32 处）/ recency（5 处），但 **temporal=0、graph=0、rrf=0**。而时序推理恰是 LongMemEval 最难的一类，也是 MetaMem 论文里收益最大的一类。

---

## 2. 取 Hindsight：记忆结构与检索（补第 3 个 gap）

### 2.1 【P0】时间检索臂 —— 最高优先级

**缺口**：`fact-store-pre.js` 有 `confidence`（17 处）/ `supersede`（11 处），**无 `occurredAt`/`eventDate` 类字段**；检索侧无时间臂。

**取什么**（来自论文 arXiv:2512.12818 与公开文档，非源码）：

- 事实抽取增加 **时间三元组**：`occurredStart` / `occurredEnd` / `mentionedAt`
- 事实文本拼**日期上下文后再嵌入**（"把日期拼进文本"是 Hindsight 的关键细节，对时序检索命中率影响很大）
- 检索加第四臂：**时间窗过滤 → 时间邻近加权**

**落点**：
- schema：`fact-store-pre.js` / `episodic-store-pre.js`
- 抽取 prompt：`python/worker_semantic_pre_v1.py`（事实抽取侧）
- 检索：`shadow-retrieval-pre.js`（在 lexical + 语义 + recency 之外加 temporal 臂）
- 索引同步：`index-sync-pre.js` / `m7-index-sync-host-pre.js`

**验收**：在现有 67 条 held-out 上，时序类子集 Recall@5 提升且有 bootstrap CI 不重叠（B=2000，同上口径）。

### 2.2 【P1】supersede 改为"时间标记双态"，不覆盖

**缺口**：现有 `supersede` 需确认是否为物理覆盖。

**取什么**：矛盾不覆盖，存成"used to X, now Y"，保留双态历史。Hindsight 的 consolidation 规则：冗余→UPDATE；**矛盾→时间标记双态**；不同人/主题不合并。

**为什么对我们更值钱**：我们的场景是长期陪伴 + 代码演进，"上周用 A 方案，本周换 B"是常态，覆盖会丢掉"为什么换"这条最有价值的信息。且这与 §2.4 的 30 天蒸馏"绝不丢信息"原则同源。

**落点**：`fact-store-pre.js` supersede 语义 + 蒸馏泵（`memory-writer-pre.js`）。

### 2.3 【P1】轻量链接结构（**不要上图数据库**）

**缺口**：`graph` 出现 0 次。

**取什么**：Hindsight 建四类链接——entity / temporal（24h 窗口共现加权）/ semantic（top-5 近邻 ≥0.7）/ causal（LLM 抽取）。

**我们的克制版**（零依赖约束下）：
- 用**倒排索引**代替图：`entity → [memoryId]`，存在 `memory-index-pre.js` 已有的索引结构旁
- 先做 **entity link + temporal link** 两类；causal 交给现有子代理在固化时顺带抽（不新增链路）
- semantic link 用现有向量近邻即可，不必单独存

**明确不做**：不引 Neo4j / Kuzu / 任何图 DB。我们有"0GB 词法保底 → 130MB → 563MB"的分级承诺，图 DB 会直接摧毁这个卖点。

### 2.4 【P1】RRF 对照融合 —— 既是改进也是一篇消融

**缺口**：`rrf`/`reciprocal`/`fusion` 均为 0，现为 D6 **加权融合**。

**判断**：加权融合在有标定数据时通常**优于** RRF（RRF 不调参、更鲁棒但不利用标定）。所以**不要直接换**，要做**对照实验**：

- 加一条 RRF(k=60) 融合分支，与现有加权融合在**同一 held-out 同一指标**上对照
- 结论无论谁赢都是有效结果：加权赢 = 证明标定融合的价值；RRF 赢 = 证明免调参的鲁棒性
- 这正是审稿人要的消融

**落点**：`shadow-retrieval-pre.js` 增加可切换融合策略（复用"一切皆开关"的设置页机制）。

### 2.5 【P2】consolidation 趋势分类

**取什么**：Hindsight 给 observation 打趋势标签——`STABLE` / `STRENGTHENING` / `WEAKENING` / `NEW` / `STALE`（按证据时间戳计算），STALE 的可降权或归档。

**我们的映射**：现有"90 天未用自动归档"（技能固化）已是 STALE 的粗糙版，可以统一成一套趋势字段，交给记忆中枢页签展示。

**落点**：`memory-writer-pre.js` / `storage-manage-pre.js` + 记忆中枢页签。

### 2.6 【不取】opinion 网络

Hindsight 论文描述了 world / experience / observation / opinion 四个网络，但**其当前代码库 `VALID_RECALL_FACT_TYPES` 只剩三个，opinion 已通过 Alembic 迁移删除**。这是他们自己验证失败的方向，我们不取。

---

## 3. 取 OpenViking：上下文经济与可观测

### 3.1 【P0】L0/L1/L2 分层 + **token 账本**

**现状**：我们已有注入形态三级（checklist / excerpt / hint，高风险自动降级 hint）——**思想上已经对了，缺的是量化**。

**取什么**（公开 README 口径，非源码）：
- 每条记忆生成 **L0 摘要（~100 token）/ L1 概览（~2k token）/ L2 原文** 三层
- 注入时先用 L0 判断相关性，命中才升级读 L1/L2
- 目录/分组本身也带 L0/L1，读全文前先判断这个分组值不值得钻

**我们最该抄的是它的对外指标**：OpenViking 敢报"输入 token 减少 34.3–91.0%"，因为有账本。

**落地**：建立 **token 账本**——每次注入记录：候选记忆数、L0 筛选前/后 token、实际注入 token、若无分层的朴素注入 token（反事实基线）。产出我们自己的"token 节省率 + 区间"。

**为什么这是最高性价比的一项**：它把我们已经做对的事变成**一个对外可引用的数字**，直接补上 §1 的 gap 1。

**落点**：`context-host-pre.js`（注入侧，`:1936` renderMemoryDynamic 附近）、新增 `lib/inject-ledger-pre.js`（账本落 JSONL）。

### 3.2 【P1】记忆 URI 命名空间

**取什么**：OpenViking 用 `viking://resources/...`、`viking://user/{id}/memories/...` 让每个上下文有唯一 URI。

**我们的映射**：`dsh://ws/{workspace}/memories/{id}`、`dsh://ws/{ws}/handoff/{ts}`、`dsh://user/prefs/{key}`。

**为什么现在做最划算**：M-CM2 要扩展 `memory_recall` 的 scope（notes/logs/reflections/handoff/sessions），M-CM3 要给会话帧加 provenance——**两者都需要稳定的引用标识**。URI 不是新功能，是给 M-CM 打地基。

**落点**：与 M-CM2/3 同批，复用到 M5 cite 规范。

### 3.3 【P2】检索轨迹结构化落盘

**现状**：已有 evidence 链 + 唤起回顾页（A/P/S/H/E 五档复核）——**已经比 OpenViking 强**，他们只是可视化目录浏览轨迹。

**补什么**：把每次激活决策的完整路径落成 JSONL——各臂命中与分数、阈值、margin、echo veto 是否触发、最终决策。

**双重收益**：① 可观测性；② **它就是消融实验的数据源**（§4.2 直接消费）。

**落点**：`activation-host-pre.js` 决策出口。

---

## 4. 科学性补强（补 §1 的 gap 1 和 gap 2）

### 4.1 标准基准对齐 —— **对齐分类法，不是换数据集**

**误区**：不要去跑 LongMemEval 原始数据。它是英文、通用对话场景，与我们的"中文 + 代码 + 跨工作区 + 主动注入"场景不匹配，硬跑只会得到一个不好看也不说明问题的数字。

**正确做法**：自建基准，但**任务分类法对齐 LongMemEval**：

| LongMemEval 类别 | 我们的对应构造 |
|---|---|
| 信息抽取（single-session） | 单会话事实回忆 |
| 多会话推理 | 跨工作区/跨会话整合 |
| **时序推理** | "上周 vs 本周"、方案演进顺序 ← **我们有真实数据优势** |
| 知识更新 | supersede 后的正确答案 |
| 弃权（abstention） | 该不该注入（**这是他们没有的维度**） |

然后可以说："在时序推理这一类上我们 X%，Hindsight 公开数字 Y%"——**分类法对齐，数字才可比**。

**额外加分项**：LongMemEval 没有"主动注入"这一维度。我们的基准里应单列 **proactive lane**（这正是 §5 的论文卖点）。

### 4.2 消融矩阵 —— 现在最缺的一项

**我们的天然优势**：README 主打"一切皆开关"。**每个开关就是一次消融。** 学术项目要改代码才能做消融，我们改配置就行。

必做消融（逐个关闭，测 Δ）：

| 消融项 | 预期发现 |
|---|---|
| 关词法臂（仅语义） | 代码/错误码/专名场景崩塌 → 证明 BM25 不可替代 |
| 关语义臂（仅词法） | 跨语言、同义改写崩塌 |
| 关 recency 加权 | 时效类查询退化 |
| 关时间臂（新增后） | 时序推理退化 ← 证明 §2.1 的价值 |
| 关 echo veto | 误激活率上升 ← 证明我们的原创发现 |
| 关巩固/蒸馏 | 长期一致性退化 |
| 加权融合 vs RRF | 见 §2.4 |

**输出形态**：一张 Δ 表 + 每个 Δ 的 bootstrap CI。这就是论文 Table 3。

### 4.3 统计 rigor 补强

已有：聚类 bootstrap（B=2000）、CI95、分层报告、泄漏披露。补：

- **配对显著性**：同一 held-out 上两版策略逐条对比，用 McNemar 检验或差值 bootstrap CI（比"两个 CI 不重叠"更严谨）
- **效应量**：不只报 p，报 Cohen's h 或 Δ 绝对值
- **多重比较校正**：9 个分层 × 多个指标，需 Benjamini-Hochberg 控制 FDR
- **样本量论证（power analysis）**：67 条能检出多大的效应？诚实写出 MDE（最小可检出效应）。这一条会直接回应"样本是不是太小"的质疑——**主动承认边界比被问出来强**

### 4.4 预注册 —— 你已经在做，要显式命名

`M7-BENCHMARK-PLAN.md` 的"冻结版 + 决策规则先写 + 零重调参"就是预注册。补两件事让它在论文里站得住：

1. held-out 数据**冻结时间戳 + 内容 hash** 写入报告，防事后数据污染质疑
2. 任何"事后发现→改策略"必须新开版本号，旧结论保留不覆盖（我们已有 `configHash` 机制，直接复用）

### 4.5 外部可复现包

现在复现依赖 3080 与用户本机数据。建议出一个 **fixture-only 公开复现包**：不联网、不含用户数据、纯 Node 可跑（M7-2 已有 CI fixture vectors，扩展即可）。

**收益**：审稿人/用户能一键复现我们的核心数字，这是可信度的分水岭。

---

## 5. 你的独门武器（他们都没有，这是论文定位）

| 我们的资产 | OpenViking | Hindsight | 说明 |
|---|---|---|---|
| **主动联想零指令注入** | ✗ 被动检索 | ✗ 被动检索 | 他们在"模型决定去查"，我们在"模型开口前注入" |
| **前缀缓存字节级稳定** | ✗ | ✗ | 已发请求不可改写——工程上极难，是硬约束下的设计胜利 |
| **注入时机决策（whether to inject）** | ✗ | ✗ | 他们只做 **what to retrieve**，我们做 **whether to inject** |
| **echo veto** | ✗ | ✗ | **原创发现**：20 条含 echo 样本零误激活，双臂 veto 在未见数据上成立 |
| **写入卫生闸门** | ✗ | ✗ | GBK 乱码 34 特征、复读退化、脏 token 扫描——生产级信任 |
| **本地优先 + 模型无关 + 跨宿主继承** | 部分 | 部分 | 我们 BSD-3 + 零依赖 + 三店本地 |

### 论文定位建议

**题目方向：《When to Inject, Not Just What to Retrieve》**

核心论点：现有记忆系统（OpenViking / Hindsight / Mem0 / Zep）全部优化的是**检索质量**（给定查询，找对内容）；而宿主内插件面对的真实问题是**注入决策**——在没有显式查询时，是否该打断模型、注入什么、注入多少，且受"前缀缓存不可失效"的硬约束。我们形式化这个问题，给出特征-策略-门禁三级结构，并在人工金标 held-out 上验证。

**目标venue**：ACL/EMNLP Findings（短文）、CCL（中文）、或 CHI 的 HCI 侧（我们有真实用户可审计界面 + 白板外化认知，这块 CHI 很吃）。

**M7-RESEARCH-PAPER.md / M7-ACTIVATION-V2-PAPER.md 已是雏形**，按本文档 §4 补齐消融与基准对齐即可投稿。

---

## 6. 分期路线（不打断 M-CM）

| 期 | 内容 | 依赖 | 与 M-CM 关系 |
|---|---|---|---|
| **S1-a** | token 账本（§3.1）+ 检索轨迹落盘（§3.3） | 无 | 纯增量，不冲突 |
| **S1-b** | 时间检索臂（§2.1）+ 时间三元组 schema | 无 | 可与 M-CM3 会话帧索引共享 provenance 设计 |
| **S1-c** | 消融矩阵跑通（§4.2） | S1-a/b | 复用现有开关 |
| **S1-d** | 基准分类法对齐 + 公开复现包（§4.1/§4.5） | S1-c | 与 M-CM2 的 scope 扩展协同 |
| **S1-e** | 统计 rigor 补强 + 投稿（§4.3/§4.4） | S1-d | 大版本宣传可引用论文 |

**建议插入点**：M-CM1（交接笔记）完成后、M-CM2 开工前插入 S1-a——因为账本和轨迹都是观测性改动，零风险，且能在 M-CM2 改动检索路径前建立**改动前基线**。这个顺序很关键，事后再补基线就来不及了。

---

## 7. 一句话

**他们的强项是"检索得准"，我们的强项是"知道该不该说、什么时候说、说完还能审计"。前者是他们的论文，后者是我们的。** 科学性补强不是去追他们的数字，是把我们独有的那个问题——**注入决策**——用他们那套 rigor 标准证明出来。
