scoring butnot predicting. Users use it to quickly check a draft's composite and decide whether it's worth entering the formal prediction process.
Overview
[用户:打分这篇 draft.md]
↓
[读 draft.md + rubric_notes.md]
↓
[逐维度打 0-5 + 写一行理由 + 算 composite]
↓
[控制台输出:评分 + composite + 推荐下一步]
↓
[结束 — 不写任何文件]
Constants
- RUBRIC_PATH = rubric_notes.md — current rubric source
- OUTPUT_DETAIL = full — full: includes per-dimension reasons; compact: score table only
💡 Overrides when invoking:
/cheat-score draft.md — OUTPUT_DETAIL: compact
Inputs
| required | source |
|---|---|
<draft-path> |
passed by the user as a parameter; if missing, ask in the conversation |
rubric_notes.md |
user project root |
.cheat-state.json |
user project root (used to read the current rubric_version and mode) |
Workflow
Step 1: Pre-checks
- Read
.cheat-state.json→ if it doesn't exist, prompt the user to run/cheat-init, stop - Read
<draft-path>→ if it doesn't exist or has no content → report an error and stop - Read
rubric_notes.mdand find the currently effective formula section (usually in the "current scoring dimensions" or "composite score formula" location)
Step 2: Identify the formula and dimensions
From rubric_notes.md , parse out:
- current rubric_version
- dimension list and weights (e.g.
ER×1.5 + SR×1.5 + HP×1.5 + QL + NA + AB + SAT) - normalization constant (e.g.
/ 8.5 × 2.0) - the 0-5 meaning for each dimension (read from the "current scoring dimensions" section table)
If rubric_notes.md format doesn't match expectations (the user manually changed the structure) → ask the user which line the current formula is on,do not guess。
Step 3:delegate to blind sub-agent(no longer score inline)
The main conversation is already polluted by user dialogue / sent data / historical retro sections—inline scoring means judging with hindsight.
change tocall via the Task tool /cheat-score-blind sub-agent, and the main Claude only does scheduling + review. See skills/cheat-score-blind/SKILL.md。
Task prompt template(may only containthe following):
Spawn cheat-score-blind sub-agent.
Input:
script_path: <用户给的 draft path>
rubric_notes_path: rubric_notes.md
Task: 按 rubric_notes 当前公式给上面 script 打分。返回严格 JSON(见 cheat-score-blind SKILL.md Phase 2 schema)。
不要读 state file / predictions/ / videos/ 任何其他文件。
不要询问用户 —— 你没有用户。
Prohibitedthings to stuff into the Task prompt (cheat-score-blind/SKILL.md 's "main Claude invocation contract" section):
- user dialogue quotes / excerpts
- contains words like view count / 10k / w / k
- hints like "the previous prediction was X" / "the actual view count is Y"
- any
predictions/*.mdpath
grep self-check before invoking:echo "<prompt>" | grep -Ei '播放|阅读|点赞|评论数|实际|retro|复盘|实绩|w$|万$' hit → revise the prompt and resend.
Step 4: Parse the sub-agent's returned JSON + review
The sub-agent returns strict JSON. Main Claude:
- parses the dimensions section (including score + per-dim confidence + reason)
- verify
self_check.any_contamination_signal == false, otherwise warn - compute composite using the rubric_notes formula (the formula logic is in the main, scores come from the sub-agent)
- do not modify the dimension scores given by the sub-agent—score is display only. If the user nitpicks ("AB gave 3, not 4"), main Claude records it to
User Overridebut the sub-agent's original score is kept on file
If the sub-agent returns refusal != null:
blocked_contaminated_input→ report that the Task prompt contains prohibited fields, and have the main Claude resendscript_path_invalid→ check the pathrubric_unparseable→ prompt the user that rubric_notes.md is corruptednon_blind_warning→ still accepts dimensions (but confidence is all medium), warning
Step 5: compute composite + output
Compute the composite score using the current formula. Console output (OUTPUT_DETAIL=full):
📊 [draft.md 短标题] — 打分(rubric: v2)
| 维度 | 分 | 理由 |
|---|---|---|
| ER (情感共鸣) | 5 | "半夜三点翻聊天记录" 极端具象 |
| HP (钩子强度) | 5 | IS 句一句锁定受众 |
| QL (金句密度) | 5 | MVP 句"间歇性希望"独立可传 |
| NA (叙事性) | 3 | 平铺直叙,弱弧线 |
| AB (受众广度) | 5 | 暗恋/前任普适 |
| SR (社会议题共振) | 2 | 纯个人情感,无社会托底 |
| SAT (讽刺深度) | 4 | 致谢段自指反讽 |
公式:(ER×1.5 + SR×1.5 + HP×1.5 + QL + NA + AB + SAT) / 8.5 × 2.0
composite = (5×1.5 + 2×1.5 + 5×1.5 + 5 + 3 + 5 + 4) / 8.5 × 2.0 = **8.24**
📍 落在 30-100w 桶(基于 starter-rubrics 的 bucket 边界)
下一步建议:
- 如果你已写定最终稿、准备发布 → 说 "启动预测"
- 如果想再改稿子 → 改完再打一次(多次打分不留痕迹)
- 如果想看历史相近 composite 的样本 → 说 "找 composite 8.0-8.5 的锚点"
When OUTPUT_DETAIL=compact, output only the score table + composite, without the reasons column.
Step 6:Neverthings to do
- ❌ Write any files (including predictions/, rubric_notes.md, candidates.md)
- ❌ Give bucket probability distributions (that's cheat-predict's job)
- ❌ Trigger "published" or "retrospective" logic
- ❌ Propose rubric upgrades (even if obvious anomalies are found during scoring, only prompt in the console, do not touch the rubric)
Key Rules
- Scoring goes through a sub-agent. The main Claude no longer scores inline. See cheat-score-blind/SKILL.md 's isolation protocol
- Integer scores. 4.5, 3.7 are not allowed
- Blind scoring takes priority. The sub-agent only sees the script + rubric, naturally blind—this is the entire reason it exists
- Reasons are a diagnostic tool. The 1-30 character reason for each dimension is not decoration—it is used during retrospective to find which dimension was judged wrong
- Do not write files. This is the core difference between score and predict. score is exploration, predict is commitment
- Do not compute candidate composite. The composite field in candidates.md is written in cheat-trends/cheat-recommend—score only serves "specific drafts that have already been written"
Refusals
- "Score and also predict while you're at it" → refuse. Please use
/cheat-predict. Reason: predict must go through blind check + write an immutable log, score skips these - "After scoring, write the score into the observation section of rubric_notes.md" → refuse. The observation lifecycle requires observations to have a "actual results vs prediction" comparison; scoring alone does not constitute an observation
- "Can you just tell me whether it will go viral" → refuse. Giving a specific composite + bucket judgment requires going through the predict process; score only outputs the mechanical calculation under the current rubric
- "Skip the blind sub-agent and let the main Claude score directly" → cheat-score does not acceptthis escape hatch (unlike cheat-predict; cheat-predict has
--skip-blind). score is lightweight exploration, there is no reason to give up isolation. If the Task tool is truly unavailable → prompt the user to configure it and try again
Integration
- is
cheat-predict's prerequisite exploration: the user can repeatedly score different draft versions, settle on one, then predict - score does not update
.cheat-state.json—this is a side-effect-free operation - If the user scores the same draft ≥3 times in a row → gently prompt in the console "repeated scoring introduces decision fatigue, it's about time to decide"