# P28-02-DIAG worker 指示(段階A。P28-02-OPT の指示は、DIAG の後に別に作る) 仕様は同じディレクトリの `SPEC.md` です。この指示と仕様は変更しないでください。 - 作るもの(allowed_paths `docs/plans/original-completion-2026-10-02/execution/p28-02/diag/**` の中だけ): - `diag_p28_02.py`: Root が実行する driver です。統合済みの collector を読取専用で import します。import の閉包は、P28-01-RESTART の CLARIFICATION_02 D1 と同じ6ファイルと、自分の allowed_paths の中のファイルだけです。 - `diag_probe.gd`: SPEC §3 の probe です。 - `check_diag.py`: report の checker です。 - `verify_diag.py`: `--project-root .` で、`$BUILD_OUTPUT_DIR/p28-02-diag-evidence` にある実際の bundle(Root が作る)を結合します。bundle が無ければ失敗します。 - `test_diag.py`: engine を使わない unittest です。 - probe で必ず守ること(SPEC §3.1〜§3.3): - live の状態を変えてよいのは、fixture の導入と `advance_minutes(1)` だけです。hook や関数の差し替えは禁止です。 - 区間は tick の ID で結びつけた inclusive の wall 区間 I0〜I11 として記録し、純粋な handler の時間とは呼びません。observer の費用は別に記録し、差し引きません。 - 経路は `path_query_measured` の件数と時間だけを記録し、connector の費用とは呼びません。 - tick の外の内訳は、N=5 の独立した inclusive の計測です。合算して100%にしません。restore・save・load・validator は、使い捨ての scratch でだけ行います。作れない場合は、理由つきの未測定にします。 - 前後で live の全状態の `var_to_bytes` が一致すること、参照の漏れが無いことを確かめます。 - 正当に測れた 0 と、欠損による null を区別します。 - checker・verify・試験が拒否するもの: - 状態を変える呼出し、hook の差し替え(静的に検査する) - phase を分で誤って区切ること - inclusive の値を排他的な内訳として合算すること - query の時間を connector の費用と呼ぶこと - 欠損を 0 で補うこと - 前後の状態の不一致 - scratch からの参照の漏れ - PID、raw、source map の不一致 - bundle の欠落 - しないこと: 製品の変更、engine の起動、全回帰、commit。 - 提出前に、engine を使わない `python3 test_diag.py` を局所で実行して全件 PASS を確かめ、生出力を報告します。一時ディレクトリは `BUILD_OUTPUT_DIR` か `tempfile.gettempdir()` の下に作ります。 - 承認された範囲の中の通常の実装上の選択は、worker の判断でかまいません。決めきれない不足は、具体的な箇所を示した場合に限り blocked にします。