| name | cheat-bump |
| description | 提議並執行 rubric 或 bucket 升級。兩種模式:**完整 rubric bump**(最高風險動作,5 步強制 + 跨模型審核)和 **--bucket-only 輕量重校**(只換 bucket 邊界,不動 rubric 公式)。**Phase 2 強制走 cheat-score-blind sub-agent 給校準池重打分**——不接受 self-scored fallback。觸發詞:"升級 rubric"/"bump rubric"/"更新公式"/"我想加一個維度"/"調整權重"/"重校桶"/"recalibrate bucket"。 |
| argument-hint | --propose "<...>" | --bucket-only |
| allowed-tools | Bash(*), Read, Write, Edit, Glob, Grep, Skill, Task, mcp__llm-chat__chat |
/cheat-bump — Rubric / Bucket 升級
兩種模式:
| 模式 | 觸發 | 做什麼 | 驗證強度 |
|---|
| 完整 rubric bump | --propose "<新公式>" | 改公式 / 維度 / 權重 | 5 步 + 跨模型審核(強制) |
| bucket-only 重校 | --bucket-only | 只重新派生 bucket 邊界 | 數據自動派生,無審核 |
完整 rubric bump 嚴格遵守 shared-references/bump-validation-protocol.md 的 5 步。bucket-only 走輕量路徑——見下方 Phase B。
Overview
入口:用戶觸發 /cheat-bump
↓
[Phase A0: 檢測調用模式]
↓
├─ --bucket-only → [Phase B: 輕量 bucket 重校]
└─ --propose → [Phase 0~7: 完整 rubric bump]
Phase A0: 調用模式分流(先做)
讀用戶參數:
- 含
--bucket-only → 走 Phase B(輕量重校)
- 含
--propose "<...>" → 走 Phase 0~7(完整 rubric bump)
- 都沒有 → 詢問用戶:"你想做什麼?1) 調 rubric 公式 / 加減維度 → --propose;2) 只重新派生 bucket 邊界 → --bucket-only"
如果用戶說"我覺得 IR 太低了想調"→ 是 --propose 路徑。
如果用戶說"我做了更多 session,bucket 邊界不準了"→ 是 --bucket-only 路徑。
兩條路徑不能混調——一次操作只做一種事。
完整 rubric bump 流程
[用戶:升級 rubric --propose "IR×1.5,砍 TS,加 DX"]
↓
[Phase 0: 前置門檻檢查]
↓
[Phase 1: 寫出新公式完整方程]
↓
[Phase 2: 校準池全量重打分]
↓
[Phase 3: 計算排序一致性]
↓
[Phase 4: 跨模型獨立審核(強制)]
↓
[Phase 5: 落地 + cleanup pass]
↓
[Phase 6: 更新所有校準樣本的 prediction 文件底部追加 Re-scored 行]
↓
[Phase 7: 更新 state file]
Constants
- READINESS_HEURISTIC —
- 默認參考:校準池 ≥ 2 樣本
- 但 Claude 可以提議 bump(即使樣本少)如果觀察信號特別強:
- N=3 但出現完全推翻當前 rubric 假設的強反例(composite 高但實際 K% 很低這種 ≥3x 偏差)
- 1 篇出現單點但極強的現象
- Claude 也可以拒絕 bump(即使樣本足)如果證據弱:
- N=10 但觀察都是低置信度的零碎 pattern,無清晰方向
- 寫在 prediction header 或 cheat-bump 輸出時必說明:本次提議是 default-aligned 還是 judgment-driven
- THRESHOLD = 0.8 — 新排序與實績排序一致性閾值(4/5)。這條寫死
- CROSS_MODEL_AUDIT = true — 調外部 LLM 獨立審核。false 僅用於離線
- REQUIRE_CONFIRM = true — 落地前要求用戶明確"yes, bump"
Inputs
| 必填 | 來源 |
|---|
--propose 文本 | 用戶參數;缺失則詢問 |
rubric_notes.md | 用戶項目根 |
predictions/*.md 全量 | 校準池數據 |
.cheat-state.json | 狀態 |
Workflow
Phase 0: 前置門檻檢查
按 bump-validation-protocol.md 的"何時禁止"段,逐項檢查:
| 檢查 | 失敗處理 |
|---|
| 校準池總樣本數 vs 觀察強度 | Claude 判斷——按 READINESS_HEURISTIC。不滿足默認時 Claude 必須顯式說明為什麼仍然提議 bump |
| 上次 bump 距今的新校準數 vs 觀察成熟度 | Claude 判斷——默認建議 ≥3 篇新樣本 |
in_progress_session == null | 拒絕:"你有 in-progress 預測未完成。先走完那條流程或清掉 state" |
| 觸發條件成立(系統性偏差 / 跨樣本新觀察 / 新維度證據足) | 警告但不阻塞——詢問用戶為什麼現在 bump |
通過 → 進入 Phase 1。
Phase 1: 寫出新公式完整方程
不能只接受用戶的簡短描述。把它展開為完整方程:
當前:v0 composite = (SP + LV + TS + CO + IR) / 5
提議:v1 composite = (SP + LV×1.5 + CO×1.5 + IR×2.0 + DX) / 7.0
變化總結:
- LV ×1.0 → ×1.5(升,AI 槓桿點更重要)
- CO ×1.0 → ×1.5(升)
- IR ×1.0 → ×2.0(升,集成風險是主要偏差來源)
- 刪除 TS(與 CO 重疊)
- 新增 DX ×1.0(Documentation Quality)
- 歸一化常數 5 → 7.0
- 公式總維度數:5 → 5(淨變化 0)
如果用戶的提議含糊(如"IR 權重提一點")→ 詢問具體數值,禁止自己猜。
Phase 2: 校準池全量重打分(強制走 blind sub-agent)
Glob predictions/*.md 中所有有完整復盤段的文件 → 校準池。
bump 是工具最高風險動作——所有重打必須走 cheat-score-blind sub-agent。inline 重打 = 主 Claude 已經看過實績,rank 一致性變成 overfit 而非真信號。
強制約束
- 不接受 self-scored fallback——
/cheat-predict 有 --skip-blind flag,但 /cheat-bump 沒有。如果 Task tool 不可用 → abort bump,向用戶報告"先解決 Task tool 再 bump"
- 不接受"我只重算 composite 不重打 dim" —— 即使新公式只調權重不加維度,每條 prediction 的所有 dim 都要由 sub-agent 重新審 script
對每篇 prediction:
- 解析 prediction 文件拿到對應
scripts/<id>.md 路徑(從 Script Path header 字段)
- 校驗 script 文件存在 + hash 跟 header
Script Hash 一致;不一致 → 警告(script 改過了)但仍 spawn sub-agent
- 通過 Task tool spawn cheat-score-blind sub-agent:
Spawn cheat-score-blind sub-agent.
Input:
script_path: <prediction header 的 Script Path>
rubric_notes_path: rubric_notes.md
sidecar_path: .cheat-cache/bump-rescores/<prediction-id>.json
Task: 按 rubric_notes 當前公式(已是新版 vN+1)給 script 打分。
返回嚴格 JSON。寫 sidecar 文件用於 bump 主流程批量讀取。
不要讀 state file / predictions/ / sessions/ 任何其他文件。
不要詢問用戶 —— 你沒有用戶。
不要讀這份 prediction 文件本身 —— 你只看 script + rubric。
- 等 sub-agent 完成 → 讀 sidecar JSON → 主流程用新公式算 composite
- 寫"重打表"到
.cheat-cache/bump-rescores.json(匯總)。每條 entry 標 blind: true
殘余污染誠實標注
即使走 sub-agent,仍有兩類殘余 contamination 要在 bump report 里誠實標注:
| 類型 | 來源 | 標注字段 |
|---|
| 模型 prior contamination | sub-agent 仍是 Claude,RLHF 共享 | model_prior_warning: true(默認 true,不可關) |
| 用戶自己 rubric design bias | rubric_notes.md 是用戶寫的,自然 fit 自己內容 | rubric_self_designed: true(默認 true,不可關) |
bump 報告末尾必印:"上面的 rank 一致性是 channel A 內的一致性。最終決策必須等 channel C audit 通過。"
失敗模式
| 症狀 | 處理 |
|---|
| 某條 prediction 的 script 文件不見了 | sub-agent skip 該條,主流程匯總報告"N 條因 script 缺失被排除"。如剩余有效池 < MIN_SAMPLES → abort bump |
sub-agent 返回 refusal != null | 重發 Task 最多 3 次;仍敗 → 該條標 rescore_failed: true 排除出校準池 |
| Task tool 整個不可用 | abort bump,提示用戶"Task tool 是 bump 的硬依賴。如真的離線環境,跑 /cheat-bump --bucket-only 走輕量分支" |
| sub-agent 輸出含 contamination_signal | 標 suspicious: true 但不排除——bump report 末尾列這些可疑條目讓用戶審 |
Phase 3: 計算排序一致性
對校準池每個樣本,用新公式算 composite,與實際結果(K%/Q分/留存分等,按域從復盤段讀)排名對比:
每個樣本:
new_composite_rank: 用新公式排序的 rank
actual_outcome_rank: 用實際結果排序的 rank
delta: |new_rank - actual_rank|
輸出對照表(以 ai-coding 為例):
| 樣本 | composite (v0) | composite (v1) | rank (new) | actual K% | rank (actual) | delta |
|---|---|---|---|---|---|---|
| pdf2excel | 3.20 | 4.15 | 1 | K=72% | 1 | 0 |
| auth-module | 2.80 | 3.60 | 2 | K=55% | 2 | 0 |
| data-import | 3.50 | 3.20 | 4 | K=68% | 3 | 1 |
| ui-refactor | 3.00 | 2.90 | 5 | K=40% | 4 | 1 |
| api-client | 2.50 | 2.40 | 6 | K=30% | 5 | 1 |
排序一致性:4/5 在 |delta| ≤ 1
判定:
- 排序一致性 < THRESHOLD(默認 0.8)→ 本地拒絕,轉 Phase 4 之前明確報告失敗
- pairwise 出現回歸 → 本地拒絕
THRESHOLD 寫死在協議里——不允許臨時調低(那本身是另一個需要 bump 的元決策)。
Phase 4: 跨模型獨立審核(強制,除非 escape hatch)
CROSS_MODEL_AUDIT=true(默認):
調用 mcp__llm-chat__chat:
prompt:
你是一個獨立審核人。下面是一個用戶準備升級的 rubric 公式。
請獨立判定兩件事:
1. 排序一致性:新公式給樣本的排序與實際結果排序,是否真的在 ≥80% 樣本上一致?
2. 解釋力:新公式相比舊公式,是否更好地解釋了校準池的實績分布?
數據:
舊公式:(SP + LV + TS + CO + IR) / 5
新公式:(SP + LV×1.5 + CO×1.5 + IR×2.0 + DX) / 7.0
校準池:
[Phase 2 重打表的完整 JSON]
排序對照:
[Phase 3 表格的完整 JSON]
輸出格式:
- 判定:PASS 或 REJECT
- 理由:≥100 字
- 關鍵風險:[如有,列出新公式的潛在問題]
收到外部 LLM 回復 → 解析判定。
判定邏輯:
- 本地 PASS + 外部 PASS → 通過,進入 Phase 5
- 本地 PASS + 外部 REJECT → 視為 REJECT。衝突意味著至少一方解讀不穩定
- 本地 REJECT → 已在 Phase 3 終止
- mcp__llm-chat__chat 不可用 → 優雅降級到
CROSS_MODEL_AUDIT=false,state file 標 last_bump_self_audited: true
CROSS_MODEL_AUDIT=false:
- 僅依賴本地判定
- state file 持續標記,cheat-status 持續提示用戶"這次 bump 是自審,建議配置 mcp__llm-chat__chat"
Phase 5: 落地 + cleanup pass
通過審核後,REQUIRE_CONFIRM=true → 詢問用戶:"新公式 PASS 本地與外部審核。最後確認:執行 bump 落地?這會修改 rubric_notes.md + rubric-memo.md 並刪除若干已被吸收的觀察。回答 'yes, bump' 才執行。"
用戶確認後:
5a. 更新 rubric_notes.md(只放通用語言,不含樣本名 / 實績)
- 頂部 metadata 更新:
**當前版本**: vN+1
**Last bumped at**: <ISO 8601>
**Upgrade memos**: 見 [rubric-memo.md](rubric-memo.md)(指針,不復制 Memo 內容)
- 版本速查表加一行(只含版本號 + 公式簽名,不含證據樣本)
- 更新"當前評分維度"段(按提議增刪維度)
- 派生證據段 如新維度需要錨點解釋 → 用通用語言:
- ✅ 允許:「派生證據:集成風險高的樣本 → IR 偏差大 → 低 K%」
- ❌ 禁止:「派生證據:「pdf2excel」IR=2 → 實際 K%=35%」(樣本名 + 實績數字)
- 命中違禁 pattern → 把該段抽到 rubric-memo.md,原位用通用語言替代
5b. 寫 Memo 到 rubric-memo.md(append 模式,不覆蓋歷史)
按 bump-validation-protocol.md Step 5 格式 append 一段 Memo 到文件末尾:
- 觸發觀察(含真實觀察 ID)
- 證據數據(校準池重打表 + 排序對照,含真實樣本名 + 實績)
- 派生證據(含真實樣本名 + 實績)
- 診斷
- 新公式
- 跨模型審核結論引用(含模型名 + 判定 + 理由摘錄)
- 已知局限
絕不覆蓋 rubric-memo.md 已有內容——bump memo 按時間順序累積。
在 rubric_notes.md 內執行(不動 rubric-memo.md):
- 已被吸收為新維度的觀察 → 刪
- 被新數據推翻的觀察 → 刪
- 仍未解決的觀察 → 遷移到新版本"待驗證假設"段
- 已被驗證的"規律"→ 移到"規律沉淀區"
5d. 整理 + 自檢
- 重新讀
rubric_notes.md 全文,確保讀者能在 60 秒內理解當下規則——超出 600 行觸發額外清算
- 自檢 leak guard:對
rubric_notes.md 跑 grep -E '實際|實績|K%=|RW%=|Q=|留存' → 如有命中 → abort bump + 回滾,提示用戶"rubric_notes.md 寫入了違禁內容(實績 / 結果數字)"。這些內容應在 rubric-memo.md,不在 rubric_notes.md
Phase 6: 校準樣本批量更新
對每個校準樣本的 prediction 文件,底部追加(不動預測段、不動復盤段):
---
**Re-scored under v1 on 2026-05-29**: composite=3.20 → 4.15 (blind: true)
(rubric bump 時全量重算,由 cheat-score-blind sub-agent 獨立打分;詳見 rubric-memo.md 的 v0 → v1 升級 Memo)
blind: true 字段必填——告訴未來讀這條記錄的人"這是 channel B 隔離打分,不是主 Claude 自評"。
Phase 7: 更新 state file
{
"rubric_version": "v1",
"last_bump_at": "<ISO timestamp>",
"last_bump_self_audited": false,
"consecutive_directional_errors": [],
"calibration_samples_at_last_bump": "<current value>"
}
清空 consecutive_directional_errors——新 rubric 重新計數。
Phase 8: 控制台報告
✅ Rubric 已升級 v0 → v1
變化:
- LV ×1.0 → ×1.5
- CO ×1.0 → ×1.5
- IR ×1.0 → ×2.0
- 新增 DX ×1.0
- 刪除 TS
校準池重打:5/5 通過排序檢查(4/5 一致 + 0 pairwise 回歸)
跨模型審核:✅ PASS
Cleanup pass:刪除觀察 B 和 C(已吸收為 IR 重定義和 DX 維度)
下一篇預測起按 v1 公式打分。
所有歷史預測文件已追加 Re-scored 標記。
Phase B:bucket-only 重校(輕量分支)
/cheat-bump --bucket-only
與完整 bump 的本質區別:bucket 邊界不是規則的一部分,是數據派生量。重新派生它不需要跨模型審核——派生算法是確定性的,沒有"判斷"成分。
B1: 讀實際結果分布
Glob predictions/*.md 中所有有完整復盤段且含實際結果的文件 → 按域讀對應實績:
| 域 | 讀取字段 |
|---|
ai-coding | 復盤段中的 actual_K(%) 和 actual_RW(%) |
daily-work | 復盤段中的 actual_Q(0-10) 和 actual_TR(時間比) |
daily-learning | 復盤段中的 actual_R(留存分 0-10) 和 actual_A(應用率 %) |
如果有效樣本數 < 3 → 提示用戶"樣本太少(N<3),bucket 重校意義有限。建議繼續積累樣本後再跑。是否仍繼續?"
B2: 派生新邊界(按樣本數自動選算法)
| 算法 | 適用 | 邊界派生方式 |
|---|
ratio(N=1-4) | 小樣本 | 最近 3 個樣本中位數 × {0.5 / 1 / 1.5} 作為低/中/高閾值 |
percentile(N≥5) | 中大樣本 | 實際分布 percentile {p30 / p60 / p85} 派生 3 檔邊界 |
--scheme 參數允許用戶顯式覆蓋默認。
以 ai-coding 為例(percentile 模式,N=8):
收集到的 actual_K%:35 / 45 / 55 / 62 / 68 / 72 / 78 / 85
p30 = 50%,p60 = 65%,p85 = 79%
新 K% 邊界:
- 低:< 50%(低留存,大量 rework)
- 中:50-65%
- 高:65-79%
- 極高:> 79%
收集到的 actual_RW%:15 / 20 / 25 / 28 / 33 / 38 / 42 / 55
p30 = 22%,p60 = 31%,p85 = 45%
新 RW% 邊界:
- 低:< 22%(幾乎不需要返工)
- 中:22-31%
- 高:31-45%
- 極高:> 45%
B3: 報告變化 + 用戶確認
bucket 重校(ai-coding 域,N=8 個樣本)
K% 邊界(舊 → 新):
- 低: < 40% → < 50%
- 中: 40-65% → 50-65%
- 高: 65-80% → 65-79%
- 極高: > 80% → > 79%
RW% 邊界(舊 → 新):
- 低: < 20% → < 22%
- 中: 20-35% → 22-31%
- 高: 35-50% → 31-45%
- 極高: > 50% → > 45%
派生說明:
- 算法:percentile(N=8 ≥ 5)
- 數據基礎:8 個 session 的實際結果
確認應用?(yes / no)
B4: 落地
用戶確認後:
- 編輯
rubric_notes.md 的 "Bucket 方案" 段,替換為新表
- 在
rubric_notes.md 的 bucket 段頂部追加一行變更記錄:v0 buckets recalibrated on YYYY-MM-DD: scheme=percentile, N=8 個樣本
- 不修改任何 prediction 文件——歷史預測的 bucket 標簽保持原樣
B5: 對未來預測的影響
下一次 /cheat-predict 起按新 bucket 邊界派生。歷史 prediction 文件里的 bucket 標簽不重算——bucket 是預測時的語義判斷,事後改寫會破壞盲度。
Phase B 不做的事
- 不重打 composite(公式沒變)
- 不重新審核觀察段(rubric 沒變)
- 不調跨模型審核(確定性派生無需判斷)
Key Rules
- 5 步不可跳(僅完整 rubric bump)。任何"先簡化跑一下"的請求都拒絕
- THRESHOLD 寫死(僅完整 rubric bump)。不允許動態調整
- 跨模型審核是默認(僅完整 rubric bump)。關閉審核需要在 state file 顯式標記
- cleanup pass 是 bump 的一部分(僅完整 rubric bump)。不允許 bump 完不清理觀察段
- REQUIRE_CONFIRM(兩種模式都要)。最後落地前必須用戶明確說 "yes, bump" 或 "yes, recalibrate"
- bucket 重校不動歷史預測。bucket 是預測時語義,事後改寫破壞盲度
Refusals
- 「跳過校準池重打,直接換公式」 → 拒絕
- 「跳過 cheat-score-blind sub-agent,主 Claude 直接重打就行」 → 拒絕。bump 不接受任何 self-scored fallback——sub-agent 不可用 → abort bump
- 「跳過外部 LLM 審核」 → 僅當
CROSS_MODEL_AUDIT=false 顯式設置
- 「這次 THRESHOLD 調到 3/5 讓它過」 → 拒絕。改 THRESHOLD 是元層級 bump
- 「保留所有舊觀察作為歷史」 → 違反原則 #3
- 「先 bump,cleanup 下次再做」 → 拒絕。cleanup 是 bump 的一部分
- 「只重算 composite 不重打 dim」 → 拒絕。新權重 × 舊 dim 仍是舊污染
- 「把 Memo 全文寫進 rubric_notes.md 頂部,方便我讀」 → 拒絕。rubric_notes.md 是 blind sub-agent 白名單——含樣本名 / 實績 → 通過白名單泄漏。Memo 寫 rubric-memo.md,rubric_notes.md 只放公式 + 通用語言
Integration
- 上游:
/cheat-retro 檢測到 ≥3 同向偏差 → 提議跑 /cheat-bump
- 依賴:
mcp__llm-chat__chat(如配置)+ Task tool(spawn cheat-score-blind)
- 修改:
rubric_notes.md(結構性更新,絕不寫真實樣本名 / 實績)
rubric-memo.md(append——含完整證據 + 派生證據)
- 所有
predictions/*.md(追加 Re-scored 行,不動預測段)
.cheat-state.json
- 下游:下一篇
/cheat-predict 自動按新 rubric_version 打分