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:
@@ -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 | 2A2a — Evidence-to-contract reconciliation |
|
||||
| Status | Draft |
|
||||
| Contract document | [`03-SharedGameplayContracts.md`](03-SharedGameplayContracts.md) |
|
||||
| Decision register | [`04-Phase2A-DecisionRegister.md`](04-Phase2A-DecisionRegister.md) |
|
||||
| Pass | 2A2b — Apply owner contract approvals |
|
||||
| Owner decision date | 2026-07-17 |
|
||||
| Architecture status | C-001–C-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-023–026; RT-007–010 | 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-023–026 |
|
||||
| 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-009–C-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-007–010 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-007–010 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-001–C-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-001–C-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-019–020) | Resolved |
|
||||
| C-011 | Approved | Shared lifecycle; guaranteed cleanup; not sole AN_AttackComplete | Medium | Interrupt/death mid-ability (RE-2A1-020–022) | 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` §§2–4 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` §§2–4 |
|
||||
| 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, 023–026 — 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, 023–026 |
|
||||
| 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-019–021 — 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-019–021 |
|
||||
| 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-001–C-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.
|
||||
|
||||
Reference in New Issue
Block a user