launchdの設定と実行中の実体を照合し、古いコピーへの乖離を見つける
今回やったこと
公開後レビューの理由欄が空になる事象を調べたところ、レビュー指示そのものより、実際に起動しているジョブが古い複製を参照していたことが原因として記録された。リポジトリ側では修正済みの規約が、実機の起動経路には届いていなかった。設定の正本を直しただけでは、実行中のジョブがその正本を読んでいるとは限らない。このずれを検出するため、リポジトリ内の起動経路と実機の設定を照合する launchd_reconcile.py に乖離検出が追加された。
素材として確認できたのは、候補キューの事象概要、scripts/launchd_reconcile.py、scripts/test_launchd_reconcile_wiring.py である。記録によると、実機のplistはリポジトリ外の複製を指し、そのコピーには新しい403除外規定がなく、「取得拒否の場合は作らない」という古い指示が残っていた。動いているプロンプトだけを見ても、なぜ期待した処理にならないのかは分かりにくい。起動設定から実際に参照するファイルまで追い、版の差を比較する必要があった。
「ファイルが直っている」と「ジョブが直っている」を分ける
この種の運用では、少なくとも二つの状態がある。リポジトリ上の設定が望ましい内容になっている状態と、実機のlaunchdジョブがそのファイルを読み込んでいる状態だ。前者だけを確認すると、別の場所に置かれた凍結コピーが動き続ける問題を見逃す。
| 確認対象 | 見るもの | 今回の記録 |
|---|---|---|
| リポジトリの正本 | 起動定義・指示ファイル | 修正済み規約が存在 |
| 実機の起動経路 | plistが指すファイル | リポジトリ外の複製を参照 |
| 実行時に読まれる内容 | 複製内の規約 | 古い指示が残存 |
| 自動照合 | launchd_reconcile.py | チェックアウト外参照を乖離として検出 |
照合前のstrict checkは乖離を報告して終了コード1、修正後は終了コード0になった。また、2機76ジョブを調べた結果、同型の乖離は1件だったという記録がある。この数は調査時点の範囲を示すもので、将来も同じ件数だと保証する数字ではない。テストファイルも追加され、起動経路の照合が機械で確認できるようになった。
検出結果を運用に結びつける
照合スクリプトを置くだけでは、乖離が直るわけではない。役割は、設定と実体の違いを見つけて、原因として扱える形で知らせることにある。今回の修正では、チェックアウト外を指す起動設定を原因として通知するようにした。これにより、「AIが指示を守らない」という見え方を、実際に読み込まれている指示の古さへ分解できる。
常駐ジョブを運用する場合、確認対象をリポジトリ内の設定ファイルだけに限定しない方がよい。plistのProgramArgumentsや参照パス、実行スクリプトがさらに読み込む設定ファイルまで追う。実機の実行結果を取れるなら、修正前後のstrict checkの状態も記録する。異常を検出した時の終了コードは、その監視ジョブ自身を恒久的な失敗状態にしない設計も必要になる。launchd_reconcile.py の先頭コメントには、未ロード検出と終了コードを分ける方針も記されている。
環境・バージョン
参照資料で具体的なmacOSバージョンやlaunchdバージョンは特定できない。確認できる範囲は、複数機のplistとリポジトリ内スクリプトを照合した実機検証、および対応テストの存在までである。
更新履歴
- 2026-10-02: 初稿