Define P28-02 passive diagnostics and equivalence acceptance sequence
This commit is contained in:
+148
@@ -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)."
|
||||
}
|
||||
@@ -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 を判定します。
|
||||
@@ -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
|
||||
}
|
||||
@@ -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 の課金はしません。容量待ちは再導入しません。
|
||||
@@ -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 にします。
|
||||
Reference in New Issue
Block a user