docs(runtime): close canonical entity object lifetime

This commit is contained in:
Erik 2026-07-26 07:35:42 +02:00
parent 119b7c1151
commit 77c013998b
11 changed files with 249 additions and 43 deletions

View file

@ -0,0 +1,123 @@
# Modern runtime J3.6 — canonical lifetime closeout
**Status:** COMPLETE
**Production commit:** `119b7c115107245546180b2f5cb3cb44c7d5476a`
**Parent plan:** `../plans/2026-07-26-modern-runtime-slice-j3-hardening.md`
## Result
J3 now has one failure-safe entity/object lifetime from canonical Runtime
registration through graphical projection, accepted mutation, authoritative
delete, session clear, and direct disposal.
`RuntimeEntityObjectLifetime` retains the exact active or teardown receipt
before invoking fallible host callbacks. A callback can therefore fail,
delete/recreate the same GUID, clear the session, or commit a newer mutation
without making an owner unreachable or applying an older callback to a newer
incarnation.
The shared entity/object stream retains a synchronous in-call drain for
re-entrant commits. This is not a background or cross-frame queue: the outer
commit still completes synchronously, but every observer sees one monotonic
sequence even when an earlier observer commits another fact while dispatch is
in progress.
Per-channel mutation versions protect ObjDesc, motion, vector, state,
position, parent, pickup, rebucket, withdrawal, and child-NoDraw callbacks.
Rejected or stale work consumes no sequence. A graphical acknowledgement
failure cannot erase an already committed canonical fact.
Direct disposal now executes the same retryable clear/retirement transaction
as session shutdown, detaches borrowers, and requires the complete ownership
ledger to converge before the stream is disposed.
## Ownership ledger
The closeout snapshot covers:
- active and retained-teardown Runtime records and claimed local IDs;
- accepted snapshots/timestamps, parent relations, and operation versions;
- live object-table objects, containers, equipment owners, and pending moves;
- Runtime stream subscribers, dispatch failures, and synchronous drain state;
- exact-key App projections, spatial residence, presentation resources,
effects, lights, scripts, projectiles, shadows, and equipped children.
Stable delete, reset, GUID reuse, and disposal fixtures require every field in
that ledger to equal zero. Retained receipts are permitted only while an
injected failure remains incomplete; retry or disposal must retire them
exactly once.
## Automated evidence
- Runtime lifetime/stream suite: 146 passed.
- Core `ClientObjectTable` focused suite: 86 passed.
- Core.Net object-table wiring suite: 7 passed.
- Focused App ownership, hydration, projection, adapter, and stress matrix:
161 passed.
- Complete App suite: 3,765 passed / 3 established skips.
- Complete Release solution: 8,484 passed / 5 established skips.
- Release build: pass, zero errors. A clean rebuild reports 17 pre-existing
Core test warnings; the J3.6 production diff introduces none.
- `git diff --check`: pass.
The failure matrix covers registration/hydration failure, callback failure
after commit, same-channel and cross-domain re-entrancy, rejected updates,
optimistic object moves and rollback, authoritative removal, replacement,
clear, delete/recreate, live direct disposal, and 96-owner
churn/delete/reuse/reset cleanup.
## Exact-binary connected evidence
`logs/connected-world-gate-20260726-071554/report.json` passed on
`119b7c115107245546180b2f5cb3cb44c7d5476a`:
- six capped checkpoints and one fresh-process uncapped reconnect checkpoint;
- 244.146-second capped route and 61.734-second reconnect route;
- two graceful server-confirmed exits with code zero;
- zero failures, render-shadow mismatches, pending render deltas, live
teardowns, retirements, staged uploads, or composite warmup.
Its one warning is the route's established 25 world-edge empty-landblock
probes.
`logs/connected-r6-soak-20260726-072153.report.json` also passed on the exact
same source and embedded binary commit:
- all nine canonical world checkpoints and 18 movement/turn samples;
- Caul, Sawato, Rynthid, Aerlinthe, Sawato revisit, Holtburg, Caul return,
Sawato plateau, and Caul plateau;
- movement, jump, combat, repeated-location, portal, and long-lived churn
exercises;
- 515.229 seconds total, graceful exit, code zero, and zero failures;
- zero render-scene mismatches, pending render deltas, live teardowns,
landblock retirements, staged uploads, or streaming backlog at the final
checkpoint.
The route's warnings are its population-sensitive revisit observations,
known DAT-driven missing VFX diagnostics, and established world-edge probes.
They are not invariant failures and do not identify a J3 ownership leak.
## Retail and divergence audit
J3.6 hardens commit, observation, retry, and teardown boundaries only. It does
not alter an AC packet, timestamp rule, object-table rule, gameplay algorithm,
visual path, input timing, or intended retail divergence. No divergence
register row was added or retired.
## Rollback
Revert J3.6 only:
```text
git revert 119b7c115107245546180b2f5cb3cb44c7d5476a
```
Do not revert J3.5, J3.4, or J3.3 to mask a later gameplay-owner regression.
## Next boundary
J4 is active. Move chat, inventory/gameplay transactions, magic/effects,
vitals/advancement, and cooldown state as coherent lifetime groups into
Runtime. Each group must preserve the current graphical trace, expose the same
borrowed state to no-window hosts, and delete its superseded App ownership
before the next group begins.