- name
- cheat-init
- description
- cheat-on-content 的首次 onboarding 与脚手架创建器。统一流程——所有用户都走相同 5 阶段闭环,唯一区别是"发过视频的人"会在 init 时多一步:抓取已有视频建立历史 context(用于后续 cheat-seed 给更贴合的选题、更准的 baseline)。触发词:"初始化"/"init"/"首次使用"/"我是新用户"/"setup cheat-on-content"。**必须在用户第一次会话执行;其他子 skill 在 .cheat-state.json 不存在时自动路由到此。**
- argument-hint
- [— form: opinion-video|long-essay|short-text|podcast]
- allowed-tools
- Bash(*), Read, Write, Edit, Glob, WebFetch, Skill
# /cheat-init — 首次 onboarding
让用户从零到能跑第一篇预测,全程 ≤ 5 分钟(没发过历史的)或 ≤ 10 分钟(已发过、要 import 历史的)。
## Overview
```
[用户首次说"初始化"]
↓
[Phase 0: 检测当前状态]
↓
[Phase 1: 首屏文案 — 适用性 + 期望管理]
↓
[Phase 2: 6 个问题(Q1-Q5 都问;Q2 决定是否走 user-history import)]
↓
[Phase 2.5: 对标账号 — 强烈建议(cold-start 必须问,已发用户可选)]
↓
[Phase 3: 创建脚手架(含 scripts/ + videos/ + samples/ 空目录 + 模板文件含 benchmark.md)]
↓
[Phase 3.5: user-history import 流程(仅 Q2=有发过历史 + 用户同意)]
↓
[Phase 4: 测试 hook 是否生效]
↓
[Phase 5: 给"下一步该说什么"清单]
```
## Constants
- **DEFAULT_RETRO_WINDOW_DAYS = 3**
- **INSTALL_HOOKS = ask** — 默认询问;用户选 `auto` 直接装;`skip` 不装
- **TREND_DEFAULT_SOURCES = ["manual-paste"]**
## Inputs
无。所有信息从 6 个对话问题里收集。
## Workflow
### Phase 0: 检测当前状态
1. 读用户当前工作目录(**用户的 content project,不是 cheat-on-content 自己**)
2. 检查是否已存在 `.cheat-state.json`:
- 存在 → 提示"项目似乎已初始化(state file 存在)。要重新初始化会覆盖现有配置——确认?" 等用户明确确认才继续
- 不存在 → 进入 Phase 1
3. 检查是否已存在 `rubric_notes.md` / `predictions/` 等核心文件——存在但 state file 不存在 → 是"半初始化"状态,提示用户并询问"要从现有文件推断状态还是重置?"
### Phase 1: 首屏直白告知期望(含适用性验证)
向用户输出(一字不漏,不要软化):
```
🎯 Cheat on Content / 网红外挂 — 初始化
你的下一条内容已经在改写 3 个月后的你。
规律是客观存在的,区别是你**看见**还是**没看见**。
这套让你看见。
接下来 5-10 分钟我会问你 5-6 个问题搞清楚你做什么、有什么、怎么用。
两件事先说在前面:
1. **早期预测会不准**——前 5 篇精度大概 ±50%,这是数学事实。
工具用 🔴🟠🟡🟢🔵 标 confidence 等级,不藏数字——
你自己判断这次能不能信。
2. **强烈建议导对标账号**——5-10 条对标视频,工具立刻有 anchor。
不然第一批预测基本是占星。后面 Q5 会再问一次。
准备好开始吗?
```
如果用户答"继续"或类似肯定回应 → Phase 2。
不再因为 content_form 拒绝继续——任何形态都允许,只是 `rubric_form_mismatch` 字段标真,cheat-status 后续会持续提示用户"你的形态需要 bump 调权重"。
### Phase 2: 6 个问题(一问一答,**不**批量提问)
**Q1: 内容形态**
> "你的内容更接近哪一种?
> a) **观点视频**(评论 / 时评 / 论说 / 议题讨论 / 个人观点)— 直接匹配内置 rubric
> b) **长文 essay**(公众号 / Substack / Medium)— 可借观点视频 rubric 起步,bump 时调权重
> c) **短文 / thread**(X / 微博 / 即刻)— 同上
> d) **播客 / 视频长内容**(YouTube 长片 / 播客)— 同上
> e) **教程 / 工具教学 / Builder**(教别人怎么用 X 工具 / 怎么做 Y 项目)— 同上
> f) **其他**(游戏 / 美食 / 妆教 / 新闻 / 剧情)— 工作流通用,但 rubric 维度需要调
> (ER / SR / HP 这套对你形态可能不太预测,需要自己拆出适合的维度)
> g) **混合**"
记录到 `content_form` + `rubric_form_mismatch`。
**Q1 → `content_form` enum 映射**(**必须存 enum 值,不是字母**):
| 用户答 | `content_form` 写入值 |
|---|---|
| a | `"opinion-video"` |
| b | `"long-essay"` |
| c | `"short-text"` |
| d | `"podcast"` |
| e | `"tutorial-builder"` |
| f | `"other"` |
| g | `"mixed"` |
`rubric_form_mismatch` 派生:
- 选 a → `false`
- 选 b/c/d/e/f/g → `true`,cheat-status 持续提示"你的形态可能需要 bump 调权重"
- **不再有"严重不匹配"档**——所有形态都能跑工作流,只是有的 rubric 需要更激进的 bump
**Q1.5: 典型时长**(仅 Q1=a/d/f 时问)
> "你的视频典型时长?
> a) 30秒-1分钟 b) 1-3分钟 c) 3-5分钟(推荐起步)
> d) 5-10分钟 e) 10分钟以上"
记录到 `typical_duration_seconds`(30 / 90 / 240 / 450 / 900)。
**Q1.6: 发布频率**
> "你打算多久发一篇?
> a) 日更 b) 隔日 c) 每周 d) 灵活 / 不固定(关闭 buffer 监控)"
记录到 `target_publish_cadence_days`(1 / 2 / 7 / null)。
**Q2: 你这个频道发过视频吗?**
> "a) 没发过 — 我会帮你从兴趣 + 热点 brainstorm 5 个候选 + 写 5 份初稿
> b) 发过 — 不管 1 条还是 100 条,我会帮你抓历史让后续 brainstorm 更贴合你做过什么"
如选 a → state 写 `calibration_samples: 0`,**Phase 3.5 跳过**,直接进入 Phase 4。
如选 b → 进入 **Q2.1**。
**Q2.1: 平台 + 抓取计划**(仅 Q2=b)
> "你内容主要在哪个平台?
> a) 抖音 — 装 douyin-session adapter(Playwright + 扫码登录抖音创作者中心)
> b) 小红书 — 装 xhs-explore adapter(Playwright + 扫码登录小红书创作者中心)
> c) YouTube — 装 youtube-data-api adapter(需 API key)
> d) B 站 — bilibili-stat adapter
> e) LinkedIn — 装 linkedin-session adapter(Playwright + 登录 LinkedIn,抓单帖分析)
> f) 微信视频号 — 装 wechat-channels adapter(Playwright + 扫码登录视频号助手,仅抓自己账号后台数据)
> g) 其他 / 多平台 — 走 manual paste 模式"
如选 a/b/c/d/e/f → 询问 Q2.2;如选 g → 跳到 Q2.3 manual。
**Q2.2: adapter 安装时机**(仅 Q2.1=a/b/c/d/e/f)
> "现在装 adapter 自动抓取,还是先手动告诉我?
> - 现在装 — 引导你装 Playwright + 扫码 → 抓回最近 N 条数据
> - 等下再装 — 先 manual 模式,state 标 'pending_adapter_setup',
> cheat-status 持续提示装"
如选"现在装"→ 走 adapter install 引导(详见各 adapter README)→ 验证抓取可用 → Q2.3。
如选"等下"→ 跳到 Q2.3 manual。
**Q2.3: 抓取范围 / 历史规模**
如 adapter 已装并验证可用:
> "我可以抓你最近多少条作为基础?
> (建议 10-25 条;样本越多 baseline 越准。最多到你账号实际数量)"
→ 用户给数字 N,Phase 3.5 抓取 N 条
如 manual 模式:
> "你大概发过多少条?给个范围就行(比如 '5-10 条' / '20+ 条'),
> 这只用来标 calibration_samples 估值,不用准确。"
→ 用户给一个估值,Phase 3.5 跳过抓取,calibration_samples 写估值
**Q3: 数据回收方式**
> "T+3 天复盘怎么拿数据?
>
> a) 手动粘 — 候补方案。**你必须粘 top 20+ 评论(带赞数)**,不是只粘播放数。
> 评论才是真信号——'她不一样'这种模因爆发只能从评论看出,
> 播放数永远告诉不了你什么内容真的击中了观众。
> b) **[推荐默认]** adapter 自动抓 — 评论 + 数据全要。
> 如果你现在没装 adapter,没关系,state 标 'pending_adapter_setup',
> 第一次 publish 之前装上就行(cheat-status 会持续提醒装)。
> 装的指引在 adapters/perf-data/<platform>/README.md。"
**Q3 → `data_collection` enum 映射**:
| 用户答 | `data_collection` 写入值 |
|---|---|
| a | `"manual"` |
| b(默认) | `"adapter"` |
默认推荐 b——除非用户明确说 "a 我就要手动"。
**Q4: 候选选题**
> "你现在有候选选题列表吗?(如有外部 markdown / Notion 维护的)
> a) 没有(默认)— 一会儿我帮你 brainstorm,或日常用 /cheat-trends 抓
> b) 有,markdown 列表
> c) 有,Notion / 其他"
**Q4 → `pool_status` enum 映射**:
| 用户答 | `pool_status` 写入值 |
|---|---|
| a(默认) | `"none"` |
| b | `"markdown"` |
| c | `"notion"` |
**Q5: 装几个 hook(默认装,不需要你决定)**
> "Q5:我顺便装几个 hook,回 'yes' 或 'enter' 就装:
>
> 1. **预测锁** — 我们一起做完预测后,文件被锁。你或我都不能改预测段。
> 复盘只能往同一文件下半段追加,不污染上半段判断。
> (没这个锁,事后看到数据想"修一下当时的预测"几乎是必然的——你或我都会犯)
>
> 2. **SessionStart 自动报告** — 每次开新会话顶部显示 buffer / 待复盘 / 候选 top
>
> 3. **静默使用日志** — 异步记录使用频率,不阻塞,给将来诊断用
>
> 三个一起装。**不装也可以**(回 'no')但你失去预测锁,校准价值会下降。
>
> 回 yes / no。"
**Q5 → `hooks_installed` 映射**:
| 用户答 | `hooks_installed` 写入值 |
|---|---|
| yes / enter / 默认 | `true`(bool,**不是字符串 `"yes"`**) |
| no | `false` |
默认 yes——除非用户明确说 no。
### Phase 2.5: 对标账号(**所有用户都问**,cold-start 强烈建议)
> 工具早期最重要的信号源是**对标账号**——你 init 完没数据,rubric 等权 v0 等于占星。
> 但如果你能找一个你想做成那样的账号,导入 5-10 条它的高 / 中 / 低样本,工具就有了 anchor。
询问:
```
🎯 对标账号
你能找一个对标账号吗?至少 3 条该账号的视频。
- 你**完全没发过历史**(Q2=a)→ **强烈建议**——rubric 没 anchor 全靠对标。
不找的话用通用 v0 等权 rubric,前 5 篇精度更差更久
- 你**已发历史**(Q2=b)→ **可选**——你也可以只用自己历史 calibrate;
但建议至少导 1 个对标做 sanity check(看你账号是否真的偏离对标方向)
a) 现在找 → 立刻进入 /cheat-learn-from(5-15 分钟,看你材料准备程度)
b) 等下找 → state 标 `benchmark_status: pending`,cheat-status 持续提醒
c) 不找 → state 标 `benchmark_status: none`,用通用 v0 起步
回 a / b / c。
```
行为:
- 选 a → Phase 3 创建脚手架完毕后,**自动 dispatch 到 /cheat-learn-from**(不让用户手动跑——已经在 init 流程里了)。完成后回 init Phase 4
- 选 b → state 标 `benchmark_status: pending` + `benchmark_name: null`
- 选 c → state 标 `benchmark_status: none`
记录到 `benchmark_status` / `benchmark_name`(如 a 选则在 cheat-learn-from 里写入)。
### Phase 3: 创建脚手架(逐项解释)
按顺序创建并**解释每一项的作用**:
0. **`.gitignore`(安全 — 必须第一步创建)**
```
"先创建 .gitignore,把账号凭证挡在版本控制外——这是第一件事。
.auth/ / .auth-xhs/ / .auth-linkedin/ / .auth-wechat-channels/ 存的是各平台登录态(等同账号密码),
.cheat-secrets.json 存 API key / cookie——一旦被 commit 或云同步就等于泄露账号。
注意:predictions/ videos/ scripts/ 这些**不**忽略——原则 #1/#3 依赖
git history 作为预测的不可变档案,必须入库。"
```
- 复制 `cheat-on-content/templates/gitignore.template` → `<user-repo>/.gitignore`
- 如 `<user-repo>/.gitignore` **已存在** → 不覆盖;逐行检查并**追加缺失行**,至少确保
`.auth/`、`.auth-xhs/`、`.auth-linkedin/`、`.auth-wechat-channels/`、`.cheat-secrets.json` 五行存在
- 即使用户项目当前**还不是 git 仓库**也照常创建——它会在用户 `git init` 的那一刻立即生效
- 创建后提醒一句:如果项目已经 `git init` 过且可能误加过 `.auth/`,让用户跑
`git rm -r --cached .auth .auth-xhs .auth-linkedin .auth-wechat-channels .cheat-secrets.json` 把已暂存的凭证移出
1. **`.cheat-state.json`**
```
"正在创建 .cheat-state.json — 各子 skill 共享上下文的地方。
这次 init 收集的所有答案都会写在这里。"
```
写入(**所有 `<...>` 占位必须查上面 Q 的映射表换成具体 enum 值,绝不直接存字母**):
```json
{
"schema_version": "1.4",
"skill_version": "1.0.0",
"rubric_version": "v0",
"content_form": "<查 Q1 映射表,写 enum 字符串如 \"opinion-video\">",
"typical_duration_seconds": <Q1.5 派生:30/90/240/450/900>,
"target_publish_cadence_days": <Q1.6 派生:1/2/7/null>,
"rubric_form_mismatch": <Q1=a→false;其他→true>,
"benchmark_status": "<Phase 2.5 派生:a→\"imported\"/b→\"pending\"/c→\"none\">",
"benchmark_name": <imported 则字符串名,否则 null>,
"benchmark_sample_count": <imported 则数字,否则 0>,
"baseline_plays": null,
"calibration_samples": <Q2=a→0;Q2=b→Phase 3.5 import 回填或 Q2.3 估值>,
"data_collection": "<查 Q3 映射表,写 \"manual\" 或 \"adapter\">",
"pool_status": "<查 Q4 映射表,写 \"none\"/\"markdown\"/\"notion\">",
"data_layer": "markdown",
"hooks_installed": <查 Q5 映射表,写 bool true/false>,
"enabled_trend_sources": ["manual-paste"],
"enabled_perf_adapters": <Q2.1=a→[\"douyin-session\"];b→[\"xhs-explore\"];c→[\"youtube-data-api\"];d→[\"bilibili-stat\"];e→[\"linkedin-session\"];f→[\"wechat-channels\"];其他→[]>,
"last_bump_at": null,
"last_bump_self_audited": false,
"last_published_at": null,
"last_published_file": null,
"last_retro_at": null,
"last_trends_run_at": null,
"last_trends_added_count": 0,
"last_prediction_self_scored": false,
"last_self_scored_at": null,
"consecutive_directional_errors": [],
"pending_retros": [],
"shoots": [],
"in_progress_session": null,
"initialized_at": "<本地 ISO 8601 含时区,如 \"2026-05-05T20:11:13+08:00\",**不要用 UTC 的 Z 后缀**>"
}
```
2. **`rubric_notes.md`**
```
"正在创建 rubric_notes.md — 你的评分维度的真实来源。
用的是 v0 占位 rubric——等权 7 维(每个维度同等重要)。
为什么叫 v0:v0 是没校准前的占位。你的账号自己的真权重要从你
的数据反推,不是预设。跑完 5 篇有数据的内容后,会自动提议
升级到「校准 v1」(你的第一个真正校准过的 rubric)。
⚠️ rubric_notes.md 是 blind sub-agent (channel B) 的白名单文件——
只能含通用语言(公式 / 维度定义 / bucket 边界),不能含真实视频名 / 实绩。
每次 bump 升级时的 Memo(含证据数据 + 派生证据)写到 rubric-memo.md(下一步创建)。"
```
- 复制 `cheat-on-content/starter-rubrics/<form>-zero.md`(cold-start)或 `<form>.md`(已有数据时仍可参考)
2.5. **`rubric-memo.md`**(**新**——配合 cheat-score-blind 隔离协议)
```
"正在创建 rubric-memo.md — bump 升级 Memo 累积档案。
这是 cheat-bump Phase 5 写入 Memo 全文(含真实视频名 + 实绩 + 派生证据)的位置。
为什么单独一个文件:blind sub-agent 的白名单是 rubric_notes.md,
历史上 bump Memo 写进 rubric_notes.md 会让 blind sub-agent 通过白名单
拿到本该看不到的实绩数据——本文件是隔离修复,sub-agent 硬禁读本文件。
现在是空的,等第一次 cheat-bump 升级后 append 第一段 Memo。"
```
- 复制 `cheat-on-content/templates/rubric-memo.template.md` → `<user-repo>/rubric-memo.md`
3. **`script_patterns.md`**
```
"正在创建 script_patterns.md — 你的写作 pattern 沉淀(与 rubric 解耦)。
rubric_notes.md 教 Claude 怎么打分;
script_patterns.md 教 Claude 怎么写。"
```
- 复制 `cheat-on-content/templates/script_patterns.template.md`
4. **四个目录**:`scripts/` + `predictions/` + `videos/` + `samples/`(都加 `.gitkeep`)
```
"正在创建四个目录:
scripts/ — 拍前的草稿(cheat-seed 写或你写)
predictions/ — immutable 预测日志(hook 保护)
videos/ — 拍后的工作目录(cheat-shoot 创建子目录)
samples/ — 对标账号视频 / 转录(cheat-learn-from 创建子目录)
前三处用同一组 <date>_<id>_<short> 命名相互关联。
samples/ 按对标账号名分组:samples/<账号名>/<video-id>/。"
```
4.5. **`benchmark.md`**(仅 Phase 2.5 选 a/b 时)
```
"正在复制 benchmark.md 占位模板(实际内容由 cheat-learn-from 填)——
这是你的对标账号的中央 reference。
View on GitHub