hard-cheese について
hard-cheese はコードレビュー前に変更の説明を求め、SOLO スコアの基準で理解度を評価するスキルです。試行をローカルの監査記録に追記し、単独または `/plate --hard` のフローで実行できます。
主な機能
- 01レビュー前の変更理解チェック
- 02SOLO 採点と再試行上限
- 03差分の注目箇所に沿った質問
- 04ローカルへの試行記録の追記
- 05判定を省くログモード
活用シーン
- 01プルリクエスト前の変更理解の確認
- 02判定できない場合の説明の記録
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ paulnsorensen/ easy-cheese --skill hard-cheeseインストール後、Claude Code で/hard-cheeseを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
wedge.tomlreferences/commands.mdcomposition.mdjudge-prompt.md詳細
/hard-cheese
このゲートは認識上の負債を減らします。この負債は、コードがチェックに合格していても、作成者がその内容を説明できない場合に発生します。
入力
/hard-cheese [<slug>] [--socratic-cap N=3] [--passing-score N=3] [--no-judge]
引数:
<slug>は.cheese/hard-cheese/<slug>.mdにある成果物を指定します。この引数は省略可能です。指定しない場合は、HEADの短縮 SHA を使用します。明示的に指定した slug は SHA より優先されます。--socratic-cap Nは最大リトライ回数を設定します。上限に達すると、ゲートは成果物をFAILEDとしてマークし、ゼロ以外のステータスを返します。デフォルトは3です。Vibecheck には上限がありませんが、easy-cheese では無限ループを防ぎます。--passing-score Nは PASS に必要な SOLO スコアの最低値を設定します。1から5までの値を指定してください。デフォルトは3です。ゲートは、この値を下回る以前の PASS を古いものとして扱います。--no-judgeはログのみのモードを有効にします。ユーザーの説明をstatus: LOGGEDとして記録します。judge サブエージェントは起動しません。このモードは、vibecheck のオプションの JSONL テレメトリーモードに相当する easy-cheese の機能です。より多くの内容を保持します。## 論文との相違点を参照してください。
呼び出しモード
| モード | ゲートの実行方法 | ゲートの位置 |
|---|---|---|
| standalone | ユーザーがプルリクエストの前に /hard-cheese <slug> を実行します。 | パイプラインの外部です。上流のスキルは必要ありません。 |
| propagated | /plate --hard が最終書き込みの後、公開の前に /hard-cheese <slug> を実行します。 | 検証済み成果物からレビュー用共有への境界です。 |
--hard は /cheese → /mold → /cook (⇄ /press) → /age → /cure → /plate に引き継がれます。/hard-cheese を実行するのは /plate だけです。
移植性の要件については、../cheese/references/harness-portability.md を参照してください。ヘルパーの解決、サブエージェントのディスパッチ、GitHub 操作、引き継ぎの遷移について説明しています。
まずバンドルまたはリポジトリのヘルパーを使用してください。${CLAUDE_SKILL_DIR} はホスト環境のフォールバックとしてのみ任意で使用できます。
引き継ぎブロックは移植可能な契約を定義します。スラッシュコマンドはホストごとの表現であり、制御モデルではないためです。
フロー
-
スコープを解決します。
diff_base = origin/main、diff_head = <short-sha of HEAD>を設定します。.cheese/specs/<slug>.mdが存在する場合は、任意の意図参照として読み込みます。差分を唯一の信頼できる情報源とします。- slug がない場合は、
HEADの短縮 SHA を使用します。 origin/mainとの比較で差分が空の場合は、"nothing to gate on"を添えて0を返します。成果物は書き込みません。
-
鮮度を確認します。 ゲートを実行する前に、鮮度チェックを実行します。
python3 skills/hard-cheese/scripts/hard-cheese.pyz freshness-check \ --slug <slug> --passing-score <n>このコマンドは JSON オブジェクトを 1 つ出力し、どの状態でも
0で終了します。stateフィールドを確認してください。previously_passedの場合は"previously passed"を出力して終了します。staleまたはnewの場合はステップ 3 に進みます。 終了ステータスが 0 以外の場合は入力エラーです。stderr の行はerrorとexit_codeを含む JSON です。HEADが変更された場合、または最後の PASS スコアが低すぎる場合、結果は stale です。 -
ハンクに順位を付けてから、vibecheck プロンプトを作成します。 Sankaranarayanan 2026 に忠実に従ってください。ゲートの実装を独立させるために「share for review」を使用します。
プロンプトを作成する前に
rank-hunksを実行します。python3 skills/hard-cheese/scripts/hard-cheese.pyz rank-hunks \ --base origin/main --head HEAD順位付けされた領域を差分の要約の横に、ハンクごとに 1 行で
path:start-end — reasonsの形式で表示します。順位付けされた各領域の変更行を、ほかのコンテキストより先に 80 行の差分要約に含めます。最初の試行の前に judge を呼び出してはいけません。これをレビュー用に共有する前に、この変更の目的を自分の言葉で説明してください。 はどのように動作しますか?なぜ期待する動作になるのですか?どの状態、制御フロー、または不変条件に依存していますか?強調表示された領域から始めてください。
プロンプトとともに差分の要約を表示します。
/plateの場合は、最終的な証拠もすべて表示します。- 最終的な成果物の一覧。
- 各
{target, backend, verified}完了行。 - 追跡対象の成果物の差分。
- 品質ゲートの結果。
/plateにこれら 4 つの値のいずれかが欠けている場合は、0 以外のステータスで終了します。完了行のverified: falseがある場合も、0 以外のステータスで終了します。 -
ユーザーの説明を自由記述として記録します。助言や回答例を提示しないでください。説明がテスト対象の成果物です。
-
新しいコンテキストで judge サブエージェントを開始します。
/cookのファン経路と同じパターンを使用します。- システムプロンプトとして
references/judge-prompt.mdを使用します。 - 合格スコア、差分の要約、任意の仕様の抜粋、
rank-hunksのtargetsJSON、ユーザーの説明を渡します。 - 次の JSON オブジェクトを必須とします:
{score, level, pass, feedback, socratic_qs, targets_addressed}。
システムプロンプトと出力形式の詳細については、
references/judge-prompt.mdを参照してください。ユーザーが
--no-judgeを指定した場合は、このステップをスキップします。試行をstatus: LOGGEDとして記録し、成果物を書き込んで0を返します。 - システムプロンプトとして
-
judge の結果を処理します。
score >= <passing-score>の場合、試行を PASS とします。score < <passing-score>の場合、試行を FAIL とします。ソクラテス式の質問を表示します。少なくとも 1 つの質問は、targets_addressedの順位付けされたハンクを参照する必要があります。targetsが空または存在しない場合は、参照要件をスキップし、targets_addressedが空であることを想定します。再試行が残っている場合はステップ 4 に戻ります。- judge が失敗した場合、試行を ERROR とします。警告を出力して
0を返します。## 論文との相違を参照してください。
試行行を追加します。
python3 skills/hard-cheese/scripts/hard-cheese.pyz append-attempt \ --slug <slug> --status <PASS|FAIL|ERROR> --score <n> \ --feedback "<judge feedback>" --explanation "<user explanation>" -
上限に達した場合の処理を行います。 成果物の
statusをFAILEDに設定します。成果物のパスを出力して、0 以外のステータスを返します。後続のチェーンは停止します。
成果物
.cheese/hard-cheese/<slug>.md に監査履歴が含まれます。.gitignore ファイルで .cheese/ を除外しているため、監査履歴はローカルに残ります。
各ファイルは次の YAML フロントマターブロックで始まります。
---
slug: <slug>
attribution: Sankaranarayanan 2026 / vibecheck
rubric: SOLO Taxonomy (1-5), pass threshold = <passing-score>
passing_score: <n>
divergence: fail-open on judge error (vibecheck fails closed)
diff_base: <sha>
diff_head: <short-sha>
status: PASS | FAIL | FAILED | LOGGED | ERROR
attempts: <n>
---
append-attempt は、次の 6 列の Markdown テーブルとして試行ログを書き込みます。
| timestamp | head_sha | status | score | feedback | explanation |
| --- | --- | --- | --- | --- | --- |
| 2026-06-25T10:00:00+00:00 | a1b2c3d | FAIL | 2 | "Unistructural: lists steps but no causal link" | <user explanation verbatim> |
| 2026-06-25T10:05:00+00:00 | a1b2c3d | PASS | 4 | "Relational: explains why invariant holds" | <user explanation verbatim> |
呼び出すたびに試行が追加され、既存の行は上書きされません。HEAD が変更された場合は、以前の行の下に新しい行を追加します。
サブエージェントの契約 — 新規ジャッジ
- 呼び出しごとに新しいコンテキストを使用します。 コード作成時のコンテキストがジャッジにバイアスを与える可能性があります。
- 共有エージェントリゾルバーを使用して、ツールを使わない、または読み取り専用の
reviewerをpowerfulのパワーとhighのエフォートで解決します。 - 共有リゾルバーは各 reviewer を
powerfulに固定します。ジャッジではこの値を下げないでください。 - 汎用ワーカーを使用する場合は、書き込みを禁止してください。
degraded: trueに設定します。 - システムプロンプトには
references/judge-prompt.mdを使用します。 - ジャッジに差分の概要、任意の仕様抜粋、
targetsJSON、説明を渡します。JSON での応答を必須とし、リポジトリへの書き込みを禁止します。 - JSON 出力を解析します。 解析エラーの場合は
ERRORの試行を記録し、フェイルオープンします。
このゲートには、ホストのサブエージェント機能が必要です。この機能がない場合は、説明を評価なしで記録するために /hard-cheese --no-judge を推奨します。
クレジット表記
Sankaranarayanan, S. (2026). Mitigating 'Epistemic Debt' in Generative AI-Scaffolded Novice Programming using Metacognitive Scripts. Proceedings of the 13th ACM Conference on Learning at Scale. https://arxiv.org/abs/2602.20206
この実装では、論文の著者によるオープンソースの VS Code 拡張機能を使用しています。
https://github.com/sreecharansankaranarayanan/vibecheck
この SKILL.md、references/judge-prompt.md、各アーティファクトにはクレジット表記が含まれています。これにより、引用が監査証跡とともに残ります。
論文との相違点
Hard-cheese には vibecheck との相違点が 3 つあります。
1. ジャッジのエラー。 Vibecheck はフェイルクローズします。ジャッジが復旧するか、ユーザーが再試行するまで、モーダルがコードの適用をブロックします。
Hard-cheese はフェイルオープンします。ゲートは ERROR を記録して警告を出力し、0 を返します。
このポリシーにより、API エラーがプルリクエストの作業を妨げることはありません。
2. テレメトリの内容。 Vibecheck は説明の長さを記録します。説明のテキストは記録しません。
Hard-cheese は、すべての説明の完全なテキストをローカルのアーティファクトに記録します。.gitignore ファイルで .cheese/ を除外するため、このテキストは作成者のマシン上に残ります。
--no-judge で最初の説明を記録する前に、このデータ保持についてユーザーに伝えてください。
3. プロンプトの文言。 Vibecheck のプロンプトでは、導入文なしで 3 つの質問を提示します。
Hard-cheese では、目的を先に示す導入文と、ランク付けされた領域への参照を追加します。論文の 3 つの質問は原文のままです。
新たな相違点は、その都度このセクションに追加してください。
--auto との併用
--hard と --auto は併用できます。ターミナルで /plate --hard を実行すると、公開前に一度だけ自動化が一時停止します。この時点で /plate は最終アーティファクトを検証済みです。
ユーザーはプロンプトに応答します。PASS の場合は公開できます。FAILED の場合は公開を停止します。ERROR の場合は、文書化されているフェイルオープンの動作を適用します。
コミットのみを行う /plate --hard では、ゲートは実行されません。この経路とは併用できません。新しいプルリクエストと非 TTY の動作については、references/composition.md を参照してください。
出力
ゲートが終了したら、次を出力します。
Hard-cheese artifact: .cheese/hard-cheese/<slug>.md
Status: PASS | FAILED | LOGGED | ERROR
Score: <n>/5 (<SOLO level>, pass ≥ <passing-score>)
Attempts: <n>
Score 行には、直近のジャッジ試行のスコアが表示されます。LOGGED モードの場合、またはスコア付き試行なしで ERROR になった場合は、この行を省略します。
続けて、該当するメッセージを 1 つ出力します。
- PASS の場合:
Ready to share for review. - FAILED の場合:
Cap exhausted. Improve understanding of the change before sharing. - LOGGED の場合:
Telemetry only — judge skipped via --no-judge. - ERROR の場合:エラーを特定する警告を 1 つ出力します。
Fail-open divergence active — gate exited 0; you may share for review at your discretion.を含めてください。
優先するツールと代替手段
| 必要な作業 | 優先する手段 | 代替手段 |
|---|---|---|
| ユーザー向けの要約に使う差分の確認 | delta | git diff --unified=3 |
| プロンプトに含めるハンクの順位付け | rank-hunks バンドルコマンド | なし — 順位付けされた領域を省略し、その不足を明記します |
| 仕様書の読み取り(存在する場合) | code-intelligence-routing.md に従った範囲限定のファイル読み取り | ホストのファイル読み取り |
| 判定役の起動 | ホストのサブエージェントプリミティブ(Agent() またはハーネスの同等機能) | なし — サブエージェントを起動できない場合は --no-judge モードで実行し、判定役を利用できないことをユーザーに伝えます |
| GitHub/PR のコンテキスト(ここでは対象外) | 該当なし | 該当なし |
ルール
- 判定役のサブエージェントは、新しいコンテキストで実行します。作成者の理解度を評価する際に、コード作成時のコンテキストを使用しないでください。
- 回答前にユーザーを誘導しないでください。説明そのものが評価対象です。
- FAIL の後は、判定役のソクラテス式の質問のみを表示します。ヒントは追加しないでください。
- 順位付けされた領域を表示し、最初の回答の前に質問やヒントを追加しないでください。
- ユーザーの説明は変更せずに判定役へ渡してください。
- 常に鮮度チェックを実行してください。
HEADが変わった場合は、新しい試行シーケンスが必要です。 - ERROR となったすべての試行を記録してください。判定役が失敗と判定するたびに警告を表示してください。
- GitHub ツールやプルリクエスト用ツールを呼び出さないでください。このゲートは、コードがレビューに入る前に動作します。
../age/references/voice.mdの共通ボイスルールを適用してください。結果を報告してください。残存リスクをcertain | speculating | don't knowに分類してください。- FAILED を「ほぼ合格」と表現しないでください。
参照資料
references/judge-prompt.mdでは、SOLO Taxonomy の評価基準、判定役のプロンプト、JSON 出力を定義します。references/composition.mdでは、--hardと--autoの完全な組み合わせを定義します。references/commands.mdには、生成されたバンドルコマンドが記載されています。
エージェントの解決
../cheese/references/agent-resolution.md を通じて、新しい判定役を解決します。
| 作業 | 優先する種類 | 権限/分離 | 最低限の能力 | 労力 | 代替手段 |
|---|---|---|---|---|---|
| 説明の評価 | レビュアー | ツール不使用または読み取り専用、新しいコンテキスト | 高性能 | 高 | 互換性のあるレビュアー、次に汎用 |
正規の hard-cheese 監査には、共通の agent_resolution ブロックが含まれます。