# P28-01 collector task 指示(worker 向け) 仕様は `SPEC.md`(同じディレクトリ)です。この指示と SPEC.md は変更しないでください。 ## 作るもの(allowed_paths `docs/plans/original-completion-2026-10-02/execution/p28-01/collector/**` の中だけ) 1. **`collect_p28_01.py`**: r02 の `collect_perf.py` を基にした外部 collector です。 - 1版(main の現 source)だけを、私有の CoW stage に materialize します。 - import は1回だけ行い、その後に段階0と P1〜P4 を1つずつ実行します。 - `--check` は入力と予定の argv を検証して表示するだけで、stage も engine も作りません。 - `--run` は実測します。Root が実行します。 2. **`measure_p28_01.gd`**: windowed の main scene 用 probe です。 - 代表入力の読込は r02 と同じく `FileAccess.get_var(false)`、`initialize`、`restore_snapshot` で行います。保存は private user:// だけです。 - 速度は `main.gd::_set_speed` で設定し、`SimulationKernel._process` が進めるのを観測するだけにします。直接 advance を呼んではいけません。 - 計測は frame ごとに行います。 - stdout にちょうど1行 `P28_01_PERF_REPORT=` を出します。 3. **`check_p28_01_report.py`**: report と収集結果の checker です。合格の条件と、拒否すべき偽の report は下に示します。 4. **`test_collect_p28_01.py`**: 合成した入力だけで動く unittest です。engine も artifacts も不要にします。 ## 必須事項 - SPEC.md の §4 と C1〜C8 を、そのとおりに実装します。 - **checker が拒否すべきもの**(それぞれに対応する拒否試験を書く) - x3 が直接 advance で作られている(Clock の速度と frame の記録が一致しない) - 登録数を稼働数や描画数の欄に流用している - seed の欄に RNG state が入っている - GPU 時間が 0 で、理由がない - 必須の欄が欠けている - source map が変わっている - raw stdout と report が一致しない - PID が一致しない - **製品 source map の対象には触れません。** autoload、scripts、scenes、data、tests、assets、tools と、`project.godot`、`export_presets.cfg`、`Makefile`、`AGENTS.md` です。 - 予算の値、原30/88、受入分母は変えません。 - 次のことはしません。 - 全回帰 - native engine の起動(実測は Root が統合後に行います) - fixture の生成 - P14 の再調査 - 参照用の入力(r02 の `collect_perf.py`、`measure.gd`、`profile_guard.gd`、`run-r02/execution.json` と report)は、Root が `build/p28-01-readonly/` に読取専用で置きます。SHA は SPEC.md §3 のとおりです。それ以外の場所や、拒否されたパスにはアクセスしないでください。 - commit はしません(Runner が submit します)。最終出力には変更したファイルと、試験の実行結果をそのまま出します。 ## 検証 Runner の validation `p28-01-collector-unit` が `test_collect_p28_01.py` を実行します。そのあと、独立した Opus(claude-opus-5-5)が内容をレビューします。自己申告や終了コード0は、合格の証拠になりません。