# Phase 9 Godot Vertical Slice Contract ## Runtime Envelope - Engine: Godot `4.6.1.stable`. - Project root: `runtime/`. - Orientation: landscape, reference viewport `1280x720`, stretch `canvas_items`. - Input: touch-first; mouse is a desktop convenience and not mobile evidence. - Languages: Simplified Chinese default and English. - Rendering: `gl_compatibility`, mobile-safe 2D only for P9.1. - Offline: no account, analytics, network or purchase dependency. ## P9.1 State Machine ```text contract -> offers -> opening_review -> opening_receipt -> market_hire_mael -> market_hire_ilya -> equipment_purchase -> equipment_equip -> order -> readiness_receipt ``` Legal reverse paths before commits are offers-to-contract, opening-review-to- offers, and order revision. Opening, each hire, purchase, equip and readiness commit are one-shot. Repeated input returns the current state and cannot duplicate Recruit, Coin, equipment or receipt mutations. ## Fixed Runtime Data - Contract: `CTR-R1-01 First Crossing`. - Opening Coin: `52`; Company capacity: `4`. - Stable offers: `OFF-01` Elian/Hearthguard, `OFF-02` Nia/Farstring, `OFF-03` Tomas/Wayrunner, `OFF-04` Sable/Kindhand. - Market offers: `MKT-R1-01` Mael/Hearthguard and `MKT-R1-02` Ilya/Farstring, each `14 Coin`. - Equipment: `EQ-012 Open-Line Cord`, `12 Coin`, explicitly equipped to one current Company member; fixed evidence equips `OFF-03` Tomas. - Final readiness: Coin `12`, Company `4/4`; exposed-front direction remains on the right and protected rear on the left in both locales. ## Presentation Contract The opening frame reads in three seconds as a traveling fantasy Company about to cross a dangerous suspended route. Priority is (1) current decision and primary action, (2) Company/Recruits, (3) Coin/capacity/receipt state. Existing accepted candidate scene, actor and equipment assets are reused; they remain candidate production assets, not final art. Selection must change card border, check mark and count. A transaction must show the old and new resource values, a short visual pulse and a captioned prototype sound cue. Disabled actions are visibly disabled and state why. Reduced motion removes movement but preserves state change. Mute changes no result. No tutorial wall, decorative nested cards or battle content is legal. ## Test Contract - `ABG_P9_1_DOMAIN_OK`: state transitions, invalid boundaries, stable IDs, one-shot transactions and exact final values. - `ABG_P9_1_TOUCH_OK`: fresh runtime driven by parsed ScreenTouch events reaches the readiness receipt with fallback/direct count zero. - `ABG_P9_1_LAYOUT_OK`: all declared viewport/language/accessibility fixtures remain within safe bounds. - `ABG_P9_1_RUNTIME_CAPTURE_OK`: normal-render screenshots cover six required states and strict runtime diagnostics are clean. Tests and tools may not implement product behavior or relax product guards.