{ "plan_id": "P04-01", "audit_started_at_jst": "2026-10-10T10:53:18.681171+09:00", "original_unit": { "id": "P04-01", "title": "同時発生の更新規約", "work": "閉店、停電、破壊、退出、課金、シフト交代、00:00決算の順序を明記する。", "acceptance": "順序境界で停止中課金、二重決算、予約の孤立がない。", "state": "planned", "evidence": [] }, "original_package": { "work": "一分更新、00:00決算、時間帯・天候更新、施設稼働判定、客選択の適用順を仕様化。新機能は分離サービスで実装しRuntimeから接続。全体の一括書換えはしない。", "acceptance": "同一Tickでの閉店/停電/退出/課金順が決定的。コマンド再送で二重課金・二重生成しない。", "depends_on": [ "P03" ], "decisions": [ "D05" ] }, "source_map": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-source-adoption-r01/source-after.json", "bytes": 152598, "sha256": "ad5cd250b337e87f24f9d10269ab66d36c511328b93c56ac654cb96e20e9a0bc" }, "source_refs": 1299, "whole_current_source_matches": true, "full": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/runner-ended.json", "bytes": 3729855, "sha256": "76a3feb6a5c2b539c2c1f20f429b4e9afeb40079ed5dc7c79deb38da53eebf52" }, "previous_accepted_full_raw_review": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full-root-review-r01/review.json", "bytes": 264831, "sha256": "cffa1d883d0f60e43e8d7c1638f4746d616b1314f9cc75cc1675b63a5e23df66" }, "related_phases": [ { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/business/test_business_closure.gd", "bytes": 10795, "sha256": "de9a36cea18a450bed920ded051d2edd4fa2babedac881be85e2cf2d8ad82363" }, "functions": [ "_initialize", "_run", "_test_last_patience_minute", "_test_group_preflight_and_retry", "_test_scheduled_closure_restore", "_test_outside_opening_hours_rejects_new_request", "_fixture", "_queue", "_spawn", "_closure_events", "_has_abandonment", "_available_meals", "_policy", "_cmd", "_expect", "_clear_fixture" ], "phase": "001", "pid": 78317, "wall_seconds": 2.221705041, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/001/stdout.log", "bytes": 8234, "sha256": "66d02b501fe7d95cf5930f2d7aa2df205e6704f36c0ff2233112d3ca0cfe86a4" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/001/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/001/engine-native.log", "bytes": 8084, "sha256": "08bb86c6d56347c4b064b66ad3b3028e660b714b9ac586969720b088b0085cfd" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/001/started.json", "bytes": 2453, "sha256": "0d4fe6ffdf14d5e298eec6fa6e1d194dfc55f910c6e69d17f7e5b44104ef8429" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/001/ended.json", "bytes": 1813, "sha256": "336d104671788c0127663db4cc42c53d58fed9652787dbe5954cf8e2e1ed9576" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/business/test_business_operations.gd", "bytes": 11383, "sha256": "5dfd8f256a191835fd88af1e4dd6151dbfc87b767b443023a04f415eecce0adc" }, "functions": [ "_initialize", "_run", "_catalog_and_report", "_immutable_sale", "_closed_queue", "_save_and_candidates", "_policy", "_cmd", "_expect", "_finish" ], "phase": "002", "pid": 78345, "wall_seconds": 1.7922645000000017, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/002/stdout.log", "bytes": 8164, "sha256": "e61bfc1a43a8188a010194190ff20f10ca0a1673cc90ac26e13a42c9a618bf2a" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/002/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/002/engine-native.log", "bytes": 8014, "sha256": "1f122fb64008d6fc040d7a186ea5e92111881a19270376a8a9cbb00cb5426820" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/002/started.json", "bytes": 2453, "sha256": "6504be1bd5432f2858c6814ddd21e6cea77955902d049d9c16aff17162ebb170" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/002/ended.json", "bytes": 1813, "sha256": "59073b33282bb09e189c125f01ebbafaac2aa2ca19a6bd082694b5dd1a6fadb4" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/business/test_required_kitchen.gd", "bytes": 31533, "sha256": "5dcc86d66bdc47003472d6c30d6889eb514e016003265965bdd8496d123d5ca5" }, "functions": [ "_initialize", "expect", "_guard", "_proof", "_read", "_setup", "_listen", "_capture_event", "_command", "_prepare", "_ui", "_select", "_paused", "_fixture_source", "_fixture_package", "_package", "_copy_fixture_file", "_io_valid", "_compare_loaded", "_new_saved_boundary", "_reject_remote_kitchen", "_rebuild_behind_kitchen", "_legacy_saved_boundary", "run", "_cleanup", "finish" ], "phase": "003", "pid": 78362, "wall_seconds": 2.284876167, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/003/stdout.log", "bytes": 17364, "sha256": "9161df97d9e69e13c831452039f24afdd99fab2197ead680f51ee668b41d8712" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/003/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/003/engine-native.log", "bytes": 17214, "sha256": "7f944358461353554d5f40b4511ca3f72bf30914d2a7aca16edac30107c279be" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/003/started.json", "bytes": 2453, "sha256": "bebfb76cf35381e64e00e08e543850308972f6d9bb4a59670448c3cd7923abd4" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/003/ended.json", "bytes": 1813, "sha256": "7bd5ad4043d6890e482df9457acaaf9bdb0d82583da88f81c06f39eda0407846" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/s2/test_runtime_operations_cycle.gd", "bytes": 14104, "sha256": "9ec6fb682e258460b3e91870fe4690f780e1053b7fa2dcf753d31bbc8107ce35" }, "functions": [ "_initialize", "_run", "_reset_runtime", "_cleanup", "_build_operational_cafeteria", "_deliver_inputs_through_logistics", "_advance_delivery", "_run_service_sale_with_round_trip", "_test_power_projection", "_expect" ], "phase": "078", "pid": 82902, "wall_seconds": 1.686568374999979, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/078/stdout.log", "bytes": 11361, "sha256": "6b578356af78498dffc86c46f16cc938070c6b136c33e0643773ee402d2d2026" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/078/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/078/engine-native.log", "bytes": 11211, "sha256": "0540dffd0856e12089f7dbb9684159fd38edfa749302db0aa7339ae778443fe0" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/078/started.json", "bytes": 2454, "sha256": "9b3b3e07f368ef549c80c37a7ee02808dca498febb05a79d1396c4597dc6e6be" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/078/ended.json", "bytes": 1814, "sha256": "7cbcc10a3ec995d6cc9acf5997f813ea74669975621becfb34ab96278aa23d83" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/s2/test_facility_service.gd", "bytes": 17403, "sha256": "4b834f1d9d9ab2ad00cb4a56f5202b70468bfe5f71318dbf816da1e29cc32690" }, "functions": [ "_initialize", "_run", "_test_state_priority_and_opening_hours", "_test_policy_revision_and_request_snapshot", "_test_deterministic_queue_and_departure", "_test_capacity_progress_and_boundaries", "_test_interruption_and_recovery", "_test_determinism", "_test_snapshot_round_trip_is_atomic", "_deterministic_run", "_facility", "_request", "_queue_ids", "_expect", "_test_deferred_queue_clock_contract" ], "phase": "068", "pid": 82699, "wall_seconds": 1.194396916999949, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/068/stdout.log", "bytes": 11273, "sha256": "75040dc91db0c69d37d6de860ad20aa8b69356f3998273e76c0e5b065655d092" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/068/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/068/engine-native.log", "bytes": 11123, "sha256": "ecc2eaf71eca4d048e5a9e6ec53b82758ac28087a2d28a0569537a457c2ce16d" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/068/started.json", "bytes": 2454, "sha256": "536071d5e3c3049839e68376fbd560a56eb8fce5a653410d6df3a04e8cfd33a5" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/068/ended.json", "bytes": 1814, "sha256": "909d9db2af4e7f493821632b21fee6ea5b99a81c00376cbf06921942d50e0337" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/s3/test_runtime_actor_hardening.gd", "bytes": 19229, "sha256": "0deb2df7be31d90a7fe70b98fe420eb748e19ab19c1cc37140f74cf0acd3fa95" }, "functions": [ "_initialize", "_run", "_reset_runtime", "_cleanup", "_test_service_affordability_is_atomic", "_test_guest_moves_one_cell_per_minute", "_test_unreachable_staff_task_is_not_assigned", "_test_shift_end_interrupts_and_fails_service", "_test_corrupt_cross_domain_snapshots_are_atomic", "_build_cafeteria", "_stock", "_register_wallet", "_cell_distance", "_expect" ], "phase": "083", "pid": 83052, "wall_seconds": 2.3064641250000477, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/083/stdout.log", "bytes": 12397, "sha256": "07480910c4bee2b69f38a135cf7da2e37189e4e95a869a1e810fae3a2e84de3f" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/083/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/083/engine-native.log", "bytes": 12247, "sha256": "d67518ff7e678c128cf68c6b306e4fb6c4411123bf6a966db355275b6b951105" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/083/started.json", "bytes": 2454, "sha256": "316ea79789fe0d7652bfdeee6a11064a928701db136f9fd002c1859336590a49" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/083/ended.json", "bytes": 1814, "sha256": "2e16c457ca9c94130ea06cd5ae047657dce8a8923a05b8f26a235a594ea83c20" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/s3/test_runtime_actor_cycle.gd", "bytes": 11320, "sha256": "955cca90ee1be985e37ef166eaedb5c49f7001993afa38011fe3bf20ddb4a9b3" }, "functions": [ "_initialize", "_run", "_reset_runtime", "_cleanup", "_build_cafeteria", "_register_staff_and_run_task", "_run_autonomous_guest_service_with_replay", "_run_long_horizon_replay", "_expect" ], "phase": "082", "pid": 83000, "wall_seconds": 5.277048874999991, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/082/stdout.log", "bytes": 10573, "sha256": "c1d4bb8dc26cbb06136175ec7fa012fe15824392ef2920ac88e61645acf5cdc3" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/082/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/082/engine-native.log", "bytes": 10423, "sha256": "0ac160bc7be65d982503af8ac3ff06bf9807a57d10bfa0e96051d832b5ddcd0a" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/082/started.json", "bytes": 2454, "sha256": "35f053a4d3db5a7890fd0f3fc7af7a18938a7d87eb8a2d5b651a6a0dd68587e4" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/082/ended.json", "bytes": 1814, "sha256": "00a58308901b1c4b664f56f3bdbf255371176152f2d335ef8eb37599f80adfbe" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/s3/test_guest_service.gd", "bytes": 38371, "sha256": "0d10b68512685d2ed7d5c0c858952009333e0e47f348ace4b4ccdd0b21d23647" }, "functions": [ "_initialize", "_run", "_test_definition_and_runtime_contract", "_test_need_updates_and_single_clamp", "_test_need_context_and_adult_gate", "_test_batched_need_updates_match_individual_api", "_test_shared_need_context_fast_paths", "_test_candidate_filtering", "_test_integer_utility_and_stable_tie_break", "_test_state_machine_and_loop_guard", "_test_atomic_queue_abandonment", "_test_service_interruption_is_idempotent", "_test_service_need_effect_schema", "_test_path_failure_safe_recovery", "_test_exit_persistence_boundary", "_test_snapshot_round_trip_and_atomic_rejection", "_test_v1_need_migration_and_schema_rejection", "_test_deterministic_decision_snapshot", "_deterministic_run", "_service_with_definitions", "_moving_guest", "_candidate", "_candidate_ids", "_rejection_map", "_expect", "_test_primary_need_priority" ], "phase": "081", "pid": 82972, "wall_seconds": 1.188093624999965, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/081/stdout.log", "bytes": 15661, "sha256": "5a27dd2cc73a1a4073d7574c54bc5b179ce478383dd42c1c94df28b00ec525bd" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/081/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/081/engine-native.log", "bytes": 15511, "sha256": "416f1e5c658f7b585e8c0d13f08340fb306a74e6863f7832d34b9c7abbde0f7b" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/081/started.json", "bytes": 2454, "sha256": "d773adf5e4acd16824f2c21e467a34f311778cb3ca7a33c60a33f85042e070ee" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/081/ended.json", "bytes": 1814, "sha256": "79c32405d1d59640ae88d7c26f17786ee88921706b313f40f98410b650a00386" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/s1/test_runtime_infrastructure_integration.gd", "bytes": 50948, "sha256": "aaca043097fb31a79e77c77cce1d12e34e5d8630e0ad7337af0d6860f4d45473" }, "functions": [ "_initialize", "_run", "_finish", "_test_composed_infrastructure_validation", "_test_exact_cell_sets", "_new_fixture", "_free_fixture", "_test_runtime_surface", "_test_completion_capture_fast_path", "_test_rank_and_operations_gates", "_test_excavation_tick_pause_resume_and_completion", "_test_completed_proxy_projection", "_test_proxy_completion_raw_signal_commit_order", "_test_proxy_completion_projection_failure_is_atomic", "_test_completed_elevator_topology", "_test_demolition_projection_atomicity", "_test_current_snapshot_strictness", "_test_v5_proxy_migration_determinism", "_test_rank_expansion_preserves_route_union", "_promote_rank_two", "_complete_excavation", "_complete_proxy", "_register_legacy_operational_proxy", "_strip_v6_infrastructure_domain_history", "_legacy_v5_infrastructure_shape_is_clean", "_construction_job_snapshot", "_infrastructure_state", "_completion_boundary_state", "_assert_runtime_restore_rejected", "_saw_domain_event", "_domain_event_count", "_ledger_category_count", "_runtime_failure_diagnostic", "_submit", "_object_has_property", "_same_cells", "_expect" ], "phase": "061", "pid": 82558, "wall_seconds": 2.388117125000008, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/061/stdout.log", "bytes": 18665, "sha256": "63734fc91ac61684d53abb599f5233a27747a211d731d8d2260d448942f76533" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/061/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/061/engine-native.log", "bytes": 18515, "sha256": "9080fcd1a061a2a38ffeeba87c30e3ed154cd349780c48de6d236edc01cdd70f" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/061/started.json", "bytes": 2454, "sha256": "142590f81c31549ed8daf834daf8df347de0ba7383ad9569787cfe6d96e352b9" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/061/ended.json", "bytes": 1814, "sha256": "e8740980fc4d6590c534a96da1a048fff7952640f1b743eb28f685641eb4372f" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/s5/test_runtime_defense_cycle.gd", "bytes": 44418, "sha256": "a909e2af73aae43590cdd91d07ed2548f4fd2f675d26fa63aa74f6a5cda34357" }, "functions": [ "_initialize", "_run", "_reset_runtime", "_cleanup", "_test_all_commands_multiwave_and_terminal_replay", "_test_manual_retreat_cancel_and_long_horizon", "_test_scheduled_command_time_alignment", "_test_rng_skill_and_outcome_atomicity", "_test_cross_raid_locks", "_test_snapshot_replay_corruption_and_legacy_migration", "_create_staff_and_facility", "_prepare_started_raid", "_register_defender", "_register_objective", "_raid_definition", "_wave", "_submit", "_submit_with_key", "_advance", "_count_domain_events", "_defense_terminal_event_order", "_expect", "_submit_round_at_due", "_capture_defense_views" ], "phase": "095", "pid": 83330, "wall_seconds": 3.5860561249999137, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/095/stdout.log", "bytes": 18719, "sha256": "7fd80426bd123a208d01a0bcbb6de910ea412cc4252e2d1ab9d516eb10d228a7" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/095/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/095/engine-native.log", "bytes": 18569, "sha256": "771adcbf7e10bfbd23bf754cbd8afd6d903b55c1b61fa77a47156584371afcec" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/095/started.json", "bytes": 2454, "sha256": "afa12ab7e6ee2fdf28432f935ded3fd6448d8acfefb9397f96cfa357b61fee29" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/095/ended.json", "bytes": 1814, "sha256": "36b417809b6c94fb07866df1d9c72db719b8b51915b962ecb156f17434520038" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/s5/test_runtime_defense_autonomy.gd", "bytes": 27641, "sha256": "28ca81ddde4da49442b427ed4c55ddcf213ecb389712db585b64cd416636c403" }, "functions": [ "_run", "_test_ordinary_due_pause_two_waves_and_terminal", "_test_multiple_raids_stable_order", "_test_automatic_failure_pause_retry_and_atomicity", "_test_manual_failure_is_not_hidden_by_same_tick_auto", "_test_restart_mid_interval_and_speed_equivalence", "_test_history_replay_does_not_skip_due_automatic_round", "_test_history_replay_preserves_prior_manual_failure_guard", "_test_resolution_history_is_scoped_per_raid", "_test_generated_ids_skip_existing_saved_history", "_test_exhausted_generated_ids_fail_atomically", "_test_auto_breach_projects_facility_suspension" ], "phase": "094", "pid": 83316, "wall_seconds": 1.683205791999967, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/094/stdout.log", "bytes": 20329, "sha256": "f68d77e79a472c0bd767ebb29108fb45bacb5676b4f328eb6215df3199522319" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/094/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/094/engine-native.log", "bytes": 20179, "sha256": "d77ab797fed1182c495a6f9fa2e04849b0d36b14ab0b0ff905cddaa03b4ced5b" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/094/started.json", "bytes": 2454, "sha256": "c5b3a7f613e6e9bedf75742a903255bc63a6b72c56d11148d2c11b607006f85d" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/094/ended.json", "bytes": 1814, "sha256": "94fd4709e37c8c7bb5e13083e94afc0d4a7f6641d2e9cd434cea81dfef6f2cb2" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/staff/test_shift_rush.gd", "bytes": 3668, "sha256": "af3d47d848c1220741992612e57736df4af05969d424b79829d9977c774e8149" }, "functions": [ "_initialize", "expect", "run" ], "phase": "106", "pid": 83806, "wall_seconds": 2.6739929579999853, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/106/stdout.log", "bytes": 9499, "sha256": "88ce5bf86c98ada699640c7945918be24eaff18240c85fe5d87b9f0ed196940d" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/106/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/106/engine-native.log", "bytes": 9349, "sha256": "9cf5d650001de0416277379c44d18da35432d6805f4334da266d2456212e424d" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/106/started.json", "bytes": 2454, "sha256": "26693fd3eae0d8429711efac022c2eb8671ec1e80f15153f56e32dfaeab3386d" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/106/ended.json", "bytes": 1814, "sha256": "9a800630c785cc30f2126037d4630b47d0c8452d17417634468b37ce99ed6b23" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/staff/test_dormitory_shift_cycle.gd", "bytes": 3857, "sha256": "ada3c0177f00648137d02450fce5f33da0a644dae9ec861ac51648770dafebda" }, "functions": [ "_initialize", "expect", "command", "run", "finish" ], "phase": "104", "pid": 83625, "wall_seconds": 21.03801062499997, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/104/stdout.log", "bytes": 7904, "sha256": "2fda9874a597ede6395054bf62f947b9a3d5c3eeec59f8b31a5165ce60cb17fb" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/104/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/104/engine-native.log", "bytes": 7754, "sha256": "d52c1c110449acbde254bee3c6e872e36099002696fbac4e4c5aae900d4ba048" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/104/started.json", "bytes": 2454, "sha256": "7e141a72896df939e7e19a973a7b94df65f3f8bab579b4fd7432bb96fd0e8617" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/104/ended.json", "bytes": 1814, "sha256": "76a6af76616bb0ca2f4aaf7683fec1dba8ca808540ff4fa271b4d3744dab0d5e" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/mvp/test_original_midnight_settlement.gd", "bytes": 22752, "sha256": "2e6d7e907156db36a44b2e3b124b2311ddc79fe45250b8dc312b0a3f543bb7d1" }, "functions": [ "_initialize", "_run", "_test_legacy", "_bind", "_expect", "_test_principal_financing", "_test_principal_repayment", "_test_principal_command", "_test_principal_profit_marker" ], "phase": "018", "pid": 80026, "wall_seconds": 1.7019535829999768, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/018/stdout.log", "bytes": 7876, "sha256": "ae66c169cc8d27660c1b6ac38d2d1106b93ab9e876556a9b04e4a228f040afaf" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/018/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/018/engine-native.log", "bytes": 7726, "sha256": "4bb6898abf559763d08dd8e5c461598b0c9aee6ee81845d7f2d2b3a2d4ebe784" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/018/started.json", "bytes": 2454, "sha256": "03564b3584582ab1f633594e52d9b5bb6ab456f214eedb6da99a1accf86ff4cc" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/018/ended.json", "bytes": 1814, "sha256": "e1caab0705c02151f68e900f4b5c5afb29283c42d950c87a9f6c02d68e1b31c3" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/mvp/test_runtime_operations_acceptance.gd", "bytes": 19115, "sha256": "a802afdc5786b6690a2c8b81f39eefda9c04624826d5cb90c587cf84190feea3" }, "functions": [ "_initialize", "_run", "_new_fixture", "_free_fixture", "_advance_operations_boundary_slice", "_align_operations_fixture_clocks", "_operations_slice_is_healthy", "_test_waiting_choice_and_command_exactly_once", "_test_twenty_four_hour_actual_tick_smoke", "_test_full_partial_payroll_bankruptcy_and_v9_tamper", "_assert_v9_tamper_rejected", "_test_fourteen_day_boundary_snapshot_determinism", "_expect" ], "phase": "026", "pid": 80344, "wall_seconds": 45.46433608299998, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/026/stdout.log", "bytes": 10760, "sha256": "dad327d6287f0fbff92793a02f63d2f9060f248bb4091e1f3fb0ca4564ad9477" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/026/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/026/engine-native.log", "bytes": 10610, "sha256": "d80f32470dfff8deb3e5129cfc10a34a3eecc881e26417820baa3165772f1985" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/026/started.json", "bytes": 2454, "sha256": "6237367a2e07b2fe910d84513e429dac72bdbbea9e07cdd76a9f95decaf2a7a4" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/026/ended.json", "bytes": 1814, "sha256": "a41a9e8656688811f5a3b23ce944b839bc772b7a26111d36ad4b0ba985fa3a6d" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/mvp/test_runtime_mana_depletion.gd", "bytes": 5343, "sha256": "8d94fd8e28b0fc22a699c630b5d68e7afd476a1305c86ecf57858b2f1d49b8ae" }, "functions": [ "_initialize", "expect", "_run" ], "phase": "025", "pid": 80326, "wall_seconds": 1.8033619999999928, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/025/stdout.log", "bytes": 7875, "sha256": "14825b636af4b1ec829bccba61c85aac40538b15bd8c5b69106c3e1e89f04697" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/025/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/025/engine-native.log", "bytes": 7725, "sha256": "f34478fce5d6bc0619d02a01c95dba8b703fb3f83f2401c7e2643ba43e76c7f8" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/025/started.json", "bytes": 2454, "sha256": "fe85d47114b7193f066fa6d4950fa9c466c707b05899af6b5b0fa0e1dee99d98" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/025/ended.json", "bytes": 1814, "sha256": "030cd91bd38a4327feec7b5af6130ac80e15cc688e3561b3627c411ec7b69bb4" } ] }, { "test": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/tests/mvp/test_runtime_upkeep.gd", "bytes": 7337, "sha256": "eae48823d58d78c419d29728e33a5559fbe5131b49e33d04ca4e6fa3a721c29b" }, "functions": [ "_initialize", "expect", "_run" ], "phase": "028", "pid": 81170, "wall_seconds": 23.856997417000002, "passed": true, "raw": [ { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/028/stdout.log", "bytes": 7875, "sha256": "789083b111e2ea23188de05ec8b365389dad80ae008ab871ed94f295fd146086" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/028/stderr.log", "bytes": 0, "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/028/engine-native.log", "bytes": 7725, "sha256": "b7e8db9cceff07e3aa294bca86e3aa4ce0fe0c97ad8cce35d9f86f9eac0be865" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/028/started.json", "bytes": 2454, "sha256": "e53fceac25bbf69d3448cb13eda03a407765b1e16e4906e3f50138a645965164" }, { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p04-02-paid-completion-final-full172-native-r01/028/ended.json", "bytes": 1814, "sha256": "b5e538ac1133cbd0047f4ba93ad9675781efdc12031b75621a685239190d1c80" } ] } ], "implementation_excerpts": [ { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/scripts/core/simulation_kernel.gd", "bytes": 7602, "sha256": "341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb" }, "function": "advance_one_minute", "start_line": 122, "end_line": 158, "body": "func advance_one_minute() -> void:\n\t_abort_current_tick_requested = false\n\t_last_tick_advanced = false\n\ttick_started.emit(absolute_minute)\n\t_run_phase(TickPhase.APPLY_COMMANDS)\n\t# A Runtime gate can reject the tick before the Clock changes. This is\n\t# distinct from an ordinary pause raised by a command that already committed\n\t# for the upcoming minute.\n\tif _abort_current_tick_requested:\n\t\t_abort_current_tick_requested = false\n\t\treturn\n\n\tvar previous_absolute_minute := absolute_minute\n\tabsolute_minute += 1\n\t_sync_calendar_fields()\n\t_handle_time_boundaries(previous_absolute_minute)\n\t_run_phase(TickPhase.TIME_BOUNDARIES)\n\n\tfor phase in [\n\t\tTickPhase.MANA,\n\t\tTickPhase.CONSTRUCTION,\n\t\tTickPhase.LOGISTICS,\n\t\tTickPhase.FACILITY_COMPLETION,\n\t\tTickPhase.VITALS_AND_ENVIRONMENT,\n\t\tTickPhase.INCIDENTS_AND_EVENTS,\n\t\tTickPhase.FACILITY_QUEUES,\n\t\tTickPhase.AI_DECISIONS,\n\t\tTickPhase.PUBLISH_SNAPSHOT,\n\t]:\n\t\t_run_phase(phase)\n\n\tsnapshot_version += 1\n\ttick_completed.emit(absolute_minute)\n\t_emit_current_time()\n\t_abort_current_tick_requested = false\n\t_last_tick_advanced = true\n\n", "body_sha256": "b9587ef722d8c8640248025462819374ae5eca1c3d8bbe600b6bc9c328567777" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/scripts/core/simulation_kernel.gd", "bytes": 7602, "sha256": "341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb" }, "function": "_run_phase", "start_line": 236, "end_line": 249, "body": "func _run_phase(phase: TickPhase) -> void:\n\ttick_phase_started.emit(phase, absolute_minute)\n\tif not _phase_handlers.has(phase):\n\t\treturn\n\tvar handlers: Dictionary = _phase_handlers[phase]\n\tvar handler_ids: Array = handlers.keys()\n\thandler_ids.sort_custom(func(left: Variant, right: Variant) -> bool:\n\t\treturn String(left) < String(right)\n\t)\n\tfor handler_id: Variant in handler_ids:\n\t\tvar callback: Callable = handlers[handler_id]\n\t\tif callback.is_valid():\n\t\t\tcallback.call(absolute_minute)\n\n", "body_sha256": "52461eeb288892a4bb4b6a99570185af08a30758ef88b0046a911baaa6f318e1" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/scripts/core/simulation_kernel.gd", "bytes": 7602, "sha256": "341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb" }, "function": "_handle_time_boundaries", "start_line": 254, "end_line": 259, "body": "func _handle_time_boundaries(previous_absolute_minute: int) -> void:\n\tif minute_of_day == 0:\n\t\tvar completed_day := previous_absolute_minute / MINUTES_PER_DAY + 1\n\t\tsettlement_requested.emit(completed_day)\n\t\tday_started.emit(day)\n\n", "body_sha256": "2ced47a2911b36def9d89de82a43afc69148ead44d19db6a2a6c7bce5a910ae9" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/scripts/core/command_queue.gd", "bytes": 14401, "sha256": "09b22e6212fa3ce1bf08f5d6b52224a2d3362b3bc63f03a8c98e89af1c6f5895" }, "function": "_comes_before", "start_line": 409, "end_line": 414, "body": "func _comes_before(left: SimulationCommand, right: SimulationCommand) -> bool:\n\tif left.execute_tick != right.execute_tick:\n\t\treturn left.execute_tick < right.execute_tick\n\tif left.priority != right.priority:\n\t\treturn left.priority > right.priority\n\treturn left.command_id < right.command_id\n", "body_sha256": "21f7f9f7c0923121fd0a022a2f7546b7bb7117a9979c1ed25d0b33b96e28ab28" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/autoload/simulation_runtime.gd", "bytes": 608704, "sha256": "2d7e2cea5424585e9aa4302ab66d1fc4dbaefe743ce4328fccc1efa2f19b82e4" }, "function": "_process_tick_commands", "start_line": 5736, "end_line": 5746, "body": "func _process_tick_commands(current_absolute_minute: int) -> void:\n\tif _operations_enabled:\n\t\t_operations_tick_blocked = _operations_should_block_tick()\n\t\tif _operations_tick_blocked:\n\t\t\t_clock.set_paused(true)\n\t\t\t_clock.request_current_tick_abort()\n\t\t\treturn\n\t_process_commands(current_absolute_minute + 1)\n\t_synchronize_operations_population()\n\n\n", "body_sha256": "9de66a4bb84b12304300d49085f44546412319bd4aee91e67b61becf97e50294" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/autoload/simulation_runtime.gd", "bytes": 608704, "sha256": "2d7e2cea5424585e9aa4302ab66d1fc4dbaefe743ce4328fccc1efa2f19b82e4" }, "function": "_advance_operations_time", "start_line": 1894, "end_line": 1949, "body": "func _advance_operations_time(absolute_minute: int) -> void:\n\tif not _operations_enabled or operations_coordinator == null:\n\t\treturn\n\tif _operations_deferred_runtime_minute >= 0:\n\t\t_operations_tick_blocked = true\n\t\t_clock.set_paused(true)\n\t\treturn\n\t_operations_tick_blocked = false\n\tvar advanced := operations_coordinator.advance_to(absolute_minute, true)\n\tif not advanced.is_success():\n\t\t# Earlier boundaries in the same minute can already be validly committed\n\t\t# (for example demand before a failed arrival). Publish only those staged\n\t\t# effects and notifications; the failing callback rolled itself back.\n\t\tif not _commit_operations_domain_events() \\\n\t\t\t\tor not _commit_operations_notifications():\n\t\t\toperations_coordinator.discard_deferred_notifications()\n\t\t\t_discard_operations_domain_events()\n\t\t_operations_runtime_failure_latched = true\n\t\t_operations_runtime_failure_report = advanced.to_dictionary()\n\t\t_operations_deferred_runtime_minute = absolute_minute\n\t\t_operations_tick_blocked = true\n\t\t_clock.set_paused(true)\n\t\treturn\n\tif operations_coordinator.current_minute != absolute_minute \\\n\t\t\tor operations_coordinator.get_population_count() != guest_service.guest_count() \\\n\t\t\tor operations_coordinator.get_arrears_total() != _operations_closed_arrears_total() \\\n\t\t\tor not _operations_notifications_are_committable() \\\n\t\t\tor not _commit_operations_domain_events() \\\n\t\t\tor not _commit_operations_notifications():\n\t\toperations_coordinator.discard_deferred_notifications()\n\t\t_discard_operations_domain_events()\n\t\t_operations_runtime_failure_latched = true\n\t\t_operations_runtime_failure_report = {\n\t\t\t&\"code\": &\"OPERATIONS_CROSSLINK_MISMATCH\",\n\t\t\t&\"minute\": absolute_minute,\n\t\t}\n\t\t_operations_deferred_runtime_minute = absolute_minute\n\t\t_operations_tick_blocked = true\n\t\t_clock.set_paused(true)\n\t\treturn\n\t_operations_runtime_failure_latched = false\n\t_operations_runtime_failure_report.clear()\n\tif operations_coordinator.is_terminal():\n\t\t_operations_deferred_runtime_minute = -1\n\t\t_operations_tick_blocked = true\n\t\t_clock.set_paused(true)\n\t\treturn\n\tif operations_coordinator.pause_requested:\n\t\t_operations_deferred_runtime_minute = absolute_minute\n\t\t_operations_tick_blocked = true\n\t\t_clock.set_paused(true)\n\t\treturn\n\t_operations_deferred_runtime_minute = -1\n\t_pause_for_waiting_foreground_event()\n\n\n", "body_sha256": "511580d1fac3d2785072e94c2981065fa47ba18b1c97122922645dac5c0d94ab" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/autoload/simulation_runtime.gd", "bytes": 608704, "sha256": "2d7e2cea5424585e9aa4302ab66d1fc4dbaefe743ce4328fccc1efa2f19b82e4" }, "function": "_run_operations_deferred_suffix", "start_line": 1683, "end_line": 1700, "body": "func _run_operations_deferred_suffix(absolute_minute: int) -> void:\n\t_advance_mana(absolute_minute)\n\t_advance_construction(absolute_minute)\n\t_advance_inventory_and_logistics(absolute_minute)\n\t_advance_facilities(absolute_minute)\n\t_advance_guest_vitals(absolute_minute)\n\t_advance_authority_incidents(absolute_minute)\n\t_advance_defense(absolute_minute)\n\t_advance_relationship_events(absolute_minute)\n\t_advance_guest_queues(absolute_minute)\n\t_advance_staff_ai(absolute_minute)\n\tif _active_command_minute >= 0:\n\t\t_operations_resume_publish_pending = true\n\telse:\n\t\t_publish_snapshot(absolute_minute)\n\t\t_process_save_checkpoints(absolute_minute)\n\n\n", "body_sha256": "12075307b12cbb66ffda47a26097194a07fad9d6467e3e557bd7269315c98982" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/autoload/simulation_runtime.gd", "bytes": 608704, "sha256": "2d7e2cea5424585e9aa4302ab66d1fc4dbaefe743ce4328fccc1efa2f19b82e4" }, "function": "_advance_mana", "start_line": 10628, "end_line": 10661, "body": "func _advance_mana(absolute_minute: int) -> void:\n\tif _operations_tick_blocked:\n\t\treturn\n\tvar infrastructure_preflight := _preflight_proxy_completions(absolute_minute)\n\tif not bool(infrastructure_preflight.get(&\"ok\", false)):\n\t\t_latch_infrastructure_failure(\n\t\t\tStringName(infrastructure_preflight.get(\n\t\t\t\t&\"code\", &\"INFRASTRUCTURE_PREFLIGHT_FAILED\"\n\t\t\t)),\n\t\t\tabsolute_minute,\n\t\t\tString(infrastructure_preflight.get(\n\t\t\t\t&\"reason\", \"Infrastructure completion preflight failed.\"\n\t\t\t)),\n\t\t\tinfrastructure_preflight.get(&\"details\", {})\n\t\t)\n\t\treturn\n\tvar report := mana_network_service.advance_one_minute(absolute_minute)\n\t# Finite reserve is an additional gate, even between network evaluations and\n\t# for zero-demand facilities. The network remains the local supply authority.\n\tpreload(\"res://scripts/mana/mana_power_projection.gd\").apply(\n\t\tfacility_service, mana_network_service, int(_state.get_resource(&\"mana\")), absolute_minute\n\t)\n\tfor change: Dictionary in report.get(&\"state_changes\", []):\n\t\tvar consumer_id := StringName(change.get(&\"consumer_id\", \"\"))\n\t\t_publish_domain_event(SimulationDomainEvent.new(\n\t\t\tid_generator.next_id(&\"domain_event\"),\n\t\t\t&\"MANA_STATE_CHANGED\",\n\t\t\tabsolute_minute,\n\t\t\t&\"mana_network_service\",\n\t\t\t[consumer_id],\n\t\t\tchange,\n\t\t\t0\n\t\t))\n\n", "body_sha256": "05c54626ce6e355acd92994ab80aaf2177c5cf194885e66934552139e087599e" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/autoload/simulation_runtime.gd", "bytes": 608704, "sha256": "2d7e2cea5424585e9aa4302ab66d1fc4dbaefe743ce4328fccc1efa2f19b82e4" }, "function": "_advance_facilities", "start_line": 8421, "end_line": 8426, "body": "func _advance_facilities(absolute_minute: int) -> void:\n\tif _operations_tick_blocked:\n\t\treturn\n\tfacility_service.advance_one_minute(absolute_minute)\n\tkitchen_production.advance_one_minute(absolute_minute)\n\n", "body_sha256": "f1efd0c23bdd60d1ef19a21879640b53b8b4d88844c0c881fe7cd724387ec274" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/autoload/simulation_runtime.gd", "bytes": 608704, "sha256": "2d7e2cea5424585e9aa4302ab66d1fc4dbaefe743ce4328fccc1efa2f19b82e4" }, "function": "_advance_guest_vitals", "start_line": 8427, "end_line": 8440, "body": "func _advance_guest_vitals(absolute_minute: int) -> void:\n\tif _operations_tick_blocked:\n\t\treturn\n\tvar minute_of_day := posmod(absolute_minute, 1_440)\n\tguest_service.advance_one_minute(absolute_minute, {\n\t\t&\"default\": {\n\t\t\t&\"unstimulated\": true,\n\t\t\t&\"solo_guest\": true,\n\t\t\t&\"is_night\": minute_of_day < 360 or minute_of_day >= 1_080,\n\t\t\t&\"intimacy_day\": 3,\n\t\t\t&\"intimacy_night\": 7,\n\t\t}\n\t})\n\n", "body_sha256": "8226ca18c983ac576a74e772cc3088e9fe52b362ffba1b71255bd1d7623c1234" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/autoload/simulation_runtime.gd", "bytes": 608704, "sha256": "2d7e2cea5424585e9aa4302ab66d1fc4dbaefe743ce4328fccc1efa2f19b82e4" }, "function": "_advance_staff_ai", "start_line": 8597, "end_line": 8636, "body": "func _advance_staff_ai(absolute_minute: int) -> void:\n\tif _operations_tick_blocked:\n\t\treturn\n\t_prune_expired_staff_elevator_waits(absolute_minute)\n\t_advance_elevators(absolute_minute)\n\t_advance_staff_rescue(absolute_minute)\n\tstaff_service.advance_one_minute(absolute_minute)\n\t_prune_expired_staff_elevator_waits(absolute_minute)\n\tstaff_commute.tick(absolute_minute)\n\t_sync_facility_staffing(absolute_minute)\n\tcleaning_bridge.tick(absolute_minute)\n\tfor task: StaffTask in staff_service.get_tasks():\n\t\tif task.state == StaffTask.State.RESERVED:\n\t\t\tif task.state_changed_at < absolute_minute:\n\t\t\t\ttask.begin_moving(task.state_changed_at)\n\t\telif task.state == StaffTask.State.WORKING and task.task_type == CleaningBridge.TASK_TYPE:\n\t\t\t# Only cleaning is deferred from StaffService to these attendance and\n\t\t\t# dependency checks. Other tasks already progressed once this minute.\n\t\t\tif task.state_changed_at >= absolute_minute or not cleaning_bridge.task_can_work(task, staff_service.get_staff(task.assigned_staff_id)):\n\t\t\t\tcontinue\n\t\t\tvar work_units := CleaningBridge.work_units_per_minute(staff_service.get_staff(task.assigned_staff_id))\n\t\t\tstaff_service.progress_task(task.task_id, work_units, absolute_minute)\n\tfor staff: StaffRuntime in staff_service.get_staff_members():\n\t\tif absolute_minute % 30 != 0:\n\t\t\tcontinue\n\t\tif staff.state == StaffRuntime.State.WORKING or (staff.state == StaffRuntime.State.AVAILABLE and staff_commute.is_present(staff, facility_service.get_instance(staff.assigned_facility_id))):\n\t\t\tstaff.add_fatigue(1)\n\t\t\tif _operations_enabled:\n\t\t\t\tstaff.health = maxi(staff.health - 1, 0)\n\t\telif staff.state == StaffRuntime.State.OFF_DUTY:\n\t\t\tvar resting := get_staff_rest_report(staff.staff_id)\n\t\t\tif not _operations_enabled or resting.get(&\"resting\", false):\n\t\t\t\tstaff.add_fatigue(-1)\n\t\t\t\tif _operations_enabled and staff.health > 0:\n\t\t\t\t\tstaff.health = mini(staff.health + 1, 100)\n\t_advance_staff_rescue(absolute_minute)\n\t_sync_facility_staffing(absolute_minute)\n\t_advance_guest_ai_decisions(absolute_minute)\n\n## Record the actual completed choice, not a fresh prediction made by the UI.\n", "body_sha256": "0e222987f7c5e25583dbaba8fe63784aa563715067396e8d31d10bd191e7179b" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/autoload/simulation_runtime.gd", "bytes": 608704, "sha256": "2d7e2cea5424585e9aa4302ab66d1fc4dbaefe743ce4328fccc1efa2f19b82e4" }, "function": "_advance_guest_ai_decisions", "start_line": 8677, "end_line": 8704, "body": "func _advance_guest_ai_decisions(absolute_minute: int) -> void:\n\tfor guest: GuestRuntime in guest_service.get_guests():\n\t\tmatch guest.state:\n\t\t\tGuestRuntime.State.SPAWNING:\n\t\t\t\tguest_service.transition_guest(guest.guest_id, GuestRuntime.State.ENTERING, absolute_minute, &\"ENTRY_STARTED\")\n\t\t\tGuestRuntime.State.ENTERING:\n\t\t\t\tguest_service.transition_guest(guest.guest_id, GuestRuntime.State.DECIDING, absolute_minute, &\"ENTRY_COMPLETED\")\n\t\t\tGuestRuntime.State.DECIDING:\n\t\t\t\tif guest.planned_exit_at <= absolute_minute:\n\t\t\t\t\tguest_service.begin_leaving(guest.guest_id, absolute_minute, &\"PLANNED_EXIT\")\n\t\t\t\t\tcontinue\n\t\t\t\tguest.wallet_gold = economy_service.get_balance(_guest_wallet_account(guest.guest_id))\n\t\t\t\t_decide_guest_with_log(\n\t\t\t\t\tguest.guest_id,\n\t\t\t\t\t_project_guest_candidates(guest.guest_id),\n\t\t\t\t\tabsolute_minute,\n\t\t\t\t\t{&\"absolute_minute\": absolute_minute}\n\t\t\t\t)\n\t\t\tGuestRuntime.State.MOVING:\n\t\t\t\tpass\n\t\t\tGuestRuntime.State.REPLANNING, GuestRuntime.State.ABANDONING, GuestRuntime.State.INTERRUPTED:\n\t\t\t\tguest_service.transition_guest(guest.guest_id, GuestRuntime.State.DECIDING, absolute_minute, &\"REPLAN_AFTER_INTERRUPTION\")\n\t\t\tGuestRuntime.State.LEAVING:\n\t\t\t\tif guest.state_entered_at < absolute_minute:\n\t\t\t\t\tguest_service.despawn_guest(guest.guest_id, absolute_minute)\n\t_advance_runtime_path_traffic(absolute_minute)\n\n\n", "body_sha256": "e33b41294e88dba840affd5cc0a5c58fe5d46f5d98a80a8d5f4e907a3b9a7b93" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/autoload/simulation_runtime.gd", "bytes": 608704, "sha256": "2d7e2cea5424585e9aa4302ab66d1fc4dbaefe743ce4328fccc1efa2f19b82e4" }, "function": "_release_closed_business_queues", "start_line": 12557, "end_line": 12574, "body": "func _release_closed_business_queues(absolute_minute: int) -> void:\n\tfor facility: FacilityInstance in facility_service.get_instances():\n\t\tif facility.operator_open and facility.is_within_opening_hours(absolute_minute):\n\t\t\tcontinue\n\t\tfor request: ServiceRequest in facility_service.get_queue(facility.instance_id):\n\t\t\t_release_closed_business_request(facility, request, absolute_minute)\n\tfor guest: GuestRuntime in guest_service.get_guests():\n\t\tif guest.state != GuestRuntime.State.MOVING:\n\t\t\tcontinue\n\t\tvar facility := facility_service.get_instance(guest.target_facility_id)\n\t\tif facility == null or (facility.operator_open and facility.is_within_opening_hours(absolute_minute)):\n\t\t\tcontinue\n\t\tvar transition := guest_service.transition_guest(guest.guest_id, GuestRuntime.State.REPLANNING, absolute_minute, &\"FACILITY_CLOSED\")\n\t\tif bool(transition.get(&\"ok\", false)):\n\t\t\tguest.target_facility_id = &\"\"\n\t\t\tguest.path_handle = null\n\n\n", "body_sha256": "3a05fbe94877eeb750fb0d692501954555ab6a8005448ab3b6023dab9bad816b" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/autoload/simulation_runtime.gd", "bytes": 608704, "sha256": "2d7e2cea5424585e9aa4302ab66d1fc4dbaefe743ce4328fccc1efa2f19b82e4" }, "function": "_release_closed_business_request", "start_line": 12575, "end_line": 12620, "body": "func _release_closed_business_request(facility: FacilityInstance, request: ServiceRequest, minute: int) -> void:\n\t# Validate the entire group before any queue/state signals become observable.\n\tfor guest_id: StringName in request.guest_ids:\n\t\tvar guest := guest_service.get_guest(guest_id)\n\t\tif guest == null:\n\t\t\tcontinue\n\t\tif guest.state != GuestRuntime.State.QUEUING or guest.queue_request_id != request.request_id or guest.target_facility_id != facility.instance_id:\n\t\t\treturn\n\t\tif guest.transition_tick == minute and guest.transitions_this_tick >= GuestService.MAX_TRANSITIONS_PER_TICK:\n\t\t\treturn\n\t# A group releases its one reservation and queue atomically. A transition-budget\n\t# failure retries next minute, without taking patience or dropping any stock.\n\tvar before_inventory := inventory_service.create_snapshot()\n\tvar before_facility := facility_service.create_snapshot()\n\tvar before_guest := guest_service.create_snapshot()\n\tvar before_events := domain_events.create_snapshot()\n\tvar before_ids := id_generator.create_snapshot()\n\tvar released := false\n\tvar release := func(_guest_id: StringName = &\"\", _facility_id: StringName = &\"\", _request_id: StringName = &\"\") -> Dictionary:\n\t\tfor reservation_id: StringName in request.reserved_inventory_ids:\n\t\t\tvar result := inventory_service.release_reservation(reservation_id, StringName(\"business.close.%s.%s\" % [request.request_id, reservation_id]), minute)\n\t\t\tif not bool(result.get(&\"ok\", false)):\n\t\t\t\treturn result\n\t\tvar result := facility_service.leave_queue(facility.instance_id, request.request_id, &\"FACILITY_CLOSED\")\n\t\treturn {&\"ok\": result.is_success()}\n\tvar ok := true\n\tfor guest_id: StringName in request.guest_ids:\n\t\tif not guest_service.has_guest(guest_id):\n\t\t\tcontinue\n\t\tvar result: Dictionary = guest_service.release_queue_for_replanning(guest_id, minute, release if not released else Callable())\n\t\tif not bool(result.get(&\"ok\", false)):\n\t\t\tok = false\n\t\t\tbreak\n\t\treleased = true\n\tif ok and not released:\n\t\tok = bool(release.call().get(&\"ok\", false))\n\tif not ok:\n\t\tinventory_service.restore_snapshot(before_inventory)\n\t\tfacility_service.restore_snapshot(before_facility)\n\t\tguest_service.restore_snapshot(before_guest)\n\t\tdomain_events.restore_snapshot(before_events)\n\t\tid_generator.restore_snapshot(before_ids)\n\n\n## Commute and elevator movement share the authoritative Path projection and\n## fixed-point walking credit used by errands and guests.\n", "body_sha256": "6dbde3a3d425e47a049dcc4f05eae6f01fe9784f473c0fb1019a0633c239d83b" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/autoload/simulation_runtime.gd", "bytes": 608704, "sha256": "2d7e2cea5424585e9aa4302ab66d1fc4dbaefe743ce4328fccc1efa2f19b82e4" }, "function": "_complete_service_transaction", "start_line": 11702, "end_line": 11717, "body": "func _complete_service_transaction(\n\tservice: ServiceInstance,\n\trequest: ServiceRequest,\n\tfacility: FacilityInstance,\n\tabsolute_minute: int\n) -> Variant:\n\t# A sale is only observable after its inventory, rewards and cleanliness\n\t# effects commit. Rollback removes provisional receipts before scope exit.\n\teconomy_service.begin_notification_scope()\n\tvar result: Variant = _apply_service_transaction(service, request, facility, absolute_minute)\n\tif result is bool and result:\n\t\t_state.set_resource(&\"gold\", economy_service.get_balance(PLAYER_CASH_ACCOUNT))\n\teconomy_service.end_notification_scope()\n\treturn result\n\n\n", "body_sha256": "f2b6e96a8eeef3dd3f8419b4d9d5ef4e1d13241600ce970bdd78a924428cac6c" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/scripts/facility/facility_service.gd", "bytes": 44951, "sha256": "ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77" }, "function": "advance_one_minute", "start_line": 544, "end_line": 581, "body": "func advance_one_minute(absolute_minute: int = -1) -> Array[CommandResult]:\n\tif absolute_minute < 0:\n\t\tcurrent_minute += 1\n\telif absolute_minute < current_minute:\n\t\treturn [_invalid(\"FacilityService cannot advance backwards in time.\")]\n\telse:\n\t\tcurrent_minute = absolute_minute\n\trefresh_operating_dependencies(current_minute)\n\tvar results: Array[CommandResult] = []\n\tfor instance_id: StringName in _sorted_keys(_instances):\n\t\tvar instance: FacilityInstance = _instances[instance_id]\n\t\tinstance.apply_pending_policy(current_minute)\n\t\tvar old_state := instance.state\n\t\tinstance.evaluate_state(current_minute)\n\t\t_emit_state_change(instance, old_state)\n\t\tvar active_ids := _sorted_keys(instance.active_services)\n\t\tfor service_id: StringName in active_ids:\n\t\t\tif not instance.active_services.has(service_id):\n\t\t\t\tcontinue\n\t\t\tvar service: ServiceInstance = instance.active_services[service_id]\n\t\t\tvar preparation := _prepare_service_for_tick(instance, service)\n\t\t\tif preparation != null:\n\t\t\t\tresults.append(preparation)\n\t\t\tif not instance.active_services.has(service_id):\n\t\t\t\tcontinue\n\t\t\tif service.state != ServiceInstanceType.State.ACTIVE:\n\t\t\t\tcontinue\n\t\t\tvar ready_to_complete := service.elapsed_minutes >= service.duration_minutes\n\t\t\tif not ready_to_complete:\n\t\t\t\tready_to_complete = service.advance_one_minute()\n\t\t\tif ready_to_complete:\n\t\t\t\tresults.append(_complete_service(instance, service))\n\t\tvar starts := fill_available_slots(instance_id, current_minute)\n\t\tresults.append_array(starts)\n\tlast_error = \"\"\n\treturn results\n\n\n", "body_sha256": "59c0e89b4dca291e3ec02601b3f7c5544dba7c823fc137e0e7a50e7d5319e0ed" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/scripts/facility/facility_service.gd", "bytes": 44951, "sha256": "ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77" }, "function": "_prepare_service_for_tick", "start_line": 853, "end_line": 894, "body": "func _prepare_service_for_tick(\n\tinstance: FacilityInstance,\n\tservice: ServiceInstance\n) -> CommandResult:\n\tif instance.state == FacilityInstanceType.State.BROKEN:\n\t\t_fail_service(instance, service, INTERRUPTION_BROKEN, current_minute)\n\t\treturn _success({&\"service_id\": service.service_id, &\"failed\": true})\n\tif not instance.related_facility_operating:\n\t\tif service.state == ServiceInstanceType.State.ACTIVE:\n\t\t\tservice.pause(&\"RELATED_FACILITY_INACTIVE\", current_minute)\n\t\t\tservice_interrupted.emit(service, &\"RELATED_FACILITY_INACTIVE\")\n\t\treturn null\n\tif service.state == ServiceInstanceType.State.PAUSED and service.interruption_reason == &\"RELATED_FACILITY_INACTIVE\":\n\t\tservice.resume()\n\tif not instance.power_available:\n\t\tif service.state == ServiceInstanceType.State.ACTIVE:\n\t\t\tservice.pause(INTERRUPTION_NO_POWER, current_minute)\n\t\t\tservice_interrupted.emit(service, INTERRUPTION_NO_POWER)\n\t\treturn null\n\tif service.state == ServiceInstanceType.State.PAUSED \\\n\t\tand service.interruption_reason == INTERRUPTION_NO_POWER:\n\t\tservice.resume()\n\tvar has_required_staff := instance.active_staff_ids.size() >= instance.staff_min\n\tif not has_required_staff:\n\t\tif service.state in [ServiceInstanceType.State.ACTIVE, ServiceInstanceType.State.PAUSED]:\n\t\t\tservice.wait_for_staff(\n\t\t\t\tINTERRUPTION_STAFF_UNAVAILABLE,\n\t\t\t\tcurrent_minute,\n\t\t\t\tSTAFF_REPLACEMENT_GRACE_MINUTES\n\t\t\t)\n\t\t\tservice_interrupted.emit(service, INTERRUPTION_STAFF_UNAVAILABLE)\n\telif instance.staff_min > 0 \\\n\t\tand service.state == ServiceInstanceType.State.WAITING_FOR_STAFF \\\n\t\tand service.interruption_reason == INTERRUPTION_STAFF_UNAVAILABLE:\n\t\tservice.resume()\n\tif service.state == ServiceInstanceType.State.WAITING_FOR_STAFF:\n\t\tif service.staff_grace_deadline >= 0 and current_minute >= service.staff_grace_deadline:\n\t\t\t_fail_service(instance, service, INTERRUPTION_STAFF_UNAVAILABLE, current_minute)\n\t\t\treturn _success({&\"service_id\": service.service_id, &\"failed\": true})\n\treturn null\n\n\n", "body_sha256": "b35c2c0fb23a04258b71995dd7c3b6dfacbbcdf36106e2e3348acef0e18d21cc" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/scripts/facility/facility_service.gd", "bytes": 44951, "sha256": "ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77" }, "function": "_complete_service", "start_line": 895, "end_line": 932, "body": "func _complete_service(\n\tinstance: FacilityInstance,\n\tservice: ServiceInstance,\n\tcallback: Callable = Callable()\n) -> CommandResult:\n\tvar request := get_request(service.request_id)\n\tif request == null:\n\t\t_fail_service(instance, service, &\"MISSING_REQUEST\", current_minute)\n\t\treturn _invalid(\n\t\t\t\"Active service lost its request and was failed safely.\",\n\t\t\t{&\"service_id\": service.service_id}\n\t\t)\n\tvar effective_callback := callback if callback.is_valid() else _completion_callback\n\tvar callback_failure := _run_boundary_callback(\n\t\teffective_callback,\n\t\t[service, request, instance, current_minute],\n\t\t\"Service completion transaction failed.\",\n\t\tCommandResultType.Code.TRANSACTION_APPLY_FAILED\n\t)\n\tif callback_failure != null:\n\t\tcallback_failure.details[&\"service_id\"] = service.service_id\n\t\tcallback_failure.details[&\"request_id\"] = request.request_id\n\t\treturn callback_failure\n\tservice.mark_completed(current_minute)\n\tinstance.active_services.erase(service.service_id)\n\t_requests.erase(request.request_id)\n\t_service_history[service.service_id] = service\n\t_increment_stat(instance.statistics_today, &\"services_completed\")\n\t_increment_stat(instance.lifetime_statistics, &\"services_completed\")\n\tservice_completed.emit(service)\n\treturn _success({\n\t\t&\"instance_id\": instance.instance_id,\n\t\t&\"request_id\": request.request_id,\n\t\t&\"service_id\": service.service_id,\n\t\t&\"completed\": true,\n\t})\n\n\n", "body_sha256": "494edfd11cb3e896d73c2c6fdbe7c1193efce6d869b105e526d2f1dfd1168142" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/scripts/facility/facility_service.gd", "bytes": 44951, "sha256": "ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77" }, "function": "_fail_service", "start_line": 933, "end_line": 947, "body": "func _fail_service(\n\tinstance: FacilityInstance,\n\tservice: ServiceInstance,\n\treason: StringName,\n\tabsolute_minute: int\n) -> void:\n\tservice.mark_failed(reason, absolute_minute)\n\tinstance.active_services.erase(service.service_id)\n\t_requests.erase(service.request_id)\n\t_service_history[service.service_id] = service\n\t_increment_stat(instance.statistics_today, &\"services_failed\")\n\t_increment_stat(instance.lifetime_statistics, &\"services_failed\")\n\tservice_failed.emit(service, reason)\n\n\n", "body_sha256": "56f61b255217bddb4c8a6ad3af6ed1f9edc3b6a6e928dacf2105be6698936de5" }, { "source": { "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/scripts/operations/operations_coordinator.gd", "bytes": 130891, "sha256": "871a248ee101b6df543fd5cf0440b5d4b0f02c21fa145a99f0687888c1bc6f90" }, "function": "_process_minute_boundaries", "start_line": 882, "end_line": 926, "body": "func _process_minute_boundaries(minute: int, counts: Dictionary) -> CommandResult:\n\t# Migrated 06:00 financial periods retain their original payroll/history.\n\t# Calendar-midnight obligations still execute atomically at 00:00. Their\n\t# external receipt owns idempotency when a later boundary in this minute fails.\n\tif minute % MINUTES_PER_DAY == 0 and not _is_daily_close_boundary(minute) and _midnight_boundary.is_valid():\n\t\tvar midnight := _run_boundary_transaction(_midnight_boundary, {&\"boundary_minute\": minute}, {&\"ok\": true})\n\t\tif not bool(midnight[&\"ok\"]):\n\t\t\treturn _transaction_boundary_failure(midnight, &\"MIDNIGHT_UPKEEP\", minute, &\"MIDNIGHT_UPKEEP_FAILED\")\n\t# Finance precedes demand/arrivals at midnight. Morning work stays at 06:00.\n\t# During legacy migration, the final 06:00 close also precedes morning work.\n\tif _is_daily_close_boundary(minute):\n\t\tvar close := _process_daily_close(minute)\n\t\tif not close.is_success():\n\t\t\treturn close\n\t\tcounts[&\"daily_closes\"] = int(counts[&\"daily_closes\"]) + int(not close.is_replay)\n\t\tif _terminal_state != TERMINAL_RUNNING:\n\t\t\treturn _success({&\"terminal\": true})\n\t\tif pause_requested:\n\t\t\t# A ledger imbalance pauses before morning, demand and arrival work.\n\t\t\treturn _success({&\"deferred\": true, &\"after\": &\"DAILY_CLOSE\"})\n\n\tif minute % MINUTES_PER_DAY == MORNING_MINUTE_OF_DAY:\n\t\tvar morning := _process_morning_boundary(minute)\n\t\tif not morning.is_success():\n\t\t\treturn morning\n\t\tcounts[&\"morning_boundaries\"] = int(counts[&\"morning_boundaries\"]) + int(not morning.is_replay)\n\t\tif pause_requested:\n\t\t\treturn _success({&\"deferred\": true, &\"after\": &\"MORNING_BOUNDARY\"})\n\n\tif minute % DEMAND_INTERVAL_MINUTES == 0:\n\t\tvar demand := _process_demand_boundary(minute)\n\t\tif not demand.is_success():\n\t\t\treturn demand\n\t\tcounts[&\"demand_updates\"] = int(counts[&\"demand_updates\"]) + int(not demand.is_replay)\n\t\tif pause_requested:\n\t\t\treturn _success({&\"deferred\": true, &\"after\": &\"DEMAND_UPDATE\"})\n\n\tif minute % ARRIVAL_INTERVAL_MINUTES == 0:\n\t\tvar arrivals := _process_arrival_boundary(minute)\n\t\tif not arrivals.is_success():\n\t\t\treturn arrivals\n\t\tcounts[&\"arrival_boundaries\"] = int(counts[&\"arrival_boundaries\"]) + int(not arrivals.is_replay)\n\treturn _success()\n\n\n", "body_sha256": "1312166dc17aee0ef470069a73ff3fe6b86d11d04ca7de76f3d04f1d2d14674e" } ], "domains": [ "閉店", "停電", "破壊", "退出", "課金", "シフト交代", "00:00決算" ], "acceptance_effects": [ "停止中課金がない", "二重決算がない", "予約の孤立がない" ], "dependencies": [ "P03 existing save and ownership implementation", "P04-02 adopted transaction/retry contract" ], "Windows_required": false, "native_runs": 0, "source_edits": 0, "formal_completion": false, "remaining": [ "原7種の順序規約の文書化・原本適合性確認", "最終版の各順序境界証拠を照合し不足だけ補完", "同じ1名の独立受入と台帳反映" ], "open_questions": [ "シフト終端の施設完了段階がAIのStaff更新より先のため、終端ちょうどの課金が停止中課金に該当しないか確認する。既存long-service試験だけで未証明の可能性。", "閉店時に既に受付済みserviceを完了させる既存挙動の原本/承認適用を確認する。新規中断規則は追加しない。", "防衛phaseで破壊が施設完了phaseより後となる同Tickの既存帰結と、その次Tickの停止・予約処理が実証されているか。", "退出の決定・除去と課金の同時境界の既存実証を確認する。", "derived SYSTEM_SPECIFICATIONの古い06:00決算記述を原本00:00へ格上げしない。" ] }