mcpField
H
hard-cheese

hard-cheese

github.com/paulnsorensenテスト・品質19657 回インストール6 日前に更新
リポジトリ

hard-cheese について

hard-cheese はコードレビュー前に変更の説明を求め、SOLO スコアの基準で理解度を評価するスキルです。試行をローカルの監査記録に追記し、単独または `/plate --hard` のフローで実行できます。

主な機能

  1. 01レビュー前の変更理解チェック
  2. 02SOLO 採点と再試行上限
  3. 03差分の注目箇所に沿った質問
  4. 04ローカルへの試行記録の追記
  5. 05判定を省くログモード

活用シーン

  1. 01プルリクエスト前の変更理解の確認
  2. 02判定できない場合の説明の記録

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/paulnsorensen/easy-cheese --skill hard-cheese

インストール後、Claude Code で/hard-cheeseを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

wedge.toml
references/
commands.md
composition.md
judge-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} はホスト環境のフォールバックとしてのみ任意で使用できます。 引き継ぎブロックは移植可能な契約を定義します。スラッシュコマンドはホストごとの表現であり、制御モデルではないためです。

フロー

  1. スコープを解決します。

    • diff_base = origin/main、diff_head = <short-sha of HEAD> を設定します。
    • .cheese/specs/<slug>.md が存在する場合は、任意の意図参照として読み込みます。差分を唯一の信頼できる情報源とします。
    • slug がない場合は、HEAD の短縮 SHA を使用します。
    • origin/main との比較で差分が空の場合は、"nothing to gate on" を添えて 0 を返します。成果物は書き込みません。
  2. 鮮度を確認します。 ゲートを実行する前に、鮮度チェックを実行します。

    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 です。

  3. ハンクに順位を付けてから、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 以外のステータスで終了します。

  4. ユーザーの説明を自由記述として記録します。助言や回答例を提示しないでください。説明がテスト対象の成果物です。

  5. 新しいコンテキストで judge サブエージェントを開始します。 /cook のファン経路と同じパターンを使用します。

    • システムプロンプトとして references/judge-prompt.md を使用します。
    • 合格スコア、差分の要約、任意の仕様の抜粋、rank-hunks の targets JSON、ユーザーの説明を渡します。
    • 次の JSON オブジェクトを必須とします:{score, level, pass, feedback, socratic_qs, targets_addressed}。

    システムプロンプトと出力形式の詳細については、references/judge-prompt.md を参照してください。

    ユーザーが --no-judge を指定した場合は、このステップをスキップします。試行を status: LOGGED として記録し、成果物を書き込んで 0 を返します。

  6. 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>"
    
  7. 上限に達した場合の処理を行います。 成果物の 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 を使用します。
  • ジャッジに差分の概要、任意の仕様抜粋、targets JSON、説明を渡します。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. を含めてください。

優先するツールと代替手段

必要な作業優先する手段代替手段
ユーザー向けの要約に使う差分の確認deltagit 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 ブロックが含まれます。

コメント