From 8c06c3b44235a52f35898b1f6263e8ee064af256 Mon Sep 17 00:00:00 2001 From: Codex Date: Wed, 21 Oct 2026 05:42:36 +0900 Subject: [PATCH] Define P28-02 passive diagnostics and equivalence acceptance sequence --- .../p28-02/REGISTRATION_PROPOSAL.json | 148 ++++++++++++++++++ .../execution/p28-02/REVIEW_DELIVERY_PLAN.md | 7 + .../execution/p28-02/ROOT_ADOPTION_R02.json | 72 +++++++++ .../execution/p28-02/SPEC.md | 92 +++++++++++ .../execution/p28-02/TASK_INSTRUCTIONS.md | 30 ++++ 5 files changed, 349 insertions(+) create mode 100644 docs/plans/original-completion-2026-10-02/execution/p28-02/REGISTRATION_PROPOSAL.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/p28-02/REVIEW_DELIVERY_PLAN.md create mode 100644 docs/plans/original-completion-2026-10-02/execution/p28-02/ROOT_ADOPTION_R02.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/p28-02/SPEC.md create mode 100644 docs/plans/original-completion-2026-10-02/execution/p28-02/TASK_INSTRUCTIONS.md diff --git a/docs/plans/original-completion-2026-10-02/execution/p28-02/REGISTRATION_PROPOSAL.json b/docs/plans/original-completion-2026-10-02/execution/p28-02/REGISTRATION_PROPOSAL.json new file mode 100644 index 0000000..14e450b --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p28-02/REGISTRATION_PROPOSAL.json @@ -0,0 +1,148 @@ +{ + "status": "candidate r02; not registered, dispatched or run. Root commits execution/p28-02/SPEC.md and TASK_INSTRUCTIONS.md to main and fills base_commit with that actual SHA.", + "assignment": { + "P28-02-DIAG": { + "worker": "codex", + "model": "gpt-6-astra", + "route": "complex", + "reason": "Passive phase/sub-part attribution probe reusing the collector's owned/guard machinery across GDScript and Python; Astra wrote collector and RESTART and knows the import closure and native pitfalls (parse/type, key ordering) already found." + }, + "P28-02-OPT": { + "worker": "codex", + "model": "gpt-6-astra", + "route": "complex", + "note": "Registered only after DIAG results select the targets; its own spec and instructions will be drafted then." + }, + "independent_review": { + "model": "claude-opus-5-5", + "context": "fresh", + "transport": "separate Desktop session, async delivery per REVIEW_DELIVERY_PLAN.md" + }, + "native_execution": "Root only, after worker submits exact frozen S and local unit PASS, before formal unit + native-verify and independent review; isolated stage import/parse/3 DIAG PIDs, raw join/bundle; normal candidate source/settings/engine/input qualification afterward. Never relabel S measurement as Q execution." + }, + "register_project": { + "project": "the-tree-p28-02-diag", + "repo": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部", + "worktrees": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p28-02-diag", + "baseline": [ + { + "id": "P28-02-D1", + "requirement_id": "P28-02", + "text": "現在の source 1407 で、代表入力 R の tick を、tick ID で結びつけた inclusive の wall 区間 I0〜I11 として、受動的な観測だけで別 PID の3回で測る(observer の費用は別に記録し、差し引かない)。", + "validation_ids": [ + "p28-02-diag-unit", + "p28-02-diag-native-verify" + ] + }, + { + "id": "P28-02-D2", + "requirement_id": "P28-02", + "text": "tick の外で、snapshot の変換を独立の inclusive 計測(N=5、合算しない)で、restore・save・load・validator を使い捨ての scratch でだけ測り、live の全状態の一致と参照の漏れの無さを確かめる。測れない粒度は理由つきの未測定にする。", + "validation_ids": [ + "p28-02-diag-unit", + "p28-02-diag-native-verify" + ] + }, + { + "id": "P28-02-D3", + "requirement_id": "P28-02", + "text": "経路は path_query_measured の件数と時間だけを区間に結びつけ、connector の費用とは呼ばない。machine・build・seed・RNG state・入力・区間・平均・P95・最大・標本数を記録し、欠損を 0 で補わない。", + "validation_ids": [ + "p28-02-diag-unit", + "p28-02-diag-native-verify" + ] + }, + { + "id": "P28-02-D4", + "requirement_id": "P28", + "text": "worker の提出した S を Root が隔離した stage で native 実行し(import・parse・3 PID)、owned PID・private profile・guard・cleanup・source map 1407・全 raw と SHA を結合する。最終候補 Q で測ったとは表記しない。", + "validation_ids": [ + "p28-02-diag-unit", + "p28-02-diag-native-verify" + ] + } + ], + "validations": { + "p28-02-diag-unit": { + "argv": [ + "{python}", + "docs/plans/original-completion-2026-10-02/execution/p28-02/diag/test_diag.py" + ] + }, + "p28-02-diag-native-verify": { + "argv": [ + "{python}", + "docs/plans/original-completion-2026-10-02/execution/p28-02/diag/verify_diag.py", + "--project-root", + "." + ] + } + }, + "validation_note": "native-verify reads the Root-built bundle at $BUILD_OUTPUT_DIR/p28-02-diag-evidence (3 DIAG PIDs on the exact submitted S) and fails when it is absent; unit PASS alone never accepts." + }, + "register_task_contract": { + "id": "P28-02-DIAG", + "title": "意味を保つ軽量化:実測上位の特定(受動的な診断)", + "requirement_ids": [ + "P28-02", + "P28" + ], + "acceptance_ids": [ + "P28-02-D1", + "P28-02-D2", + "P28-02-D3", + "P28-02-D4" + ], + "spec_ref": "docs/plans/original-completion-2026-10-02/execution/p28-02/SPEC.md", + "base_commit": "TBD: actual main SHA that adds execution/p28-02/SPEC.md and TASK_INSTRUCTIONS.md", + "worker": "codex", + "allowed_paths": [ + "docs/plans/original-completion-2026-10-02/execution/p28-02/diag/**" + ], + "depends_on": [], + "resource_locks": [ + "p28-02-diag" + ], + "validation_ids": [ + "p28-02-diag-unit", + "p28-02-diag-native-verify" + ], + "max_repair_attempts": null + }, + "opt_contract_outline": { + "id": "P28-02-OPT", + "baseline": [ + "P28-02 原 work と原 acceptance", + "P28 の横断条件1〜6(原文)", + "U1 未達と、実施していない分岐の開示(補助)", + "U2 証拠の範囲の適用(補助)" + ], + "required_validations": [ + "E1 (var_to_bytes, then the complete typed comparator from RESTART repair 8 only for dict-order-only differences) to E5 unit tests", + "E2 via DomainEventStream.subscribe('*') unbounded full event record", + "(a) phase comparison in the DIAG interval, 3 PIDs before/after", + "(b) frame budget comparison via the accepted collector P1/P2 on process_real_delta, 3 PIDs before/after", + "one RESTART native pair", + "one formal full roster on the final candidate" + ], + "allowed_paths": "段階A で特定した製品の file と、その試験。具体的な path は段階A の後に決める" + }, + "credit": "DIAG adds 0. P28-02 moves 23->24 only after OPT final, the whole-unit independent review and the ledger. P28 package stays in progress (P27, P28-03 pending).", + "policy_note": "New project: align max_llm_runs to null under the existing owner delegation with the same owner script protocol, recorded honestly.", + "unchanged": [ + "original 30/88", + "budgets", + "cross-cutting text", + "Runner/permissions/auth/billing" + ], + "sequence": [ + "worker submits S (local unit PASS)", + "Root runs native on frozen S in an isolated stage: import, parse, 3 DIAG PIDs", + "Root joins raw and builds the bundle", + "registered validation: unit + native-verify", + "fresh independent Opus reviews all 4 conditions and all raw (async delivery)", + "prepare -> qualify that candidate source/settings/engine/input equal the measured S -> Root delegated approval -> integration -> final", + "DIAG adds 0; P28-02 credit only after OPT and its whole-unit review" + ], + "p27_note": "P27 remains in_progress; it is a package-level prerequisite for P28 final completion, not a stop reason for P28-02 diagnosis or work (existing human order-change permission kept)." +} diff --git a/docs/plans/original-completion-2026-10-02/execution/p28-02/REVIEW_DELIVERY_PLAN.md b/docs/plans/original-completion-2026-10-02/execution/p28-02/REVIEW_DELIVERY_PLAN.md new file mode 100644 index 0000000..bcc5273 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p28-02/REVIEW_DELIVERY_PLAN.md @@ -0,0 +1,7 @@ +# P28-02 独立レビューの非同期配送(P28-01-GATE と同じ方式) + +1. 凍結: worker の S 提出 → Root の隔離 stage での native(import・parse・3 PID)→ raw の結合と bundle → unit と native-verify の両方の正式 validation が合格した後、Root は通常の手順で、review の W・.review-material・packet・schema・target を作って凍結し、SHA を `READY_FOR_DESKTOP_REVIEW.json` に記録します。受信待ちの timer は、まだ始めません。 +2. 独立レビュー(1回): Desktop の管制が、別の新しいセッション(claude-opus-5-5、fresh、読取専用、engine と試験は無し)を起動します。担当は全資料の SHA をプログラムで照合し、schema に一致する結果だけを `DESKTOP_RESULT.json` に新規保存します。管制は、担当のセッションが終わった後に `DESKTOP_DELIVERY.json` を最後に作ります。 +3. 受け入れ(1回): Root は delivery ができた後で、同じ凍結 W・資料の全 SHA・packet・S・schema・target が一致することを照合し、未編集の結果を、通常の check_schema → review → evidence/state に1回だけ通します。一致しなければ取り込まず、管制に戻します。 +4. 記録: 独立セッションの ID と結果の SHA、CLI の認証が切れていたこと(回復とはしない)を、事実として記録します。 +5. DIAG のレビューは、段階A の成果物(probe、checker、試験)を判定します。OPT のレビューは、P28-02 の whole-unit として、原 work と原 acceptance、横断条件6件、U1/U2 を判定します。 diff --git a/docs/plans/original-completion-2026-10-02/execution/p28-02/ROOT_ADOPTION_R02.json b/docs/plans/original-completion-2026-10-02/execution/p28-02/ROOT_ADOPTION_R02.json new file mode 100644 index 0000000..d0089a7 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p28-02/ROOT_ADOPTION_R02.json @@ -0,0 +1,72 @@ +{ + "at_jst": "2026-10-21T05:42:20.839148+09:00", + "authority": "Actual existing Claude Desktop governor Opus5.5 medium messages277 and279; Root adopts r02 corrections under human continuation/order/main/push permission; no new human SHA-specific utterance", + "governor_session": "local_a7f85421-3eed-4482-8030-c0dca669573a", + "source_main_before_draft_adoption": "413c8e3e518ab6ba596d2c1f07faec348af544ea", + "original_unit": "P28-02", + "original_work": "失敗時拒否を含む同等性を先に固定し、snapshot変換・検証・コピー・経路接続の実測上位から改善する。", + "original_acceptance": "同条件の反復比較と全状態・全イベント一致を確認し、キャッシュの古さ・所有権・不正入力を検証する。", + "original_cross6": [ + "原本条件とUI操作が一致", + "Runtimeの実利用・会計・行動へ接続", + "途中保存・再起動で再現", + "異常/境界/中断を検証", + "関連回帰PASS", + "要件別ログとソースハッシュを保存" + ], + "original_denominator": [ + 30, + 88 + ], + "formal_original_completed": 23, + "packages_completed": 4, + "partial_credit": false, + "scope": "DIAG only, original credit0; OPT implementation/target only after real diagnostics", + "actual_Opus_model_assignment": { + "P28-02-DIAG": { + "worker": "codex", + "model": "gpt-6-astra", + "route": "complex", + "reason": "Passive phase/sub-part attribution probe reusing the collector's owned/guard machinery across GDScript and Python; Astra wrote collector and RESTART and knows the import closure and native pitfalls (parse/type, key ordering) already found." + }, + "P28-02-OPT": { + "worker": "codex", + "model": "gpt-6-astra", + "route": "complex", + "note": "Registered only after DIAG results select the targets; its own spec and instructions will be drafted then." + }, + "independent_review": { + "model": "claude-opus-5-5", + "context": "fresh", + "transport": "separate Desktop session, async delivery per REVIEW_DELIVERY_PLAN.md" + }, + "native_execution": "Root only, after worker submits exact frozen S and local unit PASS, before formal unit + native-verify and independent review; isolated stage import/parse/3 DIAG PIDs, raw join/bundle; normal candidate source/settings/engine/input qualification afterward. Never relabel S measurement as Q execution." + }, + "raw_spec_sha256": "f58378b6cb317478f9d26776d0a236804f4ac80789d93f1555133298e4328d24", + "Runner_text_strip_spec_sha256": "0420dd4d2a95db65adc685bca91b9ff686650af31675f193992d75909a676ac6", + "C1_semantics": "Raw SHA and Runner strip SHA differ only by normal trailing newline of same unchanged source; not a specification change", + "docs": { + "SPEC.md": { + "sha256": "f58378b6cb317478f9d26776d0a236804f4ac80789d93f1555133298e4328d24", + "bytes": 11675 + }, + "TASK_INSTRUCTIONS.md": { + "sha256": "b9b635b2598aee32efac662aa21d21fc88f55fbfdc6097cf07483e7fa5d32a7d", + "bytes": 2955 + }, + "REGISTRATION_PROPOSAL.json": { + "sha256": "36dc20e1e0bcb2604c620408fcb03216804abf83183df310b75beaa4290e744b", + "bytes": 7065 + }, + "REVIEW_DELIVERY_PLAN.md": { + "sha256": "7515feead1a9872927e278cae0a8973336719476759062dfd0d357b426f3bb30", + "bytes": 1677 + } + }, + "Root_clerical_sync": "assignment.native_execution stale after-final field aligned to actual Opus279 sequence; original before bytes retained in artifacts/p28-02-root-control-r01/DESKTOP_R02_REGISTRATION_BEFORE_METADATA_SYNC.json; no other semantic changes", + "registration_template_note": "Only permitted register_project fields passed; informational validation_note stays documentation. Actual base_commit filled from committed main at registration and stored as exact registered contract. Candidate statuses in initial draft remain historical.", + "native_acceptance_required_before_formal_completion": true, + "registered": false, + "dispatch_started": false, + "new_engine_runs": 0 +} diff --git a/docs/plans/original-completion-2026-10-02/execution/p28-02/SPEC.md b/docs/plans/original-completion-2026-10-02/execution/p28-02/SPEC.md new file mode 100644 index 0000000..8f6c84f --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p28-02/SPEC.md @@ -0,0 +1,92 @@ +# P28-02「意味を保つ軽量化」仕様(候補 r02。未登録・未実行) + +- 状態: 候補です。Root が原本の条件と照合して main に commit し、その実 SHA を base にしてから、通常の登録をします。 +- 前提: P28-01 は正式に完了しています(Q `ae9ae47646434dd57fc21f3e8566d0d35b242ab1`、`execution/p28-01/P28_01_FORMAL_COMPLETION_AE9AE47.json` `f778ac8d…`)。その測定(full9 `db9d613`、r02、RESTART)と、製品 source 1407 を引き継ぎます。 + +## 1. 原本の条件(変更しない) + +- 成果単位 P28-02(`work_packages.json` の P28.remaining_deliverables) + - work: 失敗時拒否を含む同等性を先に固定し、snapshot変換・検証・コピー・経路接続の実測上位から改善する。 + - acceptance: 同条件の反復比較と全状態・全イベント一致を確認し、キャッシュの古さ・所有権・不正入力を検証する。 +- P28 の横断条件6件(原文): 原本条件とUI操作が一致 / Runtimeの実利用・会計・行動へ接続 / 途中保存・再起動で再現 / 異常/境界/中断を検証 / 関連回帰PASS / 要件別ログとソースハッシュを保存。 +- パッケージの依存: P28 は P27 に依存し、P27 は in_progress です。この依存は、P28 パッケージを最終的に完了と判定するときの前提です。P28-02 の診断と作業を止める理由にはしません(既存の、人間による順序変更の許可を保持します)。P27 が完了したとは主張しません。 +- 分母は 30/88 で、部分点はありません。現在の正式完了は 23/88、パッケージは 4/30 です。予算の false 6件(R0 の2件、P1 の2件、P2 の2件)は、そのまま保持します。 + +## 2. 事実と不足(数値を結びつけない) + +- 実測(P28-01 から引き継ぐ。それぞれの区間の値で、互いに結びつけない): + - full9 の R: kernel の `process_real_delta` の1回の呼出し(frame)が、P1 x1 で平均 479.210 ms、P2 x3 で P95 5062.697 ms。 + - r02(headless・Ops OFF・x1。別の区間): 外側の1分 advance が平均 826.6 ms、外側の snapshot が 77.6 ms(count 5)、保存は約 300 ms、読込は約 3.2 s。 +- source から確定していること: 毎 tick の PUBLISH_SNAPSHOT で `create_snapshot()` が呼ばれます(`autoload/simulation_runtime.gd:12616-12621`)。ただし、r02 の 77.6 ms を、P1 の 479 ms の中の同じ呼出しの固定の費用として扱うことはしません(区間も条件も違うため)。 +- 不足: 現在の source での、tick の中の phase ごとの wall 区間、snapshot・検証・コピーの内訳、経路の費用。推測で埋めません。 + +## 3. 段階A: `P28-02-DIAG`(診断。製品は変更しない。原本の加算は0) + +### 3.1 live の状態の扱い + +- live の Runtime の状態を変えてよいのは、次の2つだけです。それ以外の、状態を変える API の呼出し、製品の hook や関数の差し替えは禁止です。 + - fixture の最初の導入(`restore_snapshot` で入力 R を読み込む)。 + - 決められた `GameClock.advance_minutes(1)` による進行。 +- 公開されている読取だけの API(`create_snapshot()` など)は、tick の外で呼んでかまいません。その後、live の全状態の `var_to_bytes` が、呼ぶ前と完全一致することを確かめます。一致しなければ失敗です。 + +### 3.2 tick の中の区間(受動的な観測。`scripts/core/simulation_kernel.gd:122-157`) + +- `tick_started(m)` で tick の ID と、進行の前の分 m を記録します。 +- APPLY_COMMANDS の `tick_phase_started` は、進行の前の分 m で発行されます。TIME_BOUNDARIES 以降の phase と `tick_completed` は、進行の後の分 m+1 で発行されます。phase を分で区切らず、tick の ID で結びつけます。 +- 区間は、隣り合う信号の間の **inclusive な wall 区間**として記録します。各 handler の純粋な排他時間だとは主張しません。区間ごとの内容は次のとおりです。 + - I0: `tick_started` → APPLY_COMMANDS の開始 + - I1: APPLY_COMMANDS → TIME_BOUNDARIES(clock の進行、`_sync_calendar_fields`、`_handle_time_boundaries` を含む) + - I2〜I10: TIME_BOUNDARIES → MANA → … → PUBLISH_SNAPSHOT の各開始の間 + - I11: PUBLISH_SNAPSHOT → `tick_completed`(`create_snapshot`、同期の signal である `snapshot_published` / `state_updated` の受け手、`snapshot_version` の更新を含む) +- observer 自身の費用: 各 callback の中で、自分の時間を別に計測して記録します。区間からは差し引きません(二重に数えないために、区間は「observer を含む」と明記します)。 +- 経路: `PathService.path_query_measured(duration_us)`(`scripts/world/path_service.gd:4`、`:985`)に受動的に接続し、query の件数と時間を、その時点の区間に結びつけます。これは query の費用だけで、connector の更新や再構築の費用は含みません。query の時間を、connector 全体の費用へ広げて解釈しません。 + +### 3.3 tick の外の内訳(独立した inclusive の計測。合算して100%にしない) + +- snapshot の変換: live で `create_snapshot()` 全体を N=5 回、各 service の `create_snapshot()` をそれぞれ N=5 回、別々に計測します。各値は独立した inclusive の計測で、排他的な内訳として足し合わせることはしません。N=5 は r02 の試行数に揃えたもので、R で1回約 80 ms のため負荷が小さいことが根拠です(製品の値ではありません)。 +- 検証・コピー・保存・読込: live の状態は使いません。使い捨ての scratch で、公開されている restore・save・load・validator だけを使います。 + - scratch に渡すのは、live の snapshot の deep copy です。保存先は private user:// の scratch の path です。 + - 各操作を N=5 回計測します。 + - 終わった後に、live の全状態が一致すること、scratch から live への参照の漏れや副作用が無いことを確かめます。 + - 公開の API だけで scratch を作れない場合(autoload に触れる必要がある場合)は、その項目を理由つきの未測定にして、判断に戻します。 +- 粒度: 製品の内部で分けられない変換・検証・コピーは、測れる粒度(たとえば「restore 全体」)のまま記録します。分けたことにはしません。 +- 値: 正当に測れた 0 は 0 として記録します。測れなかったものは null と理由にします。欠損を 0 で補うことは拒否します。 + +### 3.4 条件と順序 + +- 入力・engine・machine は P28-01 の R と同じです(入力 `eb4f7700…`、engine `c7cccbf8…`、Mac16,10)。headless で実行します。 +- 区間: warm 30分、測定30分。別の PID で3回行います。3回の間で、区間の順位が一致したかを記録します。 +- 実行の順序(P08/P18 の通常の方式を再利用する): + 1. worker が S を提出します(局所の unit 試験の全件 PASS つき)。 + 2. Root が、凍結した S を隔離した stage で、import・parse・DIAG の3 PID を native で実行します。 + 3. Root が raw を結合し、bundle を作ります。 + 4. 登録した validation(unit と、bundle に対する native-verify の両方)を実行します。 + 5. 別の新しい Opus が、全4条件と全 raw をレビューします。 + 6. prepare → 候補の source と測定した S の一致の資格確認 → Root の委任による承認 → integration → final。 + - native は、測定した実際の S のものとして記録します。最終候補 Q で測ったとは表記しません。資格確認で、Q と S の source・設定・engine・入力が一致することを確かめます。 + +## 4. 段階B: `P28-02-OPT`(DIAG の後に、根拠をもとに登録する) + +- 対象: DIAG で実測の上位になったもののうち、原 work の4つの分類(snapshot の変換・検証・コピー・経路接続)に入るものだけです。選ぶのは管制で、DIAG の表を根拠に記録します。上位が4分類の外にあった場合は、原 work の範囲の外なので、判断に戻します。 +- 同等性を先に固定します(変更の前に、試験として凍結する): + - **E1 全状態**: + - まず `var_to_bytes` の完全一致を確かめます。 + - 一致しない場合に限り、RESTART の修正8で確定した完全な typed の正規表現と比べます。これは、dict の key を文字で並べ(衝突は拒否)、全ての key と値の `typeof` と配列の順序と値を保つものです。それで一致すれば「dict の列挙の順序だけの差」として、その path を記録します。 + - それ以外の差は不一致です。SimulationDigest だけでの判定は不可です。 + - **E2 全イベント**: + - `DomainEventStream.subscribe(&"*", &"p28_02_equivalence_observer", …)`(`scripts/core/domain_event_stream.gd:5`、`:17`、配送は `:76-85`)で受動的に記録し、全件を上限なく、順序・型・payload・ID・counter とともに保持します。 + - subscriber の登録が snapshot を変えないこと(`create_snapshot` の範囲の外)を確かめ、終わったら `unsubscribe` します。 + - recent_events(直近256件)の一致だけを、全イベントの一致として扱うことはしません。 + - **E3 失敗時の拒否**: 不正な入力(改ざん、型の違い、欠けた key、範囲外、重複した ID)が、変更の前と同じ code で、原子的に拒否されること。 + - **E4 キャッシュの古さ**: 無効化の全ての経路(コマンド、tick、restore、load)で、古い値を返さないこと。 + - **E5 所有権**: 公開した値を外から変更しても内部に影響せず、その逆も無いこと。 +- 比較は2種類に分けて固定します: + - (a) phase の比較: DIAG と同じ区間(headless、`advance_minutes`)で、変更の前と後を別の PID で各3回。`advance_minutes` では `performance_budget.record_simulation_frame` が呼ばれず、`_samples` が空になるため、この比較では kernel の予算の値を使いません。 + - (b) frame の予算の比較: 製品の経路 `process_real_delta` を通る、受入済みの collector の windowed の P1(x1)と P2(x3)を、変更の前(現在の Q)と後で、別の PID で各3回。kernel 定義の標本で比べます。 +- RESTART の native の pair を1回行い、保存と再開の再現が保たれることを確かめます。製品の source が変わるので、最終候補で正式の全 roster を1回実行します。 +- 予算は P28-02 の受入の条件ではありません。実測をそのまま記録し、false は合格に補いません。同等性 E1〜E5 が1つでも崩れた変更は採用しません。 +- 独立レビュー: 原 work と原 acceptance、横断条件6件、補助の U1/U2 を、whole-unit として判定します。 + +## 5. 共通の制約 + +- 予算値、原本の分母、横断条件の原文は変更しません。Runner 本体、権限、認証、課金も変更しません。修正回数の上限は null で、API の課金はしません。容量待ちは再導入しません。 diff --git a/docs/plans/original-completion-2026-10-02/execution/p28-02/TASK_INSTRUCTIONS.md b/docs/plans/original-completion-2026-10-02/execution/p28-02/TASK_INSTRUCTIONS.md new file mode 100644 index 0000000..148a11b --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p28-02/TASK_INSTRUCTIONS.md @@ -0,0 +1,30 @@ +# 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 にします。