Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ Icon?
# Claude Code per-user config (含本地路径 / 个人 permission grants)
# 整个 .claude/ 目录在源码 repo 里都是本地状态——hooks/settings 的项目级配置走用户自己的 content project 不走这里
.claude/
.codex/
.gemini/
.playwright-mcp/

# Python (whisper adapter / score-curve.py 跑过留下的)
__pycache__/
Expand All @@ -25,12 +28,16 @@ venv/
.cheat-secrets.json
predictions/
videos/
articles/
xhs/
scripts/
samples/
candidates.md
rubric_notes.md
rubric-memo.md
script_patterns.md
benchmark.md
audience.md
STATUS.md
WORKFLOW.md
content.db
Expand Down
26 changes: 22 additions & 4 deletions SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ allowed-tools: Bash(*), Read, Write, Edit, Grep, Glob, Skill, mcp__llm-chat__cha
>
> **方法论**(5 阶段闭环):任何能被量化的内容形态都适用——视频 / 文章 / 播客 / Newsletter / 短文 thread。
>
> **当前内置 rubric**:观点类视频(评论 / 时评 / 论说 / 议题讨论 / 个人观点表达),7 个维度由参考博主 25+ 已发样本拟合而来。如果你做其他形态,需要:
> - 自己写一份 rubric(参照 [starter-rubrics/opinion-video-zero.md](starter-rubrics/opinion-video-zero.md) 的格式)
> - 或等内置扩展(长文 / 短文 / 播客 starter 在批次 3 路线图)
> **当前内置 rubric**:观点类视频(评论 / 时评 / 论说 / 议题讨论 / 个人观点表达),7 个维度由参考博主 25+ 已发样本拟合而来;另提供小红书图文 starter,供 `content_form=short-text` 且平台为 xhs 的用户起步。
> 如果你做其他形态,需要:
> - 自己写一份 rubric(参照 [starter-rubrics/opinion-video-zero.md](starter-rubrics/opinion-video-zero.md) 或 [starter-rubrics/xhs-post-zero.md](starter-rubrics/xhs-post-zero.md) 的格式)
> - 或等内置扩展(长文 / 播客 starter 在后续路线图)
>
> 默认假设:**用户是从零开始的新人**(一条视频都没发过)——cold-start 期的预测会**简化**,只要 7 维打分 + 一句话 bet,不强求 bucket 数字(避免 false precision)。已有 5+ 篇数据的老手走 calibration 模式解锁完整 7 组件预测。

Expand Down Expand Up @@ -55,7 +56,7 @@ Codex 没有 Claude Code 的 slash-command harness。安装到 Codex 后,按
| "找选题" / "我不知道拍什么" / "seed" / "找前 5 个选题" | `/cheat-seed` | 已 init(cold-start 用户专用一次性种子动作) |
| "打分这篇 [path]" / "score this [path]" | `/cheat-score` | rubric_notes.md 存在 |
| "启动预测" / "start prediction" / "给这稿子打分并预测" | `/cheat-predict` | 已 init + 有最终稿 |
| "拍了 X" / "shot it" / "录完了" | `/cheat-shoot` | 对应预测已写(buffer +1) |
| "拍了 X" / "shot it" / "录完了" | `/cheat-shoot` | `content_form=opinion-video` + 对应预测已写(buffer +1) |
| "已发布" / "I shipped it" / "发布链接是 X" | `/cheat-publish` | 对应预测文件存在(buffer -1) |
| "复盘" / "retro this" / "T+3d 数据来了" | `/cheat-retro` | 对应预测文件存在 + 已过 RETRO_WINDOW_DAYS |
| "构造受众画像" / "更新 persona" / "我的观众是谁" / "build persona" | `/cheat-persona` | 已 init;有复盘评论数据(或 benchmark seed) |
Expand All @@ -66,6 +67,7 @@ Codex 没有 Claude Code 的 slash-command harness。安装到 Codex 后,按
| "迁移" / "升级 state" / "schema 版本不对" / "migrate" | `/cheat-migrate` | 已 init;用户 git pull 拉了新版后;SessionStart hook 提示 schema mismatch 后 |

> 拍 vs 发分两个动作:buffer 警戒系统需要明确知道"拍了但没发"vs"已发"两种状态。详见 [shared-references/cadence-protocol.md](shared-references/cadence-protocol.md)。
> `cheat-shoot` 仅适用于视频。公众号、小红书等非视频内容直接走 `/cheat-publish`,不要先做拍摄登记。

**Mode detection**(首次接到非 init 触发词时执行):
1. 检查用户当前目录是否有 `.cheat-state.json` → 没有 → 强制路由到 `/cheat-init`
Expand Down Expand Up @@ -98,6 +100,7 @@ skill 期望用户的项目布局如下。`/cheat-init` 会创建缺失项;**
```
<user-content-project>/
├── rubric_notes.md # 评分规则的真实来源
├── rubric-memo.md # bump / retro 观察证据,blind 硬禁读
├── WORKFLOW.md # 5 阶段流程文档(cheat-init 创建)
├── STATUS.md # 看板(cheat-status 维护)
├── .cheat-state.json # 状态文件,子 skill 共享上下文
Expand All @@ -116,6 +119,15 @@ skill 期望用户的项目布局如下。`/cheat-init` 会创建缺失项;**
│ └── YYYY-MM-DD_<id>_<short>/
│ ├── script.md # 用户提供的最终拍摄稿(cheat-shoot 时询问"和 scripts/ 一致吗")
│ └── report.md # T+3d 抓的数据 + 评论(cheat-retro 写)
├── articles/ # 文章产物(非视频内容可选)
│ └── YYYY-MM-DD_<id>_<short>/
│ ├── draft.md
│ └── report.md
├── xhs/ # 小红书图文产物(可选)
│ └── YYYY-MM-DD_<id>_<short>/
│ ├── post.md
│ ├── images/
│ └── report.md
├── samples/ # 对标账号视频 / 转录(cheat-learn-from 创建)
│ └── <账号名>/<video-id>/{source.mp4 (可选), transcript.md, meta.md}
├── candidates.md # 选题池(可选)
Expand Down Expand Up @@ -163,6 +175,8 @@ cheat-on-content/
├── starter-rubrics/ # 各内容形态的先验 rubric
│ ├── opinion-video.md # ✅ 观点视频(中文,已校准 25+ 样本)
│ ├── opinion-video-zero.md # ✅ v0 等权占位(cold-start)
│ ├── xhs-post.md # ✅ 小红书图文 starter(收藏/标题/首图驱动)
│ ├── xhs-post-zero.md # ✅ 小红书 cold-start 等权占位
│ ├── long-form-essay.md # ⬜ 公众号 / Substack
│ └── short-form-text.md # ⬜ X thread / 微博长文
├── templates/ # skill 写进用户 repo 的文件骨架
Expand All @@ -174,6 +188,7 @@ cheat-on-content/
│ ├── script_patterns.template.md # ✅ 写作 pattern 沉淀(含 benchmark 借鉴段说明)
│ ├── benchmark.template.md # ✅ 对标账号 reference
│ ├── audience.template.md # ✅ 受众画像骨架
│ ├── xhs-post.template.md # ✅ 小红书标题 / 正文 / 排版骨架
│ ├── workflow.template.md # ✅
│ ├── status.template.md # ✅
│ └── content.db.schema.sql # ✅
Expand All @@ -186,6 +201,9 @@ cheat-on-content/
│ └── log-event.sh # ✅ meta-logging 脚本
├── tools/ # 独立 CLI 脚本
│ ├── score-curve.py # ⬜ 预测精度收敛曲线
│ ├── diff_pct.py # ✅ cheat-shoot 改稿幅度计算
│ ├── diff_pct_test.sh # ✅ diff_pct smoke test
│ ├── verify-package.sh # ✅ 包结构 / 语法 / 安装列表一键验证
│ ├── md-to-sqlite.py # ⬜ markdown → content.db 升级(批次 3)
│ └── validate-bump.py # ⬜ 校准池全量重打(批次 3)
├── adapters/ # 数据源适配
Expand Down
5 changes: 4 additions & 1 deletion skills/cheat-init/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,10 @@ c) 不找 → state 标 `benchmark_status: none`,用通用 v0 起步
只能含通用语言(公式 / 维度定义 / bucket 边界),不能含真实视频名 / 实绩。
每次 bump 升级时的 Memo(含证据数据 + 派生证据)写到 rubric-memo.md(下一步创建)。"
```
- 复制 `cheat-on-content/starter-rubrics/<form>-zero.md`(cold-start)或 `<form>.md`(已有数据时仍可参考)
- starter 选择规则:
- `content_form=opinion-video` → 复制 `starter-rubrics/opinion-video-zero.md`(cold-start)或参考 `opinion-video.md`
- `content_form=short-text` 且 `enabled_perf_adapters` 含 `xhs-explore` → 复制 `starter-rubrics/xhs-post-zero.md`(cold-start)或参考 `xhs-post.md`
- 其他形态暂没有内置 starter → 询问用户是否先复制 `opinion-video-zero.md` 作为占位并在顶部标 `rubric_form_mismatch: true`,或让用户提供自定义 rubric

2.5. **`rubric-memo.md`**(**新**——配合 cheat-score-blind 隔离协议)
```
Expand Down
27 changes: 18 additions & 9 deletions skills/cheat-publish/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ allowed-tools: Bash(*), Read, Edit, Glob
| `<prediction-file>` 或 URL | 用户参数;缺失则用 `.cheat-state.json` 的 `in_progress_session.file` |
| `.cheat-state.json` | 用户项目根 |

内容形态判断:读取 `.cheat-state.json.content_form`。`opinion-video` 走视频 folder + buffer;`long-essay` / `short-text` / `other` 等非视频形态不要求 `/cheat-shoot`。

## Workflow

### Phase 0: 找到对应的预测文件
Expand Down Expand Up @@ -89,11 +91,16 @@ allowed-tools: Bash(*), Read, Edit, Glob

如果用户给的是分享短链(无法立刻 resolve)→ 标 `Aweme ID: pending`,下次 `/cheat-retro` 时由 adapter 解析。

**video folder 处理**:到 cheat-publish 这一步,对应的 `videos/<id>/` 目录**应该已经由 cheat-shoot 创建**(含 script.md)。
**artifact folder 处理**:

- 如 video folder 不存在 → 警告"你跳过了 cheat-shoot?建议先跑 cheat-shoot 把拍摄稿登记进 video folder 再发",**询问用户是否跳过登记直接发**:
- 是 → 自动建一个 video folder(fallback),但不询问稿子一致性,标 `ad_hoc_publish: true`
- 否 → 让用户先跑 cheat-shoot 再回来 publish
- `content_form=opinion-video`:对应的 `videos/<id>/` 目录**应该已经由 cheat-shoot 创建**(含 script.md)。
- 如 video folder 不存在 → 警告"你跳过了 cheat-shoot?建议先跑 cheat-shoot 把拍摄稿登记进 video folder 再发",**询问用户是否跳过登记直接发**:
- 是 → 自动建一个 video folder(fallback),但不询问稿子一致性,标 `ad_hoc_publish: true`
- 否 → 让用户先跑 cheat-shoot 再回来 publish
- 非视频:**不要要求 cheat-shoot**。
- `long-essay` → 如 `articles/<id>/` 不存在,直接创建;建议把终稿放到 `draft.md`。
- `short-text` 且平台为 xhs → 如 `xhs/<id>/` 不存在,直接创建;建议把终稿放到 `post.md`,图片放到 `images/`。
- 其他形态 → 不强制 artifact folder;有需要时用 `<platform>/<id>/` 或让用户确认。

用 Edit 工具(不是 Write 重写整个文件)。

Expand All @@ -106,7 +113,8 @@ allowed-tools: Bash(*), Read, Edit, Glob
"in_progress_session": null,
"last_published_at": "<ISO timestamp>",
"last_published_file": "predictions/<filename>",
"last_published_video_folder": "videos/<...>/",
"last_published_video_folder": "videos/<...>/ 或 null",
"last_published_artifact_folder": "videos|articles|xhs/<...>/",
"last_published_platform_id": "<aweme_id 或 BV 号 等>",
"pending_retros": [
"predictions/<filename>"
Expand All @@ -117,10 +125,11 @@ allowed-tools: Bash(*), Read, Edit, Glob
}
```

**`shoots` 队列处理**(buffer 跟踪关键):
1. state.shoots[]
**`shoots` 队列处理**(仅视频,buffer 跟踪关键):
1. `content_form=opinion-video` 时读 state.shoots[]
2. 找 `video_folder == 本次发布的 video_folder` 的项 → 移除
3. 如果没找到 → 警告"buffer 队列里没有这条视频。是直接发布没经过 /cheat-shoot 吗?"——不阻塞,但提示用户下次走 /cheat-shoot 让 buffer 跟踪准确
4. 非视频内容不读写 shoots,也不输出 buffer 警告

`last_published_platform_id` 是 cheat-retro 调 adapter 时的输入——如 douyin-session 需要 aweme_id 直接抓数据。

Expand All @@ -134,7 +143,7 @@ allowed-tools: Bash(*), Read, Edit, Glob
- Platform: douyin
- URL: https://v.douyin.com/abc123

📦 Buffer:N 篇(颜色 + 含义)
📦 Buffer:N 篇(颜色 + 含义;仅视频显示
按你的 cadence(X)= N×X 天 buffer
[如颜色变了,提示"现在该去拍/暂停拍"]

Expand All @@ -146,7 +155,7 @@ allowed-tools: Bash(*), Read, Edit, Glob
到时间说:"复盘 predictions/2026-05-04_..."
```

Buffer 颜色由 [shared-references/cadence-protocol.md](../../shared-references/cadence-protocol.md) 派生。如本次发布让 buffer 跌入红色(断更风险)→ 高亮警告"今天必须再拍 ≥1 条"。
Buffer 颜色由 [shared-references/cadence-protocol.md](../../shared-references/cadence-protocol.md) 派生,仅视频形态显示。如本次发布让 buffer 跌入红色(断更风险)→ 高亮警告"今天必须再拍 ≥1 条"。非视频内容输出"已加入待复盘",不显示拍摄 buffer

## Key Rules

Expand Down
23 changes: 20 additions & 3 deletions skills/cheat-seed/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,15 @@ Batch Mode — 用户显式要批量(`/cheat-seed --batch 5`):
- **MODE_B_MAX_REPROBE_TURNS = 2** — Mode B "为什么" 反问最多 2 轮;超过则转 Mode C
- **MAX_DEEP_DIVE_TURNS = 4** — Mode A 收敛阶段最多 4 轮反问,避免 AI 过度盘问
- **WITH_DRAFT = yes** — 默认确认角度后立刻写 draft;用户可说 "等下,我自己写" 跳过
- **DRAFT_LENGTH** — 派生自 `state.typical_duration_seconds`:30s→100-200字 / 90s→250-500字 / 240s→600-1000字 / 450s→1100-2000字 / 900s→2200+字
- **DRAFT_LENGTH** — 视频稿派生自 `state.typical_duration_seconds`:30s→100-200字 / 90s→250-500字 / 240s→600-1000字 / 450s→1100-2000字 / 900s→2200+字
- **XHS_DRAFT_LENGTH = 600-900 字** — 当 `content_form=short-text` 且用户明确要小红书 / state 启用了 `xhs-explore` 时使用
- **HUMANIZE_DRAFT = on**(默认)/ off —— 写完 draft 后用 `humanizer` skill 过一遍,去掉 AI 写作 tells(em-dash 滥用 / rule of three / inflated 词汇 / 空泛归因等)。off 时直接出原始 AI draft。**只 humanize 正文,不动 header 的"必须改写"警告**

## Inputs

| 必填 | 来源 |
|---|---|
| `.cheat-state.json` | 读 calibration_samples / typical_duration / cadence |
| `.cheat-state.json` | 读 calibration_samples / typical_duration / cadence / content_form / enabled_perf_adapters |
| `rubric_notes.md` | 读当前 rubric(粗打分用) |
| `script_patterns.md` | 读已有 pattern(写 draft 时按 cheat sheet 选结构) |
| `predictions/*.md`(如有) | 已发历史,brainstorm 时作为 context |
Expand Down Expand Up @@ -279,7 +280,23 @@ Mode A 默认深挖用户经历。但如果**用户讲的本身是时事话题**

**写 draft 前必读** `script_patterns.md` —— 按"结构选型 cheat sheet"对应用户的 topic 选合适结构。如果文件还在抽象骨架阶段(用户没填几个 pattern),就用 starter rubric 对应的通用框架。

**字数**:按 `DRAFT_LENGTH` 派生(基于 `typical_duration_seconds`)。
**字数与格式分流**:
- `content_form=opinion-video` 或未明确非视频 → 按 `DRAFT_LENGTH` 派生(基于 `typical_duration_seconds`)。
- `content_form=short-text` 且用户明确要小红书 / `enabled_perf_adapters` 含 `xhs-explore` → 走下面的小红书图文规则。

#### 小红书图文规则

当当前稿件是小红书图文时,不走下面的视频段落稿规则,改用小红书图文规则:

1. 先读 `starter-rubrics/xhs-post.md` 的“小红书特有注意事项”。
2. 写 3 个候选标题,每个 ≤20 个中文字符,并标注策略:数字 / 痛点 / 悬念 / 直接价值。
3. 正文目标 600-900 字,前 2 行必须直接给痛点、反直觉、结果或具体场景。
4. 结构必须从 5 类里选一种:清单体 / 教程体 / 故事体 / 对比体 / 测评体。
5. 手机排版:每段 2-4 句,段间空行,用 emoji 做段落锚点;不要用 markdown H2/H3 标题层级。
6. 结尾 1-2 句给明确动作:收藏理由 / 评论问题 / 下次想看的方向。
7. 写入 `scripts/<YYYY-MM-DD>_<id>_<short-title>.md` 时使用 `templates/xhs-post.template.md` 的结构。

完成后提示用户下一步是 `/cheat-predict scripts/<...>.md`,发布后直接走 `/cheat-publish`;小红书图文不需要 `/cheat-shoot`。

#### ⚠️ 正文必须是段落版,不是字幕格式(**最常见的生成跑偏**)

Expand Down
12 changes: 12 additions & 0 deletions skills/cheat-shoot/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,18 @@ cheat-shoot 自己**不**写预测内容——所有预测落盘逻辑在 cheat-
- "实际拍摄稿" ≠ "pre-shoot 草稿"是常态。这一步是把 diff 显式化、触发 v2 重判、采集"用户改稿 pattern"信号的入口
- v2 预测 vs v1 预测的差异本身就是 rubric 升级证据——比如 v1 给 ER=4,v2 给 ER=5(用户改稿改高了 hook 强度),就告诉 rubric "这个用户的 ER 阈值跟我现在公式不一致"

## 格式守卫

cheat-shoot 仅适用于视频内容。

1. 读 `.cheat-state.json` 的 `content_form`
2. 如果用户指定了 `--format`,用用户指定的格式判断
3. 如果格式不是 `opinion-video` / `video` → **拒绝**,提示:
> "cheat-shoot 仅用于视频格式。文章、小红书图文、播客等非视频内容不需要拍摄登记。
> 如果你要登记发布,请用 '已发布 [URL]'。
> 如果你要复盘数据,请发布后到窗口期再说 '复盘 [prediction]'。"
4. 老用户 state 缺 `content_form` 时,按 legacy video 项目处理,不阻塞。

## Overview

```
Expand Down
82 changes: 82 additions & 0 deletions starter-rubrics/xhs-post-zero.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# Starter Rubric:小红书图文 — v0 cold-start 占位

**这是给完全没数据的新小红书账号用的占位 rubric。**前 5 篇预测精度大概 ±50%。

---

## v0 综合分公式(等权占位)

```
composite = (SC + ER + TA + IQ + ID + IG) / 6 × 2.0
```

每个维度 0-5 整数分。综合分范围 0-10。

**为什么等权**:你没有数据支持任何特定权重。等权让你在数据出来之前对每个维度都给"中立的关注"。

---

## 6 个维度

(与 xhs-post.md 相同的维度定义,详见该文件)

### SC — 收藏价值
### ER — 情感共鸣
### TA — 标题吸引力
### IQ — 首图质量
### ID — 信息密度
### IG — 互动引导

---

## 小红书写作硬约束(cold-start 也必须遵守)

- 标题 ≤20 个中文字符;写稿时给 3 个候选标题,至少覆盖数字 / 痛点 / 悬念 / 直接价值中的 2 类。
- 正文目标 600-900 字。超过 900 字先删铺垫、重复解释和泛泛总结。
- 前 2 行必须抓注意力:直接给痛点、反直觉、结果或具体场景,不要寒暄。
- 结构优先选一种:清单体 / 教程体 / 故事体 / 对比体 / 测评体。
- 手机排版:每段 2-4 句,段间空行,emoji 做段落锚点,不用 markdown 标题。
- 结尾给自然互动:收藏理由、评论问题或“下一篇想看什么”。

---

## Cold-start 战略

前 5 篇你不是在做决策,你是在收集数据。

### 取样策略:主动选差异最大的帖子

- 1 篇 SC 主导(收藏价值拉满,干货攻略型)
- 1 篇 ER 主导(情感共鸣极强)
- 1 篇 TA 主导(标题党,内容一般)
- 1 篇 IQ 主导(首图惊艳)
- 1 篇综合中等

### 何时开始相信预测

| 校准样本 | 你能相信什么 |
|---|---|
| N=0-2 | 啥都别信 |
| N=3-5 | 相信方向,不信数字 |
| N=5-10 | 相信 bucket 排序 |
| N=10-20 | 中枢可信 ±30% |
| N≥20 | rubric 真正成为"作弊器" |

---

## Cold-start 期的复盘纪律

前 5 篇每篇必走完整循环。

每次复盘必须填的最少信息:
- 实际曝光数
- 实际点赞数
- 实际收藏数
- 实际评论数
- 我的 v0 预测 vs 实际:哪个维度被验证 / 推翻

---

## 最重要的一句话

**前 5 篇你不是在做决策,你是在收集数据。**
Loading