◉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-06-19上級

弾いたはずの記事が公開された — 品質ゲートと git push を同じ呼び出しにまとめた代償

無人運用の投稿パイプラインで、品質ゲートで弾いたはずの記事がそのまま公開されました。原因はゲートと git push を一つのシェル呼び出しに連結したことでした。終了コードが握りつぶされる仕組みと、公開マーカー方式で「通過を確認してからしか push しない」二段構えの実装を記録します。

Claude Code265自動化87運用設計28シェル3個人開発130

✦ プレミアム記事

ある朝、ログを見返していて血の気が引きました。前夜に品質ゲートが「違反あり」で止めたはずの記事が、本番に公開されていたのです。ゲートのログには確かに 🛑 違反検出 と出ている。なのに同じ実行の最後で git push が走り、記事はサイトに並んでいました。

原因はゲートそのものではありませんでした。私自身が、検証と公開を一つのシェル呼び出しにまとめて書いていたことでした。個人開発で複数サイトの投稿を無人化していると、こうした「シェルの終了コードの解釈」がそのまま事故になります。同じ轍を踏まないために、何が起きていたのか、どう組み直したのかを残します。

同じ呼び出しにまとめた瞬間に何が起きたか

問題のタスク本体は、おおよそこう書かれていました。

python3 article_gate.py "$JA" "$EN"; git push origin main

一見、上から順に「ゲート → push」で安全に見えます。けれど ; は前のコマンドの成否を一切見ません。ゲートが終了コード 1 で落ちても、シェルは何事もなかったかのように次の git push を実行します。つまりこの一行は、最初から「ゲートの結果に関わらず必ず push する」という意味だったのです。

無人実行では人間が途中のログを見て止める瞬間がありません。; で繋いだ時点で、検証は「実行されるだけで、何も守っていない飾り」になっていました。

; と && の違いと、最終終了コードしか残らないこと

まず ; を && に替えるだけで、この事故の大半は防げます。

# 危険: ゲートが落ちても push する
python3 article_gate.py "$JA" "$EN"; git push origin main
 
# まし: ゲートが成功した時だけ push する
python3 article_gate.py "$JA" "$EN" && git push origin main

&& は左側が終了コード 0(成功)のときだけ右側を実行します。ここまでは多くの方がご存じだと思います。

落とし穴は、エージェントやスケジューラがこの一行を「ひとつのコマンド」として扱い、最後の終了コードしか手元に残らないことです。a && b で a が失敗すれば全体は失敗扱いになりますが、a && b で a が成功して b(push)が失敗したときと、そもそも a で止まったときを、ログを読まずに区別できません。「成功/失敗」の一値しか観測できない実行系では、検証の判断を外側が受け取れないまま不可逆操作まで一息で進んでしまいます。だからこそ私は、&& で繋ぐだけでは足りないと考えています。

✦

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

この記事の続きを読む

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

この記事で得られること
✦検証コマンドと不可逆操作を同じ呼び出しに連結すると失敗が握りつぶされる仕組み(;・パイプ・コマンド置換・set -e の素通り)を、再現コードで切り分ける
✦set -euo pipefail と公開マーカー方式で「全ゲート通過を確認してからしか push しない」二段構えを組む実装
✦無人エージェント運用で『証拠を見てから不可逆操作』を強制する、検証と公開を別呼び出しに割る設計
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⟐ Claude Code2026-08-25
空白ひとつで、80件の検査が0件になる — 一括処理を任せる前に置くガード
空白を含むフォルダ名の下で走らせた検査ループが、80件のうち1件も開いていませんでした。断片が実在パスに化ける仕組みを実測で切り分け、削除を伴うバッチに置く件数アサーションまで書き残します。
⟐ Claude Code2026-08-04
ファイルシステムの分離をネットワークと別に締める — 触ったパスを採り、書き込み面から絞る
Claude Code v2.1.216 でファイルシステムの分離をネットワークと切り離して指定できるようになりました。締める前にジョブが触ったパスを strace で採取し、読み取り面と書き込み面を分けて測った実務メモ。同じジョブを3回走らせたときのパス集合の安定率と、接頭辞に畳んだときの安定率の差まで実測しています。
⟐ Claude Code2026-08-03
存在チェックが通っても書けない — 無人実行の前提を能力プローブで測る
ディレクトリが存在することと、そこへ書けることは別の問題です。無人で走るClaude Codeのセッションが静かに止まる原因を実測し、存在チェックの代わりに実際の読み書きを試す能力プローブ方式のプリフライトを設計しました。書けるのに消せない場所、静的な手掛かりが健全と答える落とし穴、シェル側の穴まで扱います。