mcpField
J
justify

justify

github.com/atholaテスト・品質34377 回インストール1 日前に更新
リポジトリ

justify について

完了したコード変更を監査し、コード追加に偏った変更を見つけて、それぞれの根拠を求めるスキルです。テストロジックや設計上の不変条件、変更を裏付ける証拠も確認します。

主な機能

  1. 01追加バイアスのスコアとゾーン算出
  2. 02テストロジックの変更確認
  3. 03変更の必要性と最小性の評価
  4. 04設計上の不変条件との衝突検出
  5. 05変更ごとの根拠レポート作成
  6. 06設計上のトレードオフ記録

活用シーン

  1. 01コミット前の実装変更レビュー
  2. 02プルリクエスト前のテスト変更確認
  3. 03新しい抽象化や互換レイヤーの必要性評価

インストール

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

$npx skills add https://github.com/athola/claude-night-market --skill justify

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

詳細

問題を解決する最もシンプルな変更が、 マージするうえで最も安全な変更です。 コードを追加するのは簡単です。コードの必要性をなくすのが エンジニアリングです。

正当化

追加バイアスの問題

AI モデルは役に立つように訓練されているため、 根本原因を修正するよりもコードを追加する方向へ 体系的に偏りが生じます。

AI のデフォルトの動作正しい動作
回避策を追加する根本原因を修正する
テストの期待値を変更する実装を修正する
新しいヘルパーを作成する既存のものを使う
エラー処理を追加するエラーを防ぐ
互換性シムを追加する古いコードを削除する
try/catch で囲む例外の発生源を修正する

このスキルは、変更にこうしたパターンがないか監査し、 それぞれについて明示的な正当化を求めます。

使用するタイミング

  • 実装作業を完了した後
  • コミットまたは PR の作成前
  • 自分の変更の品質を確認するとき
  • scope-guard フラグが RED/YELLOW ゾーンを示しているとき

使用しないタイミング

  • コードを書く前。この監査の対象はすでに完了した作業です( imbue:karpathy-principles を使用してください)
  • 機能がスコープに含まれるかを判断するとき(imbue:scope-guard を使用してください)

監査プロトコル

ステップ 1:差分を収集する
# Determine base branch
base=$(git merge-base master HEAD 2>/dev/null \
  || git merge-base main HEAD 2>/dev/null)

# Get change statistics
git diff "$base" --stat
git diff "$base" --shortstat
git diff "$base" --diff-filter=A --name-only  # new files
git diff "$base" --diff-filter=M --name-only  # modified files
git diff "$base" --diff-filter=D --name-only  # deleted files
ステップ 2:追加バイアススコアを算出する

各項目を 0~3 で評価します(0 = 問題なし、3 = バイアスが強い)。

指標重み測定方法
行数比2xadditions / max(deletions, 1)
新規ファイル2x--diff-filter=A の件数
テストロジックの変更3xテストのアサーション/期待値の差分
新しい抽象化1x新しいクラス、関数、モジュール
回避策のパターン2x追加された Try/catch、if/else のガード

行数比のスコア:

比率スコア解釈
< 2:10バランスの取れた変更
2:1 to 5:11追加の傾向がややある
5:1 to 10:12追加バイアスの可能性が高い
> 10:13追加バイアスが強い

合計スコア:

bias_score = sum(signal_score * weight) / sum(weights)
合計ゾーン対応
0.0 - 0.5GREEN続行する
0.5 - 1.5YELLOW各指標を正当化する
1.5 - 2.5REDアプローチを再考する
2.5+STOPアプローチが誤っている可能性が高い
ステップ 3:鉄則への準拠を確認する

鉄則とは、テストが実装を導くのであって、 その逆ではないということです。違反がないか確認します。

# Find test files that were modified
git diff "$base" --name-only | rg "test_|_test\.|spec\." \
  || git diff "$base" --name-only | grep -E "test_|_test\.|spec\."

# For each modified test file, check what changed
git diff "$base" -- <test_file> | rg "^[-+].*assert|^[-+].*expect|^[-+].*should"

違反パターン(テストロジックが改変されている):

  • アサーション値が変更されている(期待される出力が変更されている)
  • テストケースが削除またはコメントアウトされている
  • @skip または @pytest.mark.skip が追加されている
  • エラーの期待値が弱められている(広範な例外型)
  • 新しい動作に合わせてモックの戻り値が変更されている
  • 元の動作を表さなくなるようにテスト名が変更されている

違反ごとに明示的な正当化が必要です:

「このテストのアサーションを変更したのは、 実装が元の要件を満たせなかったからではなく、 要件が変わったからです。」

要件が変わっていないなら、テストを変更してはいけません。 代わりに実装を修正してください。

ステップ 4:最小限の介入を分析する

変更したファイルごとに、次の質問に答えます。

  1. この変更は必要でしたか? このファイルに手を加えずに目標を達成できませんでしたか?

  2. これが最小限の変更でしたか? 同じ結果を、より少ない行数で実現できませんでしたか?

  3. この変更は複雑さを増やしましたか、それとも減らしましたか? 新しい関数、クラス、制御フローは複雑さの追加にあたり、 正当化が必要です。

  4. 削除を優先する代替案はありますか? コードを追加するのではなく、削除することで問題を 解決できませんでしたか?

ステップ 4.5:不変条件への影響分析

変更が最小限でも、基盤となる設計上の決定を ひそかに変更してしまうと、致命的な誤りに なり得ます。変更したファイルごとに、設計上の 不変条件に触れていないか確認してください。

不変条件に該当するもの:

  • アーキテクチャパターン(モジュールの境界、レイヤーの 分離、データフローの方向)
  • データ構造の選択(リストではなくマップを使う理由、 正規化ではなく非正規化にする理由)
  • API コントラクト(公開インターフェース、プロトコル形式)
  • エラー処理の方針(即時終了と復旧のどちらを選ぶか)
  • 並行処理モデル(シングルスレッドを前提とするか、 アクターモデル、共有なし)

検出のヒューリスティック:

# Check for structural changes (new modules, moved
# boundaries, changed interfaces)
git diff "$base" --name-only | rg "(interface|abstract|base|core|types|schema|model)" \
  || git diff "$base" --name-only | grep -E "(interface|abstract|base|core|types|schema|model)"

# Check for pattern-breaking changes
git diff "$base" -U5 | rg "(TODO.*refactor|HACK|WORKAROUND|XXX)" \
  || git diff "$base" -U5 | grep -E "(TODO.*refactor|HACK|WORKAROUND|XXX)"

不変条件との衝突が検出された場合:

解決策をひそかに選んではいけません。人間に 次の 3 つの選択肢を提示してください。

選択肢説明適切な場合
維持する機能を追加しない。不変条件が多くの利点をもたらす不変条件によって多くのことが単純化され、機能の重要性が低い
重ねる洗練されていなくても、その上に機能を追加する機能が必要で、不変条件にも価値があり、不完全さを許容できる
改訂する不変条件そのものを変更する新たな知見によって当初の決定が無効になった

正当化レポートに追加する内容:

### Invariant Impact: NONE / DETECTED

[If DETECTED:]
- **Invariant**: [name the design decision]
- **Conflict**: [what change clashes with it]
- **Option chosen**: Preserve / Layer / Revise
- **Justification**: [why this option, not the others]
- **Human reviewed**: YES / NO — if NO, flag as
  requiring review before merge

リスク増大への警告: 不適切な不変条件の決定は 積み重なります。このブランチで複数の不変条件を 改訂している場合は、ブランチ全体をアーキテクチャ レビューの対象として提示してください。不変条件を ひそかに変更するたびに、救済不能なコードベースに なる確率が高まります。

ステップ 5:正当化レポートを生成する

次の構成でレポートを出力します。

## Justification Report

**Branch**: feature/xyz
**Base**: master
**Delta**: +N/-M lines, X files changed

### Additive Bias Score: X.X (ZONE)

| Signal | Score | Detail |
|--------|-------|--------|
| Line ratio | N | +A/-D = R:1 |
| New files | N | [list] |
| Test changes | N | [list] |
| New abstractions | N | [list] |
| Workarounds | N | [list] |

### Iron Law Compliance: PASS/FAIL

[List any test logic modifications with justification]

### Change-by-Change Justification

#### file.py (+N/-M)
- **What**: [description]
- **Why**: [root cause this addresses]
- **Alternatives considered**: [what else could work]
- **Why this is minimal**: [why fewer changes won't work]

#### test_file.py (+N/-M)
- **What**: [description]
- **Justification**: [why test logic changed, if it did]
- **Iron Law status**: PASS/VIOLATION

### Risk Assessment

| Factor | Rating |
|--------|--------|
| Lines changed | LOW/MED/HIGH |
| Files touched | LOW/MED/HIGH |
| Test modifications | NONE/JUSTIFIED/VIOLATION |
| New abstractions | NONE/JUSTIFIED/UNNECESSARY |
| Overall merge risk | LOW/MED/HIGH |

### Recommendations

[List any changes that should be reconsidered,
simpler alternatives, or unnecessary additions]

判断の重み付け

複数のアプローチを評価するときは、次の要素を 重視してください。

要素重み根拠
変更行数が少ないHIGHリスクが低く、レビューしやすい
新しいファイルがないHIGH新たな保守負担が生じない
テストロジックを変更しないHIGH鉄則を順守できる
根本原因を修正するHIGH再発を防げる
コードを削除するBONUS保守対象を減らせる
抽象化を追加するPENALTY3 回目の使用時にのみ正当化される
エラー処理を追加するNEUTRALシステム境界でのみ追加する

差し引きテスト:変更を受け入れる前に、 「コードを 追加 する代わりに 削除 して、 これを実現できないか」と確認してください。可能であれば、 差し引くアプローチを優先してください。

作業証明との統合

Justify は変更レベルの説明責任によって、 作業証明を拡張します。

  • proof-of-work:「動作したか?」(証拠)
  • justify:「この方法は適切だったか?」(理由付け)

作業の完了を宣言する前に、両方が必要です。 まず proof-of-work を実行し、その後 justify を実行してください。

指摘すべきアンチパターン

1. テストの改変

壊れたコードに合わせてテストの期待値を変更すること。 修正:テストの変更を元に戻し、実装を修正してください。

2. ショットガン追加

単一の懸念に対する修正のために、多数のファイルへ コードを追加すること。 修正:変更箇所を 1 か所に絞ってください。

3. 防御的な過剰設計

実際には起こり得ない状況に対して、try/catch、 null チェック、検証を追加すること。 修正:内部コードを信頼してください。境界でのみ検証してください。

4. 時期尚早な抽象化

1 つのユースケースのために、ヘルパー、ユーティリティ、 基底クラスを作成すること。 修正:コードをインライン化してください。3 回目の使用時に抽象化してください。

5. 互換性シム

呼び出し元を更新する代わりに、後方互換性のための コードを追加すること。 修正:呼び出し元を直接更新してください。使われなくなった経路は削除してください。

6. 不変条件のひそかな改訂

設計上の不変条件を改訂していることを明示せずに、 アーキテクチャパターン、データ構造の選択、または API コントラクトを変更すること。 修正:不変条件を明示してください。3 つの選択肢 (維持する、重ねる、改訂する)を人間に提示してください。 判断を自分だけで下してはいけません。モデルは学習データの 「平均」に偏り、不適切な不変条件の決定は積み重なり、 救済不能なコードベースにつながります。

精査のための質問(leyline:additive-bias-defense より)

変更を正当化する前に、以下の質問を適用してください。 質問 4 と 5 への回答が具体的な 証拠でない場合、その変更は正当化されません。

  1. 優先事項との整合性:現在の優先事項から 外れていますか?
  2. 重要性:この時点で実装することが重要ですか?
  3. シンプルさ:よりシンプルで洗練された 解決策はありますか?
  4. 証拠:これが必要であることを示す証拠は何ですか (単なる想定ではなく)?
  5. 結果:これを追加しない場合、何が壊れますか?

証明責任の転換

初期姿勢は、この追加は存在すべきではないです。変更の必要性を証明するのは変更側であり、査読者が不要であることを証明するのではありません。

正当化レポート(ステップ 5)を作成する際、Burden of Proof セクションを追加してください。

変更精査の質問 4 への回答精査の質問 5 への回答判定
file.py[証拠][結果]justified/needs_evidence/unjustified

判定が unjustified の変更は、レポートが合格する前に必ず削除するか、やり直す必要があります。

トレードオフを記録する(判断ジャーナル)

このステップで現実的な選択肢を伴う判断が確定した場合、理由が明確なうちに(ドラフトを作成して確認したうえで)docs/tradeoffs.md に記録してください。

  • leyline がインストールされている場合は、Skill(leyline:decision-journal) を呼び出してトレードオフの項目(判断、検討した選択肢、断念したこと)を追記し、phase を review に設定します。ドラフトを提示し、確認後に追記してください。
  • フォールバック(leyline がない場合):ファイル内の ENTRY TEMPLATE を使って docs/tradeoffs.md に追記し、次の TR-NNN ID を割り当ててください。

賢明な助言

今行っていることは、優先事項から外れていませんか? この時点で実装することが重要ですか? AI や最初に思いついた考えに頼りすぎないでください。 さらに良くなるよう自分自身に問いかけ、より洗練された実装や よりシンプルな解決策を考えてください。

終了条件

  • 加算的バイアススコアが計算され、そのゾーン(GREEN/YELLOW/RED/STOP)が報告されている。
  • 鉄則への準拠が PASS または FAIL として示され、テストロジックを変更した場合はその理由が説明されている。
  • すべての変更に判定(justified、needs_evidence、unjustified)が付いている。最終レポートに unjustified の判定が残っていない。
  • 不変条件との競合が検出された場合、選択した選択肢と人間によるレビューのフラグが明示されている。
  • 正当化された重要な追加が、レポートの合格前に docs/tradeoffs.md(またはファイル内のテンプレート)に記録されている。

関連スキル

  • imbue:karpathy-principles — 「Surgical Changes」と 「Goal-Driven Execution」の原則は、より高次の統合から この監査を呼び出します。
  • leyline:additive-bias-defense — この監査が詳細に適用する 契約です。
  • imbue:proof-of-work — この監査を補完する検証レイヤーです (proof-of-work が「動作したか」を問うのに対し、 justify は「存在する必要があったか」を問います)。
  • ゲートスキルの連携グラフ全体については、 docs/quality-gates.md#skill-level-quality-gate-composition を参照してください。

コメント