From ed4a9fac8bdba02362dede028227a9dbf11977b1 Mon Sep 17 00:00:00 2001 From: wusumac <736139669@qq.com> Date: Thu, 13 Aug 2026 09:25:02 +0800 Subject: [PATCH] docs(p9.1): freeze implementation contract --- .agent-taskgraph/PROJECT.md | 10 +- .agent-taskgraph/graph.yaml | 37 +- .agent-taskgraph/spec.md | 7 +- ...E9_1_ARBITRARY_PARTY_FIRST_SESSION_GOAL.md | 23 +- ..._ARBITRARY_PARTY_FIRST_SESSION_CONTRACT.md | 322 ++++++++++++++++++ 5 files changed, 371 insertions(+), 28 deletions(-) create mode 100644 docs/runtime/PHASE9_1_ARBITRARY_PARTY_FIRST_SESSION_CONTRACT.md diff --git a/.agent-taskgraph/PROJECT.md b/.agent-taskgraph/PROJECT.md index 87ad4f2b..feee3e18 100644 --- a/.agent-taskgraph/PROJECT.md +++ b/.agent-taskgraph/PROJECT.md @@ -20,13 +20,14 @@ Phase 8 产品设计已建立;Phase 9 正在用 Godot 逐模块实现。P9.0R1 |---|---| | 批次 | `abg-p9-1-continuous-development-01` | | Agent TaskGraph 协议版本 | 0.8.0-beta.12 | -| Source baseline | READY: `/Users/wusumac/Documents/game/aetherbound_guild` at `dec9574405043624acee0f4f81963d829e8d40e9`, branch `main`, clean/upstream at batch freeze | -| Frozen spec | `.agent-taskgraph/spec.md` revision `p9.1-spec-r1` | -| 当前阶段 | 先并行规格,汇合后再并行实现 | +| Source baseline | READY: accepted product `41204acafa911a505f5b24a493aa032983e706d1`; PMO specification integration starts from clean/upstream `7bc871d` | +| Frozen spec | `.agent-taskgraph/spec.md` revision `p9.1-spec-r2`; implementation contract `p9.1-contract-r1` | +| 当前阶段 | 三份规格已汇合;下一阶段为独占 foundation 与并行代表性视觉切片 | | 最大同时工作会话 | 3 个 worker;PMO 独立监督 | | Owner 授权 | 2026-08-13:使用 agent graph,并行安排策划、技术架构、设计师和多个开发 | | Human Gates | 玩法理解、乐趣、视觉、听感、物理设备、打包、商店与发布 | | 已启用可选适配器 | HAPI:本批 worker/reviewer 必须用户可见、可接管 | +| Paid image boundary | Owner standing approval reaffirmed 2026-08-13; current P9.1 visual slice only, <=4 paid calls and <=USD 5 including retries | ## Execution Profile @@ -57,8 +58,9 @@ Every new session requires fresh `runtime-evidence.json`, a delivered Role boots ## 共享写入边界 - PMO only: `.agent-taskgraph/`, `CURRENT_CHECKPOINT.md`, P9.1 parent Goal/contract and acceptance records. -- Expert wave uses three separate Markdown outputs under `docs/runtime/p9_1/`. +- Expert wave produced three separate Markdown outputs under `docs/runtime/p9_1/`; PMO reconciles them into the frozen P9.1 contract. - Foundation worker alone may extract shared APIs and change `runtime/main.gd` during extraction. +- The UX/visual role may prepare the bounded representative visual slice without editing runtime source. - Domain, UI and test workers run after foundation integration and own disjoint paths. - Integration worker alone wires parallel products into shared entry and runner files. - Reviewer is read-only. H5 publishing occurs only after reviewer PASS. diff --git a/.agent-taskgraph/graph.yaml b/.agent-taskgraph/graph.yaml index fbf05a04..6bb03d0e 100644 --- a/.agent-taskgraph/graph.yaml +++ b/.agent-taskgraph/graph.yaml @@ -1,9 +1,9 @@ version: 1 batch: id: "abg-p9-1-continuous-development-01" - revision: "graph-p9.1-r1" + revision: "graph-p9.1-r2" spec: ".agent-taskgraph/spec.md" - spec_revision: "p9.1-spec-r1" + spec_revision: "p9.1-spec-r2" approved_by: "Owner" approved_at: "2026-08-13" max_concurrency: 3 @@ -67,21 +67,34 @@ nodes: goal_ref: "task:ABG-P9.1-RUNTIME-FOUNDATION" needs: ["p91_spec_integration"] consumes: ["docs/runtime/PHASE9_1_ARBITRARY_PARTY_FIRST_SESSION_CONTRACT.md", "P9.0R10 fixed runtime source"] - produces: ["runtime/domain/foundation/", "runtime/ui/foundation/"] - writes: ["runtime/main.gd", "runtime/domain/foundation/", "runtime/ui/foundation/"] + produces: ["runtime/domain/p9_1/session_state.gd", "runtime/domain/p9_1/session_service.gd", "runtime/domain/p9_1/battle_fixture.gd", "runtime/presentation/", "runtime/ui/session_presenter.gd", "runtime/ui/widgets.gd", "runtime/compat/p9_0_root_facade.gd"] + writes: ["runtime/main.gd", "runtime/domain/p9_1/contracts.gd", "runtime/domain/p9_1/session_state.gd", "runtime/domain/p9_1/session_service.gd", "runtime/domain/p9_1/battle_fixture.gd", "runtime/presentation/", "runtime/ui/session_presenter.gd", "runtime/ui/widgets.gd", "runtime/compat/p9_0_root_facade.gd"] acceptance: ["P9.0R1-R10 declared behavior remains equivalent", "Shared state has one owner", "Parallel extension APIs compile and are covered"] on_pass: "p91_domain_implementation" on_fail: "failed" max_attempts: 2 + - id: "p91_representative_visual_slice" + title: "Produce the bounded first-battle visual slice" + kind: "worker" + goal_ref: "task:ABG-P9.1-VISUAL-SLICE" + needs: ["p91_spec_integration"] + consumes: ["docs/runtime/PHASE9_1_ARBITRARY_PARTY_FIRST_SESSION_CONTRACT.md", "docs/runtime/p9_1/UX_VISUAL_FLOW_SPEC.md", "accepted P9.0R3-R10 visual assets"] + produces: ["docs/runtime/p9_1/visual_slice/"] + writes: ["docs/runtime/p9_1/visual_slice/"] + acceptance: ["Formation-to-diagnosis composition reads at 844x390", "Paid generation stays within four calls and USD 5", "Prompts, task IDs, costs and hashes are recorded", "No runtime integration or bulk asset expansion"] + on_pass: "p91_runtime_integration" + on_fail: "failed" + max_attempts: 2 + - id: "p91_domain_implementation" title: "Implement arbitrary-party P9.1 domain flow" kind: "worker" goal_ref: "task:ABG-P9.1-DOMAIN" needs: ["p91_runtime_foundation"] - consumes: ["runtime/domain/foundation/", "docs/runtime/PHASE9_1_ARBITRARY_PARTY_FIRST_SESSION_CONTRACT.md"] - produces: ["runtime/domain/p9_1/"] - writes: ["runtime/domain/p9_1/"] + consumes: ["runtime/domain/p9_1/session_service.gd", "runtime/domain/p9_1/session_state.gd", "docs/runtime/PHASE9_1_ARBITRARY_PARTY_FIRST_SESSION_CONTRACT.md"] + produces: ["runtime/domain/p9_1/content/", "runtime/domain/p9_1/rules/"] + writes: ["runtime/domain/p9_1/content/", "runtime/domain/p9_1/rules/"] acceptance: ["Six-pair deterministic state matrix passes", "Transactions commit exactly once", "No Control-tree or frame-rate dependency"] on_pass: "p91_runtime_integration" on_fail: "failed" @@ -92,7 +105,7 @@ nodes: kind: "worker" goal_ref: "task:ABG-P9.1-UI" needs: ["p91_runtime_foundation"] - consumes: ["runtime/ui/foundation/", "docs/runtime/p9_1/UX_VISUAL_FLOW_SPEC.md"] + consumes: ["runtime/ui/session_presenter.gd", "runtime/ui/widgets.gd", "docs/runtime/p9_1/UX_VISUAL_FLOW_SPEC.md"] produces: ["runtime/ui/p9_1/"] writes: ["runtime/ui/p9_1/"] acceptance: ["All declared screens render from real state", "Chinese first and accessibility variants fit", "Accepted battle movement and feedback are preserved"] @@ -106,8 +119,8 @@ nodes: goal_ref: "task:ABG-P9.1-TESTS" needs: ["p91_runtime_foundation"] consumes: ["docs/runtime/PHASE9_1_ARBITRARY_PARTY_FIRST_SESSION_CONTRACT.md", "runtime/tests/"] - produces: ["runtime/tests/p9_1/", "runtime/tools/p9_1/"] - writes: ["runtime/tests/p9_1/", "runtime/tools/p9_1/"] + produces: ["runtime/tests/p9_1/", "runtime/tests/support/p9_1/"] + writes: ["runtime/tests/p9_1/", "runtime/tests/support/p9_1/"] acceptance: ["Pair-path and negative boundaries are executable", "Parsed touch and layout states are declared", "Strict diagnostics and cleanup are enforced"] on_pass: "p91_runtime_integration" on_fail: "failed" @@ -117,8 +130,8 @@ nodes: title: "Integrate the complete P9.1 first session" kind: "merge" goal_ref: "task:ABG-P9.1-RUNTIME-INTEGRATION" - needs: ["p91_domain_implementation", "p91_ui_implementation", "p91_test_implementation"] - consumes: ["runtime/domain/p9_1/", "runtime/ui/p9_1/", "runtime/tests/p9_1/", "runtime/tools/p9_1/"] + needs: ["p91_domain_implementation", "p91_ui_implementation", "p91_test_implementation", "p91_representative_visual_slice"] + consumes: ["runtime/domain/p9_1/content/", "runtime/domain/p9_1/rules/", "runtime/ui/p9_1/", "runtime/tests/p9_1/", "runtime/tests/support/p9_1/", "docs/runtime/p9_1/visual_slice/"] produces: ["P9.1 fixed candidate revision"] writes: ["runtime/main.gd", "runtime/project.godot", "runtime/tools/run_p9_1_tests.sh"] acceptance: ["Complete five-battle flow works for all pairs", "Full R1-R10 plus P9.1 suite passes", "Normal-render and touch evidence meet the frozen contract"] diff --git a/.agent-taskgraph/spec.md b/.agent-taskgraph/spec.md index 7ce4eb87..48c1cb7a 100644 --- a/.agent-taskgraph/spec.md +++ b/.agent-taskgraph/spec.md @@ -3,7 +3,7 @@ > Status: FROZEN > Requested: 2026-08-13 > Frozen by: Owner / 2026-08-13 -> Revision: p9.1-spec-r1 +> Revision: p9.1-spec-r2 ## 本批要回答的问题 @@ -43,7 +43,7 @@ P9.0R10 允许玩家从四人中任意选择两人,并让全部六种无序组 1. 游戏策划、UX/视觉设计、技术架构并行输出三份互斥规格。 2. PMO 汇合三份规格,消除矛盾并冻结实现合同。 -3. Foundation worker 行为等价拆分共享运行时。 +3. Foundation worker 行为等价拆分共享运行时;代表性视觉切片可并行准备。 4. Domain、UI、Tests 三个 worker 在互斥路径中并行实现。 5. Integration worker 接入共享入口,跑完整回归、矩阵、触摸和正常渲染。 6. Fresh independent reviewer 固定 revision 只读验收。 @@ -65,7 +65,8 @@ P9.0R10 允许玩家从四人中任意选择两人,并让全部六种无序组 - 第二章节及以后、完整 42 职业/320 装备/100 敌人内容生产。 - 正式 Market、持久装备背包、权威 XP 3-10、晋升、伤亡恢复和 save migration。 - 权威完整战斗公式、难度、经济、离线进度与长期元进度。 -- 新的付费图片/音频生成、批量最终美术与音频生产。 +- 除 P9.1 首战/诊断代表性视觉切片外的付费图片、音频、视频和批量最终媒体生产。 +- 代表性视觉切片最多 4 次付费图片调用、总额不超过 5 美元(含重试),并记录任务 ID、成本与来源;不再逐次请求 Owner 批准。 - iOS/Android 打包、TestFlight、设备安装、签名、商店、评审与发布。 - 复制参考商业游戏的名称、文案、数值、布局、代码或资产。 diff --git a/docs/goals/PHASE9_1_ARBITRARY_PARTY_FIRST_SESSION_GOAL.md b/docs/goals/PHASE9_1_ARBITRARY_PARTY_FIRST_SESSION_GOAL.md index ef2dfc22..d4ad81d5 100644 --- a/docs/goals/PHASE9_1_ARBITRARY_PARTY_FIRST_SESSION_GOAL.md +++ b/docs/goals/PHASE9_1_ARBITRARY_PARTY_FIRST_SESSION_GOAL.md @@ -25,11 +25,13 @@ Each choice and result must be based on the actual party, equipment and prior de 1. Parallel game-design, UX/visual and runtime-architecture specifications. 2. PMO integration into one implementation contract. 3. Behavior-equivalent runtime extraction. -4. Parallel domain, UI and test implementation with disjoint writes. -5. Integration, full regression and source-bound runtime evidence. -6. Fresh independent review. -7. New private remotely playable H5 after reviewer PASS. -8. Owner play judgment. +4. One bounded representative visual slice, with at most four paid image calls + and USD 5 total, may run beside foundation extraction. +5. Parallel domain, UI and test implementation with disjoint writes. +6. Integration, full regression and source-bound runtime evidence. +7. Fresh independent review. +8. New private remotely playable H5 after reviewer PASS. +9. Owner play judgment. ## Acceptance @@ -44,10 +46,13 @@ Each choice and result must be based on the actual party, equipment and prior de ## Frozen -No chapter expansion, bulk content, authoritative full combat/economy/save systems, paid media, -mobile packaging, TestFlight, device actions, store actions or release work. +No chapter expansion, bulk content, authoritative full combat/economy/save systems, mobile +packaging, TestFlight, device actions, store actions or release work. Current-task image +generation is authorized only for the contract's representative visual slice, with at most +four paid calls and USD 5 equivalent total including retries. Audio/video generation and +bulk/final media remain frozen. ## Current Gate -The first three expert tasks must produce mutually consistent specifications. Runtime code is -not authorized until their commits are integrated and the implementation contract is frozen. +The three expert tasks are integrated. Runtime code is authorized only through the frozen +`docs/runtime/PHASE9_1_ARBITRARY_PARTY_FIRST_SESSION_CONTRACT.md` and the TaskGraph stage order. diff --git a/docs/runtime/PHASE9_1_ARBITRARY_PARTY_FIRST_SESSION_CONTRACT.md b/docs/runtime/PHASE9_1_ARBITRARY_PARTY_FIRST_SESSION_CONTRACT.md new file mode 100644 index 00000000..a6c835d4 --- /dev/null +++ b/docs/runtime/PHASE9_1_ARBITRARY_PARTY_FIRST_SESSION_CONTRACT.md @@ -0,0 +1,322 @@ +# Phase 9.1 Arbitrary-Party First-Session Implementation Contract + +> Status: `FROZEN` +> Contract revision: `p9.1-contract-r1` +> Frozen: 2026-08-13 +> Accepted predecessor product source: `41204acafa911a505f5b24a493aa032983e706d1` +> Predecessor closure: `f0b7d7b0234d8ad304f7b9d39fa99ded1dbfc27d` +> Expert inputs: `GAMEPLAY_EXPERIENCE_SPEC.md`, `UX_VISUAL_FLOW_SPEC.md`, +> `RUNTIME_ARCHITECTURE_SPEC.md` + +## 1. Product Outcome And Stopping Point + +P9.1 carries every unordered pair selected from the four current Recruits through +one truthful five-battle first session: + +```text +choose any two -> automatic formation -> battle 1 -> diagnosis -> adaptation +-> battle 2 -> Guild response -> battle 3 -> route -> battle 4 -> growth +-> battle 5 -> first-session result +``` + +The player chooses people, never front/rear slots. The system forms the line, +automatic combat makes each actual profession act, and every decision page shows +current evidence, gain, cost and foregone alternative before commit. The final +page ends the bounded experience or restarts it; it does not claim a saved run, +next chapter, permanent item, authoritative XP or release readiness. + +This is one deterministic vertical slice. Complete combat, economy, save, +Market, promotion, injury/recovery, difficulty, chapters and bulk content remain +frozen. + +## 2. Reconciled Authorities + +This contract resolves the three expert inputs. Implementation follows this +precedence: + +1. This frozen contract for reconciled behavior and ownership. +2. `p9_1/GAMEPLAY_EXPERIENCE_SPEC.md` for the complete numeric matrix, + transaction rules and causal values. +3. `p9_1/UX_VISUAL_FLOW_SPEC.md` for layouts, copy, controls, accessibility and + evidence states, except where this contract explicitly reconciles a conflict. +4. `p9_1/RUNTIME_ARCHITECTURE_SPEC.md` for APIs, migration and final file paths. +5. P9.0R1-R10 contracts for unchanged regression anchors. + +The expert files remain immutable source records. Developers do not amend them +to fit implementation. + +## 3. Reconciled Product Decisions + +### 3.1 Stable identities and automatic formation + +The stable member/profession IDs are the existing runtime IDs: + +```text +Hearthguard, Wayrunner, Farstring, Kindhand +``` + +Automatic priority is: + +```text +Hearthguard -> Wayrunner -> Farstring -> Kindhand +``` + +`starting_pair` is normalized by this priority. `initial_second_id` and +`marked_id` remain the identity that began second, regardless of later visible +position. Selection order never affects formation. + +A Guild addition may reform the whole line. It must preserve the two original +members' relative order while inserting the new member at its priority position. +For `Farstring + Kindhand`, adding Hearthguard therefore changes the lead from +Farstring to Hearthguard and yields `Hearthguard, Farstring, Kindhand`. The +receipt must state: + +- who was added and at which position; +- every original member whose visible number changed; +- that the original two retained their relative order; +- why the system reformed the line. + +Existing actors move to their new positions; they do not disappear and respawn. +This reconciles the UX continuity rule with the gameplay re-formation rule. + +### 3.2 Exact decision and content IDs + +```text +adaptation: EQ-002 | EQ-061 +Guild response: retain_loan | add_recruit +route: R6-01 | R6-02 | R6-03 +growth: exactly one current member ID +``` + +The Guild addition allowlist, route coverage, battle values, rewards and growth +effects are exactly those in the gameplay specification. UI does not infer an +action from `front`, `rear`, `second` or `added`; it presents domain-resolved +member IDs, facts and events. + +### 3.3 Final screen and legacy naming + +The final domain/presentation screen is `session_result`, surfaced as +`P91-FIRST-SESSION-RESULT`. During migration it maps to the historical +`AppPage.THIRD_CYCLE_RESULT`; P9.1 does not add another final page. New code and +evidence use the P9.1 name. The legacy enum remains facade-only until its stated +deletion gate is met. + +### 3.4 One result grammar + +All five result pages use exactly this order in Chinese and English: + +```text +发生了什么:{outcome_clause} +为什么:{cause_clause} +决定造成的差异:{decision_clause} +现在改变了:{changed_state_clause} +下一步:{next_action_clause} +``` + +For Result 1 only, line three is `系统编队造成的差异`. The gameplay +specification's result templates supply the facts and numeric substitutions, +but the UI formats them into these five labels. No separate `状态变化` line or +unlabeled decision chain is shown. Result 5 may append the compact chain after +line four, never before cause or changed state. + +`P91_RESULT` therefore contains already-resolved `outcome_clause`, +`cause_clause`, `decision_clause`, `changed_state_clause`, +`next_action_clause`, `reward_receipt` and `decision_chain`. It never contains +only totals that require UI-side causal reconstruction. + +## 4. Screen Snapshot And Action Contract + +Every render receives one immutable snapshot, plus named callbacks for only the +listed `available_actions`. A missing required fact renders `P91-BINDING-ERROR`; +the UI must not invent a fallback result. + +| Screen family | Required snapshot facts | Available actions | +|---|---|---| +| Boot/Title/Menu/Intro/Settings | resource status, locale/settings, caller/focus, no transient run claim | existing R8 navigation/settings actions only | +| Commission/Recruit 0-2 | four member identities, selected IDs, capacity, automatic-order preview, disabled reasons | `open_recruit`, `toggle_recruit`, `review_formation`, `home` | +| Formation review | normalized `starting_pair`, lead/second responsibility, order reason | `revise_formation`, `commit_formation`, `home` | +| Battles 1-5 | encounter/phase, party order/origin/HP/level, enemy HP, ordered semantic events, current committed decision | `pause`, `captions`; domain progression is clock/event driven | +| Results 1-5 | the five resolved result clauses, exact resource/HP/time facts, receipt state | the one next-flow action; final result also offers inspect, restart review and finish | +| Adaptation 0-1 | both options' gain/cost/foregone state, actual lead, pending/committed ID | `choose_adaptation`, then `commit_adaptation`; Back before commit | +| Guild 0-1 | current party/order/origin, Coin, loan, mapped Recruit, both exact consequences | `choose_guild_response`, then `commit_guild_response`; Back before commit | +| Route 0-1/review | three routes, pressure, target, reward, domain-resolved coverage/reason, pending ID | `choose_route`, `review_route`, `cancel_route_review`, `commit_route` | +| Growth 0-1/review | every present member, order/origin/level, exact next-battle delta, one mark | `choose_growth`, `review_growth`, `cancel_growth_review`, `commit_growth` | +| Pause/Home/Restart review | frozen caller snapshot and exact transient state to preserve or clear | resume/cancel plus separately focused confirm | + +Choice screens always open unselected. Selection is reversible and free. +Commit is the only mutation boundary, revalidates the complete precondition and +increments domain revision once. Rejected or duplicate commands change no +snapshot field, event, reward, clock or revision. + +## 5. Domain And Presentation Boundary + +The final paths are the architect's paths, not placeholder `foundation/` +directories. + +### 5.1 Exclusive foundation writes + +```text +runtime/main.gd +runtime/domain/p9_1/contracts.gd +runtime/domain/p9_1/session_state.gd +runtime/domain/p9_1/session_service.gd +runtime/domain/p9_1/battle_fixture.gd +runtime/presentation/presentation_settings.gd +runtime/presentation/battle_clock.gd +runtime/presentation/animation_adapter.gd +runtime/presentation/audio_adapter.gd +runtime/presentation/feedback_presenter.gd +runtime/ui/session_presenter.gd +runtime/ui/widgets.gd +runtime/compat/p9_0_root_facade.gd +``` + +The foundation is behavior-equivalent. It introduces one authoritative state +object, commands, snapshots, semantic events and compatibility forwarding; it +adds no P9.1-only decision branch or changed player value. + +### 5.2 Parallel extension writes after foundation PASS + +| Role | Exact write scope | +|---|---| +| Domain | new files only under `runtime/domain/p9_1/content/` and `runtime/domain/p9_1/rules/` | +| UI | new files only under `runtime/ui/p9_1/` | +| Tests | new files under `runtime/tests/p9_1/` and `runtime/tests/support/p9_1/` | +| Integration | shared entry/foundation files, exact shared P9.1 runner/manifest, and `runtime/project.godot` only when needed | + +No parallel developer edits `runtime/main.gd`, foundation API files, existing +P9.0 tests or another role's directory. Integration is the sole shared-file +owner after foundation. + +### 5.3 Domain and time invariants + +- Domain scripts do not extend/read `Node`, `Control`, SceneTree, Input, + AudioServer, textures, paths, viewport or render FPS. +- `FirstSessionService` is the only run mutator. Snapshots are deep copies. +- `BattleClock` requests named impacts; it never decides HP, rewards or result. +- An impact is keyed by encounter + phase + impact ID and commits at most once. +- Render FPS, locale, viewport, mute, reduced motion/flashes and low power do not + change the final domain snapshot. +- Low power may reduce presentation sampling, particles and nonessential idle + animation only. It preserves event order, actor state transitions, captions, + number feedback, battle duration and every transaction. + +## 6. Behavior-Equivalent Foundation Gate + +The exact non-capture P9.0 regression manifest is: + +```text +p9_0_boot_title_test.gd +p9_0_layout_test.gd +p9_0_touch_test.gd +p9_0r1_domain_test.gd +p9_0r1_dynamic_slice_test.gd +p9_0r1_layout_test.gd +p9_0r1_touch_test.gd +p9_0r2_character_animation_test.gd +p9_0r2_dynamic_slice_test.gd +p9_0r3_audio_lifecycle_test.gd +p9_0r3_battle_feedback_test.gd +p9_0r3_dynamic_slice_test.gd +p9_0r4_second_cycle_test.gd +p9_0r4_touch_test.gd +p9_0r5_first_session_arc_test.gd +p9_0r5_full_route_touch_test.gd +p9_0r6_route_touch_test.gd +p9_0r6_second_cycle_route_test.gd +p9_0r7_growth_touch_test.gd +p9_0r7_individual_growth_test.gd +p9_0r8_front_door_test.gd +p9_0r8_front_door_touch_test.gd +p9_0r9a_auto_formation_test.gd +p9_0r9a_auto_formation_touch_test.gd +p9_0r10_pair_adaptation_test.gd +p9_0r10_pair_adaptation_touch_test.gd +``` + +The foundation task must run these exact 26 scripts serially from a clean +import, require each script's unique accepted terminal marker and scan all logs +for strict diagnostics. It also reruns the preserved normal-render R8 front +door, R9A formation, R10 adaptation, and R3 feedback capture scripts at +`844x390` to detect presentation drift. Capture output is development evidence, +not a new candidate. + +Tracked `runtime/domain/run_state.gd` and the five pre-existing +`runtime/tests/p9_1_*` scripts belong to an older opening/Market lineage. P9.1 +foundation leaves them unchanged and excludes them from its pass claim. A later +integration-only commit may retire or reclassify them only with explicit source +search, replacement coverage and a contract amendment. + +## 7. P9.1 Implementation And Evidence Gate + +The gameplay specification's compact functions expand to: + +```text +6 unordered pairs x 2 click orders +12 pair/adaptation paths +24 pair/adaptation/Guild paths +72 paths through three routes +each route path x every present two- or three-member growth target +``` + +Tests assert identity, origin, relative order, actual profession events, +lead/marked/enemy HP, time, Coin, Company, item state, route coverage/reward, +exactly one Lv.2 member, commit flags and the five result clauses. Negative +coverage includes invalid IDs, stale/duplicate commits, insufficient Coin, +duplicate Recruit, absent growth member, premature reward and reset cleanup. + +Runtime evidence requires: + +- one uninterrupted parsed-ScreenTouch path through all five battles with + fallback/direct zero; +- all six pairs reaching the final result; +- small/reference/large landscape, zh_CN/EN, 130%, reduced motion/flashes, + mute/captions, contrast and low-power representative states; +- the UX specification's 25 named frames and battle-event states; +- visible party-line continuity, melee contact, ranged attack, heal/guard, + damage/heal numbers, result cause and persistent decision change; +- strict scan covering script/parse/resource/import/assertion/ObjectDB and + owned-process cleanup failures. + +Automated or visual agent evidence cannot close Owner understanding, fun, +visual/listening, physical device, packaging or release gates. + +## 8. Bounded Representative Visual Slice + +The Owner authorizes current-task image generation without another per-call +prompt. The visual task may make at most four paid image calls and spend at most +USD 5 equivalent total, including retries. It records prompts, provider task +IDs, returned cost, source/output hashes and acceptance or rejection. + +The visual slice is limited to the representative first-battle/diagnosis chain: + +```text +formation review -> approach/contact -> profession response -> damage/heal +feedback -> first causal result +``` + +It may produce a bounded layered battlefield/UI reference or replacement asset +set only after graybox composition. It must preserve the accepted four Recruit +identities, Japanese hand-painted direction, landscape party scale and event +readability. It does not authorize bulk chapter assets, new character families, +audio, video, store media or silent provider expansion. Generated material is +not integrated unless play-size review and provenance checks pass. + +## 9. Submission And Remaining Gates + +The developer legal terminal is: + +```text +Aetherbound Guild P9.1 candidate ready +``` + +or: + +```text +Aetherbound Guild P9.1 redesign required: +``` + +Submission requires a focused pushed source, clean/upstream repository, complete +contract evidence and no owned process. A fresh visible independent reviewer +then reruns the fixed candidate from zero. Only reviewer PASS authorizes a new +private H5. Packaging, TestFlight, devices, stores and release remain frozen.