diff --git a/AGENTS.md b/AGENTS.md index 7db6efbd..410a9a73 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -376,7 +376,17 @@ ForcePosition projection, explicit-only collision diagnostics, visible Windows and native Linux production runs, user-accepted smooth retail-observer movement, and ACE-confirmed graceful logout. Final gates pass 412 Runtime, 47 Headless, 3,722 App / 3 skips, and 8,764 complete Release tests / 5 skips. -K4 1/5/10/30-session resource-ceiling and stress work is active. +K4 1/5/10/30-session resource-ceiling and stress work is active. Its +`cb512fd0` checkpoint adds one process-scheduler observation deadline, +structured CPU/private/resident/managed/GC/thread/handle/Linux-descriptor/ +socket/session/content/ownership/wakeup/lateness metrics, and exact +post-disposal convergence without per-session workers or timers. The first +native Linux two-account run exposed and corrected pre-connect deadline arming +and a sub-millisecond `Task.Delay` busy loop. Windows and native Ubuntu +Headless tests pass 56/56; the complete Release suite passes 8,773 / 5 skips. +The user requested that the current two-client observer process remain +running; exact-fixed-binary resource ceilings and automated 5/10/30-root +endurance remain. J0's rollback is `git revert b632672e5ccabfb44c551e08f1c411ab2669c44a`. J1's rollback is @@ -443,6 +453,8 @@ K2's rollback is, newest first, K3's connected-closeout rollback is `git revert 3f3401257c83bdd9f557eb577ba08cf2e5ec9a06`; its earlier automated checkpoint rollbacks remain recorded in the Slice K plan. +K4's resource-telemetry/CPU rollback is +`git revert cb512fd0916fbf49285c9b64df1630c5a69a0d20`. 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 @@ -475,7 +487,8 @@ closeout is `docs/research/2026-07-27-slice-k0-portability-boundary.md`; K1 closeout is `docs/research/2026-07-27-slice-k1-single-session-headless.md`; K2 closeout is `docs/research/2026-07-27-slice-k2-deterministic-bot-parity.md`; Slice K executes -from `docs/plans/2026-07-26-modern-runtime-slice-k.md`. The exact G4 visual +from `docs/plans/2026-07-26-modern-runtime-slice-k.md`; K4 telemetry evidence is +`docs/research/2026-07-27-slice-k4-resource-telemetry-checkpoint.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 2bc2e102..24d302f3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -374,7 +374,17 @@ ForcePosition projection, explicit-only collision diagnostics, visible Windows and native Linux production runs, user-accepted smooth retail-observer movement, and ACE-confirmed graceful logout. Final gates pass 412 Runtime, 47 Headless, 3,722 App / 3 skips, and 8,764 complete Release tests / 5 skips. -K4 1/5/10/30-session resource-ceiling and stress work is active. +K4 1/5/10/30-session resource-ceiling and stress work is active. Its +`cb512fd0` checkpoint adds one process-scheduler observation deadline, +structured CPU/private/resident/managed/GC/thread/handle/Linux-descriptor/ +socket/session/content/ownership/wakeup/lateness metrics, and exact +post-disposal convergence without per-session workers or timers. The first +native Linux two-account run exposed and corrected pre-connect deadline arming +and a sub-millisecond `Task.Delay` busy loop. Windows and native Ubuntu +Headless tests pass 56/56; the complete Release suite passes 8,773 / 5 skips. +The user requested that the current two-client observer process remain +running; exact-fixed-binary resource ceilings and automated 5/10/30-root +endurance remain. J0's rollback is `git revert b632672e5ccabfb44c551e08f1c411ab2669c44a`. J1's rollback is @@ -441,6 +451,8 @@ K2's rollback is, newest first, K3's connected-closeout rollback is `git revert 3f3401257c83bdd9f557eb577ba08cf2e5ec9a06`; its earlier automated checkpoint rollbacks remain recorded in the Slice K plan. +K4's resource-telemetry/CPU rollback is +`git revert cb512fd0916fbf49285c9b64df1630c5a69a0d20`. 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 @@ -473,7 +485,8 @@ closeout is `docs/research/2026-07-27-slice-k0-portability-boundary.md`; K1 closeout is `docs/research/2026-07-27-slice-k1-single-session-headless.md`; K2 closeout is `docs/research/2026-07-27-slice-k2-deterministic-bot-parity.md`; Slice K executes -from `docs/plans/2026-07-26-modern-runtime-slice-k.md`. The exact G4 visual +from `docs/plans/2026-07-26-modern-runtime-slice-k.md`; K4 telemetry evidence is +`docs/research/2026-07-27-slice-k4-resource-telemetry-checkpoint.md`. The exact G4 visual rollback is `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`; do not revert G3 or the portal-warmup corrections. Evidence: diff --git a/docs/plans/2026-04-11-roadmap.md b/docs/plans/2026-04-11-roadmap.md index 9ca8f387..c050f636 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-27. **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 at `f5f7b417`, J5.3 combat/magic intent at `20df9d15`, J5.4 local movement/outbound cadence at `aa3f4a60`, J5.5 per-session physics/remote simulation at `7e6033d0`, J5.6 projectile simulation at `2aee3356`, and J5.7 combined simulation closeout at `cdee7a4b`. J6.1 world-environment ownership is closed at `902076c0`; J6.2 canonical reveal generation and typed destination readiness is closed at `a6860d55` plus `acb845d8`; J6.3 exact F751/Position destination correlation is closed at `6a063a27`; J6.4 exact graphical-host acknowledgement and owner cleanup is closed at `18d17d8b`. J7's one graphical `GameRuntime` root is closed at `ce41efb9`, including the user's 2026-07-27 exact post-cutover visual acceptance. J8 closed Slice J at `a9a822f2` with one shared graphical/no-window root and generation-reset transaction. Slice K Linux headless/multi-session work is active; K0's tested no-presentation Windows/Linux boundary closed at `aada8a37`, K1's real portable single-session host closed at `f8cb840f`, and K2's deterministic scheduler plus complete shared bot command/event path closed at `7e8acb74` plus `38e83640`. K3 closed at `3f340125` after the shared-content/collision/isolation checkpoint, visible-terminal Windows and native Linux production runs, four-stop portal route, external-teleport handling, and user-accepted retail-observer movement. K4 30-session resource and stability work is active. Issue #225's lifestone/particle alpha comparison remains a separate rendering visual gate. +**Status:** Living document. Updated 2026-07-27. **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 at `f5f7b417`, J5.3 combat/magic intent at `20df9d15`, J5.4 local movement/outbound cadence at `aa3f4a60`, J5.5 per-session physics/remote simulation at `7e6033d0`, J5.6 projectile simulation at `2aee3356`, and J5.7 combined simulation closeout at `cdee7a4b`. J6.1 world-environment ownership is closed at `902076c0`; J6.2 canonical reveal generation and typed destination readiness is closed at `a6860d55` plus `acb845d8`; J6.3 exact F751/Position destination correlation is closed at `6a063a27`; J6.4 exact graphical-host acknowledgement and owner cleanup is closed at `18d17d8b`. J7's one graphical `GameRuntime` root is closed at `ce41efb9`, including the user's 2026-07-27 exact post-cutover visual acceptance. J8 closed Slice J at `a9a822f2` with one shared graphical/no-window root and generation-reset transaction. Slice K Linux headless/multi-session work is active; K0's tested no-presentation Windows/Linux boundary closed at `aada8a37`, K1's real portable single-session host closed at `f8cb840f`, and K2's deterministic scheduler plus complete shared bot command/event path closed at `7e8acb74` plus `38e83640`. K3 closed at `3f340125` after the shared-content/collision/isolation checkpoint, visible-terminal Windows and native Linux production runs, four-stop portal route, external-teleport handling, and user-accepted retail-observer movement. K4 resource and stability work is active; `cb512fd0` adds process-level CPU/memory/GC/descriptor/ownership/scheduler telemetry and corrects both pre-connect deadline arming and the Linux sub-millisecond scheduler busy loop. 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. --- @@ -1808,7 +1808,12 @@ port in any phase — no separate listing here. > event parity closed at `7e8acb74` plus `38e83640`; K3 closed at > `3f340125` after the shared-content/collision/isolation checkpoint, visible > Windows and native Linux production runs, exact portal routing, graceful -> teardown, and user-accepted retail-observer movement. K4 is active. +> teardown, and user-accepted retail-observer movement. K4 is active; +> `cb512fd0` adds one process-level resource/ownership sampling deadline, +> exact scheduler lateness/wakeup accounting, terminal convergence reporting, +> post-connect deadline rebasing, and the Linux sub-millisecond busy-wait +> correction. Windows/native-Ubuntu Headless tests pass 56/56 and the complete +> Release suite passes 8,773 / 5 skips. > The historical exact cutover > rollback remains > `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`. Slice H is complete: @@ -1855,7 +1860,9 @@ hitch and follows. > no-window Linux host and approximately 30-session target from > [`2026-07-26-modern-runtime-slice-k.md`](2026-07-26-modern-runtime-slice-k.md); > Slice L executes the graphical Linux/platform work. K0-K3 are complete and -> K4 is active. The historical LH rows below remain the stable outcome map. +> K4 is active. Its telemetry/CPU checkpoint is `cb512fd0`; exact fixed-binary +> connected baselines and automated 5/10/30-root endurance gates remain. The +> historical LH rows below remain the stable outcome map. The governing architectural rule is that a game session must not be a hidden `GameWindow`. Authentication, networking, world state, movement, inventory, diff --git a/docs/plans/2026-05-12-milestones.md b/docs/plans/2026-05-12-milestones.md index 25cda837..7bf6fde7 100644 --- a/docs/plans/2026-05-12-milestones.md +++ b/docs/plans/2026-05-12-milestones.md @@ -304,7 +304,15 @@ residency is `0/0/0` at every stable checkpoint and teardown converges. Slice I observer movement, graceful logout, and the corrected normal-position versus ForcePosition routing pass. Final gates report 412 Runtime, 47 Headless, 3,722 App / 3 skips, and 8,764 complete Release tests / 5 skips. K4 - 1/5/10/30-session resource-ceiling and stress work is active. + 1/5/10/30-session resource-ceiling and stress work is active. Its + `cb512fd0` telemetry checkpoint adds one process-level sampling deadline, + structured CPU/memory/GC/thread/descriptor/socket/ownership/content/ + scheduler metrics, exact terminal convergence, post-connect deadline + rebasing, and the Linux sub-millisecond busy-wait correction without adding + per-session workers or timers. Windows and native Ubuntu Headless tests pass + 56/56 and the complete Release suite passes 8,773 tests / 5 skips. The + exact-fixed-binary one/two-account baseline and automated 5/10/30-root + endurance gates remain. Slice-I closeout evidence is [`../research/2026-07-25-slice-i7-closeout.md`](../research/2026-07-25-slice-i7-closeout.md). Slice-J2 closeout evidence is diff --git a/docs/plans/2026-07-26-modern-runtime-slice-k.md b/docs/plans/2026-07-26-modern-runtime-slice-k.md index 88d7fcd5..70451bca 100644 --- a/docs/plans/2026-07-26-modern-runtime-slice-k.md +++ b/docs/plans/2026-07-26-modern-runtime-slice-k.md @@ -341,6 +341,18 @@ disposes only after the final host acknowledgement. ### K4 — 30-session stress and closeout +K4 telemetry checkpoint `cb512fd0` is complete. One process-level +absolute-deadline sampler now reports CPU, private/resident/managed memory, +GC, threads, handles, Linux descriptors/sockets, session/ownership debt, +shared-content leases, scheduler wakeups, and deadline lateness without adding +per-session workers or timers. The first native Linux two-account run exposed +and corrected both pre-connect deadline arming and a sub-millisecond +`Task.Delay` busy loop. Windows and native Ubuntu Headless tests pass 56/56; +the complete Release suite passes 8,773 tests / 5 skips. The user requested +that the active two-client observer process remain running, so the exact fixed- +binary connected baseline and numeric ceilings remain next. Evidence: +`docs/research/2026-07-27-slice-k4-resource-telemetry-checkpoint.md`. + - Measure a 1-session warm baseline, then 5, 10, and 30 sessions. - Before the final run, commit numeric ceilings derived from K3 evidence for: - incremental private bytes per established session; diff --git a/docs/research/2026-07-27-slice-k4-resource-telemetry-checkpoint.md b/docs/research/2026-07-27-slice-k4-resource-telemetry-checkpoint.md new file mode 100644 index 00000000..bfcda853 --- /dev/null +++ b/docs/research/2026-07-27-slice-k4-resource-telemetry-checkpoint.md @@ -0,0 +1,115 @@ +# Slice K4 resource telemetry checkpoint + +**Date:** 2026-07-27 +**Status:** Instrumentation and CPU-wakeup correction complete; fixed-binary +connected baselines remain active +**Production commit:** `cb512fd0` + +## Outcome + +The Linux headless process now emits one structured resource sample at +startup, every 30 seconds, before scheduler stop, and after terminal disposal. +Sampling is driven by the existing process scheduler's absolute deadline. It +does not add a worker, timer, or callback per session. + +Each sample reports: + +- working set, private bytes, virtual bytes, total CPU time, interval CPU as + both core-equivalent and machine-normalized percentages; +- managed live, heap, fragmentation, committed and allocated bytes, memory + load, GC pause percentage, and generation counts; +- process thread/handle counts and Linux file/socket descriptors; +- configured, in-world, faulted, reconnecting, and converged Runtime roots, + entity/inventory totals, and exact host-lease count; +- scheduler waits, turns, catch-up collapses, late-deadline count, mean and + maximum lateness; +- shared-content lease count, mapped virtual bytes, disposal state, and final + convergence. + +No account password or credential reference is included in this schema. + +## Two-account connected evidence + +One native Linux process connected the two locally available accounts: + +- `testaccount` / `+Acdream` +- `testaccount2` / `+Horan` + +Both entered Rynthid and maintained independent Runtime roots and movement. +The user asked that this process stay running for the retail-observer gate. + +The first process sample after both world entries reported: + +| Metric | Value | +|---|---:| +| private bytes | 207,966,208 | +| working set | 191,553,536 | +| managed live bytes | 71,108,368 | +| threads | 16 | +| handles | 115 | +| Linux descriptors | 114 | +| socket descriptors | 3 | +| shared content leases | 2 | +| mapped package virtual bytes | 29,908,271,024 | + +The roughly 29.9 GB mapped-package value is address space, not resident or +private memory. The mmap remains shared and demand-paged. + +After movement and additional portal/density activity, the latest recorded +sample before this checkpoint reported 305,393,664 private bytes, 332,742,656 +working-set bytes, 139,609,360 managed live bytes, 418 entities, 16 threads, +117 handles, and the same three socket descriptors. Entity count changed from +187 to 418 during that interval, so the memory delta is not treated as a +same-workload per-session ceiling. + +## Scheduler finding and correction + +The connected samples exposed two distinct scheduler problems: + +1. scheduler deadlines began during host construction, before sequential + account connects completed, producing a false initial catch-up and a + roughly 615 ms maximum-lateness sample; +2. the final positive sub-millisecond `Task.Delay` remainder rounded down to + zero on Linux, causing millions of wait-loop turns between actual 15 ms + simulation deadlines. + +The correction: + +- rebases every session and observation deadline exactly once after all + configured sessions enter the world; +- refuses to rebase a scheduler that has already dispatched; +- rounds only positive sub-millisecond timer waits up to one millisecond; +- retains the 15 ms absolute simulation cadence and bounded catch-up rules. + +The process still under user observation was intentionally not restarted, so +its high wait counter belongs to the pre-correction artifact. The committed +correction is protected by deterministic rebase/lateness tests and a real +system-timer test that fails if the scheduler busy-loops between turns. + +## Automated gates + +- Windows Headless Release: 56 passed. +- Native Ubuntu Headless Release: 56 passed. +- Complete Windows Release suite: 8,773 passed / 5 skipped. +- Windows and native Ubuntu Release builds complete. +- Diagnostics assert two configured sessions, no password text, and exact + two-runtime terminal convergence. + +## Remaining K4 gate + +The next connected restart must use exact binary `cb512fd0` or a documented +descendant and prove the wait counter remains cadence-bounded, initial +catch-up remains zero, CPU falls accordingly, and terminal resource samples +converge. Available credentials support a two-account connected scale gate. +The 5/10/30-session isolation and endurance dimensions therefore remain +automated in-process gates unless additional local ACE accounts are +provisioned. + +Numeric ceilings are not yet committed: they will be derived only from the +fixed binary under matched 1- and 2-session workloads. + +## Rollback + +```text +git revert cb512fd0 +``` diff --git a/memory/project_modern_runtime_headless.md b/memory/project_modern_runtime_headless.md index 671f259e..acd7c8c3 100644 --- a/memory/project_modern_runtime_headless.md +++ b/memory/project_modern_runtime_headless.md @@ -7,6 +7,13 @@ Slice J is closed. Slice K0-K3 are closed; K4 is active. K3's production closeout commit is `3f340125`. Its automated predecessors are `12b500d3`, `9569dadb`, and `b6547ff3`. +K4's resource-telemetry/CPU checkpoint is `cb512fd0`. It adds one +process-scheduler observation deadline, structured process/managed/session/ +content/scheduler metrics, exact post-disposal convergence reporting, startup +deadline rebasing, and the Linux sub-millisecond busy-wait correction. It does +not add per-session timers or workers. Windows and native Ubuntu Headless +tests pass 56/56; the complete Release suite passes 8,773 / 5 skips. + The Windows visible-terminal host and native Linux/WSL host both connected to local ACE without loading presentation assemblies. Linux completed the Aerlinthe/Caul/Rynthid/lifestone route, accepted external `teleallto` @@ -49,12 +56,14 @@ continues to use credential providers. Execute K4 from `docs/plans/2026-07-26-modern-runtime-slice-k.md`: -1. capture reproducible 1/5/10-session warm resource baselines; -2. derive and commit numeric per-session/process ceilings; -3. build the 30-session connected stress configuration and workload; -4. run the two-hour Linux soak with recurring movement, use, combat/cast, - chat, portal, cancellation, and reconnect; -5. prove stable final-hour plateaus and exact teardown convergence; +1. after the user finishes observing the current two clients, restart on exact + `cb512fd0` or a documented descendant; +2. prove cadence-bounded wait count, zero startup catch-up, reduced CPU, and + exact teardown convergence under matched one- and two-account workloads; +3. derive and commit numeric per-session/process ceilings; +4. run automated 5/10/30-root stress and endurance gates; the connected scale + gate is presently limited to the two available local ACE accounts; +5. prove stable plateaus and exact teardown convergence; 6. close Slice K, then start Slice L Linux graphical/platform work. Final K3 automated counts: Runtime 412, Headless 47, App 3,722 / 3 skips, @@ -65,3 +74,9 @@ K3 connected-closeout rollback: ```text git revert 3f3401257c83bdd9f557eb577ba08cf2e5ec9a06 ``` + +K4 telemetry/CPU rollback: + +```text +git revert cb512fd0 +```