Skip to content

perf: the window package drops the unused Windows Runtime projection - R5/8b - #138

Merged
donislawdev merged 8 commits into
mainfrom
perf/r5-8b-no-winrt-projection
Oct 26, 2026
Merged

donislawdev merged 8 commits into
mainfrom
perf/r5-8b-no-winrt-projection

Conversation

@donislawdev

@donislawdev donislawdev commented Oct 21, 2026 •

Copy link
Copy Markdown
Owner

Summary

The window package no longer carries the Windows Runtime projection it never used. Unpacked 169.6 to 146.6 MB (-23.0 MB, -13.6%), zipped 70.8 to 64.8 MB, 273 to 271 files.

The 10.0.17763 in the window's TFM pins the support floor (Windows 10 1809 / Server 2019). Any TFM version from 10.0 up also makes the SDK add the projection as a framework reference, and a self-contained publish then ships Microsoft.Windows.SDK.NET.dll (23.6 MB) and WinRT.Runtime.dll (0.5 MB). Nothing here uses it:

  • no GUI source names a WinRT Windows.* namespace, WinRT or ApiInformation
  • of the 225 managed assemblies in the published package, none but the projection itself references either assembly (wpfui 4.3.0 ships only net10.0-windows7.0 and references neither)
  • the window never loads them (startup hook, assemblies loaded by the first idle)

IncludeWindowsSDKRefFrameworkReferences=false in gui/Directory.Build.props keeps the projection out of both GUI projects while the TFM, and so the floor, stays.

Why this switch and not a TFM without a version

The documented route, net10.0-windows, means TargetPlatformVersion 7.0. The floor in the assembly then drops to Windows7.0, a higher SupportedOSPlatformVersion beside it is refused (NETSDK1135), and both lock files change their framework key. Measured: it builds without a warning, but it gives the floor up. The switch keeps the floor and the lock files as they are. It is the SDK's own property (Microsoft.NET.Windows.targets sets it to true only when a project leaves it empty) but it has no page on learn.microsoft.com, so the effect is checked where it ships (below).

Also

  • packaging/build-dist.ps1 stops if either projection file is in the publish, ahead of the register check, which would otherwise ask for the projection to be declared. The ReadyToRun check keeps its three assemblies and loses the two projection rows, and PublishReadyToRunExclude leaves the project.
  • packaging/components.json, THIRD-PARTY-NOTICES.md and the component-list test drop the projection. It was the one component in the package without an SPDX licence (LicenseRef-Microsoft-Windows-SDK).
  • CHANGELOG, Changed.

Verification

  • Published layout before and after, as build-dist.ps1 publishes it: the two projection files go, and three files change - ChronoMock.deps.json (loses the runtime pack entry), ChronoMock.dll and its pdb. All 2417 methods of ChronoMock.dll have the same IL, the metadata heaps the same sizes and the embedded resources the same bytes. The MVID differs because the compiler hashes the reference set into it. TargetPlatform and SupportedOSPlatform stay Windows10.0.17763.0.
  • A publish with CI=true (locked restore, ReadyToRun) succeeds and is byte for byte the same as the local one. Locked restores of both GUI projects pass, also with the restoring machine's identifier set to linux-x64 as on the dependency-submission runner. No lock file changes.
  • The new checks in build-dist.ps1, taken from the file and run on real publishes: pass on the new layout, stop on the old one (naming the projection) and on an IL-only build (ChronoMock.dll not compiled ahead). The register check stops on the new layout with the old register (declared, not bundled) and on the old layout with the new register (bundled, not declared).
  • Start, A/B alternating, 12 runs each: first frame median 784.6 ms before and 788.2 ms after, inside the run-to-run spread (767 to 825 ms), 1294 methods compiled by the JIT and the same 57 assemblies loaded in both.
  • State sheet render: 301 files, 118 images, byte for byte the same.
  • GUI test classes that build the window or read Directory.Build.props: 79 tests, green. The components, hygiene, names and msi guards and the component-list tests, green. clippy, clippy-pin, format-cs, metrics-pin, lint-ps (185 files). Mutation registry anchors: 1154 entries, 0 off.
  • No new mutation entry: the new check lives in the packaging script, which no test runner executes. It was reversed by hand on real publishes instead, as above.

Not measured

  • A restore still downloads the projection pack into the NuGet cache (downloadDependencies), as it does the ASP.NET Core runtime pack. Neither ships.
  • The installer's size is not compared here.

Also in this pull request (2026-10-26)

main and three Dependabot updates. One merge commit (39d9a81) brings main (#137, which this branch was stacked on, and the actions bump of #141) and the Dependabot branches of #117 (serde_json 1.0.154, toml 1.1.8, winresource 0.1.34), #139 (Microsoft.NET.Test.Sdk 18.11.0 in the protocol tests) and #140 (semgrep 1.181.0). Their commits come in unchanged, so those pull requests count as merged with this one.

The register follows two new versions (74717da). Each stopped a check on the open pull requests:

packaging/components.json, THIRD-PARTY-NOTICES.md and the unreleased CHANGELOG line about the bundled runtime name the new versions. A local build-dist.ps1 on SDK 10.0.403 passes the register check (27 components, 64.9 MB zip), and the component guards pass (components 13, --bins component 3).

The red CI on e8f5b9d (b2e4758). AnnounceTests.The_calculator_reads_its_answer_when_a_step_moves_it failed with "nothing was announced" after 17.7 s, where it takes 3.3 s on a desktop run alone and cold. NextAsync checked its deadline before it read the queue, so an announcement made just before the UI thread was held past the deadline was never read. It now reads the queue once more after the deadline, and a failure names how long it waited and what it passed over. The deadline goes from 5 s to 20 s, as it bounds only a failure.

  • A probe that holds the UI thread for the deadline and a second from the moment the announcement is made: the old helper fails it with "nothing was announced", the new one reads it, and the new one without the last read fails it at the 20 s deadline as well. The probe is not kept, it would add over 20 s to every run.
  • Not reproduced on a desktop: 4 runs of the class under 48 busy processes on 16 cores (2.5 to 3.4 s for this test) and 3 cold runs of the test alone (3.3 s). The GUI tests run one at a time (ParallelMode.None), so no other test shares the UI thread while it waits. What held the runner for about 12.7 s before the wait is not known, the log gives only the test's total time.
  • The other deadline loops of the GUI tests were read for the same shape. One had it: FilledScreenSweepTests.AnsweredAsync returned false at the deadline without a last look, so an answer that landed during a hold counted as none (8bddecc). The same probe, timed to the answer, fails the old helper and passes the new one. Its deadline stays at 5 s, and FilledScreenSweepTests is 4 of 4.
  • AnnounceTests 8 of 8 and HistoryErrorTests 2 of 2, format-cs, metrics-pin, clippy, clippy-pin, lint-ps, deny, the hygiene, names, components and network guards, and the mutation anchors (1154 entries, 0 off).

Not measured here: the semgrep bump is measured by this pull request's Semgrep job against the tree, as 1.179.0 and 1.180.0 were. The run against the release workflows before 3b94c4e, which must still report six, is still owed.

Stacking

Branched from perf/r5-8-cold-start (#137), merged since. With main merged in, this PR's diff is the R5/8b commit, the merge above and the three fixes.

🤖 Generated with Claude Code

…- R5/8b

The 10.0.17763 in the window's TFM pins the support floor, and any TFM
version from 10.0 up also makes the SDK add the Windows Runtime projection
(Microsoft.Windows.SDK.NET.dll, 23.6 MB, and WinRT.Runtime.dll, 0.5 MB).
No code here uses it, and of the 225 managed assemblies in the package none
but the projection itself referenced it.

IncludeWindowsSDKRefFrameworkReferences=false in gui/Directory.Build.props
keeps it out while the TFM, and so the floor, stays. Measured on the
published layout: 169.6 to 146.6 MB unpacked, 70.8 to 64.8 MB zipped, every
method of ChronoMock.dll with the same IL and the same resources,
SupportedOSPlatform still Windows10.0.17763.0, lock files unchanged, start
unchanged (first frame median 784.6 against 788.2 ms, same JIT count, same
assemblies loaded), state sheet render 301 files byte for byte.

The switch has no page on learn.microsoft.com, so build-dist.ps1 checks the
effect on the published files and stops if either file comes back, ahead of
the register check that would otherwise ask for it to be declared. The
register, the notices and the component-list test drop the projection, which
was the one component without an SPDX licence.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Repository UI (base), Organization UI (inherited)
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: de5756c8-adbe-4092-9f48-75e1fa73ef9b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

No actionable comments were generated in the recent review.

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository UI (base), Organization UI (inherited)
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 90918d81-0635-4229-9d1d-ad7aee8bd961
📥 Commits

Reviewing files that changed from the base of the PR and between 7395f72 and e8f5b9d.

📒 Files selected for processing: 20
  • CHANGELOG.md
  • THIRD-PARTY-NOTICES.md
  • crates/cli/src/cli.rs
  • gui/ChronoMock.App.Tests/DeferredViewTests.cs
  • gui/ChronoMock.App.Tests/FilledScreenSweepTests.cs
  • gui/ChronoMock.App/App.xaml
  • gui/ChronoMock.App/ChronoMock.App.csproj
  • gui/ChronoMock.App/Controls/DeferredView.cs
  • gui/ChronoMock.App/MainWindow.xaml
  • gui/ChronoMock.App/Themes/Parts.xaml
  • gui/ChronoMock.App/Views/AuditSectionView.xaml
  • gui/ChronoMock.App/Views/CalculatorView.xaml
  • gui/ChronoMock.App/Views/ComponentCatalogue.xaml
  • gui/ChronoMock.App/Views/ResultPhaseView.xaml
  • gui/ChronoMock.App/Views/SessionPhaseView.xaml
  • gui/ChronoMock.App/Views/SetupPhaseView.xaml
  • gui/Directory.Build.props
  • packaging/build-dist.ps1
  • packaging/components.json
  • tests/mutation/entries.json
💤 Files with no reviewable changes: 1
  • packaging/components.json

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

📜 Recent review details
⚠️ CI failures not shown inline: 5

GitHub Actions: CI / 0_Gates.txt: perf: the window package drops the unused Windows Runtime projection - R5/8b

Conclusion: failure

View job details

##[group]Run $PSNativeCommandUseErrorActionPreference = $false
 �[36;1m$PSNativeCommandUseErrorActionPreference = $false�[0m
 �[36;1m$out = dotnet build gui/ChronoMock.slnx --no-incremental -p:ChronoMetricsConfig=D:\a\ChronoMock\ChronoMock/.github/metrics-tight/CodeMetricsConfig.txt -p:TreatWarningsAsErrors=false 2>&1 | Out-String�[0m
 �[36;1mif ($LASTEXITCODE -ne 0) {�[0m
 �[36;1m  Write-Host $out�[0m
 �[36;1m  Write-Host "::error::The tightened build did not compile, so the ceilings could not be measured."�[0m
 �[36;1m  exit 1�[0m
 �[36;1m}�[0m
 �[36;1m$reached = [regex]::Matches($out, 'warning (CA150[26])') | ForEach-Object { $_.Groups[1].Value } | Sort-Object -Unique�[0m
 �[36;1mforeach ($rule in 'CA1502', 'CA1506') {�[0m
 �[36;1m  if ($reached -notcontains $rule) {�[0m
 �[36;1m    Write-Host "::error::$rule in gui/CodeMetricsConfig.txt has room in it: nothing reaches it one below. Lower it to the real maximum, and .github/metrics-tight/CodeMetricsConfig.txt with it."�[0m
...
 ##[group]Run $PSNativeCommandUseErrorActionPreference = $false
 �[36;1m$PSNativeCommandUseErrorActionPreference = $false�[0m
 �[36;1m$lints = @(Get-Content .github/clippy-tight/clippy.toml | ForEach-Object { if ($_ -match '^\s*([a-z-]+)-threshold\s*=') { $Matches[1] -replace '-', '_' } })�[0m
 �[36;1mif ($lints.Count -eq 0) {�[0m
 �[36;1m  Write-Host "::error::No threshold was read from .github/clippy-tight/clippy.toml, so there is nothing to measure."�[0m
...
 �[36;1m$code = $LASTEXITCODE�[0m
 �[36;1m$messages = @($lines | Where-Object { $_.StartsWith('{') } | ForEach-Object { $_ | ConvertFrom-Json } | Where-Object { $_.reason -eq 'compiler-message' } | ForEach-Object { $_.message })�[0m
 �[36;1mif ($code -ne 0) {�[0m
 �[36;1m  $lines | Where-Object { -not $_.StartsWith('{') } | ForEach-Object { Write-Host $_ }�[0m
 �[36;1m  $messages | Where-Object { $_.level -eq 'error' } | ForEach-Object { Write-Host $_.rendered }�[0m
 �[36;1m  Write-Host "::error::The tightened clippy run did not c...

GitHub Actions: CI / Gates: perf: the window package drops the unused Windows Runtime projection - R5/8b

Conclusion: failure

View job details

##[group]Run $PSNativeCommandUseErrorActionPreference = $false
 �[36;1m$PSNativeCommandUseErrorActionPreference = $false�[0m
 �[36;1m$out = dotnet build gui/ChronoMock.slnx --no-incremental -p:ChronoMetricsConfig=D:\a\ChronoMock\ChronoMock/.github/metrics-tight/CodeMetricsConfig.txt -p:TreatWarningsAsErrors=false 2>&1 | Out-String�[0m
 �[36;1mif ($LASTEXITCODE -ne 0) {�[0m
 �[36;1m  Write-Host $out�[0m
 �[36;1m  Write-Host "::error::The tightened build did not compile, so the ceilings could not be measured."�[0m
 �[36;1m  exit 1�[0m
 �[36;1m}�[0m
 �[36;1m$reached = [regex]::Matches($out, 'warning (CA150[26])') | ForEach-Object { $_.Groups[1].Value } | Sort-Object -Unique�[0m
 �[36;1mforeach ($rule in 'CA1502', 'CA1506') {�[0m
 �[36;1m  if ($reached -notcontains $rule) {�[0m
 �[36;1m    Write-Host "::error::$rule in gui/CodeMetricsConfig.txt has room in it: nothing reaches it one below. Lower it to the real maximum, and .github/metrics-tight/CodeMetricsConfig.txt with it."�[0m

GitHub Actions: CI / Gates: perf: the window package drops the unused Windows Runtime projection - R5/8b

Conclusion: failure

View job details

##[group]Run $PSNativeCommandUseErrorActionPreference = $false
 �[36;1m$PSNativeCommandUseErrorActionPreference = $false�[0m
 �[36;1m$lints = @(Get-Content .github/clippy-tight/clippy.toml | ForEach-Object { if ($_ -match '^\s*([a-z-]+)-threshold\s*=') { $Matches[1] -replace '-', '_' } })�[0m
 �[36;1mif ($lints.Count -eq 0) {�[0m
 �[36;1m  Write-Host "::error::No threshold was read from .github/clippy-tight/clippy.toml, so there is nothing to measure."�[0m
...
 �[36;1m$code = $LASTEXITCODE�[0m
 �[36;1m$messages = @($lines | Where-Object { $_.StartsWith('{') } | ForEach-Object { $_ | ConvertFrom-Json } | Where-Object { $_.reason -eq 'compiler-message' } | ForEach-Object { $_.message })�[0m
 �[36;1mif ($code -ne 0) {�[0m
 �[36;1m  $lines | Where-Object { -not $_.StartsWith('{') } | ForEach-Object { Write-Host $_ }�[0m
 �[36;1m  $messages | Where-Object { $_.level -eq 'error' } | ForEach-Object { Write-Host $_.rendered }�[0m
 �[36;1m  Write-Host "::error::The tightened clippy run did not compile, so the ceilings could not be measured."�[0m
 �[36;1m  exit 1�[0m
 �[36;1m}�[0m
 �[36;1m$reached = @($messages | ForEach-Object { $_.code.code } | Where-Object { $_ } | Sort-Object -Unique)�[0m
 �[36;1m$slack = @($lints | Where-Object { $reached -notcontains "clippy::$_" })�[0m
 �[36;1mforeach ($lint in $slack) {�[0m
 �[36;1m  Write-Host "::error::The $lint ceiling in clippy.toml has room in it: nothing reaches it one below. Lower it to the real maximum, and .github/clippy-tight/clippy.toml with it."�[0m

GitHub Actions: CI / Gates: perf: the window package drops the unused Windows Runtime projection - R5/8b

Conclusion: failure

View job details

. ok
 test cdp::session::tests::an_injection_that_runs_out_of_time_takes_its_hook_back_and_queues_the_release ... ok
 test cdp::shim_exec::a_repeating_timer_keeps_its_cadence_and_takes_a_new_rate_from_its_next_tick ... ok
 test cdp::shim_exec::a_frozen_wall_stands_while_the_duration_axis_runs ... ok
 test cdp::shim_exec::a_timer_keeps_its_delay_when_only_the_wall_runs_fast ... ok
 test cdp::shim_exec::a_scheduled_rate_change_takes_effect_at_its_instant ... ok
 test cdp::shim_exec::a_timer_the_four_ms_floor_holds_back_is_noted ... ok
 test cdp::shim_exec::the_audit_notes_a_hidden_page_and_a_zone_it_did_not_read ... ok
 test cdp::shim_exec::a_second_install_a_foreign_marker_and_a_running_page_are_told_apart ... ok
 test cdp::shim_exec::the_engines_own_stamps_and_animations_are_noticed_and_handed_back_as_they_are ... ok
 test cdp::shim_exec::the_clock_is_closed_over_and_its_marker_cannot_be_moved ... ok
 test cdp::shim_exec::the_session_moves_counts_and_lets_go_of_the_page ... ok
 test cdp::tests::a_bad_ws_url_from_the_target_cannot_forge_a_line ... ok
 test cdp::tests::a_full_queue_keeps_its_target_events ... ok
 test cdp::tests::a_hidden_character_at_the_cap_counts_once ... ok
 test cdp::tests::a_lone_surrogate_is_refused_by_the_parser_and_repaired_by_us ... ok
 test cdp::shim_exec::time_origin_plus_now_is_the_session_clock ... ok
 chrono core: skipped a CDP message that was not JSON
 test cdp::shim_exec::the_moves_the_audit_and_the_release_reach_the_frames_of_the_page ... ok
 test cdp::tests::a_proper_pair_and_an_escaped_backslash_are_left_alone ... ok
 test cdp::tests::a_peer_answering_a_byte_at_a_time_cannot_keep_a_request_past_its_deadline ... ok
 test cdp::tests::a_message_that_is_not_json_is_skipped_and_the_next_one_still_arrives ... ok
 test cdp::tests::a_target_error_cannot_forge_a_report_line ... ok
 test cdp::tests::a_queue_of_target_events_reports_only_the_drop_that_happened ... ok
 test cdp::tests::a_ws_url_on_another_port_is_refused ... ok
 test cdp::...

GitHub Actions: CI / Gates: perf: the window package drops the unused Windows Runtime projection - R5/8b

Conclusion: failure

View job details

##[group]Run dotnet test --solution gui/ChronoMock.slnx --filter-not-trait "Category=Integration"
 �[36;1mdotnet test --solution gui/ChronoMock.slnx --filter-not-trait "Category=Integration"�[0m
 shell: C:\Program Files\PowerShell\7\pwsh.EXE -command ". '{0}'"
 env:
   DOTNET_ROOT: C:\Program Files\dotnet
   CACHE_ON_FAILURE: false
   CARGO_INCREMENTAL: 0
 ##[endgroup]
 Running tests from D:\a\ChronoMock\ChronoMock\gui\ChronoMock.Protocol.Tests\bin\Debug\net10.0\ChronoMock.Protocol.Tests.dll (net10.0|x64)
 Running tests from D:\a\ChronoMock\ChronoMock\gui\ChronoMock.App.Tests\bin\Debug\net10.0-windows10.0.17763.0\ChronoMock.App.Tests.dll (net10.0|x64)
 �[mD:\a\ChronoMock\ChronoMock\gui\ChronoMock.Protocol.Tests\bin\Debug\net10.0\ChronoMock.Protocol.Tests.dll (net10.0|x64) �[32mpassed�[m �[90m(4s 365ms)�[m
 �[31mfailed�[m ChronoMock.App.Tests.AnnounceTests.The_calculator_reads_its_answer_when_a_step_moves_it �[90m(17s 728ms)�[m
   from D:\a\ChronoMock\ChronoMock\gui\ChronoMock.App.Tests\bin\Debug\net10.0-windows10.0.17763.0\ChronoMock.App.Tests.dll (net10.0|x64)
 �[31m  nothing was announced
 �[m�[90m    at ChronoMock.App.Tests.AnnounceTests.NextAsync(Heard heard, Func`2 wanted) in D:\a\ChronoMock\ChronoMock\gui\ChronoMock.App.Tests\AnnounceTests.cs:250�[90m
     at ChronoMock.App.Tests.AnnounceTests.<>c.<<The_calculator_reads_its_answer_when_a_step_moves_it>b__7_0>d.MoveNext() in D:\a\ChronoMock\ChronoMock\gui\ChronoMock.App.Tests\AnnounceTests.cs:148�[90m
     --- End of stack trace from previous location ---
 �[90m    --- End of stack trace from previous location ---
 �[m�[mD:\a\ChronoMock\ChronoMock\gui\ChronoMock.App.Tests\bin\Debug\net10.0-windows10.0.17763.0\ChronoMock.App.Tests.dll (net10.0|x64) �[31mfailed with 1 error(s)�[m �[90m(3m 20s 958ms)�[m
 Exit code: 2
 �[31mTest run summary: Failed!
   �[mD:\a\ChronoMock\ChronoMock\gui\ChronoMock.Protocol.Tests\bin\Debug\net10.0\ChronoMock.Protocol.Tests.dll (net10.0|x64) �[32mpassed�[m �[90m(4s 365ms)�[m
   �[m...
🧰 Additional context used
📚 Code guidelines: 2
SECURITY.md — configured
CONTRIBUTING.md — configured
📓 Path-based instructions: 19
Packaging and release configuration of a desktop app.

CodeRabbit configuration file

Files:

  • gui/ChronoMock.App/ChronoMock.App.csproj
  • packaging/build-dist.ps1
  • gui/Directory.Build.props
For every added or upgraded dependency: confirm the package really exists and the name is spelled correctly (typosquatting), it is actively maintained, the license is compatible with this project's license, and it is actually needed (not re...

CodeRabbit configuration file

Files:

  • gui/ChronoMock.App/ChronoMock.App.csproj
  • gui/Directory.Build.props
Applies to text shown to the user (labels, buttons, tooltips, placeholders, dialogs, errors, status messages, empty states, translations).

CodeRabbit configuration file

Files:

  • gui/ChronoMock.App.Tests/FilledScreenSweepTests.cs
  • gui/ChronoMock.App/Views/SessionPhaseView.xaml
  • gui/ChronoMock.App/Themes/Parts.xaml
  • gui/ChronoMock.App/Views/AuditSectionView.xaml
  • gui/ChronoMock.App/App.xaml
  • gui/ChronoMock.App/Views/CalculatorView.xaml
  • crates/cli/src/cli.rs
  • gui/ChronoMock.App/MainWindow.xaml
  • gui/ChronoMock.App/Views/ResultPhaseView.xaml
  • gui/ChronoMock.App/Views/ComponentCatalogue.xaml
  • gui/ChronoMock.App/Controls/DeferredView.cs
  • gui/ChronoMock.App/Views/SetupPhaseView.xaml
  • gui/ChronoMock.App.Tests/DeferredViewTests.cs
Verify tests check real behavior and would fail if the implementation were broken.

CodeRabbit configuration file

Files:

  • gui/ChronoMock.App.Tests/FilledScreenSweepTests.cs
  • tests/mutation/entries.json
  • gui/ChronoMock.App.Tests/DeferredViewTests.cs
These are end-user desktop applications.

CodeRabbit configuration file

Files:

  • gui/ChronoMock.App.Tests/FilledScreenSweepTests.cs
  • gui/ChronoMock.App/Views/SessionPhaseView.xaml
  • gui/ChronoMock.App/Themes/Parts.xaml
  • gui/ChronoMock.App/Views/AuditSectionView.xaml
  • gui/ChronoMock.App/App.xaml
  • gui/ChronoMock.App/Views/CalculatorView.xaml
  • crates/cli/src/cli.rs
  • gui/ChronoMock.App/MainWindow.xaml
  • gui/ChronoMock.App/Views/ResultPhaseView.xaml
  • gui/ChronoMock.App/Views/ComponentCatalogue.xaml
  • gui/ChronoMock.App/Controls/DeferredView.cs
  • gui/ChronoMock.App/Views/SetupPhaseView.xaml
  • gui/ChronoMock.App.Tests/DeferredViewTests.cs
Performance is a known weak spot of these projects.

CodeRabbit configuration file

Files:

  • gui/ChronoMock.App.Tests/FilledScreenSweepTests.cs
  • gui/ChronoMock.App/Views/SessionPhaseView.xaml
  • gui/ChronoMock.App/Themes/Parts.xaml
  • gui/ChronoMock.App/Views/AuditSectionView.xaml
  • gui/ChronoMock.App/App.xaml
  • gui/ChronoMock.App/Views/CalculatorView.xaml
  • crates/cli/src/cli.rs
  • gui/ChronoMock.App/MainWindow.xaml
  • gui/ChronoMock.App/Views/ResultPhaseView.xaml
  • gui/ChronoMock.App/Views/ComponentCatalogue.xaml
  • gui/ChronoMock.App/Controls/DeferredView.cs
  • gui/ChronoMock.App/Views/SetupPhaseView.xaml
  • gui/ChronoMock.App.Tests/DeferredViewTests.cs
Applies only to code that builds or styles a GUI.

CodeRabbit configuration file

Files:

  • gui/ChronoMock.App.Tests/FilledScreenSweepTests.cs
  • gui/ChronoMock.App/Views/SessionPhaseView.xaml
  • gui/ChronoMock.App/Themes/Parts.xaml
  • gui/ChronoMock.App/Views/AuditSectionView.xaml
  • gui/ChronoMock.App/App.xaml
  • gui/ChronoMock.App/Views/CalculatorView.xaml
  • crates/cli/src/cli.rs
  • gui/ChronoMock.App/MainWindow.xaml
  • gui/ChronoMock.App/Views/ResultPhaseView.xaml
  • gui/ChronoMock.App/Views/ComponentCatalogue.xaml
  • gui/ChronoMock.App/Controls/DeferredView.cs
  • gui/ChronoMock.App/Views/SetupPhaseView.xaml
  • gui/ChronoMock.App.Tests/DeferredViewTests.cs
User-facing changelog.

CodeRabbit configuration file

Files:

  • CHANGELOG.md
Domain: per-process time substitution (injected hook DLL, plus a Chromium/CDP mode and embedded web engines reached over their debugging port).

CodeRabbit configuration file

Files:

  • gui/ChronoMock.App.Tests/FilledScreenSweepTests.cs
  • gui/ChronoMock.App/Views/SessionPhaseView.xaml
  • gui/ChronoMock.App/Themes/Parts.xaml
  • gui/ChronoMock.App/Views/AuditSectionView.xaml
  • gui/ChronoMock.App/App.xaml
  • gui/ChronoMock.App/Views/CalculatorView.xaml
  • crates/cli/src/cli.rs
  • gui/ChronoMock.App/MainWindow.xaml
  • gui/ChronoMock.App/ChronoMock.App.csproj
  • gui/ChronoMock.App/Views/ResultPhaseView.xaml
  • gui/ChronoMock.App/Views/ComponentCatalogue.xaml
  • gui/Directory.Build.props
  • gui/ChronoMock.App/Controls/DeferredView.cs
  • gui/ChronoMock.App/Views/SetupPhaseView.xaml
  • gui/ChronoMock.App.Tests/DeferredViewTests.cs
SECURITY, HIGH PRIORITY.

CodeRabbit configuration file

Files:

  • gui/ChronoMock.App.Tests/FilledScreenSweepTests.cs
  • crates/cli/src/cli.rs
  • gui/ChronoMock.App/Controls/DeferredView.cs
  • gui/ChronoMock.App.Tests/DeferredViewTests.cs
These apps are QA/developer tools.

CodeRabbit configuration file

Files:

  • gui/ChronoMock.App.Tests/FilledScreenSweepTests.cs
  • crates/cli/src/cli.rs
  • gui/ChronoMock.App/Controls/DeferredView.cs
  • gui/ChronoMock.App.Tests/DeferredViewTests.cs
C# / .NET code.

CodeRabbit configuration file

Files:

  • gui/ChronoMock.App.Tests/FilledScreenSweepTests.cs
  • gui/ChronoMock.App/Views/SessionPhaseView.xaml
  • gui/ChronoMock.App/Themes/Parts.xaml
  • gui/ChronoMock.App/Views/AuditSectionView.xaml
  • gui/ChronoMock.App/App.xaml
  • gui/ChronoMock.App/Views/CalculatorView.xaml
  • gui/ChronoMock.App/MainWindow.xaml
  • gui/ChronoMock.App/Views/ResultPhaseView.xaml
  • gui/ChronoMock.App/Views/ComponentCatalogue.xaml
  • gui/ChronoMock.App/Controls/DeferredView.cs
  • gui/ChronoMock.App/Views/SetupPhaseView.xaml
  • gui/ChronoMock.App.Tests/DeferredViewTests.cs
Check that documentation matches the actual code in this PR: commands, flags, config keys, file paths, build steps and examples must exist.

CodeRabbit configuration file

Files:

  • THIRD-PARTY-NOTICES.md
  • CHANGELOG.md
Rust code.

CodeRabbit configuration file

Files:

  • crates/cli/src/cli.rs
All code in this repository is written by an AI coding agent (Claude Code).

CodeRabbit configuration file

Files:

  • THIRD-PARTY-NOTICES.md
  • gui/ChronoMock.App.Tests/FilledScreenSweepTests.cs
  • gui/ChronoMock.App/Views/SessionPhaseView.xaml
  • gui/ChronoMock.App/Themes/Parts.xaml
  • gui/ChronoMock.App/Views/AuditSectionView.xaml
  • gui/ChronoMock.App/App.xaml
  • gui/ChronoMock.App/Views/CalculatorView.xaml
  • crates/cli/src/cli.rs
  • gui/ChronoMock.App/MainWindow.xaml
  • gui/ChronoMock.App/ChronoMock.App.csproj
  • CHANGELOG.md
  • gui/ChronoMock.App/Views/ResultPhaseView.xaml
  • gui/ChronoMock.App/Views/ComponentCatalogue.xaml
  • packaging/build-dist.ps1
  • gui/Directory.Build.props
  • gui/ChronoMock.App/Controls/DeferredView.cs
  • tests/mutation/entries.json
  • gui/ChronoMock.App/Views/SetupPhaseView.xaml
  • gui/ChronoMock.App.Tests/DeferredViewTests.cs
Source excerpt: **It makes no connections off the machine.**

CodeRabbit inference engine (SECURITY.md)

Files:

  • gui/ChronoMock.App.Tests/FilledScreenSweepTests.cs
  • crates/cli/src/cli.rs
  • gui/ChronoMock.App/Controls/DeferredView.cs
  • gui/ChronoMock.App.Tests/DeferredViewTests.cs
Source excerpt: These are guards rather than preferences, so a pull request that breaks one fails before anyone reviews it: **Nothing in the repository sets the system clock.**

CodeRabbit inference engine (CONTRIBUTING.md)

Files:

  • THIRD-PARTY-NOTICES.md
  • gui/ChronoMock.App.Tests/FilledScreenSweepTests.cs
  • gui/ChronoMock.App/Views/SessionPhaseView.xaml
  • gui/ChronoMock.App/Themes/Parts.xaml
  • gui/ChronoMock.App/Views/AuditSectionView.xaml
  • gui/ChronoMock.App/App.xaml
  • gui/ChronoMock.App/Views/CalculatorView.xaml
  • crates/cli/src/cli.rs
  • gui/ChronoMock.App/MainWindow.xaml
  • gui/ChronoMock.App/ChronoMock.App.csproj
  • CHANGELOG.md
  • gui/ChronoMock.App/Views/ResultPhaseView.xaml
  • gui/ChronoMock.App/Views/ComponentCatalogue.xaml
  • packaging/build-dist.ps1
  • gui/Directory.Build.props
  • gui/ChronoMock.App/Controls/DeferredView.cs
  • tests/mutation/entries.json
  • gui/ChronoMock.App/Views/SetupPhaseView.xaml
  • gui/ChronoMock.App.Tests/DeferredViewTests.cs
No hardcoded UI styling: Only if the PR adds or changes GUI code (XAML, Slint, Fyne, Tkinter, WPF code-behind): warn if new or changed UI code sets colors, fonts, font sizes, margins, paddings, sizes or corner radii as literal values on ind...

CodeRabbit inference engine (Custom checks)

Files:

  • gui/ChronoMock.App/App.xaml
  • gui/ChronoMock.App/Views/CalculatorView.xaml
  • gui/ChronoMock.App/MainWindow.xaml
Scope, duplication and docs: Warn if any of these is true: the PR contains significant changes not mentioned in the title/description, or mixes unrelated refactors with a feature or fix; the PR adds functionality, helpers, UI components, st...

CodeRabbit inference engine (Custom checks)

Files:

  • CHANGELOG.md
🪛 LanguageTool
CHANGELOG.md

[grammar] ~286-~286: Ensure spelling is correct
Context: ...omponent in the package without an SPDX licence, and it leaves the SBOM and the third...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

Walkthrough

The change adds deferred construction for session and result views and enables ReadyToRun publishing for shipped layouts. It also excludes Windows Runtime projection assemblies from GUI packages and updates package validation, component records, notices, tests, and changelog entries.

Changes: Deferred phase views

Layer / File(s) Summary
Deferred view construction and window integration
gui/ChronoMock.App/Controls/DeferredView.cs, gui/ChronoMock.App/MainWindow.xaml, CHANGELOG.md
DeferredView loads template content during measurement and retains the created child. MainWindow uses it for the session and result phases. The changelog records startup measurements and the package-size increase.
Lifecycle validation and resource-loading notes
gui/ChronoMock.App.Tests/DeferredViewTests.cs, gui/ChronoMock.App.Tests/FilledScreenSweepTests.cs, tests/mutation/entries.json, gui/ChronoMock.App/App.xaml, gui/ChronoMock.App/Themes/Parts.xaml, gui/ChronoMock.App/Views/*
Tests cover deferred construction, reuse, data and layout propagation, invalid template roots, and settled layout before measurement. Mutation cases cover deferred-view behavior. XAML comments describe local Parts dictionary merges and converter load ordering.

Windows packaging

Layer / File(s) Summary
Publish configuration and output validation
gui/Directory.Build.props, gui/ChronoMock.App/ChronoMock.App.csproj, packaging/build-dist.ps1
GUI publishing enables ReadyToRun for shipped layouts and excludes Windows Runtime projection references. The distribution script checks ReadyToRun metadata and rejects projection assemblies in the output.
Package inventory and notices
packaging/components.json, THIRD-PARTY-NOTICES.md, crates/cli/src/cli.rs, CHANGELOG.md
The Windows SDK reference pack is removed from the component register and runtime notices. CLI component expectations and the minimum count are updated. The changelog records the package-size changes and retained platform compatibility.

Priority: Normal

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Other

Sequence Diagram(s)

sequenceDiagram
  participant MainWindow
  participant DeferredView
  participant WPFLayout
  participant DataTemplate
  MainWindow->>DeferredView: Assigns phase DataTemplate
  WPFLayout->>DeferredView: Measures when phase is shown
  DeferredView->>DataTemplate: Loads content once
  DataTemplate-->>DeferredView: Returns UIElement
Loading

Suggested labels: performance, ui, packaging, dependencies

Merge Risk: Minimal · up to e8f5b

No actionable issue remains; the change is ready to merge after normal checks.

Pre-merge checks: Passed 13 · Inconclusive 1

Failed Failed checks: 1 inconclusive

Check name Status Explanation Resolution
Scope, Duplication And Docs Inconclusive The reviewed range adds a separate startup feature: DeferredView, deferred phase construction, ReadyToRun publishing, and mutation tests, in addition to removing the Windows Runtime projection. The … Provide the complete pull request description, or explicitly state whether the R5/8 startup changes (DeferredView, deferred phases, and ReadyToRun publishing) are part of this pull request. If they are not, split them into a separate pull…
Passed Passed checks: 13 passed
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly describes the main user-visible and packaging change: removal of the unused Windows Runtime projection from the window package. It is specific and suitable for release notes or git h…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Tests For Changed Behavior Passed The changed runtime behavior has test coverage. DeferredViewTests covers deferred construction, reuse, data-context and layout propagation, and invalid template roots. FilledScreenSweepTests updat…
No Secrets Or Debug Leftovers Passed No failure condition is introduced. The pull-request file inventory contains no CLAUDE.md, CLAUDE.local.md, AGENTS.md, .claude/, or .env path. Added-line scans found no credentials, private URLs, loca…
No Hardcoded Ui Styling Passed PASS: The PR changes WPF code, but it does not add hardcoded visual styling. The new DeferredView only sets default Visibility.Collapsed and manages template creation. MainWindow.xaml uses share…
No Obvious Performance Problems Passed The diff has no clear, concrete performance problem under the check's criteria. - DeferredView.cs (new): builds its child once, on the first layout measure, and keeps it. It does not rebuild on ev…
Desktop Robustness Passed The changed production code only defers WPF view construction, removes a framework reference, and adds publish-time PE/file-presence checks. The diff adds no working-directory asset load, settings/dat…
Safe File Parsing Passed No unsafe file parsing was introduced. DeferredView calls DataTemplate.LoadContent() only for inline, compiled application XAML in MainWindow.xaml; it does not read external XAML. The only new `…
System Changes Are Reversible Passed The PR does not add or change code that modifies network filters, proxies, firewalls, system time, process hooking/injection, Windows services, the registry, or drivers. The changed runtime code only …
Clear User-Facing Text Passed PASS — The changed XAML adds only the DeferredView namespace and deferred templates; it does not add or change buttons, icon-only controls, labels, tooltips, or confirmation text. The new InvalidOpera…
No Resource Leaks Passed No resource leak is introduced. DeferredView.MeasureOverride creates one UIElement only while Child is null, then retains that bounded child; MainWindow.xaml contains only two such hosts. The …
Full details: Title check

Explanation

The title clearly describes the main user-visible and packaging change: removal of the unused Windows Runtime projection from the window package. It is specific and suitable for release notes or git history.

Full details: Tests For Changed Behavior

Explanation

The changed runtime behavior has test coverage. DeferredViewTests covers deferred construction, reuse, data-context and layout propagation, and invalid template roots. FilledScreenSweepTests updates layout setup for deferred phases. The component-count assertion changes from 28 to 27 because the Windows Runtime projection was removed, which the PR description explicitly justifies. No tests were deleted, skipped, or weakened without justification.

Full details: No Secrets Or Debug Leftovers

Explanation

No failure condition is introduced. The pull-request file inventory contains no CLAUDE.md, CLAUDE.local.md, AGENTS.md, .claude/, or .env path. Added-line scans found no credentials, private URLs, local absolute paths, IPs, personal emails, or debug output such as Console.WriteLine, Debug.WriteLine, dbg!, println!, breakpoint(), or debugger calls. The only added URL is the standard public WPF XAML namespace.

Full details: No Hardcoded Ui Styling

Explanation

PASS: The PR changes WPF code, but it does not add hardcoded visual styling. The new DeferredView only sets default Visibility.Collapsed and manages template creation. MainWindow.xaml uses shared bindings and reusable DeferredView wrappers; other XAML changes are comments and resource-merge documentation. The literal 200/100 values occur only as test layout-probe dimensions, not control styling. No copy-pasted styled controls were added.

Full details: No Obvious Performance Problems

Explanation

The diff has no clear, concrete performance problem under the check's criteria. - DeferredView.cs (new): builds its child once, on the first layout measure, and keeps it. It does not rebuild on every pass. Its Child is null guard prevents repeated construction. Not a UI-thread hot loop or a per-item cost. - MainWindow.xaml: defers the session and result phase views until first shown. This reduces startup work. It does not add work. - build-dist.ps1: the new Test-ReadyToRun reads three PE headers once per assembly. The projection-file checks are existence tests on a fixed list. Both are build-time and negligible. - Build and config files (Directory.Build.props, ChronoMock.App.csproj, components.json, THIRD-PARTY-NOTICES.md, cli.rs, CHANGELOG.md, App.xaml, the view and theme XAML comments): no runtime loops, lists, timers, or queries. - Tests: the new test suites and the settle call in FilledScreenSweepTests.cs are test-only. The PR's stated gain is a smaller package, and its startup measurements show no regression. I did not find a listed problem pattern such as blocking I/O on the UI thread, non-virtualized lists, per-item external calls, or polling. The PR description was truncated, but the diff evidence above covers the code it changes.

Full details: Desktop Robustness

Explanation

The changed production code only defers WPF view construction, removes a framework reference, and adds publish-time PE/file-presence checks. The diff adds no working-directory asset load, settings/data write, number/date parse or save, background task, elevation, network call, destructive action, or user-started long operation. DeferredView creates and retains a child synchronously during layout; this is UI construction, not a long-running operation under the stated check. The existing checksum write is not changed by this PR.

Full details: Safe File Parsing

Explanation

No unsafe file parsing was introduced. DeferredView calls DataTemplate.LoadContent() only for inline, compiled application XAML in MainWindow.xaml; it does not read external XAML. The only new XamlReader.Parse call is test-only and parses a fixed literal string. Test-ReadyToRun uses File.OpenRead and PEReader on fixed publish DLL paths, reads PE metadata without loading assemblies, and disposes both objects. JSON and resource-file parsing changes are absent from the PR.

Full details: System Changes Are Reversible

Explanation

The PR does not add or change code that modifies network filters, proxies, firewalls, system time, process hooking/injection, Windows services, the registry, or drivers. The changed runtime code only defers WPF view construction. The other changes adjust MSBuild/package settings, packaging validation, documentation, and tests.

Full details: Clear User-Facing Text

Explanation

PASS — The changed XAML adds only the DeferredView namespace and deferred templates; it does not add or change buttons, icon-only controls, labels, tooltips, or confirmation text. The new InvalidOperationException message clearly states the template-root problem and the required fix. Other changed prose is comments, packaging diagnostics, changelog, or notices, not user-facing UI text, and no explicit text failure condition is introduced.

Full details: No Resource Leaks

Explanation

No resource leak is introduced. DeferredView.MeasureOverride creates one UIElement only while Child is null, then retains that bounded child; MainWindow.xaml contains only two such hosts. The PR adds no event subscription, timer, thread, process, file, stream, or native-resource ownership in the app. The new packaging stream is disposed on all paths by nested finally blocks in packaging/build-dist.ps1.

Full details: Scope, Duplication And Docs

Explanation

The reviewed range adds a separate startup feature: DeferredView, deferred phase construction, ReadyToRun publishing, and mutation tests, in addition to removing the Windows Runtime projection. The visible title and description focus on projection removal, although the description is truncated before its final content. The repository has no existing equivalent deferred-view helper, and CHANGELOG.md documents both startup and package changes. The missing description text prevents a reliable scope decision.

Resolution

Provide the complete pull request description, or explicitly state whether the R5/8 startup changes (DeferredView, deferred phases, and ReadyToRun publishing) are part of this pull request. If they are not, split them into a separate pull request or update the title and description.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@donislawdev

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@donislawdev

Copy link
Copy Markdown
Owner Author

@@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot added dependencies Pull requests that update a dependency file packaging performance ui labels Oct 21, 2026
@coderabbitai

coderabbitai Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

@donislawdev I will trigger a full review of all changes in #138.

⚠️ Action not completed

Review rate limited.


Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 51 minutes.

dependabot Bot and others added 7 commits October 26, 2026 06:42
…with 3 updates

Bumps the cargo-minor-and-patch group with 3 updates in the / directory: [serde_json](https://github.com/serde-rs/json), [toml](https://github.com/toml-rs/toml) and [winresource](https://github.com/BenjaminRi/winresource).


Updates `serde_json` from 1.0.151 to 1.0.154
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](serde-rs/json@v1.0.151...v1.0.154)

Updates `toml` from 1.1.6+spec-1.1.0 to 1.1.8+spec-1.1.0
- [Commits](toml-rs/toml@toml-v1.1.6...toml-v1.1.8)

Updates `winresource` from 0.1.31 to 0.1.34
- [Commits](https://github.com/BenjaminRi/winresource/commits)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-version: 1.0.154
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-and-patch
- dependency-name: toml
  dependency-version: 1.1.8+spec-1.1.0
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-and-patch
- dependency-name: winresource
  dependency-version: 0.1.34
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps Microsoft.NET.Test.Sdk from 18.10.1 to 18.11.0

---
updated-dependencies:
- dependency-name: Microsoft.NET.Test.Sdk
  dependency-version: 18.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: nuget-minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [semgrep](https://github.com/semgrep/semgrep) from 1.180.0 to 1.181.0.
- [Release notes](https://github.com/semgrep/semgrep/releases)
- [Changelog](https://github.com/semgrep/semgrep/blob/develop/CHANGELOG.md)
- [Commits](semgrep/semgrep@v1.180.0...v1.181.0)

---
updated-dependencies:
- dependency-name: semgrep
  dependency-version: 1.181.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
main brings #137, which this branch was stacked on, and the actions bump of #141.
The three Dependabot branches come in as they are, so their pull requests count as
merged with this one:

- #117 serde_json 1.0.154, toml 1.1.8, winresource 0.1.34 (Cargo.lock)
- #139 Microsoft.NET.Test.Sdk 18.11.0 in the protocol tests
- #140 semgrep 1.181.0, the scanner behind the Semgrep gate

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…time packs

Two components the packages ship moved under the register, and each stopped a check:

- serde_json 1.0.154 came in with the Dependabot update of #117, and the component guard
  failed on it (register 1.0.151, lockfile 1.0.154). Its dependencies did not change.
- The runners took .NET SDK 10.0.403 on 2026-10-26, which publishes the window with the
  10.0.14 runtime packs, the .NET security release of 2026-10-25. build-dist.ps1 stopped
  the installer job on every open pull request (declared 10.0.13, bundled 10.0.14).

packaging/components.json and THIRD-PARTY-NOTICES.md name the new versions, and the
unreleased CHANGELOG line about the bundled runtime names 10.0.14.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The calculator announcement test failed on a runner with "nothing was announced"
after 17.7 s, where it takes 3.3 s on a desktop run alone and cold.

NextAsync checked its deadline before it read the queue, so when the UI thread was held
past the deadline by other work, the announcement made just before the hold was never
read and the test reported that nothing was announced. It now reads the queue once more
after the deadline. A failure names how long it waited and every announcement it passed
over, so a repeat on a runner says which way it failed.

The deadline goes from 5 s to 20 s. It bounds only a failure, the wait ends at the
announcement, and the runner spent about 12.7 s on the steps before the wait.

Measured with a probe that holds the UI thread for the deadline and a second, from the
moment the announcement is made: the old helper fails it with "nothing was announced",
the new one reads it, and the new one without the last read fails it with the 20 s
deadline too. The probe is not kept, it would add over 20 s to every run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e wait runs out

AnsweredAsync in FilledScreenSweepTests had the shape NextAsync had in AnnounceTests: it
returned false at the deadline without a last look, so an answer that landed while the UI
thread was held past the deadline was counted as no answer and the scenario as unanswered.
It now checks once more after the deadline. The deadline stays at 5 s.

Measured with a probe that holds the UI thread for the deadline and a second from the moment
the answer lands: the old helper counts the answer as missing, the new one finds it. The
probe is not kept. FilledScreenSweepTests 4 of 4, format-cs, metrics-pin and hygiene green.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@donislawdev
donislawdev merged commit 632bc28 into main Oct 26, 2026
17 checks passed
@donislawdev
donislawdev deleted the perf/r5-8b-no-winrt-projection branch October 26, 2026 17:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file packaging performance ui

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant