## 何を見つけたか `plugins/ndf/scripts` のログ出力と異常系の処理が統一されていない(2026-11-01、テストと実験版を除いて数えた)。 | 観点 | 実物 | | --- | --- | | 結果の JSON(`lib/step_result.py`) | 入口のスクリプト 37 本のうち 24 本が使う。hook の 3 本(`hook.py`・`hook-env.py`・`wait-notify.py`)を除く 10 本が外れる: `bundle-close.py`・`instructions-check.py`・`mission-close.py`・`mission-state.py`・`parallel-measure.py`・`phase-steps.py`・`refactor-scope.py`・`relay.py`・`usage-report.py`・`usage-subagent.py`(14 行の薄い入口は lib 側で出している可能性があり、1 本ずつ確かめる) | | 形の強制 | 全部の入口がこの形で返すことを確かめるテストは無い(`tests/test_step_result.py` は検査の関数だけ) | | ログ出力 | `logging` は 1 ファイル。`print(..., file=sys.stderr)` 52 ファイル、`sys.stderr.write` 5 ファイル、独自の `log()`/`info()` 4 つ(`relay_lib/record.py`・`relay_lib/run.py`・`hook_lib/wait_notify.py`・`lib/proc.py`) | | 終了の仕方 | `sys.exit(...)` の直書き 44 か所、`raise SystemExit` 11 か所 | | 例外 | `except Exception` 48 か所、`except` の直後が `pass` の箇所 49 か所(理由のコメントの有無が混ざる)。裸の `except:` は 0 | | シェル | 29 本のうち `set -euo pipefail` は 4 本、25 本は無し | ## 直さないと何が起きるか 外れた入口は、失敗を `status` で上位へ伝えられず、#2227 が防いだ「失敗を ok と読む」が残る。例外を捨てる箇所と `set -e` の無いシェルは、途中の失敗が表に出ないまま先へ進む余地がある。 ## 受け入れ条件 1. hook を除くすべての入口のスクリプトが `step_result` の形(`tool`・`status`・終了コード)で結果を返し、それをテストが入口の一覧から確かめる 2. 標準エラーへの診断の出力が共通の関数 1 つを通る(新しく足すスクリプトもそれを使う) 3. `except` の後に `pass` だけを置く箇所は、理由のコメントを持つか、例外を `stopped` として返す 4. シェルのスクリプトは `set -euo pipefail` を持つか、持たない理由をファイルの先頭に書く ## 由来 2026-11-01 の利用者の問い「ndf のスクリプト群では、ログ出力、異常系処理は統一されていますか?」への調査。親は #2335(異常系・ログ・回復を 1 つの実行の核へ集める)。
Activity