# Observation Lifecycle（观察生命周期协议）

被这些子 skill 引用：`cheat-retro`、`cheat-bump`、主 SKILL.md。

这是项目原则 #3 的完整规范——**rubric 是工作台，不是博物馆**。任何对 `rubric_notes.md` 中观察条目的增删都必须遵循本协议。

---

## 三个生命阶段

每条观察都在下列状态之一：

```
[新增]  →  [观察记录]  →  [跨视频观察]  →  [规律沉淀] / [被吸收为维度] / [被推翻]
                                       ↘
                                        [待验证假设]（暂存）
```

| 阶段 | 在 rubric_notes.md 的位置 | 触发 |
|---|---|---|
| **观察记录** | `## 观察记录` 段 | 单次复盘后写入。每篇视频复盘对应一条 |
| **跨视频观察** | `## 重大跨视频观察` 段 | 同一个 pattern 在 ≥2 个样本里出现 |
| **规律沉淀** | `## 规律沉淀区（高置信度）` 段 | 已有 ≥2 样本支持且**通过升级验证流程**（即被吸收进维度或被显式确认） |
| **待验证假设** | `## 待验证假设` 段 | 单样本观察暂存，等更多样本 |

---

## 升级到下一阶段的门槛（**Claude 判断为主，下面是参考默认**）

| 从 → 到 | 默认参考门槛 | Claude 判断信号强度（可软违反） |
|---|---|---|
| 观察记录 → 跨视频观察 | 同 pattern ≥2 样本 | 1 样本 + 评论区 ≥2000 赞的强模因证据也可升 |
| 跨视频观察 → 待验证假设 | 单样本 + 强信号但还没复现 | — |
| 跨视频观察 → 规律沉淀 | ≥2 样本 + 不需要改公式 | 1 样本 + 强反例（≥3x 偏差）也可升（标 `**Single-sample, high-confidence**`） |
| 跨视频观察 → 维度（不再单独存在） | ≥3 样本 + 通过 bump 流程被吸收 | 同 cheat-bump 的 READINESS_HEURISTIC |
| 任意 → 删除 | 被新数据推翻 / 被吸收为维度 / 被沉淀为规律 | `cheat-bump` cleanup pass，或单独操作 |

**核心原则**：样本数是**信号强度的代理指标**，不是信号本身。3 个清晰、可追溯到具体数据点的样本 > 10 个零碎、低置信度的样本。

**Claude 软违反的纪律**：
- 标注 `**Promoted with N samples (default expects M)**: <为什么仍然成立>`，让用户审视
- 不连环软违反——如果 Claude 在最近 3 次升格里有 2 次以上软违反，cheat-status 提示"你的观察升格判断可能太激进，建议回到默认门槛 review"

### Sample size → 允许的动作（细化分级）

按校准池**总样本数**决定能做什么改动——粗暴改大动作需要更多证据：

| 校准池规模 | 允许的动作 | 备注 |
|---|---|---|
| **1 个** | 记录"单次观察" | 单点不能触发任何规则改动，只能作为种子 |
| **2-4 个** | 提炼"候选规律" + 升级到"跨视频观察"段 | 仍不能改公式 |
| **5-9 个** | 修正维度定义（**定性变更**——如把 SR=5 的门槛说更严）| 不动权重数值，只改判断习惯。**第一次正式 bump 也在这一档**（rubric 形态首次成型） |
| **10-19 个** | 微调权重 ±0.2（**定量变更**）| 如 ER ×1.5 → ×1.7；新增 / 删除维度仍属"定性大动作"，需要更多样本 |
| **20+ 个** | 用回归反推权重（**数据驱动**）| Spearman correlation 之类，可作为 bump 依据 |

**关键纪律**：
- 不要在 N=5 时就用回归——5 个点拟合 7 维公式必过拟合
- 不要在 N=20 时还用直觉调权重——已经有数据信号了
- bump 协议（`bump-validation-protocol.md`）的 `MIN_SAMPLES_FOR_BUMP=5` 是**形态首次成型**的最低门槛，不是"开始数据驱动"的门槛——后者要 N≥20

---

## 删除规则（最容易做错的部分）

**两类条目必须删，不能保留**：

### 类型 A：被吸收为维度的观察

例：v2.1 升级时，"观察 E（致谢段二创量级是 ER=5 的最强外部证据）"被吸收为新维度 **MS（Memetic Shareability）**。

→ 升级落地后，**删除**"观察 E"这条观察记录。维度 MS 本身就是新归宿。

**理由**：保留观察 = 同一概念在文件里出现两次（一次作为维度，一次作为观察）。读者会困惑：这是历史还是仍生效的规则？

### 类型 B：被新数据推翻的观察

例：观察 X 提议"长视频天花板低"，后来 4 个长视频样本都破 50w → 推翻。

→ **删除**这条观察。

**理由**：保留 = 让未来的你或其他读者基于错误规则打分。

---

## 必须保留的条目

下列条目**不删**，留在原处或迁移到合适段：

- **未解决的观察**（既未被吸收也未被推翻）→ 跨升级时迁移到新版本的"待验证假设"段
- **历史校准事件**（如"v1 → v2 升级是因为房价 259w 严重低估"）→ 保留在版本日志的"升级 Memo"段，**不**保留在观察段
- **本版本仍生效的规律**（已沉淀到"规律沉淀区"）→ 保留

---

## 不允许的反模式（**必须拒绝**）

下列模式都是"博物馆冲动"——把 rubric_notes.md 当历史档案：

| 反模式 | 为什么不行 |
|---|---|
| `~~ER 权重 1.5~~` `**改为 2.0**`（带删除线的旧值） | 用 git history 看旧值，不要在文件里堆 |
| "我曾经以为 SR 重要，但其实..." | 这种考古条目让读者读完不知道当下规则是什么 |
| "v1 时代 NA 是关键，v2 后发现不是" | 同上。删掉 NA 相关条目，留版本 memo 解释为什么 NA 被砍 |
| "保留这条观察作为反例" | 反例的位置是版本 memo 的"被推翻假设"小节，不是观察段 |
| "下个 bump 再删，先放着" | 拒绝。bump 落地的同一次操作里删干净 |

git history 才是真正的归档。`rubric_notes.md` 是当前生效规则的快照——读者打开它应该看到**今天该怎么打分**，而不是过去几个月的演化史。

---

## Blind channel leak guard（**任何 skill 写 rubric_notes.md 时必须遵守**）

`rubric_notes.md` 是 cheat-score-blind sub-agent（channel B）的**白名单**——sub-agent 读这个文件给 script 打分时，文件内容不能含**已发布作品的实绩数据**，否则 sub-agent 的"盲"被破坏。

**禁止写入 rubric_notes.md 的 pattern**：

| 模式 | 例子 | 替代位置 |
|---|---|---|
| 真实视频标题 + 实绩 | "「停止期待」播放 71.1w" | rubric-memo.md |
| 派生证据带命名锚 | "派生证据：「她不一样」MS=5 → 实绩 124.8w" | rubric-memo.md |
| 校准池重打表 | bump 时的样本对照表 | rubric-memo.md |
| 跨模型审核引用含数字 | "audit: 「老板废话」rank 一致 ✓" | rubric-memo.md |
| 含 `\d+w` / `\d+万` / `\d+M` / `\d+k` 的数字（**除 bucket 边界**） | "实绩 13.7w" | rubric-memo.md |

**允许的 pattern**（通用语言）：

- 公式：`(ER×2.0 + HP×1.5 + ...) / N × M`
- 维度定义：`ER（情感共鸣）：0=无情绪 / 3=中等共鸣 / 5=极端共鸣`
- 派生证据**抽象化**：`派生证据：高抽象密度样本 → CC=1 → 低 reach`
- Bucket 边界（数字属于规则不属于实绩）：`5-30w / 30-100w / 100-150w / >150w`
- 观察 ID + 一句话：`观察 E：开头 5 秒含问句 → ER+`（不带样本名 / 不带实绩）

**强制 cheat-bump Phase 5 末尾自检**：写完 rubric_notes.md 后跑 `grep -E '\\d+\\s*[wWmMkK万]|播放|实绩|实际'` → 命中 → abort + 回滚。这是硬约束。

历史背景：PR #11 引入 cheat-score-blind 时漏算了这条——cheat-bump 把 Memo 写进 rubric_notes.md，sub-agent 通过白名单读到实绩。PR #12 修复（拆 file）+ 加本段约束防止将来再犯。

---

## cleanup pass 的强制时机

`cleanup pass` = 把所有满足"可删除"条件的观察一次性清掉。

强制触发：
- **bump 落地的最后一步**（见 `bump-validation-protocol.md` Step 5）
- 用户显式触发"清算"操作（罕见）

非强制但建议：
- 校准池每加 5 个样本，主动审视"观察记录"段，看哪些已经可以升格 / 删除
- `cheat-status` 看板检测到 `rubric_notes.md` 行数超过 500 时，建议清算

---

## 行数预算

健康 `rubric_notes.md` 的体积参考（目标）：

| 校准池规模 | 健康行数 | 警戒行数 |
|---|---|---|
| 0-5 篇 | 100-200 | >300 |
| 5-20 篇 | 200-400 | >500 |
| 20-50 篇 | 300-500 | >700 |
| 50+ 篇 | 400-600 | >800 |

行数超警戒 → 必跑一次 cleanup pass。这不是为了好看，是为了**读者打分前能在 60 秒内读完核心规则**。

---

## 与"观察记录"模板的对齐

每条观察记录的标准模板（`rubric_notes.template.md` 也用这个）：

```markdown
### YYYY-MM-DD [标题简称] (id) — [一句话定性，如"验证 ER 主导"]
- 预测：composite=X.XX，bucket=Y
- 实绩：播放 / 点赞 / 评论 / 转发（带 T+Nd 标注）
- Top 评论关键词：[简短摘录 + 赞数]
- 判断：哪个维度被验证 / 推翻？为什么？
- Rubric 调整：[如果有，写明 "下次打 XX 类文章时改 YY"]
- 详见：[predictions/<file>.md]
```

跨视频观察的模板：

```markdown
### 观察 X — [一句话规律]
**证据**：
- 样本 1（composite, 实绩）：核心数据
- 样本 2（composite, 实绩）：核心数据
- 样本 3（composite, 实绩）：核心数据

**假设**：[如果规律成立，意味着什么 rubric 调整]

样本数：N 个，[已超 / 待补]。
```

---

## 与 bump 协议的衔接

`cheat-bump` 在 Step 5（cleanup pass）必须按以下顺序处理观察段：

1. 列出所有 `## 观察记录` 段条目
2. 对每条问 3 个问题：
   - 它是否被本次 bump 吸收为正式维度？→ 删
   - 它是否被本次 bump 的新数据推翻？→ 删
   - 它是否仍未解决？→ 迁移到"待验证假设"段
3. 列出所有 `## 重大跨视频观察` 段条目
4. 对每条问相同 3 个问题
5. 把"已被验证但不需改公式"的规律 → 迁移到"规律沉淀区"
6. 最后**重新阅读** `rubric_notes.md` 全文，确保读者打开能在 60 秒内理解当下打分规则
