docs(runtime): close interaction transaction ownership

Record the exact J5.2 owner boundary, retail ordering, Release and connected evidence, rollback, and J5.3 handoff across architecture, roadmap, milestones, agent instructions, and durable memory.

Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
Erik 2026-07-26 11:22:07 +02:00
parent f5f7b4177f
commit 81b31857c6
11 changed files with 229 additions and 26 deletions

View file

@ -69,7 +69,9 @@ What does NOT go here:
`75930787`; J3 canonical entity/object lifetime and J4 gameplay-state
ownership are complete through `89e6b207`. J5.1 canonical selection,
combat, and target-mode ownership is complete at `b298f99f`; J5.2
interaction-transaction ownership is active from
interaction-transaction ownership is complete at `f5f7b417`, with 8,561
Release tests / 5 skips and the exact connected gate green. J5.3
combat/magic-intent ownership is active from
[`plans/2026-07-25-modern-runtime-slice-j.md`](plans/2026-07-25-modern-runtime-slice-j.md).
The [documentation map](README.md) defines how this tactical ledger relates to

View file

@ -224,9 +224,12 @@ src/
transaction/session-state owner
RuntimeCharacterState.cs -> coupled spellbook/local-player plus
character-option/run-jump owner
RuntimeActionState.cs -> exact selection/combat/target-mode owner
RuntimeActionState.cs -> exact selection/combat/target-mode and
interaction-transaction owner
InteractionState.cs -> presentation-free cursor-target mode state
-> J3J4 and J5.1 complete; J5.2 interaction transactions active
RuntimeInteractionTransactionState.cs -> use/appraisal/pickup FIFO,
exact approach and busy borrower
-> J3J4 and J5.1J5.2 complete; J5.3 combat/magic intent active
-> may reference Core, Core.Net, Content, and Plugin.Abstractions only
-> must never reference App, UI, Silk.NET, OpenAL, Arch, or ImGui
@ -487,9 +490,15 @@ exact `SelectionState`, `CombatState`, and presentation-free
`InteractionState` instances borrowed by direct/headless and graphical
consumers. App retained widgets, input controllers, plugins, session routing,
and `GameWindow` hold views or exact borrowed children; none may construct a
parallel production action owner. J5.2 moves the related use, appraisal,
pickup, and approach transaction lifetime into Runtime while preserving
retail's press-time ordering and ACE's authoritative completion.
parallel production action owner. Its `RuntimeInteractionTransactionState`
child owns the use throttle/source/target, appraisal identity, typed ordered
interaction FIFO, and exact post-arrival pickup token while borrowing the one
J4 inventory busy/request gate. App supplies picking, movement installation,
wire transport, toasts, and retained drag/pending-slot presentation. Hidden,
delete/GUID reuse, reset, disposal, callback re-entry, and transport failure
all converge without retaining a second owner or changing retail's press-time
order (`f5f7b417`). J5.3 next moves combat and spell-cast intent under this
same action root.
`GpuWorldState` owns spatial buckets only and retains the exact projection key
through loaded/pending movement, landblock retirement/reload, origin recenter,

View file

@ -474,10 +474,10 @@ useful ordering seam, but its ownership status is **partial**.
| Inbound/object-frame order | **Complete App orchestration** | `UpdateFrameOrchestrator` owns the complete typed host phase graph; `RetailInboundEventDispatcher`, `RetailLiveFrameCoordinator`, `LiveObjectFrameController`, `LiveSpatialPresentationReconciler`, streaming/input/teleport/player-mode/camera owners preserve the accepted order. `GameWindow.OnUpdate` is one profiler-scoped handoff (`e91f3102`). |
| World reveal | **Complete** | `WorldRevealCoordinator` owns login/portal readiness, generation quiescence, and the exact streaming destination reservation. Login auto-entry and portal completion close only their active generation; stale completion cannot clear its replacement. Delayed portals retain the authored tunnel and centered retail wait notice rather than force-revealing incomplete content. Quiesced destination projections may become spatially resident for renderer preparation while all availability-gated gameplay consumers stay closed. |
| Retained gameplay UI | **Mostly complete feature ownership** | `RetailUiRuntime` and focused panel/controllers own layout and behavior. `GameWindow.OnLoad` still performs substantial service composition, which is allowed until the final composition cleanup. |
| Selection/interaction | **J5.1 complete; J5.2 active** | Runtime `RuntimeActionState` owns the exact selection, combat, and presentation-free target-mode children. App `WorldSelectionQuery` remains a graphical read-only picker; App interaction controllers currently retain use/appraisal/pickup/approach transaction policy until J5.2 moves that lifetime behind Runtime commands and views without changing retail press-time behavior. |
| Selection/interaction | **J5.1J5.2 complete; J5.3 active** | Runtime `RuntimeActionState` owns the exact selection, combat, target-mode, and `RuntimeInteractionTransactionState` children. The transaction child owns use/appraisal/pickup identity, the typed ordered FIFO, and exact post-arrival token while borrowing J4's sole inventory busy/request gate. App `WorldSelectionQuery`, movement/transport adapters, lighting, toasts, drag/drop, and pending-slot drawing remain presentation. No App transaction fallback or delegate queue remains (`b298f99f`, `f5f7b417`). |
| Landblock presentation | **Complete** | `LandblockBuildFactory` owns the captured-origin DAT transaction; concrete render/physics/DAT-static publishers and `LandblockPresentationPipeline` own typed-meter publication and exact retryable retirement. `StreamingController` owns stable destination/control/unload/Near/Far queues and destination reservation. CPU mesh-cache restaging requires an exact live owner. `StreamingOriginRecenterCoordinator` serializes old-window retirement with teleport/session origin lifetimes. `GameWindow` retains construction and one pipeline field only (`c79d0a49`, closeout `4a205a3e`; Slice E closeout `91e82c3c`). |
| Render-frame orchestration | **Complete** | `RenderFrameOrchestrator` owns the GPU-flight, resource, world/PView/shared-alpha, private-presentation, diagnostics, screenshot, and recovery graph. `GameWindow.OnRender` takes one logical window-size snapshot and performs one immutable handoff (`9d7df1bf`). |
| Unified `GameEntity` | **Slice J active at J5.2** | Canonical identity, retained-object lifetime, direct views, ordered entity/object deltas, J4 gameplay state, and J5.1 action state share failure-safe Runtime owners while exact graphical sidecars stay in App. J5.2J7 move interaction transactions, movement/physics/combat, and world authority before one Runtime composition root. |
| Unified `GameEntity` | **Slice J active at J5.3** | Canonical identity, retained-object lifetime, direct views, ordered entity/object deltas, J4 gameplay state, and J5.1J5.2 action/interaction state share failure-safe Runtime owners while exact graphical sidecars stay in App. J5.3J7 move combat/magic intent, movement/physics/projectiles, and remaining world authority before one Runtime composition root. |
### 4.3 Revised extraction sequence

View file

@ -1,6 +1,6 @@
# acdream — strategic roadmap
**Status:** Living document. Updated 2026-07-26. **M3 landed; M4 is active.** M3's retail casting/UI, R6 locomotion/collision/projectile/teleport/radar rebaseline, deterministic fresh-login/portal world lifecycle, and final two-client portal observer flow are user-gated. All eight slices of the behavior-preserving ownership campaign in [`docs/architecture/code-structure.md`](../architecture/code-structure.md), their automated closeout, and the user's connected visual matrix are complete. Modern Runtime J3 canonical entity/object lifetime and J4 gameplay-state ownership are closed at `89e6b207`; J5.1 canonical selection/combat/target-mode ownership is closed at `b298f99f`, and J5.2 interaction transactions are active. Issue #225's lifestone/particle alpha comparison remains a separate rendering visual gate.
**Status:** Living document. Updated 2026-07-26. **M3 landed; M4 is active.** M3's retail casting/UI, R6 locomotion/collision/projectile/teleport/radar rebaseline, deterministic fresh-login/portal world lifecycle, and final two-client portal observer flow are user-gated. All eight slices of the behavior-preserving ownership campaign in [`docs/architecture/code-structure.md`](../architecture/code-structure.md), their automated closeout, and the user's connected visual matrix are complete. Modern Runtime J3 canonical entity/object lifetime and J4 gameplay-state ownership are closed at `89e6b207`; J5.1 canonical selection/combat/target-mode ownership is closed at `b298f99f`, J5.2 interaction transactions are closed at `f5f7b417`, and J5.3 combat/magic intent is active. Issue #225's lifestone/particle alpha comparison remains a separate rendering visual gate.
**Purpose:** One source of truth for where the project is and where it's going. Every observed defect or missing feature has a named phase that owns it; when something looks wrong in-game, look here to find the phase that'll address it. Implementation details live in per-phase specs under `docs/superpowers/specs/`, not in this file.
---
@ -1742,8 +1742,15 @@ port in any phase — no separate listing here.
> temporary target-mode graph; every graphical/direct consumer borrows it,
> and the App fallback owner is deleted. Its 182 Runtime tests, 3,779 App
> tests / 3 skips, 8,550-test / 5-skip complete Release suite, and
> exact-binary seven-checkpoint lifecycle/reconnect gate pass. J5.2
> interaction-transaction ownership is active.
> exact-binary seven-checkpoint lifecycle/reconnect gate pass. J5.2 is
> complete at `f5f7b417`: Runtime owns the strict use gate, exact use and
> appraisal identity, typed ordered interaction FIFO, and exact post-arrival
> pickup token while borrowing J4's sole inventory busy/request gate. App
> retains picking, movement/transport, and presentation only; the App delegate
> queue and transaction fields are deleted. Its 197 Runtime tests, 3,775 App
> tests / 3 skips, 8,561-test / 5-skip complete Release suite, and exact-binary
> seven-checkpoint lifecycle/reconnect gate pass. J5.3 combat/magic-intent
> ownership is active.
> The historical exact cutover
> rollback remains
> `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`. Slice H is complete:

View file

@ -217,8 +217,14 @@ residency is `0/0/0` at every stable checkpoint and teardown converges. Slice I
combat, and temporary target mode; every graphical/direct consumer borrows
those exact children, and the App fallback owner is deleted. Its 182 Runtime
tests, 3,779 App tests / 3 skips, 8,550 full Release tests / 5 skips, and
exact-binary seven-checkpoint lifecycle/reconnect route pass. J5.2
interaction-transaction ownership is active under
exact-binary seven-checkpoint lifecycle/reconnect route pass. J5.2 completed
at `f5f7b417`: one Runtime child owns use throttling/source/target,
appraisal identity, typed ordered interactions, and exact post-arrival
pickup state while borrowing the sole J4 inventory busy/request gate. The
App queue and transaction fields are deleted. Its 197 Runtime tests, 3,775
App tests / 3 skips, 8,561 full Release tests / 5 skips, and exact-binary
seven-checkpoint lifecycle/reconnect route pass. J5.3 combat/magic-intent
ownership is active under
[`2026-07-25-modern-runtime-slice-j.md`](2026-07-25-modern-runtime-slice-j.md).
Slice-I closeout evidence is
[`../research/2026-07-25-slice-i7-closeout.md`](../research/2026-07-25-slice-i7-closeout.md).
@ -242,6 +248,8 @@ Slice-J4.5 closeout evidence is
[`../research/2026-07-26-slice-j4-5-gameplay-state-closeout.md`](../research/2026-07-26-slice-j4-5-gameplay-state-closeout.md).
Slice-J5.1 closeout evidence is
[`../research/2026-07-26-slice-j5-1-canonical-action-state.md`](../research/2026-07-26-slice-j5-1-canonical-action-state.md).
Slice-J5.2 closeout evidence is
[`../research/2026-07-26-slice-j5-2-interaction-transactions.md`](../research/2026-07-26-slice-j5-2-interaction-transactions.md).
The historical exact G4 visual rollback remains
`git revert ef1d263337997bb030eadb7b8e71d73dc659907a`.

View file

@ -2,7 +2,7 @@
**Date:** 2026-07-24
**Status:** Slices AI and J0J3 are complete. Flat-authoritative collision, zero-
**Status:** Slices AI, J0J4, and J5.1J5.2 are complete. Flat-authoritative collision, zero-
allocation resolve scratch, parsed-graph removal, connected correctness/
lifetime acceptance, and Slice-I closeout landed 2026-07-25. Slices FL were
explicitly approved 2026-07-24. Slice J0J1 established the enforced Runtime
@ -16,7 +16,8 @@ ownership into Runtime at `011efbea`; J4.3 moved the coupled magic/player-sheet
owner into Runtime at `d02a12ce`; J4.4 moved character settings/projections
and the shared typed state-command seam at `dcb61efb`; J4.5 closed canonical
gameplay-state ownership at `89e6b207`. J5 movement, physics, interaction,
and combat ownership is the active execution point.
and combat ownership is active at J5.3 after canonical action state
(`b298f99f`) and interaction transactions (`f5f7b417`) moved to Runtime.
**Scope:** Reconcile and sequence the existing Modern Pipeline (`MP`) and
Linux/headless (`LH`) tracks using the 2026-07-24 connected performance audit.
@ -1274,7 +1275,7 @@ single Runtime shortcut/spellbook/inventory owners, graphical/no-window
command parity, failure-safe combined ledger, 8,544-test Release suite,
exact-binary lifecycle/reconnect gate, and canonical nine-stop route pass.
J5 movement/physics/interaction/combat ownership is the current execution
point.
point. J5.1J5.2 are complete; J5.3 combat/magic intent is active.
Evidence:
[`../research/2026-07-25-slice-g5-production-profile.md`](../research/2026-07-25-slice-g5-production-profile.md)
and

View file

@ -290,8 +290,16 @@ UI, session routing, typed commands/views, and shutdown borrow its children;
the App interaction-state class and private controller fallback are gone.
Its 182 Runtime tests, 3,779 App tests / 3 skips, 8,550 complete Release tests /
5 skips, and exact-binary seven-checkpoint lifecycle/reconnect gate pass.
J5.2 interaction-transaction ownership is next. Evidence:
[`../research/2026-07-26-slice-j5-1-canonical-action-state.md`](../research/2026-07-26-slice-j5-1-canonical-action-state.md).
J5.2 completed at `f5f7b417`. Runtime now owns the use throttle and exact
use/appraisal/pickup transaction identities, typed ordered interaction FIFO,
and post-arrival pickup token while borrowing J4's sole busy/request gate.
App retains picking, movement/transport, lighting, toasts, drag/drop, and
pending-slot presentation. Its 197 Runtime tests, 3,775 App tests / 3 skips,
8,561 complete Release tests / 5 skips, and exact-binary seven-checkpoint
lifecycle/reconnect gate pass. J5.3 combat/magic intent is next. Evidence:
[`../research/2026-07-26-slice-j5-1-canonical-action-state.md`](../research/2026-07-26-slice-j5-1-canonical-action-state.md)
and
[`../research/2026-07-26-slice-j5-2-interaction-transactions.md`](../research/2026-07-26-slice-j5-2-interaction-transactions.md).
- Move presentation-free movement interpretation, authoritative/predicted
physics state, selection identity, approach/use transactions, combat intent,

View file

@ -1,6 +1,6 @@
# Modern runtime Slice J5 — movement, physics, interaction, and combat
**Status:** ACTIVE — J5.1 complete; J5.2 next
**Status:** ACTIVE — J5.1J5.2 complete; J5.3 next
**Parent:** `2026-07-25-modern-runtime-slice-j.md`, J5
**Production base:** `2c67a2c3`
**Authorization:** the user approved Slices FL, including the Slice J
@ -86,7 +86,7 @@ commands to Runtime. The camera may not write the player heading directly.
|---|---|---|
| J5.0 owner/retail inventory | complete | `docs/research/2026-07-26-slice-j5-owner-and-retail-order-inventory.md` |
| J5.1 canonical action state | complete | `b298f99f913249d299796e6a71f7a9b6b283ac1a`; one Runtime selection/combat/target-mode owner; 182 Runtime tests, 3,779 App tests / 3 skips, 8,550 complete Release tests / 5 skips, exact-binary connected lifecycle/reconnect pass |
| J5.2 interaction transactions | pending | use/appraisal/pickup/approach state and transport ordering |
| J5.2 interaction transactions | complete | `f5f7b4177f449ebcad9724bfea263ef73ab60255`; one Runtime transaction owner; 197 Runtime tests, 3,775 App tests / 3 skips, 8,561 complete Release tests / 5 skips, exact-binary connected lifecycle/reconnect pass |
| J5.3 combat and magic intent | pending | attack/mode/target/cast owners and typed input |
| J5.4 local movement and outbound cadence | pending | controller, body, movement managers, MTS/AP/jump cadence |
| J5.5 per-session physics and remote simulation | pending | engine/scratch/shadows/remote canonical body |
@ -187,6 +187,29 @@ Gate:
reentrancy, reset/disposal;
- normalized graphical/direct ordered traces and no duplicate busy owner.
Completed 2026-07-26 at
`f5f7b4177f449ebcad9724bfea263ef73ab60255`.
`RuntimeInteractionTransactionState`, owned beneath `RuntimeActionState`, now
owns the retail 200-ms use gate, exact use source/target identity, pending and
current appraisal identity, typed ordered interactions, and the exact
post-arrival pickup token. It borrows—not duplicates—J4's
`InventoryTransactionState`, so ordinary Use transfers one busy reference to
authoritative UseDone and pickup retains the same one-request-at-a-time gate.
App retains world rays, lighting, movement installation, transport, toasts,
drag/drop, and pending-slot presentation. The old App delegate queue and App
transaction fields are deleted.
Identity-bound work is cancelled by exact local incarnation on delete and by
server GUID on Hidden. Re-entrant reset, disposal, transport failure, stale
approach completion, and GUID reuse cannot resurrect a transaction or strand
the busy gate. Focused near/far use, carried-use, appraisal, item-on-target,
pickup, pending-slot, hidden/delete, reset, and callback-order tests pass.
The exact-binary connected report is
`logs/connected-world-gate-20260726-111330/report.json`: 7/7 ready
checkpoints, two graceful code-zero exits, zero failures or invariant
violations, and only the 25 expected world-edge landblock misses. Evidence:
[`../research/2026-07-26-slice-j5-2-interaction-transactions.md`](../research/2026-07-26-slice-j5-2-interaction-transactions.md).
## J5.3 — combat and magic intent
Move:
@ -381,6 +404,12 @@ J5.1 rollback:
git revert b298f99f913249d299796e6a71f7a9b6b283ac1a
```
J5.2 rollback:
```text
git revert f5f7b4177f449ebcad9724bfea263ef73ab60255
```
## Acceptance
J5 is complete only when:

View file

@ -0,0 +1,121 @@
# Slice J5.2 — canonical interaction transactions
**Date:** 2026-07-26
**Production commit:** `f5f7b4177f449ebcad9724bfea263ef73ab60255`
**Parent plan:** `docs/plans/2026-07-26-modern-runtime-slice-j5.md`
## Result
Interaction transaction authority now lives beneath the canonical Runtime
action root. `RuntimeInteractionTransactionState` owns:
- retail's strict 200-ms local use throttle;
- last ordinary or targeted-use source/target identity;
- pending and current appraisal identity;
- the typed frame-ordered Activate/Use/Pickup FIFO;
- the exact pending pickup identity, inventory-placement token, and
post-arrival movement token;
- reset, disposal, failure, and ownership accounting.
It borrows the exact `RuntimeInventoryState.Transactions` instance. There is no
second busy counter, inventory request, object table, or pending-pickup
authority.
App remains the graphical adapter. It performs world picking, selection
lighting, approach installation, wire transport, toasts, retained drag/drop,
and pending-slot drawing. The former App `OutboundInteractionQueue` and the
use/appraisal/pickup transaction fields in App controllers are deleted.
## Retail order preserved
The implementation preserves the named-retail order recorded in
`docs/research/2026-07-26-slice-j5-owner-and-retail-order-inventory.md`:
- `ItemHolder::UseObject @ 0x00588A80` applies the strict local use gate,
emits ordinary Use immediately after policy accepts it, and transfers one
shared UI-busy reference to the server completion;
- `ClientUISystem::Handle_Item__UseDone @ 0x00564900` releases exactly one
busy reference;
- targeted Use stores the source until a compatible target is acquired, then
emits the exact source/target pair;
- pickup alone retains the existing local approach transaction and sends once
after the exact natural completion token.
No new polling, background thread, asynchronous command seam, speculative
approach for ordinary Use, or frame of gameplay latency was introduced.
## Lifetime and failure behavior
- Queued work carries server GUID, optional exact Runtime local ID, and
optional exact `ClientObject` identity.
- Hidden cancels every queued/deferred transaction for that server object.
- Deletion cancels only the removed local incarnation, so GUID reuse cannot
erase or execute replacement work.
- A captured frame drains in FIFO order; re-entrant additions wait for the
next frame.
- Re-entrant reset/disposal stops the captured suffix and cannot resurrect
targeted-use or pickup state.
- Appraisal transport failure rolls back only the busy reference acquired by
that exact request.
- A dispatched ordinary Use remains busy until authoritative UseDone; later
movement cancellation, Hidden, or deletion cannot retract or duplicate its
packet.
- Runtime action disposal precedes inventory disposal because the transaction
child borrows the exact inventory gate.
## Automated gates
All commands ran in Release:
- `dotnet test tests/AcDream.Runtime.Tests/AcDream.Runtime.Tests.csproj`:
197 passed.
- `dotnet test tests/AcDream.App.Tests/AcDream.App.Tests.csproj`:
3,775 passed / 3 fixture-generator skips.
- `dotnet build AcDream.slnx -c Release --no-restore`: passed.
- `dotnet test AcDream.slnx -c Release --no-build --no-restore`:
8,561 passed / 5 established skips.
- `git diff --check`: passed.
Focused tests cover the 199/200-ms throttle boundary, ordinary and targeted
Use, UseDone, appraisal replacement/refresh/failure, typed FIFO and re-entrant
drain, Hidden/delete cancellation, exact approach completion, transport
failure, pending-slot acceptance/failure, GUID reuse, reset/disposal, and
two-instance isolation.
## Exact-binary connected gate
Report:
`logs/connected-world-gate-20260726-111330/report.json`.
The report identifies exact source/binary commit
`f5f7b4177f449ebcad9724bfea263ef73ab60255` and passes:
- six capped login/outdoor/world-edge/dungeon/revisit checkpoints;
- one fresh uncapped-process reconnect checkpoint;
- 7/7 complete reveal/readiness checkpoints;
- zero invariant failures and zero render-scene mismatches;
- 243.534-second capped and 61.619-second reconnect sessions;
- graceful logout and code-zero exit for both processes;
- zero failures;
- one expected warning covering 25 empty world-edge landblocks.
## Divergence audit
This is an ownership-only move of accepted retail-faithful behavior. It adds
no approximation, alternate algorithm, polling mirror, or asynchronous seam.
No divergence-register row was added or retired.
## Rollback
```text
git revert f5f7b4177f449ebcad9724bfea263ef73ab60255
```
Revert J5 sub-slices in reverse order. Do not revert J4's canonical inventory
owner or Slice I's flat-collision cutover to mask a later action-owner defect.
## Next boundary
J5.3 moves combat attack and spell-cast intent into Runtime. App continues to
own the combat/spell widgets, camera tracking, animations, audio, particles,
DAT catalog/icon/formula presentation, and response text.