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

必填来源
<draft-path>
用户作为参数传入;如缺失则在对话里询问
rubric_notes.md
用户项目根
.cheat-state.json
用户项目根(用于读当前
rubric_version
与 mode)
RequiredSource
<draft-path>
Passed as parameter by user; if missing, ask in conversation
rubric_notes.md
User project root
.cheat-state.json
User project root (used to read current
rubric_version
and mode)

Workflow

Workflow

Step 1:前置检查

Step 1: Pre-check

  1. .cheat-state.json
    → 不存在则提示用户先跑
    /cheat-init
    ,停止
  2. <draft-path>
    → 不存在或无内容 → 报错并停止
  3. rubric_notes.md
    找到当前生效的公式段(一般在"当前评分维度"或"综合分公式"位置)
  1. Read
    .cheat-state.json
    → if not exists, prompt user to run
    /cheat-init
    first, then stop
  2. Read
    <draft-path>
    → if not exists or empty → throw error and stop
  3. Read
    rubric_notes.md
    to find the currently effective formula section (usually in "Current Scoring Dimensions" or "Composite Score Formula" section)

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.md
格式与预期不符(用户手改过结构)→ 询问用户当前公式是哪一行,不要自己猜
Parse 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
rubric_notes.md
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.

Step 3:delegate 到 blind sub-agent(不再 inline 打分)

Step 3: Delegate to blind sub-agent (no longer inline scoring)

主对话已经被用户对话 / 已发数据 / 历史 retro 段污染——inline 打分等于带着后视镜判分。
改成通过 Task tool 调
/cheat-score-blind
sub-agent
,主 Claude 只做调度 + review。详见 skills/cheat-score-blind/SKILL.md
Task 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 自检:
echo "<prompt>" | grep -Ei '播放|阅读|点赞|评论数|实际|retro|复盘|实绩|w$|万$'
命中 → 改 prompt 重发。
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
/cheat-score-blind
sub-agent via Task tool
, main Claude only handles scheduling + review. See skills/cheat-score-blind/SKILL.md.
Task 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
    predictions/*.md
    paths
Self-check before calling:
echo "<prompt>" | grep -Ei '播放|阅读|点赞|评论数|实际|retro|复盘|实绩|w$|万$'
→ if hit → revise prompt and resend.

Step 4:解析 sub-agent 回传 JSON + review

Step 4: Parse sub-agent's returned JSON + review

sub-agent 返回严格 JSON。主 Claude:
  1. 解析 dimensions 段(含 score + per-dim confidence + reason)
  2. 校验
    self_check.any_contamination_signal == false
    ,否则警告
  3. 按 rubric_notes 公式算 composite(公式逻辑在主,分数来自 sub-agent)
  4. 不修改 sub-agent 给的维度分——score 只是显示。如果用户挑刺("AB 给 3 不是 4"),主 Claude 记录到
    User Override
    但 sub-agent 原始分留档
如果 sub-agent 返回
refusal != null
  • blocked_contaminated_input
    → 报告 Task prompt 含违禁字段,让主 Claude 重发
  • script_path_invalid
    → 检查路径
  • rubric_unparseable
    → 提示用户 rubric_notes.md 损坏
  • non_blind_warning
    → 仍接受 dimensions(但 confidence 全 medium),警告
Sub-agent returns strict JSON. Main Claude:
  1. Parse the dimensions section (includes score + per-dim confidence + reason)
  2. Verify
    self_check.any_contamination_signal == false
    , otherwise issue a warning
  3. Calculate composite score according to rubric_notes formula (formula logic in main agent, scores from sub-agent)
  4. 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
    User Override
    but keeps the sub-agent's original score on file.
If sub-agent returns
refusal != null
:
  • blocked_contaminated_input
    → report that Task prompt contains prohibited fields, ask main Claude to resend
  • script_path_invalid
    → check the path
  • rubric_unparseable
    → prompt user that rubric_notes.md is damaged
  • non_blind_warning
    → still accept dimensions (but all confidence levels are medium), issue a 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

  1. 打分走 sub-agent。主 Claude 不再 inline 打分。看 cheat-score-blind/SKILL.md 的隔离协议
  2. 整数分。不允许 4.5、3.7
  3. 盲打优先。sub-agent 只看 script + rubric,天然盲——这是它存在的全部理由
  4. 理由是诊断工具。每个维度的 1-30 字理由不是装饰——复盘时用来找出哪个维度判断错了
  5. 不写文件。这是 score 与 predict 的核心区别。score 是探索,predict 是承诺
  6. 不算 candidate composite。candidates.md 里的 composite 字段在 cheat-trends/cheat-recommend 里写——score 只服务"已写好的具体稿子"
  1. Scoring goes through sub-agent. Main Claude no longer does inline scoring. See the isolation protocol in cheat-score-blind/SKILL.md
  2. Integer scores only. 4.5, 3.7 are not allowed
  3. Blind scoring first. Sub-agent only looks at script + rubric, naturally blind — that's the entire reason for its existence
  4. 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
  5. No file writing. This is the core difference between score and predict. Score is exploration, predict is commitment
  6. 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

  • 「打分顺便预测一下」 → 拒绝。请改用
    /cheat-predict
    。原因:predict 必须走 blind check + 写 immutable 日志,score 跳过这些
  • 「打完分把分数写进 rubric_notes.md 的观察段」 → 拒绝。observation lifecycle 规定观察必须有"实绩 vs 预测"对比,光有打分不构成观察
  • 「能不能直接告诉我会不会爆」 → 拒绝。给具体 composite + bucket 的判定要求走 predict 流程;score 只输出当前 rubric 下的机械计算
  • 「跳过 blind sub-agent 让主 Claude 直接打」 → cheat-score 不接受这种 escape hatch(与 cheat-predict 不同;cheat-predict 有
    --skip-blind
    )。score 是轻量探索,没理由放弃隔离。如真的 Task tool 不可用 → 提示用户配置后再试
  • "Score and predict at the same time" → Refuse. Please use
    /cheat-predict
    instead. Reason: predict must go through blind check + write immutable logs, score skips these steps
  • "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
    --skip-blind
    ). Score is lightweight exploration, no reason to abandon isolation. If Task tool is truly unavailable → prompt user to configure it and try again

Integration

Integration

  • cheat-predict
    的前置探索:用户可以反复 score 不同稿子版本,确定一份再 predict
  • score 不更新
    .cheat-state.json
    ——这是无副作用操作
  • 如果用户连续 score 同一稿子 ≥3 次 → 控制台温和提示"反复打分会引入决策疲劳,差不多可以决定了"
  • It's a pre-exploration step for
    cheat-predict
    : users can repeatedly score different draft versions, then predict once they've decided on a version
  • Score does not update
    .cheat-state.json
    — this is a side-effect-free operation
  • 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"