本文へスキップ
hdknr blog

沈黙する失敗(成功に見える失敗)

終了コード 0・出力あり・手元では正常に見えるのに中身が壊れている失敗。エラーを出さないため、コマンドの成否やファイルの有無で検証すると全部すり抜ける

概要

コマンドは通り、ファイルはでき、手元では正しく見えるのに、中身だけが壊れている種類の失敗。落ちてくれるバグはエージェントでも人間でもすぐ気づいて直すが、沈黙するバグは成果物が世に出るまで残る。「コマンドが成功した」「ファイルができた」「テストが緑だった」を完了の根拠にすると、この種の失敗は全部すり抜ける。

AI エージェントにパイプラインを任せるほど効いてくる。エージェントは終了コードとエラーメッセージを見て自己修正するので、エラーを出さない失敗はループの外側に残り続ける。

詳細

典型的な現れ方

領域沈黙の形何を見れば気づけたか
動画パイプライン(Video Use)ffmpeg が正常終了するが、音声トラックの取り違え・HDR タグ残留・24fps 固定・回転メタデータ誤判定・字幕のセーフゾーン侵入アップロード先での再生、ストリーム属性の ffprobe
ログ解析(Claude Code JSONL)他 CLI 向けパーサが .get() で受けて全行「該当なし」、出力 0 件で正常終了抽出件数のアサーション
Windows のファイアウォールSet-NetFirewallRule がエラーなしで値を変えない。規則は ActiveStore に載るのに効かない設定の読み直し、別マシンからのポート測定
VPN(WireGuard 中継)networkd がポリシールールを消してもトンネルは繋がり、EC2 のステータスチェックは正常カーネルに経路を直接問う(ip route get)
テスト到達不能なガードを消しても全テスト緑。壊れた変異が IndentationError で「落ちたテストなし=GREEN」に化けるミューテーション、returncode の確認
実機アプリ(Rokid AIUI)ドキュメントにある crypto が実機に無い。プレビューでは動く実機での確認

共通する構造

対策の型

  1. 件数をアサーションに入れる — assert matched > 0 の 1 行で「0 件成功」は例外に変わる
  2. 設定したら読み直す — 「成功した」は「効いた」ではない。値を書いたら同じ値を読み出して比べる
  3. 対照実験を用意する — 「通る条件」と「通らない条件」の両方を測り、差が出ることを確かめて初めて証明になる。片方だけでは何も言えない
  4. ポジティブコントロールを先に通す — 「検出されなかった」と言う前に、検出されるはずの対象で実際に検出されることを見る(ミューテーションテスト)
  5. 非交渉の規則を taste から切り離す — Video Use の SKILL.md は、外れると沈黙する失敗になる 12 項目だけを Hard Rules として「correctness」に分け、それ以外はエージェントの裁量に任せている
  6. 状態ではなく結果を問う — 設定値を並べて見るより、カーネルに「このパケットをどこへ出すか」を直接問うほうが確実。WireGuard ハブの故障は個別の設定値ではなくこの結果に現れた
  7. 自動修復しない — 黙って直すと同じ故障が再発しても誰も気づかない。検出してアラームを上げるところまでに留める

自分のワークフローに当てる問い

この工程が黙って間違った出力を出すとしたら、どこで、何を見れば気づけるのか。

この問いに答えられない工程は、「コマンドが通った=完了」で運用されている。

関連ページ

ソース記事