acdream/docs/reviews/2026-08-18-r3-test-truth-ledger.md
2026-08-18 17:02:15 +02:00

1594 lines
94 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# R3 test-truth and cleanup ledger
Status: **complete**
Branch: `codex/release-stabilization`
Starting commit: `8e884679e0b6ce3dc1c84004ba9c5c8e3ff91d2a`
This is the cross-session authority for R3. The historical all-file audit remains
in [`test-quality-audit.md`](test-quality-audit.md); this ledger reconciles that
baseline against current source and records each cleanup decision before code is
removed. R3 does not change product behavior.
## Current executable baseline
The clean R2 gate at implementation commit `c38f6b88` built all 44 maintained
projects with zero warnings and ran every default test assembly once:
- 12 test assemblies;
- 14,742 passed;
- 77 reported skipped;
- 0 failed; and
- one redundant Core theory row discarded by xUnit discovery before the totals.
The six-case reduction from the earlier 14,748-pass headline is understood:
seven launcher editor-focus theory rows were consolidated into one fact that
still executes all seven variants in a single Avalonia application session.
## Fresh reproducible syntax inventory
`tools/audit-test-inventory.ps1` now regenerates the complete attributed-method
manifest from tracked C# test sources with Roslyn:
```powershell
pwsh ./tools/audit-test-inventory.ps1
```
The generated JSON lives under ignored `artifacts/test-audit/`; it is not a
second 6.8 MB checked-in source of truth. The script and this reviewed ledger
are durable, while paths and line numbers regenerate after every batch. The
final closeout inventory at implementation commit `14d371a0` reports:
| Syntax signal | Current count |
|---|---:|
| Tracked/parsed C# test files | 1,254 / 1,254 |
| Attributed test methods (not expanded theory cases) | 11,414 |
| Exact duplicate-data rows | 0 |
| Reviewed body-equivalent groups / methods | 11 / 27 |
| Methods containing at least one empty `return;` | 138 |
| Empty-return sites | 143 |
| Direct / same-file-helper prerequisite-return candidates | 2 / 1 |
| Mechanical output-only candidates | 2 |
| Constant-truth assertion methods / sites | 0 / 0 |
| Reviewed syntactic self-comparison methods / sites | 4 / 5 |
| Reviewed diagnostic methods | 82 |
| Methods directly using `Thread.Sleep` / `Task.Delay` | 15 / 14 |
| Cancellable-infinite-only / elapsed-time methods | 5 / 24 |
| Methods directly reading environment variables | 47 |
| Methods directly / in total reading `.cs` source text | 21 / 22 |
The three remaining prerequisite-return candidates are all reviewed branch
false positives: the two Windows/Linux factory assertions and the launcher's
cross-platform directory-link helper. Every true prerequisite return found by
the inventory now fails explicitly inside its selected non-hermetic lane. The
remaining 143 empty returns are behavioral control flow, callback exits, or
the three platform branches; they are not missing-prerequisite passes.
The output-only classifier follows same-file helper calls, so an assertion used
only while constructing a probe can prevent an otherwise diagnostic method from
appearing in its two-candidate result. The reviewed `Purpose=Diagnostic` set is
therefore the authority: Batch C's 51 methods, six artifact/report writers from
Batch L, and 25 fixture-sanity-only investigations from Batch R, for 82 methods
and 103 discovered cases (35 App, 68 Core). Their investigative output and
historical rationale remain executable outside the release total.
The five syntactic self-comparisons are reviewed, not vacuous: two call a hash
twice to assert determinism, one reads the singleton twice, and two read the
same Runtime owner's properties twice to assert stable identity. The inventory
keeps these candidates visible separately from the now-zero constant-truth
assertions.
## Exact 77-skip reconciliation
The latest clean-gate TRX files account for every reported skip:
| Classification | Count | Current source | R3 decision |
|---|---:|---|---|
| Installed retail DAT lane | 73 | `InstalledDatFactAttribute` across nine files | Retain the contracts, replace the campaign-specific shared reason with prerequisite- and suite-specific identity, and report this lane separately. Batch B assigns all nine classes to `Lane=InstalledDat`. |
| Manual fixture generation | 2 | `ChatLayoutFixtureGenerator.GenerateChatFixture`; `RadarLayoutFixtureGenerator.GenerateRadarFixture` | Delete both redundant generators: the existing comprehensive `RetailLayoutFixtureGenerator` already owns their chat and radar outputs. Assign that generator to the explicit Manual lane. |
| Empty future scaffold | 1 | `PvsConformanceTests.Pvs_CottageInterior_MatchesRetailCellDrawList` | Delete the test. Preserve its retail oracle and capture recipe here and in the existing P0 plan. |
| Known product failure | 1 | `TowerAscentReplayTests.TowerAscent_StaircaseStaysConeVisible_EveryStep` | Do not pretend this is unavailable coverage. Keep the oracle and move it to an explicitly reported known-failure/non-blocking lane until #119 is fixed. |
Installed-DAT skip distribution:
| Test class | Count |
|---|---:|
| `ChargenPreviewControllerTests` | 10 |
| `CharacterCreationLiveDatTests` | 42 |
| `CharacterManagementLiveDatTests` | 3 |
| `DatStringEscapeSweepTests` | 1 |
| `LayoutImporterMediaBearingChildSweepTests` | 3 |
| `MapHousePanelLiveDatMountTests` | 1 |
| `MapNoteLiveDatTests` | 3 |
| `TooltipLiveDatTests` | 7 |
| `UiButtonCorpusSweepTests` | 3 |
The 11 source sites that conditionally threw `SkipException.ForSkip` were not
part of the R2 77 because their prerequisites happened to be available on that
machine. Batch G preserves their reasons but replaces the misleading dynamic-
skip exception with explicit lane-prerequisite failures. No static skip or
`SkipException.ForSkip` remains in current test source.
The lane vocabulary is deliberately orthogonal:
- `Lane` states the execution environment (`InstalledDat`, `PreparedPackage`,
`Live`, `Manual`, `Windows`, `Linux`, or `SystemFont`);
- `Purpose=Diagnostic` marks output/investigation apparatus that cannot add to
the contract-test pass count; and
- `Status=KnownFailure` keeps a named executable oracle visible without making
a green release claim.
The default gate excludes all three dimensions. An explicitly selected lane
must fail clearly when its prerequisite is missing; it may not pass through an
empty return. The 73 custom installed-DAT facts retain discovery-time skips
when their opt-in is absent so each unavailable contract and reason remains
identifiable in the lane report.
## Finding disposition
| Finding | Current disposition | Evidence / next action |
|---|---|---|
| T-001 launcher lock inversion | resolved in R1 | Deterministic captured-callback regression and bounded full gate. |
| T-002 physics tautology | high-confidence cleanup batch A | Compare old-model and new-model reflection decisions, as the surrounding contract states. |
| T-003 duplicate theory row | high-confidence cleanup batch A | Remove literal `0x41000012`, which is identical to `MotionCommand.Crouch`; remove the temporary analyzer suppression. |
| T-004 warning mismatches | resolved in R2 | Clean rebuild is zero-warning with repository-wide warnings-as-errors. |
| T-005 dormant panel stack | resolved in batches P and V | No shipping code implements `IPanelRenderer`/`IPanelHost` or constructs `ChatPanel`, `DebugPanel`, or `VitalsPanel`, but the architecture explicitly preserves this first-party developer-panel contract for issue #258. Batch V removes exactly 26 fake-renderer self-tests and two compiler-generated `PanelContext` record tests while retaining `FakePanelRenderer` and all 23 executable panel behavior contracts. |
| T-006 misleading installed-DAT reason | resolved in batch B | Shared opt-in is now `ACDREAM_RUN_INSTALLED_DAT_TESTS=1` (legacy switch retained), the reason names the lane, and all nine owners carry `Lane=InstalledDat`. |
| T-007 271 silent passing gates | resolved in batch G | All 280 directly found gates plus three later-reconciled sites now fail explicitly when their selected lane lacks its prerequisite. The only three syntax candidates left are reviewed cross-platform branch false positives. |
| T-008 incapable-of-failing diagnostics | resolved in batches A, C, and L | The literal wiring smoke test was deleted, the GPU contract tautology was repaired, and the six remaining constant-truth diagnostic assertions were removed after their output was preserved under `Purpose=Diagnostic`. |
| T-009 wall-clock double-click tests | resolved in batch E | Four sleeps were replaced by a deterministic test clock behind an internal factory overload. The production factory still reads `Environment.TickCount64` exactly as before. |
| T-010 two useless cases | high-confidence cleanup batch A | Delete `SmokeTest.TestProject_IsWired` and `ChaseCameraTests.ImplementsICamera`; compilation already proves both claims. |
| T-011 diagnostic-only methods | resolved in batches C, L, and R | The reviewed current set is 82 methods / 103 cases. All carry `Purpose=Diagnostic`, preserving the apparatus while removing it from release pass totals. Batch R catches investigations whose only assertion validates fixture/DAT availability, which the original mechanical output-only scan could not distinguish from an oracle. |
| T-012 source-text freezes | direct-read map completed in batch I, helper-mediated gap corrected in batch U, and staged replacement active | Seventeen whole-tree architecture rules and five cross-artifact contracts stay. Batches W/X retire the first 15 literal implementation freezes beside stronger behavior or compiled-metadata evidence; 70 staged replacements remain. |
| T-013 controller self-comparison | high-confidence cleanup batch A | Capture the first controller next to the first body and compare every retry with that reference. |
| T-014 seven load-sensitive tests | six mechanisms repaired in batch F; one product defect classified | Virtual/wall-clock mixing, tiered-JIT allocation noise, a live controller clock, and a ThreadPool-start timing oracle were removed without weakening behavioral contracts. `DatSoundCache` #321 is a real in-flight-entry race and now runs as `Status=KnownFailure` pending a product fix. |
| T-015 four non-prerequisite skips | resolved in batches A/B | PVS scaffold deleted with rationale preserved; redundant chat/radar generators deleted in favor of the comprehensive Manual lane; tower oracle is `Status=KnownFailure`. |
| T-016 historical test taxonomy | resolved in batches J, Q, R, and T | Opaque AP/R/J/K/Slice and `SCRATCH` labels have been removed from maintained regression identities while provenance stays in comments and ledgers. The user approved retaining the 47 descriptive `Issue###` files because their IDs connect executable contracts to retail evidence. |
| T-017 Avalonia ownership | batch D's window cleanup was necessary but incomplete; runner lifetime fixed in batch S | Batch R's clean gate reproduced a compositor thread-affinity cleanup failure. The sole combined Avalonia fact still used the package's default per-test application isolation. Batch S explicitly owns one application/dispatcher for the assembly's one UI fact; 25 focused processes, 25 complete Launcher assemblies, and the complete gate pass. |
| T-018 stderr observer race | resolved in R2 | Live reader shares writes/deletes; 25 focused repetitions plus the complete gate. |
| T-019 remaining explicit waits | resolved in batches MO | All nine fixed-delay negative oracles now use observed monitor/thread/lease/process state. The remaining 24 elapsed-time methods are the reviewed cancellation, real-time protocol, cooperative-yield, bounded-polling, and positive-timeout categories from Batch H. |
| T-020 exact duplicate bodies/data | resolved in batch K | Four redundant executions were removed. The remaining 11 body-equivalent groups are intentionally split theories with disjoint, meaningfully named datasets; the inventory enforces zero repeated rows within a theory or across body-equivalent theories. |
| T-021 suspicious assertion shapes | resolved in batch L | The inventory enforces zero `Assert.True(true)` / `Assert.False(false)` sites and reports syntactic self-comparisons for review. All five current self-comparisons assert meaningful determinism or stable identity. |
## Preserved rationale for removals in batch A
### PVS scaffold
The empty PVS fact has no executable oracle and must not remain a permanent
skip. Its useful note is preserved here: retail
`PView::ConstructView(CEnvCell*)` at `0x005a57b0` produces the ordered
`cell_draw_list` for a `(viewer_cell, eye)` input. A future conformance test
requires a retail trace captured around `PView::DrawCells`/`cell_draw_list`.
The intended invariants were: the PVS root equals `physics CurrCell.Id`; a cell
seen through two portals appears once per slice; and dungeon
`outside_view == 0`. The complete original scaffold and capture plan remain in
`docs/superpowers/plans/2026-06-03-p0-conformance-apparatus.md`.
### Compile-only smoke cases
`SmokeTest.TestProject_IsWired` contains only `Assert.True(true)`.
`ChaseCameraTests.ImplementsICamera` assigns `ChaseCamera` to `ICamera` and
calls `ToString()` without an oracle. Removing them discards no runtime
contract: the test project build and the remaining camera behavior tests are
strictly stronger evidence.
## Batch protocol
Each cleanup batch must:
1. update this ledger before or with the change;
2. preserve useful historical rationale in a plan, issue, or this ledger;
3. run the directly affected test projects without retries;
4. run a clean warning-as-error build when analyzer/discovery shape changes;
5. commit one coherent classification/fix group; and
6. run the complete local Release gate before R3 closeout.
Ambiguous cases stay open in this ledger and are presented to the user rather
than being deleted by inference.
## Batch A verification
The first high-confidence batch was verified before commit:
- complete non-incremental Release rebuild: 44 projects, 0 warnings, 0 errors;
- Core: 4,795 passed / 0 skipped / 0 failed;
- App: 5,511 passed / 76 skipped / 0 failed; and
- Runtime: 1,756 passed / 0 skipped / 0 failed.
The count delta is intentional and classified: Core removed the two useless
compile-only cases and the skipped PVS scaffold; App gained one case by
splitting the old mixed/tautological depth-stencil test into two independently
named contracts. Core emitted no duplicate-case discovery warning.
## Preserved rationale for removals in batch B
The chat- and radar-only fixture generators were not the sole way to recreate
their committed JSON. `RetailLayoutFixtureGenerator` already includes retail
layout IDs `0x2100006F` and `0x21000074` and writes the same
`chat_2100006f.json` and `radar_21000074.json` destinations as part of its
complete 20-layout run. Deleting the two permanently skipped duplicates removes
two false test entries without losing the regeneration recipe or retail notes;
the comprehensive generator and `docs/release-gate.md` now own that workflow.
The tower staircase oracle is not unavailable or useless. Its former static
skip documents issue #119 and the exact failing steps. Batch B keeps the
executable assertion under `Status=KnownFailure`, separates two output-only
methods with `Purpose=Diagnostic`, and makes missing installed DATs a clear lane
prerequisite failure instead of a passing early return.
## Batch B verification
The lane-classification batch was verified without changing product code:
- App Release build: 0 warnings, 0 errors;
- hermetic App lane, isolated: 5,505 passed / 0 skipped / 0 failed;
- Installed-DAT contract lane without opt-in: 3 passed / 73 individually named
skips / 0 failed (the local tower DAT prerequisite was available);
- known-failure discovery: exactly one tower staircase oracle; and
- Manual discovery: exactly one comprehensive fixture generator.
One concurrent three-host verification attempt reproduced T-014 rather than
being hidden: the hermetic host failed the portal-clipping zero-allocation test
at 6,904 bytes while the Installed-DAT and discovery hosts ran beside it. The
same unmodified hermetic command then passed 5,505/5,505 in isolation. This is
evidence for removing cross-host allocation sensitivity; it is not grounds to
weaken the assertion or claim a clean concurrent result.
## Batch C diagnostic classification
Batch C assigns the reviewed 51-method diagnostic set to
`Purpose=Diagnostic`. No body, output, historical comment, or fixture is
removed. This resolves the misleading release accounting without pretending
that every investigation has a stable regression oracle.
The 15 contract-shaped methods called out by T-011 now have a `Diagnostic_`
prefix: four facility-hub scenarios, six stair/camera sweeps, two ambient-slot
inventories, production-emission replication, and two drawn-polygon reports.
Their current output and historical method references are preserved, while the
new names no longer imply an asserted oracle. Promoting them back into the
hermetic lane requires an asserted expected result; R3 will not invent those
values.
Batch C verification:
- App Release build: 0 warnings, 0 errors;
- Core Release build, serialized after App: 0 warnings, 0 errors;
- hermetic App: 5,479 passed / 0 skipped / 0 failed;
- hermetic Core: 4,753 passed / 0 skipped / 0 failed; and
- diagnostic discovery: 28 App + 42 Core = 70 cases from 51 methods.
An attempted parallel App/Core build collided on the shared
`AcDream.Plugin.Abstractions` intermediate DLL. The repository gate serializes
projects, so the authoritative verification is the two isolated clean builds
above; no code or assertion was changed in response to that tooling collision.
## Batch D prerequisite lanes and Avalonia ownership
The reviewed prerequisite map classifies every true candidate without deleting
its existing guard:
| Lane | Attributed methods | Prerequisite |
|---|---:|---|
| `InstalledDat` | 336 | Installed retail DAT directory; includes the 73 custom installed-DAT facts and whole DAT-backed investigation classes. |
| `PreparedPackage` | 2 | Installed DATs plus validated `acdream.pak`. |
| `Live` | 3 | Explicit live handshake opt-in and reachable service. |
| `Manual` | 1 | Explicit fixture-regeneration opt-in. |
| `Windows` | 7 | Windows-only filesystem/process/timer behavior. |
| `Linux` | 10 | Linux permission/signal/monotonic-clock behavior. |
| `SystemFont` | 2 | A host system TTF available to the BitmapFont path. |
Class-level traits legitimately cover some additional methods that share the
same fixture owner, so the 336 installed-DAT method count is larger than the
280 syntax candidates. The only candidate methods without a lane are
`GraphicalHostPlatformServicesTests.CurrentPlatformOwnsPathsPacingAndNativeClosure`
and
`LinuxMonotonicFramePacingWaiterTests.PlatformFactorySelectsCurrentOperatingSystem`.
Both are hermetic cross-platform branch tests: on Windows or Linux they assert
the matching branch and return only after the assertion. They are not silent
prerequisite passes.
The 11 conditional `SkipException.ForSkip` source sites are also reconciled.
They serve 12 test methods: installed-DAT asset contracts, one prepared-package
contract, and two system-font contracts. xUnit v2 reports that exception shape
as a failure rather than a dynamic skip, but the owning lanes now keep them out
of the hermetic total. A later body-cleanup batch will replace the misleading
skip wording/exception with explicit prerequisite failure or discovery-time
lane behavior.
The first complete Batch D gate correctly failed in Launcher cleanup after
14,396 passes: the six `MainWindowViewTests` Avalonia facts could start and
destroy isolated thread-affine compositors on different xUnit workers. The
assertion bodies were preserved as six named private phases under one
`CompiledMarkupAndEveryModalFocusPathRunInOneOwnedAvaloniaSession` fact. The
focused two-case class then passed in 25 consecutive fresh processes (50/50
results), and the same full-gate context passed.
Batch D verification:
- complete 44-project Release build: 0 warnings, 0 errors;
- final syntax manifest: 11,450 attributed methods, 51 diagnostics, one known
failure, 282 prerequisite-return candidates, and only the two reviewed
cross-platform false positives unlaned;
- complete hermetic Release gate: 14,392 passed / 0 skipped / 0 failed across
all 12 test assemblies in 131.518 seconds; and
- Launcher view stress: 25 fresh processes, 2/2 cases per process, no cleanup
or ownership failures.
The 350-pass reduction from the clean R2 headline is exactly explained: batch A
netted minus one case; batch B removed six non-hermetic passes; batch C removed
68 newly classified diagnostic cases; batch D removed 270 prerequisite-lane
passes; and consolidating the six Avalonia sessions into one removed five case
IDs without removing any assertion phase. All 77 former default skips are also
accounted for by the PVS deletion and batch-B lane/deletion decisions.
## Batch E indirect gates and deterministic input time
The inventory now follows same-file helper calls when looking for prerequisite
returns. It found one additional path:
`LauncherSelfUpdateProcessTests.BackupJunctionOrSymlinkAfterCanonicalCrashCannotMutateOutsideOrLaunch`
calls `CreateDirectoryLink`, whose non-Windows branch creates the symbolic link
and then returns before the Windows `mklink /J` implementation. This is a
reviewed cross-platform control-flow branch, not a prerequisite gate or silent
pass. The combined direct/indirect candidate count is therefore 283: 280 true
lane-owned gates and three reviewed branch false positives.
The four `InputDispatcherDoubleClickTests` no longer sleep for 10 or 600 real
milliseconds. `InputDispatcher` has an internal, test-assembly-only factory
overload accepting the same millisecond tick delegate used by double-click
recognition. The public production factory remains wired directly to
`Environment.TickCount64`; only the tests use a manually advanced counter.
The focused class passes 4/4 in 17 ms with exact 10 ms and 600 ms virtual
intervals. The complete Release build then passed with 0 warnings/errors, and
the no-retry hermetic gate passed 14,392/14,392 with zero skips or failures.
## Batch F load-sensitive contracts
The seven cases in T-014 have now been separated into six unreliable test
mechanisms and one real product defect:
- #308 `NakEmissionTests.LossSoak...` no longer mixes its virtual transport
clock with a 60-second `DateTime.UtcNow` cutoff and fixed sleeps. Its two
convergence phases each permit exactly 120 half-second virtual steps and
yield to the background receiver. The full 10,000-message oracle is intact;
25 fresh-process repetitions pass.
- #302 and #346, the two `PortalProjectionTests` allocation contracts, now
cross tiered-JIT/PGO thresholds before measuring and take the minimum of five
warmed 1,000-operation batches. A linear result-array regression would
allocate in every batch and still fail far above the existing ceilings.
- #336 `RuntimeCollisionReportingStateTests.WarmedSteadyContactRefreshDoesNotAllocate`
now earns the word "warmed": it performs one complete 10,000-refresh warmup
and requires at least one of five subsequent 10,000-refresh batches to
allocate exactly zero bytes. It passes in 25 fresh processes.
- #340 `StreamingWorkBudgetTests.DestinationAndEmptyUnloadPriorityNeverBypassPublicationBudget`
now supplies a frozen meter clock through an internal test-only constructor.
The public production constructor still supplies `Stopwatch.GetTimestamp`
and `Stopwatch.Frequency` exactly as before.
- #402 `LandblockBuildFactoryTests.Build_UsesTheSuppliedSharedReaderGate` now
starts a dedicated thread and observes it in `WaitSleepJoin` on the held
monitor before checking that no DAT read occurred. It no longer treats a
ThreadPool start within two seconds or an arbitrary 100 ms wait as evidence.
- #321 `DatSoundCacheTests.GetWave_ConcurrentSameId_PublishesOneCanonicalWaveAndDecodesOnce`
exposes a real race. A caller can pass the resident-cache check, pause, and
reach `_inflight` after the winning caller has admitted the wave and removed
its `Lazy`, producing a second decode. The assertion and rationale are
preserved under `Status=KnownFailure`; R3 makes no cache behavior change.
The four changed App cases pass 100/100 across 25 fresh processes. The Runtime
allocation case passes 25/25, and the Core.Net loss soak passes 25/25. Complete
batch verification then passed: the 44-project Release build reports zero
warnings/errors, the refreshed inventory reports two explicit known-failure
methods and 15 remaining direct `Thread.Sleep` methods, and the no-retry
hermetic gate passed 14,391/14,391 with zero skips or failures. The one-pass
reduction is exactly #321 leaving the release lane.
## Batch G honest prerequisite lanes
Batch G removes every true silent prerequisite pass found by the direct and
same-file-helper inventory. Across 101 test files, 283 lane-owned `return;`
sites now report a prerequisite failure when that lane was explicitly
selected: 261 installed-DAT, ten Linux, seven Windows, three Live, and two
prepared-package methods. Seventeen platform guards throw
`PlatformNotSupportedException`; the remaining gates use lane-specific
assertion failures. Production behavior and every contract assertion after the
guard are unchanged.
The eleven conditional `SkipException.ForSkip` sites now use explicit
prerequisite failures as well. Their asset, package, or font reason is retained,
but a selected lane can no longer look green by dynamically skipping the
contract. The refreshed syntax inventory finds zero true silent-prerequisite
candidates. Its three remaining candidates are the reviewed Windows/Linux
branch returns recorded in Batch E.
The focused installed-DAT run also exposed a taxonomy error rather than a
product failure: 19 interactive layout methods need a retail DAT directory but
are operator-driven probes, not automated DAT contracts. They now live under
`Lane=Manual`, divided into `ManualTask=LiveMountProbe` (13) and
`ManualTask=PowerbarProbe` (6). The comprehensive existing generator is
separately named `ManualTask=FixtureGeneration`, so selecting a probe cannot
rewrite committed fixtures. Current attributed-method lane ownership is:
| Lane | Methods |
|---|---:|
| `InstalledDat` | 317 |
| `PreparedPackage` | 2 |
| `Live` | 3 |
| `Manual` | 20 |
| `Windows` | 7 |
| `Linux` | 10 |
| `SystemFont` | 2 |
Focused verification before the complete gate:
- Release build of all 44 maintained projects: 0 warnings, 0 errors;
- installed-DAT contracts: 311/311 passed (App 150, Bake 3, Content 28,
Core 130);
- prepared-package contracts: 2/2 passed against the validated local package;
- Windows contracts: 7/7 passed; system-font contracts: 2/2 passed;
- manual live-mount probes: 13/13 passed; manual powerbar probes: 6/6 passed;
- a Linux contract selected on Windows failed with the explicit wrong-host
reason; and
- a Live contract selected without opt-in failed with the explicit
`ACDREAM_LIVE=1`/reachable-server prerequisite reason.
The fixture-generation task was intentionally not executed: its documented
purpose is to rewrite fixture files, while this R3 batch is review/test-only.
The no-retry complete hermetic Release gate passed 14,391/14,391 with zero
skips or failures across all 12 test assemblies.
## Batch H explicit-wait classification
The syntax inventory now records every direct `Thread.Sleep` and `Task.Delay`
invocation instead of treating both method-level booleans as equivalent. The
38 attributed methods divide into six materially different groups:
| Wait purpose | Methods | R3 disposition |
|---|---:|---|
| Cancellable infinite suspension in a fake | 5 | Keep. `Task.Delay(Timeout.InfiniteTimeSpan, token)` advances only through the cancellation being tested and consumes no elapsed-time oracle. |
| Intentional real-time protocol/timeout contract | 4 | Keep with explicit bounds: two Live handshake race delays, the one-second net-probe cadence, and continuous unrelated shutdown drain. |
| Cooperative yield while virtual-clock/background transport work drains | 8 | Retain for now; prefer an observable receiver/worker signal when that seam exists. The virtual behavioral oracle does not derive from the sleep duration. |
| Bounded completion/readiness polling | 11 | Retain as integration polling with a terminal assertion and deadline; improve opportunistically with events, not by busy-spinning. |
| Fixed delay used to prove another operation is still blocked | 9 originally; 0 remain | Batches MO replace all nine with observed monitor/thread/lease/process state. |
| Positive completion timeout guard | 1 | Keep. The two-second `WhenAny` in `RuntimeCharacterStateTests` fails only if the operation does not complete; it does not delay a passing run. |
The original nine fixed-delay negative oracles are:
1. `LiveSessionCommandRouterTests.ConcurrentDispose_WaitsForInFlightTransportThenMakesRouterInert`;
2. `HostQuiescenceGateTests.ExternalStopWaitsForAdmittedCallbackToReturn`;
3. both `SilkWindowCallbackBindingTests.ConcurrentDispose...` contracts;
4. `LandblockStreamerPoolTests.Dispose_JoinsEveryWorkerInThePool`;
5. `LandblockStreamerTests.DisposeAndConcurrentDisposeWaitForInFlightLoad`;
6. `HeadlessPluginSessionTests.LateSubscriberReplayQueuesConcurrentRegistrationExactlyOnceInOrder`;
7. `LauncherInstallerTests.IndependentInstallersSerializeAndWaitingCancellationTouchesNothing`; and
8. `LauncherInstallerTests.OrphanBakeCanNeverPublishAfterRestartRecovery`.
This classification is review evidence, not a claim that the remaining waits
are flaky. The inventory run at `6faeb4a1` parsed all 1,256 tracked C# test
files and reproduced 15 sleep methods, 23 delay methods, five cancellation-
only methods, and 33 methods with some elapsed-time wait.
## Batch I source-text replacement map
Batch I's first inventory found 63 attributed methods that directly read `.cs`
source text. Batch U later proved that count was incomplete: tests that called
a local `BuilderSource()`, `ReadSource(...)`, or method-group
`File.ReadAllText` helper were invisible to the direct body regex. The
corrected syntax inventory follows same-file helper calls, recognizes invoked
and method-group readers, and only treats actual string content—not comments
such as `GameWindow.cs:5893`—as a C# path signal. It finds 67 direct and 40
helper-mediated methods, 107 total.
Manual reconciliation assigns every candidate to one of three dispositions:
| Disposition | Methods | Owning test files |
|---|---:|---|
| Implementation-shape or test-model freeze; replace in stages | 85 | Thirty files across composition, input/physics/network wiring, graphical host/render ownership, Runtime gameplay-owner wiring, streaming, and frame orchestration; the exact stage manifest follows below. |
| Whole-tree architecture policy; retain, then make syntax/metadata-aware | 17 | `LinuxPlatformBoundaryTests`, `RenderSceneArchitectureTests`, `RuntimePhysicsOwnershipTests`, `RuntimeEntityOwnershipTests`, plus the whole-tree methods in `RuntimeActionOwnershipTests` and `RuntimeMovementOwnershipTests`, `RuntimeWorldTransitOwnershipTests`, and `RuntimeDatAccessArchitectureTests` |
| Source/project/artifact text is the actual cross-artifact contract; retain | 5 | `ParticleBindlessInstanceTests`, `PerformanceToolsTests`, `LauncherProjectBoundaryTests` |
The 85 implementation/test-model facts were useful during mechanical ownership
cutovers and defect investigations, but are not durable behavioral evidence.
They pin constructor spellings, local names, exact call fragments, regex-shaped
method bodies, or statement order; comments can satisfy many of their
`Contains` checks, while a harmless equivalent refactor can fail them. Their
intent is often valuable—single ownership, ordering, handoff, teardown,
absence of a parallel path, or continued validity of a synthetic test model—so
wholesale deletion would discard real notes and weaken some boundaries.
R3 therefore uses this replacement rule for those 85 facts:
1. preserve the ownership/order rationale in the architecture document or this
ledger;
2. identify an existing behavioral, lifetime-ledger, project-reference, or
reflection/Roslyn guard that proves the same claim;
3. add the semantic replacement first when none exists; and
4. remove the literal source freeze in the same small batch.
The 17 whole-tree rules remain valuable even before conversion: they ban
platform calls outside owners, enforce assembly/namespace containment, and
prevent duplicate Runtime entity, physics, movement, action, transit, and DAT
authorities. The five cross-artifact tests compare two independently consumed
artifacts (for example CPU/shader constants, launcher
project/workflow/markup, and CLI route tooling); reading text is appropriate
there.
No source-freeze fact is removed in this classification batch. The 85 staged
facts are an ambiguous architecture decision and will be presented for user
approval in behavior-owner groups rather than deleted from a numeric heuristic.
### Source-freeze approval groups
The 46 campaign-era facts are not equivalent. Their current semantic coverage
and safest replacement path divide into six owner groups:
| Owner group | Facts | What the literal checks still prove | R3 recommendation |
|---|---:|---|---|
| Composition-root wiring | 13 | `GameWindow` calls the intended phase objects and no longer contains the extracted construction bodies. Phase-local tests cover ordering and rollback inside each phase, but not every root-to-phase link. | Keep until one symbol-aware composition-graph guard proves the root links. Then remove the literal constructor/local-name checks. |
| Runtime root, graphical host, and lifetime | 24 | One canonical Runtime root/command surface, typed owner handoffs, run/render/status ordering, acquisition order, and native-window-last shutdown. Existing Runtime/lifecycle tests prove much of the behavior, but several sole-owner and transfer claims remain unique. | Replace with direct ownership receipts, terminal-ledger assertions, observable host traces, and metadata dependency guards before removing any source freeze. |
| Render delegation and cleanup | 9 | Rendering is delegated and `GameWindow` does not regain leaf draw branches or resource ownership; several tests also pin exact renderer/preparation statement order. The owning render suites already exercise the executor, frame builder, renderer, and resource disposal behavior. | Best first conversion: add a symbol-aware boundary guard for absence/delegation and observable fake traces for order, then remove the literal checks. |
| Streaming publication | 4 | The window does not own render/physics publication bodies, captured build origins flow through the extracted owners, and streamer teardown follows session reset. Publisher/build/origin suites already provide broad behavioral coverage. | Best second conversion: consolidate the absence claims into a whole-tree architecture guard and retain the behavioral origin/teardown contracts. |
| Live-entity composition | 2 | Typed sources replace window closures and reset closes every streaming/readiness owner. Lifecycle tests cover convergence, but the exact constructor-shape claim is still literal. | Replace with constructor/field metadata inspection plus the existing teardown ledger; do not delete alone. |
| Frame orchestration and resource preparation | 14 | Exact-once publication, frame/resource-stage order, adapter ownership, and a deliberately thin `OnUpdate`. These are high-value order rules, but exact statement fragments are the most brittle implementation specification in the set. | Replace order assertions with observable fake event traces and use a symbol-aware dependency guard for the thin-root rule. This is the largest conversion and should be last. |
| Input, physics, and network wiring | 9 | Typed owner entry points, retry/reset wiring, and local/remote branch ordering remain at exact source locations. Behavioral controller suites cover the operations, but not every production composition route. | Add symbol-aware call-graph boundaries and route the behavioral fixtures through the production entry seam before removing the text checks. |
| Runtime gameplay-owner wiring | 9 | UI/session/shutdown consumers borrow exact action, character, inventory, and movement owners without mirrors or second mutations. Runtime ledgers cover terminal ownership but several App consumer links are literal only. | Replace consumer links with metadata dependency checks and exact borrowed-instance integration assertions. |
| Test-model/source correspondence | 1 | The hand-called create-authority drift probe still models the executor's sole production advance site. | Expose an observable executor stage/receipt or re-derive the synthetic model before removing this explicit stale-model alarm. |
Approval should authorize this replacement sequence, not wholesale deletion:
render delegation, streaming, live entities, input/physics/network wiring,
composition roots, Runtime gameplay owners, Runtime/graphical-host lifetime,
frame orchestration, then the one test-model/source pin. If the semantic
replacement exposes a claim that exists only as historical campaign wording,
preserve the rationale and bring that individual deletion back for review.
The exact staged file manifest is:
| Stage | Facts | Complete owning-file set |
|---|---:|---|
| Render delegation and cleanup | 9 | `ResourceCleanupGroupTests`, `RetailPViewPassExecutorTests`, `WorldRenderFrameBuilderTests`, `WorldSceneRendererTests` |
| Streaming publication | 4 | `LandblockBuildOriginTests`, `LandblockPhysicsPublisherTests`, `LandblockRenderPublisherTests` |
| Live-entity composition | 2 | `GameWindowLiveEntityCompositionTests` |
| Composition-root wiring | 13 | `ContentEffectsAudioCompositionTests`, `FrameRootCompositionTests`, `HostInputCameraCompositionTests`, `InteractionRetainedUiCompositionTests`, `LivePresentationCompositionTests`, `SessionPlayerCompositionTests`, `WorldRenderCompositionTests` |
| Runtime root, graphical host, and lifetime | 24 | `GameWindowLiveSessionOwnershipTests`, `GameWindowCrashStatusTests`, `GameWindowRenderLeafCompositionTests`, `GameWindowHostBoundaryTests` |
| Frame orchestration and resource preparation | 14 | `UpdateFrameOrchestratorTests`, `RenderFrameResourceControllerTests` |
| Input, physics, and network wiring | 9 | `C3cF2AutoEntryWiringTests`, `C3cF1ProductionWiringTests`, `Issue270ProductionWiringTests`, `LiveEntityNetworkBranchRoutingTests` |
| Runtime gameplay-owner wiring | 9 | The non-whole-tree methods in `RuntimeActionOwnershipTests` and `RuntimeMovementOwnershipTests`, plus `RuntimeCharacterOwnershipTests` and `RuntimeInventoryOwnershipTests` |
| Test-model/source correspondence | 1 | `CreateAuthorityDriftModelSourcePinTests` |
This manifest accounts for all 85 methods exactly. It excludes the 17
whole-tree policy methods and five genuine cross-artifact text contracts.
## Batch P dormant panel reachability reconciliation
T-005's production-reachability half is now proved: repository-wide C# usage
contains no production `IPanelRenderer` or `IPanelHost` implementation and no
shipping construction of `ChatPanel`, `DebugPanel`, or `VitalsPanel`. The old
ImGui backend is gone; retained `UiHost`/`UiRoot` controllers are the sole
shipping presentation stack, and plugin UI uses
`IUiRegistry.AddMarkupPanel` rather than `IPanel`.
That does **not** make the complete abstraction useless. The architecture
document explicitly says `AcDream.UI.Abstractions` and the
`IPanel`/`IPanelRenderer` developer-panel contract survive intact for a future
host tracked by issue #258. `ChatVM` and `VitalsVM` are also live shared models
consumed by retained UI, so their model/parser/command tests are production
coverage and are outside T-005.
The dormant presentation-only subset currently contains 51 attributed methods
(57 expanded cases):
| Subset | Methods | Disposition |
|---|---:|---|
| `IPanelRendererWidgetTests` and `IPanelRendererMainMenuBarTests` | 26 | They exercise only `FakePanelRenderer`, not a production backend. Approved for removal in Batch V. |
| `PanelContextTests` | 2 | Only compiler-generated record round-trip/equality. Approved for removal in Batch V. |
| `ChatPanel` layout, input, focus, and colored-render behavior | 23 | Meaningful executable behavior for the explicitly preserved future developer-panel contract. Retain unless that architecture promise is intentionally retired. |
The earlier audit's recommendation to remove the whole stack was therefore too
broad. The maintainability problem is narrower: 28 harness/trivial contract
methods inflate release totals despite having no production renderer, while 23
panel behavior methods protect a deliberately dormant API. The UI framework
plan also has stale present-tense statements that ImGui remains permanent,
whereas the architecture authority correctly records its deletion; that is a
documentation-reconciliation item, not evidence that the old backend still
exists.
The proposed removal boundary is exact: all 17 methods in
`IPanelRendererWidgetTests.cs`, all nine in
`IPanelRendererMainMenuBarTests.cs`, and both in `PanelContextTests.cs`.
`FakePanelRenderer.cs` remains because the 23 retained `ChatPanel` behavior
methods use it as an observation seam. No production abstraction, panel,
ViewModel, parser, command test, or future-host rationale is in the removal
set. With no replacement cases, this decision alone would reduce the current
hermetic Release total from 14,379 to 14,351.
## Batch J descriptive test identities
The first T-016 naming batch changes no oracle or production behavior. It
renames eight opaque type/file identities and fifteen test methods whose AP,
R, J, K, C3c, or Slice labels described the implementation campaign rather
than the contract a maintainer needs to find:
| Former identity family | Durable identity |
|---|---|
| `GameWindowSlice8BoundaryTests` | `GameWindowHostBoundaryTests` |
| `Ap10WaterSemanticsTests`, `Ap71EntryRestrictionGateTests`, `Ap155StaticSpherePopulationMeasurementTests`, `Ap157SortingSphereFloodMeasurementTests` | `WaterSemanticsTests`, `EntryRestrictionGateTests`, `StaticSpherePopulationMeasurementTests`, `SortingSphereFloodMeasurementTests` |
| `ConnectedR6SoakContractTests` | `ConnectedWorldSoakRouteContractTests` |
| `C3cR1F3DriftModelSourcePinTests` | `CreateAuthorityDriftModelSourcePinTests` |
| `R5Host` / `R5ManagerHarness.cs` | `PhysicsObjHostStub` / `PhysicsManagerHarness.cs` |
| J4/J5 Runtime methods | gameplay-view, gameplay-command, checkpoint, simulation, and ownership-ledger names |
| K4/Slice-L/K1c/J9 methods | multi-session profile, unsupported-platform explanation, legacy keymap difference, and stop-speed behavior names |
| AP-135/AP-195 method names | placement-bookkeeping and authored-LED-sprite names |
Provenance is not discarded. AP-157 remains the row key in the retail
divergence register, the connected route keeps its established artifact name,
and historical audit/plan documents retain the old identifiers. Current
cross-references and test comments point to the new descriptive names. The
source-freeze class summary now states its R3 replacement status instead of
claiming to be a temporary Slice 8 checkpoint.
This batch intentionally does not rename the 47 `Issue###` files. Their
descriptive suffixes are often useful, and the issue number can be the shortest
path to a retail trace or reproduction. Re-homing those contracts by component
while retaining `Issue` provenance is an architecture/taxonomy choice for user
approval, not a mechanical cleanup.
Verification before the complete gate:
- all 44 maintained projects build in Release with 0 warnings and 0 errors;
- 102 focused App cases, 203 Core cases, 17 Runtime cases, 5 Headless cases,
1 Launcher.Core case, and 10 UI.Abstractions cases pass; and
- the renamed installed-DAT population measurement passes 1/1 against the
local retail DAT.
The no-retry complete hermetic Release gate passed 14,391/14,391 with zero
skips or failures across all 12 test assemblies.
## Batch K duplicate-body and theory-row truth
The inventory now fingerprints every attributed method body and compares
`InlineData` case-sensitively both within a theory and across theories with an
identical body. Case sensitivity prevents legitimate inputs such as `iris` /
`IRIS`, `Sunny` / `SUNNY`, and `0x` / `0X` from being mislabeled as duplicates.
The initial 14 body-equivalent groups contained four redundant executions:
- `VulkanCapabilityReportContractTests.TheReportFileNameIsTheOneTheWorkflowPathNames`
duplicated the report-name assertion in `VulkanCapabilityGateTests` and did
not inspect the workflow it named. The retained fact is now
`TheReportFileNameRemainsStableForDiagnosticsAutomation`.
- `MotionInterpreterDoMotionFamilyTests.StopCompletely_NullPhysicsObj_Returns8`
was byte-equivalent to the more descriptive
`MotionInterpreterTests.StopCompletely_NullPhysicsObj_ReturnsNoPhysicsObject`.
- `CastSpellTests.ParseMagicUpdateSpell_RoundTrip` duplicated the same parser
contract under `GameEventDispatcherTests`, the parser's durable owner.
- retail motion row `(0x0150, 0x10000150u)` appeared in both the recall-command
theory and the generic anchor theory. It remains in the specifically named
recall contract.
The other 11 groups are not useless duplicates. They deliberately reuse a
small assertion body while separating disjoint datasets by meaning: command
resolution, command argument shapes, valid chat tags, retail string escapes,
weenie error-message evidence, help text, invalid chargen ranges, ACE/retail
motion tables, character-option oracle sources, and environment-sound gaps.
Combining those rows would erase useful failure names without reducing the
assertion mechanism.
After cleanup the inventory reports 11,447 attributed methods, zero duplicate
rows, and 11 reviewed body-equivalent groups containing 27 methods. Verification
for the changed owners passes 46 App, 154 Core, and 32 Core.Net cases. The
complete 44-project Release build reports zero warnings and zero errors. The
no-retry complete hermetic Release gate passed 14,387/14,387 with zero skips or
failures across all 12 test assemblies. The four-case reduction is exactly the
three duplicate facts and one duplicate theory row removed above.
## Batch L vacuous diagnostic assertions
Six investigation methods still ended in an unconditional green assertion:
- three cellar-lip trajectory/replay artifact writers in
`CellarLipWedgeTests`;
- two cellar-ascent trajectory reports in `CellarUpTrajectoryReplayTests`; and
- the installed-DAT front-approach probe in `DoorCollisionApparatusTests`.
These were useful tools but not regression tests. Batch L adds
`Purpose=Diagnostic`, removes the six `Assert.True(true, ...)` calls, preserves
the two reports that previously existed only as assertion messages by writing
them to captured console output, and leaves the existing `%TEMP%` artifacts and
probe logs intact. No historical investigation notes, fixtures, or probe logic
were deleted.
The durable inventory now recognizes `File.WriteAll*` / `File.AppendAll*` as
diagnostic-output signals and reports high-confidence constant-truth assertions
separately from syntactic self-comparisons. It reports zero constant-truth sites.
The five self-comparison sites were individually reviewed and retained:
- `Hash32Tests.Calculate_IsDeterministic` and
`PacketHeaderTests.CalculateHeaderHash32_DeterministicForSameInput` execute
the calculation twice and compare the results;
- `NullCommandBusTests.Instance_IsSingleton` reads the singleton twice; and
- `RuntimeEntityObjectLifetimeTests.Owner_ConstructsOneExactDirectoryAndObjectTablePerInstance`
verifies repeated access to both owned objects returns the same instances.
Batch L verification:
- all six affected diagnostic methods pass, including the installed-DAT door
probe;
- the refreshed inventory reports 11,447 attributed methods, 57 diagnostic
methods, zero constant-truth assertions, and five reviewed self-comparison
sites across four methods;
- the complete 44-project Release build reports zero warnings and zero errors;
and
- the no-retry complete hermetic Release gate passed 14,382/14,382 with zero
skips or failures across all 12 test assemblies.
The five-case reduction from Batch K is exact: five formerly hermetic diagnostic
facts are now excluded by `Purpose=Diagnostic`; the sixth was already outside
the portable lane because its class requires installed DATs.
## Batch M observable monitor-wait contracts
Four concurrency tests used a 50100 ms delay and then asserted that disposal
had not completed. That was only indirect evidence: a delayed or saturated
ThreadPool could satisfy the assertion before the disposal path had attempted
to enter its production monitor.
Batch M runs each competing disposal/stop operation on a named dedicated
thread, waits with a bounded `SpinWait` until the runtime reports
`ThreadState.WaitSleepJoin`, and then verifies the thread joins after the
controlled callback, transport send, or physical detach is released. This
changes no production code and preserves every existing completion, inertness,
and propagated-failure assertion. The converted contracts are:
- `HostQuiescenceGateTests.ExternalStopWaitsForAdmittedCallbackToReturn`;
- `LiveSessionCommandRouterTests.ConcurrentDispose_WaitsForInFlightTransportThenMakesRouterInert`;
- `SilkWindowCallbackBindingTests.ConcurrentDisposeWaitsForPhysicalDetachToComplete`;
and
- `SilkWindowCallbackBindingTests.ConcurrentDisposeCannotHidePhysicalDetachFailure`.
Batch M verification:
- the four focused contracts pass;
- 25 fresh-process focused iterations pass, for 100/100 observed-wait cases;
- the refreshed inventory reduces direct `Task.Delay` methods from 23 to 19
and elapsed-time methods from 33 to 29;
- the complete 44-project Release build reports zero warnings and zero errors;
and
- the no-retry complete hermetic Release gate remains 14,382/14,382 with zero
skips or failures across all 12 test assemblies.
Five fixed-delay negative oracles remain: the landblock streamer and pool
disposal contracts, headless concurrent late-subscriber replay, and the two
launcher installer/recovery contracts.
## Batch N observable landblock-worker joins
The two landblock disposal contracts used 50100 ms delays to infer that
`LandblockStreamer.Dispose` was waiting for its dedicated worker threads.
Batch N replaces those delays with direct observation of the disposer threads:
- `LandblockStreamerTests.DisposeAndConcurrentDisposeWaitForInFlightLoad`
observes the primary disposer blocked in a worker `Join`, then observes the
concurrent disposer blocked behind the disposal monitor; and
- `LandblockStreamerPoolTests.Dispose_JoinsEveryWorkerInThePool` observes the
disposer blocked while all three controlled worker lanes remain in their
loader callbacks.
Both tests then release the loaders, require every disposal thread to join
within the existing bound, and retain their exception and post-disposal
inertness checks. Production code is unchanged.
Batch N verification:
- both focused contracts pass;
- 25 fresh-process iterations of each pass, for 50/50 observed-wait cases;
- the refreshed inventory reduces direct `Task.Delay` methods from 19 to 17
and elapsed-time methods from 29 to 27;
- the complete 44-project Release build reports zero warnings and zero errors;
and
- the no-retry complete hermetic Release gate remains 14,382/14,382 with zero
skips or failures across all 12 test assemblies.
Three fixed-delay negative oracles remain: headless concurrent late-subscriber
replay and the two launcher installer/recovery contracts.
## Batch O final fixed-delay negative oracles
Batch O removes the last three timing-based absence-of-completion tests:
- `HeadlessPluginSessionTests.LateSubscriberReplayQueuesConcurrentRegistrationExactlyOnceInOrder`
now runs registration on a dedicated thread and observes it enter
`WaitSleepJoin` while Runtime's exact replay read lease is held;
- `LauncherInstallerTests.IndependentInstallersSerializeAndWaitingCancellationTouchesNothing`
now waits until the second installer has actually encountered the held
transaction lease before cancelling it; and
- both rows of
`LauncherInstallerTests.OrphanBakeCanNeverPublishAfterRestartRecovery` now
observe publication-lock contention where applicable and wait for the exact
orphan child process to exit before checking that it cannot publish later.
The launcher observation points are internal callbacks on the existing
transaction/publication lease retry paths. They are unset in production, add no
new public API, and do not change lock, retry, cancellation, or publication
behavior. The former 150/200 ms delays and post-exit settle delay are gone.
Batch O verification:
- the one focused Headless fact and three focused Launcher cases pass;
- 25 fresh-process Headless iterations and 25 fresh-process Launcher iterations
pass, totaling 100/100 exercised cases;
- the refreshed inventory reduces direct `Task.Delay` methods from 17 to 14
and elapsed-time methods from 27 to 24;
- none of Batch H's nine fixed-delay negative-oracle methods contains a direct
sleep or delay;
- the complete 44-project Release build reports zero warnings and zero errors;
and
- the no-retry complete hermetic Release gate remains 14,382/14,382 with zero
skips or failures across all 12 test assemblies.
The 24 remaining elapsed-time methods retain their reviewed Batch H
classification: cancellation fakes, intentional real-time protocol behavior,
cooperative yields, bounded integration polling, or a positive timeout guard.
## Batch Q issue-number taxonomy review
The 47 `Issue###` files contain 155 attributed methods. They are not a hidden
duplicate or source-freeze family: none reads production source text and none
contains a direct timing wait. Forty-six methods are explicitly classified
`Purpose=Diagnostic`; the other 109 are executable regression contracts.
Ninety-four methods belong to the installed-DAT lane, overlapping both groups
where retail assets are the evidence prerequisite.
The issue prefix still has concrete navigation value. Every number maps to a
named section in `docs/ISSUES.md`, and the descriptive suffix already exposes
the owning behavior—for example `Issue334BspBoxCellMembershipTests` and
`Issue345SteepSlopeGlideTests`. A 47-file mass rename would discard that direct
evidence key, create large history churn, and would not make the individual
contracts materially easier to understand.
R3's recommendation is therefore to retain the current `Issue###` class/file
prefixes. Continue correcting individual method names whose oracle overclaims,
and keep diagnostic methods outside the release count, but do not re-home 109
useful regressions merely to erase their provenance. If the issue archive is
later split into component-owned records, a class-level `Issue` trait can
preserve filtering before any component-based file rename. The user approved
this recommendation before Batch V, closing T-016 without code churn.
## Batch R fixture-sanity-only diagnostics
The original output-only scan intentionally treated any assertion as a failure
signal. A final name/comment review found 25 more investigation methods whose
only assertions establish that the DAT, fixture, setup, or synthetic replay
loaded; none compares the report, sweep, or characterization named by the
method. Their own names or comments say `Diagnostic`, `Dump`, `Measure`,
`Characterize`, “always passes,” or “not a regression.”
The 25 methods (27 expanded cases) divide into:
- seven visibility/flood measurement reports across corner flood, house exit,
issue #181, and issue #95;
- ten raw building/geometry dumps across issues #113, #119, #147, and #337;
and
- eight physics transition traces across issue #112, cellar ascent, door
collision, issue #108, and issue #265.
Batch R adds only `Purpose=Diagnostic`. It does not remove a body, fixture,
assertion, output line, retail/ACE citation, or historical comment. The
diagnostic inventory is now 82 methods / 103 cases: 35 App and 68 Core. The
explicit non-Manual diagnostic filters pass 27/27 App and 68/68 Core; the other
eight App cases remain in their separately selected Manual tasks.
The same pass corrected two inverse naming errors without changing their
oracles:
- `SCRATCH_BuyShapedFreshGuidCreateObjectThenContainId_FinalOrder` is a durable
vendor-order regression and is now
`BuyShapedFreshGuidCreateThenPlacementZeroEcho_InsertsAtRetailListHead`; and
- `Diagnostic_ExitDoorTopEdge_GateVsAperture` already enforces hard pixel
bounds and is now
`ExitDoorTopEdge_GateCoversLiftedApertureWithinPixelTolerance`.
Both focused regressions pass. Their detailed queue-order and doorway/scissor
rationale remains beside the tests. The only remaining unclassified method
names beginning `Reflect_` or `Dump` are real asserted collision/reflection or
environment-default contracts, not output apparatus.
Only three of Batch R's 27 newly classified cases had still been hermetic;
the other 24 already belonged to the installed-DAT lane. After Batch S's
ownership correction, the no-retry complete hermetic Release gate therefore
passes 14,379/14,379 with zero skips or failures, exactly three below Batch O.
## Batch S Avalonia application-session ownership
The first clean complete gate after Batch R did not pass: every non-Launcher
assembly passed, but `MainWindowViewTests` failed during Avalonia test cleanup
with `DefaultRenderLoop.Add` calling `Dispatcher.VerifyAccess` from a thread
that did not own the compositor. The gate reported 14,378 passes and one
failure. This was recorded and fixed rather than retried unchanged.
Batch D had closed and pumped every shown window and consolidated the six UI
assertion phases into one `[AvaloniaFact]`. That removed leaked-window overlap,
but it did not change Avalonia 12.1.1's default
`AvaloniaTestIsolationLevel.PerTest`: the runner still recreated and disposed
the application, dispatcher, and compositor around that one fact. The failure
occurred in that isolated application setup/cleanup path, before any product
assertion could explain it.
`AcDream.Launcher.Tests` contains exactly one Avalonia fact, and that fact owns
the complete real-window matrix. Batch S declares
`AvaloniaTestIsolationLevel.PerAssembly`, so the runner creates one
application/dispatcher on its dedicated session thread and lets the fresh test
process own its terminal cleanup. All individual windows still close and pump
their dispatcher in `finally`; no suite serialization, retry, product code, or
assertion was changed.
Verification:
- the focused Avalonia fact passes in 25/25 fresh processes;
- the complete 56-case Launcher assembly passes in 25/25 fresh processes;
- the complete 44-project Release build reports zero warnings and zero errors;
and
- the no-retry complete hermetic Release gate passes 14,379/14,379 with zero
skips or failures across all 12 test assemblies.
## Batch T final campaign-label naming cleanup
A final class/method-name sweep found one campaign-labelled class and two
isolated slice-labelled methods whose names hid otherwise durable behavior.
Batch T makes naming-only changes:
- `OP2ReworkBlastRadiusConformanceTests` becomes
`DormantDatWidgetConformanceTests`. Its eight contracts protect dormant
Type-5/Type-8 DAT widget behavior, not the OP2 work sequence that discovered
the blast radius. Research records retain the OP2 history and now point to
the descriptive class name;
- `G2_VendorStackSelection_ThroughRealMaterializer_ShowsSplitSlider` becomes
`VendorStackSelection_ThroughRealMaterializer_ShowsSplitSlider`; and
- `C4_VendorOwnedSplitExemptStackSelection_MatchesRetailsToolbarPresentation`
becomes
`VendorOwnedSplitExemptStackSelection_MatchesRetailsToolbarPresentation`.
The detailed G2/C4/AP-169 evidence comments remain beside the two selection
tests. No assertion, fixture, product code, or historical research statement
was removed. The broader short-label sweep also found complete scenario
matrices such as A1-A6/B1-B3/C1-C3/D1-D4; those labels remain because they
identify deliberate rows within a documented matrix rather than a stale
campaign identity.
Verification:
- the focused Batch T filter passes all 10 renamed contracts with zero skips
or failures;
- the complete 44-project Release build reports zero warnings and zero errors;
and
- the no-retry complete hermetic Release gate passes 14,379/14,379 with zero
skips or failures across all 12 test assemblies.
## Batch U helper-mediated source-text audit correction
Preparing the first semantic replacement exposed a material inventory gap:
`RetailPViewPassExecutorTests` and `WorldRenderFrameBuilderTests` contain tests
that read production source through local helpers, but Batch I's direct body
regex counted only the one method in each file that called
`File.ReadAllText(...)` itself. Parameterized helpers such as
`ReadSource("GameWindow.cs")` and method-group reads such as
`.Select(File.ReadAllText)` exposed two more missed forms.
Batch U corrects the audit tool, not any test or product behavior. It now:
- detects invoked and method-group `ReadAllText`/`ReadAllLines` syntax;
- follows the same-file helper graph already used for failure and prerequisite
signals;
- follows the `.cs` path signal separately, allowing the caller to supply the
filename while a helper performs the read; and
- derives the path signal only from string/interpolated-string content, so a
comment such as `GameWindow.cs:5893` cannot classify an ordinary JSON-lines
test as a source reader.
The corrected inventory reports 67 direct and 40 helper-mediated source-text
tests, 107 total. Manual method-by-method reconciliation assigns 85 to staged
semantic replacement, 17 to retained whole-tree architecture policy, and five
to retained cross-artifact contracts. The focused inventory assertions prove a
helper-mediated builder test is included, a method-group whole-tree test is
included directly, and the prior comment/path false positive is excluded.
Verification:
- all 1,256 tracked C# test files parse and the focused 67/107 count and three
exemplar assertions pass;
- the complete 44-project Release build reports zero warnings and zero errors;
and
- the no-retry complete hermetic Release gate passes 14,379/14,379 with zero
skips or failures across all 12 test assemblies.
## Batch V dormant panel self-test removal
The user approved Batch P's narrow recommendation. Batch V deletes exactly the
three self-test files in the approved boundary:
- `IPanelRendererWidgetTests.cs`: 17 tests whose oracle is the behavior of the
test-only `FakePanelRenderer` recorder;
- `IPanelRendererMainMenuBarTests.cs`: nine more tests of that recorder; and
- `PanelContextTests.cs`: two tests of compiler-generated positional-record
assignment and equality.
The useful boundary remains intact. `IPanel`, `IPanelRenderer`, `IPanelHost`,
and `PanelContext` remain public production contracts for issue #258;
`FakePanelRenderer.cs` remains as the observation seam for 22 `ChatPanel*`
methods plus the `ChatVMCombatTests` render-path method; and all 23 layout,
input, focus, color, and command behavior tests remain executable. No panel,
ViewModel, parser, command contract, product source, or historical rationale is
removed.
Verification:
- the retained 23 attributed panel behavior methods pass all 29 expanded cases;
- the complete UI-abstractions assembly passes 898/898, exactly 28 below its
previous 926-case total;
- the complete 44-project Release build reports zero warnings and zero errors;
and
- the no-retry complete hermetic Release gate passes 14,351/14,351 with zero
skips or failures across all 12 test assemblies, exactly 28 below Batch U.
## Batch W render delegation and cleanup source-freeze replacement
Batch W retires the first nine of the 85 approved implementation-text freezes
without changing product code. Six test methods now inspect runtime behavior,
reflection metadata, or compiled call/new-object edges; three redundant source
tests are removed because an existing behavioral trace already asserts the
same contract more strongly.
The exact decisions are:
- `TextRendererConstructorOwnsExactlyOneDeviceResource` no longer counts
constructor strings. `TextRendererConstructionCreatesAndDisposesOnlyOnePipeline`
constructs the real renderer through `RecordingGpuDevice`, proves that only
one pipeline is added (no buffer, texture, sampler, or texture slot), and
proves that exact pipeline is disposed. The V4a/V6d rollback rationale stays
beside the test. The recording device gained read-only created-resource lists
solely so tests can observe those device calls.
- `Renderer_source_preserves_retail_stage_order_through_typed_operations` is
removed. The existing outdoor and interior `DrawInside` tests already drive
the real renderer and assert the typed operation sequence, including early
and late landscape, particle flush, interior clear, masks, shells, and entity
routes.
- `Production_uses_retained_routes_without_rebuilding_legacy_partition` is
removed. The existing production-product test is renamed to state this
contract and continues to prove one actual retained candidate with zero
compare-only referee work. Exact private selector spellings are not a product
oracle.
- `Production_builder_preserves_the_frame_preparation_order` is removed. The
existing builder test already supplies recording implementations of every
typed source and asserts the complete call order plus the borrowed result.
- executor reset/diagnostic bracketing, the one-executor/one-PView composition,
lighting snapshot-before-UBO order, typed world-frame build, local frame-root
composition, and GameWindow delegation now inspect compiled call/new-object
edges and reflected owner fields. `CompiledCallGraph` is shared test-only
infrastructure that parses the built method body; formatting, comments, local
variable names, and source paths cannot satisfy or break these contracts.
Two mixed source assertions were deliberately narrowed rather than silently
carried forward. Absence of `Console.WriteLine` is an implementation-style
check with no output oracle and is not treated as render behavior. The old
world-scene source test also embedded a separate teardown-order claim; that
claim remains with the dedicated lifetime suite and is reconciled in the
approved host/lifetime replacement batch instead of coupling teardown to frame
construction.
Verification:
- the four directly affected App suites pass 39/39;
- the complete locked Release build covers all 44 projects with zero warnings
and zero errors;
- the no-retry complete hermetic Release gate passes 14,348/14,348 with zero
skips or failures across all 12 test assemblies; the exact three-case
reduction is the three redundant source tests above; and
- the regenerated 1,254-file inventory parses every file and reduces direct
source readers from 67 to 63 and total direct/helper readers from 107 to 98.
The remaining 98 reconcile to the 22 approved retained policies/contracts
and 76 staged replacements.
## Batch X streaming publication and live-entity source-freeze replacement
Batch X converts the four approved streaming-publication freezes and both
live-entity composition freezes. No product source changes. The tests now
inspect the built dependency graph, execute the real origin publishers, or
assert the typed owner/reset calls instead of matching C# fragments.
The conversion found one materially misleading old assertion. The physics
publisher test rejected the literal strings
`_physicsDataCache.RemoveCellsForLandblock` and
`_physicsDataCache.RemoveBuildingsForLandblock`. Those fragments were absent,
but the real publisher correctly performs both removals through
`publication.StagingCache`; the test therefore passed without establishing its
intended generation-isolation rule. The replacement verifies the compiled
`AdvanceBeginOne` path obtains the staging cache before each removal, commits
through `RuntimePhysicsState.CommitCollisionGeneration`, does not restart the
retained-owner capture, and keeps the old publication bodies out of
`GameWindow`.
The other exact decisions are:
- the render publisher boundary now scans every compiled GameWindow method and
constructor for forbidden terrain, cell-visibility, and EnvCell publication
calls, and reflects the removed mesh-preparation/body ownership;
- the former umbrella origin test is narrowed to the claim its fixture could
not observe: production `LivePresentationCompositionPhase` constructs the
render, physics, and static publishers before the one presentation pipeline,
while GameWindow retains only that pipeline. Captured origin itself remains
covered by the real `LandblockBuildFactory.BuildFar` and
`LandblockRenderPublisher.BeginPublication` behavior tests;
- recenter ordering is now its own named compiled-call contract: old-window
retirement completion precedes `LiveWorldOriginState.Recenter`, which
precedes destination commit. The extensive recenter transaction suite still
owns retry, replacement, session-reset, and retirement behavior;
- the shutdown test reads the compiled operation manifest, including delegate
targets, to prove Runtime session stop precedes streamer disposal. It also
proves `GameRuntime.StopSession` disposes the live session before checking
its completion barrier and retains the re-entrant diagnostic message;
- live animation/projectile composition now reflects the exact typed fields
and proves `CompletePresentation` constructs `DatProjectileSetupResolver`
before `ProjectileController`, with no window closure or remote-motion-view
owner; and
- the session reset test follows compiled calls through
`LiveSessionRuntimeFactory`, `PlayerModeController`, the network-update
owner, and `LiveWorldOriginState`, rather than pinning four statement strings.
`CompiledCallGraph` gained reusable readers for every declared method,
delegate method targets, and compiled string literals. These are test-only
metadata facilities used when invoking the real process/window graph would
mutate external resources.
Verification:
- the four directly affected owner suites pass 111/111;
- the complete locked Release build covers all 44 projects with zero warnings
and zero errors;
- the no-retry complete hermetic Release gate passes 14,349/14,349 with zero
skips or failures across all 12 test assemblies. The one-case increase is the
newly separated recenter-order contract; and
- the regenerated 1,254-file inventory parses every file, reports 11,417
attributed methods, and reduces direct/total source readers from 63/98 to
57/92. The remaining 92 reconcile to 22 approved retained
policies/contracts and 70 staged replacements.
## Batch Y input, physics, and inbound-network source-freeze replacement
Batch Y converts the nine approved source-text readers in the input/physics/
network wiring group. Seven remain as compiled-metadata architecture checks;
two redundant source assertions are removed. No product source changes.
The exact decisions are:
- the ForcePosition generic-tail suite now inspects the built
`TryApplyGenericRemoteRenderPose` body for its one `WorldEntity.SetPosition`
edge and proves the committed/deferred local-position observer call is
immediately followed by a compiled return. The negative assertion that the
already-deleted `LocalForcePositionTransaction` class name was absent is
removed: the Runtime-owned transaction and its displaced-authority behavior
are already exercised by
`RuntimeAcceptedPositionDriveControllerTests`, while an absent identifier is
not behavior;
- the contact-versus-walkability source assertion is removed. The dedicated
`SteepContactBody_InterpolatesInsteadOfSnapping` and
`FreeFlightBodyWithNoContact_StillSnaps` behavioral tests exercise the one
discriminating state and the opposite boundary through the real routing
method, so retaining a string check would add brittleness rather than
coverage. The AP-140 retail rationale remains beside those behavioral tests;
- local inbound SetState routing now verifies the compiled controller graph has
exactly one `PlayerMovementController.ApplyServerPhysicsState` edge and no
direct `ApplyPhysicsState` edge;
- the #270 movement-stats contract reflects the single
`StaminaExhaustionEdgeTracker` owner and follows the compiled Observe,
ReportExhaustion, Reset, and two factory Apply edges. Existing tracker and
Runtime movement-state behavior suites remain the behavioral oracle;
- remote spawn settling now identifies both compiled call sites
(`DispatchRemoteInboundMotion` and `OnPosition`), verifies the repeated
inbound route checks `PhysicsBody.InContact` before reseeding, and verifies
the shared seed helper calls `SpawnPlacementSettler.TrySettle`;
- production auto-entry readiness now follows compiled calls to the published
controller, live-record lookup, and physics-host view and verifies the exact
`EntityPhysicsHost` type operand; and
- player presentation attachment now verifies compiled call order from the
animation sink assignment through matched animation drain to the unmatched
interpreter suffix drain.
`CompiledCallGraph` gained reusable instruction and type-reference readers.
They allow exact return and `isinst`/cast boundaries to be checked without
making comments, whitespace, local names, or source paths part of the oracle.
Verification:
- the directly affected and adjacent behavioral App suites pass 31/31, and
the two Runtime owner suites pass 52/52;
- the complete locked Release build covers all 44 projects with zero warnings
and zero errors;
- the no-retry complete hermetic Release gate passes 14,347/14,347 with zero
skips or failures across all 12 test assemblies. The exact two-case
reduction is the two redundant source assertions above; and
- the regenerated 1,254-file inventory parses every file, reports 11,415
attributed methods, and reduces total direct/helper source readers from 92
to 83 while direct readers remain 57. The remaining 83 reconcile to the 22
approved retained policies/contracts and 61 staged replacements.
## Batch Z composition-root source-freeze replacement
Batch Z converts 12 approved source-text readers across the seven graphical
composition-owner suites and removes one stale backend assertion. No product
source changes. The replacement tests use the built call graph, reflected
owner metadata, existing transactional fixtures, and typed composition results
instead of source fragments.
The exact decisions are:
- all seven phase-boundary tests now prove that `GameWindow` constructs exactly
one instance of the relevant composition phase and does not directly
construct the leaf owners that belong behind it. The phase and snapshot
types are also checked for the absence of a retained `GameWindow` owner;
- the platform prelude now verifies the compiled `OnLoad` route through
`AcquirePlatform` and `GameWindowCompositionPipeline.Run`, plus the single
`GameWindowPlatformAcquisition.Acquire` and host/input/camera phase edges;
- the prepared-asset contract follows the production factory, world phase,
`ObjectMeshManager`, `WbMeshAdapter`, and compiled shutdown manifest. It
proves one `IPreparedAssetSource` owner, no DAT-reader constructor seam in the
production mesh manager, prepared reads rather than live mesh building, and
mesh/prepared-source/DAT release order;
- the frame-root test follows the compiled construction order from render
resources and comparison state through the world/update roots, graph
publication, window publication, and final ownership transfers. The
lifecycle snapshot contract now verifies its exact `RenderFrameOutcome`
input and its typed live-entity, GPU-memory, profiler, and landblock metrics;
- the session phase follows the compiled streamer/start/reveal route and the
delegate target that constructs the request streamer. Its completion check
follows hydration, inbound routing, input/player mode, portal transfer,
session creation, command bindings, action attachment, and final publication
in order. Character selection now verifies the graphical selector option,
typed connect options, absence of automatic first-character selection, and
retained-UI runtime bindings;
- the interaction, live-presentation, and world-render boundaries retain their
existing behavioral phase fixtures while compiled metadata guards against
construction leaking back into `GameWindow`; and
- `PortalSpaceIsComposedOnBothBackendArms` is removed as stale. Campaign V
deleted the OpenGL backend, so a two-backend-arms source condition is no
longer an architectural contract; its negative assertion named an already
deleted null presentation. The valuable portal ownership rationale remains
in the live/session composition code, the compiled portal transfer order,
and the existing teleport/reveal behavior suites.
Verification:
- all 187 composition tests pass with zero skips or failures;
- the complete locked Release build covers all 44 projects with zero warnings
and zero errors;
- the no-retry complete hermetic Release gate passes 14,346/14,346 with zero
skips or failures across all 12 test assemblies. The one-case reduction is
the stale two-backend-arms assertion; and
- the regenerated 1,254-file inventory parses every file, reports 11,414
attributed methods, and reduces direct/total source readers from 57/83 to
44/70. The remaining 70 reconcile to the 22 approved retained
policies/contracts and 48 staged replacements.
## Batch AA Runtime-root and crash-status source-freeze replacement
Batch AA converts the three approved Runtime-root/session-host freezes and the
three crash-status freezes. No product source changes and no test is removed.
The canonical-root checks now scan compiled App metadata rather than C# text:
`GameWindow` constructs exactly one `GameRuntime`, acquires its one host lease,
and constructs none of the displaced Runtime child roots; the entire App
assembly contains exactly one `LiveSessionCommandSurface` construction edge.
The character-creation status regression follows the compiled delegate targets
created by `LiveSessionRuntimeFactory.Create` and verifies the exact Guid/Name
and RawCode/Reason/AttemptedName property-to-writer call order. The existing
Runtime `SessionStatusWriter` suite remains the payload-shape oracle.
The #406 crash regression now inspects the built `GameWindow.Run` and
`ReportExited` methods. It proves the native frame-loop call precedes cleanup
retention, the `_runFailure` store precedes rethrow, the failure read precedes
all terminal paths, the three crash/graceful/incomplete writer calls and their
literals retain their order, and both shutdown exits funnel through the one
reporting method. Reflection verifies the nullable exception latch exists and
that neither constructor assigns it, preserving its default-null state.
`CompiledCallGraph` gained a reusable field-load/store reader so latch ordering
can be checked by IL offset without pinning field expressions or formatting.
Verification:
- all 15 focused Runtime-root/session-host/crash-status methods pass;
- the complete locked Release build covers all 44 projects with zero warnings
and zero errors;
- the no-retry complete hermetic Release gate remains 14,346/14,346 with zero
skips or failures across all 12 test assemblies; and
- the regenerated 1,254-file inventory parses every file, remains at 11,414
attributed methods, and reduces direct/total source readers from 44/70 to
41/64. The remaining 64 reconcile to the 22 approved retained
policies/contracts and 42 staged replacements.
## Batch AB render-leaf and frame-handoff source-freeze replacement
Batch AB converts all nine approved `GameWindowRenderLeafCompositionTests`
source readers. No product source changes and no test is removed.
Private presentation, resource preparation, world/private/diagnostic routing,
GPU measurement, and immutable outcome construction now follow compiled typed
calls in their production order. The portal-tunnel check follows the compiled
session transfer/bind/publication path, both local teleport factory targets,
the session-before-frame phase references in `OnLoad`, and the exact frame-root
borrower construction order. `OnRender` now proves its single
`GameFrameGraphSlot.Render` handoff and absence of the five displaced leaf
field reads directly from the built method.
The broad legacy-owner blacklist is narrowed to what it actually protects:
reflected `GameWindow` fields and methods reject the displaced owners, while
compiled composition metadata positively locates paperdoll, frame-resource,
weather, private-presentation, orchestrator, frame-pacing, and mouse-capture
ownership behind their focused types. Shutdown ordering uses the compiled
operation/stage labels. Terrain diagnostics are constructed with the scene
executor but not driven directly by the frame root.
The optional paperdoll contract is stronger than the old source-expression
match: compiled branch destinations prove that either a missing viewport or a
missing inventory frame jumps past `PaperdollFramePresenter` construction.
`CompiledCallGraph` gained a reusable branch-target reader for this kind of
optional-dependency guard.
Verification:
- all nine focused render-leaf methods pass;
- the complete locked Release build covers all 44 projects with zero warnings
and zero errors;
- the no-retry complete hermetic Release gate remains 14,346/14,346 with zero
skips or failures across all 12 test assemblies; and
- the regenerated 1,254-file inventory parses every file, remains at 11,414
attributed methods, and reduces direct/total source readers from 41/64 to
39/55. The remaining 55 reconcile to the 22 approved retained
policies/contracts and 33 staged replacements.
## Batch AC graphical-host and lifetime source-freeze replacement
Batch AC converts all nine approved `GameWindowHostBoundaryTests` source
readers. No product source changes and no test is removed.
Startup now follows the compiled settings snapshot, frame-pacing, native
window, callback-target, callback-binding, attachment, and frame-loop edges.
The callback delegate targets retain their exact load/update/render/closing/
focus/resize order without treating local names, comments, or nested argument
spelling as behavior. `OnLoad` phase ordering is recovered from its compiled
delegate targets, while frame-root and session-player completion checks follow
their typed construction, binding, attachment, publication, and transfer
edges.
The remaining owner checks reflect the one `WorldEnvironmentController` and
`RuntimeSettingsController`, reject their displaced window mirrors, and
follow environment routing, settings startup/runtime binding, terrain-atlas
acquisition, input-action attachment, and framebuffer-resize publication
through the built methods. Focus, update, render, close, and dispose are
verified as narrow handoffs. In particular, the render check uses semantic IL
execution order—window size, immutable input construction, then graph render—
rather than the misleading lexical order of a nested source expression.
Shutdown now uses reflected root types, field stores, built call order, and
the compiled manifest's stage/operation labels. It preserves the twenty-stage
dependency order, plugin transfer before startup, ingress cleanup ordering,
Runtime/UI/resource release boundaries, `TryComplete` before native-window
release, and the final `_window` clear after the shared shutdown funnel. A
label such as `input context` may legitimately identify both an operation and
its stage; the replacement therefore verifies dependency order instead of
mistaking duplicate human-readable labels for duplicate ownership.
The old checks for HostInputCamera local `if` spelling are retired rather than
translated. `HostInputCameraCompositionTests` already exercise the complete
production acquisition and every fault boundary; the names and arrangement
of compiler locals are not part of the host contract. All valuable ownership,
ordering, and cleanup rationale remains in the compiled guards above.
Verification:
- all nine focused graphical-host/lifetime methods pass;
- the complete locked Release build covers all 44 projects with zero warnings
and zero errors;
- the no-retry complete hermetic Release gate remains 14,346/14,346 with zero
skips or failures across all 12 test assemblies; and
- the regenerated 1,254-file inventory parses every file, remains at 11,414
attributed methods, and reduces direct/total source readers from 39/55 to
32/46. The remaining 46 reconcile to the 22 approved retained
policies/contracts and 24 staged replacements.
## Batch AD frame orchestration and resource-preparation replacement
Batch AD converts all fourteen approved source readers in
`RenderFrameResourceControllerTests` and `UpdateFrameOrchestratorTests`. No
product source changes and no test is removed.
The three render-resource checks now inspect built call and field-store order.
They preserve the texture/dispatcher/environment/portal/clip/terrain/lighting
begin sequence, mesh publication before reveal evaluation and particle begin,
and weather evaluation before the elapsed-clock commit. The existing recording
phase test continues to exercise the public prepare sequence and one GPU-slot
read behaviorally; source comments and local expressions are no longer part of
the oracle.
The update-frame replacements retain the full accepted phase graph and its
existing behavioral fake trace, then use compiled metadata only for production
wiring that cannot safely be invoked without a real session or window:
- the physics script clock has one typed publisher behind `FrameRootCompositionPhase`
and no `GameWindow` publication edge;
- live-object, static-animation, effect, particle/script, and spatial-reconcile
calls preserve their registered adaptation order and exact-once tails;
- streaming precedes the live coordinator, whose inbound session and placement
retry precede command and spatial reconciliation on both available and
quiesced behavioral paths;
- session/frame composition constructs the live-object, spatial, streaming,
gameplay-input, teleport, liveness, auto-entry, camera, and update owners,
while reflected fields and compiled window calls reject the displaced bodies;
- focus loss, player-mode exit, and teleport start retain their typed
mouse-look cleanup edges, including freshness validation before input cleanup
and Runtime transit commit afterward;
- player presentation attachment retains Runtime-publication validation,
camera/shadow/host/mode order, and both cleanup routes; mouse filtering and
typed movement-input seams are checked from method and constructor metadata;
and
- camera sampling/reconciliation and the thin `OnUpdate` profile-to-graph
handoff remain ordered, while live-session event and world-origin consumers
stay behind their focused typed owners without `GameWindow` back-references.
Where construction happens inside acquisition or transfer delegates, the
tests follow the compiled delegate target before inspecting its child edge.
This preserves real execution ownership without reverting to lexical source
order across nested expressions.
Verification follows the user-approved proportionate policy for the remaining
R3 work:
- all 34 focused frame/resource methods pass;
- the complete `AcDream.App.Tests` hermetic lane passes 5,381/5,381 with zero
skips or failures;
- the complete locked Release build covers all 44 projects with zero warnings
and zero errors; and
- a targeted scan confirms neither owning test file retains a source reader or
its source-slicing helper. The final full inventory and twelve-assembly
Release gate are intentionally deferred to the one R3 closeout run.
## Batch AE Runtime gameplay-owner wiring replacement
Batch AE converts the nine approved consumer-wiring source readers across
`RuntimeActionOwnershipTests`, `RuntimeCharacterOwnershipTests`,
`RuntimeInventoryOwnershipTests`, and `RuntimeMovementOwnershipTests`. No
product source changes and no test is removed. The two approved whole-tree
construction policies—one action-owner policy and one movement-owner policy—
remain source-aware by design and are not part of the 85 staged replacements.
The replacements use reflected fields, properties, constructor parameters,
compiled child access, and shutdown-root metadata to prove that:
- retained UI, session composition, graphical command adapters, and item
interaction borrow the canonical action children and the exact Runtime
transaction owner, with no App `InteractionState` or UI-side transaction
construction;
- `GameWindow` owns one `GameRuntime`, constructs no character child root,
and projects its Spellbook/LocalPlayer properties through
`RuntimeCharacterState`; content installation, session routing, retained UI,
options, and movement-skill updates all consume that owner;
- the deleted App character-option and movement-skill owner types remain
absent, while Runtime's option replacement and movement-skill update edges
remain live;
- `GameWindow` constructs none of the displaced inventory/item-mana/container/
shortcut snapshot owners; retained UI and item interaction use the Runtime
action transaction, session bindings use the Runtime shortcut store and use
completion, and shutdown carries only `GameRuntime`;
- `ToolbarController` retains the exact `ShortcutStore` without constructing a
mirror, provider delegate, or loaded-state latch, and spell UI has no second
local mutation calls for filters, desired components, or favorites; and
- graphical input, both runtime adapters, and both shutdown roots borrow the
exact `RuntimeLocalPlayerMovementState`, including its autorun and typed
command execution edges.
`CompiledCallGraph.ReadOwned` was added as a test-only metadata facility. It
reads declared owner methods plus compiler-generated acquisition/callback
closures, so a typed dependency carried by a UI factory remains inspectable
without freezing the lambda's source spelling.
Verification follows the proportionate R3 policy:
- all 11 focused ownership methods pass, including the two retained whole-tree
policies adjacent to the nine replacements;
- the complete `AcDream.App.Tests` hermetic lane passes 5,381/5,381 with zero
skips or failures;
- the complete locked Release build covers all 44 projects with zero warnings
and zero errors; and
- a targeted scan finds source reads only in the two explicitly retained
whole-tree policy methods. The final inventory and twelve-assembly Release
gate remain deferred to closeout.
## Batch AF create-authority drift-model contract replacement
Batch AF converts the final approved test-model/source correspondence check.
`CreateAuthorityDriftModelSourcePinTests` is renamed to
`CreateAuthorityDriftModelContractTests`; its descriptive test method
`HandCalledDriftProbe_StillModelsTheExecutorDrainAdvance` is retained. No
product source changes and no test is removed.
The replacement no longer regexes two Runtime files. It inspects compiled
Runtime metadata and proves:
- `ApplyWeenieDescriptionAction` applies the accepted description, refreshes
the canonical snapshot, advances create authority exactly once, and then
advances the executor baseline in semantic execution order;
- `RegisterEntityCore` still has the named Boolean initial-residence input,
refreshes the ordinary existing-generation snapshot, and places the one
registration-time authority advance behind a conditional branch that skips
over the call; and
- the Runtime assembly contains exactly those two call sites targeting
`RuntimeEntityDirectory.AdvanceCreateAuthority`: the modeled executor drain
and the gated ordinary registration route.
This is the stale-model alarm the source regex intended, but it now survives
comments, whitespace, local renames, and equivalent expression refactors.
The expectation-item 6/8 probe comments in the hydration and supersession
suites now say `metadata-pinned` and name the new contract class, preserving
the rationale without leaving misleading source-pin references.
Verification follows the proportionate R3 policy:
- the contract plus its hydration and supersession behavior suites pass 90/90;
- the complete `AcDream.App.Tests` hermetic lane passes 5,381/5,381 with zero
skips or failures;
- the complete locked Release build covers all 44 projects with zero warnings
and zero errors; and
- targeted scans find no source reader in the renamed contract and no stale
source-pin comment in the affected tests. With this batch, all 85 approved
replacements are implemented; final inventory reconciliation and the one
complete Release gate follow next.
## R3 closeout
R3 closes on implementation commit `14d371a0`. The final Roslyn inventory and
the one complete Release gate both ran from that clean commit; this closeout is
the only later documentation change.
The final inventory parses all 1,254 tracked C# test files and attributes
11,414 test methods. It finds 21 direct source readers and 22 readers in total.
Those 22 reconcile exactly to the approved retained boundary:
| Retained disposition | Methods | Reconciled owners |
|---|---:|---|
| Whole-tree architecture policy | 17 | `LinuxPlatformBoundaryTests` (5), `RenderSceneArchitectureTests` (2), `RuntimePhysicsOwnershipTests` (4), `RuntimeEntityOwnershipTests` (2), and one each in `RuntimeActionOwnershipTests`, `RuntimeMovementOwnershipTests`, `RuntimeWorldTransitOwnershipTests`, and `RuntimeDatAccessArchitectureTests` |
| Cross-artifact source/project contract | 5 | `ParticleBindlessInstanceTests` (1), `PerformanceToolsTests` (1), and `LauncherProjectBoundaryTests` (3) |
The original corrected inventory's equation therefore closes without an
unclassified reader: 107 source readers = 85 replaced implementation/test-
model freezes + 17 retained architecture policies + 5 retained cross-artifact
contracts. Three of the 85 replacements removed a redundant test because an
existing stronger behavioral oracle already covered the claim; the other 82
kept a test and changed its evidence seam.
The other approved boundaries also reconcile:
- Batch V deleted exactly 28 attributed self-tests: 17 widget-recorder tests,
nine main-menu-recorder tests, and two positional-record tests. All three
approved files remain absent.
- `FakePanelRenderer` remains. The retained behavior boundary is exactly 23
attributed methods and 29 expanded cases: 22 `ChatPanel` layout/input/focus
methods plus the `ChatVMCombatTests` render-path method.
- The issue taxonomy remains descriptive: 47 `Issue###...Tests.cs` files and
all 155 attributed methods remain, with every filename carrying a behavior
suffix after its issue number.
R3 changed no product behavior. A diff from starting commit `8e884679` contains
eight `src/` paths, all previously reviewed testability/documentation seams:
two comment-only test-name updates; deterministic clock injection for input and
streaming whose public production construction still selects the same system
clock; nullable launcher contention callbacks that production leaves unset;
and one test-assembly `InternalsVisibleTo`. No shipping default, ownership,
algorithm, protocol, or presentation path changes.
Final verification at clean implementation commit `14d371a0`:
- locked Release restore and build: 44 projects, zero warnings, zero errors;
- complete hermetic Release gate: 14,346 passed, zero skipped, zero failed,
across all 12 default test assemblies; and
- durable ignored evidence: `artifacts/test-audit/test-inventory.json` and
`artifacts/release-gate/release-gate-summary.json`, with logs, TRX files,
environment capture, and SHA-256 manifest beside the gate summary.
Every R3 decision is now represented by the batch ledger above, the final
inventory agrees with every approved count, and no cleanup item remains open.