◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Claude Code
⟐ Claude Code/2026-07-03上級

Claude Code に大規模リファクタを任せたら本番だけ挙動が変わったとき — 暗黙の契約ドリフトを差分で計測する運用メモ

Claude Code に大きなリファクタを任せると、テストは緑なのに本番の挙動だけが静かにずれることがあります。例外経路・ログ形状・初期化順序・戻り値の形を署名として録り、コミットごとに差分で捕まえる契約ドリフト検出ハーネスの設計と実装をまとめました。

Claude Code265リファクタリング6契約テストオブザーバビリティ回帰検出

✦ プレミアム記事

Claude Code に「このモジュールを新しい構造に寄せて」と頼み、返ってきた差分をレビューして、テストも緑で、安心して本番に出したのに、数日後に運用側から「なんか挙動が変わっていませんか」と静かに言われる。この、単体テストの網をすり抜けてくる違和感こそ、大規模リファクタで一番怖いものだと感じています。

私自身、個人開発と複数の技術ブログの自動投稿基盤を長く回してきたのですが、後者のパイプラインをまるごと書き直したときに、まさにこれを踏みました。テストは全部通っているのに、公開処理の一部だけがサイレントに空振りし、数日気付かなかったのです。原因は「例外を握りつぶして既定値を返す」前提に周辺コードが依存していたのに、リファクタで素直に throw するようになっていたことでした。テストはその契約を検証していなかったので、緑のまま壊れていました。

この記事は、そういう「動くのに壊れている」を、テストとは別のレイヤーで捕まえるための道具立てです。中心になるのは、コードの観測可能な振る舞いを署名として録り、リファクタ前後で差分を取る「契約スナップショット」という考え方と、それをコミット単位で回すハーネスの実装です。

なぜ大きな diff は「動くのに壊れている」を隠すのか

Claude Code は賢いので、たいていのリファクタは動くコードを返してきます。問題は、差分が大きくなるほど「動いている」と「以前と同じ契約で動いている」の距離が開くことです。

ここで言う契約とは、型シグネチャのような明示的なものだけではありません。むしろ厄介なのは暗黙の契約のほうです。たとえば次のようなものが、コードのどこにも書かれないまま前提として機能しています。

暗黙の契約壊れたときに起きること
例外を投げるか、既定値を返すか呼び出し側の握りつぶし前提が崩れ、バッチが途中停止する
ログ行の構造(キーの並び・区切り)監視の正規表現が静かに外れ、アラートが鳴らなくなる
初期化・接続確立の順序アイドル時だけコネクションが枯渇するなど、負荷条件依存の障害になる
null と空値の区別、丸めの向き集計値がわずかにずれ、下流のしきい値判定が変わる

単体テストは戻り値の等価性を確かめるのは得意ですが、これらの「振る舞いの署名」までは普通カバーしていません。だからこそ、リファクタの前後で署名そのものを録って比較する層を、テストとは別に一枚差し込みます。これが契約スナップショットの発想です。

契約スナップショット — 何を署名にするか

契約スナップショットは、対象のコードパスを一連の代表シナリオ(プローブ)で叩き、その実行から観測できる振る舞いを構造化レコードに畳み込みます。戻り値だけでなく、「どの経路で結果が返ったか」を含めるのが肝です。

一つのプローブから録るレコードには、最低限このあたりを入れます。

  • 結果の値(正規化して比較可能にしたもの)
  • 結果が返ったチャネル(正常 return か、例外か。例外なら型名まで)
  • そのプローブ実行中に出たログ行の「形」(値ではなく、キー集合とレベルの並び)
  • 副作用の順序(DB 接続確立、外部呼び出しなどの発生順のラベル列)

値そのものではなく形を録るのがポイントです。たとえばログ本文のタイムスタンプや ID は毎回変わるので、そのまま比較すると差分だらけになります。キー集合とレベルの並びという「骨格」に落として署名化することで、監視が依存している構造が変わったときだけ差分が立つようにします。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦例外経路・ログ形状・初期化順序・戻り値の形を1レコードに畳んで署名化し、リファクタ前後で差分を取る契約スナップショットの設計
✦コミット単位でドリフトを検出し、pre-push フックと CI ゲートで止める Python 実装(そのまま使える完全なコード)
✦ドリフトが出たときに『戻す』か『契約を更新する』かを、系列の形と意図の有無で切り分ける判断基準
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⟐ Claude Code2026-04-18
Claude Code で技術的負債を3ヶ月で半減させた実践記録 — どこから手をつけ、どう効果を測るか
積み上がった技術的負債にClaude Codeで取り組んだ3ヶ月の記録です。負債の地図を数値で作る方法、緊急度×影響範囲での優先順位づけ、サブエージェントを使った安全な重複コード削減、循環依存の解消、週次ヘルスチェックの自動化、うまくいかなかった3つのことまで公開します。
⟐ Claude Code2026-10-15
日本語フォルダ名を守るはずのフックが、一度も止めてくれませんでした — Python の stdin が cp932 で読んでいた話
「経理」「議事録」などの日本語フォルダを守る PreToolUse フックが、Python の stdin 既定が cp932 の環境では素通りします。再現の手順と 3 行の直し方、確認用の 1 コマンドを書き残します。
⟐ Claude Code2026-10-14
onFailure を block にしても、jq が無い環境では公式例の rm -rf ブロックは素通りしました
PreToolUse の門番フックは、落ちたときに通すのか止めるのか。公式例を jq の無い環境で走らせると exit 0 で素通りしました。終了コード10通りの実測、直し方、settings.json を走査して素通りを洗い出すスクリプトをまとめます。