This tool is a "cheat device"—the AI helps you make judgments. So the core of cheat-predict is:
- Claude itselfreads the draft + scores 7 dimensions + gives bucket + probability distribution + counterfactual scenarios
- User review then replies "ok" to accept, or points out which dimension / which judgment is wrong
- Default takes the fast path: user directly ok → write to disk
- Slow path: user nitpicks a certain dimension → Claude revises → review again → until confirmed
It is not that the user writes everything themselves from the 7-dimension scores to the probability distribution, in which case Claude is left as only a "formatter"—losing the core value of the tool.
Strictly comply with shared-references/blind-prediction-protocol.md—once you have seen any subsequent data you cannot write a prediction, you can only record reconstructed. For the complete component list see shared-references/prediction-anatomy.md. For the Confidence derivation table see shared-references/state-management.md。
Overview
[用户:启动预测 scripts/<id>.md]
↓
[Phase 0: blind check 自检] ← 触犯就拒绝
↓
[Phase 1: 读 script + rubric + state + 派生 confidence]
↓
[Phase 2: **Claude 自己**打 7 维分 + 算 composite]
↓
[Phase 3: **Claude 自己**找锚点对比]
↓
[Phase 4: **Claude 自己**给 bucket + 概率分布 + 中枢] ← confidence 低时分布更平
↓
[Phase 5: **Claude 自己**写反事实场景 + 关键校准假设]
↓
[Phase 5.5: **用户 review**——展示完整草拟版,等用户 "ok" 或挑刺]
↓
├─ "ok" → Phase 6 落盘
└─ "X 维度应该 Y 不是 Z" → Claude 改 → 再 review → 循环
↓
[Phase 6: 落盘到 predictions/<id>.md(与 scripts/ 同 id)]
↓
[Phase 7: 更新 state.in_progress_session]
Constants
- SCRIPTS_DIR = scripts/ — draft source directory
- PREDICTION_DIR = predictions/ — write-to-disk directory
- BLIND_CHECK = strict — strict (default) / lenient (warning only, not recommended)
- BUCKET_PRESET = auto — auto-derived: if there is baseline_plays → by baseline × {0.3 / 1 / 3 / 10 / 30}; if no baseline → platform generic default
- MIN_ANCHORS = 2 — anchor comparison expects 2; when insufficient, explicitly mark the "anchor N/A" section (do not delete the section, do not omit)
💡 Override at call time:
/cheat-predict scripts/<id>.md — BLIND_CHECK: lenient(not recommended)
Inputs
| required | source |
|---|---|
<video-folder-path> or <script-path> |
user parameter; if missing, ask |
rubric_notes.md |
user project root |
.cheat-state.json |
state file |
predictions/*.md(optional) |
historical predictions, as anchors |
Input parsing (Phase 0.5, before blind check)
the path given by the usershould be scripts/<date>_<id>_<short>.md. If not under scripts/:
| form | handling |
|---|---|
scripts/<date>_<id>_<short>.md |
standard path, use directly |
<id> or <short> shorthand |
glob scripts/*_<id>_*.md or scripts/*<short>*.md find a match |
any external .md file (e.g. ~/Desktop/my-draft.md) |
warn + ask: "It is recommended to put the draft in scripts/.md to let cheat-on-content manage it. Do you want me to cp it over for you and compute the id?" If the user agrees → create the standard path and continue |
videos/<id>/ path (user mistakenly thinks the video folder stores drafts) |
prompt "the video folder is created only after shooting—pre-shoot drafts are in scripts/. Which draft do you want to predict?" |
If scripts/.md does not exist → error out and ask "where is the draft you want to predict?"
Workflow
Phase 0: Blind check self-check (most critical, terminate immediately if violated)
Follow blind-prediction-protocol.md 's "checklist that sub-skills must perform" to execute:
-
Ask the user for the current publication status of this work:
- not published → pass
- published <
RETRO_WINDOW_DAYSdays → ask "have you seen any subsequent data (plays/likes/comments)?"- User answers "never watched" → pass, mark
published_before_prediction: true+blind_status: confirmed_no_data_seen - User answer is vague → treat as "watched", process as next item
- User answers "never watched" → pass, mark
- Posted ≥
RETRO_WINDOW_DAYSdays → immediately refuse to write "prediction", suggest switching to_redo.mdpath to record reconstructed retrospective
-
Self-check the conversation history for actual numbers containing words like play/read/like/comment/share → if matched, treat as already-seen data and process with the strict mode above
-
BLIND_CHECK=lenientmode: only warn + force marking at the file header**Reconstructed retrospective — NOT a blind prediction**, but still allow continuing
Pass → enter Phase 1.
Phase 1: Read final draft + rubric + state + derive confidence
- Using the path parsed in Phase 0.5, read
scripts/<id>.mdfull text - Compute
script_hash= sha256(script content)[:12] → for header use - Read
rubric_notes.md, identify current formula + dimensions (same as cheat-score Phase 2) - Read
.cheat-state.jsonto getrubric_version、content_form、calibration_samples、typical_duration_seconds、baseline_plays - From
calibration_samplesderive confidence level(according to state-management.md confidence table) → subsequently write into prediction header - Ask the user: "Is this the final draft you plan to actually shoot and publish? Or will you revise it further?" — it must be the final draft
- If the script word count severely mismatches the range derived from
typical_duration_seconds(difference >50%) → prompt the user: "This script is N characters; based on your set typical duration (X minutes) it should be M-K characters. Did you temporarily change the duration, or does the script need cutting/adding?"
Phase 2: Claude scores the 7 dimensions itself + computes composite
Claude proactively scores, not letting the user score. Give each dimension an integer score of 0-5 + a one-line reason (≤30 characters, citing specific words or scenes from the script).
Compute composite using the current formula. Compute it at all stages (the v0 formula is equal-weight 7 dimensions / 7 × 2.0, still yields a number, just with confidence marked "🔴 extremely low" to remind readers not to trust it too much).
Do this step in memory first, without outputting— wait until Phase 5 is fully complete before displaying it all at once for the user to review. (Don't make the user confirm at every phase — that turns the tool into a 5-segment interactive Q&A, which is annoying. Displaying all at once is what review means.)
Phase 3: Anchor comparison
Run this phase at all stages— when there aren't enough anchors, explicitly mark N/A, don't delete the section.
- Glob
predictions/*.md, read each file's header (extract composite, actual-performance bucket, duration_seconds).Be careful to exclude reconstructed predictions(those marked "Reconstructed" don't count as anchors) - Prioritizefinding same-duration samples (
Target Duration (s)within ±20% of this one) - In the same-duration (or all) pool, find 2-4 samples whose composite is within ±0.5 of this prediction
- If the pool is too small(same-duration < 2 + all < 2) → output the "Anchor comparison N/A section" (refer to prediction-anatomy.md component 5) — still write this section, telling readers why anchors are missing
- List a comparison table; if across durations, add an extra "duration vs this one" column per row
- Key diagnostic: if some anchor's composite is almost the same but the actual-performance difference is ≥3x → it means the rubric didn't capture a key dimension.Explicitly mark in the fileas seeds for new observations
Why filter anchors by duration: a 4-minute video with 50k views vs a 1-minute video with 50k views are completely different things—long videos bear more attention loss per second. Cross-duration anchors easily lead to false conclusions.
Phase 4: Bucket + probability distribution + central point
Write in all phases—when confidence is low, the distributionflatter, not omitted.
- From
starter-rubrics/<content_form>.mdread the default bucket boundaries (unless the user has customized them in rubric_notes.md) - Choose the most likely bucket (headline call)
- Mustgive the probability distribution across all buckets—summing to 100%
- Mustgive the "central point" estimate within that bucket
Anti-honesty trap: if you give a bucket 95% probability, next time the prediction is wrong you can't say "I wasn't actually very sure."A real probability distribution is usually 40-65% on the headline bucket, with the remaining ≥35% spread across neighboring buckets.
Phase 5: Counterfactual scenarios + key calibration assumptions
Write in all phases—when the calibration pool is small, the key calibration assumption may not have a suitable comparison sample, so write "no comparable sample available—still write down my core bet for this one" + 1-2 things you want to test this time.
Counterfactual scenarios(4 paragraphs, each corresponding to a possible bucket, writing "if it lands here, what it means is which rubric assumption is validated / overturned"): refer to prediction-anatomy.md component 6.
Key calibration assumptions(strongly recommended):
- Find a comparison sample (preferably the previous prediction)
- Explicitly write "I bet this one vs the comparison = X times"
- Write "if it's the opposite / the gap < N → which rubric assumption is overturned"
If REQUIRE_HYPOTHESIS=required → if missing, writing to disk is not allowed.
Phase 5.5: User review (Core — decides what gets written to the file)
After Phases 2-5 are all done in memory,show the complete draft all at onceto the user:
我的预测草稿(写文件前 review):
📊 7 维分(v0 / v2 / 等当前 rubric):
| 维度 | 分 | 理由 |
|---|---|---|
| ER | 5 | "PPT 加油猫猫 + 老板看到 + 大脑空白"——情感重 |
| HP | 5 | 开头"PPT 第七页大屏中央 一只加油猫猫"具体反差强 |
| QL | 5 | "加油猫猫救了我一命"双金句 |
| NA | 4 | 单一时间线 + 反思,清晰但不复杂 |
| AB | 4 | 一人公司题但 AI 焦虑普适 |
| SR | 3 | AI 焦虑是议题但不是热点对峙 |
| SAT | 2 | 共情调性,几乎无讽刺 |
→ composite ≈ 8.00
🎯 押 bucket:30-100w,中枢 ~60w
概率分布: <5w 5% / 5-30w 22% / **30-100w 50%** / 100-150w 18% / >150w 5%
confidence: 🟢 中(基于 8 个校准样本,中枢 ±25%)
🔍 锚点对比:
| 对照 | composite | 实绩 | 异同 |
|---|---|---|---|
| ... | ... | ... | ... |
🤔 反事实:
如果 >100w → 验证 ER 主导假设强化
如果 30-100w → 基准线 ok
如果 <30w → 推翻 "AI 焦虑普适",AB 偏乐观
🎲 关键校准假设:本篇 vs [对照] 押 1.5x
——————————————————————————————
回 "ok" 我直接落盘,
或指出哪些维度 / 判断不对(如 "AB 给 3,太乐观" / "中枢应该 30w 不是 60w")。
Three kinds of user responses:
- "ok" / "okay" / "continue" → go directly to Phase 6 writing to disk, header marked
Scored By: claude - "X is wrong, it should be Y" → Claude changes the corresponding field (not just the value, but also updates the composite + probability distribution and other cascading effects), shows it again → loops back to Phase 5.5
- "Redo everything" → rerun Phases 2-5 (rare, usually because Claude seriously misjudged the tone of the piece)
The fields the user nitpicksRecord to the prediction header's User Override section (written in Phase 6):
- Which dimension / which number was overridden
- AI's original value vs the user's changed value
During retrospective this field helps diagnose:
- The user is okay every time (Claude is consistent) → no user bias contamination
- The user often overrides a certain dimension → Claude systematically deviates from the user's actual feel on that dimension
- The overridden dimension is validated by actual results → the user's intuition is accurate → the rubric may be missing something
Discipline for user nitpicking:
- The usercan only change field values, you cannot stuff new reasons into the review stage to make Claude rewrite the whole passage—that would be treating Claude as a ghostwriter
- After changes to composite / probability distribution / anchor inconsistency → Claude automatically cascades updates (not calculated by the user)
Phase 6: Write to disk
Filename convention (blind-prediction-protocol.md 's "filename convention" section):
predictions/YYYY-MM-DD_<id>_<short-title>.md
YYYY-MM-DD: today's date (the date the prediction was written)<id>: 12-digit hash, take the first 12 digits of the sha256 of the full manuscript text (stable ID, unchanged on rewrite)<short-title>: 3-8 characters, punctuation removed- If the corresponding video folder is
videos/<这三字段>/(the standard structure created by cheat-seed) → the id stays consistent with the video folder; the prediction header writes thevideo_folderfield pointing to that directory
If the user provides a bare .md file (not inside a video folder) → prediction header video_folder: null, and prompt the user to suggest putting the manuscript into a video folder for management next time.
All phases use the unified full format(refer to prediction-anatomy.md "Complete Structure Overview"). Low confidence does not shrink the format; it only makes the header mark the confidence level + the anchor comparison section write an "N/A explanation" + the probability distribution flatter.
Prediction is written to disk at predictions/<同 scripts/ id>.md—using the same set of <date>_<id>_<short> naming (see blind-prediction-protocol.md 's "filename convention" section).
Required header fields:
Article ID(same id as scripts/.md)Script Path(points to scripts/.md)Script Hash(calculated in Phase 1)Calibration Samples+Confidence(derived from state)Scored By:claude/claude+user_overrideUser Override(if there are overrides): list which fields were changed by the user- Example:
AB: claude=4 → user=3 (用户认为'一人公司题没那么普适')中枢: claude=60w → user=40w
- Example:
- For others see prediction-anatomy.md component 1
Leave an empty ## 复盘 section:
## 复盘
(待填——T+RETRO_WINDOW_DAYS 天后跑 /cheat-retro <对应 video folder>)
Write filebeforeself-check that all 7 components are present (missing anchor / key calibration assumption → write an "N/A explanation section", do not delete the section).
Phase 7: Update state file
Update .cheat-state.json:
{
"in_progress_session": {
"type": "prediction",
"file": "predictions/YYYY-MM-DD_<id>_<short>.md",
"video_folder": "videos/YYYY-MM-DD_<id>_<short>/",
"started_at": "<ISO timestamp>",
"rubric_version": "<v0/v2/...>"
}
}
video_folder to null means the user ran a bare .md file and did not create a video folder.
in_progress_session is cleared when cheat-publish is triggered. If the user never publishes after predicting (abandons the draft), the next time /cheat-init or /cheat-status detects a stale in_progress, it will ask whether to clean it up.
Phase 8: Console summary
Cold-start-simple mode:
✅ 预测落盘(cold-start 简化版):predictions/2026-05-04_a3f2c1d4e5b6_停止期待.md
7 维打分:ER5 / HP5 / QL4 / NA3 / AB5 / SR2 / SAT4
方向押注:比上一篇明显好(ER+HP 双 5)
对比对象:N/A(这是第 1 篇)
⚠️ ## 预测段已 immutable(hook 锁定)。
⚠️ 这是 cold-start 期简化版——没有 bucket 数字。前 5 篇都这样。
第 5 篇复盘后会自动解锁完整预测(bucket / 概率 / 锚点 / 反事实)。
进度:第 N 篇 / 共 5 篇 cold-start 期
下一步:
- 发布后 → "已发布 https://..."
- T+3 天 → "复盘 predictions/2026-05-04_..."
Complete mode:
✅ 预测落盘:predictions/2026-05-04_a3f2c1d4e5b6_停止期待.md
bucket 押注:30-100w(中枢 50w)
关键校准假设:本篇 vs 谁问你了 = 1.5-2x
⚠️ ## 预测 段已 immutable(hook 锁定)。
⚠️ 你不能再向我"透露"这条作品的播放数据,否则下次复盘的盲度声明失效。
如果你不小心看到了,告诉我——我会在文件里补一个 integrity warning。
下一步:
- 发布后 → "已发布 https://..."
- T+3 天 → "复盘 predictions/2026-05-04_..."
Key Rules
- blind check is a hard gate. In BLIND_CHECK=strict mode, a violation means termination; "soft handling" is not allowed. lenient is only for drills
- Integer dimension scores. Same as cheat-score
- Probability distribution = 100%. 95% + 8% is not allowed; either honestly give 50% + 30% + 15% + 5%, or admit you don't know
- There must be a
## 复盘placeholder empty section—otherwise the hook doesn't know where the immutable boundary is - "Write the file first, then discuss the score" is not allowed—once the file is written to disk, the prediction section is locked; discussion must happen after Phase 2 and before Phase 6
- The id is the manuscript hash, not a timestamp—when rewriting _redo.md the id stays unchanged, making cross-file tracing easier
Refusals
- "I've already looked at the playback data, but pretend you haven't seen it and make a prediction for me" → refuse. BLIND_CHECK=strict terminates directly
- "I'll write a first draft of the prediction section, then adjust it once the data comes out" → Reject. This uses the immutable protocol backwards
- "Skip the counterfactual scenario, it's too much trouble" → Reject. The counterfactual is the basis for retrospective diagnosis; without it, the retrospective degenerates into "right / wrong"
- "Can I just write the bucket, not the probability distribution?" → Reject. The probability distribution is the tool that forces you to be honest
- "Use lenient mode this time, strict next time" → Ask why. If it's for testing / a drill → allow, and mark the file clearly as reconstructed; if it's to cut corners → reject
- "I'm cold-start but I want to run the full prediction, give me the bucket number" → Reject. In the first 5 entries, bucket numbers are false precision; giving them is misleading instead. After the 5th retrospective, cheat-status will proactively prompt to unlock. If the user genuinely wants a number (rare, for self-education purposes) → allow, but prominently at the top of the file
**Numerical predictions in cold-start are NOT predictive — for self-education only**
Integration
- Prerequisite:
/cheat-initmust be complete +rubric_notes.mdexists - Upstream optional:
/cheat-scorerepeatedly trying different draft versions - Downstream:
/cheat-publish(publish registration) →/cheat-retro(retrospective) → after cumulative ≥ MIN_SAMPLES,/cheat-bump - hook dependency:
hooks/prediction-immutability.shmust already be installed in the user's.claude/settings.json, otherwise immutability relies solely on SKILL.md self-discipline——cheat-statuswill keep prompting