Document Phase 2A2b owner approval of shared gameplay contracts.

Record Approved and Approved-with-Conditions decisions, reject bidirectional sync and client-overlap pickup RPC, and keep runtime validation as non-blocking obligations.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-17 08:20:29 -07:00
co-authored by Cursor
parent c2fa15dbe3
commit 6aab068876
3 changed files with 667 additions and 1043 deletions
@@ -1,109 +1,131 @@
# Phase 2A1 — Open Decisions # Phase 2A — Open Decisions and Validation Obligations
| Field | Value | | Field | Value |
|---|---| |---|---|
| Status | Draft | | Status | Draft |
| Date | 2026-07-17 | | Date | 2026-07-17 |
| Phase 2A1 Git commit | `aa0058a0` | | Phase 2A1 Git commit | `aa0058a0` |
| Phase 2A2a reconciliation commit base | `9919faab` | | Phase 2A2a commit | `c2fa15db` |
| Rule | Options listed in the historical table were not selected in Phase 2A1. Phase 2A2a adds **Proposed** contract links only — **none Approved**. | | Phase 2A2b base commit | `c2fa15db` |
| Why Draft remains | Runtime validation obligations are incomplete; architecture contracts are owner-approved but not runtime-proven |
Decisions that remain open after Phase 1 static archaeology plus Phase 2A1 runtime evidence. Do not treat this document as an approved architecture contract. Architecture questions C-001 through C-015 are **Resolved by owner decision** (2026-07-17). This document no longer holds open architecture conflicts for those contracts. It preserves validation obligations, deferred implementation choices, and historical evidence.
Contracts: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md) (Status: Complete). Register: [`04-Phase2A-DecisionRegister.md`](04-Phase2A-DecisionRegister.md) (Status: Complete).
--- ---
## Phase 2A2a reconciliation ## Phase 2A2b — Owner decision reconciliation
| Field | Value | | Field | Value |
|---|---| |---|---|
| Pass | 2A2aEvidence-to-contract reconciliation | | Pass | 2A2bApply owner contract approvals |
| Status | Draft | | Owner decision date | 2026-07-17 |
| Contract document | [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md) | | Architecture status | C-001C-015 resolved |
| Decision register | [`04-Phase2A-DecisionRegister.md`](04-Phase2A-DecisionRegister.md) |
### Classification of each Phase 2A1 open decision ### Architecture questions resolved by owner decision
| Decision | Classification | Contract link(s) | Notes | | Decision | Classification | Contract | Owner state |
|---|---|---|---| |---|---|---|---|
| Canonical health source of truth | Addressed by Proposed Contract | [C-001](03-SharedGameplayContracts.md#c-001--canonical-player-resource-source-of-truth) | ASC sole SoT Proposed; not Approved | | Canonical health source of truth | Resolved by owner decision | [C-001](03-SharedGameplayContracts.md#c-001--canonical-player-resource-source-of-truth) | Approved |
| Canonical mana source of truth | Addressed by Proposed Contract | [C-001](03-SharedGameplayContracts.md#c-001--canonical-player-resource-source-of-truth), [C-003](03-SharedGameplayContracts.md#c-003--resource-access-boundary) | Merged into C-001 resource SoT + C-003 access | | Canonical mana source of truth | Resolved by owner decision | C-001, [C-003](03-SharedGameplayContracts.md#c-003--resource-access-boundary) | Approved |
| Canonical stamina source of truth | Addressed by Proposed Contract | [C-001](03-SharedGameplayContracts.md#c-001--canonical-player-resource-source-of-truth), [C-002](03-SharedGameplayContracts.md#c-002--character-default-attribute-initialization) | ASC SoT Proposed; UI deferred via C-013; whether stamina required for 2B remains design-adjacent | | Canonical stamina source of truth | Resolved by owner decision | C-001, [C-002](03-SharedGameplayContracts.md#c-002--character-default-attribute-initialization) | Approved / Approved with Conditions (init) |
| Temporary legacy mirror during reconstruction | Addressed by Proposed Contract | [C-004](03-SharedGameplayContracts.md#c-004--legacy-compatibility-policy) | ASC→legacy one-way Recommended; bidirectional Rejected by Existing Evidence | | Temporary legacy mirror during reconstruction | Resolved by owner decision | [C-004](03-SharedGameplayContracts.md#c-004--legacy-compatibility-policy) | Approved (transitional only) |
| Where damage must enter shared framework | Addressed by Proposed Contract + Blocked by Missing Runtime Evidence | [C-005](03-SharedGameplayContracts.md#c-005--damage-contract) | Boundary Proposed; runtime damage path not exercised (RE-2A1-022) | | Where damage must enter shared framework | Resolved by owner decision | [C-005](03-SharedGameplayContracts.md#c-005--damage-contract) | Approved |
| Where death threshold evaluation must occur | Addressed by Proposed Contract + Blocked by Missing Runtime Evidence | [C-007](03-SharedGameplayContracts.md#c-007--death-contract) | ASC Health ≤ 0 Proposed; death PIE not run | | Where death threshold evaluation must occur | Resolved by owner decision | [C-007](03-SharedGameplayContracts.md#c-007--death-contract) | Approved |
| Whether AnimNotifies may trigger authoritative gameplay | Addressed by Proposed Contract + Blocked by Missing Runtime Evidence | [C-009](03-SharedGameplayContracts.md#c-009--authority-contract), [C-010](03-SharedGameplayContracts.md#c-010--animation-responsibility-contract) | Notify-as-sole-authority prohibited as end state; chain not observed | | Whether AnimNotifies may trigger authoritative gameplay | Resolved by owner decision | [C-009](03-SharedGameplayContracts.md#c-009--authority-contract), [C-010](03-SharedGameplayContracts.md#c-010--animation-responsibility-contract) | Approved / Approved with Conditions |
| Required interruption and cleanup contract | Addressed by Proposed Contract + Blocked by Missing Runtime Evidence | [C-011](03-SharedGameplayContracts.md#c-011--ability-lifecycle-and-cleanup-contract) | Lifecycle Proposed; interrupt test blocked (RE-2A1-020) | | Required interruption and cleanup contract | Resolved by owner decision | [C-011](03-SharedGameplayContracts.md#c-011--ability-lifecycle-and-cleanup-contract) | Approved |
| Required respawn and HUD lifecycle contract | Addressed by Proposed Contract + Blocked by Missing Runtime Evidence | [C-008](03-SharedGameplayContracts.md#c-008--respawn-contract), [C-013](03-SharedGameplayContracts.md#c-013--hud-data-flow-contract) | GM/PC ownership + Overlay-only Proposed; RT-006 blocked | | Required respawn and HUD lifecycle contract | Resolved by owner decision | [C-008](03-SharedGameplayContracts.md#c-008--respawn-contract), [C-013](03-SharedGameplayContracts.md#c-013--hud-data-flow-contract) | Approved with Conditions / Approved |
| Pickup authority model | Addressed by Proposed Contract + Blocked by Test Environment | [C-014](03-SharedGameplayContracts.md#c-014--pickup-authority-and-replication-contract) | Server authority Proposed; overlap/2P not run | | Pickup authority model | Resolved by owner decision | [C-014](03-SharedGameplayContracts.md#c-014--pickup-authority-and-replication-contract) | Approved |
| PlayerState versus pawn ownership boundaries | Addressed by Proposed Contract | [C-012](03-SharedGameplayContracts.md#c-012--playerstate-and-pawn-ownership-contract) | Keep ASC on PlayerState Proposed; enemy accessor still defective | | PlayerState versus pawn ownership boundaries | Resolved by owner decision | [C-012](03-SharedGameplayContracts.md#c-012--playerstate-and-pawn-ownership-contract) | Approved |
| How to enable 2-client PIE for remaining evidence | Blocked by Test Environment | — (environment / harness; not a gameplay SoT contract) | See still-blocked list; C-015 observability | | How to enable 2-client PIE for remaining evidence | Validation obligation / environment | — | Not an architecture SoT conflict |
| Enhanced Input injection for automated ability tests | Blocked by Test Environment | — (harness; blocks validation of C-009/C-010/C-011) | See still-blocked list | | Enhanced Input injection for automated ability tests | Validation obligation / environment | — | Not an architecture SoT conflict |
### Duplicate / superseded handling ### Deferred implementation choices (not open architecture conflicts)
| Choice | Related contract | Resolve during |
|---|---|---|
| Exact default-GE mapping mechanism | C-002 | Implementation planning / bounded init batch |
| Gameplay Effect versus ExecutionCalculation details for damage | C-005 | Implementation planning / damage batch |
| Exact authoritative animation-timing mechanism | C-010 | Implementation planning / ability framework |
| Exact temporary observability implementation | C-015 | Implementation planning / harness |
| Whether any real consumer requires a temporary legacy shadow | C-004 | Consumer inventory during migration planning |
### Runtime validation obligations
These remain validation obligations. They are **not** architecture approval blockers. Tool inaccessibility is not runtime absence.
| Area | Status | Evidence IDs | Related contracts |
|---|---|---|---|
| Enhanced Input ability execution | Blocked by Test Environment / Tool Limitation | RE-2A1-015, 019, 021; RT-002/004/005 | C-009, C-010, C-011 |
| AnimNotify execution roles | Blocked by Missing Runtime Evidence | RE-2A1-019, 021 | C-009, C-010 |
| Ability cost mutation | Blocked by Missing Runtime Evidence / Tool Limitation | RE-2A1-014, 015 | C-003, C-004 |
| Interruption and cleanup | Blocked by Test Environment | RE-2A1-020; RT-004B | C-011 |
| Player damage / death / respawn | Blocked by Missing Implementation / Tool Limitation | RE-2A1-022; RT-006 | C-005, C-007, C-008 |
| Two-client replication | Blocked by Test Environment / Tool Limitation | RE-2A1-023026; RT-007010 | C-009, C-014 |
| Remote character selection | Blocked by Test Environment | Depends on RE-2A1-023 | C-008 related / 2E |
| Pickup authority and visibility | Blocked by Test Environment / Tool Limitation | RE-2A1-017, 018; RT-003/010 | C-014 |
| Enemy attribute mutation | Blocked by Missing Runtime Evidence / Tool Limitation | RE-2A1-028, 030; RT-011 | C-005, C-012 |
| Session behavior | Still open for Phase 2E | Not closed by 2A1 | Outside 2A contracts |
### Defects and limitations still accounted for
| Observation | Handling |
|---|---|
| `PlayerFirstSpawn` Accessed None; spawn still succeeds | C-008 failure modes; validation during respawn/spawn work |
| Amazonian/Paladin legacy defaults differ; legacy health at 0 | C-001/C-004/C-007; migration must not leave lethal legacy writers |
| ASC defaults identical; no active default GE; no granted GAs | C-002 Approved with Conditions |
| Enhanced Input / multi-client PIE tooling limits | Validation obligations; C-015 |
| Enemy inspector cannot read attributes | C-012 corrected accessor; C-015; not treated as ASC absence |
### Duplicate / superseded (historical)
| Topic | Classification | Disposition | | Topic | Classification | Disposition |
|---|---|---| |---|---|---|
| Separate health / mana / stamina “canonical SoT rows | Duplicate (resolved into one contract) | Historical rows retained below; proposal unified under **C-001** (+ init C-002, access C-003) | | Separate health/mana/stamina SoT rows | Duplicate → unified under C-001 | Historical table retained below |
| Legacy mirror vs dual SoT options overlapping C-001 | Superseded by C-004 recommendation | Historical options retained; recommendation lives in contracts/register | | Legacy mirror options | Superseded by C-004 owner decision | Bidirectional Rejected |
### Explicit remaining blocked runtime areas ---
These remain **explicitly blocked** and must stay visible until evidence exists. Tool inaccessibility is **not** runtime absence. ## Historical — Phase 2A2a reconciliation (preserved)
| Area | Status | Evidence IDs | Phase 2A2a classified decisions as Addressed by Proposed Contract only. Owner approval occurred in 2A2b. The 2A2a classifications are superseded by the 2A2b table above but retained for continuity.
|---|---|---|
| Enhanced Input ability execution | Blocked by Test Environment / Tool Limitation | RE-2A1-015, 019, 021 |
| AnimNotify authority | Blocked by Missing Runtime Evidence | RE-2A1-019, 021 (chain not executed) |
| Ability cost mutation | Blocked by Missing Runtime Evidence / Tool Limitation | RE-2A1-014, 015 |
| Ability interruption | Blocked by Test Environment | RE-2A1-020 |
| Player damage / death / respawn | Blocked by Missing Implementation / Tool Limitation | RE-2A1-022 |
| Two-client replication | Blocked by Test Environment / Tool Limitation | RE-2A1-023026 |
| Remote character selection | Blocked by Test Environment | Depends on multi-client (RE-2A1-023) |
| Pickup authority and visibility | Blocked by Test Environment / Tool Limitation | RE-2A1-017, 018 |
| Enemy attribute mutation | Blocked by Missing Runtime Evidence / Tool Limitation | RE-2A1-028, 030 |
| Session behavior | Still Open (Phase 2E scope) | Not closed by 2A1; outside 2A2a contracts |
### New defects and limitations accounted for in contracts | Pass | Status |
| Observation | Contract handling |
|---|---| |---|---|
| `PlayerFirstSpawn` Accessed None during normal spawn; spawn still succeeds | C-008 failure modes / transitional spawn path | | 2A2a | Proposed contracts; none Approved |
| Amazonian vs Paladin legacy defaults differ; both legacy health begin at 0 | C-001, C-004; death-threshold risk under C-007 | | 2A2b | Owner Approved / Approved with Conditions |
| ASC defaults stable across inspected characters; no active default GE; no granted GAs | C-002 |
| Enhanced Input unavailable via current automation | C-009C-011 validation blocked; C-015 |
| Multi-client PIE unavailable via authorized tooling | C-009, C-014 validation blocked; env decisions remain |
| Enemy attributes inaccessible via current inspector | C-012 / C-015 — tool limit ≠ absence (RE-2A1-027 vs 028) |
--- ---
## Historical Phase 2A1 open-decision table (preserved) ## Historical Phase 2A1 open-decision table (preserved)
The following table is the Phase 2A1 inventory. It is preserved for evidence continuity. Classifications above supersede “options only” for proposal purposes; **no option is Approved**. The following table is the Phase 2A1 inventory. Evidence references are retained. Architecture options in this table are historical; owner outcomes live in docs `03`/`04` and the 2A2b section above.
| Decision | Static evidence | Runtime evidence | Options | Blocking unknown | Required approval | | Decision | Static evidence | Runtime evidence | Options | Blocking unknown | Required approval |
|---|---|---|---|---|---| |---|---|---|---|---|---|
| Canonical health source of truth | Dual pools: ASC `Health`/`MaxHealth` vs `DEPRECATED_CurrentHealth`/`MaxHealth`; combat uses legacy; potions use ASC | ASC init 75/100 confirmed; Amazonian/Paladin legacy Current/Max Health = **0** at spawn; Overlay binds ASC | A) ASC only immediately B) Legacy only during reconstruction C) ASC canonical with temporary legacy mirror D) Character-specific transitional policy | Whether death/combat must keep working on legacy-zero characters before mirror | Phase 2A2 architecture contract | | Canonical health source of truth | Dual pools: ASC `Health`/`MaxHealth` vs `DEPRECATED_CurrentHealth`/`MaxHealth`; combat uses legacy; potions use ASC | ASC init 75/100 confirmed; Amazonian/Paladin legacy Current/Max Health = **0** at spawn; Overlay binds ASC | A) ASC only immediately B) Legacy only during reconstruction C) ASC canonical with temporary legacy mirror D) Character-specific transitional policy | Whether death/combat must keep working on legacy-zero characters before mirror | Phase 2A2 architecture contract**Resolved 2A2b C-001** |
| Canonical mana source of truth | Abilities use `DEPRECATED_*Mana` + `FCanUseMana`; potions modify ASC Mana | ASC Mana 25/50; Paladin legacy Mana 100/100; Amazonian legacy Mana 0/0; Paladin Ability004ManaCost CDO = 0 | A) ASC only B) Legacy only during reconstruction C) ASC + mirror D) Per-ability migration | Ability cost mutation path not runtime-proven (input Tool Limitation) | Phase 2A2 | | Canonical mana source of truth | Abilities use `DEPRECATED_*Mana` + `FCanUseMana`; potions modify ASC Mana | ASC Mana 25/50; Paladin legacy Mana 100/100; Amazonian legacy Mana 0/0; Paladin Ability004ManaCost CDO = 0 | A) ASC only B) Legacy only during reconstruction C) ASC + mirror D) Per-ability migration | Ability cost mutation path not runtime-proven (input Tool Limitation) | **Resolved 2A2b C-001/C-003** |
| Canonical stamina source of truth | ASC Stamina attrs present; no stamina widget; no stamina pickup | ASC Stamina 0/0; Amazonian legacy stamina 85/100; Paladin legacy stamina 0/0 | A) ASC only B) Legacy only C) Defer stamina until after health/mana D) Remove stamina until redesigned | Whether stamina is required for Phase 2B ability framework | Phase 2A2 + design | | Canonical stamina source of truth | ASC Stamina attrs present; no stamina widget; no stamina pickup | ASC Stamina 0/0; Amazonian legacy stamina 85/100; Paladin legacy stamina 0/0 | A) ASC only B) Legacy only C) Defer stamina until after health/mana D) Remove stamina until redesigned | Whether stamina is required for Phase 2B ability framework | **Resolved 2A2b C-001/C-002**; UI gated by C-013 |
| Temporary legacy mirror during reconstruction | No sync code found | Confirmed divergent values at spawn; Overlay shows ASC while combat vars are legacy zeros | A) One-way ASC→legacy B) One-way legacy→ASC C) Bidirectional during transition D) No mirror; switch cutover | Which systems still read legacy at runtime (death path not executed) | Phase 2A2 | | Temporary legacy mirror during reconstruction | No sync code found | Confirmed divergent values at spawn; Overlay shows ASC while combat vars are legacy zeros | A) One-way ASC→legacy B) One-way legacy→ASC C) Bidirectional during transition D) No mirror; switch cutover | Which systems still read legacy at runtime (death path not executed) | **Resolved 2A2b C-004**; whether any shadow consumer needed remains Deferred |
| Where damage must enter shared framework | Player ApplyDamage + legacy health; potions via GE; enemy inbound Missing | Damage path not exercised (no enemy attack; ability input Tool Limitation) | A) Gameplay Effect Execution only B) Shared native damage API writing ASC C) Keep ApplyDamage adapter to ASC D) Hybrid | Runtime authority of ApplyDamage vs GE still unverified | Phase 2A2 after RT damage evidence | | Where damage must enter shared framework | Player ApplyDamage + legacy health; potions via GE; enemy inbound Missing | Damage path not exercised (no enemy attack; ability input Tool Limitation) | A) Gameplay Effect Execution only B) Shared native damage API writing ASC C) Keep ApplyDamage adapter to ASC D) Hybrid | Runtime authority of ApplyDamage vs GE still unverified | **Resolved 2A2b C-005**; ExecCalc Deferred |
| Where death threshold evaluation must occur | Amazonian AnyDamage → subtract legacy health → ≤0 PlayerDeath | Not observed; legacy health already 0 at spawn implies immediate death-threshold risk if AnyDamage fires | A) ASC Health ≤0 B) Legacy ≤0 C) Shared Predicates on ASC with legacy shim D) Tag-based death | Whether AnyDamage runs with CurrentHealth=0 | Phase 2A2 + optional targeted death PIE | | Where death threshold evaluation must occur | Amazonian AnyDamage → subtract legacy health → ≤0 PlayerDeath | Not observed; legacy health already 0 at spawn implies immediate death-threshold risk if AnyDamage fires | A) ASC Health ≤0 B) Legacy ≤0 C) Shared Predicates on ASC with legacy shim D) Tag-based death | Whether AnyDamage runs with CurrentHealth=0 | **Resolved 2A2b C-007**; validation obligation remains |
| Whether AnimNotifies may trigger authoritative gameplay | Static: UseAbility* from AN_*; Multicast montage; server notify evaluation assumed | Ability/notify chain not executed (Enhanced Input Tool Limitation) | A) Forbid authoritative notify gameplay B) Allow only on Authority with validation C) Move timing to Ability Tasks D) Keep notify for VFX only | Server vs client notify execution roles unknown at runtime | Phase 2A2 after RT-004/008 | | Whether AnimNotifies may trigger authoritative gameplay | Static: UseAbility* from AN_*; Multicast montage; server notify evaluation assumed | Ability/notify chain not executed (Enhanced Input Tool Limitation) | A) Forbid authoritative notify gameplay B) Allow only on Authority with validation C) Move timing to Ability Tasks D) Keep notify for VFX only | Server vs client notify execution roles unknown at runtime | **Resolved 2A2b C-009/C-010**; timing mechanism Deferred |
| Required interruption and cleanup contract | AN_AttackComplete clears CurrentlyAttacking; montage complete pins unconnected; interrupt may skip cleanup | Interrupt test blocked; cleanup not observed | A) Ability Task end states B) Cancel tags C) Explicit EndAbility + force clear CurrentlyAttacking D) Montage blend-out notify required | Which existing actions can interrupt without asset edits | Phase 2A2 / 2B | | Required interruption and cleanup contract | AN_AttackComplete clears CurrentlyAttacking; montage complete pins unconnected; interrupt may skip cleanup | Interrupt test blocked; cleanup not observed | A) Ability Task end states B) Cancel tags C) Explicit EndAbility + force clear CurrentlyAttacking D) Montage blend-out notify required | Which existing actions can interrupt without asset edits | **Resolved 2A2b C-011**; validation obligation remains |
| Required respawn and HUD lifecycle contract | Server_RespawnPlayer ~2s; Overlay recreate risk; stale widgets possible | RT-006 blocked — respawn/HUD recreation not observed | A) Destroy+recreate Overlay each possess B) Rebind existing Overlay C) HUD owned by PC only D) PlayerState-driven Overlay | Post-respawn Owner/Avatar and Overlay instance counts | Phase 2A2 after RT-006 | | Required respawn and HUD lifecycle contract | Server_RespawnPlayer ~2s; Overlay recreate risk; stale widgets possible | RT-006 blocked — respawn/HUD recreation not observed | A) Destroy+recreate Overlay each possess B) Rebind existing Overlay C) HUD owned by PC only D) PlayerState-driven Overlay | Post-respawn Owner/Avatar and Overlay instance counts | **Resolved 2A2b C-008/C-013**; validation obligation remains |
| Pickup authority model | No authority gate; `bReplicates=false`; overlap→GE→destroy | HealthPotion runtime `bReplicates=false` confirmed; overlap/GE apply not observed | A) Server-only overlap apply + replicate actor B) Server RPC from client overlap C) GAS cue + server GE only D) Keep local for SP prototypes | Duplicate apply / client desync still unverified in MP | Phase 2A2 / 2E after RT-010 | | Pickup authority model | No authority gate; `bReplicates=false`; overlap→GE→destroy | HealthPotion runtime `bReplicates=false` confirmed; overlap/GE apply not observed | A) Server-only overlap apply + replicate actor B) Server RPC from client overlap C) GAS cue + server GE only D) Keep local for SP prototypes | Duplicate apply / client desync still unverified in MP | **Resolved 2A2b C-014**; option B rejected as default |
| PlayerState versus pawn ownership boundaries | ASC on `ARIRPlayerState`; pawn caches via InitAbilityActorInfo; Overlay via HUD | PS ASC works; pawn attribute query works; enemy ASC component present but inspector rejects actor | A) Keep ASC on PlayerState for players B) Move ASC to pawn C) Dual ownership with clear Avatar rules D) Enemy-specific ASC init contract | Enemy ASC InitAbilityActorInfo / interface exposure at runtime | Phase 2A2 | | PlayerState versus pawn ownership boundaries | ASC on `ARIRPlayerState`; pawn caches via InitAbilityActorInfo; Overlay via HUD | PS ASC works; pawn attribute query works; enemy ASC component present but inspector rejects actor | A) Keep ASC on PlayerState for players B) Move ASC to pawn C) Dual ownership with clear Avatar rules D) Enemy-specific ASC init contract | Enemy ASC InitAbilityActorInfo / interface exposure at runtime | **Resolved 2A2b C-012** |
| How to enable 2-client PIE for remaining evidence | MCP `StartPIE` lacks NumberOfPlayers; PlayIn settings exist | Read: playNumberOfClients=1, PIE_Standalone; non-persisting UI set not achieved; config save unauthorized | A) Manual editor Play settings (user) then re-run RT-007010 B) Authorize transient SetSectionProperties without Save if possible C) Defer MP until harness exists D) Dedicated listen-server process (out of scope) | Whether editor can raise clients without writing config | Environment / user authorization | | How to enable 2-client PIE for remaining evidence | MCP `StartPIE` lacks NumberOfPlayers; PlayIn settings exist | Read: playNumberOfClients=1, PIE_Standalone; non-persisting UI set not achieved; config save unauthorized | A) Manual editor Play settings (user) then re-run RT-007010 B) Authorize transient SetSectionProperties without Save if possible C) Defer MP until harness exists D) Dedicated listen-server process (out of scope) | Whether editor can raise clients without writing config | Environment / validation harness — remains open |
| Enhanced Input injection for automated ability tests | Input maps IA_Ability_* in IMC_PlayerDefault | Slate PressKey does not activate abilities; OS injection blocked by policy | A) Manual human-driven ability tests B) Authorize OS input for evidence harness C) Temporary debug console activate (unauthorized now) D) Automation Driver outside MCP | Cannot close AnimNotify/authority decisions without ability fire | Environment / Phase 2A validation harness | | Enhanced Input injection for automated ability tests | Input maps IA_Ability_* in IMC_PlayerDefault | Slate PressKey does not activate abilities; OS injection blocked by policy | A) Manual human-driven ability tests B) Authorize OS input for evidence harness C) Temporary debug console activate (unauthorized now) D) Automation Driver outside MCP | Cannot close AnimNotify/authority decisions without ability fire | Environment / validation harness — remains open |
## Explicitly not decided here ## Explicitly not decided here
- Final Gameplay Ability class layout - Final Gameplay Ability class layout
- Final attribute set schema changes - Final attribute set schema changes beyond approved SoT
- Whether to delete `DEPRECATED_*` in Phase 2A - Whether to delete `DEPRECATED_*` in a specific batch
- Per-character reconstruction order changes - Per-character reconstruction start (blocked until Phase 2A implementation sequence approved)
- Approval of any C-001C-015 contract (owner action required) - Exact deferred implementation choices listed above
## Next authorized step (outside this batch) ## Next authorized step
Wait for explicit owner approval of Proposed contracts before Phase 2A2b, Phase 2A3 implementation planning, or any Unreal implementation. Do not begin Phase 2B. Wait for explicit authorization before **Phase 2A3** implementation planning. Do not begin Unreal implementation or Phase 2B from this document alone.
File diff suppressed because it is too large Load Diff
@@ -2,35 +2,50 @@
| Field | Value | | Field | Value |
|---|---| |---|---|
| Status | Draft | | Status | Complete |
| Date | 2026-07-17 | | Date | 2026-07-17 |
| Phase | 2A2a | | Phase | 2A2b — Owner decisions applied |
| Starting Git commit | `9919faab` | | Starting Git commit | `c2fa15db` |
| Rule | All entries are **Proposed**, **Alternative**, **Deferred**, or **Blocked**. None are **Approved**. | | Owner decision date | 2026-07-17 |
| Rule | Every C-001C-015 entry has an owner state: Approved, Approved with Conditions, Deferred (sub-choice), or Rejected (alternative). |
Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Open-decision reconciliation: [`02-Phase2A-OpenDecisions.md`](02-Phase2A-OpenDecisions.md). Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Open decisions / validation obligations: [`02-Phase2A-OpenDecisions.md`](02-Phase2A-OpenDecisions.md).
--- ---
## Summary table ## Summary table
| Decision | Recommendation | Confidence | Blocking issue | Approval required | | Decision | Owner state | Recommendation (locked) | Confidence | Validation obligation | 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-001 | Approved | ASC sole SoT for H/M/S currents and maxes | High | Combat/death cutover PIE (RE-2A1-022) | Resolved |
| 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-002 | Approved with Conditions | Character-specific default GE; six attrs; fail visible; no duplicate init | Medium | Spawn/respawn per-class ASC; duplicate-init guard | Resolved |
| C-003 | Shared server ASC resource interface; atomic costs | High | Cost mutation path not runtime-proven | Yes | | C-003 | Approved | Shared server ASC resource boundary; atomic costs | High | Cost mutation path (RE-2A1-015) | Resolved |
| C-004 | ASC→legacy one-way shadow only; bidirectional rejected | High | Which consumers still need shadow until migrated | Yes | | C-004 | Approved (transitional) | ASC→legacy one-way named shadow; end state no shadow | High | Shadow inventory; no reverse write | Resolved |
| C-005 | Server damage boundary writing ASC; ApplyDamage as adapter; ExecCalc deferred | Medium | Damage/death path not exercised (RE-2A1-022) | Yes | | C-005 | Approved | Server damage boundary → ASC Health; ApplyDamage adapter only | Medium | Damage/death PIE (RE-2A1-022) | Resolved |
| 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-006 | Approved | Server restore via boundary; clamp Max*; no over-resource default | Medium | Pickup/heal apply (RE-2A1-018) | Resolved |
| C-007 | Death from ASC Health ≤ 0; idempotent; anim presentation-only | Medium | Death path not observed; legacy health 0 at spawn risk | Yes | | C-007 | Approved | Death from ASC Health ≤ 0; idempotent; anim presentation | Medium | Death path (RE-2A1-022) | Resolved |
| C-008 | GameMode + PC own respawn; ASC re-init; idempotent HUD | Medium | Respawn not observed (RE-2A1-022) | Yes | | C-008 | Approved with Conditions | GameMode orchestrates; PC handoff; pawn reports only | Medium | Respawn/HUD (RE-2A1-022) | Resolved |
| C-009 | Client intent; server validate; multicast presentation-only | Medium | Ability + 2P paths blocked (RE-2A1-015, 023) | Yes | | C-009 | Approved | Client intent; server validate; multicast presentation-only | Medium | Ability + 2P (RE-2A1-015, 023) | Resolved |
| C-010 | Animation cosmetic; server timing correlation; no notify authority | Medium | Notify chain not executed | Yes | | C-010 | Approved with Conditions | Animation presentation; timing signal into lifecycle; no sole notify authority | Medium | Interrupt/notify (RE-2A1-019020) | Resolved |
| C-011 | Shared lifecycle; guaranteed cleanup without sole AN_AttackComplete | Medium | Interrupt test blocked (RE-2A1-020) | Yes | | C-011 | Approved | Shared lifecycle; guaranteed cleanup; not sole AN_AttackComplete | Medium | Interrupt/death mid-ability (RE-2A1-020022) | Resolved |
| C-012 | Player ASC on PlayerState; pawn Avatar; enemy self-ASC separate | High | Enemy inspector Tool Limitation (RE-2A1-028) | Yes | | C-012 | Approved | Player ASC on PlayerState; pawn Avatar; enemy self-ASC + corrected accessor | High | Respawn Owner/Avatar; enemy accessor (RE-2A1-028) | Resolved |
| C-013 | Overlay-only HUD; retire UpdatePlayerHUD; defer stamina UI | High | Respawn Overlay duplication untested | Yes | | C-013 | Approved | Overlay-only HUD; retire UpdatePlayerHUD; defer stamina UI | High | Overlay idempotence after respawn | Resolved |
| C-014 | Server pickup validate/apply/destroy; replicate existence; ban naked non-rep MP pickups | Medium | Overlap apply + 2P blocked | Yes | | C-014 | Approved | Server pickup ownership; client-overlap RPC rejected as default | Medium | Overlap + 2P (RE-2A1-018, 023) | Resolved |
| C-015 | Minimum observability list; no permanent debug UI required yet | Medium | Harness not built; env limits remain | Yes | | C-015 | Approved | Minimum observability list; no permanent debug UI required | Medium | Harness/logs deliver listed fields | Resolved |
---
## Explicit rejected and deferred marks
| Item | Status | Notes |
|---|---|---|
| Bidirectional legacy synchronization | **Rejected** | C-004 |
| Client-overlap RPC as default pickup model | **Rejected** | C-014 |
| GameplayEffectExecutionCalculation choice | **Deferred** | C-005 — not selected |
| Exact default-GE mapping mechanism | **Deferred** | C-002 |
| Exact authoritative animation-timing mechanism | **Deferred** | C-010 |
| Exact temporary observability implementation | **Deferred** | C-015 |
| Whether any real consumer requires a temporary legacy shadow | **Deferred** | C-004 |
--- ---
@@ -40,17 +55,19 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---| |---|---|
| Decision ID | C-001 | | Decision ID | C-001 |
| Title | Canonical player resource source of truth | | Title | Canonical player resource source of truth |
| State | Proposed | | State | Approved |
| Recommended option | ASC attributes are sole SoT for Health, MaxHealth, Mana, MaxMana, Stamina, MaxStamina; DEPRECATED vars non-authoritative | | Owner decision | ASC attributes sole authoritative source for Health, MaxHealth, Mana, MaxMana, Stamina, MaxStamina; DEPRECATED vars not authoritative |
| Alternatives | Keep legacy SoT during reconstruction only (rejected as primary); character-specific transitional dual-SoT (rejected — prolongs P0) | | Approval conditions | None |
| Static evidence | `05-LegacyAbilityArchitecture.md` resource inventory; `06-PartialGASArchitecture.md` §8 legacy/GAS boundary; `01-ExecutiveSummary.md` P0 dual resources | | Recommended option | ASC AttributeSet sole SoT |
| Alternatives | Legacy-only SoT — Rejected as end state; dual-SoT — Rejected |
| Static evidence | `05`, `06` §8, `01` P0 |
| Runtime evidence | RE-2A1-001, 004, 005, 012, 013; RT-001, RT-002 | | 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 | | Benefits | One truth for UI, combat, potions, death |
| Risks | Breaking unconverted legacy readers if shadow/cutover incomplete | | Risks | Unconverted legacy readers break without shadow/cutover |
| Migration impact | Abilities, Amazonian death, Cleric heal, HUD, future stamina | | Migration impact | Abilities, Amazonian death, Cleric heal, HUD, stamina |
| Blocking unknowns | Whether AnyDamage fires with legacy health already 0 | | Blocking unknowns | N/A for architecture approval |
| Runtime validation | Post-init ASC match; potion vs combat both mutate ASC; death from ASC | | Validation obligation | Post-init ASC; potion+combat mutate ASC; death from ASC (RE-2A1-022) |
| 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? | | Approval question | Resolved — approved 2026-07-17 |
--- ---
@@ -60,17 +77,18 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---| |---|---|
| Decision ID | C-002 | | Decision ID | C-002 |
| Title | Character default attribute initialization | | Title | Character default attribute initialization |
| State | Proposed | | State | Approved with Conditions |
| 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 | | Owner decision | Character-specific default Gameplay Effects with listed constraints |
| Alternatives | B — Shared init GE + SetByCaller; C — Native initialization service; hybrid Max* fill transitional | | Approval conditions | Server-only; after ASC actor info + avatar valid; deterministic spawn/respawn; all six attrs; no native stamina fallback; no Blueprint CDO reliance; visible failure if missing; prevent duplicate init |
| Static evidence | `06-PartialGASArchitecture.md` §§24 default GE matrix; native Init*; DefaultAttributesGameplayEffect=None | | Recommended option | Option A — character-specific default GE |
| Runtime evidence | RE-2A1-001, 002, 011, 012 — identical ASC; no active GE; CDO legacy defaults | | Alternatives | B SetByCaller; C native service — historical alternatives; exact mapping **Deferred** |
| Benefits | Per-class balance; reuses existing GE assets/property; deterministic spawn/respawn | | Static evidence | `06` §§24 |
| Risks | Existing orphan GEs omit Max*; incomplete GE applied → broken clamps | | Runtime evidence | RE-2A1-001, 002, 011, 012 |
| Migration impact | PlayerState, character GEs, Gunslinger missing GE, spawn/respawn | | Benefits | Per-class balance; deterministic init |
| Blocking unknowns | Final per-class balance numbers (design); Gunslinger defaults | | Risks | Orphan GEs lack Max*; duplicate apply |
| Runtime validation | Per-class ASC after spawn/respawn; missing assignment visible error | | Migration impact | PlayerState, GEs, Gunslinger, spawn/respawn |
| 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? | | Validation obligation | Per-class ASC spawn/respawn; missing config visible; no duplicate GE |
| Approval question | Resolved — approved with conditions 2026-07-17 |
--- ---
@@ -80,17 +98,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---| |---|---|
| Decision ID | C-003 | | Decision ID | C-003 |
| Title | Resource-access boundary | | Title | Resource-access boundary |
| State | Proposed | | State | Approved |
| Recommended option | Shared authoritative ASC interface; atomic server cost check+mutate; no new DEPRECATED direct access | | Owner decision | Shared server-authoritative ASC boundary for all new reads, affordability, costs, restoration, max queries, gates; atomic cost commit |
| Alternatives | Per-system ad-hoc ASC reads (rejected — recreates dual writers) | | Approval conditions | None |
| Static evidence | `05` FCanUseMana / DEPRECATED costs; `07` S9; `06` boundary | | Alternatives | Per-system ad-hoc ASC — Rejected |
| Runtime evidence | RE-2A1-014, 015 — cost path not proven; Ability004ManaCost CDO=0 | | Static evidence | `05`, `07` S9, `06` |
| Benefits | Incremental migration without two SoTs; consistent affordability | | Runtime evidence | RE-2A1-014, 015 |
| Risks | Bypass of interface during hasty BP edits | | Validation obligation | Cost reduces ASC once; failed affordability no mutation |
| Migration impact | All cost/heal/damage resource call sites | | Approval question | Resolved — approved 2026-07-17 |
| 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? |
--- ---
@@ -100,17 +115,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---| |---|---|
| Decision ID | C-004 | | Decision ID | C-004 |
| Title | Legacy compatibility policy | | Title | Legacy compatibility policy |
| State | Proposed | | State | Approved (transitional only) |
| Recommended option | C — ASC→legacy one-way shadow for temporary read-only consumers; prefer D cutover when possible | | Owner decision | ASC→legacy one-way shadow only for named read-only consumers with removal condition; ASC authoritative; no legacy write-through; bidirectional Rejected; end state no shadow; Option D preferred when migratable |
| Alternatives | D — No sync / migrate first; A bidirectional **Rejected by Existing Evidence**; B legacy→ASC rejected as primary | | Approval conditions | Named consumer + removal condition required per shadow |
| Static evidence | `06` sync Missing; `01` P0 dual pools | | Alternatives | A Bidirectional — **Rejected**; B Legacy→ASC primary — Rejected; D no-sync preferred when migratable |
| Runtime evidence | RE-2A1-004, 005, 013 — divergent spawn; Overlay ASC vs combat legacy | | Static evidence | `06` sync Missing |
| Benefits | Avoids feedback loops; protects ASC from zeroed legacy writers | | Runtime evidence | RE-2A1-004, 005, 013 |
| Risks | Shadow forgotten; legacy writer still active | | Validation obligation | Shadow matches ASC; inventory whether any shadow consumer needed (**Deferred** choice) |
| Migration impact | AnyDamage, FCanUseMana readers, Server_UpdateHUD | | Approval question | Resolved — approved transitional 2026-07-17 |
| 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? |
--- ---
@@ -120,17 +132,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---| |---|---|
| Decision ID | C-005 | | Decision ID | C-005 |
| Title | Damage contract | | Title | Damage contract |
| State | Proposed | | State | Approved |
| Recommended option | Single server damage boundary writing ASC Health; legacy ApplyDamage as transitional adapter; ExecutionCalculation deferred | | Owner decision | One server damage boundary: validate source/target; preserve instigator/causer; magnitude; mitigation at one boundary; mutate ASC Health; dedupe; death eval; observable damage event; ApplyDamage adapter only |
| Alternatives | Pure GE ExecutionCalculation (Deferred/Alternative); keep ApplyDamage+legacy health (Rejected as end state) | | Approval conditions | None for boundary; ExecCalc not approved |
| Static evidence | `05` ApplyDamage paths; `09` enemy reception Missing; `06` no ExecCalc project subclasses | | Alternatives | Final GE ExecutionCalculation — **Deferred**; legacy ApplyDamage+DEPRECATED health end state — Rejected |
| Runtime evidence | RE-2A1-022, 027, 030 — damage not observed; enemy components present | | Static evidence | `05`, `09`, `06` |
| Benefits | One entry for players/enemies; dedupe; death hook | | Runtime evidence | RE-2A1-022, 027, 030 |
| Risks | Adapter gap during migration; enemy consumer still Missing | | Validation obligation | Single ASC Health reduction; no double hit; death trigger |
| Migration impact | All ApplyDamage sites; Amazonian AnyDamage; Phase 2D enemies | | Approval question | Resolved — approved 2026-07-17 |
| 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? |
--- ---
@@ -140,17 +149,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---| |---|---|
| Decision ID | C-006 | | Decision ID | C-006 |
| Title | Healing and resource restoration contract | | Title | Healing and resource restoration contract |
| State | Proposed | | State | Approved |
| Recommended option | Server restore via shared ASC boundary; clamp to Max*; consumables same path; no over-resource by default | | Owner decision | Authoritative restore via shared boundary; clamp to max; attribute source; update ASC; HUD via delegates; no over-resource by default |
| Alternatives | Allow overheal via tagged GEs only (future design) | | Approval conditions | None |
| Static evidence | `05` Cleric recover; `06`/`12` potion GEs; no AttributeSet clamp | | Alternatives | Overheal via tagged GEs not approved now |
| Runtime evidence | RE-2A1-018 — pickup apply not run | | Static evidence | `05`, `06`, `12` |
| Benefits | Overlay and combat agree; potions/abilities consistent | | Runtime evidence | RE-2A1-018 |
| Risks | Cleric transitional dual heal if not adapted | | Validation obligation | Clamp at max; potion once; Overlay update |
| Migration impact | Cleric 002, EffectActors, DEPRECATED recover | | Approval question | Resolved — approved 2026-07-17 |
| 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? |
--- ---
@@ -160,17 +166,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---| |---|---|
| Decision ID | C-007 | | Decision ID | C-007 |
| Title | Death contract | | Title | Death contract |
| State | Proposed | | State | Approved |
| Recommended option | Authoritative idempotent death from ASC Health ≤ 0; shared replicated dead state; anim presentation-only | | Owner decision | Death from ASC Health ≤ 0; authoritative; idempotent; one replicated dead state; cancel abilities; disable movement/interaction; anim presentation; shared death definition for player/enemy |
| Alternatives | Tag-only State.Dead as primary (Deferred until tags wired); legacy≤0 SoT (Rejected as end state) | | Approval conditions | None |
| Static evidence | `05` Amazonian death; `09` enemy IsDead forced false; `10` ABP Death | | Alternatives | Legacy≤0 SoT — Rejected as end state |
| Runtime evidence | RE-2A1-006, 004, 013, 022 — IsDead false; legacy health 0; death not observed | | Static evidence | `05`, `09`, `10` |
| Benefits | Idempotent; aligns Overlay and death; fixes enemy ABP ownership of truth | | Runtime evidence | RE-2A1-004, 006, 013, 022 |
| Risks | Instant death if legacy path fires before ASC cutover | | Validation obligation | One transition; no re-entry; ABP follows replicated state |
| Migration impact | PlayerDeath, Amazonian AnyDamage, enemy death ABP, tags | | Approval question | Resolved — approved 2026-07-17 |
| 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? |
--- ---
@@ -180,17 +183,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---| |---|---|
| Decision ID | C-008 | | Decision ID | C-008 |
| Title | Respawn contract | | Title | Respawn contract |
| State | Proposed | | State | Approved with Conditions |
| Recommended option | GameMode + PlayerController own server respawn lifecycle; pawn does not solely replace itself | | Owner decision | GameMode owns orchestration; PlayerController owns handoff (request/state/possess/input/HUD); dying pawn reports only — must not create/possess replacement |
| Alternatives | Pawn-owned Server_RespawnPlayer as sole owner (Rejected as primary) | | Approval conditions | Must cover duplicate-request prevention, timing, destroy, spawn, PlayerState persistence, ASC avatar teardown/re-init, default reapply, possession, input restore, HUD idempotence |
| Static evidence | `07` S8; `11` PlayerRespawn / PlayerFirstSpawn | | Alternatives | Pawn-owned sole respawn — Rejected |
| Runtime evidence | RE-2A1-010 — spawn warning; RE-2A1-022 — respawn untested | | Static evidence | `07` S8, `11` |
| Benefits | Clear ownership; ASC/HUD rebind; duplicate-respawn guard | | Runtime evidence | RE-2A1-010, 022 |
| Risks | Existing pawn respawn graphs need rewiring; PlayerFirstSpawn warning | | Validation obligation | One respawn; Owner/Avatar correct; one Overlay |
| Migration impact | GM_Dungeoneer, PC_Character, base death/respawn, HUD | | Approval question | Resolved — approved with clarification 2026-07-17 |
| 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? |
--- ---
@@ -200,17 +200,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---| |---|---|
| Decision ID | C-009 | | Decision ID | C-009 |
| Title | Authority contract | | Title | Authority contract |
| State | Proposed | | State | Approved |
| Recommended option | Client intent server validate/commit → multicast presentation-only; notify not sole authority | | Owner decision | Client intent; server validates life, ability, target, range, resources, cost, cooldown, result; authoritative owners write replicated state; multicast presentation-only |
| Alternatives | Allow Authority-gated notify gameplay indefinitely (Rejected as end state); documented narrow exceptions (Deferred) | | Approval conditions | None |
| Static evidence | `05`/`10` Input→Server→Multicast→AN→UseAbility | | Alternatives | Notify-as-sole-authority end state — Rejected |
| Runtime evidence | RE-2A1-015, 019, 021, 023026 — ability/2P not observed | | Static evidence | `05`, `10` |
| Benefits | Predictable MP; removes interrupt/notify authority risk | | Runtime evidence | RE-2A1-015, 019, 021, 023026 |
| Risks | Timing feel change during migration; temporary dual patterns | | Validation obligation | Listen-server damage once; montage both |
| Migration impact | All ability network paths; Phase 2B | | Approval question | Resolved — approved 2026-07-17 |
| 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? |
--- ---
@@ -220,17 +217,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---| |---|---|
| Decision ID | C-010 | | Decision ID | C-010 |
| Title | Animation responsibility contract | | Title | Animation responsibility contract |
| State | Proposed | | State | Approved with Conditions |
| Recommended option | Animation owns cosmetics; may correlate timing; must not solely own damage/cost/death/respawn/cleanup | | Owner decision | Animation owns presentation; may emit timing signal evaluated on authority; cannot be sole gameplay authority; signals enter ability lifecycle; cleanup not blocked by missing notify |
| Alternatives | Keep notify-authoritative hit windows (Rejected as end state) | | Approval conditions | Exact timing mechanism not prescribed this pass — **Deferred** |
| Static evidence | `10-AnimationDependencies.md` shared architecture and Networking Risk | | Alternatives | Notify-authoritative hits as end state — Rejected |
| Runtime evidence | RE-2A1-019021 — notify path not run | | Static evidence | `10` |
| Benefits | Clear cosmetic vs authority split; preserves timing via server windows | | Runtime evidence | RE-2A1-019021 |
| Risks | VFX desync vs hits; migration cost for montages | | Validation obligation | Interrupt cleanup without AN_AttackComplete |
| Migration impact | AN_Ability_*, AN_AttackComplete, Multicast_PlayMontage | | Approval question | Resolved — approved with timing clarification 2026-07-17 |
| 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? |
--- ---
@@ -240,17 +234,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---| |---|---|
| Decision ID | C-011 | | Decision ID | C-011 |
| Title | Ability lifecycle and cleanup contract | | Title | Ability lifecycle and cleanup contract |
| State | Proposed | | State | Approved |
| Recommended option | Shared lifecycle states; guaranteed cleanup on interrupt/death/destroy/timeout; no sole AN_AttackComplete dependence | | Owner decision | Shared lifecycle states; guaranteed cleanup for listed paths; AN_AttackComplete cannot be only cleanup path |
| Alternatives | Montage blend-out notify required (insufficient alone); cancel tags + EndAbility (compatible Alternative) | | Approval conditions | None |
| Static evidence | `05` empty Ends; `07` S3/S12; `10` unwired montage pins | | Alternatives | Montage-notify-only cleanup — Rejected |
| Runtime evidence | RE-2A1-020 — interrupt blocked | | Static evidence | `05`, `07` S3/S12, `10` |
| Benefits | No stuck CurrentlyAttacking; safe death mid-ability | | Runtime evidence | RE-2A1-020 |
| Risks | Under-specified per-ability cancel policy | | Validation obligation | Complete + interrupted clear locks; death mid-ability |
| Migration impact | All Begin/End/UseAbility; Phase 2B framework | | Approval question | Resolved — approved 2026-07-17 |
| 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? |
--- ---
@@ -260,17 +251,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---| |---|---|
| Decision ID | C-012 | | Decision ID | C-012 |
| Title | PlayerState and pawn ownership contract | | Title | PlayerState and pawn ownership contract |
| State | Proposed | | State | Approved |
| Recommended option | Keep player ASC/AttributeSet on PlayerState; pawn Avatar; enemy self-ASC separate contract | | Owner decision | PlayerState owns ASC/AttributeSet/cross-pawn state; pawn owns avatar/movement/anim/equipment/transient/targeting presentation; re-InitAbilityActorInfo on possess/replace; enemy self-ASC valid with corrected accessor |
| Alternatives | Move ASC to pawn (Rejected unless redesign approved); dual ownership unclear Avatar rules (Rejected) | | Approval conditions | None |
| Static evidence | `06` ownership; `09` enemy GetASC nullptr | | Alternatives | Move ASC to pawn — Rejected unless redesign |
| Static evidence | `06`, `09` |
| Runtime evidence | RE-2A1-007, 027, 028 | | Runtime evidence | RE-2A1-007, 027, 028 |
| Benefits | Survives respawn; matches existing native design | | Validation obligation | Post-respawn Owner/Avatar; enemy ASC via corrected accessor |
| Risks | Enemy accessor defect continues until 2D/2E fix | | Approval question | Resolved — approved 2026-07-17 |
| 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? |
--- ---
@@ -280,17 +268,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---| |---|---|
| Decision ID | C-013 | | Decision ID | C-013 |
| Title | HUD data-flow contract | | Title | HUD data-flow contract |
| State | Proposed | | State | Approved |
| Recommended option | Overlay/widget-controller only; retire UpdatePlayerHUD; idempotent HUD; defer stamina UI | | Owner decision | Overlay/widget-controller only; retire UpdatePlayerHUD; no UI SoT; idempotent HUD; no duplicate overlays; ASC-driven; stamina UI after canonical stamina init; UI cannot mutate gameplay |
| Alternatives | Implement UpdatePlayerHUD as second path (Rejected); recreate Overlay every possess without guard (Rejected) | | Approval conditions | None |
| Static evidence | `11` HUD matrix; `07` S10 unimplemented UpdatePlayerHUD | | Alternatives | UpdatePlayerHUD as second path — Rejected |
| Runtime evidence | RE-2A1-008, 009 — Overlay present; no stamina widget | | Static evidence | `11`, `07` S10 |
| Benefits | Single UI SoT; avoids duplicate overlays | | Runtime evidence | RE-2A1-008, 009 |
| Risks | Respawn rebind bugs if InitOverlay not idempotent | | Validation obligation | One Overlay spawn+respawn; bars track ASC |
| Migration impact | RIRHUD, Overlay, Server_UpdateHUD callers | | Approval question | Resolved — approved 2026-07-17 |
| 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? |
--- ---
@@ -300,17 +285,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---| |---|---|
| Decision ID | C-014 | | Decision ID | C-014 |
| Title | Pickup authority and replication contract | | Title | Pickup authority and replication contract |
| State | Proposed | | State | Approved |
| Recommended option | Server validate/apply/destroy; replicated existence; at-most-once; ban non-rep MP pickups without server visibility model | | Owner decision | Server owns validate/apply-once/destroy-or-deactivate/replicate existence/dedupe/attribute; client-overlap RPC **Rejected** as default; client cosmetics after authoritative collection |
| Alternatives | Server RPC from client overlap (Alternative); SP-only non-rep prototypes documented (transitional only) | | Approval conditions | None |
| Static evidence | `12-Pickups-And-Effects.md` Authority Risk | | Alternatives | Client-overlap RPC default — **Rejected**; SP non-rep as MP model — Rejected |
| Static evidence | `12` |
| Runtime evidence | RE-2A1-016, 017, 018 | | Runtime evidence | RE-2A1-016, 017, 018 |
| Benefits | Consistent MP; prevents double apply | | Validation obligation | One apply; ASC change; destroyed on all clients |
| Risks | Requires actor replication enablement; enemy null ASC destroy side effect | | Approval question | Resolved — approved 2026-07-17 |
| 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? |
--- ---
@@ -320,23 +302,31 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---| |---|---|
| Decision ID | C-015 | | Decision ID | C-015 |
| Title | Runtime observability contract | | Title | Runtime observability contract |
| State | Proposed | | State | Approved |
| Recommended option | Minimum inspectable set via logs/debugger/ASC inspect/future harness; no permanent debug UI required yet | | Owner decision | Observable: identity, net role, Owner/Avatar, attrs, active GEs, granted abilities, lifecycle, resource commitments, damage/death/respawn events, pickup apply count; via logs/debugger/ASC inspect/bounded harness; no permanent debug UI required |
| Alternatives | Permanent debug HUD (Deferred); do nothing (Rejected — blocks reconstruction trust) | | Approval conditions | None |
| Static evidence | `13-Unknowns-And-RuntimeQuestions.md` runtime groups; `15` handoff | | Alternatives | Exact harness packaging — **Deferred**; permanent debug UI — not required |
| Runtime evidence | RE-2A1-015, 023, 028, 031 — tool/environment limits | | Static evidence | `13`, `15` |
| Benefits | Makes blocked areas closable; prevents false negatives from tools | | Runtime evidence | RE-2A1-015, 023, 028, 031 |
| Risks | Harness scope creep; env still blocks Enhanced Input / 2P | | Validation obligation | Each listed field obtainable in controlled session |
| Migration impact | Logging; temporary harness; not gameplay SoT | | Approval question | Resolved — approved 2026-07-17 |
| 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? |
--- ---
## Approved architecture boundary summary
Canonical ASC attributes → shared server resource boundary → authoritative damage/healing → idempotent death → GameMode-owned respawn → ASC-driven HUD → authoritative ability lifecycle → character migration → enemy reconstruction → server-owned replicated pickups.
- PlayerState owns persistent player ASC state.
- Pawn is the player avatar.
- Enemy ASC is self-owned and requires a corrected accessor.
- Multicast animation is presentation-only.
- Legacy shadow values are temporary, one-way, named, and removable.
- No per-character reconstruction may begin before the shared contracts are planned and the initial Phase 2A implementation sequence is approved.
## Register integrity ## Register integrity
- No decision recorded as Approved. - Every C-001C-015 has an owner state.
- Recommendations are Proposed only. - Status: Complete.
- Bidirectional sync recorded as Rejected by Existing Evidence under C-004. - Runtime validation obligations are recorded but do not reopen architecture approval.
- ExecutionCalculation under C-005 is Deferred / Alternative, not selected. - No Unreal implementation authorized by this register alone.