diff --git a/docs/plans/original-completion-2026-10-02/execution/mana-proposal/PROPOSAL.md b/docs/plans/original-completion-2026-10-02/execution/mana-proposal/PROPOSAL.md new file mode 100644 index 0000000..d6adec1 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/mana-proposal/PROPOSAL.md @@ -0,0 +1,81 @@ +# 未承認・製品未反映:MP-01 マナ契約候補 + +承認用の候補案です。P06-01の受入や原88成果の完了を意味せず、分母にも加えません。製品・人物・資源・仕様原本・台帳は変更していません。正式試験と別セッションレビューはRunnerが実施します。 + +## 根拠と区別 + +原本 `docs/traceability/original/BASELINE.txt` 9.1は枯渇時の全館停止、10.6はマナ炉6×3・裏地下・奴隷消費を規定します。6.1/6.5の代替不可能・解雇売却不可・原則ロストしない人物は投入から除外します。数値、容量、生成周期、炉の収率は原本にありません。 + +現実装 `autoload/game_state.gd` の初期mana=100は残量です。`autoload/simulation_runtime.gd` のSTARTER_MANA_OUTPUT=100はネットワーク供給能力であり、100 Mana/10分という承認済み生成率ではありません。`maintenance_mana` は完成施設のconsumer需要に登録され、`mana_network_service.gd` の10ゲーム分周期で配電されます。これは現時点で残量から差し引く維持エネルギーではありません。ネットワークの優先配電・75%の縮退・10分の停止保持と、全館のreserve>0ゲートは別です。Runtimeの定期マナ更新はネットワーク評価と電力投影であり、有限残量helperの定期生成消費接続ではありません。 + +`tests/s2/test_mana_reserve_balance.gd` の残量7・容量10・時刻360、時刻370の生成5・需要8→残量4は試験入力です。承認済み製品値ではなく、今回その試験を実行していません。現sourceの生バイトSHA256はJSONのsource_pins辞書(リポジトリ相対path→SHA256)、区分は別のsource_provenanceに記録しました。候補の来歴はcandidate、原本・実装・fixtureと区別しています。 + +## 承認する候補範囲 + +| 案 | 初期Mana | 容量Mana | 世界樹生成Mana/10ゲーム分 | +|---|---:|---:|---:| +| 推薦 | 100 | 300 | 20 | +| 慎重 | 100 | 200 | 10 | +| 余裕 | 200 | 600 | 40 | + +全て未承認です。推薦は現初期残量100を維持する候補であり、100を原本値と主張しません。容量300は初期の3倍の有限バッファ、生成20は下記の通常需要16を4だけ上回り、全定義一基ずつの需要63には足りない設計上の選択です。周期10は現配電評価境界への整合を理由に提案します。全ゲームのバランス保証ではありません。 + +換算案は各完成・保有施設のmaintenance_manaを1周期のMana消費量とし、D=Σ(基数×定義値)とします。閉店・停止中も維持需要を計上し、枯渇による需要免除と無償復帰の振動を避けます。撤去・破壊済みは除外します。金維持費の承認A01と同一契約ではなく、別途承認するマナ案です。Manaは整数、時刻はゲーム内分、初回は初期時刻360から370までの一周期です。現実時間10秒=ゲーム内1時間との関係を生成量へ重複換算しません。 + +B=直前残量、C=容量、G=その周期の世界樹生成、F=確定した炉生成、D=需要。 + +- available=B+G+F +- consumed=min(available,D) +- shortage=D-consumed +- overflow=max(0,available-consumed-C) +- after=min(C,available-consumed) + +需要を賄ってから余剰を蓄積し、超過は明記して破棄します。after=0では需要ゼロ施設も含め全館停止。供給そのものは停止館外の世界樹から復帰可能とし、次の境界でafter>0かつ局所配電条件成立の場合だけ再開します。ネットワークstorageと残量を二重計上しません。ネットワーク供給100をGとして足すこともしません。供給能力・局所切断と残量の二つのゲートを保ちます。 + +## 需要と計算比較 + +JSONはdata/facilities配下の全37定義を列挙します。chapel、cleaning_room、general_store、infirmaryの4施設はmaintenance_mana省略のため、scripts/data/facility_definition.gdのFacilityDefinitionの現default=0を根拠に0と明示し、未定義施設のunknownとは区別します。各行のpath・definition_id・observed_maintenance_manaを入力に、全定義一基ずつの合計は63です。定義の存在を通常登録・稼働とみなしません。 + +歴史監査CURRENT_FACILITY_AUDIT.mdにある対応定義なし13施設(VIPスイート、ドミトリー、レストラン、屋台、カジノ、闘技場、高級ソープ、SM拷問室、覗き部屋、地下牢、マナ炉、ワープ、魔法砲台)は需要unknownです。魔力制御室3×2は原本マナ炉6×3の代替ではありません。現在の定義一覧と歴史監査の登録数も混同しません。 + +比較は候補式の計算のみです。F=0、初期時刻360、10分刻み。低負荷D=2(食堂一基)、通常D=16(食堂・厨房・大浴場・客EV・受付・警備員詰所各一基)、需要超過D=63(全37定義各一基)を120分計算します。zero・capacityは10分、供給喪失復帰は30分。全入力、各周期結果、shortage/overflowはJSONに保存しています。 + +| 条件 | 推薦の結果 | 慎重の結果 | 余裕の結果 | +|---|---:|---:|---:| +| 低負荷120分 | 300 Mana | 196 Mana | 600 Mana | +| 通常120分 | 148 Mana | 28 Mana | 488 Mana | +| 需要超過120分 | 0 Mana | 0 Mana | 0 Mana | +| 初期0・通常需要10分 | 4 Mana | 0 Mana | 24 Mana | +| 初期満容量・低負荷10分 | 300 Mana | 200 Mana | 600 Mana | +| 生成0→0→通常・需要16、30分 | 72 Mana | 62 Mana | 192 Mana | +| 通常10分後、同分再送 | 104 Mana | 94 Mana | 224 Mana | + +推薦の需要超過は100→57→14→0、3周期目にshortage29、その後は毎周期shortage43。通常は100+12×(20−16)=148。供給喪失復帰は100→84→68→72。初期0は生成20−需要16=4で次境界復帰、慎重案は生成10でshortage6、停止を維持します。満容量では需要を支払った余剰のみoverflow。余裕案のB=200、G=40、D=63では8周期後が200−8×23=16、9周期目は16+40=56に対し需要63でshortage7、初めて0になります(時刻450)。12周期後も0です。 + +同分再送は全案とも保存済み結果の返却だけで残量不変。同じ分で異なる入力は拒否します。局所供給線だけ喪失する場合もpower_available=falseを投影し、残量が正でも停止します。復帰は局所配電の停止保持条件を満たした評価境界で行い、残量が0なら再開しません。これらは設計比較で、実機受入結果ではありません。 + +## 炉の候補 + +原本寸法・裏地下を維持。所有する一般奴隷1名→100 Mana、一炉につき次の10分境界で一回の明示投入を提案します。ユニーク・代替不可能・売却不可・保護対象・ヒロイン・ライバル、客、一般従業員、分類不明な拘束者は除外。適格性が不明なら拒否します。自動投入は行わない案です。 + +人物の適格性は未決定で、上記の対象分類も承認待ちです。推薦候補は自然生成と維持需要支払後のbase_after=min(C,max(0,B+G−D))を求め、所有・適格性・炉稼働・空き容量C−base_afterが100以上か再検証します。人物除去、Mana加算、投入IDと境界・対象ID・適格性根拠・前後残量の履歴を一つの保存可能な原子操作として確定する案です。拒否時は人物・マナ等を何も消費しません。容量不足では投入せず、人物を消費してoverflowを捨てる案にしません。確定前中断は無変更で取消、確定後中断は保存receiptから復帰して再消費しません。枯渇中の炉は稼働しないため世界樹で先に復帰します。これは将来実装契約の候補で、今回は実際の人物消費も資源変更もありません。 + +C=300、G=20、D=16、F=100を仮に式へ投入すると、B=200では200+20+100−16=304→overflow4、B=196では300→overflow0、B=300では404→overflow104です。これは算術比較で、容量不足の実取引を許可する意味ではありません。推薦の需要支払後判定ではB=200のbase_after204・空き96は拒否(F=0、残量204)、B=196のbase_after200・空き100は受理(残量300)、B=300は拒否(残量300)です。 + +別案は生成後・需要支払前のmin(C,B+G)で空きを判定し、上記3例の空きは80・84・0で全て拒否します。需要支払後の推薦候補とこの別案の選択は未承認です。どちらも人物・マナ・receiptを原子的に変更し、同じ取引の再送で二度適用しない案です。 + +## 更新順序と保存 + +D05はdecisions.jsonのpendingです。現順序はAPPLY_COMMANDS→TIME_BOUNDARIES→MANA→CONSTRUCTION→LOGISTICS→FACILITY_COMPLETION→VITALS_AND_ENVIRONMENT→INCIDENTS_AND_EVENTS→FACILITY_QUEUES→AI_DECISIONS→PUBLISH_SNAPSHOT。推薦はこのphase列を保持し、MANA内で入力snapshot→自然生成→維持需要支払→空き容量判定→炉取引のstage→最終残量計算→局所配電→全館ゲート→receipt確定とします。 + +00:00の既承認Gold維持費は閉店・停電でも所有時間に応じて精算し、マナ停止を理由に取り消しません。06:00/18:00の勤務境界は保持。マナ評価後の物流・サービス完了・queueは確定電力を参照する案です。未完了サービスを完了として課金せず、EV/搬送は位置・荷物・ID・ルートを保持して停止、復帰で重複搬送しない案。日跨ぎ完了・費用時点・移動中の具体処理はD05承認前に製品へ接続しません。 + +旧GameStateは非負値を復元でき0を許し、get_resourceで欠落も0として参照されます。0は現在の投影では停止であり、無制限・満量の証拠ではありません。ネットワークsnapshot版1、save format1/2は新しい残量容量・生成率契約の承認を意味しません。 + +移行案は適用元版と新domain版を明示し、preview・検証済みbackup後に原子的適用。明示旧0は0・停止を維持。正値は承認容量内のみ保持。欠落、曖昧、負値、非整数、容量超過は拒否して元保存・live状態を保持し、黙って切り詰めません。新保存は残量・容量・最後の境界/flow・炉receipt・配電投影を保持。同境界同入力は再消費・イベント再発行なし、異入力/逆行は拒否。時間飛びは各10分境界を順に処理し、offline生成は別承認なしには行いません。 + +## 不足・承認待ちと検証 + +D04の値と換算、D05の境界処理、炉の対象判定・収率・履歴、新保存domain版と移行元適用条件を承認範囲として分けます。未定義13施設の需要、実際の配置基数、全ゲームの性能・経済バランスは未確定です。原P06-01は未達を維持します。 + +静的に参照sourceと計算を確認した成果です。正式proposal-consistency試験・別Claudeレビュー・承認・統合・完了確定はRunnerに委ね、合格を自己宣言しません。 diff --git a/docs/plans/original-completion-2026-10-02/execution/mana-proposal/proposal.json b/docs/plans/original-completion-2026-10-02/execution/mana-proposal/proposal.json new file mode 100644 index 0000000..449caca --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/mana-proposal/proposal.json @@ -0,0 +1,2355 @@ +{ + "id": "MP-01", + "linked_original_delivery": "P06-01", + "status": "proposed_unapproved", + "applied_to_product": false, + "counting_scope": "approval artifact only; excluded from original 88; not acceptance of P06-01", + "base_commit": "0bdc4886cf631879792e0c0a873ecf97b98a64ea", + "recommended": { + "initial_amount": 100, + "storage_capacity": 300, + "world_tree_generation_per_interval": 20, + "interval_minutes": 10, + "provenance": "candidate_unapproved", + "unit": "integer Mana per 10 game minutes; stock in Mana", + "demand_conversion": "D=sum(instance_count * observed_maintenance_mana); candidate conversion of allocation demand to interval energy, not existing consumption", + "demand_policy": "completed retained facilities including closed/unpowered facilities; no depletion waiver; destroyed/demolished excluded", + "furnace": { + "input_quantity": 1, + "input_unit": "eligible generic slave actor", + "output_quantity": 100, + "output_unit": "Mana", + "eligibility": "owned generic nonunique slave only; exclude heroes, rivals, unique/irreplaceable/protected/not-sellable actors, visitors, employees, detained unclassified actors; uncertain classification rejects", + "footprint": "6x3 BACK underground", + "timing": "one explicitly confirmed queued transaction per furnace at next 10-minute boundary; no automatic input", + "atomicity": "After natural generation and standing demand, compute base_after=min(C,max(0,B+G-D)); revalidate eligibility, ownership, furnace readiness and C-base_after>=100. Person removal, Mana credit and immutable receipt commit atomically or none; any rejection consumes nothing; replay never applies twice.", + "history": "persist transaction id, actor id and eligibility evidence, furnace id, boundary, before/after Mana, input/output and committed status in same save", + "interruption": "before commit cancel without removal; after commit restore receipt and never repeat; conflicting retry rejected; depleted furnace cannot initiate until natural generation restores power", + "actual_actor_consumption": false, + "eligibility_approval": "pending; eligibility predicate is a candidate, not an approved person classification", + "headroom_policy": "candidate: check after natural generation and demand; choice against before-demand alternative remains unapproved" + } + }, + "alternatives": [ + { + "id": "conservative", + "initial_amount": 100, + "storage_capacity": 200, + "world_tree_generation_per_interval": 10, + "interval_minutes": 10 + }, + { + "id": "generous", + "initial_amount": 200, + "storage_capacity": 600, + "world_tree_generation_per_interval": 40, + "interval_minutes": 10 + } + ], + "demand_catalog": [ + { + "definition_id": "adult_private_room", + "path": "data/facilities/adult_private_room.tres", + "observed_maintenance_mana": 3, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "cafeteria", + "path": "data/facilities/cafeteria.tres", + "observed_maintenance_mana": 2, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "black_market", + "path": "data/facilities/expansion/black_market.tres", + "observed_maintenance_mana": 2, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "chapel", + "path": "data/facilities/expansion/chapel.tres", + "observed_maintenance_mana": 0, + "observation": "omitted; FacilityDefinition default 0", + "provenance": "current_implementation", + "default_basis": "scripts/data/facility_definition.gd: FacilityDefinition maintenance_mana default = 0" + }, + { + "definition_id": "cleaning_room", + "path": "data/facilities/expansion/cleaning_room.tres", + "observed_maintenance_mana": 0, + "observation": "omitted; FacilityDefinition default 0", + "provenance": "current_implementation", + "default_basis": "scripts/data/facility_definition.gd: FacilityDefinition maintenance_mana default = 0" + }, + { + "definition_id": "clinic", + "path": "data/facilities/expansion/clinic.tres", + "observed_maintenance_mana": 3, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "cold_storage", + "path": "data/facilities/expansion/cold_storage.tres", + "observed_maintenance_mana": 4, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "general_store", + "path": "data/facilities/expansion/general_store.tres", + "observed_maintenance_mana": 0, + "observation": "omitted; FacilityDefinition default 0", + "provenance": "current_implementation", + "default_basis": "scripts/data/facility_definition.gd: FacilityDefinition maintenance_mana default = 0" + }, + { + "definition_id": "guild_counter", + "path": "data/facilities/expansion/guild_counter.tres", + "observed_maintenance_mana": 1, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "laundry", + "path": "data/facilities/expansion/laundry.tres", + "observed_maintenance_mana": 3, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "maintenance_workshop", + "path": "data/facilities/expansion/maintenance_workshop.tres", + "observed_maintenance_mana": 2, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "mana_control_room", + "path": "data/facilities/expansion/mana_control_room.tres", + "observed_maintenance_mana": 1, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "premium_room", + "path": "data/facilities/expansion/premium_room.tres", + "observed_maintenance_mana": 1, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "private_bath", + "path": "data/facilities/expansion/private_bath.tres", + "observed_maintenance_mana": 4, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "secret_tavern", + "path": "data/facilities/expansion/secret_tavern.tres", + "observed_maintenance_mana": 3, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "staff_dormitory", + "path": "data/facilities/expansion/staff_dormitory.tres", + "observed_maintenance_mana": 1, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "tea_lounge", + "path": "data/facilities/expansion/tea_lounge.tres", + "observed_maintenance_mana": 1, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "underground_guest_room", + "path": "data/facilities/expansion/underground_guest_room.tres", + "observed_maintenance_mana": 1, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "vip_private_salon", + "path": "data/facilities/expansion/vip_private_salon.tres", + "observed_maintenance_mana": 5, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "waste_processing", + "path": "data/facilities/expansion/waste_processing.tres", + "observed_maintenance_mana": 2, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "guest_corridor", + "path": "data/facilities/guest_corridor.tres", + "observed_maintenance_mana": 0, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "guest_elevator", + "path": "data/facilities/guest_elevator.tres", + "observed_maintenance_mana": 5, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "guest_stairs", + "path": "data/facilities/infrastructure/guest_stairs.tres", + "observed_maintenance_mana": 0, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "service_stairs", + "path": "data/facilities/infrastructure/service_stairs.tres", + "observed_maintenance_mana": 0, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "kitchen", + "path": "data/facilities/kitchen.tres", + "observed_maintenance_mana": 2, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "massage_room", + "path": "data/facilities/massage_room.tres", + "observed_maintenance_mana": 2, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "public_bath", + "path": "data/facilities/public_bath.tres", + "observed_maintenance_mana": 4, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "reception", + "path": "data/facilities/reception.tres", + "observed_maintenance_mana": 1, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "infirmary", + "path": "data/facilities/rescue/infirmary.tres", + "observed_maintenance_mana": 0, + "observation": "omitted; FacilityDefinition default 0", + "provenance": "current_implementation", + "default_basis": "scripts/data/facility_definition.gd: FacilityDefinition maintenance_mana default = 0" + }, + { + "definition_id": "security_station", + "path": "data/facilities/security_station.tres", + "observed_maintenance_mana": 2, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "service_corridor", + "path": "data/facilities/service_corridor.tres", + "observed_maintenance_mana": 0, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "service_elevator", + "path": "data/facilities/service_elevator.tres", + "observed_maintenance_mana": 6, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "staff_door", + "path": "data/facilities/staff_door.tres", + "observed_maintenance_mana": 0, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "staff_waiting_room", + "path": "data/facilities/staff_waiting_room.tres", + "observed_maintenance_mana": 0, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "standard_room", + "path": "data/facilities/standard_room.tres", + "observed_maintenance_mana": 0, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "tavern", + "path": "data/facilities/tavern.tres", + "observed_maintenance_mana": 2, + "observation": "explicit", + "provenance": "current_implementation" + }, + { + "definition_id": "warehouse", + "path": "data/facilities/warehouse.tres", + "observed_maintenance_mana": 0, + "observation": "explicit", + "provenance": "current_implementation" + } + ], + "demand_catalog_scope": { + "resource_count": 37, + "one_each_sum": 63, + "registration_and_operation_not_assumed": true, + "unknown_original_facilities": [ + "VIPスイート", + "ドミトリー", + "レストラン", + "屋台", + "カジノ", + "闘技場", + "高級ソープ", + "SM拷問室", + "覗き部屋", + "地下牢", + "マナ炉", + "ワープ", + "魔法砲台" + ], + "unknown_demand": "unknown, never zero; not a full-game prediction; mana_control_room is not the original furnace" + }, + "ordering": { + "approval": "D05 pending", + "observed": "APPLY_COMMANDS -> TIME_BOUNDARIES -> MANA -> CONSTRUCTION -> LOGISTICS -> FACILITY_COMPLETION -> VITALS_AND_ENVIRONMENT -> INCIDENTS_AND_EVENTS -> FACILITY_QUEUES -> AI_DECISIONS -> PUBLISH_SNAPSHOT", + "recommended": "retain existing phases; at MANA boundary snapshot inputs, stage natural generation, pay standing demand, check furnace headroom on base_after, stage eligible furnace transaction, calculate final reserve once, allocate network once, project global zero gate, commit person/Mana/receipt atomically before dependent phases; D05 and headroom-policy choice remain unapproved", + "boundaries": "00:00 existing ownership-based Gold upkeep and settlement timing retained; 06:00/18:00 shift boundary retained. Power change affects subsequent logistics/service completion/queues; no charges or actor departure for uncompleted service. EV/cargo pause in place, retain ids/load/route; resume after restored power without duplicate delivery. Cross-boundary in-flight disposition requires D05 approval.", + "zero": "after==0 stops all facilities including zero-demand ones; world tree natural recovery is external to stopped facilities; next boundary generation pays standing demand first; resume only after>0 and local supply valid", + "replay": "persist minute, input snapshot/hash, full flow, network projection and furnace receipts; identical replay no second mutation/events; conflicting or backwards replay reject; catch up every 10-minute boundary, never one aggregate period" + }, + "legacy_zero": { + "observed": "GameState restore accepts nonnegative resource values including 0; Runtime projects reserve>0 gate; missing mana get_resource returns 0. No approved stock capacity or energy rate migration implied by network snapshot version 1 or save format versions 1/2.", + "recommended": "explicit versioned domain migration preview and verified backup; explicit old mana=0 stays 0 and stopped, never full or unlimited; positive stock preserved only if <= approved capacity; missing/ambiguous/noninteger/negative/overcapacity reject without changing original or live state", + "new_save": "approved new stock schema must persist capacity, amount, last boundary/flow and receipts; numeric domain version and source-version applicability need separate approval", + "recovery": "0 with restored world supply resumes only when boundary after>0; no offline generation unless separately approved" + }, + "open_decisions": [ + "D04: approve candidate initial/capacity/rate/period and maintenance conversion; no original numeric mandate", + "D05: boundary completion/cost, EV/cargo pause/resume and cross-midnight order remain unapproved", + "Approve furnace eligibility predicate, one actor ->100 Mana, timing/headroom rejection, atomic save receipts; actor classifications must be explicit before implementation", + "Approve legacy domain schema/version/applicability and missing/overcapacity rejection", + "Unknown 13 original facilities demand and runtime instance counts; no whole-game forecast", + "Separate network output/flow capacities from energy accounting; do not count reserve/network storage twice", + "Choose after-generation-and-demand headroom candidate versus before-demand headroom alternative; neither is approved" + ], + "source_pins": { + "autoload/game_state.gd": "cf0e884910220e54c56b5875983e53de439af9d893be1e1b65c2121d2a30722f", + "autoload/simulation_runtime.gd": "d52a995ae715542bbc550f68d35889540658275d12e04ae0b21ac276f5843f39", + "data/facilities/adult_private_room.tres": "d8501586416b5c57a8b3b3b2afd1c0143428d8a4fa1df7112e995bd36649df6d", + "data/facilities/cafeteria.tres": "86d540fe2d78b9dcdbe5a0af6e4a001f4cec54934636ed01deb25a943c79128a", + "data/facilities/expansion/black_market.tres": "c209d734c82487f6df4c03714618865d6a5f1d2cf991dc0056fe4bbad8f03a42", + "data/facilities/expansion/chapel.tres": "9b30a7c51712e7bb99c17870d1f03e3429ea9279851d88284545bb2eb5042fcb", + "data/facilities/expansion/cleaning_room.tres": "ae366cf67cbf117db7989c6b76092eb5a65229b93d35999a40d19b8260f95ad8", + "data/facilities/expansion/clinic.tres": "339cf22c68d7ab3cb1514b9e8d2ea63dc0772fe93918d70767c11cf7b6ee0e16", + "data/facilities/expansion/cold_storage.tres": "1aac824147b52b41e124d2ab2ce63c3bac58de2ec7fc447a5806a1cf9fa9ad99", + "data/facilities/expansion/general_store.tres": "76872e0375648b43f05fdc5581ccabe4aa6a166674c3b523980dd1cf0b6e6dc1", + "data/facilities/expansion/guild_counter.tres": "93e8736da4aab8a17b1c8e7831c9a7b8de7f32d0ec251aa9aa5c8cf859c8fd7b", + "data/facilities/expansion/laundry.tres": "2518ea2e5da12cf4f2997502bf50f00dd8145caca153fb3486b44b99881fdab4", + "data/facilities/expansion/maintenance_workshop.tres": "8bd10332a9f45a252febdc626f22f90507317fb4cff5b18b2526aacd1f1a176b", + "data/facilities/expansion/mana_control_room.tres": "55e4c52a049ff61ddf3d081ccb990a8572b64bc7cf37d3a0d52ca5a08cc32f25", + "data/facilities/expansion/premium_room.tres": "6665090e041f36df5809314cd171be228a94bf77d7e93f5b70be648db4705d98", + "data/facilities/expansion/private_bath.tres": "241b807e7fa3a1b9dc4bda0d2495e637155cdaea89a4234e37a121f00098499c", + "data/facilities/expansion/secret_tavern.tres": "f0a1372931078fa0f93dd5b9cec6df6b137975479aa706633fdf6a9be4cf1f62", + "data/facilities/expansion/staff_dormitory.tres": "8d7c7cd6dfe98d137f7fef62e35eb31f82f1ca282216a40df54ac81728101271", + "data/facilities/expansion/tea_lounge.tres": "77d1ace36c5e84f80c0e6d563ae973c7ff1cd12b56956afd4895cdcdd5771a67", + "data/facilities/expansion/underground_guest_room.tres": "cdfd0f8cd21812a9972485926dff27daaa6718af16aac1651894728b087bef9e", + "data/facilities/expansion/vip_private_salon.tres": "1c94a7a70393262fba82112c3f4a0cb67ad22728664f5ca408f450049d3657a7", + "data/facilities/expansion/waste_processing.tres": "9954855c7a07e425376a220c589989beb6ec95da3c5331316ef3615a60b45f1d", + "data/facilities/guest_corridor.tres": "d77ccf267e20a26ed70527d29e8d54e6fcab1df213f02d5a4e28ead4f705276b", + "data/facilities/guest_elevator.tres": "ad4fb3c439ac4ed90fe52f07e29ed7b4ff654c54d1c400c7c8e226da77127af7", + "data/facilities/infrastructure/guest_stairs.tres": "757c687b1ebe2a3f237fb28092cd5f01591f15b2bcd1b4e639042a24635a92c6", + "data/facilities/infrastructure/service_stairs.tres": "637217d867bcc99669d27c54b6d2c391c82a4a17356ab9a80c897ccaee38622c", + "data/facilities/kitchen.tres": "38197aa8a3e90c03a82e9ccdc88bb444af4eeb0349c41a39e0bdd7b188e7d5d3", + "data/facilities/massage_room.tres": "75ecf845fb3cfa8d3150f6b0dc90e901953469af512611384b70cc4878d21e85", + "data/facilities/public_bath.tres": "8ec259f48ed75c8ab2e5154a1caccf19f6be04331adbe774b877f0a2d8b2f778", + "data/facilities/reception.tres": "bed3de120a0e98c539771d1bb189111d095712f8ae25dfdf7cb2983efc0dee9f", + "data/facilities/rescue/infirmary.tres": "c3e861533971e369068ae9e42f71b660fa4ab3893c7c1f798fc367893befd943", + "data/facilities/security_station.tres": "69f3f518df7714d00c8e954e9c7405aa44b683dd274181cc3da832cc956815b3", + "data/facilities/service_corridor.tres": "5d79fbde201d657740efcba924f595bd7075e069b344d708e424dbebbdc2f254", + "data/facilities/service_elevator.tres": "35d552d5b96065413feccb50847e3cd7173e673896ce65afba238f90abc25132", + "data/facilities/staff_door.tres": "a993058bfd809ccdbbb9a61b9850259d7bf6e60003e57ccfa3972f6c29170752", + "data/facilities/staff_waiting_room.tres": "5c7a2f7f7c508102c4ee89401ad6348191b57d1ff65538acb9d450e464a3a46f", + "data/facilities/standard_room.tres": "89f0a3a861d66afa4c1338ff1ec919685cf338b93b8da9a2387ce85e7e5bc336", + "data/facilities/tavern.tres": "eb494ae6ab0d1b9e88ae0a38944609702e43c81a370a29cfb030af9ae46f523c", + "data/facilities/warehouse.tres": "d0fcf0528da66da7b354ab5efaafe2483a7a76e05b324db255700ef73cdfc791", + "docs/plans/original-completion-2026-09-29/execution/CURRENT_FACILITY_AUDIT.md": "cb0fedecc8006bfdb4aed97eb75dfdbae54e44dee4cf36c9149f8c99246008b8", + "docs/plans/original-completion-2026-10-02/decisions.json": "ad0673051b0fa601e525f05128e0b11e2dddd9d4bae6a3e0170bbf47da35efe9", + "docs/spec/acceptance/P06-01.json": "823db2a3b74f1582b1c23b2273e3b8262f679f4d5e6c18ad93757375df1d19ca", + "docs/spec/acceptance/P06-mana-proposal.json": "7bc73267db99c06dba7a897d3d6377919c0572acba1057a894accd0afcf1adc4", + "docs/traceability/original/BASELINE.txt": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a", + "scripts/core/definition_registry.gd": "e2ce5e0512a92fec6989e1bb5f0e7da1dbb50bd9ee67a07b4624fdc8bc65814f", + "scripts/core/save_migration_registry.gd": "22ac2cce07a02d1a2a9ac2109e7a0ecf9a0fbe675df4dc9d5249aa9ab3583f98", + "scripts/core/save_service.gd": "0c158d3e6ee693b89814bf232c954e4757c5ff91dc9df03bb322c3e593e73617", + "scripts/core/simulation_kernel.gd": "341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb", + "scripts/data/facility_definition.gd": "e90d56f7eab69c2a75238de465925c1c6df57ee6d44b3b81e7f6fcfd069af0a1", + "scripts/mana/mana_network_service.gd": "96f195cf2a28b0966d12cd7c6fab86d13eae97c8342d07d70f52e598fbf49af9", + "scripts/mana/mana_power_projection.gd": "2026467960e857349bcb18fb97b7753189be5f2de2be91a17e73e90146eba69e", + "scripts/mana/mana_reserve_balance.gd": "cd462c279d37cc297466b64d9cf3fd71870df9508c1ff5f7189e22ddbdbef4b3", + "tests/s2/test_mana_reserve_balance.gd": "07fe5f10e665cac3c8aa1b12e0c71878ffccc6d4b409250b317135345e3c8a05" + }, + "comparisons": [ + { + "model": "recommended", + "scenario": "low", + "period_minutes": 120, + "inputs": { + "demand_per_interval": 2, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 100, + "generation": 20, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 118, + "global_stop": false + }, + { + "from_minute": 370, + "to_minute": 380, + "before": 118, + "generation": 20, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 136, + "global_stop": false + }, + { + "from_minute": 380, + "to_minute": 390, + "before": 136, + "generation": 20, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 154, + "global_stop": false + }, + { + "from_minute": 390, + "to_minute": 400, + "before": 154, + "generation": 20, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 172, + "global_stop": false + }, + { + "from_minute": 400, + "to_minute": 410, + "before": 172, + "generation": 20, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 190, + "global_stop": false + }, + { + "from_minute": 410, + "to_minute": 420, + "before": 190, + "generation": 20, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 208, + "global_stop": false + }, + { + "from_minute": 420, + "to_minute": 430, + "before": 208, + "generation": 20, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 226, + "global_stop": false + }, + { + "from_minute": 430, + "to_minute": 440, + "before": 226, + "generation": 20, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 244, + "global_stop": false + }, + { + "from_minute": 440, + "to_minute": 450, + "before": 244, + "generation": 20, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 262, + "global_stop": false + }, + { + "from_minute": 450, + "to_minute": 460, + "before": 262, + "generation": 20, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 280, + "global_stop": false + }, + { + "from_minute": 460, + "to_minute": 470, + "before": 280, + "generation": 20, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 298, + "global_stop": false + }, + { + "from_minute": 470, + "to_minute": 480, + "before": 298, + "generation": 20, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 16, + "after": 300, + "global_stop": false + } + ], + "result_amount": 300, + "replay": null + }, + { + "model": "recommended", + "scenario": "normal", + "period_minutes": 120, + "inputs": { + "demand_per_interval": 16, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 100, + "generation": 20, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 104, + "global_stop": false + }, + { + "from_minute": 370, + "to_minute": 380, + "before": 104, + "generation": 20, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 108, + "global_stop": false + }, + { + "from_minute": 380, + "to_minute": 390, + "before": 108, + "generation": 20, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 112, + "global_stop": false + }, + { + "from_minute": 390, + "to_minute": 400, + "before": 112, + "generation": 20, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 116, + "global_stop": false + }, + { + "from_minute": 400, + "to_minute": 410, + "before": 116, + "generation": 20, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 120, + "global_stop": false + }, + { + "from_minute": 410, + "to_minute": 420, + "before": 120, + "generation": 20, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 124, + "global_stop": false + }, + { + "from_minute": 420, + "to_minute": 430, + "before": 124, + "generation": 20, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 128, + "global_stop": false + }, + { + "from_minute": 430, + "to_minute": 440, + "before": 128, + "generation": 20, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 132, + "global_stop": false + }, + { + "from_minute": 440, + "to_minute": 450, + "before": 132, + "generation": 20, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 136, + "global_stop": false + }, + { + "from_minute": 450, + "to_minute": 460, + "before": 136, + "generation": 20, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 140, + "global_stop": false + }, + { + "from_minute": 460, + "to_minute": 470, + "before": 140, + "generation": 20, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 144, + "global_stop": false + }, + { + "from_minute": 470, + "to_minute": 480, + "before": 144, + "generation": 20, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 148, + "global_stop": false + } + ], + "result_amount": 148, + "replay": null + }, + { + "model": "recommended", + "scenario": "excess", + "period_minutes": 120, + "inputs": { + "demand_per_interval": 63, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 100, + "generation": 20, + "demand": 63, + "consumed": 63, + "shortage": 0, + "overflow": 0, + "after": 57, + "global_stop": false + }, + { + "from_minute": 370, + "to_minute": 380, + "before": 57, + "generation": 20, + "demand": 63, + "consumed": 63, + "shortage": 0, + "overflow": 0, + "after": 14, + "global_stop": false + }, + { + "from_minute": 380, + "to_minute": 390, + "before": 14, + "generation": 20, + "demand": 63, + "consumed": 34, + "shortage": 29, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 390, + "to_minute": 400, + "before": 0, + "generation": 20, + "demand": 63, + "consumed": 20, + "shortage": 43, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 400, + "to_minute": 410, + "before": 0, + "generation": 20, + "demand": 63, + "consumed": 20, + "shortage": 43, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 410, + "to_minute": 420, + "before": 0, + "generation": 20, + "demand": 63, + "consumed": 20, + "shortage": 43, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 420, + "to_minute": 430, + "before": 0, + "generation": 20, + "demand": 63, + "consumed": 20, + "shortage": 43, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 430, + "to_minute": 440, + "before": 0, + "generation": 20, + "demand": 63, + "consumed": 20, + "shortage": 43, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 440, + "to_minute": 450, + "before": 0, + "generation": 20, + "demand": 63, + "consumed": 20, + "shortage": 43, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 450, + "to_minute": 460, + "before": 0, + "generation": 20, + "demand": 63, + "consumed": 20, + "shortage": 43, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 460, + "to_minute": 470, + "before": 0, + "generation": 20, + "demand": 63, + "consumed": 20, + "shortage": 43, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 470, + "to_minute": 480, + "before": 0, + "generation": 20, + "demand": 63, + "consumed": 20, + "shortage": 43, + "overflow": 0, + "after": 0, + "global_stop": true + } + ], + "result_amount": 0, + "replay": null + }, + { + "model": "recommended", + "scenario": "zero", + "period_minutes": 10, + "inputs": { + "demand_per_interval": 16, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 0, + "generation": 20, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 4, + "global_stop": false + } + ], + "result_amount": 4, + "replay": null + }, + { + "model": "recommended", + "scenario": "capacity", + "period_minutes": 10, + "inputs": { + "demand_per_interval": 2, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 300, + "generation": 20, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 18, + "after": 300, + "global_stop": false + } + ], + "result_amount": 300, + "replay": null + }, + { + "model": "recommended", + "scenario": "loss_and_return", + "period_minutes": 30, + "inputs": { + "demand_per_interval": 16, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 100, + "generation": 0, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 84, + "global_stop": false + }, + { + "from_minute": 370, + "to_minute": 380, + "before": 84, + "generation": 0, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 68, + "global_stop": false + }, + { + "from_minute": 380, + "to_minute": 390, + "before": 68, + "generation": 20, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 72, + "global_stop": false + } + ], + "result_amount": 72, + "replay": null + }, + { + "model": "recommended", + "scenario": "same_minute_replay", + "period_minutes": 10, + "inputs": { + "demand_per_interval": 16, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 100, + "generation": 20, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 104, + "global_stop": false + } + ], + "result_amount": 104, + "replay": "same boundary and identical inputs: return stored receipt without changes; conflicting inputs: reject atomically" + }, + { + "model": "conservative", + "scenario": "low", + "period_minutes": 120, + "inputs": { + "demand_per_interval": 2, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 100, + "generation": 10, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 108, + "global_stop": false + }, + { + "from_minute": 370, + "to_minute": 380, + "before": 108, + "generation": 10, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 116, + "global_stop": false + }, + { + "from_minute": 380, + "to_minute": 390, + "before": 116, + "generation": 10, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 124, + "global_stop": false + }, + { + "from_minute": 390, + "to_minute": 400, + "before": 124, + "generation": 10, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 132, + "global_stop": false + }, + { + "from_minute": 400, + "to_minute": 410, + "before": 132, + "generation": 10, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 140, + "global_stop": false + }, + { + "from_minute": 410, + "to_minute": 420, + "before": 140, + "generation": 10, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 148, + "global_stop": false + }, + { + "from_minute": 420, + "to_minute": 430, + "before": 148, + "generation": 10, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 156, + "global_stop": false + }, + { + "from_minute": 430, + "to_minute": 440, + "before": 156, + "generation": 10, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 164, + "global_stop": false + }, + { + "from_minute": 440, + "to_minute": 450, + "before": 164, + "generation": 10, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 172, + "global_stop": false + }, + { + "from_minute": 450, + "to_minute": 460, + "before": 172, + "generation": 10, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 180, + "global_stop": false + }, + { + "from_minute": 460, + "to_minute": 470, + "before": 180, + "generation": 10, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 188, + "global_stop": false + }, + { + "from_minute": 470, + "to_minute": 480, + "before": 188, + "generation": 10, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 196, + "global_stop": false + } + ], + "result_amount": 196, + "replay": null + }, + { + "model": "conservative", + "scenario": "normal", + "period_minutes": 120, + "inputs": { + "demand_per_interval": 16, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 100, + "generation": 10, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 94, + "global_stop": false + }, + { + "from_minute": 370, + "to_minute": 380, + "before": 94, + "generation": 10, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 88, + "global_stop": false + }, + { + "from_minute": 380, + "to_minute": 390, + "before": 88, + "generation": 10, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 82, + "global_stop": false + }, + { + "from_minute": 390, + "to_minute": 400, + "before": 82, + "generation": 10, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 76, + "global_stop": false + }, + { + "from_minute": 400, + "to_minute": 410, + "before": 76, + "generation": 10, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 70, + "global_stop": false + }, + { + "from_minute": 410, + "to_minute": 420, + "before": 70, + "generation": 10, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 64, + "global_stop": false + }, + { + "from_minute": 420, + "to_minute": 430, + "before": 64, + "generation": 10, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 58, + "global_stop": false + }, + { + "from_minute": 430, + "to_minute": 440, + "before": 58, + "generation": 10, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 52, + "global_stop": false + }, + { + "from_minute": 440, + "to_minute": 450, + "before": 52, + "generation": 10, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 46, + "global_stop": false + }, + { + "from_minute": 450, + "to_minute": 460, + "before": 46, + "generation": 10, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 40, + "global_stop": false + }, + { + "from_minute": 460, + "to_minute": 470, + "before": 40, + "generation": 10, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 34, + "global_stop": false + }, + { + "from_minute": 470, + "to_minute": 480, + "before": 34, + "generation": 10, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 28, + "global_stop": false + } + ], + "result_amount": 28, + "replay": null + }, + { + "model": "conservative", + "scenario": "excess", + "period_minutes": 120, + "inputs": { + "demand_per_interval": 63, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 100, + "generation": 10, + "demand": 63, + "consumed": 63, + "shortage": 0, + "overflow": 0, + "after": 47, + "global_stop": false + }, + { + "from_minute": 370, + "to_minute": 380, + "before": 47, + "generation": 10, + "demand": 63, + "consumed": 57, + "shortage": 6, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 380, + "to_minute": 390, + "before": 0, + "generation": 10, + "demand": 63, + "consumed": 10, + "shortage": 53, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 390, + "to_minute": 400, + "before": 0, + "generation": 10, + "demand": 63, + "consumed": 10, + "shortage": 53, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 400, + "to_minute": 410, + "before": 0, + "generation": 10, + "demand": 63, + "consumed": 10, + "shortage": 53, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 410, + "to_minute": 420, + "before": 0, + "generation": 10, + "demand": 63, + "consumed": 10, + "shortage": 53, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 420, + "to_minute": 430, + "before": 0, + "generation": 10, + "demand": 63, + "consumed": 10, + "shortage": 53, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 430, + "to_minute": 440, + "before": 0, + "generation": 10, + "demand": 63, + "consumed": 10, + "shortage": 53, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 440, + "to_minute": 450, + "before": 0, + "generation": 10, + "demand": 63, + "consumed": 10, + "shortage": 53, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 450, + "to_minute": 460, + "before": 0, + "generation": 10, + "demand": 63, + "consumed": 10, + "shortage": 53, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 460, + "to_minute": 470, + "before": 0, + "generation": 10, + "demand": 63, + "consumed": 10, + "shortage": 53, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 470, + "to_minute": 480, + "before": 0, + "generation": 10, + "demand": 63, + "consumed": 10, + "shortage": 53, + "overflow": 0, + "after": 0, + "global_stop": true + } + ], + "result_amount": 0, + "replay": null + }, + { + "model": "conservative", + "scenario": "zero", + "period_minutes": 10, + "inputs": { + "demand_per_interval": 16, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 0, + "generation": 10, + "demand": 16, + "consumed": 10, + "shortage": 6, + "overflow": 0, + "after": 0, + "global_stop": true + } + ], + "result_amount": 0, + "replay": null + }, + { + "model": "conservative", + "scenario": "capacity", + "period_minutes": 10, + "inputs": { + "demand_per_interval": 2, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 200, + "generation": 10, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 8, + "after": 200, + "global_stop": false + } + ], + "result_amount": 200, + "replay": null + }, + { + "model": "conservative", + "scenario": "loss_and_return", + "period_minutes": 30, + "inputs": { + "demand_per_interval": 16, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 100, + "generation": 0, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 84, + "global_stop": false + }, + { + "from_minute": 370, + "to_minute": 380, + "before": 84, + "generation": 0, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 68, + "global_stop": false + }, + { + "from_minute": 380, + "to_minute": 390, + "before": 68, + "generation": 10, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 62, + "global_stop": false + } + ], + "result_amount": 62, + "replay": null + }, + { + "model": "conservative", + "scenario": "same_minute_replay", + "period_minutes": 10, + "inputs": { + "demand_per_interval": 16, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 100, + "generation": 10, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 94, + "global_stop": false + } + ], + "result_amount": 94, + "replay": "same boundary and identical inputs: return stored receipt without changes; conflicting inputs: reject atomically" + }, + { + "model": "generous", + "scenario": "low", + "period_minutes": 120, + "inputs": { + "demand_per_interval": 2, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 200, + "generation": 40, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 238, + "global_stop": false + }, + { + "from_minute": 370, + "to_minute": 380, + "before": 238, + "generation": 40, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 276, + "global_stop": false + }, + { + "from_minute": 380, + "to_minute": 390, + "before": 276, + "generation": 40, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 314, + "global_stop": false + }, + { + "from_minute": 390, + "to_minute": 400, + "before": 314, + "generation": 40, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 352, + "global_stop": false + }, + { + "from_minute": 400, + "to_minute": 410, + "before": 352, + "generation": 40, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 390, + "global_stop": false + }, + { + "from_minute": 410, + "to_minute": 420, + "before": 390, + "generation": 40, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 428, + "global_stop": false + }, + { + "from_minute": 420, + "to_minute": 430, + "before": 428, + "generation": 40, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 466, + "global_stop": false + }, + { + "from_minute": 430, + "to_minute": 440, + "before": 466, + "generation": 40, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 504, + "global_stop": false + }, + { + "from_minute": 440, + "to_minute": 450, + "before": 504, + "generation": 40, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 542, + "global_stop": false + }, + { + "from_minute": 450, + "to_minute": 460, + "before": 542, + "generation": 40, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 0, + "after": 580, + "global_stop": false + }, + { + "from_minute": 460, + "to_minute": 470, + "before": 580, + "generation": 40, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 18, + "after": 600, + "global_stop": false + }, + { + "from_minute": 470, + "to_minute": 480, + "before": 600, + "generation": 40, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 38, + "after": 600, + "global_stop": false + } + ], + "result_amount": 600, + "replay": null + }, + { + "model": "generous", + "scenario": "normal", + "period_minutes": 120, + "inputs": { + "demand_per_interval": 16, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 200, + "generation": 40, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 224, + "global_stop": false + }, + { + "from_minute": 370, + "to_minute": 380, + "before": 224, + "generation": 40, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 248, + "global_stop": false + }, + { + "from_minute": 380, + "to_minute": 390, + "before": 248, + "generation": 40, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 272, + "global_stop": false + }, + { + "from_minute": 390, + "to_minute": 400, + "before": 272, + "generation": 40, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 296, + "global_stop": false + }, + { + "from_minute": 400, + "to_minute": 410, + "before": 296, + "generation": 40, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 320, + "global_stop": false + }, + { + "from_minute": 410, + "to_minute": 420, + "before": 320, + "generation": 40, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 344, + "global_stop": false + }, + { + "from_minute": 420, + "to_minute": 430, + "before": 344, + "generation": 40, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 368, + "global_stop": false + }, + { + "from_minute": 430, + "to_minute": 440, + "before": 368, + "generation": 40, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 392, + "global_stop": false + }, + { + "from_minute": 440, + "to_minute": 450, + "before": 392, + "generation": 40, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 416, + "global_stop": false + }, + { + "from_minute": 450, + "to_minute": 460, + "before": 416, + "generation": 40, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 440, + "global_stop": false + }, + { + "from_minute": 460, + "to_minute": 470, + "before": 440, + "generation": 40, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 464, + "global_stop": false + }, + { + "from_minute": 470, + "to_minute": 480, + "before": 464, + "generation": 40, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 488, + "global_stop": false + } + ], + "result_amount": 488, + "replay": null + }, + { + "model": "generous", + "scenario": "excess", + "period_minutes": 120, + "inputs": { + "demand_per_interval": 63, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 200, + "generation": 40, + "demand": 63, + "consumed": 63, + "shortage": 0, + "overflow": 0, + "after": 177, + "global_stop": false + }, + { + "from_minute": 370, + "to_minute": 380, + "before": 177, + "generation": 40, + "demand": 63, + "consumed": 63, + "shortage": 0, + "overflow": 0, + "after": 154, + "global_stop": false + }, + { + "from_minute": 380, + "to_minute": 390, + "before": 154, + "generation": 40, + "demand": 63, + "consumed": 63, + "shortage": 0, + "overflow": 0, + "after": 131, + "global_stop": false + }, + { + "from_minute": 390, + "to_minute": 400, + "before": 131, + "generation": 40, + "demand": 63, + "consumed": 63, + "shortage": 0, + "overflow": 0, + "after": 108, + "global_stop": false + }, + { + "from_minute": 400, + "to_minute": 410, + "before": 108, + "generation": 40, + "demand": 63, + "consumed": 63, + "shortage": 0, + "overflow": 0, + "after": 85, + "global_stop": false + }, + { + "from_minute": 410, + "to_minute": 420, + "before": 85, + "generation": 40, + "demand": 63, + "consumed": 63, + "shortage": 0, + "overflow": 0, + "after": 62, + "global_stop": false + }, + { + "from_minute": 420, + "to_minute": 430, + "before": 62, + "generation": 40, + "demand": 63, + "consumed": 63, + "shortage": 0, + "overflow": 0, + "after": 39, + "global_stop": false + }, + { + "from_minute": 430, + "to_minute": 440, + "before": 39, + "generation": 40, + "demand": 63, + "consumed": 63, + "shortage": 0, + "overflow": 0, + "after": 16, + "global_stop": false + }, + { + "from_minute": 440, + "to_minute": 450, + "before": 16, + "generation": 40, + "demand": 63, + "consumed": 56, + "shortage": 7, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 450, + "to_minute": 460, + "before": 0, + "generation": 40, + "demand": 63, + "consumed": 40, + "shortage": 23, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 460, + "to_minute": 470, + "before": 0, + "generation": 40, + "demand": 63, + "consumed": 40, + "shortage": 23, + "overflow": 0, + "after": 0, + "global_stop": true + }, + { + "from_minute": 470, + "to_minute": 480, + "before": 0, + "generation": 40, + "demand": 63, + "consumed": 40, + "shortage": 23, + "overflow": 0, + "after": 0, + "global_stop": true + } + ], + "result_amount": 0, + "replay": null, + "depletion_summary": { + "after_interval_8": 16, + "first_zero_interval": 9, + "first_zero_minute": 450, + "basis": "200-8*(63-40)=16; interval 9 available=56, shortage=7, after=0" + } + }, + { + "model": "generous", + "scenario": "zero", + "period_minutes": 10, + "inputs": { + "demand_per_interval": 16, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 0, + "generation": 40, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 24, + "global_stop": false + } + ], + "result_amount": 24, + "replay": null + }, + { + "model": "generous", + "scenario": "capacity", + "period_minutes": 10, + "inputs": { + "demand_per_interval": 2, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 600, + "generation": 40, + "demand": 2, + "consumed": 2, + "shortage": 0, + "overflow": 38, + "after": 600, + "global_stop": false + } + ], + "result_amount": 600, + "replay": null + }, + { + "model": "generous", + "scenario": "loss_and_return", + "period_minutes": 30, + "inputs": { + "demand_per_interval": 16, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 200, + "generation": 0, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 184, + "global_stop": false + }, + { + "from_minute": 370, + "to_minute": 380, + "before": 184, + "generation": 0, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 168, + "global_stop": false + }, + { + "from_minute": 380, + "to_minute": 390, + "before": 168, + "generation": 40, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 192, + "global_stop": false + } + ], + "result_amount": 192, + "replay": null + }, + { + "model": "generous", + "scenario": "same_minute_replay", + "period_minutes": 10, + "inputs": { + "demand_per_interval": 16, + "instance_mix": "low: cafeteria x1; normal: cafeteria,kitchen,public_bath,guest_elevator,reception,security_station x1 each; excess: all 37 definitions x1 including definition-only resources" + }, + "flows": [ + { + "from_minute": 360, + "to_minute": 370, + "before": 200, + "generation": 40, + "demand": 16, + "consumed": 16, + "shortage": 0, + "overflow": 0, + "after": 224, + "global_stop": false + } + ], + "result_amount": 224, + "replay": "same boundary and identical inputs: return stored receipt without changes; conflicting inputs: reject atomically" + } + ], + "formula": { + "available": "B+G+F", + "consumed": "min(B+G+F,D)", + "shortage": "D-consumed", + "overflow": "max(0,B+G+F-consumed-C)", + "after": "min(C,B+G+F-consumed)", + "period": "10 game minutes; 120-minute samples have 12 sequential boundaries; F=0 in comparisons", + "network": "local allocation still independently required; stock is accounted once globally, not summed with network stores" + }, + "provenance": { + "original": "BASELINE 9.1 depletion; 10.6 furnace; 6.1/6.5 unique protection; no numerical balance", + "implementation": "GameState stock100; Runtime network source100; maintenance_mana allocation demand every10 game minutes, not reserve debit; reserve helper is caller-driven and not wired into periodic Runtime stock", + "fixture": "test_mana_reserve_balance: initial7/capacity10 at360, generation5/demand8 at370 ->4; purely test inputs", + "candidate": "recommended and alternatives are new unapproved design values; no product writes" + }, + "validation": "static source reading and arithmetic only; formal proposal-consistency and independent review reserved for Runner", + "source_provenance": { + "autoload/game_state.gd": "current_implementation", + "autoload/simulation_runtime.gd": "current_implementation", + "data/facilities/adult_private_room.tres": "current_implementation", + "data/facilities/cafeteria.tres": "current_implementation", + "data/facilities/expansion/black_market.tres": "current_implementation", + "data/facilities/expansion/chapel.tres": "current_implementation", + "data/facilities/expansion/cleaning_room.tres": "current_implementation", + "data/facilities/expansion/clinic.tres": "current_implementation", + "data/facilities/expansion/cold_storage.tres": "current_implementation", + "data/facilities/expansion/general_store.tres": "current_implementation", + "data/facilities/expansion/guild_counter.tres": "current_implementation", + "data/facilities/expansion/laundry.tres": "current_implementation", + "data/facilities/expansion/maintenance_workshop.tres": "current_implementation", + "data/facilities/expansion/mana_control_room.tres": "current_implementation", + "data/facilities/expansion/premium_room.tres": "current_implementation", + "data/facilities/expansion/private_bath.tres": "current_implementation", + "data/facilities/expansion/secret_tavern.tres": "current_implementation", + "data/facilities/expansion/staff_dormitory.tres": "current_implementation", + "data/facilities/expansion/tea_lounge.tres": "current_implementation", + "data/facilities/expansion/underground_guest_room.tres": "current_implementation", + "data/facilities/expansion/vip_private_salon.tres": "current_implementation", + "data/facilities/expansion/waste_processing.tres": "current_implementation", + "data/facilities/guest_corridor.tres": "current_implementation", + "data/facilities/guest_elevator.tres": "current_implementation", + "data/facilities/infrastructure/guest_stairs.tres": "current_implementation", + "data/facilities/infrastructure/service_stairs.tres": "current_implementation", + "data/facilities/kitchen.tres": "current_implementation", + "data/facilities/massage_room.tres": "current_implementation", + "data/facilities/public_bath.tres": "current_implementation", + "data/facilities/reception.tres": "current_implementation", + "data/facilities/rescue/infirmary.tres": "current_implementation", + "data/facilities/security_station.tres": "current_implementation", + "data/facilities/service_corridor.tres": "current_implementation", + "data/facilities/service_elevator.tres": "current_implementation", + "data/facilities/staff_door.tres": "current_implementation", + "data/facilities/staff_waiting_room.tres": "current_implementation", + "data/facilities/standard_room.tres": "current_implementation", + "data/facilities/tavern.tres": "current_implementation", + "data/facilities/warehouse.tres": "current_implementation", + "docs/plans/original-completion-2026-09-29/execution/CURRENT_FACILITY_AUDIT.md": "historical_audit_not_current_acceptance", + "docs/plans/original-completion-2026-10-02/decisions.json": "decision_register", + "docs/spec/acceptance/P06-01.json": "original_or_task_contract", + "docs/spec/acceptance/P06-mana-proposal.json": "original_or_task_contract", + "docs/traceability/original/BASELINE.txt": "original_or_task_contract", + "scripts/core/definition_registry.gd": "current_implementation", + "scripts/core/save_migration_registry.gd": "current_implementation", + "scripts/core/save_service.gd": "current_implementation", + "scripts/core/simulation_kernel.gd": "current_implementation", + "scripts/data/facility_definition.gd": "current_implementation", + "scripts/mana/mana_network_service.gd": "current_implementation", + "scripts/mana/mana_power_projection.gd": "current_implementation", + "scripts/mana/mana_reserve_balance.gd": "current_implementation", + "tests/s2/test_mana_reserve_balance.gd": "fixture_not_approved_balance" + }, + "furnace_comparisons": { + "provenance": "candidate_unapproved", + "inputs": { + "C": 300, + "G": 20, + "D": 16, + "F": 100 + }, + "arithmetic_formula": "available=B+G+F; consumed=min(available,D); overflow=max(0,available-consumed-C); after=min(C,available-consumed)", + "arithmetic_cases": [ + { + "B": 200, + "before_cap": 304, + "overflow": 4, + "after": 300 + }, + { + "B": 196, + "before_cap": 300, + "overflow": 0, + "after": 300 + }, + { + "B": 300, + "before_cap": 404, + "overflow": 104, + "after": 300 + } + ], + "distinction": "Arithmetic overflow examples assume F=100; rejected furnace transactions actually use F=0 and consume no person or resource.", + "headroom_candidate": { + "check": "after generation and demand: base_after=min(C,max(0,B+G-D)); require C-base_after>=F", + "cases": [ + { + "B": 200, + "base_after": 204, + "headroom": 96, + "accepted": false, + "actual_after": 204 + }, + { + "B": 196, + "base_after": 200, + "headroom": 100, + "accepted": true, + "actual_after": 300 + }, + { + "B": 300, + "base_after": 300, + "headroom": 0, + "accepted": false, + "actual_after": 300 + } + ] + }, + "before_demand_alternative": { + "check": "after generation but before demand: generated=min(C,B+G); require C-generated>=F", + "cases": [ + { + "B": 200, + "headroom": 80, + "accepted": false + }, + { + "B": 196, + "headroom": 84, + "accepted": false + }, + { + "B": 300, + "headroom": 0, + "accepted": false + } + ] + }, + "approval": "choice between policies pending; no actor consumption or product implementation" + } +}