◉ANTIGRAVITY LABEN
記事一覧/Agents & Manager
◈ Agents & Manager/2026-10-24上級

pipefail を足したら、通るはずの検査が赤になりました。出力が 8 KB を超えた日から起きる誤検知と、終了コードの確かめ方

pipefail を足すと、通るはずの検査が赤になることがあります。出力が 8 KB を超えると起きる誤検知を 1,122 本のリポジトリで再現し、ファイル経由の実行ラッパーとカナリアまでを残します。

Antigravity398bash3終了コードpipefail事前点検エージェント運用19

✦ プレミアム記事

前に書いた記事で、パイプが失敗を消す話をしました。処方として挙げたのは set -o pipefail です。

その処方を、自分のサイトのフロントマター検査に当てて、もう一度確かめ直しました。すると、効くはずの薬が、別の症状を起こす条件が見つかりました。

欠陥が 1 件もないリポジトリで、検査が赤になるのです。しかも、検査の中身は何も変えていません。変わったのは、出力の量だけでした。

パイプ越しの終了コードには、失敗を隠す向きと、成功を失敗に変える向きの 2 つの誤りがあります。 前者は有名ですが、後者は対象が増えた日に突然現れるので、気づきにくいと感じました。測った数字と、直した実行ラッパーの全文を残します。

検査スクリプトと、確かめた環境

対象は、個人開発で運営しているこのサイトの日本語記事 1,122 本の MDX です。フロントマターの level の綴り、slug のピリオド、highlights の未クォートのコロン。この 3 つを見ます。どれも、本番で 404 や 500 になる実害のある項目です。

最初に、検査スクリプトの全文です。

#!/usr/bin/env python3
"""MDX フロントマター検査。違反があれば 1 件ずつ出力し、終了コード 1 で終わる。
検査対象が 0 件のときは「何も見ていない緑」を避けるため、終了コード 2 で止める。"""
import re
import sys
import pathlib
 
LEVELS = {"beginner", "intermediate", "advanced"}
 
args = [a for a in sys.argv[1:] if not a.startswith("-")]
verbose = "-v" in sys.argv
root = pathlib.Path(args[0])
files = sorted(root.rglob("*.mdx"))
if not files:
    print(f"NOFILES {root}")
    sys.exit(2)
 
bad = 0
for p in files:
    text = p.read_text(encoding="utf-8")
    m = re.match(r"^---\n(.*?)\n---\n", text, re.S)
    if not m:
        print(f"NOFM  {p}")
        bad += 1
        continue
    fm = m.group(1)
    if verbose:
        print(f"OK    {p}")
    lv = re.search(r'^level:\s*"?([a-z]+)"?', fm, re.M)
    if not lv or lv.group(1) not in LEVELS:
        print(f"LEVEL {p}")
        bad += 1
    sl = re.search(r'^slug:\s*"([^"]+)"', fm, re.M)
    if sl and "." in sl.group(1):
        print(f"SLUG  {p}  ({sl.group(1)})")
        bad += 1
    for h in re.findall(r'^  - ([^"\n][^\n]*:\s[^\n]*)$', fm, re.M):
        print(f"COLON {p}  ({h[:30]})")
        bad += 1
 
print(f"checked={len(files)} violations={bad}")
sys.exit(1 if bad else 0)

終了コードは 3 種類です。違反があれば 1、対象のファイルが 1 本もなければ 2、問題なければ 0 です。

2 を足したのは、空のディレクトリを渡したときに「違反 0 件」で緑になってしまうからです。実際に空のディレクトリで走らせると、NOFILES と出て終了コード 2 で止まります。何も見ていない緑は、赤より危ないと考えています。

項目値
シェルGNU bash 5.1.16
Python3.10.12
対象日本語記事 1,122 本(実リポジトリのコピー)
実リポジトリの結果checked=1122 violations=0(終了コード 0)
所要時間0.13 秒(5 回とも同じ)

欠陥を 3 件入れて、五通りの呼び出しを比べました

実リポジトリは欠陥ゼロなので、そのままでは検査が赤になる場面を見られません。コピーしたディレクトリの 3 本に、わざと欠陥を入れました。level を intermediat に、slug の末尾に .v2 を、highlights の先頭に 手順: を足しています。

同じコピーに対して、呼び出し方だけを変えた結果が次の表です。

呼び出し方終了コード判定
そのまま実行1伝わる
末尾を tail -1 で絞る0消える
同上のあとに PIPESTATUS を読む1 と 0読めば伝わる
set -o pipefail を付けて tail -11伝わる
tail -1 || true0消える(意図して消した形)

ここまでは、前の記事のとおりです。違反が 3 件あるのに tail -1 の末尾だけを見ると、緑が返ります。pipefail を付ければ 1 に戻ります。

私自身、これで一件落着だと思いました。そのまま pipefail を足した形を、別の呼び出しにも広げようとして、つまずきました。

✦

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

この記事の続きを読む

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

この記事で得られること
✦パイプを挟んだ検査が「失敗を隠す」場合と「成功を失敗に変える」場合を、手元の数行で見分けられるようになります
✦検査の出力が増えた日に突然赤くなる誤検知を、原因を探し回る前に、ファイル経由の実行ラッパーで未然に防げるようになります
✦新しい検査を足すたびに、既知の不良を 1 件置いて必ず赤になるかを 1 コマンドで確かめ、緑という結果の信頼性を保てるようになります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

◈ Agents & Manager2026-10-22
引き継ぎ文書の古い参照は 17 件に見えて実際は 2 ファイルでした。本当に危なかったのは、別のサイトの手順書が混ざっていたことでした
エージェントに読ませるリポジトリ直下の .md を点検する Python スクリプトの全文です。素朴な版は壊れた参照を 17 件と数え、直すと 7 件、実体は 2 ファイル。別の問題が見つかるまでの過程を残します。
◈ Agents & Manager2026-08-07
変更したファイルからテストを選ばせたら、9 割が「該当なし」でした — import グラフで届く範囲を 3 リポジトリで測る
変更ファイル起点でテストを選ばせたところ、9割の変更で対象が0本になりました。import グラフの到達範囲を3つのリポジトリで実測し、バレルファイルが経路を広げる問題や、選択契約を組み直すまでの過程を、実測データを添えた記録としてまとめています。
◈ Agents & Manager2026-10-16
エージェントに .zip を渡す前に、.git を除いて 29 MB を 15 MB にし、秘密情報の警告 28 件を見分けました
Antigravity アプリ v2.23.0 で .zip を添付できるようになりました。自分のリポジトリを実際に固めて .git の重さと秘密情報検査の誤検知を数え、除外・検査・マニフェストを一度に行う Python スクリプトの全文を残します。