Read the state file + scan the user's project → summarize current progress → output a "what to do today" checklist.
Overview
[用户:状态]
↓
[Phase 1: 读 .cheat-state.json + 扫文件系统]
↓
[Phase 2: 计算派生指标]
↓
[Phase 3: 检测建议触发器(升级 / bump / 清算)]
↓
[Phase 4: 输出看板]
Constants
- SQLITE_UPGRADE_THRESHOLD = 30 — suggest upgrading to SQLite when calibration_samples reaches N
- CLEANUP_LINE_THRESHOLD = 600 — suggest settling up when rubric_notes.md line count exceeds N
- STALE_PREDICTION_DAYS = 30 — prompt cleanup when an in_progress prediction hasn't been published for over N days
Inputs
| Source | Purpose |
|---|---|
.cheat-state.json |
Main state |
predictions/*.md |
Calibration sample count / pending retros |
candidates.md |
Candidate pool size |
rubric_notes.md |
Line count / current version |
.cheat-cache/usage.jsonl(if any) |
meta-logging data, used for "how many predictions since the last bump" |
Workflow
Phase 1: Read state
state = read_json('.cheat-state.json')
if not state:
return "你还没初始化。请先跑 /cheat-init。"
predictions = glob('predictions/*.md')
candidates_count = parse_candidates_md_entries()
rubric_lines = wc -l rubric_notes.md
Phase 2: Derive metrics
| Metric | Algorithm |
|---|---|
| Buffer count | len(state.shoots) |
| Buffer color | Derive by cadence-protocol.md :buffer_days = buffer_count × target_publish_cadence_days,<1 红 / 1-2 橙 / 3-5 绿 / >5 蓝. If target_publish_cadence_days=null → color disabled |
| Confidence level | Derive by state-management.md confidence table : from calibration_samples integer derive emoji + label |
| Days from earliest shoot to today | now - state.shoots[0].shot_at, used to warn "shot N days ago and still not published" |
| Calibration sample count | Number of files in predictions containing a complete retro section (actual performance data non-empty) |
| Pending retros | In state.pending_retros those that have passed RETRO_WINDOW_DAYS |
| Pool size | Number of entries in candidates.md with tier!=skip |
| How many predictions since the last bump | Number in predictions with published_at > state.last_bump_at |
| Same-direction deviation queue | state.consecutive_directional_errors |
| in_progress staleness | now - state.in_progress_session.started_at (if any) |
Phase 3: Detect suggested triggers
Check item by item in priority order (high→low):
- Buffer color = 🔴 red → first line high-priority alert: "buffer is already 0/1 posts, the next publishing day may have a gap—today you must shoot ≥1. If you say 'recommend topics' I'll only recommend the top 1 safe pick (no experimental ones)"
- Buffer color = 🔵 blue → high-priority reminder: "buffer already has N posts backed up.Pause shooting, first publish the stock + retro. Say 'published ...' and I'll help you dequeue"
- Earliest item in state.shoots has shot_at > 14 days → "You have a video shot N days ago but not yet published—risk of losing topical timeliness, recommend publishing soon or scrapping the draft"
- in_progress stale (>= STALE_PREDICTION_DAYS) → high-priority reminder "clean up or publish"
- Pending retros ≥ 1 → high-priority "today you should do retros for X posts"
pool_status=none+calibration_samples=0+ more than 24h since init → "🌱 It's been N days since you finished init but you still haven't filmed—is it because you don't have a topic? Run /cheat-seed to get 5 candidates + 5 drafts in 5 minutes" high priority- Claude judges systematic bias signal(Not rigidly requiring ≥3 same-direction) → prompt "suggest running /cheat-bump"
- Default reference: ≥3 consecutive same-direction deviations
- But Claude can be earlier: 1 extreme deviation (≥10x) or 2 same-direction + strong counter-evidence in comments
- Can also be later: 3 same-direction but each magnitude <25% (may just be noise)
- When prompting, explicitly label: "this time is [default-aligned] / [judgment-driven]"
- calibration_samples crosses into a new confidence level(0→1, 2→3, 5→6, 10→11, 20→21) → prompt "🎉 confidence upgraded: <old level> → <new level>. Bucket center accuracy improved from ±X% to ±Y%".Notification only, no operation the user must confirm—all skills have already auto-adjusted based on calibration_samples
- calibration_samples crosses 5 → "Your rubric form can have its first formal bump. Review rubric_notes.md to see if the observation record section has a pattern supported by ≥3 samples → run /cheat-bump"
- calibration_samples crosses 10 → "You can run /cheat-bump --bucket-only --scheme percentile to switch bucket boundaries to percentile (always self-consistent)"
- calibration_samples crosses SQLITE_UPGRADE_THRESHOLD and data_layer=markdown → "suggest running tools/md-to-sqlite.py" (planned — batch 3, not yet available)
- rubric_notes.md line count > CLEANUP_LINE_THRESHOLD → "suggest clearing the observation section (manually or triggered by the next bump)"
- calibration_samples ≥ 5 + pool_status=none → "you can start building a topic pool"
- calibration_samples ≥ 15 + pool_status=none → "strongly suggest building a pool: /cheat-trends or manually create candidates.md"
- state.hooks_installed=false → "your immutability is a gentlemen's agreement; suggest running /cheat-init to install the hook"
- state.last_bump_self_audited=true → "the last bump was self-review. Suggest configuring mcp__llm-chat__chat so the next bump goes through external review"
- state.rubric_form_mismatch=true → "your content_form is not opinion-video, so the built-in opinion rubric was used. The first few predictions will be less accurate; at the next bump, suggest adjusting weights yourself to fit your form"
- state.benchmark_status=pending → "🎯 At init you promised to find benchmark accounts later but haven't yet. Run /cheat-learn-from to import ≥3 benchmark videos, and the tool will have an anchor"
- state.benchmark_status=imported + Claude judges that the user's data signal has surpassed the benchmark → "📊 Your real data has become the primary signal, and the benchmark's influence is fading"
- Default reference:calibration_samples ≥ 10
- But Claude can be earlier: N=5 but the user's (score, actual result) pairs include ≥3 that are inconsistent with the benchmark pattern—meaning your account has already moved beyond the benchmark's path
- Can also be later: N=15 but the user's samples are all very similar, without enough diversity → the benchmark still has signal value
- The prompt isa notification, not a gate—benchmark.md is always kept as a sanity check, and cheat-seed can still read it
Phase 4: Output dashboard
🎛️ cheat-on-content 状态(更新于 2026-05-04 15:00)
内容形态:opinion-video / 时长 3-5min / cadence: 隔日更
当前 rubric:v2 (上次 bump: 2026-04-22)
校准样本:18 篇
Confidence: 🟢 较高 (中枢 ±15%,rubric 形态稳定)
Baseline: 4.2w 中位数
📦 Buffer:3 篇(🟢 绿色)
按你的 cadence (隔日更)= 6 天 buffer,节奏稳定
📊 进度条
[█████████████░░░░░] 18 / 30 → SQLite 升级建议门槛
[██████████░░░░░░░░] 18 / 10 → percentile 桶可用(已超过门槛)
🎬 待办(按紧急度)
🚨 复盘 1 篇(已过 T+3d)
- predictions/2026-05-01_db063817_你已不在关系里.md(T+3d 到了)
⚠️ 同向偏差 3 次(high, high, high)→ 建议 /cheat-bump
💤 in-progress prediction 已陈旧 35 天
- predictions/2026-04-01_xxx.md → 是已发了忘登记?还是弃稿?
🔥 候选池
- candidates.md: 27 条(tier1: 12, tier2: 9, tier3: 6)
- 距上次抓热点: 4 天 — 可以再跑 /cheat-trends
📈 健康度
- rubric_notes.md: 412 行(健康,<600 警戒线)
- hooks_installed: ✅
- external audit configured: ❌ → 建议配 mcp__llm-chat__chat
下一步建议(按推荐优先级):
1. /cheat-retro predictions/2026-05-01_db063817_你已不在关系里.md ← 最紧急
2. /cheat-bump ← 同向偏差 3 次的处理
3. 处理陈旧 in-progress(手动或回 "清理 in-progress")
完整的命令清单见主 SKILL.md。
Output style:Direct, specific, clickable. Each suggestion includes the exact command—the user should be able to copy-paste and run it directly.
Key Rules
- No side effects. Read many, write zero. Any state modification is the job of other skills
- Do not pretend data is available. Missing state file field → explicitly mark "unknown", do not guess
- Suggestions carry priority. 10 suggestions displayed at once will numb the user—sort by urgency
- Each suggestion includes a command. Cannot just say "it should be bumped"—must give the
/cheat-bump --propose "..."precise entry point
Refusals
- "By the way, help me run retro automatically" → refuse. status is read-only, retro is another action (avoid doing two things in one operation)
- "I don't want to see the rubric_notes line count, it's too trivial" → the output still includes it but collapses it to the bottom "health" section—the presence of status information makes it visible to the user before problems occur
Integration
- Upstream: all other skills update .cheat-state.json when they complete; status is the visualization of these updates
- Downstream: each suggestion routes to a specific sub-skill
- meta-logging hook (if enabled) → writes usage.jsonl, status uses it to calculate "how many times since last X"