Files
realms-in-ruin-dev/Documentation/Phase2/04-Phase2A-DecisionRegister.md
T
tedwardsandCursor c2fa15dbe3 Document Phase 2A2a shared gameplay contract proposals.
Propose ASC resource, authority, damage/death/respawn, and related contracts for owner review without approving or implementing them.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-17 07:51:35 -07:00

343 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Phase 2A — Decision Register
| Field | Value |
|---|---|
| Status | Draft |
| Date | 2026-07-17 |
| Phase | 2A2a |
| Starting Git commit | `9919faab` |
| Rule | All entries are **Proposed**, **Alternative**, **Deferred**, or **Blocked**. None are **Approved**. |
Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Open-decision reconciliation: [`02-Phase2A-OpenDecisions.md`](02-Phase2A-OpenDecisions.md).
---
## Summary table
| Decision | Recommendation | Confidence | Blocking issue | Approval required |
|---|---|---|---|---|
| C-001 | ASC AttributeSet sole SoT for H/M/S currents and maxes | High | None for proposal; combat cutover needs death PIE later | Yes |
| C-002 | Option A — character-specific default GE after ASC actor info valid | Medium | Orphan GEs lack Max*; must fail visibly if missing | Yes |
| C-003 | Shared server ASC resource interface; atomic costs | High | Cost mutation path not runtime-proven | Yes |
| C-004 | ASC→legacy one-way shadow only; bidirectional rejected | High | Which consumers still need shadow until migrated | Yes |
| C-005 | Server damage boundary writing ASC; ApplyDamage as adapter; ExecCalc deferred | Medium | Damage/death path not exercised (RE-2A1-022) | Yes |
| C-006 | Server restore via same boundary; clamp to Max*; no over-resource by default | Medium | Pickup/heal overlap not observed (RE-2A1-018) | Yes |
| C-007 | Death from ASC Health ≤ 0; idempotent; anim presentation-only | Medium | Death path not observed; legacy health 0 at spawn risk | Yes |
| C-008 | GameMode + PC own respawn; ASC re-init; idempotent HUD | Medium | Respawn not observed (RE-2A1-022) | Yes |
| C-009 | Client intent; server validate; multicast presentation-only | Medium | Ability + 2P paths blocked (RE-2A1-015, 023) | Yes |
| C-010 | Animation cosmetic; server timing correlation; no notify authority | Medium | Notify chain not executed | Yes |
| C-011 | Shared lifecycle; guaranteed cleanup without sole AN_AttackComplete | Medium | Interrupt test blocked (RE-2A1-020) | Yes |
| C-012 | Player ASC on PlayerState; pawn Avatar; enemy self-ASC separate | High | Enemy inspector Tool Limitation (RE-2A1-028) | Yes |
| C-013 | Overlay-only HUD; retire UpdatePlayerHUD; defer stamina UI | High | Respawn Overlay duplication untested | Yes |
| C-014 | Server pickup validate/apply/destroy; replicate existence; ban naked non-rep MP pickups | Medium | Overlap apply + 2P blocked | Yes |
| C-015 | Minimum observability list; no permanent debug UI required yet | Medium | Harness not built; env limits remain | Yes |
---
## C-001 — Canonical player resource source of truth
| Field | Content |
|---|---|
| Decision ID | C-001 |
| Title | Canonical player resource source of truth |
| State | Proposed |
| Recommended option | ASC attributes are sole SoT for Health, MaxHealth, Mana, MaxMana, Stamina, MaxStamina; DEPRECATED vars non-authoritative |
| Alternatives | Keep legacy SoT during reconstruction only (rejected as primary); character-specific transitional dual-SoT (rejected — prolongs P0) |
| Static evidence | `05-LegacyAbilityArchitecture.md` resource inventory; `06-PartialGASArchitecture.md` §8 legacy/GAS boundary; `01-ExecutiveSummary.md` P0 dual resources |
| Runtime evidence | RE-2A1-001, 004, 005, 012, 013; RT-001, RT-002 |
| Benefits | One truth for UI, combat, potions, death; removes spawn divergence class of bugs |
| Risks | Breaking unconverted legacy readers if shadow/cutover incomplete |
| Migration impact | Abilities, Amazonian death, Cleric heal, HUD, future stamina |
| Blocking unknowns | Whether AnyDamage fires with legacy health already 0 |
| Runtime validation | Post-init ASC match; potion vs combat both mutate ASC; death from ASC |
| Approval question | Do you approve ASC AttributeSet as the sole canonical source of truth for Health, MaxHealth, Mana, MaxMana, Stamina, and MaxStamina, with DEPRECATED Blueprint resource variables treated as non-authoritative? |
---
## C-002 — Character default attribute initialization
| Field | Content |
|---|---|
| Decision ID | C-002 |
| Title | Character default attribute initialization |
| State | Proposed |
| Recommended option | A — Character-specific default Gameplay Effect selected by pawn/class; server apply after ASC actor info valid; explicit current+max H/M/S; visible fail on missing assignment |
| Alternatives | B — Shared init GE + SetByCaller; C — Native initialization service; hybrid Max* fill transitional |
| Static evidence | `06-PartialGASArchitecture.md` §§24 default GE matrix; native Init*; DefaultAttributesGameplayEffect=None |
| Runtime evidence | RE-2A1-001, 002, 011, 012 — identical ASC; no active GE; CDO legacy defaults |
| Benefits | Per-class balance; reuses existing GE assets/property; deterministic spawn/respawn |
| Risks | Existing orphan GEs omit Max*; incomplete GE applied → broken clamps |
| Migration impact | PlayerState, character GEs, Gunslinger missing GE, spawn/respawn |
| Blocking unknowns | Final per-class balance numbers (design); Gunslinger defaults |
| Runtime validation | Per-class ASC after spawn/respawn; missing assignment visible error |
| Approval question | Do you approve Option A (character-specific default Gameplay Effect applied server-side after ASC actor info is valid), with visible failure on missing assignment and mandatory explicit current+max Health/Mana/Stamina? |
---
## C-003 — Resource-access boundary
| Field | Content |
|---|---|
| Decision ID | C-003 |
| Title | Resource-access boundary |
| State | Proposed |
| Recommended option | Shared authoritative ASC interface; atomic server cost check+mutate; no new DEPRECATED direct access |
| Alternatives | Per-system ad-hoc ASC reads (rejected — recreates dual writers) |
| Static evidence | `05` FCanUseMana / DEPRECATED costs; `07` S9; `06` boundary |
| Runtime evidence | RE-2A1-014, 015 — cost path not proven; Ability004ManaCost CDO=0 |
| Benefits | Incremental migration without two SoTs; consistent affordability |
| Risks | Bypass of interface during hasty BP edits |
| Migration impact | All cost/heal/damage resource call sites |
| Blocking unknowns | Exact FCanUseMana body edge cases; cost timing vs montage |
| Runtime validation | Cost reduces ASC once; failed affordability no mutation |
| Approval question | Do you approve a shared server-authoritative ASC resource interface as the only allowed read/write path for new gameplay resource access, with atomic cost validation and mutation? |
---
## C-004 — Legacy compatibility policy
| Field | Content |
|---|---|
| Decision ID | C-004 |
| Title | Legacy compatibility policy |
| State | Proposed |
| Recommended option | C — ASC→legacy one-way shadow for temporary read-only consumers; prefer D cutover when possible |
| Alternatives | D — No sync / migrate first; A bidirectional **Rejected by Existing Evidence**; B legacy→ASC rejected as primary |
| Static evidence | `06` sync Missing; `01` P0 dual pools |
| Runtime evidence | RE-2A1-004, 005, 013 — divergent spawn; Overlay ASC vs combat legacy |
| Benefits | Avoids feedback loops; protects ASC from zeroed legacy writers |
| Risks | Shadow forgotten; legacy writer still active |
| Migration impact | AnyDamage, FCanUseMana readers, Server_UpdateHUD |
| Blocking unknowns | Full runtime inventory of legacy readers during death/ability |
| Runtime validation | Shadow matches after ASC change; legacy cannot overwrite ASC |
| Approval question | Do you approve ASC→legacy one-way shadow only for temporary read-only consumers, with bidirectional sync prohibited and legacy writers forbidden from silently overwriting ASC? |
---
## C-005 — Damage contract
| Field | Content |
|---|---|
| Decision ID | C-005 |
| Title | Damage contract |
| State | Proposed |
| Recommended option | Single server damage boundary writing ASC Health; legacy ApplyDamage as transitional adapter; ExecutionCalculation deferred |
| Alternatives | Pure GE ExecutionCalculation (Deferred/Alternative); keep ApplyDamage+legacy health (Rejected as end state) |
| Static evidence | `05` ApplyDamage paths; `09` enemy reception Missing; `06` no ExecCalc project subclasses |
| Runtime evidence | RE-2A1-022, 027, 030 — damage not observed; enemy components present |
| Benefits | One entry for players/enemies; dedupe; death hook |
| Risks | Adapter gap during migration; enemy consumer still Missing |
| Migration impact | All ApplyDamage sites; Amazonian AnyDamage; Phase 2D enemies |
| Blocking unknowns | Runtime authority of hit windows; block absorb design |
| Runtime validation | Single ASC Health reduction; no double hit; death trigger |
| Approval question | Do you approve a single server-authoritative damage entry that writes ASC Health, with legacy ApplyDamage limited to a transitional adapter, and ExecutionCalculation design deferred? |
---
## C-006 — Healing and resource restoration contract
| Field | Content |
|---|---|
| Decision ID | C-006 |
| Title | Healing and resource restoration contract |
| State | Proposed |
| Recommended option | Server restore via shared ASC boundary; clamp to Max*; consumables same path; no over-resource by default |
| Alternatives | Allow overheal via tagged GEs only (future design) |
| Static evidence | `05` Cleric recover; `06`/`12` potion GEs; no AttributeSet clamp |
| Runtime evidence | RE-2A1-018 — pickup apply not run |
| Benefits | Overlay and combat agree; potions/abilities consistent |
| Risks | Cleric transitional dual heal if not adapted |
| Migration impact | Cleric 002, EffectActors, DEPRECATED recover |
| Blocking unknowns | Intended overheal design (none evidenced) |
| Runtime validation | Clamp at max; potion +25 once; Overlay update |
| Approval question | Do you approve server-authoritative restoration through the shared ASC resource boundary, clamping to Max* by default, with consumables and ability heals using the same path? |
---
## C-007 — Death contract
| Field | Content |
|---|---|
| Decision ID | C-007 |
| Title | Death contract |
| State | Proposed |
| Recommended option | Authoritative idempotent death from ASC Health ≤ 0; shared replicated dead state; anim presentation-only |
| Alternatives | Tag-only State.Dead as primary (Deferred until tags wired); legacy≤0 SoT (Rejected as end state) |
| Static evidence | `05` Amazonian death; `09` enemy IsDead forced false; `10` ABP Death |
| Runtime evidence | RE-2A1-006, 004, 013, 022 — IsDead false; legacy health 0; death not observed |
| Benefits | Idempotent; aligns Overlay and death; fixes enemy ABP ownership of truth |
| Risks | Instant death if legacy path fires before ASC cutover |
| Migration impact | PlayerDeath, Amazonian AnyDamage, enemy death ABP, tags |
| Blocking unknowns | Whether AnyDamage runs at legacy 0; Paladin inbound damage path |
| Runtime validation | One death transition; no re-entry; ABP follows replicated state |
| Approval question | Do you approve authoritative, idempotent death evaluated from ASC Health ≤ 0, with animation as presentation-only and player/enemy differing only in post-death lifecycle? |
---
## C-008 — Respawn contract
| Field | Content |
|---|---|
| Decision ID | C-008 |
| Title | Respawn contract |
| State | Proposed |
| Recommended option | GameMode + PlayerController own server respawn lifecycle; pawn does not solely replace itself |
| Alternatives | Pawn-owned Server_RespawnPlayer as sole owner (Rejected as primary) |
| Static evidence | `07` S8; `11` PlayerRespawn / PlayerFirstSpawn |
| Runtime evidence | RE-2A1-010 — spawn warning; RE-2A1-022 — respawn untested |
| Benefits | Clear ownership; ASC/HUD rebind; duplicate-respawn guard |
| Risks | Existing pawn respawn graphs need rewiring; PlayerFirstSpawn warning |
| Migration impact | GM_Dungeoneer, PC_Character, base death/respawn, HUD |
| Blocking unknowns | Exact timer (~2s) intent; Overlay recreate vs rebind preference in practice |
| Runtime validation | One respawn; ASC Owner/Avatar correct; defaults reapplied; one Overlay |
| Approval question | Do you approve GameMode + PlayerController ownership of server respawn lifecycle (pawn must not solely replace itself), including ASC re-init, default reapplication, possession, input restore, and idempotent HUD bind? |
---
## C-009 — Authority contract
| Field | Content |
|---|---|
| Decision ID | C-009 |
| Title | Authority contract |
| State | Proposed |
| Recommended option | Client intent → server validate/commit → multicast presentation-only; notify not sole authority |
| Alternatives | Allow Authority-gated notify gameplay indefinitely (Rejected as end state); documented narrow exceptions (Deferred) |
| Static evidence | `05`/`10` Input→Server→Multicast→AN→UseAbility |
| Runtime evidence | RE-2A1-015, 019, 021, 023026 — ability/2P not observed |
| Benefits | Predictable MP; removes interrupt/notify authority risk |
| Risks | Timing feel change during migration; temporary dual patterns |
| Migration impact | All ability network paths; Phase 2B |
| Blocking unknowns | Server vs client notify evaluation roles at runtime |
| Runtime validation | Listen-server damage once; montage both; no client Health write |
| Approval question | Do you approve client-intent / server-validation authority, with multicast limited to presentation, and AnimNotify forbidden as sole authority for damage, costs, or state transitions? |
---
## C-010 — Animation responsibility contract
| Field | Content |
|---|---|
| Decision ID | C-010 |
| Title | Animation responsibility contract |
| State | Proposed |
| Recommended option | Animation owns cosmetics; may correlate timing; must not solely own damage/cost/death/respawn/cleanup |
| Alternatives | Keep notify-authoritative hit windows (Rejected as end state) |
| Static evidence | `10-AnimationDependencies.md` shared architecture and Networking Risk |
| Runtime evidence | RE-2A1-019021 — notify path not run |
| Benefits | Clear cosmetic vs authority split; preserves timing via server windows |
| Risks | VFX desync vs hits; migration cost for montages |
| Migration impact | AN_Ability_*, AN_AttackComplete, Multicast_PlayMontage |
| Blocking unknowns | Exact notify trigger times (Manual Editor) |
| Runtime validation | Interrupt cleanup without AN_AttackComplete; hits still server-valid |
| Approval question | Do you approve animation as cosmetic-only for authority purposes, with server-owned timing correlation allowed, and notify-driven authoritative gameplay prohibited as the end state? |
---
## C-011 — Ability lifecycle and cleanup contract
| Field | Content |
|---|---|
| Decision ID | C-011 |
| Title | Ability lifecycle and cleanup contract |
| State | Proposed |
| Recommended option | Shared lifecycle states; guaranteed cleanup on interrupt/death/destroy/timeout; no sole AN_AttackComplete dependence |
| Alternatives | Montage blend-out notify required (insufficient alone); cancel tags + EndAbility (compatible Alternative) |
| Static evidence | `05` empty Ends; `07` S3/S12; `10` unwired montage pins |
| Runtime evidence | RE-2A1-020 — interrupt blocked |
| Benefits | No stuck CurrentlyAttacking; safe death mid-ability |
| Risks | Under-specified per-ability cancel policy |
| Migration impact | All Begin/End/UseAbility; Phase 2B framework |
| Blocking unknowns | Which existing actions can interrupt without asset edits |
| Runtime validation | Complete and interrupted montages both clear locks |
| Approval question | Do you approve the shared ability lifecycle states and the rule that cleanup must be guaranteed without sole dependence on AN_AttackComplete? |
---
## C-012 — PlayerState and pawn ownership contract
| Field | Content |
|---|---|
| Decision ID | C-012 |
| Title | PlayerState and pawn ownership contract |
| State | Proposed |
| Recommended option | Keep player ASC/AttributeSet on PlayerState; pawn Avatar; enemy self-ASC separate contract |
| Alternatives | Move ASC to pawn (Rejected unless redesign approved); dual ownership unclear Avatar rules (Rejected) |
| Static evidence | `06` ownership; `09` enemy GetASC nullptr |
| Runtime evidence | RE-2A1-007, 027, 028 |
| Benefits | Survives respawn; matches existing native design |
| Risks | Enemy accessor defect continues until 2D/2E fix |
| Migration impact | InitAbilityActorInfo, EffectActor GetASC, enemies |
| Blocking unknowns | Whether enemy InitAbilityActorInfo fully exposes ASC to inspector |
| Runtime validation | Post-respawn Owner/Avatar; enemy ASC via corrected accessor |
| Approval question | Do you approve keeping player ASC/AttributeSet on PlayerState with pawn as Avatar only, and treating enemy self-ASC as a separate ownership/init contract? |
---
## C-013 — HUD data-flow contract
| Field | Content |
|---|---|
| Decision ID | C-013 |
| Title | HUD data-flow contract |
| State | Proposed |
| Recommended option | Overlay/widget-controller only; retire UpdatePlayerHUD; idempotent HUD; defer stamina UI |
| Alternatives | Implement UpdatePlayerHUD as second path (Rejected); recreate Overlay every possess without guard (Rejected) |
| Static evidence | `11` HUD matrix; `07` S10 unimplemented UpdatePlayerHUD |
| Runtime evidence | RE-2A1-008, 009 — Overlay present; no stamina widget |
| Benefits | Single UI SoT; avoids duplicate overlays |
| Risks | Respawn rebind bugs if InitOverlay not idempotent |
| Migration impact | RIRHUD, Overlay, Server_UpdateHUD callers |
| Blocking unknowns | Exact Overlay instance counts after respawn |
| Runtime validation | One Overlay spawn+respawn; bars track ASC |
| Approval question | Do you approve Overlay/widget-controller as the sole gameplay HUD data path, retirement of UpdatePlayerHUD, idempotent HUD creation, and deferred stamina UI until attribute contracts are approved? |
---
## C-014 — Pickup authority and replication contract
| Field | Content |
|---|---|
| Decision ID | C-014 |
| Title | Pickup authority and replication contract |
| State | Proposed |
| Recommended option | Server validate/apply/destroy; replicated existence; at-most-once; ban non-rep MP pickups without server visibility model |
| Alternatives | Server RPC from client overlap (Alternative); SP-only non-rep prototypes documented (transitional only) |
| Static evidence | `12-Pickups-And-Effects.md` Authority Risk |
| Runtime evidence | RE-2A1-016, 017, 018 |
| Benefits | Consistent MP; prevents double apply |
| Risks | Requires actor replication enablement; enemy null ASC destroy side effect |
| Migration impact | Four EffectActors; Phase 2E; GetASC fix interaction |
| Blocking unknowns | Duplicate apply under 2P; sphere overlap details |
| Runtime validation | One apply; ASC change; destroyed on all clients |
| Approval question | Do you approve server-owned pickup validation/apply/destroy with replicated existence, at-most-once collection, and a ban on non-replicated pickups for network gameplay without an explicit server visibility model? |
---
## C-015 — Runtime observability contract
| Field | Content |
|---|---|
| Decision ID | C-015 |
| Title | Runtime observability contract |
| State | Proposed |
| Recommended option | Minimum inspectable set via logs/debugger/ASC inspect/future harness; no permanent debug UI required yet |
| Alternatives | Permanent debug HUD (Deferred); do nothing (Rejected — blocks reconstruction trust) |
| Static evidence | `13-Unknowns-And-RuntimeQuestions.md` runtime groups; `15` handoff |
| Runtime evidence | RE-2A1-015, 023, 028, 031 — tool/environment limits |
| Benefits | Makes blocked areas closable; prevents false negatives from tools |
| Risks | Harness scope creep; env still blocks Enhanced Input / 2P |
| Migration impact | Logging; temporary harness; not gameplay SoT |
| Blocking unknowns | How to enable 2-client PIE without config save; Enhanced Input injection |
| Runtime validation | Each listed field obtainable in controlled session |
| Approval question | Do you approve the minimum observability list as a prerequisite for trusting reconstruction, without requiring permanent debug UI yet? |
---
## Register integrity
- No decision recorded as Approved.
- Recommendations are Proposed only.
- Bidirectional sync recorded as Rejected by Existing Evidence under C-004.
- ExecutionCalculation under C-005 is Deferred / Alternative, not selected.