Files
Sylpheed/docs/re/structures/title-residual-tone-vs-geometry.md
sylph-decoder 6f4ba93c5c re: the title's light arc is five transient flashes, not a tone or rotation error
Records the settle-time decode, and corrects two claims it overturns.

docs/re/structures/ui-settle-time.md is the finding: a settled screen is one
instant every element is posed at, the disc names it (the midpoint of the
longest keyframe-free interval), and the title's arc closes from 33.22 to
11.79 with the clipped-pixel count landing on the console's 1459 within 0.5%.
Includes the disc-wide reach -- only 30% of bundles have a window wide enough
to trust -- and a three-way figure.

Withdrawn in ui-rotation-implemented.md:

  * "Flat. No minimum." was not a property of rotation. `at` posed LEAVES ONLY,
    so the scan moved the light sweeps and never touched the top-level flashes.
  * "our renderer does not draw ptlogo1/ptlogo2 at all" is wrong. Both are
    drawn; the four elements the diagnostic named are kind-0x4 ghosts sharing
    their template's name. Hiding the real ones makes the error WORSE by
    +5.20 and +7.47.
  * Its 10.92 baseline is not reproducible -- 14.07 at its own pre-change tag
    and 14.07 today -- so the "1.7% better" verdict rests on an unrecorded
    recipe. Flagged in title-residual-tone-vs-geometry.md too.

METHOD.md gains two traps: a shared CARGO_TARGET_DIR makes a `git worktree`
build silently replace the binary you run next (it cost three renders here,
caught only because a missing flag was a hard error rather than a wrong
number); and an aggregate computed per-element is not a state of the system.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QsEPXWVaEpyfudtR6re1Pd
2026-08-29 19:29:12 +00:00

4.2 KiB
Raw Blame History

At least two thirds of the title's disagreement is GEOMETRY, not tone

⚠️ The 10.92 title baseline here could not be reproduced on 2026-08-29screen render --build 4 --black against the same capture gives 14.07 both at formats-pin-2026-08-29c and today. The ratio this document argues for may well survive; the absolute is in doubt. Separately, part of the title's residual is now known to be neither tone nor rotation but rest() posing five transient flashes at their peaks — ui-settle-time.md closes the light-arc band from 33.22 to 11.79.

Classification: measured, on committed captures. Answers a question the pending rotation decision needs: how much would drawing the rotation actually buy?

Two separate effects are known to make our renders differ from the console:

  • the tone curve — the console renders midtones brighter than we do (ui-render-tone-curve.md), and its single-exponent model is refuted above render ≈ 40;
  • the missing rotation — our blit draws axis-aligned rectangles, so the title's two tilted light sweeps land as upright bars (ui-keyframe-rotation.md).

They are confounded in any whole-frame number. This separates them.

Method, and why the split is an upper bound on tone

A per-level lookup table fitted on a screen is the most general tone model there is: it maps every render level to whatever capture level minimises the error, with no functional form assumed. Whatever such a LUT cannot close is, by construction, not a per-pixel-level effect — it is spatial.

So fitting a LUT on the screen itself and measuring what remains gives an upper bound on the tone share and a lower bound on the geometry share.

The positive control

The method must be able to close a residual that really is tone. On the main menu — where the port measures only 0.06 % of pixels differing, so geometry is essentially right — it does:

mean abs difference closed
main menu, uncorrected 9.26
main menu + LUT fitted on the main menu 2.75 70.3 %

The instrument works: a tone-dominated residual collapses by 70 %.

The result

mean abs difference closed
title, uncorrected 10.92
title + LUT fitted on the title 7.42 32.0 %

🔴 At most 32 % of the title's disagreement is a tone effect, so at least 68 % is spatial — content in the wrong place. That is where the rotation lives, and it makes the rotation the dominant term by roughly two to one.

⚠️ The same-screen LUT is fitted, so 32 % is generous to tone. The true tone share is smaller and the geometry share larger.

🔴 And a claim this refutes: there is no single transferable tone curve

Fitting on one screen and applying to the other:

closed
main menu + LUT fitted on the title +29.7 %
title + LUT fitted on the main menu 24.0 %

The menu's curve makes the title worse. A curve fitted on a dark, flat screen is unconstrained at the bright end — the menu's populated range is levels 5204 with few bright pixels — and extrapolating it onto the title's planet and wordmark actively harms.

⚠️ So "the tone curve" is not one thing that can be measured once and applied. This extends ui-render-tone-curve.md's refutation of the single exponent: even a full per-level LUT fails to transfer between screens. A consumer must not carry a global tone correction.

Reach

  • Two screens, one capture each; the title capture is the plate-free frame and our render is at rest, so they are the same screen but not the same instant — a looser pairing than the port's posed comparison, which is why the absolute numbers here (10.92) are larger than its 1.81 % of pixels. ⚠️ The ratio is what this page claims, not the absolute level.
  • Our render draws the sweeps' parent record only — the pre-leaf-fix state — so the geometry share measured here includes both the missing rotation and the missing leaf placement. Both are closed by the same decision.