Document Phase 2A2a shared gameplay contract proposals.

Propose ASC resource, authority, damage/death/respawn, and related contracts for owner review without approving or implementing them.

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