Skip to content

Commit c4860fc

Browse files
committed
fix(site): qualify renderer failures and fractional canvas sizing
Record missing renderer imports through the existing scene error contract. Measure DPR against the actual fractional canvas CSS bounds, retain the 1.5 DPR and one-million-pixel limits, and verify viewport and camera geometry during retina resizing. Validation: complete Debug solution build with -warnaserror (zero warnings/errors); solution formatting and focused final formatter verification; 7/7 real Chrome content/browser tests with coverage gate; governance, source closure and git diff checks. The preceding Linux run passed 507/507 analyzer tests and 134/136 Website tests with all critical coverage thresholds; exact-source Linux Website and Pages delivery remain pending for this checkpoint.
1 parent ce333ae commit c4860fc

5 files changed

Lines changed: 19 additions & 7 deletions

File tree

‎docs/implementation/status.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"updated": "2026-10-25",
2+
"updated": "2026-10-27",
33
"product": "KeyLoad development preview. Not production ready.",
44
"concept": "Orleans owns all clustering and activation scaling. The API reaches one grain per connected client, logical database/partition grains, storage owners and bounded result aggregation. Shared volumes require one open owner per physical partition without copies; isolated volumes use typed Orleans calls between owners. Shared-volume ownership and distributed partition-query execution are not yet qualified.",
55
"qualification": {
@@ -9,7 +9,7 @@
99
"aspireClusterSdkMcpTests": "in progress: KeyLoad.ClusterTests uses descriptive capability groups and lane IDs with the unchanged two-cluster runner bound. SQL TCP or TLS extends standard server addresses without replacing Aspire public HTTPS. A real three-node TCP case passed with API authentication and exact prepared/unprepared Npgsql queries. The original Int16 and Decimal SQL whole flows and explicit TCP pass locally, 3/3, including policy repair, original receipt replay and two cold cuts on TLS. SQL TLS uses the standard Aspire/Kestrel certificate; the separate certificate loader, test CA/PFX generator and custom root trust were removed. Original strong-session failover passed locally after observing Orleans membership following abrupt kill and rejoin, including policy repair, replay and two cold cuts. Source and compiled discovery agree on 196 cluster classes, 282 methods and 359 cases after adding five previously omitted qualified-attribute SQL classes to CI; this proves discovery, not successful execution. Full current local and exact-source Linux cluster execution, fault/endurance and coverage remain distinct required gates.",
1010
"coverage": "open: original Linux analyzer measurements exist; current source mapping and required numeric gates are not qualified. Functional coverage remains open.",
1111
"adminConsole": "open: Blazor Server and Fluent UI components replace the static JavaScript application; Playwright replaces the custom CDP client. Focused browser, complete suite and exact-source Linux qualification must be recorded separately.",
12-
"performance": "Website original-session intake passed on Linux at e6b771ee8 (run 40415206997), retaining 24 successful sessions from failed Benchmarks run 40364432422. The complete Website suite passed 120/136 cases; Pages remained blocked by stale asset references, browser module loading, public-copy assertions and critical coverage. The current repair batch passes the focused WebsiteTests build with -warnaserror, scoped formatting, nine Node contract scenarios, source closure and an actual local browser check against the Linux-verified aggregate: eight one-node and two three-node throughput rows, with missing KeyLoad values null. The combined canonical Debug solution build passed all 21 projects with zero warnings/errors, and full formatting verification passed. Linux Website coverage/browser/Pages qualification remains required for this batch. The owner approved recorded operation timings despite incomplete or heterogeneous runner telemetry; retain raw qualification flags, label incomplete telemetry and leave absent metrics null. These figures do not establish a controlled hardware comparison. The last verified live publication remains content-only Website run 40407730385 at f9789234d.",
12+
"performance": "Website run 40427938347 at 49b900a5c authenticated 24 original successful sessions from failed Benchmarks run 40364432422. Analyzer tests passed 507/507; Website tests passed 134/136, with V8 coverage at 89% lines and 84% branches and all critical thresholds passing. Pages remained blocked by the missing-renderer error state and an integer-rounded CSS measurement in the scene DPR assertion. The current browser repair passes the complete Debug solution build with -warnaserror, formatting verification and seven local content/browser cases, including an actual renderer-module HTTP 404, desktop/mobile lifecycle, retina resizing and the unchanged coverage gate. Exact-source Linux measured Website qualification and Pages publication remain required. The owner approved recorded timings despite incomplete or heterogeneous resource telemetry; preserve original flags, label incomplete telemetry and display missing values as an em dash. These timings do not establish a controlled hardware comparison. The last verified live publication remains content-only Website run 40407730385 at f9789234d.",
1313
"powerLossDurability": "Not proven; process-kill tests do not prove it.",
1414
"endurance": "open",
1515
"sharedVolumeStorage": "open: lazy single-owner sessions are in source; execution runtime, owner loss/reopen and deployed filesystem locking/flush qualification remain required",

‎site/Features/BenchmarkComparisons/bootstrap.mjs‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { IDS, SELECTORS, CONFIG, TEXT } from './contracts.mjs';
2+
import { SCENE as RENDERER } from './scene-geometry.mjs';
23

34
const EVENTS = Object.freeze({ hide: 'pagehide', show: 'pageshow', click: 'click', change: 'change' });
45
const SCENE = Object.freeze({ module: './cluster-scene.mjs', unavailable: 'Static architectural illustration', delay: 100,
@@ -33,6 +34,8 @@ async function startScene(token) {
3334
else scene = instance;
3435
} catch {
3536
if (token !== generation) return;
37+
host.dataset[RENDERER.dataset.state] = RENDERER.state.error;
38+
host.dataset[RENDERER.dataset.frame] = RENDERER.frame.error;
3639
host.querySelector(SELECTORS.poster)?.removeAttribute(SCENE.hidden);
3740
const status = host.querySelector(SELECTORS.sceneStatus);
3841
if (status) status.textContent = SCENE.unavailable;

‎tests/KeyLoad.WebsiteTests/Assertions/SiteBrowser/SiteBrowserVectorAssetAssertions.cs‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ await Assert.That(current.GetProperty(SiteVectorAssetTokens.TransformField).GetS
7878

7979
public static async Task AssertRetinaResizeAsync(SiteBrowserCdpClient cdp, CancellationToken cancellationToken)
8080
{
81-
var previous = await ReadMarkAsync(cdp, cancellationToken);
8281
foreach (var width in SiteBrowserUiTokens.ViewportWidths)
8382
{
8483
await cdp.CommandAsync(SiteBrowserTokens.SetDeviceMetrics, new Dictionary<string, object?>
@@ -93,9 +92,9 @@ public static async Task AssertRetinaResizeAsync(SiteBrowserCdpClient cdp, Cance
9392
await Task.Delay(SiteExecutionConfiguration.Options.Value.SceneSettleWait, TimeProvider.System, cancellationToken);
9493
await AssertReadyMarkAsync(cdp, cancellationToken);
9594
var current = await ReadMarkAsync(cdp, cancellationToken);
96-
await Assert.That(current.GetProperty(SiteVectorAssetTokens.WidthField).GetDouble())
97-
.IsNotEqualTo(previous.GetProperty(SiteVectorAssetTokens.WidthField).GetDouble());
98-
previous = current;
95+
await Assert.That(current.GetProperty(SiteVectorAssetTokens.ViewportWidthField).GetInt32()).IsEqualTo(width);
96+
await Assert.That(current.GetProperty(SiteVectorAssetTokens.DeviceRatioField).GetDouble())
97+
.IsEqualTo(SiteVectorAssetTokens.RetinaScale);
9998
}
10099
}
101100

@@ -108,6 +107,8 @@ await Assert.That(state.GetProperty(SiteBrowserUiTokens.BufferPixelsField).GetIn
108107
.IsBetween(SiteTokens.One, SiteBrowserUiTokens.RendererPixelLimit);
109108
await Assert.That(state.GetProperty(SiteBrowserUiTokens.PixelRatioField).GetDouble())
110109
.IsLessThanOrEqualTo(SiteBrowserUiTokens.RendererPixelRatioLimit);
110+
await Assert.That(Math.Abs(state.GetProperty(SiteVectorAssetTokens.CameraAspectField).GetDouble()
111+
- state.GetProperty(SiteVectorAssetTokens.CanvasAspectField).GetDouble())).IsLessThanOrEqualTo(0.000000001);
111112
await Assert.That(state.GetProperty(SiteBrowserUiTokens.TrianglesField).GetInt32())
112113
.IsBetween(SiteTokens.One, SiteBrowserUiTokens.RendererTriangleLimit);
113114
await Assert.That(state.GetProperty(SiteBrowserUiTokens.DrawCallsField).GetInt32())

‎tests/KeyLoad.WebsiteTests/Cases/SiteContent/SiteContentBrowserTests.cs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ await Assert.That(state is SiteBrowserUiTokens.StateReady or SiteBrowserUiTokens
145145
await Assert.That(snapshot.GetProperty(SiteBrowserUiTokens.CanvasCountField).GetInt32())
146146
.IsEqualTo(SiteBrowserTokens.One);
147147
await SiteBrowserVectorAssetAssertions.AssertReadyMarkAsync(cdp, token);
148+
await SiteBrowserVectorAssetAssertions.AssertRetinaResizeAsync(cdp, token);
148149
}
149150
else
150151
{

‎tests/KeyLoad.WebsiteTests/Contracts/SiteVectorAssetTokens.cs‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ internal static class SiteVectorAssetTokens
2323
rect.left >= bounds.left && rect.right <= bounds.right && rect.top >= bounds.top && rect.bottom <= bounds.bottom,
2424
bufferPixels: Number(host?.dataset.bufferPixels ?? 0), drawCalls: Number(host?.dataset.drawCalls ?? 0),
2525
triangles: Number(host?.dataset.triangles ?? 0),
26-
pixelRatio: host && canvas ? Math.max(canvas.width / host.clientWidth, canvas.height / host.clientHeight) : 0 };
26+
viewportWidth: window.innerWidth, deviceRatio: window.devicePixelRatio,
27+
canvasAspect: rect?.width > 0 && rect?.height > 0 ? rect.width / rect.height : 0,
28+
cameraAspect: Number(host?.dataset.scenePose?.split(',')[0] ?? 0),
29+
pixelRatio: rect?.width > 0 && rect?.height > 0 ? Math.max(canvas.width / rect.width, canvas.height / rect.height) : 0 };
2730
})()
2831
""";
2932
public const string PosterStateScript = """
@@ -55,6 +58,10 @@ internal static class SiteVectorAssetTokens
5558
public const string MarkCountField = "markCount";
5659
public const string WidthField = "width";
5760
public const string HeightField = "height";
61+
public const string ViewportWidthField = "viewportWidth";
62+
public const string DeviceRatioField = "deviceRatio";
63+
public const string CanvasAspectField = "canvasAspect";
64+
public const string CameraAspectField = "cameraAspect";
5865
public const string HiddenVisibility = "hidden";
5966
public const int RetinaScale = 2;
6067
}

0 commit comments

Comments
 (0)