docs(runtime): close inventory state ownership

Record J4.2's single Runtime inventory transaction graph, complete Release evidence, exact-binary lifecycle/reconnect acceptance, rollback, and the J4.3 magic/player-sheet boundary. Synchronize architecture, roadmap, milestones, agent guidance, and durable memory.

Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-26 08:29:06 +02:00
parent 011efbeaa7
commit d362172620
9 changed files with 168 additions and 18 deletions

View file

@ -245,7 +245,13 @@ targets, negotiated rooms, friends, and squelch state; graphical and no-window
consumers borrow them. Runtime tests pass 152/152, App tests pass 3,765/3 consumers borrow them. Runtime tests pass 152/152, App tests pass 3,765/3
skips, the complete Release suite passes 8,494/5 skips, and the exact-binary skips, the complete Release suite passes 8,494/5 skips, and the exact-binary
seven-checkpoint lifecycle/reconnect gate passes with graceful exits and zero seven-checkpoint lifecycle/reconnect gate passes with graceful exits and zero
failures. J4.2 inventory transaction ownership is active. J0's rollback is failures. J4.2 is complete at `011efbea`: `RuntimeInventoryState` owns
external-container, item-mana, shortcut/component, shared-busy,
use-reservation, and one-request-at-a-time state while borrowing J3's exact
object table. Runtime tests pass 157/157, App tests pass 3,770/3 skips, the
complete Release suite passes 8,515/5 skips, and the exact-binary
seven-checkpoint lifecycle/reconnect gate passes with graceful exits and zero
failures. J4.3 magic/player-sheet ownership is active. J0's rollback is
`git revert b632672e5ccabfb44c551e08f1c411ab2669c44a`. `git revert b632672e5ccabfb44c551e08f1c411ab2669c44a`.
J1's rollback is J1's rollback is
`git revert 854d9e9cd13092bd5aaa3cf025d73eeb4600e9f8`. `git revert 854d9e9cd13092bd5aaa3cf025d73eeb4600e9f8`.
@ -264,6 +270,8 @@ J3.6's rollback is
`git revert 119b7c115107245546180b2f5cb3cb44c7d5476a`. `git revert 119b7c115107245546180b2f5cb3cb44c7d5476a`.
J4.1's rollback is J4.1's rollback is
`git revert c9d25ade50c0a5c4f7db5b6cca680e01e35cc18e`. `git revert c9d25ade50c0a5c4f7db5b6cca680e01e35cc18e`.
J4.2's rollback is
`git revert 011efbeaa72509b35ea7f4a442e50a2377ae1ea4`.
Slice H's retained UI/frame, bounded-light, and pooled/borrowed/direct network Slice H's retained UI/frame, bounded-light, and pooled/borrowed/direct network
work is complete; the exact seven-checkpoint connected lifecycle/reconnect gate work is complete; the exact seven-checkpoint connected lifecycle/reconnect gate
passes. Slice I is closed in passes. Slice I is closed in
@ -271,7 +279,8 @@ passes. Slice I is closed in
executes from `docs/plans/2026-07-25-modern-runtime-slice-j.md`; J3.6 closeout executes from `docs/plans/2026-07-25-modern-runtime-slice-j.md`; J3.6 closeout
is `docs/research/2026-07-26-slice-j3-6-lifetime-closeout.md`; J4 executes from is `docs/research/2026-07-26-slice-j3-6-lifetime-closeout.md`; J4 executes from
`docs/plans/2026-07-26-modern-runtime-slice-j4.md`; J4.1 closeout is `docs/plans/2026-07-26-modern-runtime-slice-j4.md`; J4.1 closeout is
`docs/research/2026-07-26-slice-j4-1-communication-state.md`. The exact G4 `docs/research/2026-07-26-slice-j4-1-communication-state.md`; J4.2 closeout is
`docs/research/2026-07-26-slice-j4-2-inventory-state.md`. The exact G4
visual rollback visual rollback
is `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`; do not revert G3 or is `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`; do not revert G3 or
the portal-warmup corrections. Evidence: the portal-warmup corrections. Evidence:

View file

@ -243,7 +243,13 @@ targets, negotiated rooms, friends, and squelch state; graphical and no-window
consumers borrow them. Runtime tests pass 152/152, App tests pass 3,765/3 consumers borrow them. Runtime tests pass 152/152, App tests pass 3,765/3
skips, the complete Release suite passes 8,494/5 skips, and the exact-binary skips, the complete Release suite passes 8,494/5 skips, and the exact-binary
seven-checkpoint lifecycle/reconnect gate passes with graceful exits and zero seven-checkpoint lifecycle/reconnect gate passes with graceful exits and zero
failures. J4.2 inventory transaction ownership is active. J0's rollback is failures. J4.2 is complete at `011efbea`: `RuntimeInventoryState` owns
external-container, item-mana, shortcut/component, shared-busy,
use-reservation, and one-request-at-a-time state while borrowing J3's exact
object table. Runtime tests pass 157/157, App tests pass 3,770/3 skips, the
complete Release suite passes 8,515/5 skips, and the exact-binary
seven-checkpoint lifecycle/reconnect gate passes with graceful exits and zero
failures. J4.3 magic/player-sheet ownership is active. J0's rollback is
`git revert b632672e5ccabfb44c551e08f1c411ab2669c44a`. `git revert b632672e5ccabfb44c551e08f1c411ab2669c44a`.
J1's rollback is J1's rollback is
`git revert 854d9e9cd13092bd5aaa3cf025d73eeb4600e9f8`. `git revert 854d9e9cd13092bd5aaa3cf025d73eeb4600e9f8`.
@ -262,6 +268,8 @@ J3.6's rollback is
`git revert 119b7c115107245546180b2f5cb3cb44c7d5476a`. `git revert 119b7c115107245546180b2f5cb3cb44c7d5476a`.
J4.1's rollback is J4.1's rollback is
`git revert c9d25ade50c0a5c4f7db5b6cca680e01e35cc18e`. `git revert c9d25ade50c0a5c4f7db5b6cca680e01e35cc18e`.
J4.2's rollback is
`git revert 011efbeaa72509b35ea7f4a442e50a2377ae1ea4`.
Slice H's retained UI/frame, bounded-light, and pooled/borrowed/direct network Slice H's retained UI/frame, bounded-light, and pooled/borrowed/direct network
work is complete; the exact seven-checkpoint connected lifecycle/reconnect gate work is complete; the exact seven-checkpoint connected lifecycle/reconnect gate
passes. Slice I is closed in passes. Slice I is closed in
@ -269,7 +277,8 @@ passes. Slice I is closed in
executes from `docs/plans/2026-07-25-modern-runtime-slice-j.md`; J3.6 closeout executes from `docs/plans/2026-07-25-modern-runtime-slice-j.md`; J3.6 closeout
is `docs/research/2026-07-26-slice-j3-6-lifetime-closeout.md`; J4 executes from is `docs/research/2026-07-26-slice-j3-6-lifetime-closeout.md`; J4 executes from
`docs/plans/2026-07-26-modern-runtime-slice-j4.md`; J4.1 closeout is `docs/plans/2026-07-26-modern-runtime-slice-j4.md`; J4.1 closeout is
`docs/research/2026-07-26-slice-j4-1-communication-state.md`. The exact G4 `docs/research/2026-07-26-slice-j4-1-communication-state.md`; J4.2 closeout is
`docs/research/2026-07-26-slice-j4-2-inventory-state.md`. The exact G4
visual rollback visual rollback
is `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`; do not revert G3 or is `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`; do not revert G3 or
the portal-warmup corrections. Evidence: the portal-warmup corrections. Evidence:

View file

@ -219,7 +219,9 @@ src/
ParentAttachmentState.cs -> generation-exact parent relations ParentAttachmentState.cs -> generation-exact parent relations
Gameplay/ Gameplay/
RuntimeCommunicationState.cs -> one chat/social owner + ordered stream RuntimeCommunicationState.cs -> one chat/social owner + ordered stream
-> J3 and J4.1 complete; J4.2 inventory transaction ownership active RuntimeInventoryState.cs -> exact object-table borrower + inventory
transaction/session-state owner
-> J3 and J4.1J4.2 complete; J4.3 magic/player ownership active
-> may reference Core, Core.Net, Content, and Plugin.Abstractions only -> may reference Core, Core.Net, Content, and Plugin.Abstractions only
-> must never reference App, UI, Silk.NET, OpenAL, Arch, or ImGui -> must never reference App, UI, Silk.NET, OpenAL, Arch, or ImGui

View file

@ -1,6 +1,6 @@
# acdream — strategic roadmap # 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's canonical entity/object lifetime and J4.1 communication/social ownership are closed; J4.2 inventory transaction ownership is 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's canonical entity/object lifetime plus J4.1 communication/social and J4.2 inventory-transaction ownership are closed; J4.3 magic/player-sheet ownership 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. **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.
--- ---
@ -1715,8 +1715,13 @@ port in any phase — no separate listing here.
> negotiated rooms, friends, and squelch state; every graphical and no-window > negotiated rooms, friends, and squelch state; every graphical and no-window
> consumer borrows them. Its 152 Runtime tests, 3,765 App tests / 3 skips, > consumer borrows them. Its 152 Runtime tests, 3,765 App tests / 3 skips,
> 8,494-test / 5-skip complete Release suite, and exact-binary > 8,494-test / 5-skip complete Release suite, and exact-binary
> seven-checkpoint lifecycle/reconnect gate pass. J4.2 inventory transaction > seven-checkpoint lifecycle/reconnect gate pass. J4.2 is complete at
> ownership is active. > `011efbea`: Runtime owns external-container, item-mana,
> shortcut/component, shared-busy, use-reservation, and
> one-request-at-a-time state while borrowing J3's exact object table. Its 157
> Runtime tests, 3,770 App tests / 3 skips, 8,515-test / 5-skip complete
> Release suite, and exact-binary seven-checkpoint lifecycle/reconnect gate
> pass. J4.3 magic/player-sheet ownership is active.
> The historical exact cutover > The historical exact cutover
> rollback remains > rollback remains
> `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`. Slice H is complete: > `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`. Slice H is complete:

View file

@ -192,7 +192,12 @@ residency is `0/0/0` at every stable checkpoint and teardown converges. Slice I
event stream; all presentation and no-window consumers borrow it. Its 152 event stream; all presentation and no-window consumers borrow it. Its 152
Runtime tests, 3,765 App tests / 3 skips, 8,494 full Release tests / 5 Runtime tests, 3,765 App tests / 3 skips, 8,494 full Release tests / 5
skips, and exact-binary seven-checkpoint lifecycle/reconnect route pass. skips, and exact-binary seven-checkpoint lifecycle/reconnect route pass.
J4.2 inventory transaction ownership is active under J4.2 is complete at `011efbea`: Runtime owns external-container,
item-mana, shortcut/component, shared-busy, use-reservation, and
one-request-at-a-time state while borrowing J3's exact object table. Its
157 Runtime tests, 3,770 App tests / 3 skips, 8,515 full Release tests / 5
skips, and exact-binary seven-checkpoint lifecycle/reconnect route pass.
J4.3 magic/player-sheet ownership is active under
[`2026-07-25-modern-runtime-slice-j.md`](2026-07-25-modern-runtime-slice-j.md). [`2026-07-25-modern-runtime-slice-j.md`](2026-07-25-modern-runtime-slice-j.md).
Slice-I closeout evidence is Slice-I closeout evidence is
[`../research/2026-07-25-slice-i7-closeout.md`](../research/2026-07-25-slice-i7-closeout.md). [`../research/2026-07-25-slice-i7-closeout.md`](../research/2026-07-25-slice-i7-closeout.md).

View file

@ -11,8 +11,9 @@ lifetime and ordered inbound routing; J3.1J3.6 moved canonical entity identit
and object-table lifetime to Runtime, exact graphical projection identity to and object-table lifetime to Runtime, exact graphical projection identity to
App, and one ordered canonical entity/object stream plus direct views to all App, and one ordered canonical entity/object stream plus direct views to all
hosts and closed the failure-safe owner ledger. J4.1 moved communication and hosts and closed the failure-safe owner ledger. J4.1 moved communication and
social ownership into Runtime at `c9d25ade`; J4.2 inventory transaction social ownership into Runtime at `c9d25ade`; J4.2 moved inventory transaction
ownership is the active execution point. ownership into Runtime at `011efbea`; J4.3 magic/player-sheet ownership is the
active execution point.
**Scope:** Reconcile and sequence the existing Modern Pipeline (`MP`) and **Scope:** Reconcile and sequence the existing Modern Pipeline (`MP`) and
Linux/headless (`LH`) tracks using the 2026-07-24 connected performance audit. Linux/headless (`LH`) tracks using the 2026-07-24 connected performance audit.

View file

@ -1,6 +1,6 @@
# Modern runtime Slice J — presentation-independent runtime # Modern runtime Slice J — presentation-independent runtime
**Status:** J0J3 COMPLETE; J4.1 COMPLETE; J4.2 inventory ownership active **Status:** J0J3 COMPLETE; J4.1J4.2 COMPLETE; J4.3 magic/player ownership active
**Parent:** `2026-07-24-modern-runtime-architecture.md`, Slice J **Parent:** `2026-07-24-modern-runtime-architecture.md`, Slice J
**Authorization:** the user approved Slices FL, including the otherwise-frozen **Authorization:** the user approved Slices FL, including the otherwise-frozen
Slice J gameplay-owner moves, on 2026-07-24 Slice J gameplay-owner moves, on 2026-07-24
@ -234,8 +234,12 @@ reply/retell targets, negotiated Turbine rooms, friends, and squelch state.
Graphical UI, devtools, command routing, plugins/current-runtime projections, Graphical UI, devtools, command routing, plugins/current-runtime projections,
and no-window consumers borrow that one graph. Its 152 Runtime tests, 3,765 and no-window consumers borrow that one graph. Its 152 Runtime tests, 3,765
App tests / 3 skips, 8,494 complete Release tests / 5 skips, and exact-binary App tests / 3 skips, 8,494 complete Release tests / 5 skips, and exact-binary
seven-checkpoint lifecycle/reconnect gate pass. J4.2 inventory transaction seven-checkpoint lifecycle/reconnect gate pass. J4.2 completed at `011efbea`:
ownership is active. Runtime owns external-container, item-mana, shortcut/component, shared-busy,
use-reservation, and one-request-at-a-time state while borrowing J3's exact
object table. Its 157 Runtime tests, 3,770 App tests / 3 skips, 8,515 complete
Release tests / 5 skips, and exact-binary seven-checkpoint
lifecycle/reconnect gate pass. J4.3 magic/player-sheet ownership is active.
Detailed execution begins with a source-ownership inventory. Move one coherent Detailed execution begins with a source-ownership inventory. Move one coherent
lifetime group at a time in this order: lifetime group at a time in this order:

View file

@ -1,6 +1,6 @@
# Modern runtime Slice J4 — gameplay-state lifetime groups # Modern runtime Slice J4 — gameplay-state lifetime groups
**Status:** J4.1 COMPLETE; J4.2 ACTIVE **Status:** J4.1J4.2 COMPLETE; J4.3 ACTIVE
**Parent:** `2026-07-25-modern-runtime-slice-j.md`, J4 **Parent:** `2026-07-25-modern-runtime-slice-j.md`, J4
**Production base:** `77c013998b902724d66e487589a4ea18538e1ea6` **Production base:** `77c013998b902724d66e487589a4ea18538e1ea6`
**Authorization:** the user approved Slices FL, including Slice J gameplay **Authorization:** the user approved Slices FL, including Slice J gameplay
@ -22,8 +22,8 @@ ordering and its existing retail-derived algorithms.
| Group | Status | Evidence | | Group | Status | Evidence |
|---|---|---| |---|---|---|
| J4.1 communication/social | complete | `c9d25ade50c0a5c4f7db5b6cca680e01e35cc18e`; 152 Runtime tests, 3,765 App tests / 3 skips, 8,494 complete Release tests / 5 skips, and `logs/connected-world-gate-20260726-075109/report.json` pass | | J4.1 communication/social | complete | `c9d25ade50c0a5c4f7db5b6cca680e01e35cc18e`; 152 Runtime tests, 3,765 App tests / 3 skips, 8,494 complete Release tests / 5 skips, and `logs/connected-world-gate-20260726-075109/report.json` pass |
| J4.2 inventory transactions | active | Runtime must borrow J3's exact object table and take ownership of external-container, item-mana, shortcut/component, shared busy, and one-request-at-a-time state | | J4.2 inventory transactions | complete | `011efbeaa72509b35ea7f4a442e50a2377ae1ea4`; 157 Runtime tests, 3,770 App tests / 3 skips, 8,515 complete Release tests / 5 skips, and `logs/connected-world-gate-20260726-082057/report.json` pass |
| J4.3 magic/player sheet | pending | starts only after J4.2 exact-binary acceptance | | J4.3 magic/player sheet | active | move the coupled `Spellbook` and `LocalPlayerState` owner graph while retaining immutable DAT catalog installation |
| J4.4 character projections | pending | starts only after J4.3 acceptance | | J4.4 character projections | pending | starts only after J4.3 acceptance |
| J4.5 combined cleanup | pending | combined failure, no-window, connected, and nine-stop closeout | | J4.5 combined cleanup | pending | combined failure, no-window, connected, and nine-stop closeout |
@ -96,7 +96,7 @@ evidence is recorded in
### J4.2 — inventory transaction state ### J4.2 — inventory transaction state
**Active.** **Completed 2026-07-26 at `011efbea`.**
- Move `ExternalContainerState`, `ItemManaState`, shortcuts, and desired - Move `ExternalContainerState`, `ItemManaState`, shortcuts, and desired
component snapshots into one Runtime owner. component snapshots into one Runtime owner.
@ -110,6 +110,14 @@ Gate: optimistic move/rollback, external-container open/replace/close,
use-completion, mana query, shortcut/component replacement, clear/reconnect, use-completion, mana query, shortcut/component replacement, clear/reconnect,
and zero duplicate collection. and zero duplicate collection.
Result: `RuntimeInventoryState` owns external-container, item-mana,
shortcut/component, shared-busy, use-reservation, and one-request-at-a-time
state while borrowing J3's exact object table. App retains only
presentation/input projections. Failure-safe reset and callback delivery
prevent a failed observer or dispatch from stranding the canonical busy gate.
Exact evidence is recorded in
[`../research/2026-07-26-slice-j4-2-inventory-state.md`](../research/2026-07-26-slice-j4-2-inventory-state.md).
### J4.3 — spell, enchantment, vital, attribute, and skill state ### J4.3 — spell, enchantment, vital, attribute, and skill state
- Move construction/lifetime of the coupled `Spellbook` and - Move construction/lifetime of the coupled `Spellbook` and
@ -187,3 +195,9 @@ J4.1 is independently reversible with:
```text ```text
git revert c9d25ade50c0a5c4f7db5b6cca680e01e35cc18e git revert c9d25ade50c0a5c4f7db5b6cca680e01e35cc18e
``` ```
J4.2 is independently reversible with:
```text
git revert 011efbeaa72509b35ea7f4a442e50a2377ae1ea4
```

View file

@ -0,0 +1,101 @@
# Modern runtime J4.2 — inventory transaction ownership
**Status:** COMPLETE
**Production commit:** `011efbeaa72509b35ea7f4a442e50a2377ae1ea4`
**Parent plan:** `../plans/2026-07-26-modern-runtime-slice-j4.md`
## Result
`RuntimeInventoryState` is the single presentation-independent owner for the
live external-container state, item-mana state, shortcut assignments, desired
spell-component counts, and the retail one-inventory-request-at-a-time
transaction gate.
It borrows J3's exact `ClientObjectTable`; it does not construct or synchronize
a second item collection. The live-session router, item interaction,
retained UI, developer tools, current-runtime/plugin boundary, and future
no-window hosts all observe those same owner instances.
`InventoryTransactionState` now owns the request/response gate previously
split across App interaction code. It records the retail request token,
matches the corresponding response, maintains the shared busy reference,
tracks use reservations, and resets the transaction atomically. Callback
failures are isolated after canonical state commits, so one observer cannot
strand the busy cursor or prevent a later request.
Presentation-only state remains in App: pending backpack-slot projection,
drag/drop hover and selection, cursor choice, item icons, panel layout, and
optimistic visual placement. App may borrow the Runtime transaction owner but
cannot dispose or replace it.
## Retail basis
The ownership move preserves the already-ported retail transaction behavior:
- `ACCWeenieObject::RecordRequest` at `0x0058C220`;
- `ACCWeenieObject::RecordResponse` at `0x0058CAB0`;
- `ClientUISystem::UsageCallback` at `0x00565B20`;
- `2026-07-23-retail-use-busy-ownership-pseudocode.md`;
- `2026-07-13-retail-give-item-pseudocode.md`.
ACE and Holtburger remain interpretation cross-checks as recorded in the
busy-ownership pseudocode. No request ordering, wire packet, optimistic move,
rollback, use-completion, or cursor behavior changed in J4.2.
## Automated evidence
- Runtime suite: 157 passed.
- App suite: 3,770 passed / 3 established skips.
- Core suite: 3,305 passed / 2 established skips.
- Complete Release solution: 8,515 passed / 5 established skips.
- Release build: pass, zero errors. A clean rebuild reports 17 established
test warnings; the J4.2 diff introduces none.
- `git diff --check`: pass.
The focused matrix covers exact object-table identity, external-container
open/replace/close, item-mana replacement, shortcut/component replacement,
request/response matching, use reservations, dispatch failure rollback,
observer failure isolation, reset/reconnect, borrowed lifetime, idempotent
disposal, and two independent Runtime instances.
One parallel full-suite run hit the established allocation-sensitive portal
projection test with a 1,536-byte measurement. The isolated App rerun passed,
and an immediate complete-solution rerun passed all 8,515 tests without a code
change.
## Exact-binary connected evidence
`logs/connected-world-gate-20260726-082057/report.json` passed on exact source
and embedded binary commit
`011efbeaa72509b35ea7f4a442e50a2377ae1ea4`:
- six capped checkpoints through login, outdoor/dungeon/facility travel and
revisit plus one fresh-process uncapped reconnect checkpoint;
- 244.011-second capped route and 61.422-second reconnect route;
- both sessions exited gracefully with code zero;
- zero failures.
Its only warning is the established set of 25 expected world-edge landblock
misses.
## Divergence audit
J4.2 changes lifetime ownership and failure containment only. It introduces no
new retail behavior and retires no registered divergence, so the divergence
register is unchanged.
## Rollback
```text
git revert 011efbeaa72509b35ea7f4a442e50a2377ae1ea4
```
Do not revert J3's canonical entity/object ownership to mask an inventory
transaction failure.
## Next boundary
J4.3 moves construction and lifetime of the coupled `Spellbook` and
`LocalPlayerState` into Runtime. Immutable DAT spell tables remain supplied by
the content host; retained spellbook, active-effect, character-sheet, and
paperdoll presentation remain in App/UI.