docs(runtime): close canonical entity object lifetime
This commit is contained in:
parent
119b7c1151
commit
77c013998b
11 changed files with 249 additions and 43 deletions
123
docs/research/2026-07-26-slice-j3-6-lifetime-closeout.md
Normal file
123
docs/research/2026-07-26-slice-j3-6-lifetime-closeout.md
Normal 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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue