From 9694f50ee63750192376ca69bc7dda3f884784c5 Mon Sep 17 00:00:00 2001 From: Takeshi Date: Fri, 16 Oct 2026 01:53:14 +0900 Subject: [PATCH] Record request resend save proof and correct whole-function evidence pins --- .../OPUS_AFTER_C_INPUT_CORRECTION_REQUEST.txt | 6 + .../OPUS_C_CORRECTED_INPUT_CONTINUATION.json | 7 + ...OPUS_C_CORRECTED_INPUT_CONTINUATION.stderr | 0 .../OPUS_REPAIR6_C_RUN_DECISION.json | 7 + .../OPUS_REPAIR6_C_RUN_DECISION.stderr | 0 .../OPUS_REPAIR6_C_RUN_REQUEST.txt | 3 + ...POST_P18_CURRENT_SOURCE_APPLICABILITY.json | 88 +++-- .../REPAIR5_PRESERVED_WORK.json | 49 +++ .../REPAIR5_PRESERVED_WORK.tar.gz | Bin 0 -> 36256 bytes .../ROOT_CORRECTED_C_BUNDLE_LOCAL_PASS.json | 9 + ...ROOT_FULL_FUNCTION_PIN_CORRECTION_R02.json | 54 +++ .../ROOT_REPAIR6_ACTUAL_START.json | 18 + ...T_SAME_MINUTE_RESEND_FORMAL_ADMISSION.json | 11 + .../ROOT_SAME_MINUTE_RESEND_FORMAL_INPUT.json | 40 +++ ...ROOT_SAME_MINUTE_RESEND_FORMAL_RESULT.json | 328 ++++++++++++++++++ ...T_SAME_MINUTE_RESEND_NATIVE_ADMISSION.json | 15 + .../idempotency-paid-formal-r01.gd | 143 ++++++++ .../idempotency-paid-midnight-r01.gd | 230 ++++++++++++ .../p04-correct-full-body-pins-r02.py | 19 + .../p04-idempotency-formal-prepare-r01.py | 19 + .../p04-idempotency-native-prepare-r01.py | 21 ++ .../p04-idempotency-paid-formal-native-r01.py | 83 +++++ ...04-idempotency-paid-midnight-native-r01.py | 73 ++++ .../p04-idempotency-root-audit-r01.py | 17 + .../plan_validation.json | 2 +- .../work_packages.json | 24 +- 26 files changed, 1221 insertions(+), 45 deletions(-) create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_AFTER_C_INPUT_CORRECTION_REQUEST.txt create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_C_CORRECTED_INPUT_CONTINUATION.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_C_CORRECTED_INPUT_CONTINUATION.stderr create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_REPAIR6_C_RUN_DECISION.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_REPAIR6_C_RUN_DECISION.stderr create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_REPAIR6_C_RUN_REQUEST.txt create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/REPAIR5_PRESERVED_WORK.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/REPAIR5_PRESERVED_WORK.tar.gz create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/ROOT_CORRECTED_C_BUNDLE_LOCAL_PASS.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/ROOT_FULL_FUNCTION_PIN_CORRECTION_R02.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/ROOT_REPAIR6_ACTUAL_START.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/ROOT_SAME_MINUTE_RESEND_FORMAL_ADMISSION.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/ROOT_SAME_MINUTE_RESEND_FORMAL_INPUT.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/ROOT_SAME_MINUTE_RESEND_FORMAL_RESULT.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/ROOT_SAME_MINUTE_RESEND_NATIVE_ADMISSION.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/idempotency-paid-formal-r01.gd create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/idempotency-paid-midnight-r01.gd create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-correct-full-body-pins-r02.py create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-formal-prepare-r01.py create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-native-prepare-r01.py create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-paid-formal-native-r01.py create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-paid-midnight-native-r01.py create mode 100644 docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-root-audit-r01.py diff --git a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_AFTER_C_INPUT_CORRECTION_REQUEST.txt b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_AFTER_C_INPUT_CORRECTION_REQUEST.txt new file mode 100644 index 0000000..638c0b6 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_AFTER_C_INPUT_CORRECTION_REQUEST.txt @@ -0,0 +1,6 @@ +P04-01のrepair5/C run cb864ee199f346408370f8944e574eb7は通常terminal exit2で終了、workerは供給資料の4複数行関数SHAに本文が含まれないことを正しく検出しblockedを返しました。raw所有/保存/帳簿3個別検査はpass、23改変負例reject、合成補正のみpassで原成果加点0。この結果を受けRootが供給不備を実修正しました。全8未提出worker編集をbyte/hash一致でcheckpoint保存し、workerソース編集0。既存Cは保持し全再実装しません。 +Root補正実記録: +{"all20_whole_functions_byte_equal": true, "changed_hash_rows": [{"path": "autoload/simulation_runtime.gd", "function": "_advance_staff_ai", "old_sha256": "c7c440bf77850b2348040c0ae1b17ee11fdca1cea9605d51076c4a53a1ed2edd", "new_whole_raw_sha256": "0e222987f7c5e25583dbaba8fe63784aa563715067396e8d31d10bd191e7179b", "whole_function_unit_bytes": 2105}, {"path": "autoload/simulation_runtime.gd", "function": "_release_closed_business_request", "old_sha256": "7fb1b2c4197319d9ff29d7ab565306ecd0b569e331491281ed71d3a38d3a8695", "new_whole_raw_sha256": "6dbde3a3d425e47a049dcc4f05eae6f01fe9784f473c0fb1019a0633c239d83b", "whole_function_unit_bytes": 2414}, {"path": "autoload/simulation_runtime.gd", "function": "_complete_service_transaction", "old_sha256": "c7ccce01292699052b8284383ad77f1fe0a5ead9a9c3936622ad9c3b93a3e408", "new_whole_raw_sha256": "f2b6e96a8eeef3dd3f8419b4d9d5ef4e1d13241600ce970bdd78a924428cac6c", "whole_function_unit_bytes": 614}, {"path": "scripts/facility/facility_service.gd", "function": "_prepare_service_for_tick", "old_sha256": "8a9bef4ec1bbe3b25c418f8c7d04d4233cedaa942eda5cc77d530280b0f129de", "new_whole_raw_sha256": "b35c2c0fb23a04258b71995dd7c3b6dfacbbcdf36106e2e3348acef0e18d21cc", "whole_function_unit_bytes": 1958}, {"path": "scripts/facility/facility_service.gd", "function": "_complete_service", "old_sha256": "38a16ace875e4f4b09133b10677cb50871732ca7177166b8659b07c2d79e61d0", "new_whole_raw_sha256": "494edfd11cb3e896d73c2c6fdbe7c1193efce6d869b105e526d2f1dfd1168142", "whole_function_unit_bytes": 1387}, {"path": "scripts/facility/facility_service.gd", "function": "_fail_service", "old_sha256": "b4dbc53b40ac3eb4e639bdf13d9f5538eb64a7bd6df22ec230e7baef4a535f58", "new_whole_raw_sha256": "56f61b255217bddb4c8a6ad3af6ed1f9edc3b6a6e928dacf2105be6698936de5", "whole_function_unit_bytes": 484}], "old_report_sha256": "ecb92215b7bfb4368ddeb6d44dcd467d13e97d677ca2f29df3ab9684f6c757c7", "new_report_sha256": "46e0cc35cb95496d5f26d3cab7d3a31cb29faacaa16714daab3aefdf65b420a3", "corrected_bundle": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/audit-support/native-first-current", "new_manifest_sha256": "dbaab3c293c191eb5f3aff34854945e2d564f824df50a92802b3a7eda55321a8", "old_bytes_preserved_in": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/audit-support/native-first-current/root-corrections-r02", "product_source_changed": false, "new_engine_runs": 0} +補正はGit registered deb1bcb とproduction5f6bc11の各blobから、行頭func/static func開始から次の行頭named funcまたはEOFまでraw bytesを独立抽出し20/20全文一致を確認。hash変更は4signature切断+2後続comment込みで6件。POST_P18_CURRENT_SOURCE_APPLICABILITY.jsonとSOURCE_MANIFEST.jsonの該当1rowを更新、旧全byteはbuild_dir/audit-support/native-first-current/root-corrections-r02/に保持。現在のactual bundleをRootがそのままworker checker verify_native(base)で実行してPASS、engine再実行0。正規化や架空receipt補正ではなく、実Git blobの全文再計算です。 +次の1行動を判断してください。期待: 保持Cのまま、補正済みbundleで必要Python検証を行い、古いblocked説明/c-native-validationを同期して正常提出応答をする短い継続。製品・原15条件+EV/原7領域/安全性3結果・全30/88は不変。正常repair6へ進む場合も使用済5/max null維持。C段階の提出とwhole P04未達は区別し、未収集indexで重複validateしない。既存Rootprobe/Reader/全Cコードの再作成は禁止。現在C native_applicabilityのlegacy comment-prefix候補はRoot供給補正後には不要なので、全文SHAだけを要求する最小修正(約数行)と、signature-only SHAを拒否する負例の追加が妥当か判断してください。全関数old==newは元から必須で維持します。 +モデルはこの限定継続の難度であなたが選択(既定Sol、必要時Astra)。byte一致の供給根拠とtask外budget再承認待ちはありません。Root追加paid255/command再送の証拠は今回C範囲へ追加せず保持しており、workerの範囲を膨らませません。 diff --git a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_C_CORRECTED_INPUT_CONTINUATION.json b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_C_CORRECTED_INPUT_CONTINUATION.json new file mode 100644 index 0000000..af7ca7b --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_C_CORRECTED_INPUT_CONTINUATION.json @@ -0,0 +1,7 @@ +{ + "action": "request-repair", + "task_id": "P04-01", + "reason": "repair6として限定継続を依頼する。対象範囲はallowed_pathsのみで、既存のC実装(Rootprobe/Reader/全Cコード)は保持し、作り直さない。Root補正済みbundle(manifest dbaab3c2…、report 46e0cc35…、20/20関数が全文byte一致、hash更新6件、旧bytesはroot-corrections-r02に保持、engine再実行0)を前提とする。(1) tools/check_p04_order_evidence.py:444-454 native_applicabilityの暫定処理を外す。現在はコメント除去版の候補リスト(candidates/offsets)を許容しているが、全文raw SHA(sha256(new[function]) == production_body_sha256 == registered_body_sha256)だけを受け付ける数行の修正にする。old[function]==new[function]の全関数一致は従来どおり必須とする。「Root's report ends before…」のコメントは削除または修正する。(2) checker_native_fixtures.py(またはnegative fixtures)に負例を追加する。signature行だけのSHA、および後続コメントを除いた本文SHAをproduction_body_sha256に入れた行は、どちらもrejectされることを確認する。既存の23改変負例はすべてreject維持とする。(3) 補正済みbundleに対してPython検証を1回ずつ実行する。verify_native(base)のPASS、raw個別検査3件、全負例reject、applicability/既存fixture/A-B確認が対象。実行していない検査はPASSと報告しない。(4) c-native-validation.json、EVIDENCE_COLLECTION.md、CHECKER_PROTOCOL.mdに残る古いblocked説明(4つの複数行関数SHAに本文が含まれない件)を補正後の実記録に合わせて更新する。旧値と新値は両方明記する。(5) 正常応答として提出する。C段階の提出とP04-01全体の未達は区別し、formal_original_credit=0、原15条件+EV/7領域/安全性3結果、全30/88の分母は変更しない。未収集のindexについて重複validateは行わず、Root追加分(paid255/コマンド再送)の証拠も範囲に加えない。製品ソース、engine、Runner、gitへの書き込みは0とし、使用済repair 5件・max null・予算の変更は提案にも含めない。", + "codex_model": "gpt-6.1-sol", + "codex_model_reason": "修正範囲は特定済みで小さい。checker 1箇所の候補リストを全文SHAの一致比較に置き換える数行、負例1〜2件の追加、既存Python検証の再実行、文書同期で終わる。新しい設計判断、engine実行、複数ファイルにまたがる推論は不要で、供給bytesの根拠もRootが確定している。Astraに上げるほどの難度はなく、時間と使用量の面から既定のSolが適切と判断した。" +} diff --git a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_C_CORRECTED_INPUT_CONTINUATION.stderr b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_C_CORRECTED_INPUT_CONTINUATION.stderr new file mode 100644 index 0000000..e69de29 diff --git a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_REPAIR6_C_RUN_DECISION.json b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_REPAIR6_C_RUN_DECISION.json new file mode 100644 index 0000000..4739cc7 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_REPAIR6_C_RUN_DECISION.json @@ -0,0 +1,7 @@ +{ + "action": "run", + "task_id": "P04-01", + "reason": "Runnerはrepair_ready(使用済6、max null)で、提出9767b0aと保持中の8編集は変わっていない。合意済みのrepair6の限定継続を開始する。tools/check_p04_order_evidence.py:444-454には、指摘どおり暫定処理(コメント除去版をcandidates/offsetsとして許容)とRootのコメントが残っていることを確認した。修正方向は前回のrequest-repairの全文どおり。(1) 全文raw SHAだけを受け付けるようにする。sha256(new[function]) == production_body_sha256 == registered_body_sha256 で、old==newも必須とする。(2) signature行だけのSHA、および後続コメントを除いた本文SHAを負例として拒否させる。既存の23負例は拒否のまま維持する。(3) 補正済みbundle(build_dir/audit-support/native-first-current/)に対し、verify_native PASS、raw個別検査、全負例、applicability/既存fixture/A-Bを、Pythonでそれぞれ1回ずつ確認する。実行していない検査はPASSと報告しない。(4) c-native-validation.json、EVIDENCE_COLLECTION.md、CHECKER_PROTOCOL.mdの古いblocked記述を、旧値と新値を併記して更新する。(5) 正常応答として提出する。変更はallowed_paths内だけとし、C実装の作り直し、engine、全回帰、製品、Runner、config、DB、gitへの書き込みはいずれも0。Rootの追加分(paid/再送)は範囲に入れない。formal_original_credit=0とし、原15条件+EV/7領域/安全性3結果、全30/88の分母、予算、repair上限は変更せず、提案にも含めない。完了の確定はRunnerの検証、独立レビュー、オーナー判断に委ねる。", + "codex_model": "gpt-6.1-sol", + "codex_model_reason": "修正箇所は特定済みで小さい。checker 1箇所の候補リストを全文SHAの一致比較に置き換える数行、負例2件の追加、既存Python検証の各1回実行、3文書の記述同期で終わる。新しい設計判断や複数ファイルにまたがる推論は要らず、Rootが全文20/20の一致を確認済みなので供給bytesの根拠も確定している。Astraに上げるほどの難度はなく、品質・時間・使用量の面から既定のSolが適切と判断した。" +} diff --git a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_REPAIR6_C_RUN_DECISION.stderr b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_REPAIR6_C_RUN_DECISION.stderr new file mode 100644 index 0000000..e69de29 diff --git a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_REPAIR6_C_RUN_REQUEST.txt b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_REPAIR6_C_RUN_REQUEST.txt new file mode 100644 index 0000000..a5cba8e --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/OPUS_REPAIR6_C_RUN_REQUEST.txt @@ -0,0 +1,3 @@ +正常dispatch済み、repair_ready/使用済6/max null、保持8編集と提出9767b0aは不変です。あなたが今出した限定継続だけの開始判断を返してください。正常修正方向全文: +{"action": "request-repair", "task_id": "P04-01", "reason": "repair6として限定継続を依頼する。対象範囲はallowed_pathsのみで、既存のC実装(Rootprobe/Reader/全Cコード)は保持し、作り直さない。Root補正済みbundle(manifest dbaab3c2…、report 46e0cc35…、20/20関数が全文byte一致、hash更新6件、旧bytesはroot-corrections-r02に保持、engine再実行0)を前提とする。(1) tools/check_p04_order_evidence.py:444-454 native_applicabilityの暫定処理を外す。現在はコメント除去版の候補リスト(candidates/offsets)を許容しているが、全文raw SHA(sha256(new[function]) == production_body_sha256 == registered_body_sha256)だけを受け付ける数行の修正にする。old[function]==new[function]の全関数一致は従来どおり必須とする。「Root's report ends before…」のコメントは削除または修正する。(2) checker_native_fixtures.py(またはnegative fixtures)に負例を追加する。signature行だけのSHA、および後続コメントを除いた本文SHAをproduction_body_sha256に入れた行は、どちらもrejectされることを確認する。既存の23改変負例はすべてreject維持とする。(3) 補正済みbundleに対してPython検証を1回ずつ実行する。verify_native(base)のPASS、raw個別検査3件、全負例reject、applicability/既存fixture/A-B確認が対象。実行していない検査はPASSと報告しない。(4) c-native-validation.json、EVIDENCE_COLLECTION.md、CHECKER_PROTOCOL.mdに残る古いblocked説明(4つの複数行関数SHAに本文が含まれない件)を補正後の実記録に合わせて更新する。旧値と新値は両方明記する。(5) 正常応答として提出する。C段階の提出とP04-01全体の未達は区別し、formal_original_credit=0、原15条件+EV/7領域/安全性3結果、全30/88の分母は変更しない。未収集のindexについて重複validateは行わず、Root追加分(paid255/コマンド再送)の証拠も範囲に加えない。製品ソース、engine、Runner、gitへの書き込みは0とし、使用済repair 5件・max null・予算の変更は提案にも含めない。", "codex_model": "gpt-6.1-sol", "codex_model_reason": "修正範囲は特定済みで小さい。checker 1箇所の候補リストを全文SHAの一致比較に置き換える数行、負例1〜2件の追加、既存Python検証の再実行、文書同期で終わる。新しい設計判断、engine実行、複数ファイルにまたがる推論は不要で、供給bytesの根拠もRootが確定している。Astraに上げるほどの難度はなく、時間と使用量の面から既定のSolが適切と判断した。"} +供給native-first-current bundleは既存build_dir/audit-support/native-first-current/ にあり、Rootが全文20/20と実checker verify_native PASSを確認しました。旧body signature truncationのrawはroot-corrections-r02へ保持し、登録/production Git blob全文の独立再計算だけを行いました。Root新paid/再送ケースの入力は今回追加せずscopeを膨らませません。workerは全文SHA比較の数行、既存negativeにsignature/comment短縮SHA拒否追加、Python必要確認1回ずつ、旧blockedメタデータ更新と正式提出応答だけ。全C再実装/engine/全回帰/製品/Runner/config/DB/git書込はしません。正常Runnerが提出します。原成果加点0を維持。既存のP04 implementer-only予算adapterは維持し新budget承認不要。状態と入力が妥当ならrunを返してください。 diff --git a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/POST_P18_CURRENT_SOURCE_APPLICABILITY.json b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/POST_P18_CURRENT_SOURCE_APPLICABILITY.json index 23246f7..3c91765 100644 --- a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/POST_P18_CURRENT_SOURCE_APPLICABILITY.json +++ b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/POST_P18_CURRENT_SOURCE_APPLICABILITY.json @@ -8,140 +8,160 @@ "function": "advance_one_minute", "registered_body_sha256": "b9587ef722d8c8640248025462819374ae5eca1c3d8bbe600b6bc9c328567777", "production_body_sha256": "b9587ef722d8c8640248025462819374ae5eca1c3d8bbe600b6bc9c328567777", - "exact_bytes_equal": true + "exact_bytes_equal": true, + "whole_raw_function_bytes": 1075 }, { "path": "scripts/core/simulation_kernel.gd", "function": "_run_phase", "registered_body_sha256": "52461eeb288892a4bb4b6a99570185af08a30758ef88b0046a911baaa6f318e1", "production_body_sha256": "52461eeb288892a4bb4b6a99570185af08a30758ef88b0046a911baaa6f318e1", - "exact_bytes_equal": true + "exact_bytes_equal": true, + "whole_raw_function_bytes": 491 }, { "path": "scripts/core/simulation_kernel.gd", "function": "_handle_time_boundaries", "registered_body_sha256": "2ced47a2911b36def9d89de82a43afc69148ead44d19db6a2a6c7bce5a910ae9", "production_body_sha256": "2ced47a2911b36def9d89de82a43afc69148ead44d19db6a2a6c7bce5a910ae9", - "exact_bytes_equal": true + "exact_bytes_equal": true, + "whole_raw_function_bytes": 231 }, { "path": "scripts/core/command_queue.gd", "function": "_comes_before", "registered_body_sha256": "21f7f9f7c0923121fd0a022a2f7546b7bb7117a9979c1ed25d0b33b96e28ab28", "production_body_sha256": "21f7f9f7c0923121fd0a022a2f7546b7bb7117a9979c1ed25d0b33b96e28ab28", - "exact_bytes_equal": true + "exact_bytes_equal": true, + "whole_raw_function_bytes": 292 }, { "path": "autoload/simulation_runtime.gd", "function": "_process_tick_commands", "registered_body_sha256": "9de66a4bb84b12304300d49085f44546412319bd4aee91e67b61becf97e50294", "production_body_sha256": "9de66a4bb84b12304300d49085f44546412319bd4aee91e67b61becf97e50294", - "exact_bytes_equal": true + "exact_bytes_equal": true, + "whole_raw_function_bytes": 348 }, { "path": "autoload/simulation_runtime.gd", "function": "_advance_operations_time", "registered_body_sha256": "511580d1fac3d2785072e94c2981065fa47ba18b1c97122922645dac5c0d94ab", "production_body_sha256": "511580d1fac3d2785072e94c2981065fa47ba18b1c97122922645dac5c0d94ab", - "exact_bytes_equal": true + "exact_bytes_equal": true, + "whole_raw_function_bytes": 2305 }, { "path": "autoload/simulation_runtime.gd", "function": "_run_operations_deferred_suffix", "registered_body_sha256": "12075307b12cbb66ffda47a26097194a07fad9d6467e3e557bd7269315c98982", "production_body_sha256": "12075307b12cbb66ffda47a26097194a07fad9d6467e3e557bd7269315c98982", - "exact_bytes_equal": true + "exact_bytes_equal": true, + "whole_raw_function_bytes": 642 }, { "path": "autoload/simulation_runtime.gd", "function": "_advance_mana", "registered_body_sha256": "05c54626ce6e355acd92994ab80aaf2177c5cf194885e66934552139e087599e", "production_body_sha256": "05c54626ce6e355acd92994ab80aaf2177c5cf194885e66934552139e087599e", - "exact_bytes_equal": true + "exact_bytes_equal": true, + "whole_raw_function_bytes": 1267 }, { "path": "autoload/simulation_runtime.gd", "function": "_advance_facilities", "registered_body_sha256": "f1efd0c23bdd60d1ef19a21879640b53b8b4d88844c0c881fe7cd724387ec274", "production_body_sha256": "f1efd0c23bdd60d1ef19a21879640b53b8b4d88844c0c881fe7cd724387ec274", - "exact_bytes_equal": true + "exact_bytes_equal": true, + "whole_raw_function_bytes": 206 }, { "path": "autoload/simulation_runtime.gd", "function": "_advance_guest_vitals", "registered_body_sha256": "8226ca18c983ac576a74e772cc3088e9fe52b362ffba1b71255bd1d7623c1234", "production_body_sha256": "8226ca18c983ac576a74e772cc3088e9fe52b362ffba1b71255bd1d7623c1234", - "exact_bytes_equal": true + "exact_bytes_equal": true, + "whole_raw_function_bytes": 389 }, { "path": "autoload/simulation_runtime.gd", "function": "_advance_staff_ai", - "registered_body_sha256": "c7c440bf77850b2348040c0ae1b17ee11fdca1cea9605d51076c4a53a1ed2edd", - "production_body_sha256": "c7c440bf77850b2348040c0ae1b17ee11fdca1cea9605d51076c4a53a1ed2edd", - "exact_bytes_equal": true + "registered_body_sha256": "0e222987f7c5e25583dbaba8fe63784aa563715067396e8d31d10bd191e7179b", + "production_body_sha256": "0e222987f7c5e25583dbaba8fe63784aa563715067396e8d31d10bd191e7179b", + "exact_bytes_equal": true, + "whole_raw_function_bytes": 2105 }, { "path": "autoload/simulation_runtime.gd", "function": "_advance_guest_ai_decisions", "registered_body_sha256": "e33b41294e88dba840affd5cc0a5c58fe5d46f5d98a80a8d5f4e907a3b9a7b93", "production_body_sha256": "e33b41294e88dba840affd5cc0a5c58fe5d46f5d98a80a8d5f4e907a3b9a7b93", - "exact_bytes_equal": true + "exact_bytes_equal": true, + "whole_raw_function_bytes": 1333 }, { "path": "autoload/simulation_runtime.gd", "function": "_release_closed_business_queues", "registered_body_sha256": "3a05fbe94877eeb750fb0d692501954555ab6a8005448ab3b6023dab9bad816b", "production_body_sha256": "3a05fbe94877eeb750fb0d692501954555ab6a8005448ab3b6023dab9bad816b", - "exact_bytes_equal": true + "exact_bytes_equal": true, + "whole_raw_function_bytes": 933 }, { "path": "autoload/simulation_runtime.gd", "function": "_release_closed_business_request", - "registered_body_sha256": "7fb1b2c4197319d9ff29d7ab565306ecd0b569e331491281ed71d3a38d3a8695", - "production_body_sha256": "7fb1b2c4197319d9ff29d7ab565306ecd0b569e331491281ed71d3a38d3a8695", - "exact_bytes_equal": true + "registered_body_sha256": "6dbde3a3d425e47a049dcc4f05eae6f01fe9784f473c0fb1019a0633c239d83b", + "production_body_sha256": "6dbde3a3d425e47a049dcc4f05eae6f01fe9784f473c0fb1019a0633c239d83b", + "exact_bytes_equal": true, + "whole_raw_function_bytes": 2414 }, { "path": "autoload/simulation_runtime.gd", "function": "_complete_service_transaction", - "registered_body_sha256": "c7ccce01292699052b8284383ad77f1fe0a5ead9a9c3936622ad9c3b93a3e408", - "production_body_sha256": "c7ccce01292699052b8284383ad77f1fe0a5ead9a9c3936622ad9c3b93a3e408", - "exact_bytes_equal": true + "registered_body_sha256": "f2b6e96a8eeef3dd3f8419b4d9d5ef4e1d13241600ce970bdd78a924428cac6c", + "production_body_sha256": "f2b6e96a8eeef3dd3f8419b4d9d5ef4e1d13241600ce970bdd78a924428cac6c", + "exact_bytes_equal": true, + "whole_raw_function_bytes": 614 }, { "path": "scripts/facility/facility_service.gd", "function": "advance_one_minute", "registered_body_sha256": "59c0e89b4dca291e3ec02601b3f7c5544dba7c823fc137e0e7a50e7d5319e0ed", "production_body_sha256": "59c0e89b4dca291e3ec02601b3f7c5544dba7c823fc137e0e7a50e7d5319e0ed", - "exact_bytes_equal": true + "exact_bytes_equal": true, + "whole_raw_function_bytes": 1525 }, { "path": "scripts/facility/facility_service.gd", "function": "_prepare_service_for_tick", - "registered_body_sha256": "8a9bef4ec1bbe3b25c418f8c7d04d4233cedaa942eda5cc77d530280b0f129de", - "production_body_sha256": "8a9bef4ec1bbe3b25c418f8c7d04d4233cedaa942eda5cc77d530280b0f129de", - "exact_bytes_equal": true + "registered_body_sha256": "b35c2c0fb23a04258b71995dd7c3b6dfacbbcdf36106e2e3348acef0e18d21cc", + "production_body_sha256": "b35c2c0fb23a04258b71995dd7c3b6dfacbbcdf36106e2e3348acef0e18d21cc", + "exact_bytes_equal": true, + "whole_raw_function_bytes": 1958 }, { "path": "scripts/facility/facility_service.gd", "function": "_complete_service", - "registered_body_sha256": "38a16ace875e4f4b09133b10677cb50871732ca7177166b8659b07c2d79e61d0", - "production_body_sha256": "38a16ace875e4f4b09133b10677cb50871732ca7177166b8659b07c2d79e61d0", - "exact_bytes_equal": true + "registered_body_sha256": "494edfd11cb3e896d73c2c6fdbe7c1193efce6d869b105e526d2f1dfd1168142", + "production_body_sha256": "494edfd11cb3e896d73c2c6fdbe7c1193efce6d869b105e526d2f1dfd1168142", + "exact_bytes_equal": true, + "whole_raw_function_bytes": 1387 }, { "path": "scripts/facility/facility_service.gd", "function": "_fail_service", - "registered_body_sha256": "b4dbc53b40ac3eb4e639bdf13d9f5538eb64a7bd6df22ec230e7baef4a535f58", - "production_body_sha256": "b4dbc53b40ac3eb4e639bdf13d9f5538eb64a7bd6df22ec230e7baef4a535f58", - "exact_bytes_equal": true + "registered_body_sha256": "56f61b255217bddb4c8a6ad3af6ed1f9edc3b6a6e928dacf2105be6698936de5", + "production_body_sha256": "56f61b255217bddb4c8a6ad3af6ed1f9edc3b6a6e928dacf2105be6698936de5", + "exact_bytes_equal": true, + "whole_raw_function_bytes": 484 }, { "path": "scripts/operations/operations_coordinator.gd", "function": "_process_minute_boundaries", "registered_body_sha256": "1312166dc17aee0ef470069a73ff3fe6b86d11d04ca7de76f3d04f1d2d14674e", "production_body_sha256": "1312166dc17aee0ef470069a73ff3fe6b86d11d04ca7de76f3d04f1d2d14674e", - "exact_bytes_equal": true + "exact_bytes_equal": true, + "whole_raw_function_bytes": 2212 } ], "all20_ordering_bodies_identical": true, @@ -184,5 +204,7 @@ } ], "limitation": "Ordering body equality alone does not establish boundary evidence applicability; new relationship restore/schema and path/arrival dependencies need specific checks. Existing six spec pins bind older Runtime; latest integration cannot satisfy a checker that unconditionally equates all current sources to old pins. No spec, checker, policy or acceptance change made by Root.", - "formal_credit": 0 + "formal_credit": 0, + "extraction_rule": "Raw top-level func/static func start through next top-level named function or EOF, including multiline signatures, entire body, whitespace and intervening comments; no normalization.", + "correction": "Prior Root parser truncated four multiline signatures before their bodies. All 20 whole raw function units independently recomputed from registered and production Git blobs and byte-equal; no engine rerun or source modification." } diff --git a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/REPAIR5_PRESERVED_WORK.json b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/REPAIR5_PRESERVED_WORK.json new file mode 100644 index 0000000..5ab203d --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/REPAIR5_PRESERVED_WORK.json @@ -0,0 +1,49 @@ +{ + "source": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement", + "files": [ + { + "path": "docs/plans/original-completion-2026-10-02/execution/p04-01/CHECKER_PROTOCOL.md", + "bytes": 13995, + "sha256": "c1cba2957fa455f7b942f5a848aa2cc745c09958ebde1a79909f3091cde045a2" + }, + { + "path": "docs/plans/original-completion-2026-10-02/execution/p04-01/checker_negative_fixtures.py", + "bytes": 10954, + "sha256": "840001c840acec621347360904f6f41c872fb966f590193905de4a513ee5900a" + }, + { + "path": "tools/check_p04_order_evidence.py", + "bytes": 48550, + "sha256": "98b2692c604055d7b970e6ef9e3ad1795f35823c3c19d1acad5b80ad2ec7a378" + }, + { + "path": "docs/plans/original-completion-2026-10-02/execution/p04-01/EVIDENCE_COLLECTION.md", + "bytes": 14838, + "sha256": "a09904aa1b974126cbdf5dcf230a8dac1adc27ba1c2149b795661dc9b37d3f60" + }, + { + "path": "docs/plans/original-completion-2026-10-02/execution/p04-01/c-native-validation.json", + "bytes": 5505, + "sha256": "fc3a73707d8eab8e4ea42244fe85620086c30643d22eba654acddbd812b7abd6" + }, + { + "path": "docs/plans/original-completion-2026-10-02/execution/p04-01/checker_applicability_fixtures.py", + "bytes": 4872, + "sha256": "2aab87c4d5835558bed29538375549f893355d8e2a0b1fedbb0f1c3fb7af1b7a" + }, + { + "path": "docs/plans/original-completion-2026-10-02/execution/p04-01/checker_native_fixtures.py", + "bytes": 10860, + "sha256": "26bbdcee483816b8bc60c250bbc63bf0a72a194dce2ba9b690abace9b6b17bbc" + }, + { + "path": "docs/plans/original-completion-2026-10-02/execution/p04-01/repair4-context.json", + "bytes": 2190, + "sha256": "a9ad741e58866222df441b3617b1a15bae0be81ffe48372ba62044cfd6c948f6" + } + ], + "archive_sha256": "a9c2e2930105ae4b342d029207abc9e33b073f24d6820e86373d2eb187ce6537", + "actual_run": "cb864ee199f346408370f8944e574eb7", + "native_product_runs": 0, + "status": "incomplete; C individual real raw checks passed; Root supplied applicability rejected; no acceptance credit" +} diff --git a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/REPAIR5_PRESERVED_WORK.tar.gz b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/REPAIR5_PRESERVED_WORK.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..61f6f6bdf5fbeed6ac5fceb0a707ad550c642e36 GIT binary patch literal 36256 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

SYB_sU_{k2zqNo?&)*x+W2ZZGy;FOm@I;zBY~(Y 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%0AJ~mr5~9-3U2U z0QEwJ6mw+I@)9LuXSKj@9L}F*!Ovr;7(eh5vjd(@;_YDnXhWDxh<)Z3Dyv zW3GtGD3m3|P!0!FnP@y7Sfs#2&=EYy5UZLhqo5XQqZ|&HB~`|E09k<0o} zzx(GAYN6@m(}wo=F#J?4;oZ{0Eqj}S($%}K_^VYbJKa1A^bU1c_7623naP2y>q-Eq zn}a)pwX7&giS#Kc!g3#gwDUlYBd8rw!zC#rrCkt3Wk!^3(U2`_G}@cX99i&lF(ruK zR!pYT#@P!x`O^?sRHJQBlHnjrE*6hSY9!-o-bCJ6=nsT5%sf4J>PIKRMn8S*dvj(% z|AYzPrL80-hA&SFCc&4i+L*h`7E^pv9s39uHvxEO+Jq_y$t5hzZH|A-!a2|n01)wP zXQ98CP}X;G%&8HJn@Ez;u8#h?57R{bEI$Z&KWe?@7+`o|h*`}Dyr{sAA5*Xu`%4$- zBN&Z6bad8Wy|oFH>s;NDSIY_!mGf;0@#8K(zWh*`6dogTMbv00pi9VifsO*EuzJ`iI|pWGC~i2-Kd>0GQ*8 zUX@sNk6Hbzn3#W0rE6 zX0py!MT1Z_`|f1zyt5-77qf$>!`{-lMPWNI-{3LQSwqgkrIKkFTX?I)HYqQlRq8l9 z3_DoV^CsDZT+b(u&Ar{N2@^Jj1ZgPzF?jT>;HKx^E*y z8$*^{xQovg?9;J1QaY^Mx0%Bf<9j2e!bWLeY{{=fv8gk)fGq3w{Kd>zm^J3lOtV1l zP*WcG#=dlBAHm3inJ@&ER-9%Ql%}_Sb9BN(rg6?IOSGYH^nmsU6R^MKH z^EEhSkvkhPIb-qv`I?;nn4JH}&VK~H>$hr-=UaBmnegl6{Krn`KRD&oo54L5%*FEF zKf9m*u&{|KpZ~BMuI&cc|Hrl_^}oK7>te3TC|evQop(?*p<2$g^fM)W&cUe3%EGF$ zu18uy>R7ScZ8W2%A4Tv_H*tfs>0^n`GQR$x0;WHqctV%u&rjxDX! zEO)4xHCn#iR9~L$p2Ga-kHHmLIkv+i&@<+x4t&&zmvO+hC64$mO-;EoF&<#D;c0AjTJlknDQ{VLxY)L$dgl#v1 z;J#p?R>U5&B5o2|P0x3&7Dx`inWk>55m|oJay_>TN`(`3ov_ukTMZ}ex^BZx6RX>F zyueSAz)g~p6>;suz=b+k%3LZiEBcS8v?|`1RcSVZ1hBwaw}WOQ@Z+%Sz`}S=Gw~a7 z+yqp7s}VJ0*GU>cd3Zk4@7e+UojToa$*O?Fb?zG`YGu4JD+BE7hjtqK-B!~Fg7T6e zN&?>o>PoGy(*^Damgss-SUT4WtrR%HkF9QMMa{@@(@}(A3j9OBXH4Vq@eJcPQoH4b zPHZQh2b>Z&T{rMNSdfMt1M|Cn*l2Z=*lslZZa1`AQRI8A$V$3NGqJsB6qBIgc=r#J zUBy^8P8=t2T5&6}JP^FChTrIhsh>oR*a2n^ogf4hx=G}C-Ig6UZN~?Ci!5NJ#0yFU za`SKmfY#+z*FZF(=8Rb*01UW4NPNJp>jf void: call_deferred("_run") +func _expect(ok: bool, label: String) -> void: + _checks += 1 + if not ok: _failures += 1; push_error(label) +func _json(path: String) -> Variant: + var file := FileAccess.open(path, FileAccess.READ) + _expect(file != null, "read sealed metadata " + path.get_file()) + if file == null: return null + var value: Variant = JSON.parse_string(file.get_as_text()); file.close(); return value +func _input(row: Dictionary) -> Dictionary: + var path := String(row["path"]) + _expect(FileAccess.get_sha256(path) == String(row["sha256"]), "exact original input SHA") + var file := FileAccess.open(path, FileAccess.READ) + _expect(file != null, "original typed input exists") + if file == null: return {} + var data := file.get_buffer(file.get_length()); file.close() + _expect(data.size() == int(row["bytes"]), "entire typed input length") + var value: Variant = bytes_to_var(data) + _expect(value is Dictionary and var_to_bytes(value) == data, "original entire typed input roundtrip") + return value if value is Dictionary else {} +func _proof(label: String, value: Variant) -> void: + var file := FileAccess.open(_folder.path_join(_mode + "-" + label + ".var"), FileAccess.WRITE) + _expect(file != null, "whole typed output " + label) + if file != null: file.store_buffer(var_to_bytes(value)); file.flush(); file.close() +func _reset() -> void: + _cleanup() + _runtime = load("res://autoload/simulation_runtime.gd").new() + _clock = load("res://autoload/game_clock.gd").new() + _state = load("res://autoload/game_state.gd").new() + _clock.reset(1, 6, 0); _state.reset() + _expect(bool(_runtime.initialize(_clock, _state, 424242).get(&"valid", false)), "ordinary Runtime initializes") + _clock.set_paused(true) +func _cleanup() -> void: + if _runtime != null: _runtime.free() + if _clock != null: _clock.free() + if _state != null: _state.free() + _runtime = null; _clock = null; _state = null +func _restore_expected(expected: Dictionary, label: String) -> void: + _expect(_runtime.restore_snapshot(expected), "public whole Runtime restore " + label) + _expect(var_to_bytes(_runtime.create_snapshot()) == var_to_bytes(expected), "whole restore equality " + label) +func _write_save(label: String, expected: Dictionary) -> void: + _restore_expected(expected, label) + var path := "user://saves/p04_boundary/" + label + var result := SaveService.save_snapshot(path, _runtime.create_snapshot()) + _expect(bool(result.get(&"ok", false)), "formal public package save " + label) + var inspected := SaveService.inspect_snapshot(path) + _expect(bool(inspected.get(&"ok", false)) and bool(inspected.get(&"read_only", false)) and var_to_bytes(inspected.get(&"snapshot", {})) == var_to_bytes(expected), "formal whole typed inspect " + label) + _expect(var_to_bytes(_runtime.create_snapshot()) == var_to_bytes(expected), "save leaves whole Runtime unchanged " + label) + _slots[label] = ProjectSettings.globalize_path(path) + _proof(label + "-persisted", expected) +func _copy_package(original: String, label: String) -> void: + var target := ProjectSettings.globalize_path("user://saves/p04_boundary/" + label) + _expect(DirAccess.make_dir_recursive_absolute(target) == OK, "fresh Reader package " + label) + var dir := DirAccess.open(original) + _expect(dir != null, "Writer entire package available") + if dir == null: return + var names := dir.get_files(); names.sort() + _expect(dir.get_directories().is_empty() and names == PackedStringArray(["journal.log", "manifest.json", "thumbnail.png", "world.bin"]), "exact complete four-member save package") + for member: String in names: + _expect(DirAccess.copy_absolute(original.path_join(member), target.path_join(member)) == OK, "copy complete member " + member) + _expect(FileAccess.get_sha256(original.path_join(member)) == FileAccess.get_sha256(target.path_join(member)), "literal copied member SHA " + member) + _slots[label] = target +func _load_save(label: String, expected: Dictionary) -> void: + var result := SaveService.load_snapshot(String(_slots[label])) + _expect(bool(result.get(&"ok", false)), "formal public package load " + label) + if not bool(result.get(&"ok", false)): return + _expect(var_to_bytes(result[&"snapshot"]) == var_to_bytes(expected), "loaded entire typed package matches original " + label) + _restore_expected(result[&"snapshot"], label) + _proof(label + "-loaded", _runtime.create_snapshot()) +func _run() -> void: + _folder = OS.get_environment("THE_TREE_BOUNDARY_RESTART_EVIDENCE") + _mode = OS.get_environment("THE_TREE_BOUNDARY_RESTART_MODE") + if _folder.is_empty() or _mode not in ["writer", "reader"]: quit(2); return + _expect(DirAccess.make_dir_recursive_absolute(_folder) == OK, "fresh formal output") + var manifest: Dictionary = _json(OS.get_environment("THE_TREE_BOUNDARY_RESTART_INPUT")) + var inputs: Dictionary = manifest["whole_typed_inputs"] + _reset() + if _mode == "writer": + for point: String in inputs: _write_save(point, _input(inputs[point])) + else: + var writer: Dictionary = _json(_folder.path_join("writer.json")) + _expect(int(writer["pid"]) != OS.get_process_id() and String(writer["profile"]) != OS.get_user_data_dir(), "distinct actual Writer/Reader PID and private profiles") + for label: String in writer["slots"]: _copy_package(String(writer["slots"][label]), label) + for point: String in inputs: _load_save(point, _input(inputs[point])) + _load_save("before", _input(inputs["before"])) + _assert_request_resend(manifest, "loaded-before") + var receipts: Array = [] + _runtime.economy_service.transaction_posted.connect(func(id: StringName, entries: Array): + var rows: Array = [] + for row: LedgerEntry in entries: rows.append(row.to_dictionary()) + receipts.append({&"id": id, &"minute": _clock.absolute_minute, &"rows": rows}) + ) + for point: String in ["midnight", "paused", "after", "next"]: + if point == "after": + var id := StringName(manifest["kitchen_id"]) + var command: CommandResult = _runtime.submit_command(&"set_facility_policy", {&"facility_id": id, &"patch": {&"business_open": true}}, &"player", &"", 10, -1, &"p04.dependency.reopen") + _expect(command.is_success(), "same public dependency reopen after formal restart") + _clock.advance_one_minute() + var expected := _input(inputs[point]) + _expect(var_to_bytes(_runtime.create_snapshot()) == var_to_bytes(expected), "all typed state after formal restart equals original native " + point) + _proof("replayed-" + point, _runtime.create_snapshot()) + if point in ["paused", "after"]: _assert_request_resend(manifest, "loaded-" + point) + var sale_count := 0 + for receipt: Dictionary in receipts: + for row: Dictionary in receipt[&"rows"]: + if row[&"category"] == &"SERVICE_SALE": + sale_count += 1 + _expect(receipt[&"minute"] == 1442 and row[&"amount"] == int(manifest["original_price"]), "exact original service sale after formal restart") + _expect(sale_count == 1, "one sale notification across paused midnight and recovery") + _results.append({&"receipts": receipts, &"sale_count": sale_count}) + _proof("receipts", receipts) + _finish() +func _assert_request_resend(manifest: Dictionary, label: String) -> void: + var before: Dictionary = _runtime.create_snapshot() + var guests: Array = [] + for guest: String in manifest["guest_ids"]: guests.append(StringName(guest)) + var result: CommandResult = _runtime.submit_command(&"create_service_request", {&"facility_id": StringName(manifest["facility_id"]), &"request_id": StringName(manifest["request_id"]), &"guest_ids": guests}, &"player", &"", 10, -1, StringName(manifest["request_key"])) + _expect(result.code == CommandResult.Code.DUPLICATE_IDEMPOTENCY_KEY, "formal restart retains processed request idempotency " + label) + var after: Dictionary = _runtime.create_snapshot() + _expect(var_to_bytes(before) == var_to_bytes(after), "formal restart request resend preserves entire typed Runtime " + label) + _proof("duplicate-" + label + "-before", before); _proof("duplicate-" + label + "-after", after) + _resends.append({&"label": label, &"minute": _clock.absolute_minute, &"result": result.to_dictionary(), &"request_key": manifest["request_key"]}) + +func _finish() -> void: + var file := FileAccess.open(_folder.path_join(_mode + ".json"), FileAccess.WRITE) + if file != null: + file.store_string(JSON.stringify({&"pid": OS.get_process_id(), &"profile": OS.get_user_data_dir(), &"slots": _slots, &"resends": _resends, &"results": _results, &"checks": _checks, &"failures": _failures}, "\t")); file.flush(); file.close() + _cleanup() + print("Dependency formal restart: %d checks, %d failures" % [_checks, _failures]) + quit(1 if _failures else 0) diff --git a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/idempotency-paid-midnight-r01.gd b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/idempotency-paid-midnight-r01.gd new file mode 100644 index 0000000..8d2c931 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/idempotency-paid-midnight-r01.gd @@ -0,0 +1,230 @@ +extends "res://tests/s3/test_runtime_actor_hardening.gd" +var _observations: Array[Dictionary] = [] +var _receipts: Array[Dictionary] = [] +var _first_receipts: Array[Dictionary] = [] +var _receipt_hook: Callable +var _evidence_dir := "" +var _facility_id: StringName = &"" +var _service_id: StringName = &"" +var _request_id: StringName = &"p04.order.midnight.request" +var _guest_id: StringName = &"p04.order.midnight.guest" +var _staff_ids: Array[StringName] = [&"p04.midnight.server.a", &"p04.midnight.server.b"] +var _serial := 0 +var _case := "midnight" +var _original_price := 0 +var _observation_pass := "first" +var _first_summary: Dictionary = {} +var _paid_reception_id: StringName = &"" +var _expected_daily_wages := 0 +var _duplicate_results: Array[Dictionary] = [] + +func _run() -> void: + _evidence_dir = OS.get_environment("THE_TREE_ORDER_EVIDENCE") + if _evidence_dir.is_empty(): quit(2); return + _expect(DirAccess.make_dir_recursive_absolute(_evidence_dir) == OK, "fresh external evidence directory") + _run_midnight() + _finish_order() + +func _run_midnight() -> void: + _reset_runtime(424242) + var enabled: Dictionary = _runtime.enable_production_operations() + _expect(bool(enabled.get(&"ok", false)), "public production operations enabled at original Day 1 06:00") + if not bool(enabled.get(&"ok", false)): return + var facility := _build_cafeteria(true) + if facility == null: return + _facility_id = facility.instance_id + var definition: FacilityDefinition = _runtime.definition_registry.get_facility(facility.definition_id) + _original_price = definition.base_price + _setup_paid_reception() + var cook_id := StringName("fixture.kitchen.worker.%s" % _facility_id) + _expect(_cmd(&"set_staff_work_assignment", {&"staff_id": cook_id, &"template_id": &"NIGHT", &"facility_id": facility.related_facility_id}).is_success(), "public original NIGHT assignment replaces inherited 23:59 cook fixture") + for id: StringName in _staff_ids: + _expect(_cmd(&"register_staff", {&"staff_id": id, &"role_id": &"server", &"options": {&"state": StaffRuntime.State.OFF_DUTY, &"current_cell": Vector3i.ZERO}}).is_success(), "register real workplace Staff " + String(id)) + _expect(_cmd(&"set_staff_work_assignment", {&"staff_id": id, &"template_id": &"NIGHT", &"facility_id": _facility_id}).is_success(), "original NIGHT 18:00-next06:00 assignment " + String(id)) + var queue_at := 1440 - definition.base_service_minutes - 1 + _expect(queue_at > _clock.absolute_minute, "setup finishes before original service start") + if queue_at <= _clock.absolute_minute: return + _clock.advance_minutes(1079 - _clock.absolute_minute) + _observe("paid-before-handover-17-59") + _expect(_runtime.facility_service.get_instance(_paid_reception_id).active_staff_ids.has(&"staff_akane"), "normally hired daytime receptionist physically attends before original DAY boundary") + _clock.register_tick_handler(_clock.TickPhase.FACILITY_COMPLETION, &"zz.p04.paid.before-handover", func(minute: int): + if minute == 1080: + _observe("paid-at-completion-before-handover-18-00") + _expect(_runtime.facility_service.get_instance(_paid_reception_id).active_staff_ids.has(&"staff_akane"), "last DAY interval retains actual hired worker before handover") + ) + _clock.advance_one_minute(); _observe("paid-after-handover-18-00") + _expect(not _runtime.facility_service.get_instance(_paid_reception_id).active_staff_ids.has(&"staff_akane"), "daytime hired receptionist is removed after completion phase") + _clock.advance_minutes(queue_at - _clock.absolute_minute) + _expect(_runtime.facility_service.get_instance(_paid_reception_id).active_staff_ids.has(&"staff_bardo"), "normally hired NIGHT replacement physically arrives") + _expect(_clock.absolute_minute == queue_at and _runtime.operations_coordinator.current_minute == queue_at, "real production operations advance without blocked suffix") + if _clock.absolute_minute != queue_at: return + for id: StringName in _staff_ids: + var worker: StaffRuntime = _runtime.staff_service.get_staff(id) + _expect(_runtime.staff_service.requires_attendance(id) and StaffCommuteService.is_at_facility(worker, facility) and worker.current_cell != Vector3i.ZERO, "physical ordinary NIGHT workplace arrival " + String(id)) + var kitchen: FacilityInstance = _runtime.facility_service.get_instance(facility.related_facility_id) + var cook: StaffRuntime = _runtime.staff_service.get_staff(cook_id) + _expect(_runtime.staff_service.requires_attendance(cook_id) and StaffCommuteService.is_at_facility(cook, kitchen), "real kitchen NIGHT attendance, not legacy attendance bypass") + _expect(_stock(facility.local_inventory_id, &"ingredient/basic_meal", 1, &"p04.midnight.stock"), "one real meal to reserve") + _expect(_cmd(&"spawn_guest", {&"guest_id": _guest_id, &"guest_type_id": &"traveler", &"gold": _original_price * 2, &"options": {&"state": GuestRuntime.State.DECIDING, &"current_cell": Vector3i.ZERO}}).is_success(), "public actual Guest wallet") + _expect(_target_request().is_success(), "original public service request with explicit idempotency key") + _assert_request_resend("queued-same-minute") + _clock.advance_one_minute() + var active: Array = _runtime.facility_service.get_active_services(_facility_id) + _expect(active.size() == 1, "one actual reserved service starts") + if active.size() != 1: return + var service: ServiceInstance = active[0]; _service_id = service.service_id + _expect(service.started_at + service.duration_minutes == 1440 and service.duration_minutes == definition.base_service_minutes and service.price_snapshot == _original_price, "original service completion coincides with 00:00") + _clock.advance_minutes(1439 - _clock.absolute_minute) + _expect(service.elapsed_minutes == service.duration_minutes - 1, "one original service minute remains at 23:59") + _expect(_runtime.operations_coordinator.get_day_summary(1).is_empty(), "real Day 1 not closed early") + _expect(_cmd(&"set_facility_policy", {&"facility_id": kitchen.instance_id, &"patch": {&"business_open": false}}).is_success(), "public dependency kitchen closure; dining itself remains open by policy") + _expect(not facility.related_facility_operating and kitchen.state == FacilityInstance.State.CLOSED, "dependency closure projects to dining") + var held_ids: Array[StringName] = service.inventory_reservations.duplicate() + var held_elapsed := service.elapsed_minutes + var held_service_id := service.service_id + _connect_receipts(); _observe("closed-before-23-59") + var before: Dictionary = _runtime.create_snapshot() + _clock.advance_one_minute(); _observe("paused-00-00") + _expect(_clock.absolute_minute == 1440 and int(_runtime.operations_coordinator.get_day_summary(1).get(&"closed_at", -1)) == 1440, "real daily close proceeds while dependent service is paused") + _assert_held(service, held_service_id, held_ids, held_elapsed) + var midnight: Dictionary = _runtime.create_snapshot() + _first_summary = _runtime.operations_coordinator.get_day_summary(1).duplicate(true) + _expect(_expected_daily_wages > 0 and int(_first_summary[&"settlement"][&"new_wages_total"]) == _expected_daily_wages and int(_first_summary[&"settlement"][&"paid_total"]) == _expected_daily_wages, "real midnight settles full existing catalog wages once") + var wage_rows := 0 + for receipt: Dictionary in _receipts: + for row: Dictionary in receipt[&"rows"]: + if row[&"category"] == &"WAGE": + wage_rows += 1 + _expect(receipt[&"minute"] == 1440 and int(row[&"amount"]) == _expected_daily_wages and row[&"credit_account"] == &"PLAYER_CASH", "one real payroll transaction debits actual player cash at midnight") + _expect(wage_rows == 1, "exactly one nonzero payroll ledger row at midnight") + _clock.advance_one_minute(); _observe("paused-00-01") + _assert_held(service, held_service_id, held_ids, held_elapsed) + _assert_request_resend("paused-00-01") + var paused: Dictionary = _runtime.create_snapshot() + _expect(_reopen_dependency(kitchen.instance_id).is_success(), "public reopening of same dependency") + _clock.advance_one_minute(); _observe("resumed-complete-00-02") + _assert_completed(service, held_service_id, held_ids) + _assert_request_resend("completed-00-02") + var after: Dictionary = _runtime.create_snapshot() + _clock.advance_one_minute(); _observe("stable-00-03") + _assert_completed(service, held_service_id, held_ids) + var next: Dictionary = _runtime.create_snapshot() + _first_receipts.assign(_receipts.duplicate(true)) + _expect(_runtime.restore_snapshot(before), "restore typed pre-midnight dependency-closed snapshot") + _observation_pass = "replay"; _receipts.clear(); _connect_receipts() + _clock.advance_one_minute() + _expect(var_to_bytes(_runtime.create_snapshot()) == var_to_bytes(midnight), "typed paused midnight state replay matches") + _clock.advance_one_minute() + _expect(var_to_bytes(_runtime.create_snapshot()) == var_to_bytes(paused), "typed second paused state replay matches") + _expect(_reopen_dependency(kitchen.instance_id).is_success(), "replay same public reopen command and idempotency key") + _clock.advance_one_minute() + _expect(var_to_bytes(_runtime.create_snapshot()) == var_to_bytes(after), "typed completed state replay matches") + _clock.advance_one_minute() + _expect(var_to_bytes(_runtime.create_snapshot()) == var_to_bytes(next), "typed subsequent state replay matches") + _expect(_first_receipts == _receipts, "all actual service and settlement receipts replay unchanged") + _write_var("before", before); _write_var("midnight", midnight); _write_var("paused", paused); _write_var("after", after); _write_var("next", next) + +func _target_request() -> CommandResult: + return _runtime.submit_command(&"create_service_request", {&"facility_id": _facility_id, &"request_id": _request_id, &"guest_ids": [_guest_id]}, &"player", &"", 10, -1, &"p04.same-minute.service.request") + +func _assert_request_resend(label: String) -> void: + var before: Dictionary = _runtime.create_snapshot() + var result: CommandResult = _target_request() + _expect(result.code == CommandResult.Code.DUPLICATE_IDEMPOTENCY_KEY, "normal repeated processed request reports its original duplicate-key contract " + label) + var after: Dictionary = _runtime.create_snapshot() + _expect(var_to_bytes(before) == var_to_bytes(after), "same-minute request resend preserves all typed Runtime state " + label) + _write_var("duplicate-" + label + "-before", before) + _write_var("duplicate-" + label + "-after", after) + _duplicate_results.append({&"label": label, &"minute": _clock.absolute_minute, &"command_result": result.to_dictionary(), &"request_id": _request_id, &"idempotency_key": &"p04.same-minute.service.request"}) + +func _setup_paid_reception() -> void: + var definition: FacilityDefinition = _runtime.definition_registry.get_facility(&"reception") + _expect(_cmd(&"build_facility", {&"definition_id": &"reception", &"origin": Vector3i(2, 0, WorldService.LAYER_FRONT)}).is_success(), "paid public reception construction") + _clock.advance_minutes(definition.build_minutes) + for instance: FacilityInstance in _runtime.facility_service.get_instances(): + if instance.definition_id == &"reception": _paid_reception_id = instance.instance_id + _expect(not _paid_reception_id.is_empty(), "reception completes using unchanged construction duration") + var catalog: Dictionary = JSON.parse_string(FileAccess.get_file_as_string("res://data/characters/mvp_staff_candidates.json")) + for candidate_id: StringName in [&"staff_akane", &"staff_bardo"]: + var original_wage := -1 + for row: Dictionary in catalog["entries"]: + if StringName(row["id"]) == candidate_id: original_wage = int(row["daily_wage"]) + _expect(original_wage > 0 and _cmd(&"hire_staff_candidate", {&"candidate_id": candidate_id}).is_success(), "public hire of existing paid candidate " + String(candidate_id)) + var worker: StaffRuntime = _runtime.staff_service.get_staff(candidate_id) + _expect(worker != null and worker.get_effective_daily_wage() == original_wage, "existing catalog wage unchanged for " + String(candidate_id)) + _expected_daily_wages += original_wage + _expect(_cmd(&"set_staff_work_assignment", {&"staff_id": candidate_id, &"template_id": &"DAY" if candidate_id == &"staff_akane" else &"NIGHT", &"facility_id": _paid_reception_id}).is_success(), "ordinary recurring paid DAY or NIGHT assignment") + +func _reopen_dependency(kitchen_id: StringName) -> CommandResult: + return _runtime.submit_command(&"set_facility_policy", {&"facility_id": kitchen_id, &"patch": {&"business_open": true}}, &"player", &"", 10, -1, &"p04.dependency.reopen") + +func _assert_held(service: ServiceInstance, held_id: StringName, ids: Array[StringName], elapsed: int) -> void: + _expect(service.service_id == held_id and service.elapsed_minutes == elapsed and service.inventory_reservations == ids, "same service and own reservation IDs retain exact progress") + _expect(_service_receipts().is_empty() and _runtime.economy_service.get_balance(StringName("GUEST_WALLET:" + String(_guest_id))) == _original_price * 2, "no service sale or wallet charge during dependency closure") + for id: StringName in ids: + var reservation: InventoryReservation = _runtime.inventory_service.get_reservation(id) + _expect(reservation != null and reservation.state == InventoryReservation.State.ACTIVE, "own reservation remains reserved while dependency is closed") + +func _assert_completed(service: ServiceInstance, held_id: StringName, ids: Array[StringName]) -> void: + _expect(service.service_id == held_id and service.state == ServiceInstance.State.COMPLETED and service.completed_at == 1442, "same service completes once after dependency restoration") + _expect(service.inventory_reservations == ids and _service_receipts().size() == 1 and _runtime.economy_service.get_balance(StringName("GUEST_WALLET:" + String(_guest_id))) == _original_price, "same reserved service has one original-price payment") + for id: StringName in ids: + var reservation: InventoryReservation = _runtime.inventory_service.get_reservation(id) + _expect(reservation != null and reservation.state == InventoryReservation.State.CONSUMED, "own original reservation consumed once after restoration") + _expect(_runtime.operations_coordinator.get_day_summary(1) == _first_summary, "restored dependency does not mutate prior daily close") + +func _service_receipts() -> Array: + var selected: Array = [] + for receipt: Dictionary in _receipts: + for row: Dictionary in receipt[&"rows"]: + if row[&"category"] == &"SERVICE_SALE" and row[&"source_entity_id"] == _facility_id and row[&"credit_account"] == StringName("GUEST_WALLET:" + String(_guest_id)): + selected.append(receipt); break + return selected + +func _connect_receipts() -> void: + if _receipt_hook.is_valid() and _runtime.economy_service.transaction_posted.is_connected(_receipt_hook): + _runtime.economy_service.transaction_posted.disconnect(_receipt_hook) + _receipt_hook = func(id: StringName, entries: Array): + var rows: Array = [] + for row: LedgerEntry in entries: rows.append(row.to_dictionary()) + _receipts.append({&"id": id, &"minute": _clock.absolute_minute, &"rows": rows, &"staff_at_receipt": _runtime.facility_service.get_instance(_facility_id).active_staff_ids.duplicate()}) + _runtime.economy_service.transaction_posted.connect(_receipt_hook) + +func _cmd(kind: StringName, payload: Dictionary) -> CommandResult: + _serial += 1 + return _runtime.submit_command(kind, payload, &"player", &"", 10, -1, StringName("p04.order.shift.command.%d" % _serial)) + +func _observe(label: String) -> void: + label = _case + "-" + _observation_pass + "-" + label + var facility: FacilityInstance = _runtime.facility_service.get_instance(_facility_id) + var service: ServiceInstance = _runtime.facility_service.get_service(_service_id) + var guest: GuestRuntime = _runtime.guest_service.get_guest(_guest_id) + var paid: Array = [] + for paid_id: StringName in [&"staff_akane", &"staff_bardo"]: + var hired: StaffRuntime = _runtime.staff_service.get_staff(paid_id) + if hired != null: paid.append(hired.create_snapshot()) + var reception: FacilityInstance = _runtime.facility_service.get_instance(_paid_reception_id) + _observations.append({&"label": label + "-paid-actors", &"minute": _clock.absolute_minute, &"paid_staff": paid, &"paid_reception": reception.create_snapshot() if reception != null else {}, &"expected_catalog_wages": _expected_daily_wages}) + var workers: Array = [] + for id: StringName in _staff_ids: + var worker: StaffRuntime = _runtime.staff_service.get_staff(id) + var shift: ShiftInstance = _runtime.staff_service.get_shift(worker.shift_id) + workers.append({&"staff": worker.create_snapshot(), &"shift": shift.create_snapshot() if shift != null else {}, &"is_present": _runtime.staff_commute.is_present(worker, facility), &"requires_attendance": _runtime.staff_service.requires_attendance(id), &"at_facility": StaffCommuteService.is_at_facility(worker, facility), &"within_shift": shift.contains_minute(_clock.absolute_minute) if shift != null else false}) + _observations.append({&"label": label, &"minute": _clock.absolute_minute, &"workers": workers, &"facility_state": facility.state, &"power_available": facility.power_available, &"active_staff": facility.active_staff_ids.duplicate(), &"service": service.create_snapshot() if service != null else {}, &"request_present": _runtime.facility_service.get_request(_request_id) != null, &"wallet": _runtime.economy_service.get_balance(StringName("GUEST_WALLET:" + String(_guest_id))), &"available_meals": _runtime.inventory_service.available_quantity(facility.local_inventory_id, &"ingredient/basic_meal"), &"reservations": _runtime.inventory_service.create_snapshot(), &"guest": guest.create_snapshot() if guest != null else {}, &"receipts": _receipts.duplicate(true), &"day_summary": _runtime.operations_coordinator.get_day_summary(1), &"operations": _runtime.operations_coordinator.create_snapshot()}) + _write_var(_observation_pass + "-" + label.trim_prefix(_case + "-" + _observation_pass + "-"), _runtime.create_snapshot()) + +func _write_var(label: String, value: Variant) -> void: + var file := FileAccess.open(_evidence_dir.path_join(_case + "-" + label + ".var"), FileAccess.WRITE) + _expect(file != null, "write whole typed evidence " + label) + if file != null: file.store_buffer(var_to_bytes(value)); file.flush(); file.close() + var json_file := FileAccess.open(_evidence_dir.path_join(_case + "-" + label + ".json"), FileAccess.WRITE) + _expect(json_file != null, "write JSON mirror alongside authoritative typed snapshot") + if json_file != null: json_file.store_string(JSON.stringify(value, "\t")); json_file.flush(); json_file.close() + +func _finish_order() -> void: + var file := FileAccess.open(_evidence_dir.path_join("observations.json"), FileAccess.WRITE) + if file != null: + file.store_string(JSON.stringify({&"classification": "P04-01 same-minute public request resend before admission, during dependency pause and after completion, with paid catalog DAY/NIGHT handover and nonzero payroll across midnight; catalog values are observed inputs, not approval of final product balancing; restaurant setup remains controlled; typed same-process replay only; no formal SaveService/OS/Windows/whole acceptance", &"observations": _observations, &"first_receipts": _first_receipts, &"replay_receipts": _receipts, &"first_summary": _first_summary, &"duplicate_results": _duplicate_results, &"checks": _checks, &"failures": _failures}, "\t")); file.flush(); file.close() + _cleanup() + print("Midnight boundary diagnostic: %d checks, %d failures" % [_checks, _failures]) + quit(1 if _failures else 0) diff --git a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-correct-full-body-pins-r02.py b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-correct-full-body-pins-r02.py new file mode 100644 index 0000000..7724e8f --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-correct-full-body-pins-r02.py @@ -0,0 +1,19 @@ +from pathlib import Path +import hashlib,json,re,subprocess,shutil,tarfile +R=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');E=R/'docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015';W=Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement');B=Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/audit-support/native-first-current');sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest() +# Preserve every incomplete worker edit before touching any coordinator input. +raw=subprocess.check_output(['git','status','--porcelain=v1','-z','--untracked-files=all'],cwd=W);files=[x.decode()[3:]for x in raw.split(b'\0')if x];assert len(files)==8;rows=[{'path':s,'bytes':(W/s).stat().st_size,'sha256':sha(W/s)}for s in files];T=E/'REPAIR5_PRESERVED_WORK.tar.gz';assert not T.exists() +with tarfile.open(T,'w:gz')as t: + for s in files:t.add(W/s,arcname=s,recursive=False) +with tarfile.open(T,'r:gz')as t: + for z in rows:assert hashlib.sha256(t.extractfile(z['path']).read()).hexdigest()==z['sha256'] +(E/'REPAIR5_PRESERVED_WORK.json').write_text(json.dumps({'source':str(W),'files':rows,'archive_sha256':sha(T),'actual_run':'cb864ee199f346408370f8944e574eb7','native_product_runs':0,'status':'incomplete; C individual real raw checks passed; Root supplied applicability rejected; no acceptance credit'},indent=2)+'\n') +P=E/'POST_P18_CURRENT_SOURCE_APPLICABILITY.json';old=P.read_bytes();data=json.loads(old);registered='deb1bcb2374eb378b840ca345db952bd8572cb6e';prod=data['production_commit'];changed=[] +def units(blob): + starts=list(re.finditer(rb'(?m)^(?:static )?func ([A-Za-z_][A-Za-z_0-9]*)\(',blob));return {m[1].decode():blob[m.start():starts[i+1].start()if i+1 void: + var before: Dictionary = _runtime.create_snapshot() + var guests: Array = [] + for guest: String in manifest["guest_ids"]: guests.append(StringName(guest)) + var result: CommandResult = _runtime.submit_command(&"create_service_request", {&"facility_id": StringName(manifest["facility_id"]), &"request_id": StringName(manifest["request_id"]), &"guest_ids": guests}, &"player", &"", 10, -1, StringName(manifest["request_key"])) + _expect(result.code == CommandResult.Code.DUPLICATE_IDEMPOTENCY_KEY, "formal restart retains processed request idempotency " + label) + var after: Dictionary = _runtime.create_snapshot() + _expect(var_to_bytes(before) == var_to_bytes(after), "formal restart request resend preserves entire typed Runtime " + label) + _proof("duplicate-" + label + "-before", before); _proof("duplicate-" + label + "-after", after) + _resends.append({&"label": label, &"minute": _clock.absolute_minute, &"result": result.to_dictionary(), &"request_key": manifest["request_key"]}) + +''' +needle);s=s.replace('&"slots": _slots,','&"slots": _slots, &"resends": _resends,');Q=P/'idempotency-formal.gd';Q.write_text(s) +obs=json.loads((N/'order-evidence/observations.json').read_text());service=next(x['service']for x in obs['observations']if 'service_id'in x.get('service',{}));before=json.loads((N/'order-evidence/midnight-before.json').read_text());cafe=next(x for x in before['systems']['runtime']['facilities']['instances']if x['instance_id']==service['facility_id']);inputs={} +for point in ['before','midnight','paused','after','next']: + p=N/'order-evidence'/('midnight-'+point+'.var');inputs[point]={'path':str(p),'bytes':p.stat().st_size,'sha256':sha(p)} +M=P/'INPUT.json';M.write_text(json.dumps({'source_native':str(N),'execution_sha256':sha(N/'execution.json'),'source_refs':1338,'whole_typed_inputs':inputs,'kitchen_id':cafe['related_facility_id'],'original_price':service['price_snapshot'],'facility_id':service['facility_id'],'request_id':service['request_id'],'guest_ids':service['guest_ids'],'request_key':'p04.same-minute.service.request'},indent=2)+'\n') +w=(A/'p04-paid-shift-midnight-formal-native-r01.py').read_text().replace('p04-paid-shift-midnight-formal-native-r01','p04-idempotency-paid-formal-native-r01').replace('p04-paid-shift-midnight-formal-prep-r01','p04-idempotency-paid-formal-prep-r01').replace('/dependency-formal.gd','/idempotency-formal.gd').replace('P04-01 existing paid catalog payroll and DAY/NIGHT handover with dependency pause/resume across midnight using public formal SaveService and distinct-PID Reader','P04-01 public request resend after formal SaveService/distinct PID restoration with exact whole typed state equality in paid midnight dependency scenario');W=A/'p04-idempotency-paid-formal-native-r01.py';compile(w,str(W),'exec');W.write_text(w);floor=1024**3+Path('/Applications/Godot.app/Contents/MacOS/Godot').stat().st_size+136*1024**2;free=shutil.disk_usage(A).free;assert free>=floor;(P/'ADMISSION.json').write_text(json.dumps({'scope':'Root formal public request resend acceptance fixture, not whole-unit acceptance','probe_sha256':sha(Q),'wrapper_sha256':sha(W),'input_manifest_sha256':sha(M),'source_native':str(N),'free_before':free,'required_free':floor,'estimated_seconds':90,'whole_original_credit':0},indent=2)+'\n');print('formal idempotency Reader prepared; original processed request key retained') diff --git a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-native-prepare-r01.py b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-native-prepare-r01.py new file mode 100644 index 0000000..71fda8c --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-native-prepare-r01.py @@ -0,0 +1,21 @@ +from pathlib import Path +import json,hashlib,shutil +R=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');A=R/'artifacts/original-completion-2026-10-02';P=A/'p04-idempotency-paid-midnight-prep-r01';assert not P.exists();P.mkdir();base=A/'p04-paid-shift-midnight-prep-r01/paid-shift-midnight.gd';s=base.read_text().replace('var _expected_daily_wages := 0','var _expected_daily_wages := 0\nvar _duplicate_results: Array[Dictionary] = []') +old='\t_expect(_cmd(&"create_service_request", {&"facility_id": _facility_id, &"request_id": _request_id, &"guest_ids": [_guest_id]}).is_success(), "actual request original price/duration")';assert old in s;s=s.replace(old,'\t_expect(_target_request().is_success(), "original public service request with explicit idempotency key")\n\t_assert_request_resend("queued-same-minute")') +old='\tvar paused: Dictionary = _runtime.create_snapshot()';s=s.replace(old,'\t_assert_request_resend("paused-00-01")\n'+old);old='\tvar after: Dictionary = _runtime.create_snapshot()';s=s.replace(old,'\t_assert_request_resend("completed-00-02")\n'+old) +pos=s.index('func _setup_paid_reception()');s=s[:pos]+'''func _target_request() -> CommandResult: + return _runtime.submit_command(&"create_service_request", {&"facility_id": _facility_id, &"request_id": _request_id, &"guest_ids": [_guest_id]}, &"player", &"", 10, -1, &"p04.same-minute.service.request") + +func _assert_request_resend(label: String) -> void: + var before: Dictionary = _runtime.create_snapshot() + var result: CommandResult = _target_request() + _expect(result.code == CommandResult.Code.DUPLICATE_IDEMPOTENCY_KEY, "normal repeated processed request reports its original duplicate-key contract " + label) + var after: Dictionary = _runtime.create_snapshot() + _expect(var_to_bytes(before) == var_to_bytes(after), "same-minute request resend preserves all typed Runtime state " + label) + _write_var("duplicate-" + label + "-before", before) + _write_var("duplicate-" + label + "-after", after) + _duplicate_results.append({&"label": label, &"minute": _clock.absolute_minute, &"command_result": result.to_dictionary(), &"request_id": _request_id, &"idempotency_key": &"p04.same-minute.service.request"}) + +''' +s[pos:] +s=s.replace('&"first_summary": _first_summary,','&"first_summary": _first_summary, &"duplicate_results": _duplicate_results,');s=s.replace('P04-01 existing paid catalog DAY/NIGHT reception handover and real nonzero payroll with approved dependency closure across midnight','P04-01 same-minute public request resend before admission, during dependency pause and after completion, with paid catalog DAY/NIGHT handover and nonzero payroll across midnight');Q=P/'idempotency-paid-midnight.gd';Q.write_text(s) +w=(A/'p04-paid-shift-midnight-native-r01.py').read_text().replace('p04-paid-shift-midnight-native-r01','p04-idempotency-paid-midnight-native-r01').replace('p04-paid-shift-midnight-prep-r01','p04-idempotency-paid-midnight-prep-r01').replace('/paid-shift-midnight.gd','/idempotency-paid-midnight.gd').replace('P04-01 existing catalog paid DAY/NIGHT actors with actual nonzero payroll and dependency pause/resume across midnight on current source','P04-01 same-minute public service request resends with full typed state equality and existing paid catalog midnight/dependency scenario');W=A/'p04-idempotency-paid-midnight-native-r01.py';compile(w,str(W),'exec');W.write_text(w);shutil.copyfile(A/'p04-paid-shift-midnight-prep-r01/SOURCE_MAP.json',P/'SOURCE_MAP.json');floor=1024**3+Path('/Applications/Godot.app/Contents/MacOS/Godot').stat().st_size+136*1024**2;free=shutil.disk_usage(A).free;assert free>=floor;sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest();(P/'ADMISSION.json').write_text(json.dumps({'scope':'Root QA exact same-minute request replay contract; no product or worker edits; catalog values are observed test inputs','base_probe_sha256':sha(base),'probe_sha256':sha(Q),'wrapper_sha256':sha(W),'estimated_seconds':90,'free_before':free,'required_free':floor,'planned_native_phases':['import','parse','repro'],'original_acceptance_credit':0},indent=2)+'\n');print('idempotency probe prepared on preserved native pattern') diff --git a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-paid-formal-native-r01.py b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-paid-formal-native-r01.py new file mode 100644 index 0000000..f6acd41 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-paid-formal-native-r01.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +from pathlib import Path +import hashlib, importlib.util, json, os, shutil, subprocess, sys +sys.dont_write_bytecode = True +R = Path(__file__).resolve().parents[2] +A = R / 'artifacts/original-completion-2026-10-02' +OUT = A / 'p04-idempotency-paid-formal-native-r01' +QA = A / 'p04-idempotency-paid-formal-prep-r01/idempotency-formal.gd' +INPUT = A / 'p04-idempotency-paid-formal-prep-r01/INPUT.json' +TEST = 'tests/s3/test_runtime_staff_assignment.gd' +def module(name, path): + spec = importlib.util.spec_from_file_location(name, path) + m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m); return m +def main(): + r = module('order_repro_runner', R / 'tools/run_all_tests.py') + root = r.source_refs(R); source = {n:v['sha256'] for n,v in root.items()} + source_path = A / 'p04-approved-shift-current-prep-r01/SOURCE_MAP.json' + assert source == r.read(source_path) and len(source) == 1338 + fixed = list(r.read(INPUT)['whole_typed_inputs'].values()) + [dict(path=str(INPUT),bytes=INPUT.stat().st_size,sha256=r.sha(INPUT)),dict(path=str(QA),bytes=QA.stat().st_size,sha256=r.sha(QA))] + def fixed_guard(): + for pin in fixed: + f=Path(pin['path']); assert not f.is_symlink() and f.stat().st_size==pin['bytes'] and r.sha(f)==pin['sha256'] + fixed_guard() + protected = r.default_player(R) + docs = {n:r.sha(R / 'docs/plans/original-completion-2026-10-02' / n) for n in ['IMPLEMENTATION_PLAN.md','PROGRESS_INTEGRATION.md','work_packages.json','progress_snapshot.json']} + old = Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p18-01-model/.runtime/P18-01-CODE/build/p18-relationship-evidence') + assert r.read(old / 'runner-ended.json')['passed'] + assert r.read(old / 'runner-input.json')['selected_source_map'] == source + assert shutil.disk_usage(A).free >= 1024**3 + Path('/Applications/Godot.app/Contents/MacOS/Godot').stat().st_size + 136*1024**2 + outer = module('order_literal_owned', r.SUPPORT / 'owned_outer.py') + assert not outer.native.helper['live_engines']() + refs = dict(root); refs[TEST] = dict(path=str(QA), bytes=QA.stat().st_size, sha256=r.sha(QA)) + expected = {n:dict(bytes=p['bytes'],sha256=p['sha256']) for n,p in refs.items()} + selected = dict(root_before=root,map={n:p['sha256'] for n,p in refs.items()},timeout=1200) + assert not OUT.exists(); OUT.mkdir(); stage=OUT/'stage'; stage.mkdir() + for leaf in ['starters','bootstrap']: (OUT/leaf).mkdir() + for n,p in r.read(r.SUPPORT/'bootstrap-scripts.json').items(): + data=p['text'].encode(); assert hashlib.sha256(data).hexdigest()==p['sha256']; (OUT/'bootstrap'/n).write_bytes(data) + for n,p in refs.items(): + dst=stage/n; dst.parent.mkdir(parents=True,exist_ok=True); r.copy_source(Path(p['path']),dst) + assert r.inventory(stage,stage=True)==expected + cache=old/'stage/.godot'; cache_before=r.inventory(cache) + for n in cache_before: + src=cache/n; dst=stage/'.godot'/n; dst.parent.mkdir(parents=True,exist_ok=True) + subprocess.run(['/bin/cp','-c',str(src),str(dst)],check=True); assert src.stat().st_ino != dst.stat().st_ino + assert r.inventory(stage/'.godot')==cache_before + r.write(OUT/'cache-reuse.json',dict(ended_run=str(old),ended_receipt_sha256=r.sha(old/'runner-ended.json'),whole_cache=cache_before,independent_inode=True,ordinary_import_required=True,ordinary_parse_required=True)) + paths=['res://'+n for n in sorted(refs) if n.endswith('.gd')]; r.write(OUT/'parse-paths.json',paths) + markers=module('order_literal_markers',R/'tools/strict_test_markers.py') + contracts=markers.load_contracts(R/'docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json') + contracts[TEST]=dict(test=TEST,template='Dependency formal restart: checks, failures',required=True) + policy=r.read(r.SUPPORT/'suite-policy.json'); assert TEST not in policy['suite_policies'] + r.write(OUT/'contracts.json',contracts) + r.write(OUT/'runner-input.json',dict(classification='P04-01 public request resend after formal SaveService/distinct PID restoration with exact whole typed state equality in paid midnight dependency scenario; snapshots are exact typed evidence and JSON mirrors lose Variant key/value types; not Windows or whole-unit acceptance',owner_runner_pid=os.getpid(),wrapper_sha256=r.sha(__file__),QA=dict(path=str(QA),sha256=r.sha(QA),bytes=QA.stat().st_size),runner_sha256=r.sha(R/'tools/run_all_tests.py'),source_before=root,selected_source_map=selected['map'],source_map_authority=str(source_path),default_player_before=protected,doc4_before=docs,fixed_input_pins=fixed,source_adoption=False,QA_overrides=[TEST],ordinary_disk_floor_bytes=r.MIN_SPACE,functional_watchdog_seconds=1200)) + diagnostics=module('order_literal_diagnostics',r.SUPPORT/'diagnostic_gate.py'); owners=module('order_literal_owners',r.SUPPORT/'ordinary_proof_gate.py'); audio=module('order_literal_audio',r.SUPPORT/'audio_evidence_gate.py') + original=outer.run_phase + def run_phase(argv,folder,timeout,env,**kwargs): + env=dict(env) + if folder.name in ['writer','reader']: env.update(THE_TREE_BOUNDARY_RESTART_EVIDENCE=str(OUT/'restart-evidence'), THE_TREE_BOUNDARY_RESTART_MODE=folder.name, THE_TREE_BOUNDARY_RESTART_INPUT=str(INPUT)) + return original(argv,folder,timeout,env,**kwargs) + outer.run_phase=run_phase + phases=[]; previous={}; error=None; formal_before=None; public=(stage/'project.godot').read_bytes() + try: + for phase,test in [('import',None),('parse',None),('writer',TEST),('reader',TEST)]: + if phase == 'reader': formal_before = {n:r.inventory(Path(p)) for n,p in r.read(OUT/'restart-evidence/writer.json')['slots'].items()} + row=r.execute_phase('/Applications/Godot.app/Contents/MacOS/Godot',stage,OUT,phase,test,selected,expected,previous,policy,contracts,paths,public,protected,R,outer,markers,diagnostics,owners,audio) + phases.append(row); r.write(OUT/(phase+'-actual-phase.json'),row) + print(json.dumps(dict(phase=phase,passed=row['passed'],checks=row.get('reported_checks'),error=row.get('validation_error'))),flush=True) + if not row['passed']: + error=phase+' strict phase failure'; break + except BaseException as caught: error=type(caught).__name__+': '+str(caught) + finally: cleanup,cleanup_errors=outer.finish_captured(outer.OWNED) + fixed_guard() + assert r.source_refs(R)==root and r.default_player(R)==protected + assert {n:r.sha(R/'docs/plans/original-completion-2026-10-02'/n) for n in docs}==docs + assert r.inventory(stage,stage=True)==dict(expected,**previous) and r.inventory(cache)==cache_before + formal_after = {n:r.inventory(Path(p)) for n,p in r.read(OUT/'restart-evidence/writer.json')['slots'].items()} if (OUT/'restart-evidence/writer.json').exists() else None + formal_unchanged = formal_before is not None and formal_after == formal_before + passed=formal_unchanged and error is None and len(phases)==4 and all(p['passed'] for p in phases) and not cleanup_errors and all(p['engine_ended'] for p in cleanup) + r.write(OUT/'execution.json',dict(passed=passed,error=error,phases=phases,actual_captured_PIDs=[p.pid for p in outer.OWNED],cleanup=cleanup,cleanup_errors=cleanup_errors,all_source_unchanged=True,all_default_player_unchanged=True,doc4_unchanged=True,actual_native=len(outer.OWNED),formal_before=formal_before,formal_after=formal_after,formal_unchanged=formal_unchanged,whole_goal_accepted=False,unit_accepted=False)) + print(json.dumps(dict(passed=passed,error=error,actual_native=len(outer.OWNED))),flush=True) + return 0 if passed else 1 +if __name__=='__main__': raise SystemExit(main()) diff --git a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-paid-midnight-native-r01.py b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-paid-midnight-native-r01.py new file mode 100644 index 0000000..d531e6a --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-paid-midnight-native-r01.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +from pathlib import Path +import hashlib, importlib.util, json, os, shutil, subprocess, sys +sys.dont_write_bytecode = True +R = Path(__file__).resolve().parents[2] +A = R / 'artifacts/original-completion-2026-10-02' +OUT = A / 'p04-idempotency-paid-midnight-native-r01' +QA = A / 'p04-idempotency-paid-midnight-prep-r01/idempotency-paid-midnight.gd' +TEST = 'tests/s3/test_runtime_staff_assignment.gd' +def module(name, path): + spec = importlib.util.spec_from_file_location(name, path) + m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m); return m +def main(): + r = module('order_repro_runner', R / 'tools/run_all_tests.py') + root = r.source_refs(R); source = {n:v['sha256'] for n,v in root.items()} + source_path = A / 'p04-idempotency-paid-midnight-prep-r01/SOURCE_MAP.json' + assert source == r.read(source_path) and len(source) == 1338 + protected = r.default_player(R) + docs = {n:r.sha(R / 'docs/plans/original-completion-2026-10-02' / n) for n in ['IMPLEMENTATION_PLAN.md','PROGRESS_INTEGRATION.md','work_packages.json','progress_snapshot.json']} + old = Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p18-01-model/.runtime/P18-01-CODE/build/p18-relationship-evidence') + assert r.read(old / 'runner-ended.json')['passed'] + assert r.read(old / 'runner-input.json')['selected_source_map'] == source + assert shutil.disk_usage(A).free >= 1024**3 + Path('/Applications/Godot.app/Contents/MacOS/Godot').stat().st_size + 136*1024**2 + outer = module('order_literal_owned', r.SUPPORT / 'owned_outer.py') + assert not outer.native.helper['live_engines']() + refs = dict(root); refs[TEST] = dict(path=str(QA), bytes=QA.stat().st_size, sha256=r.sha(QA)) + expected = {n:dict(bytes=p['bytes'],sha256=p['sha256']) for n,p in refs.items()} + selected = dict(root_before=root,map={n:p['sha256'] for n,p in refs.items()},timeout=1200) + assert not OUT.exists(); OUT.mkdir(); stage=OUT/'stage'; stage.mkdir() + for leaf in ['starters','bootstrap']: (OUT/leaf).mkdir() + for n,p in r.read(r.SUPPORT/'bootstrap-scripts.json').items(): + data=p['text'].encode(); assert hashlib.sha256(data).hexdigest()==p['sha256']; (OUT/'bootstrap'/n).write_bytes(data) + for n,p in refs.items(): + dst=stage/n; dst.parent.mkdir(parents=True,exist_ok=True); r.copy_source(Path(p['path']),dst) + assert r.inventory(stage,stage=True)==expected + cache=old/'stage/.godot'; cache_before=r.inventory(cache) + for n in cache_before: + src=cache/n; dst=stage/'.godot'/n; dst.parent.mkdir(parents=True,exist_ok=True) + subprocess.run(['/bin/cp','-c',str(src),str(dst)],check=True); assert src.stat().st_ino != dst.stat().st_ino + assert r.inventory(stage/'.godot')==cache_before + r.write(OUT/'cache-reuse.json',dict(ended_run=str(old),ended_receipt_sha256=r.sha(old/'runner-ended.json'),whole_cache=cache_before,independent_inode=True,ordinary_import_required=True,ordinary_parse_required=True)) + paths=['res://'+n for n in sorted(refs) if n.endswith('.gd')]; r.write(OUT/'parse-paths.json',paths) + markers=module('order_literal_markers',R/'tools/strict_test_markers.py') + contracts=markers.load_contracts(R/'docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json') + contracts[TEST]=dict(test=TEST,template='Midnight boundary diagnostic: checks, failures',required=True) + policy=r.read(r.SUPPORT/'suite-policy.json'); assert TEST not in policy['suite_policies'] + r.write(OUT/'contracts.json',contracts) + r.write(OUT/'runner-input.json',dict(classification='P04-01 same-minute public service request resends with full typed state equality and existing paid catalog midnight/dependency scenario; snapshots are exact typed evidence and JSON mirrors lose Variant key/value types; no formal save, Windows or whole-unit acceptance',owner_runner_pid=os.getpid(),wrapper_sha256=r.sha(__file__),QA=dict(path=str(QA),sha256=r.sha(QA),bytes=QA.stat().st_size),runner_sha256=r.sha(R/'tools/run_all_tests.py'),source_before=root,selected_source_map=selected['map'],source_map_authority=str(source_path),default_player_before=protected,doc4_before=docs,source_adoption=False,QA_overrides=[TEST],ordinary_disk_floor_bytes=r.MIN_SPACE,functional_watchdog_seconds=1200)) + diagnostics=module('order_literal_diagnostics',r.SUPPORT/'diagnostic_gate.py'); owners=module('order_literal_owners',r.SUPPORT/'ordinary_proof_gate.py'); audio=module('order_literal_audio',r.SUPPORT/'audio_evidence_gate.py') + original=outer.run_phase + def run_phase(argv,folder,timeout,env,**kwargs): + env=dict(env) + if folder.name=='repro': env['THE_TREE_ORDER_EVIDENCE']=str(OUT/'order-evidence') + return original(argv,folder,timeout,env,**kwargs) + outer.run_phase=run_phase + phases=[]; previous={}; error=None; public=(stage/'project.godot').read_bytes() + try: + for phase,test in [('import',None),('parse',None),('repro',TEST)]: + row=r.execute_phase('/Applications/Godot.app/Contents/MacOS/Godot',stage,OUT,phase,test,selected,expected,previous,policy,contracts,paths,public,protected,R,outer,markers,diagnostics,owners,audio) + phases.append(row); r.write(OUT/(phase+'-actual-phase.json'),row) + print(json.dumps(dict(phase=phase,passed=row['passed'],checks=row.get('reported_checks'),error=row.get('validation_error'))),flush=True) + if not row['passed']: + error=phase+' strict phase failure'; break + except BaseException as caught: error=type(caught).__name__+': '+str(caught) + finally: cleanup,cleanup_errors=outer.finish_captured(outer.OWNED) + assert r.source_refs(R)==root and r.default_player(R)==protected + assert {n:r.sha(R/'docs/plans/original-completion-2026-10-02'/n) for n in docs}==docs + assert r.inventory(stage,stage=True)==dict(expected,**previous) and r.inventory(cache)==cache_before + passed=error is None and len(phases)==3 and all(p['passed'] for p in phases) and not cleanup_errors and all(p['engine_ended'] for p in cleanup) + r.write(OUT/'execution.json',dict(passed=passed,error=error,phases=phases,actual_captured_PIDs=[p.pid for p in outer.OWNED],cleanup=cleanup,cleanup_errors=cleanup_errors,all_source_unchanged=True,all_default_player_unchanged=True,doc4_unchanged=True,actual_native=len(outer.OWNED),whole_goal_accepted=False,unit_accepted=False)) + print(json.dumps(dict(passed=passed,error=error,actual_native=len(outer.OWNED))),flush=True) + return 0 if passed else 1 +if __name__=='__main__': raise SystemExit(main()) diff --git a/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-root-audit-r01.py b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-root-audit-r01.py new file mode 100644 index 0000000..8bd1ecd --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/p04-idempotency-root-audit-r01.py @@ -0,0 +1,17 @@ +from pathlib import Path +import json,hashlib,shutil +R=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');A=R/'artifacts/original-completion-2026-10-02';E=R/'docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015';N=A/'p04-idempotency-paid-midnight-native-r01';F=A/'p04-idempotency-paid-formal-native-r01';load=lambda p:json.loads(p.read_bytes());sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest();n=load(N/'execution.json');f=load(F/'execution.json');assert n['passed']and f['passed']and f['formal_unchanged']and f['formal_before']==f['formal_after'];assert all(z['engine_ended']for x in [n,f]for z in x['cleanup']);assert all(x[k]for x in [n,f]for k in ['all_source_unchanged','all_default_player_unchanged','doc4_unchanged']);obs=load(N/'order-evidence/observations.json');w=load(F/'restart-evidence/writer.json');d=load(F/'restart-evidence/reader.json');assert w['pid']!=d['pid']and w['profile']!=d['profile']and w['failures']==d['failures']==0;duplicates=[] +for row in obs['duplicate_results']: + result=row['command_result'];assert result['code']=='DUPLICATE_IDEMPOTENCY_KEY'and result['details']['processed'];original=result['details']['original_result'];assert original['code']=='OK';prefix='midnight-duplicate-'+row['label'];before=N/'order-evidence'/(prefix+'-before.var');after=N/'order-evidence'/(prefix+'-after.var');assert sha(before)==sha(after);duplicates.append({'scope':'original native','label':row['label'],'minute':row['minute'],'code':result['code'],'original_command_id':result['details']['original_command_id'],'before':str(before),'after':str(after),'identical_whole_typed_sha256':sha(before)}) +for row in d['resends']: + result=row['result'];assert result['code']=='DUPLICATE_IDEMPOTENCY_KEY'and result['details']['processed'];prefix='reader-duplicate-'+row['label'];before=F/'restart-evidence'/(prefix+'-before.var');after=F/'restart-evidence'/(prefix+'-after.var');assert sha(before)==sha(after);duplicates.append({'scope':'formal Reader','label':row['label'],'minute':row['minute'],'code':result['code'],'original_command_id':result['details']['original_command_id'],'before':str(before),'after':str(after),'identical_whole_typed_sha256':sha(before)}) +assert len(duplicates)==6 and len({x['original_command_id']for x in duplicates})==1;inputs=load(A/'p04-idempotency-paid-formal-prep-r01/INPUT.json');typed=[];members=[] +for point,z in inputs['whole_typed_inputs'].items(): + for name in ['writer-'+point+'-persisted','reader-'+point+'-loaded']+(['reader-replayed-'+point]if point!='before'else[]): + p=F/'restart-evidence'/(name+'.var');assert sha(p)==z['sha256'];typed.append({'path':str(p),'original':z['path'],'sha256':sha(p)}) + wp=Path(w['slots'][point]);rp=Path(d['slots'][point]);expected={'journal.log','manifest.json','thumbnail.png','world.bin'};assert {z.name for z in wp.iterdir()}==expected=={z.name for z in rp.iterdir()} + for name in sorted(expected):assert sha(wp/name)==sha(rp/name);members.append({'point':point,'name':name,'writer':str(wp/name),'reader':str(rp/name),'sha256':sha(wp/name)}) +assert len(typed)==14 and len(members)==20;state=load(N/'order-evidence/midnight-next.json')['systems']['runtime'];sales=[x for x in state['economy']['entries']if x['category']=='SERVICE_SALE'and x['credit_account']=='GUEST_WALLET:p04.order.midnight.guest'];wage=[x for x in state['economy']['entries']if x['category']=='WAGE'];assert len(sales)==len(wage)==1 and sales[0]['amount']==25 and wage[0]['amount']==255 +record={'plan_id':'P04-01','production_commit':'f3f23cac8822da19ab6912bacd759a94d084c0c0','scope':'Same-minute public create_service_request retransmission before admission/during dependency pause/after completion, including formal SaveService and distinct-PID Reader. All typed state preserved. Existing payroll values remain observed test inputs, not newly approved product balance.','source_files':1338,'actual_owned_pids':n['actual_captured_PIDs']+f['actual_captured_PIDs'],'all_owned_ended':True,'duplicate_attempts':duplicates,'typed_saved_loaded_replayed_14':typed,'formal_members_original_and_copied_20':members,'original_packages_unchanged':True,'writer_pid':w['pid'],'reader_pid':d['pid'],'one_target_sale':sales,'one_payroll':wage,'source_default_profile_doc4_unchanged':True,'native_execution_sha256':sha(N/'execution.json'),'formal_execution_sha256':sha(F/'execution.json'),'observations_sha256':sha(N/'order-evidence/observations.json'),'reader_receipt_sha256':sha(F/'restart-evidence/reader.json'),'formal_original_credit':0,'independent_whole_review':'pending'};(E/'ROOT_SAME_MINUTE_RESEND_FORMAL_RESULT.json').write_text(json.dumps(record,ensure_ascii=False,indent=2)+'\n') +for src,name in [(A/'p04-idempotency-paid-midnight-prep-r01/idempotency-paid-midnight.gd','idempotency-paid-midnight-r01.gd'),(A/'p04-idempotency-paid-midnight-prep-r01/ADMISSION.json','ROOT_SAME_MINUTE_RESEND_NATIVE_ADMISSION.json'),(A/'p04-idempotency-paid-midnight-native-r01.py','p04-idempotency-paid-midnight-native-r01.py'),(A/'p04-idempotency-paid-formal-prep-r01/idempotency-formal.gd','idempotency-paid-formal-r01.gd'),(A/'p04-idempotency-paid-formal-prep-r01/ADMISSION.json','ROOT_SAME_MINUTE_RESEND_FORMAL_ADMISSION.json'),(A/'p04-idempotency-paid-formal-prep-r01/INPUT.json','ROOT_SAME_MINUTE_RESEND_FORMAL_INPUT.json'),(A/'p04-idempotency-paid-formal-native-r01.py','p04-idempotency-paid-formal-native-r01.py'),(Path('/private/tmp/thetree-p04-idempotency-native-prepare-r01.py'),'p04-idempotency-native-prepare-r01.py'),(Path('/private/tmp/thetree-p04-idempotency-formal-prepare-r01.py'),'p04-idempotency-formal-prepare-r01.py')]:shutil.copyfile(src,E/name) +print({'same_key_duplicate_attempts':6,'whole_typed_state_pairs_byte_identical':6,'formal_typed_states_match_original':14,'target_sales':1,'payroll_rows':1,'all_owned_ended':True,'original_credit':0}) diff --git a/docs/plans/original-completion-2026-10-02/plan_validation.json b/docs/plans/original-completion-2026-10-02/plan_validation.json index c1a2597..3889e47 100644 --- a/docs/plans/original-completion-2026-10-02/plan_validation.json +++ b/docs/plans/original-completion-2026-10-02/plan_validation.json @@ -254,6 +254,6 @@ "validate_facility_value_contracts.py": "91640e2a76cd6cc9186f7b85c0bf379b24b6cac0d48962815235ee628e7ae43e", "validate_plan.py": "23678227d9b3c556f1bd903f4b5b3147c4a82ce5085e10055481026803451b80", "validator_update_checks.json": "f997d0f3de2cea29550840b1d5cb23647d64f81329de46758551e2b6c8fecc27", - "work_packages.json": "180d7dd46d0ea4c6e180cc1c373521a63ca1eaf743aedceccda1749e451c45d4" + "work_packages.json": "0c3100600e0eda5e3a71d4517eeefb3e8a687f932db9b1d746257d2508a3c23c" } } diff --git a/docs/plans/original-completion-2026-10-02/work_packages.json b/docs/plans/original-completion-2026-10-02/work_packages.json index 18a84fa..73de091 100644 --- a/docs/plans/original-completion-2026-10-02/work_packages.json +++ b/docs/plans/original-completion-2026-10-02/work_packages.json @@ -3598,7 +3598,7 @@ }, "legacy_state": "in_progress", "state_scope": "package-level; completed means whole package accepted; partial implementation is not completion", - "current_summary": "承認D05をmain5f6bc11/全1338sourceで実測。18:00は完了・25G一回課金時に昼番2人、その後交代0人。依存先休業は日跨ぎ1439→1441で同service/予約・進捗44/45・財布50保持、復帰後1442に完了・財布25・SALE25一回、1443追加0。さらに正式SaveServiceの5状態をWriter3854→別profile/PID Reader3879で保存読込し、公開厨房再開後の全型付き14出力SHAが原nativeと一致、元保存20member不変・Reader20member全SHA一致。全10owned PID通常終了。原7領域の残境界/非ゼロ給与/command再送/EV、raw結合checker完成、独立whole受入・正常統合finalが残り、原成果加点0。repair4編集6件を保持しprobe/Reader重複workerなし。実OpusがC結合層とraw改変負例に範囲を限定しAstraを選択、同タスクの正常dispatchでrepair5 implementing。LLM900秒は許可済みtask-only予算adapterで除去、検証watchdogと登録設定は維持。 追加でmain54e81e5の既存カタログ2名を公開hire/勤務割当で雇用し、実DAY/NIGHT交代と00:00給与255G一回を実測。正式SaveService Writer14262→別PID Reader14476でも全14typed出力が原native SHA一致、元20保存member不変、翌分まで給与行1件。既存給与データの入力利用であり本番balanceの新承認ではない。実行中C担当の入力/範囲は変更せず次の受入照合に保持。", + "current_summary": "P04-01承認D05を現採用source1338で実測。18:00完了課金後交代、依存先休業の日跨ぎ保持/復帰一回完了、既存2名の非ゼロ給与255G一回、同一request同分再送の全typed状態不変を確認。日跨ぎ/給与/再送は正式SaveServiceと別PID Readerでも元14typed出力・保存20memberがSHA一致。Cはraw所有/保存/帳簿の個別検査と23負例を通したがRoot供給関数SHA不備を検出。RootがGit20関数全文を再計算して実C全体を通し、旧資料と8編集を保持。実Opus判断でSol repair6が全文SHA厳密化・負例2件・旧説明同期だけを通常実行中。原7領域の残境界・全条件独立レビュー・正常統合finalが残り、原成果加点0。", "remaining_deliverables": [ { "id": "P04-01", @@ -3847,21 +3847,21 @@ "scope": "Root diagnosis and actual first repair; no original acceptance" } ], - "current_summary": "承認D05をmain5f6bc11/全1338sourceで実測。18:00は完了・25G一回課金時に昼番2人、その後交代0人。依存先休業は日跨ぎ1439→1441で同service/予約・進捗44/45・財布50保持、復帰後1442に完了・財布25・SALE25一回、1443追加0。さらに正式SaveServiceの5状態をWriter3854→別profile/PID Reader3879で保存読込し、公開厨房再開後の全型付き14出力SHAが原nativeと一致、元保存20member不変・Reader20member全SHA一致。全10owned PID通常終了。原7領域の残境界/非ゼロ給与/command再送/EV、raw結合checker完成、独立whole受入・正常統合finalが残り、原成果加点0。repair4編集6件を保持しprobe/Reader重複workerなし。実OpusがC結合層とraw改変負例に範囲を限定しAstraを選択、同タスクの正常dispatchでrepair5 implementing。LLM900秒は許可済みtask-only予算adapterで除去、検証watchdogと登録設定は維持。 追加でmain54e81e5の既存カタログ2名を公開hire/勤務割当で雇用し、実DAY/NIGHT交代と00:00給与255G一回を実測。正式SaveService Writer14262→別PID Reader14476でも全14typed出力が原native SHA一致、元20保存member不変、翌分まで給与行1件。既存給与データの入力利用であり本番balanceの新承認ではない。実行中C担当の入力/範囲は変更せず次の受入照合に保持。", + "current_summary": "P04-01承認D05を現採用source1338で実測。18:00完了課金後交代、依存先休業の日跨ぎ保持/復帰一回完了、既存2名の非ゼロ給与255G一回、同一request同分再送の全typed状態不変を確認。日跨ぎ/給与/再送は正式SaveServiceと別PID Readerでも元14typed出力・保存20memberがSHA一致。Cはraw所有/保存/帳簿の個別検査と23負例を通したがRoot供給関数SHA不備を検出。RootがGit20関数全文を再計算して実C全体を通し、旧資料と8編集を保持。実Opus判断でSol repair6が全文SHA厳密化・負例2件・旧説明同期だけを通常実行中。原7領域の残境界・全条件独立レビュー・正常統合finalが残り、原成果加点0。", "remaining_conditions": [ "原7種更新順序・証拠対応の原本/承認済み仕様への全条件適合性と規約凍結を最終独立受入する", "承認D05の依存先休業pause/resume日跨ぎと正式SaveService/別PID復元はmain5f6bc11で実測済み。既存証拠と残の原7領域全条件への適合性・独立whole受入を残す。直接休業D-034と区別する。", "承認済みD05:17:59→18:00昼番の完了・課金後に交代。夜番不在・既存残業タスク・同分再送を現版証拠で確認", "既存39証拠等の適用版・入力・設定・環境を照合して不足境界だけ検証。全条件独立受入と通常統合/final/台帳反映。D05他領域は具体的根拠を確認し一括解決/一括停止にしない" ], - "progress_summary": "承認D05をmain5f6bc11/全1338sourceで実測。18:00は完了・25G一回課金時に昼番2人、その後交代0人。依存先休業は日跨ぎ1439→1441で同service/予約・進捗44/45・財布50保持、復帰後1442に完了・財布25・SALE25一回、1443追加0。さらに正式SaveServiceの5状態をWriter3854→別profile/PID Reader3879で保存読込し、公開厨房再開後の全型付き14出力SHAが原nativeと一致、元保存20member不変・Reader20member全SHA一致。全10owned PID通常終了。原7領域の残境界/非ゼロ給与/command再送/EV、raw結合checker完成、独立whole受入・正常統合finalが残り、原成果加点0。repair4編集6件を保持しprobe/Reader重複workerなし。実OpusがC結合層とraw改変負例に範囲を限定しAstraを選択、同タスクの正常dispatchでrepair5 implementing。LLM900秒は許可済みtask-only予算adapterで除去、検証watchdogと登録設定は維持。 追加でmain54e81e5の既存カタログ2名を公開hire/勤務割当で雇用し、実DAY/NIGHT交代と00:00給与255G一回を実測。正式SaveService Writer14262→別PID Reader14476でも全14typed出力が原native SHA一致、元20保存member不変、翌分まで給与行1件。既存給与データの入力利用であり本番balanceの新承認ではない。実行中C担当の入力/範囲は変更せず次の受入照合に保持。", + "progress_summary": "P04-01承認D05を現採用source1338で実測。18:00完了課金後交代、依存先休業の日跨ぎ保持/復帰一回完了、既存2名の非ゼロ給与255G一回、同一request同分再送の全typed状態不変を確認。日跨ぎ/給与/再送は正式SaveServiceと別PID Readerでも元14typed出力・保存20memberがSHA一致。Cはraw所有/保存/帳簿の個別検査と23負例を通したがRoot供給関数SHA不備を検出。RootがGit20関数全文を再計算して実C全体を通し、旧資料と8編集を保持。実Opus判断でSol repair6が全文SHA厳密化・負例2件・旧説明同期だけを通常実行中。原7領域の残境界・全条件独立レビュー・正常統合finalが残り、原成果加点0。", "remaining_gaps": [ "依存先休業日跨ぎと正式保存/別PID復元の現版生証拠をcheckerへ結合する。原サービス/予約保持・課金一回・原保存全member不変・全型付きstate一致を監査し、未収集条件は未達のまま維持。", - "18:00と非ゼロ給与255Gの日跨ぎ/正式保存再開は有限実測済み。未完了serviceの夜番不在/残業、command同分再送、EV予約等の不足と既存証拠適用性を個別確認する。", + "同一service requestの同分再送は原実測と正式SaveService/別PIDで全状態不変を確認済み。未完了serviceの夜番不在/残業、EV予約、停電→閉店同Tick、退出/忍耐/破壊等の不足境界と既存証拠適用性を個別確認する。", "未提出repair4のA/B修正を保持し、C/D/Eの必要範囲を現実のguarded rawから完成する。LLM900秒打切りは実Opus判断と既存上限撤廃指示に沿う専用CLIのP04 implementer限定adapterで除去済み。登録config/digestと検証watchdogは不変。", "原7領域/安全性3結果/30-88の全条件を満たしてから独立wholeレビュー・登録validate・通常integration/final・台帳反映する。原成果の完了加点0。" ], - "updated_at_jst": "2026-10-16T01:41:36.997105+09:00", + "updated_at_jst": "2026-10-16T01:53:14.357106+09:00", "current_recheck": "execution/p04-01-current-recheck-20261015/recheck.json", "policy_candidate": "execution/p04-01-current-recheck-20261015/D05_POLICY_CANDIDATE.md", "owner_policy_update": { @@ -3869,12 +3869,12 @@ "reference": "docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015/D05_OWNER_APPROVAL.json", "scope": "two owner policy selections only; no acceptance credit", "remaining": "condition-specific evidence applicability, missing boundaries, independent review, ordinary integration/final", - "actual_commander": "execution/p04-01-current-recheck-20261015/OPUS_AFTER_REAL_D05_FORMAL_DECISION.json", + "actual_commander": "execution/p04-01-current-recheck-20261015/OPUS_C_CORRECTED_INPUT_CONTINUATION.json", "runner_state": "implementing", - "repairs": 5, - "worker_model": "gpt-6-astra", + "repairs": 6, + "worker_model": "gpt-6.1-sol", "model_selected_by": "actual Claude Opus 5.5 run decision", - "run_decision": "execution/p04-01-current-recheck-20261015/OPUS_REPAIR5_C_RUN_DECISION.json", + "run_decision": "execution/p04-01-current-recheck-20261015/OPUS_REPAIR6_C_RUN_DECISION.json", "submitted": "9767b0a28ca8d252520307dbbac60a1d8cfb87ab", "registered_validation": "9d724d81f0e74a9f94dfd94cdc6eb5c6", "root_work_continues": true, @@ -3884,9 +3884,11 @@ "duplicate_probe_worker_dispatched": false, "formal_dependency_proof": "execution/p04-01-current-recheck-20261015/ROOT_APPROVED_DEPENDENCY_FORMAL_RESULT.json", "timeout_adapter": "execution/p04-01-current-recheck-20261015/OWNER_P04_LLM_TIMEOUT_ADAPTER.json", - "actual_run": "cb864ee199f346408370f8944e574eb7", + "actual_run": "c2c761d8d2ed4a55b7ea4515e13ae53f", "current_scope": "trusted raw binding C plus relevant adversarial Python fixtures only; no product/probe duplication or native/full regression", - "paid_shift_midnight_formal_proof": "execution/p04-01-current-recheck-20261015/ROOT_PAID_SHIFT_MIDNIGHT_FORMAL_RESULT.json" + "paid_shift_midnight_formal_proof": "execution/p04-01-current-recheck-20261015/ROOT_PAID_SHIFT_MIDNIGHT_FORMAL_RESULT.json", + "same_minute_formal_proof": "execution/p04-01-current-recheck-20261015/ROOT_SAME_MINUTE_RESEND_FORMAL_RESULT.json", + "corrected_c_bundle": "execution/p04-01-current-recheck-20261015/ROOT_CORRECTED_C_BUNDLE_LOCAL_PASS.json" } }, {