# Cheat Shoot

登记一条视频已拍摄。**建 video folder + 询问实际拍摄稿是否与 scripts/<id>.md 一致 + buffer +1**。与...

- Repository: https://github.com/XBuilderLAB/cheat-on-content (7435 stars)
- Category: Media
- License: MIT
- Last updated: 2026-10-26
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add XBuilderLAB/cheat-on-content --skill cheat-shoot -g -a claude-code -y`
Codex: `npx skills add XBuilderLAB/cheat-on-content --skill cheat-shoot -g -a codex -y`
Cursor: `npx skills add XBuilderLAB/cheat-on-content --skill cheat-shoot -g -a cursor -y`
Gemini CLI: `npx skills add XBuilderLAB/cheat-on-content --skill cheat-shoot -g -a gemini-cli -y`

## Description

登记一条视频已拍摄。**建 video folder + 询问实际拍摄稿是否与 scripts/<id>.md 一致 + buffer +1**。与 cheat-publish 配对：拍了进队列，发了出队列。触发词："拍了"/"拍了 X"/"shot"/"shot it"/"已拍 X"/"录完了"。

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# /cheat-shoot, 登记拍摄完成 + 建 video folder + (改稿则) 触发 v2 预测

把视频从"已写预测、未拍摄"状态推进到"已拍摄、未发布"状态。这一步：
1. **建 `videos/<同 id>/`** 目录（之前没有的话）
2. **询问用户**："实际拍摄时用的稿子和 `scripts/<id>.md` 一致吗？"
3. 算 diff, , 超过 V2_TRIGGER_THRESHOLD (默认 30%) → **delegate 到 `/cheat-predict, mode: v2`** 在原 prediction 文件 append `## 预测 v2` 段
4. 把 video folder 加进 state.shoots 队列，buffer +1

cheat-shoot 自己**不**写预测内容, , 所有预测落盘逻辑在 cheat-predict。cheat-shoot 只负责检测改稿 + 派发。

为什么单独一个 skill：
- buffer 警戒系统需要明确区分"拍了" vs "发了"。视频可以批量拍（一天拍 5 条），分散发（每天发 1 条）
- "实际拍摄稿" ≠ "pre-shoot 草稿"是常态。这一步是把 diff 显式化、触发 v2 重判、采集"用户改稿 pattern"信号的入口
- v2 预测 vs v1 预测的差异本身就是 rubric 升级证据, , 比如 v1 给 ER=4，v2 给 ER=5（用户改稿改高了 hook 强度），就告诉 rubric "这个用户的 ER 阈值跟我现在公式不一致"

## Overview

```
[用户：拍了 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 状态]
```

## Constants

- **REQUIRE_PREDICTION = true**, 拍前必须先有 v1 prediction 文件
- **V2_TRIGGER_THRESHOLD = 0.30**, normalize 后 char-level diff 超过 30% → 默认建议 v2 重判；低于 30% 询问用户是否仍要 v2
- **DIFF_METRIC = char_levenshtein_normalized**（**默认**）, , 通过 [`tools/diff_pct.py`](../../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_METRIC=lines**, , legacy fallback：当 python3 完全不可用或 tools/diff_pct.py 找不到时降级到 `diff -u | grep '^[+-]' | wc -l` 算法

## Inputs

| 必填 | 来源 |
|---|---|
| `<scripts-path-or-id>` | 用户参数；缺失则询问 |
| `.cheat-state.json` | 状态文件 |
| `scripts/*.md` | pre-shoot 草稿 |
| `predictions/*.md` | 验证对应预测存在 |

## Workflow

### Phase 0：解析 + 验证

The rest: https://github.com/XBuilderLAB/cheat-on-content/blob/HEAD/skills/cheat-shoot/SKILL.md
