REPOSITORY SOURCE

adaptive-quality-acceptance.json

docs/evidence/adaptive-quality-acceptance.json

1{
2  "recordedAt": "2026-10-25T18:10:16.664871+00:00",
3  "baseCommit": "e1e5b18ebaf818a430fc73db5be56f579f86afd8",
4  "scope": "Optional adaptive render resolution, fixed presets, aspect-preserving target caps and existing renderer lifecycle integration; full milestones 0\u201318 remain open.",
5  "fullPlanEstimatePercent": 73,
6  "sourceSha256": {
7    "packages/render/quality.ts": "720665786c2d1daac827e45e15cf8866a75d1558ee27e6bdbfeb386afdc58af7",
8    "packages/render/index.ts": "66796b4cb7319bc9d08483cf7a3c0906bc5643d21e9b3ba0d0c1fca063956bdf",
9    "packages/render-webgpu/index.ts": "38e82eb4092e11abce87da27fee239ef87af2853f8a0dc802c5f9182bdf42dfe",
10    "apps/player/graphics.ts": "684f4b0424a4c484fec7531656a65e45bb0e8469ef65fc678b257db5b285050a",
11    "apps/player/graphics-protocol.ts": "cb908a652b095409c1dd7abba2fdba3ae5d3bc4d66cec9562e4a717d66bb1e07",
12    "apps/player/main.ts": "a9af83a86b01180d50e47e280ee1fe3fcfa11f58cf76d6e7e32bfdcfe1cfa875",
13    "tests/render-quality.test.ts": "da2779f3f43ee7d4f8dea0cf1157eb392c3172e17b49e4aa636b7894a81145e7",
14    "tests/browser/quality.spec.ts": "4ffeb617245b45a497522c5e3f82357ec9ec75bd986377086ad28f1d287887d3",
15    "tests/browser/player.spec.ts": "b76b163cd2bf3299263c66162f6858d16796da440ee114bfe4a888ee0a98a1bf",
16    "tests/browser/probe.spec.ts": "37b1d298a1257470648d062e75464a2c10f416546cdf945543d06abdb5484689",
17    "package.json": "389a2644a1d8854da4ed1b0f9a21fec177dfccfb8ce13e63581bc48d593aeb97"
18  },
19  "browserSourceBeforeFinalInputGuard": {
20    "packages/render/quality.ts": "4fea17c65ede9edbe5fe39efa0c5075d0f40861c2613deb79162eba70620502b",
21    "tests/render-quality.test.ts": "ba464d77be285defefd25d46749e08542a22de968d917eb843b2a6eee79139e7"
22  },
23  "finalGuardNote": "After the five browser cases passed, added rejection of viewport dimensions above 16384, matching the existing setViewport contract and preventing overflow from oversized finite values. Added headless assertions and reran the full suite/type checks. Valid viewport sizing and runtime policy were unchanged.",
24  "environment": {
25    "node": "22.23.4",
26    "browser": "Chromium 141 headless shell",
27    "playwright": "1.56.1",
28    "graphics": "SwiftShader WebGPU/Vulkan on Linux",
29    "viewports": [
30      [
31        800,
32        500
33      ],
34      [
35        3200,
36        900
37      ]
38    ],
39    "peerViewport": [
40      480,
41      320
42    ]
43  },
44  "checks": {
45    "typeAndImports": {
46      "result": "passed; 131 package source files",
47      "log": "adaptive-quality-check.log"
48    },
49    "headless": {
50      "total": 726,
51      "pass": 670,
52      "skip": 56,
53      "fail": 0,
54      "log": "adaptive-quality-headless.tap"
55    },
56    "browser": {
57      "pass": 5,
58      "fail": 0,
59      "report": "adaptive-quality-browser-reports.json",
60      "log": "adaptive-quality-browser.log"
61    },
62    "measurements": "adaptive-quality-measured.json"
63  },
64  "verified": [
65    "High remains default; Automatic/High/Balanced/Performance preferences restore from bounded versioned local settings",
66    "Automatic uses new completed-frame observations, bounded history and sustained pressure/headroom; brief spikes and valleys do not jump tiers",
67    "Pauses, stale notifications, long suspension, invalid timing data and counter replacement clear samples; fixed tiers do not adapt",
68    "Fast frame rates retain time coverage; sustained two-frame-per-second pressure still lowers a tier",
69    "Both worker and main renderers lower an 800\u00d7500 target to 640\u00d7400 after an added 80 ms completion delay",
70    "Paused pressure does not lower a second tier; High stays fixed during continued pressure; Performance reaches 480\u00d7300",
71    "All tested transitions/reloads/device replacements retain 53 buffers and 4 textures; estimated frame targets decrease from 21577216 to 18505216 bytes",
72    "A worker-rendered shared traveler retains identity across quality changes, reload and actual GPU device loss while another traveler remains connected",
73    "Main fallback allocates an actual 2560\u00d7720 target for a 3200\u00d7900 viewport",
74    "Existing single-pending-frame/backpressure, independent render-worker and complete native renderer recovery/resize/shader/resource probe journeys pass"
75  ],
76  "developmentFindings": [
77    "Review added two rate regressions that failed: fast samples filled the bounded ring before it covered the minimum time span, and the minimum sample count excluded sustained two-frame-per-second rendering. Added a 16 ms sampling interval and reduced the observation minimum while retaining the same time-span, pressure, headroom and settling thresholds. Both regressions now pass.",
78    "Final sizing review added the same 16384-axis bound used by the existing viewport admission contract; oversized finite input cannot overflow intermediate sizing arithmetic."
79  ],
80  "visuals": [
81    "adaptive-quality-settings.png",
82    "adaptive-quality-worker.png",
83    "adaptive-quality-main.png"
84  ],
85  "limitations": [
86    "Queue notifications include scheduling; this is not GPU timestamp or compositor timing",
87    "Artificial delay proves response and ownership, not a production FPS gain; physical GPU tiers, mobile thermal behavior and long sessions remain unqualified",
88    "Only resolution adapts; shadow/effect quality and general device-tier policy remain open",
89    "Docker/Coolify execution and remote CI not run for this increment",
90    "No numbered milestone closed; character/arrival art remains in final polish; no merge or deployment"
91  ]
92}
93