acdream/docs/research/2026-07-26-slice-j6-1-environment-ownership.md

69 lines
2.6 KiB
Markdown

# Slice J6.1 — canonical world-environment ownership
**Date:** 2026-07-26
**Production commit:** `902076c0a42079596a8a273e9be402776cabf4b0`
**Exact rollback:** `git revert 902076c0a42079596a8a273e9be402776cabf4b0`
## Outcome
`AcDream.Runtime` now owns one world-environment lifetime per client session:
- an instance-scoped `DerethCalendar`;
- the server-synchronized world clock;
- weather progression and active weather state;
- retail day-group selection;
- AdminEnvirons state;
- typed debug time and weather overrides.
`AcDream.App` remains the graphical host. It converts immutable DAT sky
definitions into the Runtime definition and maps Runtime's selected day-group
index, clock, and weather snapshot into sky rendering. It does not own a
second clock or weather state.
The production path no longer mutates a process-global Region calendar origin.
Two Runtime instances may therefore use different Region origins and server
times without contaminating each other. Startup environment variables enter
once through `RuntimeOptions`.
## Retail mechanism
- `SkyDesc::CalcPresentDayGroup @ 0x00500E10`
- `CPlayerSystem::Handle_Admin__Environs @ 0x0055DE20`
`SkyDayGroupSelector` preserves the named-retail ordered selection algorithm
and its `0x6A42FDB2` pseudo-random multiplier. `DerethCalendar` preserves the
existing retail epoch conversion while moving the mutable Region origin into
the owning Runtime instance.
No new retail divergence was introduced.
## Automated evidence
- Runtime: 332 passed.
- App: 3,718 passed / 3 skipped.
- Complete solution: 8,611 passed / 5 skipped.
- Release build: 0 errors, 0 warnings.
- Runtime dependency/source guards: passed.
- Two-instance calendar, TimeSync, rollover/day-group, AdminEnvirons, debug
override, reset, and projection fixtures: passed.
## Connected evidence
Report:
`logs/connected-world-gate-20260726-164602/report.json`
The report records source and embedded binary commit
`902076c0a42079596a8a273e9be402776cabf4b0`.
- Capped process: 244.907 seconds, six checkpoints, graceful code-zero exit.
- Uncapped fresh-process reconnect: 61.46 seconds, one checkpoint, graceful
code-zero exit.
- Route: fresh login, Aerlinthe, Rynthid world edge, Facility Hub dungeon,
Holtburg, Aerlinthe revisit, then fresh-process reconnect.
- Failures: zero.
- Expected warning: 25 instrumented world-edge landblock misses.
- Reveal invariant failures: zero.
This proves the new environment owner preserves connected login, outdoor,
world-edge, dungeon, revisit, disconnect, and reconnect behavior before J6.2
moves the independent portal/reveal lifetime.