From 3dfedd152bcde3547717b40efa262425ae4871ea Mon Sep 17 00:00:00 2001 From: sylph-decoder Date: Wed, 2 Sep 2026 16:11:26 +0000 Subject: [PATCH] handoff: Canary applies no gamma but does resample; the vertex stream is the cleaner oracle Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t --- docs/port/HANDOFF.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/docs/port/HANDOFF.md b/docs/port/HANDOFF.md index f8eaf184..04a7c18a 100644 --- a/docs/port/HANDOFF.md +++ b/docs/port/HANDOFF.md @@ -46,6 +46,48 @@ silent. A blank output is a failure, not an empty ask list. +## ✅ 2026-09-02 (second) — **Canary applies NO gamma, but it DOES resample. Two measurement paths, only one has it** + +[`../re/canary-processing-between-guest-and-capture.md`](../re/canary-processing-between-guest-and-capture.md) + +Play-test question 3, from Canary's own source. + +**Gamma: none, on either side of the boundary.** `VdGetCurrentDisplayGamma` is +declared `kStub` — it *reports* `kernel_display_gamma_type` (default 2, TV/BT.709) +so the guest's D3D can build a ramp, and transforms nothing itself. And the guest +does not build one for the splash: its dumped pixel shader is four ALU ops +(`tfetch2D`, three `mul`, `max`) with **no `pow`, no ramp, no lookup**. + +**Geometry: yes.** `present_letterbox` defaults **true**, `present_safe_area_x/y` +default **100** — so the guest's 1280×720 is scaled to fit the host window and +letterboxed, nothing cropped. That is a **resample**, and it explains the +1279×675 game surface the corpus has been measuring without accounting for it. + +### 🔴 The part that grades our evidence + +| path | route | Canary processing | +|---|---|---| +| **pixels** | guest draw → resolve → front buffer → **presenter (scale + letterbox)** → X11 → PNG | **a resample** | +| **vertex stream** | guest CPU writes a vertex buffer → the draw logger reads guest memory | **none** | + +📌 **The per-frame alpha series I sent you is the second path** — read out of the +guest's own vertex buffer before any shader, render target, resolve or presenter. +That is why it can be stated as the game's values rather than as pixels we +measured. + +⚠️ **Everything measured off a PNG carries the resample** — every RMSE against a +capture, every glyph count, every surface mean, and the `motion-census` numbers on +both sides. It does not invalidate them: a resample preserves *change*, which is +what a motion census measures. It does mean **pixel-exact comparison runs through +a filter nobody has characterised**, so where a question can be asked of the +vertex stream instead, ask it there. + +❔ **Not measured:** the resample's actual filter. I read the cvars that say +scaling happens, not the kernel that does it. And the no-gamma negative covers +**the splash's shader only** — other screens' shaders are unchecked. + +--- + ## 🔴🔴 2026-09-02 — **THE GAME LERPS EVERY FRAME. And its splash is ALSO mostly frozen — your 3.2 s hold is CORRECT** [`../re/splash-interpolates-every-frame.md`](../re/splash-interpolates-every-frame.md)