SuperAPI AI Directory

cheat-predict

Writing & research

View repository

Updated 10-16 08:38

About this skill

/cheat-predict — AI-led blind prediction + user review

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:

  1. Ask the user for the current publication status of this work:

    • not published → pass
    • published < RETRO_WINDOW_DAYS days → 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
    • Posted ≥ RETRO_WINDOW_DAYS days → immediately refuse to write "prediction", suggest switching to _redo.md path to record reconstructed retrospective
  2. 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

  3. BLIND_CHECK=lenient mode: 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

  1. Using the path parsed in Phase 0.5, read scripts/<id>.md full text
  2. Compute script_hash = sha256(script content)[:12] → for header use
  3. Read rubric_notes.md, identify current formula + dimensions (same as cheat-score Phase 2)
  4. Read .cheat-state.json to get rubric_version、content_form、calibration_samples、typical_duration_seconds、baseline_plays
  5. From calibration_samples derive confidence level(according to state-management.md confidence table) → subsequently write into prediction header
  6. 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
  7. 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.

  1. 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)
  2. Prioritizefinding same-duration samples (Target Duration (s) within ±20% of this one)
  3. In the same-duration (or all) pool, find 2-4 samples whose composite is within ±0.5 of this prediction
  4. 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
  5. List a comparison table; if across durations, add an extra "duration vs this one" column per row
  6. 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.

  1. From starter-rubrics/<content_form>.md read the default bucket boundaries (unless the user has customized them in rubric_notes.md)
  2. Choose the most likely bucket (headline call)
  3. Mustgive the probability distribution across all buckets—summing to 100%
  4. 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:

  1. "ok" / "okay" / "continue" → go directly to Phase 6 writing to disk, header marked Scored By: claude
  2. "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
  3. "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 the video_folder field 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_override
  • User Override(if there are overrides): list which fields were changed by the user
    • Example:AB: claude=4 → user=3 (用户认为'一人公司题没那么普适') 中枢: claude=60w → user=40w
  • 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

  1. 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
  2. Integer dimension scores. Same as cheat-score
  3. Probability distribution = 100%. 95% + 8% is not allowed; either honestly give 50% + 30% + 15% + 5%, or admit you don't know
  4. There must be a ## 复盘 placeholder empty section—otherwise the hook doesn't know where the immutable boundary is
  5. "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
  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-init must be complete + rubric_notes.md exists
  • Upstream optional:/cheat-score repeatedly trying different draft versions
  • Downstream:/cheat-publish(publish registration) → /cheat-retro(retrospective) → after cumulative ≥ MIN_SAMPLES, /cheat-bump
  • hook dependency:hooks/prediction-immutability.sh must already be installed in the user's .claude/settings.json, otherwise immutability relies solely on SKILL.md self-discipline——cheat-status will keep prompting