# P28-01-GATE 仕様(原 P28-01 whole-unit 受入ゲート、spec_ref の草案 r02) - 状態: 草案です。Root が原本の条件と受入を照合し、この文書を `docs/plans/original-completion-2026-10-02/execution/p28-01/gate/SPEC.md` として main に commit します。その実 SHA を base にしてから、通常の登録をします。数値や条件を独自に変えるものではありません。 - 前提: Desktop の計画(`P28-01_WHOLE_UNIT_GATE_PLAN_DESKTOP_233.md`、`bc222542…`)と、Root の対応表(`P28_WHOLE_UNIT_GATE_BINDING_FOLLOWUP_954528A.json`)を、現在の正式記録に合わせて具体化したものです。 ## 1. 原本の条件(変更しない) - 成果単位 P28-01「現HEADの性能基準」(`work_packages.json` の P28.remaining_deliverables[0]) - work: 実Runtimeの20,000マス・200客・50職員・150施設を基準にTick、経路、snapshot、描画、保存を測る。 - acceptance: 機種、ビルド、シード、速度、測定区間、平均・P95・最大を残す。 - P28 の横断条件6件(cross_cutting_acceptance の原文): 1. 原本条件とUI操作が一致 2. Runtimeの実利用・会計・行動へ接続 3. 途中保存・再起動で再現 4. 異常/境界/中断を検証 5. 関連回帰PASS 6. 要件別ログとソースハッシュを保存 - 分母は 30/88 で、部分点はありません。このゲートが完了した場合に限り、P28-01 を 22→23 とします。P28 パッケージは in_progress のままです。 ## 2. baseline(9件。原本の原文は G0 と G1〜G6 の7件。U1/U2 は証拠の品質を保つための補助) | id | 内容 | |---|---| | G0 | 原 work と原 acceptance(§1 の原文) | | G1〜G6 | 横断条件1〜6(§1 の原文) | | U1 | 未達と、実施していない分岐を、合格に数えずに開示する | | U2 | 再利用する各証拠が、それ自身の source・設定・engine・marker・入力・範囲に正確に適用できること(全証拠に共通の1つの入力を仮定しない) | U1 と U2 は原本の条件ではありません。「原本の9条件」として扱ってはいけません。 ## 3. 結合する証拠(path は repository からの相対。SHA256 は完全な値) Root は E1〜E7 の全ファイルを、bytes をそのまま `$BUILD_OUTPUT_DIR/p28-01-gate-evidence/` に読取専用で置きます。`docs/` の下のものは、validation の checkout から直接読みます。 **E1 collector の正式完了** - `docs/plans/original-completion-2026-10-02/execution/p28-01/COLLECTOR_FORMAL_COMPLETION_0F53A67.json` `2886547ae2ccd000a85cf8374304f292f85ed2899d9ebe9818833600dc9ff55f` - `docs/plans/original-completion-2026-10-02/execution/p28-01/COLLECTOR_INDEPENDENT_REVIEW_5DB97D7.json` `23eed6741996a7b9327fcceda2e852104315954105c9c09f0dfcdf35c88c8d41` - 検査: task が completed で、4つの gate がすべて pass。Q `0f53a67210227207efa63045de88a9a7c6e45409`。collector の4ファイル(`execution/p28-01/collector/*`)が、base の bytes と一致すること。 **E2 統合版の全9 phase(実際の commit は `db9d6132a8349928560dc4a4a99306d27a81e332`。新しい Q での実測ではない)** - `artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/full-measurement-db9d613-r01/run/execution.json` `a4d10e9b1a75a17b981792265338d64fac61178cb6f87dd646c5b486292db73c` - 同じ dir の `run/admission.json` `c4a3b5ba7a2b6427e55a6f85f037ded08e0c6bfd8c0a766647747ea9cc94378d` - 同じ dir の `ROOT_RAW_ACCEPTANCE_JOIN.json` `a76082f767e0a0d52cb70e2f66fa371b62a88754e9be319da3c08d4b48e78ba0`(`docs/…/INTEGRATED_FULL9_MEASUREMENT_DB9D613.json` も同じ SHA) - 検査: - admission の commit と source map は1407件(`651f7036…`)。 - R0/P1/P2/O0/P3/P4 の各 report に、`metadata.machine`、`metadata.build`、seed、speed、区間(開始/終了のゲーム分、wall 時刻、frame 数)、平均・P95・最大・標本数がある。 - R の登録は 20,000/200/50/150 で、稼働は100施設。P2 の warm は 31分(150分と書き換えない)。 - **描画の CPU は P1〜P4 だけで取得されている**(件数 P1 150、P2 50、P3 2398、P4 745)。R0 と O0 は、CPU も GPU も null で、理由は `zero_from_api_on_gl_compatibility_unsupported_or_unmeasured`。GPU は全 phase で null と同じ理由。 **E3 r02(経路・snapshot・保存・読込。headless・Ops OFF・x1 の観測だけ)** - dir `artifacts/original-completion-2026-10-02/p14-03-representative-perf-r01/`: - `run-r02/execution.json` `553971f55635e529b48634ef86ad7d4198c8bafe04d5a6a5ef778a4de0439fc1` - `run-r02/readiness.json` `da93aecdd2c1648952e2a80382acb7e3f30cfe48a7e5df982315791161fedde2` - `run-r02/after/evidence/report.json` `f1d447937158a884a1b287c3b5be38b6e73b73c5d748f9576401877402dabe1b` - `run-r02/after/measure.stdout.log` `294730160536fc862ca657654fbae290b874acc65b77a6d24aaccd9a859907f7` - `run-r02/before/evidence/report.json` `a070c061ca783aaec37152bf66ad6b6e6dc69b80d9c4c024eceab916d4c5d4e9` - 実行した script: `run-r02/measure.gd` `95e5967835cb05ad96e8e6f257689d0bd831792aa9c228c022e3af81448ff76a`、`run-r02/guarded.gd` `c9deebb39ee643d312a77bae64f74cf6851697bb31036fc56d67dd7c4037ee09`、`run-r02/profile_guard.gd` `597696c705cc8f0e79a35265ca3ef8df55f7fc3c4e0e5a2ce9a4e20e29e29a6f`、`collect_perf.py` `43f3e42900a670957a01cfcaca7e485809527b79912a358917c935c57ea9c063` - 入力: `artifacts/original-completion-2026-10-02/p28-current1299-runtime-scale-build-candidate-native-r01/fixture/reference.variant` `eb4f770071eb07cd7e136fe54c3f78768cc8de7a4264e62a9af1f06a8f90f9bd` - 検査(1407 の source の一致だけで済ませない): - execution の after/measure phase の report の SHA が `f1d44793…` で、PID が 46264。report は raw の stdout の `P14_03_PERF_REPORT=` の行と同じ。 - report の `input_sha256` が入力の SHA と同じ。`prepared_state_sha256`(`9ca8f809…`)、`migrated_input_state_sha256`、`running_state_sha256` を記録する。`counts_prepared` は 20,000/200/50/150。 - engine は readiness の `engine_sha256` `c7cccbf8fb143e34e02fd6521e09be2c2b974f0d5db080b19071c9c570718ccf`(4.7.2-stable official)。probe は `95e59678…`、runner は `43f3e429…`。hardware は `Mac16,10`・10・10・25769803776。 - source: readiness の after `83b170a4c7176761b0b18d8e9292017d990e80a9`(1407件)の source map が、E4 の selected_source_map と一致し、それが現在の source map とも一致する。 - speed は x1(`advance_one_minute_wall_ms_x1`)。区間と標本数は、各統計の count(x1 300、経路 cold 245 など)。統計は平均・P95・最大。 - seed: r02 の report には seed の欄がありません。値を作らず、入力の SHA が E2 の R と同じであることと、E2 の R の report の seed(28012026)を根拠として記録します。 - marker: r02 は回帰ではないので、marker 契約は適用外。理由を記録します。 **E4 正式192(関連回帰)** - dir `artifacts/original-completion-2026-10-02/p14-03-formal-regression-83b170a-r01/`: `runner-input.json` `5bc9760c0c114a80a3c9e93634e733fc8fa93d4eeea5d8bcfda85d8e4eebd094`、`runner-ended.json` `705fb2c12007bab125548742dc8d9b07918e30cae3a63c7d89e965c43b8b5f7b`、`all-tests.json` `31da4c4672f4321469183996e12fb23064b3772a69e8330052ab3e2ea66044f1` - marker 契約: `docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json` `0ff86a20891da66d84295f0c66ae7517ef586b54a1a668acb7778a450d473cd2` - 検査: 192/192、22,198 checks、失敗0。input の marker_contract_sha256 と engine_sha256 が一致する。selected_source_map が、validation の checkout の現在の product source map(`tools/run_all_tests.source_refs`)と完全一致する。 **E5 RESTART の正式完了** - `artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/RESTART_3AC2CED_FORMAL_DB_JOIN.json` `5c9b82a70f6bdb972d720aaa64f5d27aa54130f27f9d1f7cea1c7b02524f84be` - `artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/ROOT_CANDIDATE_3AC2CED_QUALIFICATION.json` `5bd8030acddc385eb728441286f6a740ec1ee966125474b60ef4b1efe2a2c343` - 検査: completed 8/8、4つの gate がすべて pass。S `954528a7c5a0e27e2e50b642373168fa0a550aba`、Q `3ac2cedc8dc977778fd5a3ba152197cc6cf00fa2`、M `3086af2ccd970ddee271a184214dad037bd1d6af`。承認は、既存の委任に基づくもの(新しい人間の発言ではない)。 **E6 RESTART の native(最終 S)** - `artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/native-restart-954528a-r01/run/execution.json` `c1ec566402896f9f3fdefdfc268de6ed0bc46b8a37a9eb6bfb252b0cc4ebb514` - 同じ dir の `ROOT_RAW_ACCEPTANCE_JOIN.json` `6dbb3cbb4ac1838b66034323cab22a9c5a968c1da0efe8d34676073b3f980cfb` - 検査: - 7 phase とも PASS。writer と reader の PID がすべて異なる。 - `restart/probe/*` の4ファイルが、base(= Q `3ac2ced` 以降の main)の bytes と一致する(再利用の条件)。 - R/O とも K=30 で、毎分の typed SHA が一致。改ざんは CHECKSUM_MISMATCH で拒否される。O の390分の記録は ID 9〜24 が連番で、counter 24。 **E7 独立レビュー** - `artifacts/original-completion-2026-10-02/p28-01-runner-preflight-r01/restart-independent-review-954528a-r01/DESKTOP_RESULT.json` `b8fff13e8789797a4a50a5e2900f3d84ef20a6682a8f25feca225edc7fe00300`(delivery `90b6943d86bf370599c3a8629c57a69806374a5863ce18957a7b7d696a5be9fd`) - 以前の changes_requested: `independent-review-bc703c9-changes-requested-r01/result.json` `f2e67cb2adbef9c9294ec1e879da70b500fa27d2220d9ae1b9fb50c96cbdc3b2` - 検査: 最終が pass であること。low 3件を消さずに記録すること。 各証拠は、それぞれの source・設定・engine・marker・入力・範囲にだけ適用します。たとえば r02 の値を windowed の値と言い換えたり、full9 を Q での実測と言い換えたりしません。 ## 4. 条件表(verifier は結合を確かめ、whole-unit の独立レビューが判定する) | 条件 | 根拠 | 範囲と未達 | |---|---|---| | G0 work | Tick と描画(CPU は P1〜P4)は E2。経路・snapshot・保存・読込は E3 | 稼働していた施設は100。GPU は null。E3 は headless・Ops OFF・x1 | | G0 acceptance | E2 と E3 の各 report の欄 | 記録の項目がそろえば成立する。予算の合否は条件に含まれない | | G1 | collector C1/C9(`_set_speed`→`_process`、main)と RESTART RS1(UI での保存と読込) | 測定の範囲は Mac(Mac16,10)。Windows での最終受入は未達のまま | | G2 | 既定の autoload の世界、O の実際の Ops ON、RESTART の実際の継続 | O は小さな入力(客0〜2)。200客での Ops ON は上限100のため不可 | | G3 | RESTART RS1〜RS5(E5、E6)と、下の明示した証拠 | 下の判断材料を参照。最終的な判定は whole-unit の独立レビューが行う | | G4 | collector の停止契約と phase の失敗の記録、RESTART の改ざん・停止・境界 | 実施していない分岐は U1 で開示する | | G5 | E4 を再利用(source と marker の一致)。collector と RESTART の unit validation | 製品が変わったら、全 roster をやり直す | | G6 | 全 receipt の SHA、Root の結合、verifier の manifest | — | **G3 の判断材料**(これらは証拠の提示であって、合否はそこから導きません): - E7 の最終 review の RS5 の判断(「overload は条件付きの分岐で、実施されていないことを開示し、保持されるとは主張しない」)と、low の1件目(「0でない backlog の保持は実施していない」)。 - 製品の契約: `scripts/core/simulation_kernel.gd:217-231`(`restore_clock` が `_accumulator` を0に戻し、`_skip_next_process` を立てる)と、snapshot の範囲(`autoload/simulation_runtime.gd:521-583`)。1分未満の accumulator は、保存される状態の外にある。 - 「発生しなかった」ことは、保存できたことの証明ではありません。独立レビューは、原本の条件「途中保存・再起動で再現」が、overload で止まって backlog が0でない状態の保存と、1分未満の実時間の位相までを要求するかどうかを、原文と上の証拠から判断します。要求すると判断した場合は、未達として changes_requested にします。 ## 5. U1: 開示する未達(合否には含めない。P28 / P28-02 / P28-03 に残す) - 予算の未達: P1 x1 平均 479.210 ms > 4、P1 stall 最大 4809.099 ms > 50、P2 x3 P95 5062.697 ms > 12、P2 stall 最大 5891.466 ms > 50。 - 200客での Operations ON(不可)。O の P3/P4 の合格は、小さな入力に限られる。 - GPU 時間は null(gl_compatibility)。R0 と O0 は CPU も null。 - 同一の Windows 実機、長期の操作感とバランス、ゲーム全体の受入。 - RESTART の low 3件と、G3 の判断の結果。 ## 6. 成果物(worker。allowed_paths は `docs/plans/original-completion-2026-10-02/execution/p28-01/gate/**` のみ) - `verify_p28_01_evidence.py`: engine を使わない verify-only の検査です。§3 の全証拠を、`EVIDENCE_BUNDLE_MANIFEST.json`(全ファイルの bytes と SHA)と、上に固定した SHA で結合します。 - `--project-root .` は必須。`--evidence-root` を省略すると、`$BUILD_OUTPUT_DIR/p28-01-gate-evidence` を使います。どちらも無い場合、または証拠が欠けている場合は、**失敗**にします(スキップしない)。 - 条件ごとの結果の JSON を stdout に出力し、`$BUILD_OUTPUT_DIR` が設定されていれば `$BUILD_OUTPUT_DIR/p28-01-gate-verify.json` にも書き出します(`--json ` で、書出し先を明示的に指定することもできます)。source の木には書き込みません。 - 失敗は、構造化した検査の失敗として返します(traceback で終わらせない)。 - `EVIDENCE_BUNDLE_MANIFEST.json`、`GATE_CONDITIONS.json`(§4 と §5 の機械可読版。各条件の根拠になる path と SHA、範囲、未達)。 - `test_verify_p28_01_evidence.py`: 合成した証拠を使う正常試験と拒否試験。 ## 7. verifier と試験が必ず拒否するもの - manifest の外のファイル、SHA の不一致、証拠の欠落、改ざん。 - 範囲を外れた適用: - full9 の commit を Q と表記すること - r02 を windowed の値と言い換えること - r02 の seed を作ること - R0/O0 の CPU を取得済みとすること - 予算の false を合格として扱うこと。GPU の null を0や合格に置き換えること。 - R の稼働数(100施設)を登録数として扱うこと。O の小さな入力を「200客」と表記すること。 - RESTART の4つの gate のどれかが欠けていること。probe の bytes が Q と一致しないこと。 - E4 の source map または marker が、現在のものと一致しないこと。 - U1 の項目が欠けていること。U1/U2 を原本の条件として数えること。G3 を「発生しなかった」だけで合格とすること。 ## 8. 対象外 - engine、全192、full9、collector、RESTART の再実行。 - 製品、依存、予算値、原本の分母の変更。Runner 本体、権限、認証、課金の変更。