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

92 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ✅ 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-29** —
> `screen 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`](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`](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`](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 5–204
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`](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.