method: an insensitive observable fails twice, and the second way sends you hunting

The port checked my pivot claim rather than taking it and found the nuance: the
sprite is odd-width, 399, so its true centre is 199.5 against a declared pivot of
200. Half a pixel, far inside the 0.70 and 0.48 px agreement, so it changes
nothing -- but "the pivot IS the centre" is the kind of sentence somebody leans on
for a sub-pixel claim later, so the page now says it is the centre rounded up.

And records the general form of the two bugs this exchange produced, which share
one cause. First, a leaf-composition rule was checked against alpha, which moves
about 0.3 levels per keyframe unit, so a one-keyframe association error barely
shifted it and the rule looked confirmed -- while the same span moved x by
1560 px. Second, fitting t from that same alpha manufactured an 11.5 px position
residual that did not exist and sent the consumer hunting a pivot rule to explain
it, because one byte of alpha quantisation is worth 1.5 to 1.9 keyframe units.

Solve on the fastest-moving field and check the slow one, never the reverse. The
second failure is the more expensive: failing to falsify leaves you falsely
reassured, but inventing a residual sends you looking for a mechanism.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QsEPXWVaEpyfudtR6re1Pd
This commit is contained in:
sylph-decoder
2026-08-29 18:25:52 +00:00
parent f0fc4afd10
commit 83da9bd1ea
2 changed files with 21 additions and 2 deletions

View File

@@ -58,6 +58,19 @@ agent's loop prompt, i.e. nowhere durable. See [`README.md`](README.md) for the
* **My own last-turn result is a hypothesis too.**
* **A global partition can understate a per-owner one.**
* **A residual is measured against a population — name it.**
* 🔴 **An insensitive observable fails TWICE, and the second way is worse.**
Two bugs in one exchange, one cause:
1. A leaf-composition rule was checked against **alpha**, which moves ~0.3
levels per keyframe unit — so a one-keyframe association error barely
shifted it and the rule **looked confirmed**. The same span moved `x` by
**1 560 px**.
2. Fitting `t` from that same alpha then **manufactured an 11.5 px position
residual that did not exist**, and sent the consumer hunting a
pivot/rotation mechanism to explain it. One byte of alpha quantisation is
worth 1.51.9 keyframe units, i.e. 68 px of sweep.
**Solve on the fastest-moving field; check the slow one. Never the reverse.**
⚠️ The second failure is the more expensive: not-falsifying leaves you falsely
reassured, but **inventing a residual sends you looking for a mechanism**.
* ⚠️ **A stated reach is a boundary, not a hedge — do not extrapolate past it.**
`ui-render-tone-curve.md` fitted γ ≈ 1.341.49 on **dark flat patches** and
wrote "nothing constrains midtones or highlights". Used above that range the

View File

@@ -140,8 +140,14 @@ At the position-derived **t = 357.7**, every observable lands:
**Sub-pixel on both positions, inside one byte on both alphas** — while the
parent's alpha is **0** throughout. And the leaf **pivot is (200, 90)** against a
399×180 sprite, i.e. the pivot *is* the sprite centre, so rotation displaces the
centre by nothing. There is no pivot/rotation correction to find.
399×180 sprite, so rotation displaces the centre by essentially nothing and there
is no pivot/rotation correction to find.
⚠️ **To half a pixel, not exactly** (the port's check, and worth keeping): the
sprite is **odd-width**, so its true centre is **199.5**, and the declared pivot
is 200. The 0.5 px offset is far inside the 0.70 / 0.48 px agreement above and
changes nothing here — **but do not lean on "the pivot IS the centre" for a
sub-pixel claim.** It is the centre rounded up.
⚠️ **The methodological point is the same one this exchange started with,
inverted.** Earlier, a rule *looked confirmed* because it was checked against