From 57a203fd46b22064dd9c4a7bb6c6f5cf3d619d89 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 08:10:28 +0000 Subject: [PATCH 1/9] Publish: develop 698cbce to release Generated by .github/scripts/release/sync-release.sh. The internal planning documents listed below are kept on develop only: PROJECT.md AGENTS.md docs/INTENT.md docs/RESEARCH.md docs/SPEC.md scripts/tests/appspike --- rivet/runtime/windows/src/features/link_tabs.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/rivet/runtime/windows/src/features/link_tabs.rs b/rivet/runtime/windows/src/features/link_tabs.rs index 56f7345..27920d0 100644 --- a/rivet/runtime/windows/src/features/link_tabs.rs +++ b/rivet/runtime/windows/src/features/link_tabs.rs @@ -85,7 +85,10 @@ pub fn appeared(known: &HashSet, now: &[isize], rivet: &[isize]) -> Vec = crate::frame::rivet_windows() .into_iter() .map(|window| window as isize) @@ -166,8 +169,8 @@ pub(crate) unsafe fn tick(window: HWND) { Some(titles) => format!("{} tabs, but a tab has no page", titles.len()), }, }; - // Once per window: what kind of window holds no browser. - if empty_for < std::time::Duration::from_millis(100) { + // Once per window, in a debug build only: what kind of window holds no browser. + if cfg!(debug_assertions) && empty_for < std::time::Duration::from_millis(100) { crate::frame::trace_window_kind(other as HWND, "no tab yet"); } crate::trace::trace(&format!( From b77fe7973199254fd8bd88b835e6ed78fa7c31d7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 08:17:30 +0000 Subject: [PATCH 2/9] Publish: develop 8304718 to release Generated by .github/scripts/release/sync-release.sh. The internal planning documents listed below are kept on develop only: PROJECT.md AGENTS.md docs/INTENT.md docs/RESEARCH.md docs/SPEC.md scripts/tests/appspike --- scripts/tests/windows-features.ps1 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/tests/windows-features.ps1 b/scripts/tests/windows-features.ps1 index 7a00ab2..4380bd5 100644 --- a/scripts/tests/windows-features.ps1 +++ b/scripts/tests/windows-features.ps1 @@ -1323,9 +1323,13 @@ function Invoke-LinkNewTab($Name, $shots) { if (-not (Test-Attached $ctx)) { return @('FAIL', $null, (Get-AttachFailure $ctx)) } $before = Get-MyTops $ctx $cr = New-Object FeatureWin+R; [FeatureWin]::GetClientRect($ctx.Hwnd, [ref]$cr) | Out-Null - $page = [FeatureWin]::Inside($ctx.Hwnd, (& { $p = New-Object FeatureWin+P; $p.X = [int]($cr.Ri * 0.7); $p.Y = [int]($cr.B / 2); [FeatureWin]::ClientToScreen($ctx.Hwnd, [ref]$p) | Out-Null; $p })) - $l = [IntPtr](([int]($cr.B / 2) -shl 16) -bor ([int]($cr.Ri * 0.7) -band 0xffff)) + $screen = New-Object FeatureWin+P; $screen.X = [int]($cr.Ri * 0.7); $screen.Y = [int]($cr.B / 2); [FeatureWin]::ClientToScreen($ctx.Hwnd, [ref]$screen) | Out-Null + $page = [FeatureWin]::Inside($ctx.Hwnd, $screen) $target = if ($page -ne [IntPtr]::Zero) { $page } else { $ctx.Hwnd } + # The click goes to the window under the point, in that window's own coordinates: at another + # scale the page's window starts further right, and the window's client point misses it. + $c = $screen; [FeatureWin]::ScreenToClient($target, [ref]$c) | Out-Null + $l = [IntPtr](($c.Y -shl 16) -bor ($c.X -band 0xffff)) # The browser's status bubble, a short strip of its own, can show the link's address. It is not # a window the link opened, so only a window at least 100 px high counts as one. $isPage = { param($h) $r = New-Object FeatureWin+R; [FeatureWin]::GetWindowRect($h, [ref]$r) | Out-Null; ($r.B - $r.T) -ge 100 } From 03b11c239ddb47a4d59bb11a77644ebedc5ae93b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 08:20:53 +0000 Subject: [PATCH 3/9] Publish: develop fe860c9 to release Generated by .github/scripts/release/sync-release.sh. The internal planning documents listed below are kept on develop only: PROJECT.md AGENTS.md docs/INTENT.md docs/RESEARCH.md docs/SPEC.md scripts/tests/appspike --- scripts/tests/windows-features.ps1 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/tests/windows-features.ps1 b/scripts/tests/windows-features.ps1 index 4380bd5..16c2f23 100644 --- a/scripts/tests/windows-features.ps1 +++ b/scripts/tests/windows-features.ps1 @@ -264,7 +264,10 @@ function Open-Scene($ctx, $state, $Url, $Seed, [string[]]$Extra = @()) { else { $held = 0; [FeatureWin]::SetWindowPos($ctx.Hwnd, [IntPtr]::Zero, 9000, 1000, 1800, 1067, 0x14) | Out-Null } Start-Sleep -Milliseconds 250 } - if ($held -lt 6 -and -not $ctx.Error) { $ctx.Error = 'the window did not stay at its off-screen park' } [FeatureWin]::PostMessage($ctx.Hwnd, 0x86, [IntPtr]1, [IntPtr]0) | Out-Null + if ($held -lt 6 -and -not $ctx.Error) { + $r = New-Object FeatureWin+R; [FeatureWin]::GetWindowRect($ctx.Hwnd, [ref]$r) | Out-Null + $ctx.Error = "the window did not stay at its off-screen park: it is at $($r.L),$($r.T) $($r.Ri - $r.L)x$($r.B - $r.T), not 9000,1000 1800x1067" + } [FeatureWin]::PostMessage($ctx.Hwnd, 0x86, [IntPtr]1, [IntPtr]0) | Out-Null Start-Sleep 8 $dpi = Get-LayoutDpi $ctx if ($dpi) { $ctx.Dpi = $dpi } elseif (-not $ctx.Error) { $ctx.Error = 'the runtime traced no scale for the window' } From 09454eec5cdf85c515b94f110685a1f707797cda Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 08:54:28 +0000 Subject: [PATCH 4/9] Publish: develop 143ba64 to release Generated by .github/scripts/release/sync-release.sh. The internal planning documents listed below are kept on develop only: PROJECT.md AGENTS.md docs/INTENT.md docs/RESEARCH.md docs/SPEC.md scripts/tests/appspike --- scripts/tests/windows-features.ps1 | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/scripts/tests/windows-features.ps1 b/scripts/tests/windows-features.ps1 index 16c2f23..9d556ac 100644 --- a/scripts/tests/windows-features.ps1 +++ b/scripts/tests/windows-features.ps1 @@ -219,9 +219,20 @@ function Start-Scene($Name, $Feature, $Url) { } # Whether the scene's window is at the off-screen park, 9000,1000 at 1800x1067. +# On a CI runner Windows clamps a window to the runner's small display, so there the park holds +# when the window is at its place and keeps one size; everywhere else it must also be 1800x1067. +# The pixel rows read the window's own client size, so they follow the size it kept. +$script:OnRunner = [bool]$env:GITHUB_ACTIONS +$script:ParkedSize = $null function Test-Parked($ctx) { $r = New-Object FeatureWin+R; [FeatureWin]::GetWindowRect($ctx.Hwnd, [ref]$r) | Out-Null - $r.L -eq 9000 -and $r.T -eq 1000 -and ($r.Ri - $r.L) -eq 1800 -and ($r.B - $r.T) -eq 1067 + $size = '{0}x{1}' -f ($r.Ri - $r.L), ($r.B - $r.T) + $placed = $r.L -eq 9000 -and $r.T -eq 1000 + if (-not $script:OnRunner) { return $placed -and $size -eq '1800x1067' } + if (-not $placed) { return $false } + $stable = $script:ParkedSize -eq $size + $script:ParkedSize = $size + $stable } function Open-Scene($ctx, $state, $Url, $Seed, [string[]]$Extra = @()) { From f4fdf0aa75fff7d27f32dd10e04ea4c479c457f9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 09:23:39 +0000 Subject: [PATCH 5/9] Publish: develop 2b689fa to release Generated by .github/scripts/release/sync-release.sh. The internal planning documents listed below are kept on develop only: PROJECT.md AGENTS.md docs/INTENT.md docs/RESEARCH.md docs/SPEC.md scripts/tests/appspike --- scripts/tests/windows-features.ps1 | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/scripts/tests/windows-features.ps1 b/scripts/tests/windows-features.ps1 index 9d556ac..e2ab8e8 100644 --- a/scripts/tests/windows-features.ps1 +++ b/scripts/tests/windows-features.ps1 @@ -218,17 +218,21 @@ function Start-Scene($Name, $Feature, $Url) { return $ctx, $state } -# Whether the scene's window is at the off-screen park, 9000,1000 at 1800x1067. +# Whether the scene's window is at the off-screen park, 9000,1000 at the park size. # On a CI runner Windows clamps a window to the runner's small display, so there the park holds -# when the window is at its place and keeps one size; everywhere else it must also be 1800x1067. +# when the window is at its place and keeps one size; everywhere else it must also be the park size. # The pixel rows read the window's own client size, so they follow the size it kept. $script:OnRunner = [bool]$env:GITHUB_ACTIONS +# The park's size in pixels. RIVET_TEST_PARK_SIZE ("2880x1800") sets another, so a run at a higher +# scale can keep the window as wide in DIPs as a run at a lower one. +$script:ParkW = 1800; $script:ParkH = 1067 +if ($env:RIVET_TEST_PARK_SIZE -match '^(\d+)x(\d+)$') { $script:ParkW = [int]$Matches[1]; $script:ParkH = [int]$Matches[2] } $script:ParkedSize = $null function Test-Parked($ctx) { $r = New-Object FeatureWin+R; [FeatureWin]::GetWindowRect($ctx.Hwnd, [ref]$r) | Out-Null $size = '{0}x{1}' -f ($r.Ri - $r.L), ($r.B - $r.T) $placed = $r.L -eq 9000 -and $r.T -eq 1000 - if (-not $script:OnRunner) { return $placed -and $size -eq '1800x1067' } + if (-not $script:OnRunner) { return $placed -and $size -eq ('{0}x{1}' -f $script:ParkW, $script:ParkH) } if (-not $placed) { return $false } $stable = $script:ParkedSize -eq $size $script:ParkedSize = $size @@ -272,12 +276,12 @@ function Open-Scene($ctx, $state, $Url, $Seed, [string[]]$Extra = @()) { $held = 0 foreach ($try in 1..60) { if (Test-Parked $ctx) { $held++; if ($held -ge 6) { break } } - else { $held = 0; [FeatureWin]::SetWindowPos($ctx.Hwnd, [IntPtr]::Zero, 9000, 1000, 1800, 1067, 0x14) | Out-Null } + else { $held = 0; [FeatureWin]::SetWindowPos($ctx.Hwnd, [IntPtr]::Zero, 9000, 1000, $script:ParkW, $script:ParkH, 0x14) | Out-Null } Start-Sleep -Milliseconds 250 } if ($held -lt 6 -and -not $ctx.Error) { $r = New-Object FeatureWin+R; [FeatureWin]::GetWindowRect($ctx.Hwnd, [ref]$r) | Out-Null - $ctx.Error = "the window did not stay at its off-screen park: it is at $($r.L),$($r.T) $($r.Ri - $r.L)x$($r.B - $r.T), not 9000,1000 1800x1067" + $ctx.Error = "the window did not stay at its off-screen park: it is at $($r.L),$($r.T) $($r.Ri - $r.L)x$($r.B - $r.T), not 9000,1000 $($script:ParkW)x$($script:ParkH)" } [FeatureWin]::PostMessage($ctx.Hwnd, 0x86, [IntPtr]1, [IntPtr]0) | Out-Null Start-Sleep 8 $dpi = Get-LayoutDpi $ctx From a1a7311f7fd75b2f24e515e074254e1b9da3e0ca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 10:14:29 +0000 Subject: [PATCH 6/9] Publish: develop 3925d30 to release Generated by .github/scripts/release/sync-release.sh. The internal planning documents listed below are kept on develop only: PROJECT.md AGENTS.md docs/INTENT.md docs/RESEARCH.md docs/SPEC.md scripts/tests/appspike --- .github/workflows/browser-rows.yml | 3 +++ scripts/tests/windows-features.ps1 | 23 ++++++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/.github/workflows/browser-rows.yml b/.github/workflows/browser-rows.yml index 5040fa2..505e7a7 100644 --- a/.github/workflows/browser-rows.yml +++ b/.github/workflows/browser-rows.yml @@ -304,6 +304,9 @@ jobs: ${{ runner.temp }}/session/row-failed.png ${{ runner.temp }}/session/features-passed ${{ runner.temp }}/session/features/results.json + ${{ runner.temp }}/session/features/traces/**/*.log + ${{ runner.temp }}/session/features/*/*.png + ${{ runner.temp }}/session/features/profiles/*/Crashpad/reports/*.dmp retention-days: 30 - name: Tell a person that this build failed diff --git a/scripts/tests/windows-features.ps1 b/scripts/tests/windows-features.ps1 index e2ab8e8..b4eb8ed 100644 --- a/scripts/tests/windows-features.ps1 +++ b/scripts/tests/windows-features.ps1 @@ -75,6 +75,7 @@ public static class FeatureWin{ [DllImport("user32.dll")] public static extern bool EnumWindows(EW f,IntPtr l); [DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr h,out uint p); [DllImport("user32.dll")] public static extern bool IsWindowVisible(IntPtr h); + [DllImport("user32.dll")] public static extern bool IsWindow(IntPtr h); [DllImport("user32.dll")] public static extern IntPtr GetWindow(IntPtr h,uint c); [DllImport("user32.dll",CharSet=CharSet.Unicode)] public static extern int GetClassName(IntPtr h,StringBuilder s,int n); [DllImport("user32.dll",CharSet=CharSet.Unicode)] public static extern IntPtr GetProp(IntPtr h,string n); @@ -281,7 +282,11 @@ function Open-Scene($ctx, $state, $Url, $Seed, [string[]]$Extra = @()) { } if ($held -lt 6 -and -not $ctx.Error) { $r = New-Object FeatureWin+R; [FeatureWin]::GetWindowRect($ctx.Hwnd, [ref]$r) | Out-Null - $ctx.Error = "the window did not stay at its off-screen park: it is at $($r.L),$($r.T) $($r.Ri - $r.L)x$($r.B - $r.T), not 9000,1000 $($script:ParkW)x$($script:ParkH)" + # A window that is gone may mean the browser crashed: say whether its processes still run, and + # whether its profile holds a crash report. + $alive = @(Get-MyProcesses $ctx.ExeName $ctx.Profile).Count + $dumps = @(Get-ChildItem (Join-Path $ctx.Profile 'Crashpad\reports') -Filter *.dmp -ErrorAction SilentlyContinue).Count + $ctx.Error = "the window did not stay at its off-screen park: it is at $($r.L),$($r.T) $($r.Ri - $r.L)x$($r.B - $r.T), not 9000,1000 $($script:ParkW)x$($script:ParkH); window alive $([FeatureWin]::IsWindow($ctx.Hwnd)), $alive browser processes, $dumps crash reports" } [FeatureWin]::PostMessage($ctx.Hwnd, 0x86, [IntPtr]1, [IntPtr]0) | Out-Null Start-Sleep 8 $dpi = Get-LayoutDpi $ctx @@ -1730,6 +1735,15 @@ function New-LinkRoot($Name, [string]$Mode, [string]$ExePath) { New-Item -ItemType Directory -Force $config | Out-Null $setup = @{ version = 1; browser = $ExePath; profile = 'Link' } | ConvertTo-Json -Compress [IO.File]::WriteAllText((Join-Path $config 'setup.json'), $setup) + # The signed table the run applied, which a candidate row of the rows workflow is in. + if ($env:RIVET_DATA_ROOT) { + $table = Join-Path $env:RIVET_DATA_ROOT 'Rivet\cache\builds\table.bin' + if (Test-Path $table) { + $builds = Join-Path $root 'Rivet\cache\builds' + New-Item -ItemType Directory -Force $builds | Out-Null + Copy-Item $table (Join-Path $builds 'table.bin') -Force + } + } Add-HeldBrowsers $root $root } @@ -2464,11 +2478,14 @@ function Invoke-FullscreenSidebar($Name, $shots) { $style = [SurfaceWin]::GetLong($ctx.Hwnd, -16) $bare = [IntPtr]([int64]$style -band (-bnot [int64]0x40000)) [SurfaceWin]::SetLong($ctx.Hwnd, -16, $bare) | Out-Null - [FeatureWin]::SetWindowPos($ctx.Hwnd, [IntPtr]::Zero, 0, 0, 1801, 1067, 0x36) | Out-Null + # One pixel wider than the parked window and back, which a runner's small display leaves alone. + $pr = New-Object FeatureWin+R; [FeatureWin]::GetWindowRect($ctx.Hwnd, [ref]$pr) | Out-Null + $pw = $pr.Ri - $pr.L; $ph = $pr.B - $pr.T + [FeatureWin]::SetWindowPos($ctx.Hwnd, [IntPtr]::Zero, 0, 0, $pw + 1, $ph, 0x36) | Out-Null Start-Sleep 4 $full = Get-Capture $ctx (Join-Path $shots 'fullscreen-sidebar-2-full.png') [SurfaceWin]::SetLong($ctx.Hwnd, -16, $style) | Out-Null - [FeatureWin]::SetWindowPos($ctx.Hwnd, [IntPtr]::Zero, 0, 0, 1800, 1067, 0x36) | Out-Null + [FeatureWin]::SetWindowPos($ctx.Hwnd, [IntPtr]::Zero, 0, 0, $pw, $ph, 0x36) | Out-Null Start-Sleep 4 $back = Get-Capture $ctx (Join-Path $shots 'fullscreen-sidebar-3-back.png') $f = Get-PageRegion $full $script:ColourA; $b = Get-PageRegion $back $script:ColourA From dd2286e3dcdfa0b694e10b2cdeadf7550f6748d6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 10:36:47 +0000 Subject: [PATCH 7/9] Publish: develop 66096d4 to release Generated by .github/scripts/release/sync-release.sh. The internal planning documents listed below are kept on develop only: PROJECT.md AGENTS.md docs/INTENT.md docs/RESEARCH.md docs/SPEC.md scripts/tests/appspike --- scripts/tests/windows-features-surface-lib.ps1 | 3 ++- scripts/tests/windows-features.ps1 | 15 ++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/scripts/tests/windows-features-surface-lib.ps1 b/scripts/tests/windows-features-surface-lib.ps1 index c7f3bec..d8387c0 100644 --- a/scripts/tests/windows-features-surface-lib.ps1 +++ b/scripts/tests/windows-features-surface-lib.ps1 @@ -126,7 +126,8 @@ function Test-PanelFloats($Before, $After, [int]$Page, [int]$Panel, [double]$Sca if (Test-Blank $After) { return New-Verdict 'NOT_DRIVEN' 'the capture is blank' } $p0 = Get-PageRegion $Before $Page if ($p0.Width -lt 200) { return New-Verdict 'NOT_DRIVEN' 'the page was not shown before the panel opened' } - # The marker covers the top 40 per cent of the page, so its columns still count as the page. + # The marker covers the top 40 per cent of the page at a quarter of its width, left of a 360 DIP + # docked page on any page wider than 480 DIPs; its columns still count as the page. $y = [int]($p0.Y0 + ($p0.Y1 - $p0.Y0) * 0.2) $m0 = Get-MarkerColumn $Before $y $p0.X0 $p0.X1 if ($m0 -lt 0) { return New-Verdict 'NOT_DRIVEN' "the page's marker was not found before the panel opened" } diff --git a/scripts/tests/windows-features.ps1 b/scripts/tests/windows-features.ps1 index b4eb8ed..d98812c 100644 --- a/scripts/tests/windows-features.ps1 +++ b/scripts/tests/windows-features.ps1 @@ -219,7 +219,7 @@ function Start-Scene($Name, $Feature, $Url) { return $ctx, $state } -# Whether the scene's window is at the off-screen park, 9000,1000 at the park size. +# Whether the scene's window is at the off-screen park, right of every monitor at the park size. # On a CI runner Windows clamps a window to the runner's small display, so there the park holds # when the window is at its place and keeps one size; everywhere else it must also be the park size. # The pixel rows read the window's own client size, so they follow the size it kept. @@ -227,12 +227,17 @@ $script:OnRunner = [bool]$env:GITHUB_ACTIONS # The park's size in pixels. RIVET_TEST_PARK_SIZE ("2880x1800") sets another, so a run at a higher # scale can keep the window as wide in DIPs as a run at a lower one. $script:ParkW = 1800; $script:ParkH = 1067 +# The park's top is level with the primary monitor's top, right of every monitor: a bubble the browser +# fits onto a display then stays by the window's row, which a park below every monitor's band +# could not show. +Add-Type -AssemblyName System.Windows.Forms +$script:ParkY = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds.Y if ($env:RIVET_TEST_PARK_SIZE -match '^(\d+)x(\d+)$') { $script:ParkW = [int]$Matches[1]; $script:ParkH = [int]$Matches[2] } $script:ParkedSize = $null function Test-Parked($ctx) { $r = New-Object FeatureWin+R; [FeatureWin]::GetWindowRect($ctx.Hwnd, [ref]$r) | Out-Null $size = '{0}x{1}' -f ($r.Ri - $r.L), ($r.B - $r.T) - $placed = $r.L -eq 9000 -and $r.T -eq 1000 + $placed = $r.L -eq 9000 -and $r.T -eq $script:ParkY if (-not $script:OnRunner) { return $placed -and $size -eq ('{0}x{1}' -f $script:ParkW, $script:ParkH) } if (-not $placed) { return $false } $stable = $script:ParkedSize -eq $size @@ -277,7 +282,7 @@ function Open-Scene($ctx, $state, $Url, $Seed, [string[]]$Extra = @()) { $held = 0 foreach ($try in 1..60) { if (Test-Parked $ctx) { $held++; if ($held -ge 6) { break } } - else { $held = 0; [FeatureWin]::SetWindowPos($ctx.Hwnd, [IntPtr]::Zero, 9000, 1000, $script:ParkW, $script:ParkH, 0x14) | Out-Null } + else { $held = 0; [FeatureWin]::SetWindowPos($ctx.Hwnd, [IntPtr]::Zero, 9000, $script:ParkY, $script:ParkW, $script:ParkH, 0x14) | Out-Null } Start-Sleep -Milliseconds 250 } if ($held -lt 6 -and -not $ctx.Error) { @@ -286,7 +291,7 @@ function Open-Scene($ctx, $state, $Url, $Seed, [string[]]$Extra = @()) { # whether its profile holds a crash report. $alive = @(Get-MyProcesses $ctx.ExeName $ctx.Profile).Count $dumps = @(Get-ChildItem (Join-Path $ctx.Profile 'Crashpad\reports') -Filter *.dmp -ErrorAction SilentlyContinue).Count - $ctx.Error = "the window did not stay at its off-screen park: it is at $($r.L),$($r.T) $($r.Ri - $r.L)x$($r.B - $r.T), not 9000,1000 $($script:ParkW)x$($script:ParkH); window alive $([FeatureWin]::IsWindow($ctx.Hwnd)), $alive browser processes, $dumps crash reports" + $ctx.Error = "the window did not stay at its off-screen park: it is at $($r.L),$($r.T) $($r.Ri - $r.L)x$($r.B - $r.T), not 9000,$($script:ParkY) $($script:ParkW)x$($script:ParkH); window alive $([FeatureWin]::IsWindow($ctx.Hwnd)), $alive browser processes, $dumps crash reports" } [FeatureWin]::PostMessage($ctx.Hwnd, 0x86, [IntPtr]1, [IntPtr]0) | Out-Null Start-Sleep 8 $dpi = Get-LayoutDpi $ctx @@ -2334,7 +2339,7 @@ foreach ($n in $devNarrow, $devWide) { # A page with a dark marker at half its width over its top 40 per cent, which moves when the page # is laid out narrower and stays when something floats over it. $markPath = Join-Path $pageDir 'page-mark.html' -[IO.File]::WriteAllText($markPath, "page-mark") +[IO.File]::WriteAllText($markPath, "page-mark") $urlMark = 'file:///' + ($markPath -replace '\\', '/') # Opens a scene on `$Url` and returns ctx, state, a first capture and an early verdict when the From 21429e8bfbf2de07e672de74ea548c38f344fa7d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 10:50:54 +0000 Subject: [PATCH 8/9] Publish: develop 420e5ce to release Generated by .github/scripts/release/sync-release.sh. The internal planning documents listed below are kept on develop only: PROJECT.md AGENTS.md docs/INTENT.md docs/RESEARCH.md docs/SPEC.md scripts/tests/appspike --- scripts/tests/windows-features.ps1 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/scripts/tests/windows-features.ps1 b/scripts/tests/windows-features.ps1 index d98812c..348de5a 100644 --- a/scripts/tests/windows-features.ps1 +++ b/scripts/tests/windows-features.ps1 @@ -396,8 +396,13 @@ function Get-AttachFailure($ctx) { # Stops the scene's browser, keeps its trace under the run's `traces` folder and deletes its test # profile, so a long run does not fill the disk. Captures are kept where they were written. function Stop-Scene($ctx) { - Stop-Mine $ctx.ExeName $ctx.Profile - for ($i = 0; $i -lt 20 -and @(Get-MyProcesses $ctx.ExeName $ctx.Profile).Count -gt 0; $i++) { Start-Sleep -Milliseconds 250 } + # A browser can start one more process of the profile while it is being stopped, as a launcher + # handing on a link does, so the stop is repeated until none is left. + for ($i = 0; $i -lt 20; $i++) { + Stop-Mine $ctx.ExeName $ctx.Profile + Start-Sleep -Milliseconds 250 + if (@(Get-MyProcesses $ctx.ExeName $ctx.Profile).Count -eq 0) { break } + } if (-not $ctx.Profile -or -not (Test-Path $ctx.Profile)) { return } $traces = Join-Path $OutDir 'traces' $debugDir = Join-Path $ctx.Profile 'rivet-debug' From 3b3b2cfcffd5ecf6ab5018316895e245fc817c09 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 11:11:43 +0000 Subject: [PATCH 9/9] Publish: develop fa6320f to release Generated by .github/scripts/release/sync-release.sh. The internal planning documents listed below are kept on develop only: PROJECT.md AGENTS.md docs/INTENT.md docs/RESEARCH.md docs/SPEC.md scripts/tests/appspike --- scripts/tests/windows-features.ps1 | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/scripts/tests/windows-features.ps1 b/scripts/tests/windows-features.ps1 index 348de5a..a1b05a7 100644 --- a/scripts/tests/windows-features.ps1 +++ b/scripts/tests/windows-features.ps1 @@ -227,11 +227,15 @@ $script:OnRunner = [bool]$env:GITHUB_ACTIONS # The park's size in pixels. RIVET_TEST_PARK_SIZE ("2880x1800") sets another, so a run at a higher # scale can keep the window as wide in DIPs as a run at a lower one. $script:ParkW = 1800; $script:ParkH = 1067 -# The park's top is level with the primary monitor's top, right of every monitor: a bubble the browser -# fits onto a display then stays by the window's row, which a park below every monitor's band -# could not show. -Add-Type -AssemblyName System.Windows.Forms -$script:ParkY = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds.Y +# The park's top is at 1000. Level with a monitor's band, a window can drop to the system scale instead +# of its monitor's, as on a single 200 percent monitor. A CI runner's system and monitor scale are the +# same, so there the park sits level with the primary monitor, where a bubble the browser fits onto +# the display stays by the window's row. +$script:ParkY = 1000 +if ($script:OnRunner) { + Add-Type -AssemblyName System.Windows.Forms + $script:ParkY = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds.Y +} if ($env:RIVET_TEST_PARK_SIZE -match '^(\d+)x(\d+)$') { $script:ParkW = [int]$Matches[1]; $script:ParkH = [int]$Matches[2] } $script:ParkedSize = $null function Test-Parked($ctx) { @@ -292,9 +296,17 @@ function Open-Scene($ctx, $state, $Url, $Seed, [string[]]$Extra = @()) { $alive = @(Get-MyProcesses $ctx.ExeName $ctx.Profile).Count $dumps = @(Get-ChildItem (Join-Path $ctx.Profile 'Crashpad\reports') -Filter *.dmp -ErrorAction SilentlyContinue).Count $ctx.Error = "the window did not stay at its off-screen park: it is at $($r.L),$($r.T) $($r.Ri - $r.L)x$($r.B - $r.T), not 9000,$($script:ParkY) $($script:ParkW)x$($script:ParkH); window alive $([FeatureWin]::IsWindow($ctx.Hwnd)), $alive browser processes, $dumps crash reports" - } [FeatureWin]::PostMessage($ctx.Hwnd, 0x86, [IntPtr]1, [IntPtr]0) | Out-Null + } + [FeatureWin]::PostMessage($ctx.Hwnd, 0x86, [IntPtr]1, [IntPtr]0) | Out-Null Start-Sleep 8 $dpi = Get-LayoutDpi $ctx + # The window must keep the scale it was first laid out at: a park that moves it to another scale + # would run every row at a scale no person's window has there. + $hex = '{0:x}' -f $ctx.Hwnd.ToInt64() + $scales = @(Read-Log | Where-Object { $_ -match "^layout dpi: window 0x$hex at (\d+)$" } | ForEach-Object { [int]($_ -replace '.* at ', '') }) + if ($scales.Count -ge 2 -and $scales[0] -ne $scales[-1] -and -not $ctx.Error) { + $ctx.Error = "the window's scale changed after it was parked: $($scales[0]) then $($scales[-1])" + } if ($dpi) { $ctx.Dpi = $dpi } elseif (-not $ctx.Error) { $ctx.Error = 'the runtime traced no scale for the window' } # Every scene checks that the attach finished: the browser laid the window out for Rivet's frame. if (-not $ctx.Error) {