diff --git a/AGENTS.md b/AGENTS.md index 7add1a61..5d6c7e4a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -275,8 +275,14 @@ routing, typed commands/views, and shutdown borrow its children, while the App interaction-state class and private controller fallback are deleted. Runtime tests pass 182/182, App tests pass 3,779/3 skips, the complete Release suite passes 8,550/5 skips, and the exact-binary seven-checkpoint -lifecycle/reconnect gate passes with graceful exits and zero failures. J5.2 -interaction-transaction ownership is active. +lifecycle/reconnect gate passes with graceful exits and zero failures. J5.2 is +complete at `f5f7b417`: `RuntimeActionState.Transactions` owns the strict use +gate, exact use/appraisal identity, typed 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. Runtime +tests pass 197/197, App tests pass 3,775/3 skips, the complete Release suite +passes 8,561/5 skips, and the exact-binary seven-checkpoint gate passes with +graceful exits and zero failures. J5.3 combat/magic-intent ownership is active. J0's rollback is `git revert b632672e5ccabfb44c551e08f1c411ab2669c44a`. J1's rollback is @@ -306,6 +312,8 @@ J4.5's rollback is `git revert 89e6b207f81946b40c38c8dc6597817ad99fc6e0`. J5.1's rollback is `git revert b298f99f913249d299796e6a71f7a9b6b283ac1a`. +J5.2's rollback is +`git revert f5f7b4177f449ebcad9724bfea263ef73ab60255`. Slice H's retained UI/frame, bounded-light, and pooled/borrowed/direct network work is complete; the exact seven-checkpoint connected lifecycle/reconnect gate passes. Slice I is closed in @@ -319,7 +327,8 @@ is `docs/research/2026-07-26-slice-j3-6-lifetime-closeout.md`; J4 executes from `docs/research/2026-07-26-slice-j4-4-character-projections.md`; J4.5 closeout is `docs/research/2026-07-26-slice-j4-5-gameplay-state-closeout.md`; J5.1 closeout is -`docs/research/2026-07-26-slice-j5-1-canonical-action-state.md`. The exact G4 +`docs/research/2026-07-26-slice-j5-1-canonical-action-state.md`; J5.2 closeout +is `docs/research/2026-07-26-slice-j5-2-interaction-transactions.md`. The exact G4 visual rollback is `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`; do not revert G3 or the portal-warmup corrections. Evidence: diff --git a/CLAUDE.md b/CLAUDE.md index 759e49bc..7175ce0b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -273,8 +273,14 @@ routing, typed commands/views, and shutdown borrow its children, while the App interaction-state class and private controller fallback are deleted. Runtime tests pass 182/182, App tests pass 3,779/3 skips, the complete Release suite passes 8,550/5 skips, and the exact-binary seven-checkpoint -lifecycle/reconnect gate passes with graceful exits and zero failures. J5.2 -interaction-transaction ownership is active. +lifecycle/reconnect gate passes with graceful exits and zero failures. J5.2 is +complete at `f5f7b417`: `RuntimeActionState.Transactions` owns the strict use +gate, exact use/appraisal identity, typed 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. Runtime +tests pass 197/197, App tests pass 3,775/3 skips, the complete Release suite +passes 8,561/5 skips, and the exact-binary seven-checkpoint gate passes with +graceful exits and zero failures. J5.3 combat/magic-intent ownership is active. J0's rollback is `git revert b632672e5ccabfb44c551e08f1c411ab2669c44a`. J1's rollback is @@ -304,6 +310,8 @@ J4.5's rollback is `git revert 89e6b207f81946b40c38c8dc6597817ad99fc6e0`. J5.1's rollback is `git revert b298f99f913249d299796e6a71f7a9b6b283ac1a`. +J5.2's rollback is +`git revert f5f7b4177f449ebcad9724bfea263ef73ab60255`. Slice H's retained UI/frame, bounded-light, and pooled/borrowed/direct network work is complete; the exact seven-checkpoint connected lifecycle/reconnect gate passes. Slice I is closed in @@ -317,7 +325,8 @@ is `docs/research/2026-07-26-slice-j3-6-lifetime-closeout.md`; J4 executes from `docs/research/2026-07-26-slice-j4-4-character-projections.md`; J4.5 closeout is `docs/research/2026-07-26-slice-j4-5-gameplay-state-closeout.md`; J5.1 closeout is -`docs/research/2026-07-26-slice-j5-1-canonical-action-state.md`. The exact G4 +`docs/research/2026-07-26-slice-j5-1-canonical-action-state.md`; J5.2 closeout +is `docs/research/2026-07-26-slice-j5-2-interaction-transactions.md`. The exact G4 visual rollback is `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`; do not revert G3 or the portal-warmup corrections. Evidence: diff --git a/docs/ISSUES.md b/docs/ISSUES.md index 74583b7f..55ba9be8 100644 --- a/docs/ISSUES.md +++ b/docs/ISSUES.md @@ -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 diff --git a/docs/architecture/acdream-architecture.md b/docs/architecture/acdream-architecture.md index 479012c0..47d8f7f2 100644 --- a/docs/architecture/acdream-architecture.md +++ b/docs/architecture/acdream-architecture.md @@ -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 - -> J3–J4 and J5.1 complete; J5.2 interaction transactions active + RuntimeInteractionTransactionState.cs -> use/appraisal/pickup FIFO, + exact approach and busy borrower + -> J3–J4 and J5.1–J5.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, diff --git a/docs/architecture/code-structure.md b/docs/architecture/code-structure.md index 8c3f8543..b962a085 100644 --- a/docs/architecture/code-structure.md +++ b/docs/architecture/code-structure.md @@ -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.1–J5.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.2–J7 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.1–J5.2 action/interaction state share failure-safe Runtime owners while exact graphical sidecars stay in App. J5.3–J7 move combat/magic intent, movement/physics/projectiles, and remaining world authority before one Runtime composition root. | ### 4.3 Revised extraction sequence diff --git a/docs/plans/2026-04-11-roadmap.md b/docs/plans/2026-04-11-roadmap.md index c9cebb6a..f76a55b3 100644 --- a/docs/plans/2026-04-11-roadmap.md +++ b/docs/plans/2026-04-11-roadmap.md @@ -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: diff --git a/docs/plans/2026-05-12-milestones.md b/docs/plans/2026-05-12-milestones.md index 4dc51f20..8c6597a3 100644 --- a/docs/plans/2026-05-12-milestones.md +++ b/docs/plans/2026-05-12-milestones.md @@ -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`. diff --git a/docs/plans/2026-07-24-modern-runtime-architecture.md b/docs/plans/2026-07-24-modern-runtime-architecture.md index a2116fe2..5b729689 100644 --- a/docs/plans/2026-07-24-modern-runtime-architecture.md +++ b/docs/plans/2026-07-24-modern-runtime-architecture.md @@ -2,7 +2,7 @@ **Date:** 2026-07-24 -**Status:** Slices A–I and J0–J3 are complete. Flat-authoritative collision, zero- +**Status:** Slices A–I, J0–J4, and J5.1–J5.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 F–L were explicitly approved 2026-07-24. Slice J0–J1 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.1–J5.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 diff --git a/docs/plans/2026-07-25-modern-runtime-slice-j.md b/docs/plans/2026-07-25-modern-runtime-slice-j.md index 8d253ef5..fc6c0550 100644 --- a/docs/plans/2026-07-25-modern-runtime-slice-j.md +++ b/docs/plans/2026-07-25-modern-runtime-slice-j.md @@ -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, diff --git a/docs/plans/2026-07-26-modern-runtime-slice-j5.md b/docs/plans/2026-07-26-modern-runtime-slice-j5.md index 088f28d1..0d082dc8 100644 --- a/docs/plans/2026-07-26-modern-runtime-slice-j5.md +++ b/docs/plans/2026-07-26-modern-runtime-slice-j5.md @@ -1,6 +1,6 @@ # Modern runtime Slice J5 — movement, physics, interaction, and combat -**Status:** ACTIVE — J5.1 complete; J5.2 next +**Status:** ACTIVE — J5.1–J5.2 complete; J5.3 next **Parent:** `2026-07-25-modern-runtime-slice-j.md`, J5 **Production base:** `2c67a2c3` **Authorization:** the user approved Slices F–L, 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: diff --git a/docs/research/2026-07-26-slice-j5-2-interaction-transactions.md b/docs/research/2026-07-26-slice-j5-2-interaction-transactions.md new file mode 100644 index 00000000..8facd2f1 --- /dev/null +++ b/docs/research/2026-07-26-slice-j5-2-interaction-transactions.md @@ -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.