cheat-score
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinese/cheat-score — 单稿打分
/cheat-score — Single Draft Scoring
打分但不预测。用户用它快速看稿子的 composite,决定是否值得进入正式预测流程。
Score but no prediction. Users use it to quickly check the draft's composite score and decide whether it's worth entering the formal prediction process.
Overview
Overview
[用户:打分这篇 draft.md]
↓
[读 draft.md + rubric_notes.md]
↓
[逐维度打 0-5 + 写一行理由 + 算 composite]
↓
[控制台输出:评分 + composite + 推荐下一步]
↓
[结束 — 不写任何文件][User: Score this draft.md]
↓
[Read draft.md + rubric_notes.md]
↓
[Score each dimension 0-5 + write one-line reason + calculate composite]
↓
[Console output: Scores + composite + recommended next steps]
↓
[End — no files written]Constants
Constants
- RUBRIC_PATH = rubric_notes.md — 当前 rubric 来源
- OUTPUT_DETAIL = full — full: 含每维度理由;compact: 仅分数表
💡 调用时覆盖:/cheat-score draft.md — OUTPUT_DETAIL: compact
- RUBRIC_PATH = rubric_notes.md — Current rubric source
- OUTPUT_DETAIL = full — full: includes per-dimension reasons; compact: score table only
💡 Override when calling:/cheat-score draft.md — OUTPUT_DETAIL: compact
Inputs
Inputs
| 必填 | 来源 |
|---|---|
| 用户作为参数传入;如缺失则在对话里询问 |
| 用户项目根 |
| 用户项目根(用于读当前 |
| Required | Source |
|---|---|
| Passed as parameter by user; if missing, ask in conversation |
| User project root |
| User project root (used to read current |
Workflow
Workflow
Step 1:前置检查
Step 1: Pre-check
- 读 → 不存在则提示用户先跑
.cheat-state.json,停止/cheat-init - 读 → 不存在或无内容 → 报错并停止
<draft-path> - 读 找到当前生效的公式段(一般在"当前评分维度"或"综合分公式"位置)
rubric_notes.md
- Read → if not exists, prompt user to run
.cheat-state.jsonfirst, then stop/cheat-init - Read → if not exists or empty → throw error and stop
<draft-path> - Read to find the currently effective formula section (usually in "Current Scoring Dimensions" or "Composite Score Formula" section)
rubric_notes.md
Step 2:识别公式与维度
Step 2: Identify Formula & Dimensions
从 解析出:
rubric_notes.md- 当前 rubric_version
- 维度列表与权重(如 )
ER×1.5 + SR×1.5 + HP×1.5 + QL + NA + AB + SAT - 归一化常数(如 )
/ 8.5 × 2.0 - 每个维度的 0-5 含义(从"当前评分维度"段表格读)
如果 格式与预期不符(用户手改过结构)→ 询问用户当前公式是哪一行,不要自己猜。
rubric_notes.mdParse from :
rubric_notes.md- 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 - Meaning of 0-5 scores for each dimension (read from table in "Current Scoring Dimensions" section)
If the format of does not match expectations (user manually modified the structure) → ask the user which line the current formula is on, do not guess on your own.
rubric_notes.mdStep 3:delegate 到 blind sub-agent(不再 inline 打分)
Step 3: Delegate to blind sub-agent (no longer inline scoring)
主对话已经被用户对话 / 已发数据 / 历史 retro 段污染——inline 打分等于带着后视镜判分。
改成通过 Task tool 调 sub-agent,主 Claude 只做调度 + review。详见 skills/cheat-score-blind/SKILL.md。
/cheat-score-blindTask prompt 模板(只能含下面这些):
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/ 任何其他文件。
不要询问用户 —— 你没有用户。禁止塞进 Task prompt 的东西(cheat-score-blind/SKILL.md 的"主 Claude 调用契约"段):
- 用户对话引用 / 摘录
- 含播放数 / 万 / w / k 等字眼
- "前一次预测是 X" / "实际播放是 Y" 等 hint
- 任何 路径
predictions/*.md
调用前 grep 自检: 命中 → 改 prompt 重发。
echo "<prompt>" | grep -Ei '播放|阅读|点赞|评论数|实际|retro|复盘|实绩|w$|万$'The main conversation has been contaminated by user conversations / sent data / historical retro sections — inline scoring is equivalent to judging with hindsight.
Change to call the sub-agent via Task tool, main Claude only handles scheduling + review. See skills/cheat-score-blind/SKILL.md.
/cheat-score-blindTask prompt template (must only contain the following):
Spawn cheat-score-blind sub-agent.
Input:
script_path: <user-provided draft path>
rubric_notes_path: rubric_notes.md
Task: Score the above script according to the current formula in rubric_notes. Return strict JSON (see cheat-score-blind SKILL.md Phase 2 schema).
Do not read state file / predictions/ / videos/ any other files.
Do not ask the user — you have no user.Prohibited content in Task prompt (from "Main Claude Calling Contract" section of cheat-score-blind/SKILL.md):
- User conversation references / excerpts
- Words like views count / 万 / w / k
- Hints like "Previous prediction was X" / "Actual views were Y"
- Any paths
predictions/*.md
Self-check before calling: → if hit → revise prompt and resend.
echo "<prompt>" | grep -Ei '播放|阅读|点赞|评论数|实际|retro|复盘|实绩|w$|万$'Step 4:解析 sub-agent 回传 JSON + review
Step 4: Parse sub-agent's returned JSON + review
sub-agent 返回严格 JSON。主 Claude:
- 解析 dimensions 段(含 score + per-dim confidence + reason)
- 校验 ,否则警告
self_check.any_contamination_signal == false - 按 rubric_notes 公式算 composite(公式逻辑在主,分数来自 sub-agent)
- 不修改 sub-agent 给的维度分——score 只是显示。如果用户挑刺("AB 给 3 不是 4"),主 Claude 记录到 但 sub-agent 原始分留档
User Override
如果 sub-agent 返回 :
refusal != null- → 报告 Task prompt 含违禁字段,让主 Claude 重发
blocked_contaminated_input - → 检查路径
script_path_invalid - → 提示用户 rubric_notes.md 损坏
rubric_unparseable - → 仍接受 dimensions(但 confidence 全 medium),警告
non_blind_warning
Sub-agent returns strict JSON. Main Claude:
- Parse the dimensions section (includes score + per-dim confidence + reason)
- Verify , otherwise issue a warning
self_check.any_contamination_signal == false - Calculate composite score according to rubric_notes formula (formula logic in main agent, scores from sub-agent)
- Do not modify the dimension scores given by the sub-agent — scores are for display only. If the user raises an objection (e.g., "AB should be 4 instead of 3"), main Claude records it to but keeps the sub-agent's original score on file.
User Override
If sub-agent returns :
refusal != null- → report that Task prompt contains prohibited fields, ask main Claude to resend
blocked_contaminated_input - → check the path
script_path_invalid - → prompt user that rubric_notes.md is damaged
rubric_unparseable - → still accept dimensions (but all confidence levels are medium), issue a warning
non_blind_warning
Step 5:算 composite + 输出
Step 5: Calculate composite + 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 的锚点"OUTPUT_DETAIL=compact 时仅输出分数表 + composite,不附理由列。
Calculate composite score according to current formula. Console output (OUTPUT_DETAIL=full):
📊 [draft.md short title] — Scoring (rubric: v2)
| Dimension | Score | Reason |
|---|---|---|
| ER (Emotional Resonance) | 5 | Extremely concrete: "Checking chat records at 3 AM" |
| HP (Hook Strength) | 5 | IS sentence locks audience in one line |
| QL (Quotable Line Density) | 5 | MVP line "Intermittent hope" is independently shareable |
| NA (Narrative Quality) | 3 | Straightforward, weak arc |
| AB (Audience Breadth) | 5 | Universal for unrequited love/ex-partner themes |
| SR (Social Issue Resonance) | 2 | Pure personal emotion, no social context |
| SAT (Satire Depth) | 4 | Self-referential irony in acknowledgment section |
Formula: (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**
📍 Falls into 300k-1M bucket (based on starter-rubrics bucket boundaries)
Next steps:
- If you've finalized the draft and are ready to publish → say "Initiate prediction"
- If you want to revise the draft → score again after revision (multiple scorings leave no trace)
- If you want to see samples with similar historical composite scores → say "Find anchors with composite 8.0-8.5"When OUTPUT_DETAIL=compact, only output the score table + composite, no reason column.
Step 6:绝不做的事
Step 6: Never do these things
- ❌ 写任何文件(包括 predictions/、rubric_notes.md、candidates.md)
- ❌ 给 bucket 概率分布(那是 cheat-predict 的活)
- ❌ 触发"已发布"或"复盘"逻辑
- ❌ 提议 rubric 升级(即使打分时发现明显异常也只在控制台提示,不动 rubric)
- ❌ Write any files (including predictions/, rubric_notes.md, candidates.md)
- ❌ Provide bucket probability distribution (that's cheat-predict's job)
- ❌ Trigger "published" or "retro" logic
- ❌ Propose rubric upgrades (even if obvious anomalies are found during scoring, only prompt in console, do not modify rubric)
Key Rules
Key Rules
- 打分走 sub-agent。主 Claude 不再 inline 打分。看 cheat-score-blind/SKILL.md 的隔离协议
- 整数分。不允许 4.5、3.7
- 盲打优先。sub-agent 只看 script + rubric,天然盲——这是它存在的全部理由
- 理由是诊断工具。每个维度的 1-30 字理由不是装饰——复盘时用来找出哪个维度判断错了
- 不写文件。这是 score 与 predict 的核心区别。score 是探索,predict 是承诺
- 不算 candidate composite。candidates.md 里的 composite 字段在 cheat-trends/cheat-recommend 里写——score 只服务"已写好的具体稿子"
- Scoring goes through sub-agent. Main Claude no longer does inline scoring. See the isolation protocol in cheat-score-blind/SKILL.md
- Integer scores only. 4.5, 3.7 are not allowed
- Blind scoring first. Sub-agent only looks at script + rubric, naturally blind — that's the entire reason for its existence
- Reasons are diagnostic tools. The 1-30 word reason for each dimension is not decorative — used during retro to identify which dimension's judgment was wrong
- No file writing. This is the core difference between score and predict. Score is exploration, predict is commitment
- Do not calculate candidate composite. The composite field in candidates.md is written in cheat-trends/cheat-recommend — score only serves "specific drafted manuscripts"
Refusals
Refusals
- 「打分顺便预测一下」 → 拒绝。请改用 。原因:predict 必须走 blind check + 写 immutable 日志,score 跳过这些
/cheat-predict - 「打完分把分数写进 rubric_notes.md 的观察段」 → 拒绝。observation lifecycle 规定观察必须有"实绩 vs 预测"对比,光有打分不构成观察
- 「能不能直接告诉我会不会爆」 → 拒绝。给具体 composite + bucket 的判定要求走 predict 流程;score 只输出当前 rubric 下的机械计算
- 「跳过 blind sub-agent 让主 Claude 直接打」 → cheat-score 不接受这种 escape hatch(与 cheat-predict 不同;cheat-predict 有 )。score 是轻量探索,没理由放弃隔离。如真的 Task tool 不可用 → 提示用户配置后再试
--skip-blind
- "Score and predict at the same time" → Refuse. Please use instead. Reason: predict must go through blind check + write immutable logs, score skips these steps
/cheat-predict - "Write the score into the observation section of rubric_notes.md after scoring" → Refuse. Observation lifecycle requires that observations must have a "actual performance vs prediction" comparison; scoring alone does not constitute an observation
- "Can you just tell me if it will go viral?" → Refuse. Determining specific composite + bucket requires going through the predict process; score only outputs mechanical calculation under the current rubric
- "Skip the blind sub-agent and let main Claude score directly" → cheat-score does not accept this escape hatch (unlike cheat-predict; cheat-predict has ). Score is lightweight exploration, no reason to abandon isolation. If Task tool is truly unavailable → prompt user to configure it and try again
--skip-blind
Integration
Integration
- 是 的前置探索:用户可以反复 score 不同稿子版本,确定一份再 predict
cheat-predict - score 不更新 ——这是无副作用操作
.cheat-state.json - 如果用户连续 score 同一稿子 ≥3 次 → 控制台温和提示"反复打分会引入决策疲劳,差不多可以决定了"
- It's a pre-exploration step for : users can repeatedly score different draft versions, then predict once they've decided on a version
cheat-predict - Score does not update — this is a side-effect-free operation
.cheat-state.json - If user scores the same draft ≥3 times consecutively → gently prompt in console: "Repeated scoring may introduce decision fatigue, it's time to make a decision"