diff --git a/AGENTS.md b/AGENTS.md index cf46b8c7..f75dc4c6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,12 +8,14 @@ Phase 8 design is Owner-accepted. Phase 9 Godot vertical-slice development is authorized only through the active Goal named by `CURRENT_CHECKPOINT.md`. Runtime source belongs under `runtime/`; accepted HTML design authority remains under `prototype/` and may not be silently rewritten to fit implementation. -The current P9.0R2 successor owns only true character frame animation and its -event timing inside the preserved Title -> Guild Yard -> tutorial battle -> -victory flow. Whole-image translation, bobbing, rotation, scale or opacity does -not satisfy character animation. Contract, difficulty, Market, equipment, -Party order, authoritative combat, persistence, chapters, device packaging, -stores and release remain frozen. +The current P9.0R3 successor owns only tutorial-battle pacing and event-bound +combat feedback inside the preserved Title -> Guild Yard -> tutorial battle -> +victory flow. It may shorten dead holds between accepted authored animation +states and add bounded damage/heal number pops, impact tint/nudge and existing +VFX timing. It must not change HP results, roles, victory, animation assets or +the opening flow. Contract, difficulty, Market, equipment, Party order, +authoritative combat, persistence, chapters, device packaging, stores and +release remain frozen. ## Originality Boundary diff --git a/CURRENT_CHECKPOINT.md b/CURRENT_CHECKPOINT.md index 57f3db98..2625e906 100644 --- a/CURRENT_CHECKPOINT.md +++ b/CURRENT_CHECKPOINT.md @@ -1,11 +1,22 @@ # Current Checkpoint -Active Goal: `docs/goals/PHASE9_0R2_CHARACTER_ANIMATION_GOAL.md` -Active contract: `docs/runtime/PHASE9_0R2_CHARACTER_ANIMATION_CONTRACT.md` +Active Goal: `docs/goals/PHASE9_0R3_BATTLE_FEEDBACK_GOAL.md` +Active contract: `docs/runtime/PHASE9_0R3_BATTLE_FEEDBACK_CONTRACT.md` Active ledger: `docs/reviews/PHASE9_GODOT_VERTICAL_SLICE_LEDGER.md` Animation repair baseline: `db75a17ce8b0a3bc702ad535fa16491debf582e4` Fixed product source: `6c72e243c2a35574a9a15ed7f22b0b44f0d0f865` -Stage: `P9_0R2_CHARACTER_ANIMATION_CANDIDATE_READY` +Battle-feedback baseline: `be17debf4ed3ebe5c3e6de2701d5e3c374de1dcb` +Stage: `P9_0R3_BATTLE_FEEDBACK_ACTIVE` + +Owner review accepts the battle direction but reports too much static hold +between actions and insufficient impact readability. P9.0R3 may only tighten +the six-phase tutorial presentation and add event-bound damage/heal number +pops with bounded hit feedback. Existing HP results, victory, roles, authored +animation assets, Title/Yard flow and Home/Restart behavior remain unchanged. +Shortest next action: implement the fixed feedback contract and verify the +same four front/rear routes. + +## P9.0R2 Accepted Automated Baseline Owner review rejected the P9.0R1 battle motion because whole static images were translated and bobbed instead of characters changing body and limb poses. @@ -34,8 +45,6 @@ The prior P9.0R1 source and evidence below remain append-only history. Its `agent_visual_reviewed` animation conclusion is superseded by Owner feedback. Economy, equipment, chapters, persistence, authoritative combat, packaging and release remain frozen. Human visual/fun/understanding remains open. -Shortest next action: Owner plays the new H5 in landscape and judges whether -the body/limb animation reads clearly at phone size. ## Historical P9.0R1 Candidate diff --git a/docs/goals/PHASE9_0R3_BATTLE_FEEDBACK_GOAL.md b/docs/goals/PHASE9_0R3_BATTLE_FEEDBACK_GOAL.md new file mode 100644 index 00000000..66ae0adb --- /dev/null +++ b/docs/goals/PHASE9_0R3_BATTLE_FEEDBACK_GOAL.md @@ -0,0 +1,66 @@ +# Phase 9.0R3 Battle Feedback Goal + +## Owner Finding + +The Owner accepts the P9.0R2 battle direction but reports that characters hold +still too long between authored actions and that HP changes lack readable +damage/heal text animation. The earliest failed boundary is impact cadence and +feedback, not character identity, battle rules or the opening flow. + +## Role And Baseline + +- Role: development task. +- Repository: `aetherbound_guild` only. +- Baseline: clean/upstream P9.0R2 closure + `be17debf4ed3ebe5c3e6de2701d5e3c374de1dcb`. +- Fixed product predecessor: + `6c72e243c2a35574a9a15ed7f22b0b44f0d0f865`. +- Active contract: `docs/runtime/PHASE9_0R3_BATTLE_FEEDBACK_CONTRACT.md`. +- Active ledger: `docs/reviews/PHASE9_GODOT_VERTICAL_SLICE_LEDGER.md`. + +## Owned Slice + +1. Replace the uniform 2.2-second post-action holds with explicit per-phase + durations that preserve anticipation, impact and a short readable recovery. +2. Emit one animated number pop only when each existing HP commit succeeds: + front damage, ranged damage, healing, coordinated damage and final damage. +3. Distinguish damage, guarded/evasive damage, healing and final damage using + text, outline and restrained color; color alone is not the payload. +4. Add bounded target tint and optional small recoil that always returns to the + resting state. Reduced motion removes travel/recoil but retains the number + and exact value. +5. Time existing VFX to the impact window instead of showing them for an entire + phase. + +## Frozen + +- HP values, formulas, roles, targets, victory and event counts. +- All character, enemy, background and VFX source assets. +- Title, Yard, front/rear choice, victory, Home and confirmed Restart flow. +- Economy, equipment, Party order, persistence, chapters and content counts. +- Audio expansion, device packaging, TestFlight, stores and release. + +## Acceptance + +- The automatic battle reaches victory faster than the P9.0R2 13.50-second + battle clock while every non-looping action reaches its terminal frame. +- No post-action dead hold exceeds 0.70 seconds. +- Each HP commit produces exactly one matching feedback payload; phase replay, + long delta, Restart confirmation, Home and clear cannot duplicate it. +- Number pops rise and fade in normal mode, remain stationary and fade in + reduced motion, and never cover health captions or the event ribbon. +- Damage values are negative, healing is positive and all values equal the + authoritative before/after HP delta. +- Existing P9.0R2 animation, P9.0R1 domain/touch/layout and design regressions + pass unchanged. +- Fresh normal-render recording visibly proves tighter cadence and all five + feedback values. Human feel, visual acceptance and phone readability remain + Owner gates. + +## Legal Terminal + +`Aetherbound Guild P9.0R3 battle feedback candidate ready` + +or + +`Aetherbound Guild P9.0R3 redesign required: ` diff --git a/docs/reviews/PHASE9_GODOT_VERTICAL_SLICE_LEDGER.md b/docs/reviews/PHASE9_GODOT_VERTICAL_SLICE_LEDGER.md index bac04982..c0d7a8ad 100644 --- a/docs/reviews/PHASE9_GODOT_VERTICAL_SLICE_LEDGER.md +++ b/docs/reviews/PHASE9_GODOT_VERTICAL_SLICE_LEDGER.md @@ -18,3 +18,4 @@ separate. | 2026-08-12 | fixed source `6c72e24`; `p9-0r2-6c72e24-attempt01` | `INVALID_MOVIE_OUTPUT_PATH` | All focused product gates and three-size captures ran, but both MovieWriter destinations were unresolved relative paths and emitted `ERR_CANT_OPEN`/`ERR_UNCONFIGURED`; no usable recording was produced. The attempt is append-only, contributes no recording judgment and was not reused. Its captures were preserved byte-identically under the declared attempt root after correcting their mistaken nested output location. | | 2026-08-12 | fixed source `6c72e24`; `p9-0r2-6c72e24-attempt02` | `P9_0R2_CHARACTER_ANIMATION_CANDIDATE_PASS` | Clean/upstream source passes animation assets `files=92 states=20 calls=4 cost_usd=0.056`, character timing `actors=5 states=20 impact_once=true death_hold=true reduced_motion=true`, both front/rear routes, parsed touch `touch=15 fallback=0 direct=0`, 13 layout fixtures, three normal-render viewport profiles and current design/loadout/provenance regressions. Two 1280x720 H.264 recordings each run 19.466667 seconds: Hearthguard/Farstring reports `front_frames=24 rear_frames=8 enemy_frames=32`; Wayrunner/Kindhand reports `front_frames=8 rear_frames=8 enemy_frames=38`. Strict diagnostics are zero. The pre-Web 44-row inventory verifies 44/44, SHA-256 `e92e2f7e1897cb8723f886cb463f878455ddc24a294000328170e17c8edd1e1a`. A later Web export log in this root packaged mistakenly nested attempt-01 captures and is classified separately as `INVALID_EXPORT_INPUT_CONTAMINATION`; it does not change the earlier product/runtime evidence judgment. | | 2026-08-12 | source `6c72e24`; Web attempts 03/04; Gallery `pPeYCfGUlBjV` | `P9_0R2_REMOTE_WEB_READY` | Isolated Git-archive Web attempt 03 excluded evidence but Godot still exposed tracked `runtime/tests` in the PCK, so it is `INVALID_EXPORT_SCOPE` and was not published. Fresh attempt 04 used the same immutable archive with a runtime-only projection that omitted `runtime/tests`. Godot PCK queries prove tests/evidence absent and representative Hearthguard attack, Wayrunner counter, Farstring release, Kindhand heal and Riftblade death frames present. Local HTML/JS/WASM/PCK MIME checks, local canvas Title-to-battle interaction and remote signed Title rendering pass with browser diagnostics zero. The clean bundle is `runtime/build/web-preview/6c72e24-r2/`; its nine-file manifest SHA-256 is `04f655e9ba23e11c21fb1f4d1c7873459d003f0db07964106bc2e93bb3c46483`. Gallery item `pPeYCfGUlBjV` is new and does not overwrite rejected `xOSqgKWpzqQt`; no share token is stored. Human phone visual/comprehension/fun, device, packaging, store and release remain open. | +| 2026-08-12 | Owner review of P9.0R2 battle | `P9_0R2_DIRECTION_ACCEPTED_P9_0R3_ACTIVE` | Owner reports the battle is broadly correct but still holds static poses too long and lacks animated damage/heal text. P9.0R3 owns only per-phase presentation cadence, exactly-once number pops, bounded target impact feedback and existing VFX timing. HP results, roles, victory, animation assets, opening flow, systems, content, device and release remain frozen. | diff --git a/docs/runtime/PHASE9_0R3_BATTLE_FEEDBACK_CONTRACT.md b/docs/runtime/PHASE9_0R3_BATTLE_FEEDBACK_CONTRACT.md new file mode 100644 index 00000000..22f8ee0c --- /dev/null +++ b/docs/runtime/PHASE9_0R3_BATTLE_FEEDBACK_CONTRACT.md @@ -0,0 +1,43 @@ +# Phase 9.0R3 Battle Feedback Runtime Contract + +## Authoritative Event Map + +| Phase | Existing commit | Required pop | Target | Tier | +|---|---|---|---|---| +| 2 | front `100 -> 82` or `100 -> 88` | `-18 格挡` or `-12 闪避减伤` | front | medium | +| 3 ranged | enemy `100 -> 64` | `-36 后排命中` | enemy | medium | +| 3 heal | front `82/88 -> 94/100` | `+12 治疗` or exact capped delta | front | medium | +| 4 | enemy `64/100 -> 34` | exact negative delta + `连携` | enemy | medium | +| 5 | enemy `34 -> 0` | `-34 终结` | enemy | large | + +The presentation payload is created inside the successful exactly-once commit. +It must never infer a result from phase entry, animation position or a button. + +## Timing And Rest State + +- Every phase declares a duration rather than sharing one fixed hold. +- The duration must exceed the longest required non-looping animation terminal + time plus a bounded recovery margin and must never preempt its impact. +- A pop is visible for at most 0.80 seconds. Normal mode uses a short scale pop, + upward travel and fade; reduced motion keeps position fixed and uses fade. +- Damage tint/recoil lasts at most 0.18 seconds. Healing tint lasts at most + 0.24 seconds. Every modulation, scale and offset returns to its base value. +- At most one payload exists in this deterministic tutorial at a time. A new + payload replaces an expired payload; duplicate commits create nothing. + +## Readability + +- Use signed Arabic numerals as the primary message, with a short Simplified + Chinese or English qualifier. +- Damage uses a warm red/gold hierarchy; healing uses mint/white. Outline and + sign preserve meaning without color. +- Pop origin follows the affected actor's current play-space position and stays + below the event ribbon and health captions at landscape and portrait sizes. + +## Evidence + +- Focused tests inspect exact payload values, signs, targets, once-only counts, + duration bounds, rest cleanup and reduced-motion behavior. +- Normal-render evidence samples pre-impact, peak and recovery frames for front + damage, ranged damage, heal, coordinated damage and final damage. +- Strict logs remain free of script, parse/resource/import and cleanup errors.