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 |
|---|---|
| Status | Draft |
| Date | 2026-07-17 |
| Phase 2A1 Git commit | `aa0058a0` |
| Phase 2A2a reconciliation commit base | `9919faab` |
| Rule | Options listed in the historical table were not selected in Phase 2A1. Phase 2A2a adds **Proposed** contract links only — **none Approved**. |
| Phase 2A2a commit | `c2fa15db` |
| 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 |
|---|---|
| Pass | 2A2aEvidence-to-contract reconciliation |
| Status | Draft |
| Contract document | [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md) |
| Decision register | [`04-Phase2A-DecisionRegister.md`](04-Phase2A-DecisionRegister.md) |
| Pass | 2A2bApply owner contract approvals |
| Owner decision date | 2026-07-17 |
| Architecture status | C-001C-015 resolved |
### 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 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 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 |
| 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 |
| 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 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 |
| 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 |
| 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 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 | Resolved by owner decision | C-001, [C-003](03-SharedGameplayContracts.md#c-003--resource-access-boundary) | Approved |
| 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 | Resolved by owner decision | [C-004](03-SharedGameplayContracts.md#c-004--legacy-compatibility-policy) | Approved (transitional only) |
| 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 | Resolved by owner decision | [C-007](03-SharedGameplayContracts.md#c-007--death-contract) | Approved |
| 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 | Resolved by owner decision | [C-011](03-SharedGameplayContracts.md#c-011--ability-lifecycle-and-cleanup-contract) | Approved |
| 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 | Resolved by owner decision | [C-014](03-SharedGameplayContracts.md#c-014--pickup-authority-and-replication-contract) | Approved |
| 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 | Validation obligation / environment | — | Not an architecture SoT conflict |
| 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 |
|---|---|---|
| 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) |
| Legacy mirror vs dual SoT options overlapping C-001 | Superseded by C-004 recommendation | Historical options retained; recommendation lives in contracts/register |
| Separate health/mana/stamina SoT rows | Duplicate → unified under C-001 | Historical table retained below |
| 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 |
|---|---|---|
| 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 |
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.
### New defects and limitations accounted for in contracts
| Observation | Contract handling |
| Pass | Status |
|---|---|
| `PlayerFirstSpawn` Accessed None during normal spawn; spawn still succeeds | C-008 failure modes / transitional spawn path |
| Amazonian vs Paladin legacy defaults differ; both legacy health begin at 0 | C-001, C-004; death-threshold risk under C-007 |
| 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) |
| 2A2a | Proposed contracts; none Approved |
| 2A2b | Owner Approved / Approved with Conditions |
---
## 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 |
|---|---|---|---|---|---|
| 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 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 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 |
| 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 |
| 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 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 |
| 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 |
| 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 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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) | **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 | **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) | **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 | **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 | **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 | **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 | **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 | **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 | **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 | **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 / 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 / validation harness — remains open |
## Explicitly not decided here
- Final Gameplay Ability class layout
- Final attribute set schema changes
- Whether to delete `DEPRECATED_*` in Phase 2A
- Per-character reconstruction order changes
- Approval of any C-001C-015 contract (owner action required)
- Final attribute set schema changes beyond approved SoT
- Whether to delete `DEPRECATED_*` in a specific batch
- Per-character reconstruction start (blocked until Phase 2A implementation sequence approved)
- 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 |
|---|---|
| Status | Draft |
| Status | Complete |
| Date | 2026-07-17 |
| Phase | 2A2a |
| Starting Git commit | `9919faab` |
| Rule | All entries are **Proposed**, **Alternative**, **Deferred**, or **Blocked**. None are **Approved**. |
| Phase | 2A2b — Owner decisions applied |
| Starting Git commit | `c2fa15db` |
| 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
| 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 |
| Decision | Owner state | Recommendation (locked) | Confidence | Validation obligation | Approval required |
|---|---|---|---|---|---|
| C-001 | Approved | ASC sole SoT for H/M/S currents and maxes | High | Combat/death cutover PIE (RE-2A1-022) | Resolved |
| 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 | Approved | Shared server ASC resource boundary; atomic costs | High | Cost mutation path (RE-2A1-015) | Resolved |
| C-004 | Approved (transitional) | ASC→legacy one-way named shadow; end state no shadow | High | Shadow inventory; no reverse write | Resolved |
| C-005 | Approved | Server damage boundary → ASC Health; ApplyDamage adapter only | Medium | Damage/death PIE (RE-2A1-022) | Resolved |
| C-006 | Approved | Server restore via boundary; clamp Max*; no over-resource default | Medium | Pickup/heal apply (RE-2A1-018) | Resolved |
| C-007 | Approved | Death from ASC Health ≤ 0; idempotent; anim presentation | Medium | Death path (RE-2A1-022) | Resolved |
| C-008 | Approved with Conditions | GameMode orchestrates; PC handoff; pawn reports only | Medium | Respawn/HUD (RE-2A1-022) | Resolved |
| C-009 | Approved | Client intent; server validate; multicast presentation-only | Medium | Ability + 2P (RE-2A1-015, 023) | Resolved |
| C-010 | Approved with Conditions | Animation presentation; timing signal into lifecycle; no sole notify authority | Medium | Interrupt/notify (RE-2A1-019020) | Resolved |
| C-011 | Approved | Shared lifecycle; guaranteed cleanup; not sole AN_AttackComplete | Medium | Interrupt/death mid-ability (RE-2A1-020022) | Resolved |
| 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 | Approved | Overlay-only HUD; retire UpdatePlayerHUD; defer stamina UI | High | Overlay idempotence after respawn | Resolved |
| C-014 | Approved | Server pickup ownership; client-overlap RPC rejected as default | Medium | Overlap + 2P (RE-2A1-018, 023) | Resolved |
| 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 |
| 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 |
| State | Approved |
| Owner decision | ASC attributes sole authoritative source for Health, MaxHealth, Mana, MaxMana, Stamina, MaxStamina; DEPRECATED vars not authoritative |
| Approval conditions | None |
| 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 |
| 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? |
| Benefits | One truth for UI, combat, potions, death |
| Risks | Unconverted legacy readers break without shadow/cutover |
| Migration impact | Abilities, Amazonian death, Cleric heal, HUD, stamina |
| Blocking unknowns | N/A for architecture approval |
| Validation obligation | Post-init ASC; potion+combat mutate ASC; death from ASC (RE-2A1-022) |
| Approval question | Resolved — approved 2026-07-17 |
---
@@ -60,17 +77,18 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---|
| 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? |
| State | Approved with Conditions |
| Owner decision | Character-specific default Gameplay Effects with listed constraints |
| 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 |
| Recommended option | Option A — character-specific default GE |
| Alternatives | B SetByCaller; C native service — historical alternatives; exact mapping **Deferred** |
| Static evidence | `06` §§24 |
| Runtime evidence | RE-2A1-001, 002, 011, 012 |
| Benefits | Per-class balance; deterministic init |
| Risks | Orphan GEs lack Max*; duplicate apply |
| Migration impact | PlayerState, GEs, Gunslinger, spawn/respawn |
| 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 |
| 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? |
| State | Approved |
| Owner decision | Shared server-authoritative ASC boundary for all new reads, affordability, costs, restoration, max queries, gates; atomic cost commit |
| Approval conditions | None |
| Alternatives | Per-system ad-hoc ASC — Rejected |
| Static evidence | `05`, `07` S9, `06` |
| Runtime evidence | RE-2A1-014, 015 |
| Validation obligation | Cost reduces ASC once; failed affordability no mutation |
| Approval question | Resolved — approved 2026-07-17 |
---
@@ -100,17 +115,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---|
| 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? |
| State | Approved (transitional only) |
| 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 |
| Approval conditions | Named consumer + removal condition required per shadow |
| Alternatives | A Bidirectional — **Rejected**; B Legacy→ASC primary — Rejected; D no-sync preferred when migratable |
| Static evidence | `06` sync Missing |
| Runtime evidence | RE-2A1-004, 005, 013 |
| Validation obligation | Shadow matches ASC; inventory whether any shadow consumer needed (**Deferred** choice) |
| Approval question | Resolved — approved transitional 2026-07-17 |
---
@@ -120,17 +132,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---|
| 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? |
| State | Approved |
| 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 |
| Approval conditions | None for boundary; ExecCalc not approved |
| Alternatives | Final GE ExecutionCalculation — **Deferred**; legacy ApplyDamage+DEPRECATED health end state — Rejected |
| Static evidence | `05`, `09`, `06` |
| Runtime evidence | RE-2A1-022, 027, 030 |
| Validation obligation | Single ASC Health reduction; no double hit; death trigger |
| Approval question | Resolved — approved 2026-07-17 |
---
@@ -140,17 +149,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---|
| 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? |
| State | Approved |
| Owner decision | Authoritative restore via shared boundary; clamp to max; attribute source; update ASC; HUD via delegates; no over-resource by default |
| Approval conditions | None |
| Alternatives | Overheal via tagged GEs not approved now |
| Static evidence | `05`, `06`, `12` |
| Runtime evidence | RE-2A1-018 |
| Validation obligation | Clamp at max; potion once; Overlay update |
| Approval question | Resolved — approved 2026-07-17 |
---
@@ -160,17 +166,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---|
| 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? |
| State | Approved |
| 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 |
| Approval conditions | None |
| Alternatives | Legacy≤0 SoT — Rejected as end state |
| Static evidence | `05`, `09`, `10` |
| Runtime evidence | RE-2A1-004, 006, 013, 022 |
| Validation obligation | One transition; no re-entry; ABP follows replicated state |
| Approval question | Resolved — approved 2026-07-17 |
---
@@ -180,17 +183,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---|
| 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? |
| State | Approved with Conditions |
| Owner decision | GameMode owns orchestration; PlayerController owns handoff (request/state/possess/input/HUD); dying pawn reports only — must not create/possess replacement |
| Approval conditions | Must cover duplicate-request prevention, timing, destroy, spawn, PlayerState persistence, ASC avatar teardown/re-init, default reapply, possession, input restore, HUD idempotence |
| Alternatives | Pawn-owned sole respawn — Rejected |
| Static evidence | `07` S8, `11` |
| Runtime evidence | RE-2A1-010, 022 |
| Validation obligation | One respawn; Owner/Avatar correct; one Overlay |
| Approval question | Resolved — approved with clarification 2026-07-17 |
---
@@ -200,17 +200,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---|
| 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? |
| State | Approved |
| Owner decision | Client intent; server validates life, ability, target, range, resources, cost, cooldown, result; authoritative owners write replicated state; multicast presentation-only |
| Approval conditions | None |
| Alternatives | Notify-as-sole-authority end state — Rejected |
| Static evidence | `05`, `10` |
| Runtime evidence | RE-2A1-015, 019, 021, 023026 |
| Validation obligation | Listen-server damage once; montage both |
| Approval question | Resolved — approved 2026-07-17 |
---
@@ -220,17 +217,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---|
| 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? |
| State | Approved with Conditions |
| 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 |
| Approval conditions | Exact timing mechanism not prescribed this pass — **Deferred** |
| Alternatives | Notify-authoritative hits as end state — Rejected |
| Static evidence | `10` |
| Runtime evidence | RE-2A1-019021 |
| Validation obligation | Interrupt cleanup without AN_AttackComplete |
| Approval question | Resolved — approved with timing clarification 2026-07-17 |
---
@@ -240,17 +234,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---|
| 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? |
| State | Approved |
| Owner decision | Shared lifecycle states; guaranteed cleanup for listed paths; AN_AttackComplete cannot be only cleanup path |
| Approval conditions | None |
| Alternatives | Montage-notify-only cleanup — Rejected |
| Static evidence | `05`, `07` S3/S12, `10` |
| Runtime evidence | RE-2A1-020 |
| Validation obligation | Complete + interrupted clear locks; death mid-ability |
| Approval question | Resolved — approved 2026-07-17 |
---
@@ -260,17 +251,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---|
| 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 |
| State | Approved |
| 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 |
| Approval conditions | None |
| Alternatives | Move ASC to pawn — Rejected unless redesign |
| Static evidence | `06`, `09` |
| 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? |
| Validation obligation | Post-respawn Owner/Avatar; enemy ASC via corrected accessor |
| Approval question | Resolved — approved 2026-07-17 |
---
@@ -280,17 +268,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---|
| 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? |
| State | Approved |
| 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 |
| Approval conditions | None |
| Alternatives | UpdatePlayerHUD as second path — Rejected |
| Static evidence | `11`, `07` S10 |
| Runtime evidence | RE-2A1-008, 009 |
| Validation obligation | One Overlay spawn+respawn; bars track ASC |
| Approval question | Resolved — approved 2026-07-17 |
---
@@ -300,17 +285,14 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---|
| 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 |
| State | Approved |
| 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 |
| Approval conditions | None |
| Alternatives | Client-overlap RPC default — **Rejected**; SP non-rep as MP model — Rejected |
| Static evidence | `12` |
| 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? |
| Validation obligation | One apply; ASC change; destroyed on all clients |
| Approval question | Resolved — approved 2026-07-17 |
---
@@ -320,23 +302,31 @@ Companion: [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md). Ope
|---|---|
| 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? |
| State | Approved |
| 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 |
| Approval conditions | None |
| Alternatives | Exact harness packaging — **Deferred**; permanent debug UI — not required |
| Static evidence | `13`, `15` |
| Runtime evidence | RE-2A1-015, 023, 028, 031 |
| Validation obligation | Each listed field obtainable in controlled session |
| Approval question | Resolved — approved 2026-07-17 |
---
## 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
- 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.
- Every C-001C-015 has an owner state.
- Status: Complete.
- Runtime validation obligations are recorded but do not reopen architecture approval.
- No Unreal implementation authorized by this register alone.