com um clique
cheat-shoot
// 登记一条视频已拍摄。**建 video folder + 询问实际拍摄稿是否与 scripts/<id>.md 一致 + buffer +1**。与 cheat-publish 配对:拍了进队列,发了出队列。触发词:"拍了"/"拍了 X"/"shot"/"shot it"/"已拍 X"/"录完了"。
// 登记一条视频已拍摄。**建 video folder + 询问实际拍摄稿是否与 scripts/<id>.md 一致 + buffer +1**。与 cheat-publish 配对:拍了进队列,发了出队列。触发词:"拍了"/"拍了 X"/"shot"/"shot it"/"已拍 X"/"录完了"。
给所有想把"感觉"变成可校准预测的内容创作者。**方法论通用**——打分 → 盲预测 → T+3d 复盘 → 进化 rubric 的循环适用任何能被量化(播放 / 阅读 / 收听 / 点击)的内容。**rubric 是循环的内容,不是循环本身**——当前内置一份观点视频 rubric(参考博主 25+ 视频拟合),其他形态可借这套起步并 bump 调权重。**强烈建议导入对标账号**作为初始信号源(/cheat-learn-from)。触发词:"初始化"/"打分这篇"/"启动预测"/"已发布"/"复盘"/"升级 rubric"/"推荐选题"/"抓热点"/"状态"/"找对标"/"learn from"。**首次使用必须先跑 /cheat-init。**
cheat-on-content 的首次 onboarding 与脚手架创建器。统一流程——所有用户都走相同 5 阶段闭环,唯一区别是"发过视频的人"会在 init 时多一步:抓取已有视频建立历史 context(用于后续 cheat-seed 给更贴合的选题、更准的 baseline)。触发词:"初始化"/"init"/"首次使用"/"我是新用户"/"setup cheat-on-content"。**必须在用户第一次会话执行;其他子 skill 在 .cheat-state.json 不存在时自动路由到此。**
T+N 天数据回收 + 复盘 + 把新观察写入 rubric_notes.md。这是校准循环的反馈环节——不复盘的预测等于占星。触发词:"复盘 [path]"/"retro this"/"T+3d 数据来了"/"抓数据 [path]"/"把这篇复盘了"。
从复盘评论数据派生 / 刷新账号的受众画像,写入 audience.md。这是和 rubric 平行的第二个派生物——rubric 答"怎么打分",persona 答"谁在看"。cheat-seed 选题 / 写稿时读它。**audience.md 含实绩信号,cheat-score-blind 硬禁读**。触发词:"构造受众画像"/"更新 persona"/"我的观众是谁"/"build persona"/"刷新受众画像"/"看看我的受众画像"。
INTERNAL sub-agent for blind 9-dim rubric scoring. **NOT a user-facing skill — do NOT invoke from main conversation.** Called via Task tool by cheat-score / cheat-predict / cheat-bump to get a context-isolated score on a script. Receives ONLY script_path + rubric_notes_path; refuses any other input. Outputs strict JSON: 9 dimensions × {score 0-5, confidence enum, one-line reason}. **Hard refuses to Read** .cheat-state.json, predictions/*, retro 段, or anything that could leak post-publish data. This is channel B in the 3-channel calibration model (A=main, B=blind sub, C=cross-model).
跟用户对话讨论选题——**默认一次一个**,用户主动给主题或经历,AI 围绕用户的输入深挖、提炼角度、写一份 draft。不是 AI 拿三个开放问题追用户,也不是一次给 5 个候选。触发词:"找选题"/"我想做一条 X"/"最近有个想法"/"seed"/"启动种子"。可选 batch 模式:`/cheat-seed --batch 5` 走旧的 brainstorm 5 候选 + 写 5 draft 流程。
| name | cheat-shoot |
| description | 登记一条视频已拍摄。**建 video folder + 询问实际拍摄稿是否与 scripts/<id>.md 一致 + buffer +1**。与 cheat-publish 配对:拍了进队列,发了出队列。触发词:"拍了"/"拍了 X"/"shot"/"shot it"/"已拍 X"/"录完了"。 |
| argument-hint | <scripts-path-or-id> |
| allowed-tools | Bash(*), Read, Write, Edit, Glob |
把视频从"已写预测、未拍摄"状态推进到"已拍摄、未发布"状态。这一步:
videos/<同 id>/ 目录(之前没有的话)scripts/<id>.md 一致吗?"/cheat-predict — mode: v2 在原 prediction 文件 append ## 预测 v2 段cheat-shoot 自己不写预测内容——所有预测落盘逻辑在 cheat-predict。cheat-shoot 只负责检测改稿 + 派发。
为什么单独一个 skill:
[用户:拍了 scripts/2026-05-04_abc123_停止期待.md]
↓
[Phase 0: 解析路径 + 验证 prediction 已存在]
↓
[Phase 1: 检查是否已登记(避免重复)]
↓
[Phase 2: 建 videos/<id>/ + 询问"实际拍摄稿一致吗?"]
↓
[Phase 3: 写 videos/<id>/script.md]
↓
[Phase 4: append state.shoots]
↓
[Phase 5: 输出 buffer 状态]
tools/diff_pct.py 调用:先 normalize(去 markdown header / 分隔线 / 列表标记 / 装饰标点 / 折叠所有空白),再算 char-level Levenshtein / max(len_a, len_b)。preferred backend rapidfuzz,fallback difflib.SequenceMatcher(stdlib,永远可用)。旧版 line-level 在口语化转录场景误报严重(draft 长 markdown 句 vs whisper 转录的短断句,内容几乎不变但 line-level 算出 ~200% diff)—— PR #14 修复diff -u | grep '^[+-]' | wc -l 算法| 必填 | 来源 |
|---|---|
<scripts-path-or-id> | 用户参数;缺失则询问 |
.cheat-state.json | 状态文件 |
scripts/*.md | pre-shoot 草稿 |
predictions/*.md | 验证对应预测存在 |
scripts/2026-05-04_abc123_停止期待.md2026-05-04_abc123_停止期待abc123 → glob scripts/*_abc123_*.md 找匹配scripts/<id>.md 存在:不存在 → 报错"找不到 pre-shoot 草稿"predictions/<同名>.md:
读 .cheat-state.json,检查 shoots[] 是否已含此 id:
videos/<id>_<short>/(同 scripts/ + predictions/ 的命名)拍 「<title>」 的时候,你实际用的稿子和 scripts/<id>.md 一致吗?
a) 一致——按草稿拍的
b) 改了一些——你能给我看下实际拍摄稿吗?我重新打分一次(v2 预测)
c) 大改了,基本是另一条 → 走 _redo 流程:
scripts/<id>_redo.md → 重新 cheat-predict → 再 cheat-shoot(原 prediction 留档脱钩)
a 路径(一致):
cp scripts/<id>.md → videos/<id>/script.mdscript_consistency = consistentb 路径(改了):
询问用户实际拍摄稿——粘贴文本 / 文件路径 / 转录文件
若用户提供 → 写入 videos/<id>/script.md
若用户没保留(即兴)→ 标 script_lost,写占位文件 + 警告"v2 重判跳过——下次建议留稿(哪怕 voice memo 转录)",进 Phase 4
提供了的话:算 diff
# 解析 cheat-on-content 源码根(cheat-shoot 是 symlink 装的)
SKILL_REAL="$(readlink -f ~/.claude/skills/cheat-shoot 2>/dev/null || readlink ~/.claude/skills/cheat-shoot 2>/dev/null)"
if [[ -n "$SKILL_REAL" ]]; then
REPO_ROOT="$(cd "$SKILL_REAL/../.." && pwd)"
DIFF_TOOL="$REPO_ROOT/tools/diff_pct.py"
fi
if [[ -n "${DIFF_TOOL:-}" && -f "$DIFF_TOOL" ]] && command -v python3 >/dev/null 2>&1; then
# 默认 char-level Levenshtein on normalized text(rapidfuzz preferred, difflib fallback)
diff_pct=$(python3 "$DIFF_TOOL" "scripts/<id>.md" "videos/<id>/script.md")
else
# legacy line-level fallback——只在 python3 或 diff_pct.py 都不可用时用
added=$(diff -u scripts/<id>.md videos/<id>/script.md | grep -c '^+')
removed=$(diff -u scripts/<id>.md videos/<id>/script.md | grep -c '^-')
total_orig=$(wc -l < scripts/<id>.md)
diff_pct=$(( (added + removed) * 100 / total_orig ))
echo "⚠️ fallback 到 line-level diff——口语化转录会 inflate diff_pct,可能误触发 v2"
fi
为什么 normalize + char-level:line-level diff 在创作者真实场景(draft 是 markdown 长句、拍摄稿是 whisper 转录的口语化短行)算出 ~200% 差异但内容几乎不变。char-level Levenshtein 在 normalize 后稳定反映内容差异,而非格式差异。详见 tools/diff_pct.py + tools/diff_pct_test.sh(3 fixture 在两个 backend 上全过)。
判定 v2 触发:
diff_pct >= 30 → 默认建议 v2 重判,主动调用 /cheat-predict — mode: v2 — prediction-file: predictions/<id>.md 传 videos/<id>/script.md 作 input。cheat-predict 走 v2 模式 append ## 预测 v2diff_pct < 30 → 询问用户:"只改了 N% 的内容,要重判吗?默认不(v1 预测仍有效)"。用户说要 → 同上调用;用户说不 → 跳过 v2,继续 Phase 4cheat-predict 完成 v2 落盘后,控制权回到 cheat-shoot 进 Phase 4
c 路径(大改):
videos/<id>/script.md,提示走 _redo 流程{
"shoots": [
...,
{
"video_folder": "videos/2026-05-04_abc123_停止期待/",
"prediction_file": "predictions/2026-05-04_abc123_停止期待.md",
"scripts_path": "scripts/2026-05-04_abc123_停止期待.md",
"shot_at": "<ISO timestamp>",
"script_consistency": "consistent" | "modified" | "lost",
"script_diff_pct": <0-100 int 或 null>,
"v2_prediction_written": <true/false>,
"script_hash_at_shoot": "<sha256:12 of videos/<id>/script.md>"
}
]
}
v2_prediction_written: true 表示 prediction 文件里现在有 ## 预测 v2 段,cheat-retro 应读 v2 算偏差;false 表示沿用 v1。
读完 state 后立即算 buffer + 颜色(按 cadence-protocol.md 的派生规则):
✅ 已登记拍摄:videos/2026-05-04_abc123_停止期待/
预测文件:predictions/2026-05-04_abc123_停止期待.md
📦 当前 buffer:3 篇(🟢 绿色,正常)
按你的 cadence(隔日更)= 6 天 buffer,节奏稳定。
下一步:拍其他候选 / 等下个发布日 / 不动
如果 buffer 颜色变了(如从绿到蓝)→ 高亮提醒:
📦 当前 buffer:6 篇(🔵 蓝色,**积压**)
⚠️ 建议暂停拍摄,全力发布存货 + 复盘。
按你的 cadence(日更)= 6 天预备,已超过健康上限。
ad_hoc: true/cheat-predict 写完 prediction → 用户拍摄 → /cheat-shoot 登记/cheat-publish 发布时把对应项从 state.shoots 移除/cheat-status 看板的 buffer 数字直接来自 state.shoots.length/cheat-recommend 看 buffer 颜色调推荐策略{
"shoots": [
{
"video_folder": "videos/2026-05-04_abc123_停止期待/",
"prediction_file": "predictions/2026-05-04_abc123_停止期待.md",
"shot_at": "2026-05-04T18:30:00+08:00",
"ad_hoc": false // true if user shot without going through full flow
}
]
}
按 shot_at 升序——最早拍的在前面。/cheat-status 显示最早一项的 days-since-shoot 警告(避免有视频拍了 30 天没发)。