From 2549cf7d6992560b850bbd11934e3c14b39a1988 Mon Sep 17 00:00:00 2001 From: Codex Date: Wed, 21 Oct 2026 07:17:23 +0900 Subject: [PATCH] Freeze Opus P28-02 equivalence contract before product optimization --- .../execution/p28-02/eq/SPEC.md | 100 +++++++++++++++ .../execution/p28-02/eq/TASK_INSTRUCTIONS.md | 26 ++++ .../p28-02/eq/references/OPT_CONTRACT_T1.md | 119 ++++++++++++++++++ .../OPUS_D2_SCOPE_CLARIFICATION.txt | 39 ++++++ .../OPUS_STARTUP_LIFECYCLE_CLARIFICATION.txt | 50 ++++++++ .../eq/registration/ACCEPTANCE_BASELINE.json | 56 +++++++++ .../eq/registration/CONFIG_PROPOSAL.json | 7 ++ .../registration/REGISTRATION_PROPOSAL.json | 111 ++++++++++++++++ .../ROOT_PROPOSAL_BYTE_TRANSFER.json | 76 +++++++++++ 9 files changed, 584 insertions(+) create mode 100644 docs/plans/original-completion-2026-10-02/execution/p28-02/eq/SPEC.md create mode 100644 docs/plans/original-completion-2026-10-02/execution/p28-02/eq/TASK_INSTRUCTIONS.md create mode 100644 docs/plans/original-completion-2026-10-02/execution/p28-02/eq/references/OPT_CONTRACT_T1.md create mode 100644 docs/plans/original-completion-2026-10-02/execution/p28-02/eq/references/OPUS_D2_SCOPE_CLARIFICATION.txt create mode 100644 docs/plans/original-completion-2026-10-02/execution/p28-02/eq/references/OPUS_STARTUP_LIFECYCLE_CLARIFICATION.txt create mode 100644 docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/ACCEPTANCE_BASELINE.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/CONFIG_PROPOSAL.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/REGISTRATION_PROPOSAL.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/ROOT_PROPOSAL_BYTE_TRANSFER.json diff --git a/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/SPEC.md b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/SPEC.md new file mode 100644 index 0000000..2bc0083 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/SPEC.md @@ -0,0 +1,100 @@ +# P28-02-EQ 仕様(spec_ref の候補。製品の変更なし。原本の加算は0) + +- 状態: 候補です。Root が原本の条件と照合して、`docs/plans/original-completion-2026-10-02/execution/p28-02/eq/SPEC.md` として main に固定し、その実 SHA を base にしてから、通常の新規登録をします。 +- 前提: + - P28-02-DIAG は正式に完了しています(Q `fdb309f3bc81529135915429d2432a6644696311`、`execution/p28-02/DIAG_FORMAL_COMPLETION_FDB309F.json` `7d83ec0e…`)。 + - OPT の契約の候補は `OPT_CONTRACT_T1.md` r02 です。この SPEC の §3〜§5 が、その r02 の E1 の範囲・改善の判定・順序を確定し、置き換えます。 +- 原本の条件: P28-02 の work と acceptance、横断条件6件は `execution/p28-02/SPEC.md` §1 のとおりで、変更しません。EQ は、OPT の前に同等性を固定するための補助の task で、原本の分母を増やしません(23/88、4/30)。 + +## 1. 目的と範囲 + +- 原 work の「失敗時拒否を含む同等性を先に固定し」を、製品を変える前に、実行できる harness として凍結します。 +- allowed_paths は `docs/plans/original-completion-2026-10-02/execution/p28-02/eq/**` だけです。製品の source map の1407件は変更しません。 +- import の閉包: + - RESTART の CLARIFICATION_02 D1 の6ファイル + - DIAG の5ファイル(`execution/p28-02/diag/*`、読取専用) + - 自分の allowed_paths の中のファイル + +## 2. 成果物 + +| ファイル | 役割 | +|---|---| +| `eq/run_eq.py` | Root が実行する native の driver です。`--check \| --run --readonly <元の p28-01-readonly> --fixture --engine --output <新しい dir>`。owned phase・guard・private profile・cleanup は、collector を読取専用で import して使います | +| `eq/eq_probe.gd` | E1〜E5 の probe です。起動は DIAG の6段階(OPUS_STARTUP_LIFECYCLE_CLARIFICATION)に従います | +| `eq/compare_versions.py` | 2つの版の記録を比べる比較器です(§3) | +| `eq/check_eq.py` | report の checker です | +| `eq/verify_eq.py` | `--project-root .` で、`$BUILD_OUTPUT_DIR/p28-02-eq-evidence` にある実際の bundle を結合します。bundle が無ければ失敗します | +| `eq/test_eq.py` | engine を使わない unittest です | + +## 3. 比較の層(OPT r02 の E1 を確定する) + +### 3.1 同じ PID の中(観測の副作用が無いこと) + +- DIAG と同じ、**完全な** S/K/C 層を、各観測の前後で比べます。K 層には、性能の telemetry(`performance_budget` の `_samples`・`_totals`・`_sample_counts`)を含みます。C 層には、instance ID を含みます。 +- 前後で、bytes の完全一致を要求します。 + +### 3.2 版と版の間(全状態と全イベントの意味の比較) + +- **S 層**: `create_snapshot()` の全体を比べます。`var_to_bytes` の完全一致を第一とします。不一致の場合に限り、RESTART の修正8の完全な typed の正規表現で比べ、dict の列挙の順序だけの差の path を全て記録します。それ以外は不一致です。`latest_snapshot` も同じ方法で比べます。`latest_digest` は、文字列の完全一致で比べます。 +- **K 層**(版の間で比べる欄を、次のものに限ります): + - absolute_minute、speed、paused、snapshot_version + - `_accumulator`(f64 の hex。手動の stepping では決定的) + - `_skip_next_process`、`_pause_request_serial`、`_abort_current_tick_requested`、`_last_tick_advanced` + - `_phase_handlers` の、phase ごとの handler ID の集合 + - `performance_budget._sample_counts` の metric ごとの**件数**(呼出しの回数で、決定的) +- **K 層で、版の間では比べないもの**(理由: 実時間に依存し、同じ版の別の PID でも一致しないため): `_samples` と `_totals` の時間の値。各 PID の実際の値は、全て raw に保持します。 +- **C 層**(版の間で比べる欄): + - `_mvp_manifest_cache_generation` + - 「`_mvp_manifest_cache_catalog` が `runtime.mvp_content_catalog` と同じ object か」の真偽 + - `_mvp_manifest_cache` の `var_to_bytes` +- **C 層で、版の間では比べないもの**(理由: プロセスごとに変わる値のため): instance ID の数値そのもの。実際の値は raw に保持します。 +- **E2 の全イベント**: 開始の時点で、両方の版の domain_event の counter と published_ids の数が一致していることを要求します。そのうえで、event ID を**そのまま**対応させます(付け替えの対応表は作りません)。全ての欄の完全一致を要求します。開始の時点の counter が違えば、比較は不成立とし、失敗にします。 +- 比べない欄を黙って落とすことはしません。比べない欄と、その理由と、各版の実際の値を、比較の結果に全て記録します。SimulationDigest だけでの判定は不可です。 + +### 3.3 観測と、意図的な scenario 操作の境界 + +- (a) **観測の区間**: 記録・比較・snapshot の取得などの観測そのものは、§3.1 のとおり、前後で完全な S/K/C が不変であることを要求します。 +- (b) **scenario の区間**: E3/E4/E5 のために列挙した操作だけは、観測の区間とは別の、専用の区間で行ってよいものとします。それぞれの区間には開始と終了の記録を付け、前後の S/K/C の変化、拒否の code、所有権の結果を、実際の値として記録します。列挙した操作は次のとおりです。 + - E3: 不正な入力を与えた `restore_snapshot`・`SimulationSnapshot.validate`・`load_from_path` + - E4: 状態を変えるコマンド(建設のコマンドを1件、通常の command queue を通す)、tick の進行(`advance_minutes(1)`)、`restore_snapshot`、`load_from_path`、状態を変えないコマンド + - E5: 返された値(`create_snapshot()` の戻り値、`latest_snapshot`、`snapshot_published` / `state_updated` の引数)の、入れ子の dict と配列の変更 +- (c) **製品の既存の失敗との区別**: E5 の操作によって live の状態が変わった場合(たとえば、`latest_snapshot` と signal の引数の aliasing。OPT r02 §3 で予想したもの)は、製品の既存の失敗として、変化した path と値を記録して保持します。これは harness による無断の変更ではありません。どの scenario の、どの操作の結果かを、記録の中で結びつけます。その scenario の後の検査は、新しい baseline から始めます。 +- (d) **禁止**: 上に列挙した scenario の操作以外の、状態の変更と、hook や関数の差し替え。起動の準備(OPUS_STARTUP_LIFECYCLE_CLARIFICATION の段階①②)と手動の stepping は、従来どおりです。 +- 原本の全状態・全イベント・受入の条件は減らしません。K/C の限定の例外(§3.2)も、そのままです。 + +## 4. 改善の判定(OPT の受入で使う。新しい数値の閾値は作らない) + +- 指標(PID または run ごとに1つの値): + - (a) I11:PID ごとの、測定30 tick の I11 の平均(inclusive の wall) + - (b-1) P1:run ごとの、kernel の `simulation_x1` の budget_verdict の値(区間の標本の平均。collector の H1 の定義) + - (b-2) P2:run ごとの、kernel の `simulation_x3` の budget_verdict の値(区間の標本の P95) +- 前後それぞれ3つの値で、指標ごとに分類します: + - **改善**: 後の版の3つの最大が、前の版の3つの最小より小さい。 + - **悪化**: 後の版の3つの最小が、前の版の3つの最大より大きい。 + - **差は確認できない**: それ以外(範囲が重なる)。 +- P95・最大・stall の最大、I0〜I10 の各区間の値は、記述として全て報告します。分類には使いません。 +- OPT の受入での扱い: + - 「改善あり」と書いてよいのは、(a) が「改善」で、かつ (a)・(b-1)・(b-2) のどれも「悪化」でない場合だけです。 + - (a) が「改善」にならなければ、「改善を確認できない」として、OPT の変更を採用しません(原 work の「改善する」を満たさないため)。 + - (b) が「改善」でなくても、悪化でなければ構いません。そのまま記録します。 + +## 5. 順序と、harness の正しさと製品の受入の区別 + +1. EQ の worker が S_eq を提出します(engine を使わない局所の unit の全件 PASS つき)。 +2. Root が、凍結した S_eq で native を実行します。phase は7つです: + - import + - parse-base と parse-wrapper(`--check-only`) + - R-A、R-B(R の同じ版の2 PID) + - O-A、O-B(O の同じ版の2 PID) +3. Root が raw を結合して bundle を作り、`$BUILD_OUTPUT_DIR/p28-02-eq-evidence` に置きます。 +4. 正式の validation を行います。`p28-02-eq-unit` と `p28-02-eq-native-verify` の両方が必須です。 +5. 独立した新しい Opus がレビューします(非同期の配送)。 +6. prepare → Q_eq の資格の確認 → Root の委任による承認 → integration → final。 + +- **before の記録**: OPT の比較で使う「変更の前の版」の EQ の記録は、手順2の S_eq の native です(製品の1407件は、変更の前と同じです)。Q_eq の資格の確認で、製品の source map・engine・入力・設定・EQ のファイルが一致した場合に限り、そのまま再利用します。一致しなければ、Q_eq でもう一度実行します。 +- **harness の正しさ**(EQ の受入の条件): 同じ版の2 PID の間で、§3.2 の比較の差が0であること(決定性)。E3/E4/E5 の検査が実際に動いて、結果を記録していること。拒否試験がそろっていること。 +- **製品の結果**(EQ の受入の条件では**ない**): 前の版での E3/E5 の結果は、事実として記録するだけです。失敗したもの(たとえば OPT r02 §3 で予想した E5 の外から内への aliasing)は、**既存の不具合**として一覧にし、PASS で補いません。それを直すのは OPT の範囲です。 + +## 6. 全ての失敗の保持 + +- native・validation・review の失敗は、raw と SHA とともに保全し、成功に書き換えません。修正は、通常の repair で、同じ W で行います。 diff --git a/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/TASK_INSTRUCTIONS.md b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/TASK_INSTRUCTIONS.md new file mode 100644 index 0000000..3f5a80e --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/TASK_INSTRUCTIONS.md @@ -0,0 +1,26 @@ +# P28-02-EQ worker 指示 + +仕様は同じディレクトリの `SPEC.md` です。この指示と仕様は変更しないでください。 + +- 作るもの(allowed_paths `docs/plans/original-completion-2026-10-02/execution/p28-02/eq/**` の中だけ): SPEC §2 の6ファイルです。 +- 製品の source map の対象(autoload/scripts/scenes/data/tests/assets/tools と、直下の4ファイル)には、追加も変更も削除もしません。 +- 起動の6段階、S/K/C の検査、observer、scratch、cache の規則は、DIAG と同じです(OPUS_D2_SCOPE_CLARIFICATION と OPUS_STARTUP_LIFECYCLE_CLARIFICATION の全文を、Root が補足として渡します)。 +- E1〜E5 は、OPT_CONTRACT_T1 r02 §3 の場面と入力を使います。比較の層は SPEC §3 のとおりです。同じ PID の中は完全な K/C で、版の間は列挙した欄だけを比べ、比べない欄は理由と実際の値を記録します。 +- 既に分かっている落とし穴を避けること: + - autoload の script の class_name を静的に参照しない(Runtime から動的に読む)。 + - Variant から `:=` で型を推論しない。 + - StringName の key は、文字の比較で並べる。 + - 一時ディレクトリは `BUILD_OUTPUT_DIR` か `tempfile.gettempdir()` の下に作る。 +- E3/E5 の検査が前の版で失敗しても、それは製品の事実です。PASS に補わず、SPEC §5 のとおり「既存の不具合」として記録します。harness の正しさの試験と、製品の結果を、混ぜないこと。 +- 拒否試験として、少なくとも次のものを置く: + - 版の間の比較で、列挙していない欄を黙って落とすこと + - instance ID の数値や時間の telemetry を、版の間で一致させようとすること + - 開始の counter が違うのに比較を成立させること + - SimulationDigest だけでの判定 + - SPEC §3.3 (b) に列挙した scenario の外での、状態を変える呼出し、hook の差し替え(scenario の中の列挙した操作は許可し、前後の変化を実際の値として記録する) + - scenario の操作による live の変化を、記録せずに捨てること。その変化を harness の不具合として隠すこと(SPEC §3.3 (c)) + - 欠損を 0 で補うこと + - bundle の欠落 +- しないこと: engine の起動、git への書込み(commit を含む)、製品の変更、全回帰。 +- 提出前に、engine を使わない `python3 test_eq.py` を局所で実行して全件 PASS を確かめ、生出力を報告し、正式な JSON で提出します。 +- 承認された範囲の中の通常の実装上の選択は、worker が決めて IMPLEMENTATION.md に記録し、そのまま進めます。blocked にしてよいのは、原本の製品の仕様・数値・権限・課金・原本の受入に影響する未確定事項がある場合だけです。 diff --git a/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/references/OPT_CONTRACT_T1.md b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/references/OPT_CONTRACT_T1.md new file mode 100644 index 0000000..0e336d1 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/references/OPT_CONTRACT_T1.md @@ -0,0 +1,119 @@ +# P28-02 の改善の契約:T1(snapshot の変換・コピー)だけを先に(候補 r02。DIAG の通常の final の後に、Root が照合してから登録する) + +- 状態: 候補です。登録、worker、engine、新しい試験は、まだ行いません。根拠は DIAG の S `d6ce6dd` の bundle です(DIAG の正式な独立レビューは、そのセッションの結果だけを待ちます)。 +- 原本の条件: P28-02 の work、acceptance、横断条件6件は、`execution/p28-02/SPEC.md` §1 のとおりで、変更しません。原本は 23/88、4/30 のままです。新しい数値、原本の分母、保護、課金は変更しません。 + +## 1. T1 だけにする判断 + +- 原 work は「snapshot変換・検証・コピー・経路接続の**実測上位から**改善する」で、4つの分類の全てを変えることは求めていません。 +- T1(I11 PUBLISH_SNAPSHOT、平均 約 81 ms/tick。tick の外の Runtime の create_snapshot の独立の計測が 約 77 ms)は、分類「snapshot変換・コピー」に直接あてはまり、分類にはっきり入るものの中で、実測で最も上位です。 +- T2(I10 の中の PathService の query)は、「経路接続」に探索を含めるかどうかの解釈の差があるので、今回は選びません。その理由は、受入の記録に残します。 +- I4 は、分類の根拠が無いので、範囲の外です。 +- whole-unit の独立レビューが、この選定は不十分だと判断した場合は、changes_requested として受けます。 + +## 2. 2つの task と、source の範囲(1407 の固定への適合) + +- **P28-02-EQ**(製品の変更なし): allowed_paths は `docs/plans/original-completion-2026-10-02/execution/p28-02/eq/**`。同等性の harness・driver・checker・試験と、比較の collector(§4)を置きます。import の閉包は、RESTART の D1 の6ファイル、DIAG の5ファイル(読取専用)、自分のファイルだけです。 +- **P28-02-OPT**(製品の変更あり): 変えてよいのは、次の**既存**の製品ファイルだけです。**新しいファイルを追加すること、ファイルを削除することは、source map の対象(autoload/scripts/scenes/data/tests/assets/tools と、直下の4ファイル)では禁止**です。 + - `autoload/simulation_runtime.gd`(`_publish_snapshot`、`create_snapshot`、`latest_snapshot`、`latest_digest` の周辺) + - `scripts/core/simulation_snapshot.gd` + - `scripts/world/world_service.gd` + - `scripts/world/route_subslot_path_adapter.gd` + - `scripts/world/path_service.gd`(`create_snapshot` の部分) + - `scripts/core/command_queue.gd`(`create_snapshot` の部分) + - OPT の試験は `docs/plans/original-completion-2026-10-02/execution/p28-02/opt/**`(source map の外)に置き、EQ の harness と一緒に実行します。 +- 理由: 既存の DIAG の driver(`diag_p28_02.py:101`)と RESTART の `restart_pair.py:189` は、source の件数を `== 1407` で固定しています。OPT が source の件数を変えなければ、両者を**変更せずに**、OPT の S でもそのまま実行できます。両者は、実際の commit と source map を全部記録するので、別の版の測定を、元の版の 1407 の測定として装うことにはなりません。全 roster の suite の数も、192 のまま変わりません。 +- EQ の比較の collector(`eq/compare_versions.py`)は、次のことを確かめます。追加、欠落、登録されていない差分が1つでもあれば、拒否します。 + - before の全 source map は、登録の base の product source map で、1407件・SHA `651f7036…`。 + - after の全 source map の差分の集合が、上の OPT の許可ファイルのうち、実際に変更したものと完全に一致すること。追加と欠落は0件。 + - after の版の EQ・DIAG・collector・RESTART のファイルの bytes が、それぞれの固定した SHA と一致すること。 + +## 3. 同等性 E1〜E5(EQ で凍結する。R と O の両方で行う) + +- 共通: R は DIAG と同じ起動の6段階を使います。O は新規開始(Ops ON、360分)を使います。B1 の後、K=30分を手動の stepping で進めます。 +- **E1 全状態**: + - 範囲: S 層、`latest_snapshot`、`latest_digest`、K 層、C 層。 + - 時点: B1 と、30分の各 tick の最後。 + - 比較: `var_to_bytes` の完全一致を第一とします。不一致の場合に限り、RESTART の修正8の完全な typed の正規表現で比べ、dict の列挙の順序だけの差の path を全て記録します。それ以外の差は不一致です。 +- **E2 全イベント**: + - B1 の直後から、30分目の tick_completed の後まで、`DomainEventStream.subscribe(&"*", …)` で、全件を上限なく、全ての欄とともに順序どおりに記録します。終わったら `unsubscribe` します。 + - 開始の時点の counter と published_ids の数の一致、終了の時点の counter の一致を確かめます。 + - tick ごとの `snapshot_published` / `state_updated` の回数と順序も一致させます。 +- **E3 失敗時の拒否**: + - 対象の API: `restore_snapshot`、`SimulationSnapshot.validate`、`load_from_path`。 + - 入力: key の欠落、型の違い、範囲外の値、重複した ID、改ざんした `world.bin`。 + - 要求: code が変更の前と同じであること。拒否の前後で、S/K/C 層と全イベントが不変であること。load の失敗が `X(B, SAVE_LOAD_FAILED)` と完全一致すること。 +- **E4 キャッシュの古さ**: + - 場面: 状態を変えるコマンド、tick、`restore_snapshot`、`load_from_path`、状態を変えないコマンド。 + - 要求: それぞれの直後の `create_snapshot()` と `latest_snapshot` が、変更の前の版の同じ場面と E1 の方法で一致すること。 +- **E5 所有権**: + - 対象: `create_snapshot()` の戻り値、`latest_snapshot`、`snapshot_published` / `state_updated` の引数。 + - 外から内: 入れ子の dict と配列を外から変更しても、内部の状態、次の `create_snapshot()`、`latest_digest` に影響しないこと。 + - 内から外: 内部の更新(次の tick)の後も、既に返した値が変わらないこと。 +- **現在の source の E5 の読取確認**: + - `_publish_snapshot`(`simulation_runtime.gd:12617-12621`)は、`latest_snapshot` と**同じ dict の object** を、`snapshot_published` と `state_updated` に渡しています。 + - `latest_digest` は、遅延して `latest_snapshot` から計算されます(`:151-156`)。 + - したがって、受け手が引数の dict を変更すると、`latest_snapshot` が変わり、まだ計算していない digest もその変更を反映します。現在の受け手(`main.gd:973-976`、`world_preview.gd:2018-2039`)は引数を使っていないので、実際の誤動作は観測されていません。しかし、E5(外から内)の試験は、**現在の source で失敗すると予想します**。 +- **判定の扱い**: + - harness の正しさは、前の版どうしを比べて差が0であること(決定性)で確かめます。これは E の合格とは別のことで、「全 E の合格」とは扱いません。 + - E3 と E5 は、版ごとの絶対の検査です。前の版で失敗したもの(上の E5 を含む)は、**既存の不具合として記録**します。その修正が OPT の許可範囲にあるもの(上の E5 は `simulation_runtime.gd` の中)は、OPT に含めます。許可範囲の外のものは、判断に戻します。 + - OPT の後の版では、全ての E の合格を要求します。 + +## 4. 比較(全て pin する。Root が実行し、版を明記する) + +共通の引数: +- `--readonly ` +- `--fixture artifacts/original-completion-2026-10-02/p28-current1299-runtime-scale-build-candidate-native-r01/fixture/reference.variant`(`eb4f7700…`) +- `--engine /Applications/Godot.app/Contents/MacOS/Godot`(`c7cccbf8…`) + +`--output` は毎回新しいものにします。各実行は、その版の凍結した checkout(HEAD の検査済み)で行います。 + +| 比較 | 前の版 | 後の版 | 実行するもの | engine の phase の数 | +|---|---|---|---|---| +| (a) phase の比較(headless、手動の stepping) | 既存の DIAG の native の bundle(S `d6ce6dd`、3 PID)を**再利用**します。条件: 製品の source map が `651f7036…` で、DIAG の5ファイル・engine・fixture・設定が一致すること | OPT の S で `python3 docs/plans/original-completion-2026-10-02/execution/p28-02/diag/diag_p28_02.py --run <共通> --output artifacts/original-completion-2026-10-02/p28-02-opt/phase-after--r01` を1回実行(3 PID) | DIAG の driver(変更なし) | 後の版の1回で6(import、parse 2つ、diag 3つ) | +| (b) frame の予算の比較(windowed、`process_real_delta`) | 既存の full9(`db9d613`、製品の source map は同じ `651f7036…`)を1回分として**再利用**し、残りの2回を `collect_p28_01.py --run <共通> --output …/frame-before-r0{2,3}` で実行 | OPT の S で `collect_p28_01.py --run <共通> --output …/frame-after--r0{1,2,3}` を3回実行 | 受入済みの collector(変更なし) | 新規5回×9(import、parse 2つ、R0・P1・P2・O0・P3・P4)= 45 | +| (c) RESTART | — | OPT の S で `python3 docs/plans/original-completion-2026-10-02/execution/p28-01/restart/probe/restart_pair.py --run <共通> --output …/restart-after--r01` | RESTART の driver(変更なし) | 7 | +| (d) 関連回帰 | — | OPT の S で `python3 tools/run_all_tests.py --project-root <凍結した S の checkout> --godot /Applications/Godot.app/Contents/MacOS/Godot --output …/full-roster--r01` | 正式の runner(192 suite) | 約194 | +| EQ | EQ の final の Q で、`eq/run_eq.py --run <共通> --output …/eq-before-r01` | OPT の S で、同じコマンドで `--output …/eq-after--r01` | EQ の harness(凍結) | EQ の設計による(R と O、各1 PID 以上) | + +- (b) で全 phase が必要な理由: collector の PHASES は固定で、P1/P2 の前の R0 は、stage0 の外挿の入力です(collector の H6)。O の phase だけを外すには collector を変えるか、PHASES を差し替える必要があり、それは正式の経路ではなくなります。O の phase の値は記録しますが、T1 の判定には使いません。 +- P1/P2 を各3 PID にするには、collector を3回実行する必要があります(1回の実行で、P1 と P2 の PID はそれぞれ1つ)。前の版は、既存の full9 を1回分として数え、重複を避けます。 +- **証拠の判定**: + - 実測の値(前後の平均・P95・最大・各 PID の値)をそのまま示します。新しい数値の目標は作りません。 + - 「改善した」と書いてよいのは、I11(と、(b) の P1/P2 の kernel の標本)で、後の版の3 PID が前の版の3 PID と重ならずに低い場合だけです。重なる場合は「差は確認できない」と書きます。この規則は管制の提案で、独立レビューの確認を受けます。 + - 予算の false 6件は、改善が無ければそのまま残します。 + - E1〜E5 が1つでも崩れた変更は、採用しません。 + +## 5. S での実行と Q での再利用(実行した版を偽らない) + +- (a)(b)(c)(d) と EQ の後の値は、OPT の**提出された S** で実行し、「S で実行した」と記録します。Q で実行したとは呼びません。 +- integration の後の Q で再利用してよいのは、次の全てが一致する場合だけです。それ以外は、Q で必要な検証をやり直します(source が変われば、全 roster と (a)(b)(c) を Q で実行します)。 + - 製品の source map の全件(件数と、各ファイルの SHA) + - 試験の roster(`tests/**/test*.gd` の集合と SHA) + - marker の契約(`completion_marker_contracts.json` の SHA) + - `project.godot` と `export_presets.cfg` + - engine の SHA + - 入力の fixture + - collector・DIAG・RESTART・EQ・OPT の各ファイルの bytes + - runner(`tools/run_all_tests.py` と `tools/regression/*`)の SHA + - 実行に使った readonly の入力 +- integration で main 側の他の変更が source map に入った場合は、再利用しません。 + +## 6. 依存の順序 + +1. DIAG が通常の final に達する。 +2. Root が、この契約を原本の条件と照合して、main に固定する。 +3. EQ の登録 → 実装 → validation → 独立レビュー → 統合 → final。 +4. Root が、EQ の final の Q で EQ の前の値を取る(前の版の E3/E5 の失敗は、既存の不具合として記録する)。(b) の前の版の2回を実行する。 +5. OPT を登録して実装する(許可された既存の製品ファイルだけ。前の版の E の失敗のうち、範囲の中のものの修正を含む)。 +6. 提出された S で、Root が EQ の後の値、(a)、(b) の後の3回、(c)、(d) を実行する。 +7. OPT の validation(unit と、全ての bundle の verify)。 +8. 独立した新しい Opus が、原本の work と acceptance、横断条件6件、U1/U2 を whole-unit としてレビューする。 +9. 統合 → Q での再利用の資格の確認(§5)→ final。 +10. 台帳で 23→24。 + +## 7. 担当 + +- EQ と OPT: codex `gpt-6-astra`。 +- レビュー: 独立した新しい `claude-opus-5-5`(Desktop、非同期の配送)。 +- native、比較、全 roster の実行: Root。 diff --git a/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/references/OPUS_D2_SCOPE_CLARIFICATION.txt b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/references/OPUS_D2_SCOPE_CLARIFICATION.txt new file mode 100644 index 0000000..7a2e5c4 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/references/OPUS_D2_SCOPE_CLARIFICATION.txt @@ -0,0 +1,39 @@ +OPUS_D2_SCOPE_CLARIFICATION(P28-02-DIAG。base 8c06c3b44235a52f35898b1f6263e8ee064af256 の SPEC §3.1・§3.3、D2 の「live の全状態」の境界を確定する。原本の条件、SPEC、TASK_INSTRUCTIONS、baseline は変更しない。TASK_INSTRUCTIONS の全指示は従来どおり守る) + +この確定の位置づけ +- 「全状態」を、製品が保存する状態(S 層)と、それに関わる、名前を挙げた有限の内部状態(K 層・C 層)の和として定める。対象を独自に除外することも、無差別な走査を足すこともしない。比較は、tick の外の各計測(snapshot の変換、scratch の restore・save・load・validator)の前と後で行う。 +- 製品の値や仕様の変更の承認ではない。診断の観測の副作用が無いことを確かめるための、比較の範囲の具体化である。 + +S 層: 製品が保存する状態(必須) +- SimulationRuntime.create_snapshot() が返す Dictionary の全体を、var_to_bytes で完全一致させる(SimulationDigest だけでは不可)。 +- 差がある場合は、RESTART の修正8で確定した typed の正規表現(文字順の key、衝突は拒否、typeof・配列の順序・値を保つ)で path を特定して報告する。dict の列挙の順序だけの差も、path つきで記録する。 + +K 層: kernel の、保存されない内部状態(名前を挙げたものだけ。get() で受動的に読む) +- GameClock: absolute_minute、speed、paused、snapshot_version、_accumulator(f64 の hex)、_skip_next_process、_pause_request_serial、_abort_current_tick_requested、_last_tick_advanced。 +- _phase_handlers: phase ごとの handler ID の集合を、文字で並べた一覧として比べる。Callable の同一性は比べない。 +- performance_budget: _sample_counts、_totals、_samples(metric ごとの配列)。tick の外の計測でこれらが変われば、失敗にする。 +- 前後で完全一致を要求する。 + +C 層: Runtime の内部キャッシュ(create_snapshot が書き換えうるもの。autoload/simulation_runtime.gd:134-136、:11183-11200) +- _mvp_manifest_cache_generation、_mvp_manifest_cache_catalog の同一性(get_instance_id)、_mvp_manifest_cache の var_to_bytes。 +- 規則: + - (a) 計測の前に cache が満たされていること(generation が現在の catalog の get_manifest_generation() と一致)を記録する。満たされていなければ、計測の外で create_snapshot() を1回呼んで満たし、その事実を記録する(cache が埋まったのは、計測より前の準備としてである)。 + - (b) 計測の区間の中で cache miss(generation か catalog の変化、または cache の bytes の変化)が起きたら、その計測の標本に cache_miss_in_sample=true を付けて記録する。値は捨てず、cache の再構築を含む inclusive の値として扱う。黙って除外したり、平均に混ぜて隠したりしない。 + - (c) 計測の後の C 層が、計測の前と完全一致すること。(b) の miss があった場合は、その後の cache が、現在の catalog から作った manifest と一致することを確かめる。古い値や他の値が残っていれば失敗にする。 +- これは、P28-02-OPT の E4(キャッシュの古さ)と E5(所有権)の診断側の前提である。create_snapshot() が cache の deep copy を返すことも記録する(:11185-11199)。 + +observer の副作用の検査(有限) +- 診断が接続する signal(tick_started、tick_phase_started、tick_completed、path_query_measured)について、接続の前と、切断した後で、各 signal の get_connections() の件数と、接続先の object と method の一覧が一致すること(診断の分は除く)。 +- 診断で DomainEventStream に subscribe した場合は、unsubscribe の後に、subscriber の一覧が元に戻っていること。 + +scratch の参照の漏れの検査 +- scratch に渡すのは、live の snapshot の deep copy だけ。scratch の操作の後で、S 層・K 層・C 層が完全一致すること。scratch の Runtime や関連の object を解放した後に、それらの instance ID が is_instance_id_valid で無効になっていること。scratch の path は private user:// の下に限る。 + +起動の構成(未指定だった点の確定) +- 代表入力 R は、collector の SPEC §4.3 と同じ順序で既定の autoload に復元し、main を追加する(headless)。こうすることで、同期の受け手(state_updated などに接続する main 側の処理)が、実際のゲームと同じように I11 の inclusive の区間に入る。保存の policy による autosave が区間の中で起きたら、事実として記録する。 + +対象の外(理由つき) +- Object の参照や循環の無差別な走査、engine・描画・OS の状態、node の木の全体: 製品の永続状態でも、P28-02 の計測で変わりうる内部状態でもないため対象外とする。上の K 層・C 層・observer・scratch の検査で、診断の副作用は検出できる。 + +報告 +- 各計測の前後の S/K/C 層の SHA と一致の結果、cache の状態、observer の接続の件数、scratch の解放を、report に記録する。測れない項目は、理由つきの未測定にする(0 で補わない)。上記で決めきれない不足は、具体的な箇所を示した場合に限り blocked にする。 diff --git a/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/references/OPUS_STARTUP_LIFECYCLE_CLARIFICATION.txt b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/references/OPUS_STARTUP_LIFECYCLE_CLARIFICATION.txt new file mode 100644 index 0000000..655b3ae --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/references/OPUS_STARTUP_LIFECYCLE_CLARIFICATION.txt @@ -0,0 +1,50 @@ +OPUS_STARTUP_LIFECYCLE_CLARIFICATION(P28-02-DIAG。base 8c06c3b44235a52f35898b1f6263e8ee064af256。OPUS_D2_SCOPE_CLARIFICATION の全文(S/K/C 層、observer、scratch、main の追加)はそのまま有効で、その上に起動から終了までの境界を確定する。原本の条件、SPEC、TASK_INSTRUCTIONS、baseline、製品の値は変更しない) + +原則 +- SPEC §3.1 の「live を変えてよいのは fixture の導入と advance_minutes(1) だけ」は、測定の区間(段階③〜⑤)の禁止として扱う。測定の前の準備(段階①②)では、下に列挙した公開の呼出しだけを行ってよい。準備による状態の変化は、その全てを raw に記録する。準備の変化を、測定の副作用や測定時間として扱わない。 +- 列挙した呼出し以外に、製品の状態を変える呼出し、製品の値の変更、関数や hook の差し替えは行わない。 + +段階① autoload と fixture の準備(collector の measure_p28_01.gd:283-334 と同じ順序。同じ guard と private profile の bootstrap を使う) +- 許可する呼出し: + - GameClock.set_paused(true) + - FileAccess で代表入力 R を開き get_var(false)(SHA eb4f7700… を照合) + - SimulationRuntime.restore_snapshot() + - 復元の後の GameClock.set_paused(true) +- set_paused(true) は、実時間の _process による tick を止め、時間を手動の stepping だけで進めるための準備である(simulation_kernel.gd:104-121 で、止まった状態の advance_minutes は正当な手動の stepping として進む)。set_paused(true) は paused と _pause_request_serial を変えるので、その前後の K 層の値を記録する。 +- 記録: restore の戻り値、復元後の S 層の SHA、K 層、C 層。 + +段階② main の追加(headless)と、手動 stepping の制御 +- 許可する呼出し: main.tscn を instantiate して root に add_child する。その後 process_frame を2回 await する(focus の deferred 処理のため)。 +- main の _ready の副作用(save policy の設定、Ops の開始の試行。R では INVALID_START_TIME になる)は、そのまま記録する。 +- process_frame の間に kernel の _process が _skip_next_process を消費することがある(process_real_delta は skip を paused より先に確かめる)。これも準備の変化として記録する。 +- 禁止: _set_speed、_toggle_pause、set_paused(false)。clock は段階②から段階⑥まで、ずっと paused=true のままにする。 +- この段階の終わりに、baseline B0(S/K/C 層の SHA)を固定する。observer の接続はここで行い、接続の前後の get_connections() を記録する。 + +段階③ warm(30分) +- GameClock.advance_minutes(1) を30回呼ぶ。1回ごとに process_frame を1回 await する(main の deferred 処理を、tick の区間の外に出すため)。 +- 各呼出しの前後で absolute_minute を照合し、進まなければ失敗にする。 +- observer の記録は warm の区間として取り、統計には入れない。 +- 終わりに baseline B1(S/K/C 層の SHA、absolute_minute=632、C 層の cache の状態)を固定する。C 層の規則 (a) は、ここで確かめる。 + +段階④ 測定(30分) +- 段階③と同じ方法で30分を進める。I0〜I11 の inclusive の区間、observer の自分の費用、path_query_measured を記録する。 +- tick と tick の間の frame の wall(tick_completed から次の tick_started まで)は、別の欄に記録し、どの phase にも帰属させない。 +- この段階の中の、状態を変える呼出しは advance_minutes(1) だけ。 + +段階⑤ tick の外の S/K/C 検査と内訳の測定(clock は paused のまま) +- 測定の前の S/K/C を記録する。そのあと、SPEC §3.3 の N=5 の計測と、使い捨ての scratch の操作を行う。測定の後の S/K/C が、測定の前と完全一致すること(C 層は D2 の規則 (b)(c))。 +- この段階では、時間を進めない。 + +段階⑥ 切断、解放、終了 +- observer を切断し、各 signal の接続が段階②の接続の前に戻ったことを確かめる。scratch の object を解放し、instance ID が無効になったことを確かめる。 +- 終了は collector の K1 と同じく get_root().close_requested.emit() で行い、audio の drain の結果を記録する。owned の cleanup は collector の run_private_engine と同じ。 + +3 PID の条件の一致 +- 3つの PID の間で、次のものが一致することを要求する: 入力の SHA、段階①の復元後の S 層の SHA、B0 と B1 の S 層の SHA、K 層(absolute_minute、paused、_pause_request_serial、_skip_next_process、snapshot_version、handler の集合)、C 層の状態、main の _ready の Ops の結果。 +- 一致しない項目があれば、その事実と値を記録して判断に戻す(3回の比較は成立しないものとして扱う)。時間の値(区間の wall)は、一致を要求せずに比べる。 + +worker の裁量(微小な確認ごとに止めないための指示) +- 承認された範囲の中の通常の実装上の選択は、worker が判断して、その理由を BLOCKED.md ではなく実装の記録に残して進める。例: 関数の分け方、名前、report の構造、試験の合成データ、await の配置、記録の書式、上に列挙した許可済みの呼出しの使い方。 +- blocked にしてよいのは、原本の製品の仕様・数値・権限・課金・原本の受入に影響する未確定事項がある場合だけ。その場合は、具体的な箇所と、選択肢を示す。 + +その他(SPEC、TASK_INSTRUCTIONS、C1、両 validation、engine・製品変更・全回帰・commit の禁止、測れない項目を理由つきの未測定にすること)は、すべて従来どおり。 diff --git a/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/ACCEPTANCE_BASELINE.json b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/ACCEPTANCE_BASELINE.json new file mode 100644 index 0000000..d82db2d --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/ACCEPTANCE_BASELINE.json @@ -0,0 +1,56 @@ +[ + { + "id": "P28-02-EQ1", + "requirement_id": "P28-02", + "text": "E1 全状態: 観測の区間では、同じ PID の中で完全な S/K/C の前後の一致を確かめる(SPEC §3.3 (a))。版の間では、S 層・latest_snapshot・latest_digest と、SPEC §3.2 に列挙した K/C の欄を比べる。比べない欄は理由と実際の値を記録し、SimulationDigest だけで判定しない。", + "validation_ids": [ + "p28-02-eq-unit", + "p28-02-eq-native-verify" + ] + }, + { + "id": "P28-02-EQ2", + "requirement_id": "P28-02", + "text": "E2 全イベント: DomainEventStream.subscribe('*') で B1 の後から30分の最後まで、全件を上限なく記録し、開始の counter が一致する場合だけ、event ID をそのまま対応させて全ての欄を比べる。", + "validation_ids": [ + "p28-02-eq-unit", + "p28-02-eq-native-verify" + ] + }, + { + "id": "P28-02-EQ3", + "requirement_id": "P28-02", + "text": "E3 失敗時の拒否: restore_snapshot・SimulationSnapshot.validate・load_from_path に、欠けた key・違う型・範囲外・重複した ID・改ざんした world.bin を与え、code と、拒否の前後の S/K/C と全イベントを記録して検査する。", + "validation_ids": [ + "p28-02-eq-unit", + "p28-02-eq-native-verify" + ] + }, + { + "id": "P28-02-EQ4", + "requirement_id": "P28-02", + "text": "E4 キャッシュの古さと E5 所有権: SPEC §3.3 (b) の専用の scenario の区間で、列挙した操作(コマンド・tick・restore・load・状態を変えないコマンド、返した値の入れ子の変更)だけを行い、前後の変化と双方向の非干渉を実際の値として記録して検査する。前の版での失敗(たとえば E5 の aliasing)は、既存の不具合として記録する(PASS で補わない。harness の無断の変更とは区別する)。列挙の外の状態の変更と、hook の差し替えは禁止。", + "validation_ids": [ + "p28-02-eq-unit", + "p28-02-eq-native-verify" + ] + }, + { + "id": "P28-02-EQ5", + "requirement_id": "P28-02", + "text": "harness の正しさ: R と O の、同じ版の2 PID の間で、版の間の比較の差が0であること。compare_versions.py が、before の source map と OPT の許可された差分の集合を完全に固定し、追加・欠落・登録されていない差分を拒否すること。", + "validation_ids": [ + "p28-02-eq-unit", + "p28-02-eq-native-verify" + ] + }, + { + "id": "P28-02-EQ6", + "requirement_id": "P28", + "text": "提出された S_eq の native(import、parse 2つ、R-A・R-B・O-A・O-B)を Root が実行し、owned PID・private profile・guard・cleanup・source map 1407・全 raw と SHA を結合する。Q で測ったとは表記しない。", + "validation_ids": [ + "p28-02-eq-unit", + "p28-02-eq-native-verify" + ] + } +] diff --git a/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/CONFIG_PROPOSAL.json b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/CONFIG_PROPOSAL.json new file mode 100644 index 0000000..f0b4319 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/CONFIG_PROPOSAL.json @@ -0,0 +1,7 @@ +{ + "project": "the-tree-p28-02-eq", + "models": {"implementer": "codex gpt-6-astra", "reviewer": "claude-opus-5-5 (fresh, Desktop async delivery)"}, + "policy_alignment": "After normal registration, align max_llm_runs 20 -> null with the existing owner script protocol (policy lock, config digest, backups, unchanged rows and baseline, normal Runner reopen), recorded honestly as an owner-delegated decision under the existing human removal of per-item caps. max_repair_attempts stays null.", + "unchanged": ["models of existing projects", "permissions", "auth", "billing and API fallback", "quota fallback rule (structured provider quota only, once, same role, Antigravity claude-opus-5-5-high)"], + "original": {"completed": 23, "denominator": 88, "packages_completed": 4, "package_denominator": 30, "eq_credit": 0} +} diff --git a/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/REGISTRATION_PROPOSAL.json b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/REGISTRATION_PROPOSAL.json new file mode 100644 index 0000000..1737801 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/REGISTRATION_PROPOSAL.json @@ -0,0 +1,111 @@ +{ + "status": "candidate; not registered, dispatched or run. Root verifies it against the original conditions, fixes eq/SPEC.md and eq/TASK_INSTRUCTIONS.md to main, and fills base_commit with that actual SHA.", + "tracked_paths_to_commit": { + "docs/plans/original-completion-2026-10-02/execution/p28-02/eq/SPEC.md": "eq-registration-proposal-r01/SPEC.md", + "docs/plans/original-completion-2026-10-02/execution/p28-02/eq/TASK_INSTRUCTIONS.md": "eq-registration-proposal-r01/TASK_INSTRUCTIONS.md" + }, + "register_project": { + "project": "the-tree-p28-02-eq", + "repo": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部", + "worktrees": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p28-02-eq", + "baseline_file": "eq-registration-proposal-r01/ACCEPTANCE_BASELINE.json", + "validations": { + "p28-02-eq-unit": { + "argv": [ + "{python}", + "docs/plans/original-completion-2026-10-02/execution/p28-02/eq/test_eq.py" + ] + }, + "p28-02-eq-native-verify": { + "argv": [ + "{python}", + "docs/plans/original-completion-2026-10-02/execution/p28-02/eq/verify_eq.py", + "--project-root", + "." + ] + } + }, + "validation_note": "native-verify reads the Root-built bundle at $BUILD_OUTPUT_DIR/p28-02-eq-evidence and fails when it is absent; unit PASS alone never accepts." + }, + "register_task_contract": { + "id": "P28-02-EQ", + "title": "意味を保つ軽量化:同等性の先行固定(harness)", + "requirement_ids": [ + "P28-02", + "P28" + ], + "acceptance_ids": [ + "P28-02-EQ1", + "P28-02-EQ2", + "P28-02-EQ3", + "P28-02-EQ4", + "P28-02-EQ5", + "P28-02-EQ6" + ], + "spec_ref": "docs/plans/original-completion-2026-10-02/execution/p28-02/eq/SPEC.md", + "base_commit": "TBD: actual main SHA that adds eq/SPEC.md and eq/TASK_INSTRUCTIONS.md", + "worker": "codex", + "allowed_paths": [ + "docs/plans/original-completion-2026-10-02/execution/p28-02/eq/**" + ], + "depends_on": [], + "resource_locks": [ + "p28-02-eq" + ], + "validation_ids": [ + "p28-02-eq-unit", + "p28-02-eq-native-verify" + ], + "max_repair_attempts": null + }, + "native_contract": { + "executor": "Root only, after the worker submits S_eq", + "argv": [ + "python3", + "docs/plans/original-completion-2026-10-02/execution/p28-02/eq/run_eq.py", + "--run", + "--readonly", + "", + "--fixture", + "artifacts/original-completion-2026-10-02/p28-current1299-runtime-scale-build-candidate-native-r01/fixture/reference.variant", + "--engine", + "/Applications/Godot.app/Contents/MacOS/Godot", + "--output", + "artifacts/original-completion-2026-10-02/p28-02-eq/native--r01" + ], + "phases": [ + "import", + "parse-base", + "parse-wrapper", + "R-A", + "R-B", + "O-A", + "O-B" + ], + "pins": { + "fixture_sha256": "eb4f770071eb07cd7e136fe54c3f78768cc8de7a4264e62a9af1f06a8f90f9bd", + "engine_sha256": "c7cccbf8fb143e34e02fd6521e09be2c2b974f0d5db080b19071c9c570718ccf", + "product_source_map_sha256": "651f703621c8ed06a724709f75d8bc05b1eef2988c3b3d5d3466096a3f759bf0", + "machine": "Mac16,10" + }, + "bundle_place": "$BUILD_OUTPUT_DIR/p28-02-eq-evidence" + }, + "sequence": [ + "worker submits S_eq (local unit PASS)", + "Root native on frozen S_eq (7 phases)", + "Root raw join and bundle", + "formal validation: p28-02-eq-unit + p28-02-eq-native-verify (both required)", + "fresh independent Opus review, async delivery", + "prepare -> Q_eq qualification (product map, engine, input, settings, EQ files equal) -> Root delegated approval -> integration -> final", + "the S_eq native is the OPT 'before' EQ record; reused only when the Q_eq qualification holds, otherwise rerun on Q_eq", + "then the two remaining frame-before collector runs on Q_eq (OPT_CONTRACT_T1 r02 section 4 (b))" + ], + "assignment": { + "worker": "codex", + "model": "gpt-6-astra", + "reason": "Astra built DIAG and RESTART with the same lifecycle, S/K/C, owned-phase and import-closure machinery and already hit and fixed this repo's GDScript pitfalls; EQ reuses all of them.", + "reviewer": "fresh independent claude-opus-5-5 via Desktop async delivery" + }, + "failure_retention": "All native, validation and review failures are kept with raw and SHA and never rewritten as success; fixes go through the normal repair on the same W.", + "credit": "EQ adds 0; P28-02 moves 23->24 only after OPT, its whole-unit review, integration, final and the ledger." +} diff --git a/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/ROOT_PROPOSAL_BYTE_TRANSFER.json b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/ROOT_PROPOSAL_BYTE_TRANSFER.json new file mode 100644 index 0000000..02ccaeb --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/ROOT_PROPOSAL_BYTE_TRANSFER.json @@ -0,0 +1,76 @@ +{ + "at_jst": "2026-10-21T07:15:27.303190+09:00", + "actual_Opus_governor_session": "local_a7f85421-3eed-4482-8030-c0dca669573a", + "actual_Opus_request": "303; actual response304 prepared five concrete proposal files", + "scope": "Original P28-02 same scope; EQ support only, original credit zero", + "copies": [ + { + "target": "docs/plans/original-completion-2026-10-02/execution/p28-02/eq/SPEC.md", + "source": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p28-02-root-control-r01/eq-registration-proposal-r01/SPEC.md", + "bytes": 10693, + "sha256": "3791ccdcb87e8d71fe9205e1e692ebca9e0f974ea3b5fbc4fbb3943882131f1c", + "byte_identical": true + }, + { + "target": "docs/plans/original-completion-2026-10-02/execution/p28-02/eq/TASK_INSTRUCTIONS.md", + "source": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p28-02-root-control-r01/eq-registration-proposal-r01/TASK_INSTRUCTIONS.md", + "bytes": 2961, + "sha256": "f9937c3c7dff5a25ada453365d26c87fecf009d29518724f0c1e67d2b18afff3", + "byte_identical": true + }, + { + "target": "docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/REGISTRATION_PROPOSAL.json", + "source": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p28-02-root-control-r01/eq-registration-proposal-r01/REGISTRATION_PROPOSAL.json", + "bytes": 4733, + "sha256": "9590fc853a4df8d50cc0d269d23bd9c844dc6931590ff6f24ebf95bb54a8d135", + "byte_identical": true + }, + { + "target": "docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/ACCEPTANCE_BASELINE.json", + "source": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p28-02-root-control-r01/eq-registration-proposal-r01/ACCEPTANCE_BASELINE.json", + "bytes": 2981, + "sha256": "84628bc21205387f8a7143031bdc50c9f68a767d350e6c34b32e0ba1c7059337", + "byte_identical": true + }, + { + "target": "docs/plans/original-completion-2026-10-02/execution/p28-02/eq/registration/CONFIG_PROPOSAL.json", + "source": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p28-02-root-control-r01/eq-registration-proposal-r01/CONFIG_PROPOSAL.json", + "bytes": 821, + "sha256": "775fbbb97cda8b4d4991defdf7871b0fc79f489f4dea34c1733d4830426cf1df", + "byte_identical": true + }, + { + "target": "docs/plans/original-completion-2026-10-02/execution/p28-02/eq/references/OPUS_D2_SCOPE_CLARIFICATION.txt", + "source": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p28-02-root-control-r01/OPUS_D2_SCOPE_CLARIFICATION.txt", + "bytes": 5598, + "sha256": "5775e7b512d9e90dbcfbcb181f5b64dc0fa8207e0947c0a4a6a5c9195565f9bd", + "byte_identical": true + }, + { + "target": "docs/plans/original-completion-2026-10-02/execution/p28-02/eq/references/OPUS_STARTUP_LIFECYCLE_CLARIFICATION.txt", + "source": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p28-02-root-control-r01/OPUS_STARTUP_LIFECYCLE_CLARIFICATION.txt", + "bytes": 5996, + "sha256": "967aebf27ff412f7a16ce771ef7d68abf8cfde0bb76ed19cf6dbf2817ca7acc6", + "byte_identical": true + }, + { + "target": "docs/plans/original-completion-2026-10-02/execution/p28-02/eq/references/OPT_CONTRACT_T1.md", + "source": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p28-02-root-control-r01/OPT_CONTRACT_T1.md", + "bytes": 13952, + "sha256": "ad9f3d76f3500b39263fb898d7c64588b4b47c9e11b456f938195261fd054d16", + "byte_identical": true + } + ], + "existing_tracked_readonly_references": [ + "docs/plans/original-completion-2026-10-02/execution/p28-01/restart/SPEC_CLARIFICATION_01.md", + "docs/plans/original-completion-2026-10-02/execution/p28-01/restart/SPEC_CLARIFICATION_02.md" + ], + "registration_and_worker_not_started": true, + "original_completed": 23, + "original_total": 88, + "packages_completed": 4, + "packages_total": 30, + "product_files_changed": [], + "actual_Opus_scenario_clarification": "Request305/actual response306; SPEC3.3 and TASK/AC boundaries explicitly distinguish observation and intentional E3/E4/E5 scenarios", + "pre_clarification_full_bytes_preserved": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p28-02-root-control-r01/eq-proposal-pre-scenario-clarification-preserved" +}