re: the sweep IS drawn on the JP title -- and my gate was phase-locking the shutter

The occlusion hypothesis is refuted: build 7 draws the same three ROT strips at
higher alpha than English, so there was never an absence to explain.

The 0.32-vs-11.9 tension that motivated it was an artefact of my own instrument.
Both JP captures were shuttered on the plate pulse, and the plate's pulse is part
of the animation -- so the gate synchronises the shutter to the animation's phase.
Measured at the shutter instant, the sweep sits 25-26 px apart across two runs in
different locales and different sessions: 1.6 % of a ~1600 px traverse.

So the 0.32 I recorded as between-session capture noise measures my trigger's
repeatability, and I read it as evidence the title is still when it is evidence
the gate works. The era adjudication is unaffected -- margin 16.72 clears even the
un-locked 11.9 -- and unaffected for the reason that file already gave: correlated
noise cancels in a margin.

Refutation attempt on sylpheed-port's positional-mechanism rejection: FAILED, the
claim stands. Its residual sits inside lit logos, and the logo ROI is
byte-identical across five differently-phased frames in two sessions.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
This commit is contained in:
sylph-decoder
2026-08-30 19:52:15 +00:00
parent 1ef6896f8e
commit c5d685ba15
9 changed files with 288 additions and 0 deletions

View File

@@ -103,6 +103,27 @@ messages. Detail and data:
[`data/title-sweep-drawn-at-rest.txt`](../re/data/title-sweep-drawn-at-rest.txt),
[`data/ptloop-leaf-extent.txt`](../re/data/ptloop-leaf-extent.txt).
🔴 **UPDATE 2026-08-30 — one number you may have taken from me is not a noise
floor.** If anything of yours cites **RMSE 0.32** as *between-session capture
noise* in the title's era box, drop it. Both captures behind it were shuttered on
the plate pulse, and the plate's pulse is part of the animation, so the gate
**phase-locks the shutter**: measured, the sweep sits 2526 px apart across two
runs in different locales and different sessions — 1.6 % of a ~1600 px traverse.
0.32 measures my trigger's repeatability. The honest figure at an arbitrary phase
is **11.9**. ✅ **Your era adjudication is unaffected** — its margin is 16.72,
which clears even 11.9 — and it is unaffected *for the reason that file already
gave*: correlated noise moves both candidates together and cancels in a margin.
Prefer margins to absolute scores wherever the shutter is gated.
[`structures/plate-pulse-phase-lock.md`](../re/structures/plate-pulse-phase-lock.md)
**And the leaves ARE drawn on the JP title** — same three ROT strips, same
dimensions, at *higher* alpha than English (180/188/194 vs 160/168/166). The
occlusion idea I floated is dead.
[`data/title-sweep-jp-draw-capture.txt`](../re/data/title-sweep-jp-draw-capture.txt)
⚠️ Do not take the strips' ±7.1 px/frame from that log as a rate — every fit
fails the linearity gate (rms ~30 px, residual sign-changes 2/81); it is the
chord of an arc.
**The game draws `pteff03` / `pteff03a` on a settled title, and they free-run.**
A draw capture of the settled title, plate-pulse gated, shows two quads taller
than the screen in every one of 132 frames, sweeping in opposite directions. So a

View File

@@ -182,4 +182,5 @@ files, which is how the same ground got covered twice.
| [`structures/ui-forced-backdrop.md`](structures/ui-forced-backdrop.md) *(colour census + self-refutation)* | What colour a keyless element is, and which forced verdicts the argument actually supports | ✅ **decoded, disc-wide**: every full-screen `*eff00*` **primitive** is **pure black** at its various alphas (`ff000000`, `7f000000`, `40000000`, `b2000000`, `cc000000`, `d4000000`, `00000000`) — exactly an alpha-over dim or fade, and an *additive* black quad would be a no-op nobody would author. The **only** non-black primitive on the disc is `pbafc.prm`, RGB `00e8e0` cyan at alphas to `ff`, and it is **844×600, not full-screen**, so outside the backdrop rule's geometry guard — ❔ it is now the sole additive candidate. 🔴 **Self-refutation: of the 80 forced-first instances only 42 are `.prm`; 38 are `.tbm` carrying fade `ffffffff`.** A *solid* white quad painted first would make the screen white and no screen is white, so a `.tbm` is a white **modulation on a texture** — and element alpha does not establish its coverage. That is the `.t32` error one extension further out: I had fixed the symptom (`el.sprite.is_some()`) not the cause, **an element's alpha is not its texture's opacity, and only an untextured primitive makes the two the same fact**. So 42 verdicts stay **decoded**, 38 drop to 🟡 (still almost certainly right — all named `*base*`, full-screen, and `pfbase.tbm`'s first position is *measured* — but on a name-and-role argument this page elsewhere calls the weaker kind). ⚠️ Code deliberately unchanged: restricting to `.prm` would send eleven screens' backgrounds back to last, the blank-screen bug the rule fixed. Split pinned by a test |
| [`structures/ui-prm-blend-mode.md`](structures/ui-prm-blend-mode.md) | Whether a primitive blends additively or alpha-over | ❔ **undecodable, with reach** — but the consequence is closed. Looked in **the bundle** (no field: the declaration words are constant and a primitive has no RATC child at all), **the colour census** (every full-screen `*eff00*` primitive is **pure black**; the only non-black primitive on the disc is `pbafc.prm`, cyan `00e8e0`), **the occlusion constraint** (inapplicable — `pbafc.prm` strobes 255/124 every 2 units, travels, and is scaled **2 %×3 %**, so it draws ~**17×18 px**, not its declared 844×600), and **the oracle** (`GP_READY_ROOM` is a recorded no-go and gameplay needs the Ⓐ that faults the guest). ✅ **Why it stopped mattering:** for a *black* quad the hypotheses differ only in whether it hides what is beneath — drawn **first** it is correct under **both**, drawn **last** only under additive. So `forced_backdrop`'s verdict is robust to the open question, and the port's original "layerless sorts last" was wrong under alpha-over and merely pointless under additive. ⚠️ This is not evidence *for* alpha-over. 🔴 The investigation found `forced_backdrop` judged coverage from the **pivot alone**, ignoring scale; checked first, **all 80 forced instances are at 100 %**, so no verdict moved and the added guard is defensive |
| [`structures/title-a-press-fault.md`](structures/title-a-press-fault.md) | Why a single Ⓐ on the title faults the guest — the blocker on all menu-side dynamic RE | ✅ **SOLVED 2026-08-30, and it is the emulator, not the game.** Xenia returns `X_ERROR_SUCCESS` with a *zeroed* keystroke on every `XamInputGetKeystrokeEx` while a XAM dialog is up (`xam_input.cc:197`, upstream); the game's pump is an **unbounded** `while (GetKeystrokeEx()==SUCCESS) queue.push_back()`, so it queued **8 388 608** empty keystrokes, grew its vector to 64 MB, asked for 128 MB, got a failed allocation back **unchecked** and copied off the top of the guest thread stack. ✅ **The number is the argument**: the Canary counter reports **8 388 601** swallowed calls at the last report before the crash, the dump's `r29` says the vector held **8 388 608** — two independent instruments, 7 apart, inside the 600-call reporting granularity. No new boot: the failing run's 326 MB log was still on disk. 🔴 **RETRACTED — "`r9` is a wild pointer above 4 GB"**. Xenia prints `si_addr`, a *host* address, and the guest is mapped at `0x100000000`: `0x1701D0000 0x100000000 = 0x701D0000`, which **is** `r9` in the dump — an ordinary guest heap address on an uncommitted page. Subtract `0x100000000` from every `Access Violation … at 0x1________` before reading it. ✅ **Decoded code path**, image-checked with **0 mismatches** over 586 instructions: `sub_824574C0` the input-manager singleton at `0x828F3888`, `sub_82457038` the keystroke pump, `sub_82457780` its `vector<X_INPUT_KEYSTROKE>` insert-with-grow. ✅ **It explains the earlier successes**: whether a XAM dialog is up is *emulator* state, so "reproduced 4/4" and "Q4/Q5 pressed Ⓐ fine" were both always true. 🟡 **Which** dialog is still open — `XamShowDeviceSelectorUI` is ruled out (`storage_selection_dialog = false` takes the headless path), `XamShowSigninUI` / `XamShowMessageBoxUIEx` are not; the settling experiment is one log line per `is_xam_dialog_present_.store(true)` site, not another blind boot. 🟡 Three untried routes out: dismiss the dialog, `--headless`, or return `X_ERROR_EMPTY` from the swallow. ✅ `frame_clock.sh`'s 300 MB guard killed the run as designed — keep it |
| [`structures/plate-pulse-phase-lock.md`](structures/plate-pulse-phase-lock.md) | Does gating on the plate pulse bias what a title capture can show? | ✅ **measured — it PHASE-LOCKS the shutter.** The plate's pulse is part of the animation, so `wait_plate_pulse.py` does not only wait for settling, it synchronises the shutter to the animation's phase: at the shutter instant the sweep strips sit **2526 px apart across two runs in different locales and different sessions****1.6 %** of a ~1600 px traverse. 🔴 **Consequence: the RMSE 0.32 recorded as "between-session capture noise" is a lower bound produced by the instrument, not a property of the game**; the honest figure at an arbitrary phase is **11.9**, a factor of 37, and I had read 0.32 as evidence the JP title is still when it is evidence the gate works. ✅ **The era adjudication survives** — margin **16.72** clears even 11.9 — and survives *for the reason its own file gave*: correlated noise moves both candidates together and cancels in a margin, so prefer margins to absolute scores under a gated shutter. ✅ The within-run at-rest result also survives (five frames ~1.5 s apart are not gated individually). ⚠️ Reach: this shows the lock, not its mechanism — both runs boot the same ISO from the same state, so a deterministic boot could produce it without the gate; **two runs deliberately shuttered at gate + k frames would separate those** and were not run |
| [`structures/plate-pulse-measured.md`](structures/plate-pulse-measured.md) | Does the `PRESS Ⓐ` plate stay up, pulse, or blink once? | ✅ **measured** — it **PULSES**, continuously and without decay, on a title held with **no input**: two windows in one boot, 58 s and 57 s, ~23 cycles each, periods **2.530 / 2.540 s** agreeing to 0.4 %. ⚠️ **It never goes off** — the plate-absent floor is **159** green pixels (the title art's own, from `live-title-build4-no-plate.png`) and the pulse bottoms at **714**, 4.5× that. So the port's "flash and nothing after", reasoned from `ptbtn00` expiring at t=244, is wrong; `ptbtn00f`'s 120-unit cycle is what runs. 🔴 **Two estimators, one misspecified**: mid-crossings replicate to 0.4 %, a single-sinusoid fit does not (2.553 vs 2.413) because the waveform is fast-rise/slow-decay — and its own r² of 0.468/0.228 is the tell. Both were controlled on synthetics at 2.24/2.55/3.10 s laid on the real timestamps and recovered all three exactly. 🟡 wall-clock is **13 % longer** than the corpus's earlier 2.24 s mean — same declared 120 units, different pacing (×1.27 vs ×1.12), so **author the units**. ⚠️ Reach: one boot; does not distinguish the boot title from an attract-loop title; the glyph count is a thresholded pixel count and **not** an alpha, so no duty cycle can be read off it |

View File

@@ -2208,3 +2208,27 @@ well-formed output for the wrong object.** This project has now been bitten twic
from opposite directions, and both times "everything still validates". When a
counter-example arrives that overturns a gradient, check *what it is a measurement
of* before you believe it — the same scrutiny the gradient got.
## A gate that detects a settled state can phase-lock your shutter
`wait_plate_pulse.py` was adopted to answer *"has the screen settled?"*, and it
answers it. But the plate's pulse **is part of the animation**, so gating on it
also synchronises the shutter to the animation's phase. Two runs gated this way
are **not** two samples of a free-running clock — measured, the sweep sits 2526
px apart across two sessions in different locales, 1.6 % of its traverse.
The damage is that between-run agreement then reads as *the game is stable* when
it means *my trigger is repeatable*. I recorded a 0.32 as "between-session
capture noise" and drew the first conclusion; the honest figure at an arbitrary
phase was 11.9, a factor of 37.
⚠️ **The general form: a trigger conditioned on a moving quantity makes every
capture correlated, and correlated captures understate variance.** Ask of any
"reproducible across runs" result *what fired the shutter* — if the trigger
watches something that moves with the thing you are measuring, reproducibility is
a property of the instrument. The escape is a shutter deliberately offset from
the gate, and it is cheap: fire at gate + k frames for a few k.
Note which results survive this and why: a **margin between two candidates scored
on one capture** was unaffected, because correlated noise moves both scores
together and cancels. Prefer margins to absolute scores when the shutter is gated.

View File

@@ -715,3 +715,43 @@ reachable by the person about to repeat it.
twice.** The same origin gives 0 and 1 to different destinations; every repeated
*pair* is identical across five replicates. The pair determines; the origin only
constrains. [`data/fade-four-transitions.txt`](data/fade-four-transitions.txt)
### The JP title might not draw the sweep leaves at rest — ❌ REFUTED (2026-08-30, mine)
I hypothesised that build 7's denser logo stack (katakana + crystalline burst)
**occludes** the two sweep leaves, to explain why two JP title captures differ by
RMSE 0.32 inside the adjudication box while two EN captures a plateau-phase apart
differ by 11.9. A draw capture in `ja` (control: the same extraction on the EN
title log) shows the **same three tall ROT strips, same dimensions, at HIGHER
alpha than English** — 180/188/194 vs 160/168/166. There is no absence to
explain. [data](data/title-sweep-jp-draw-capture.txt)
The 0.32 had a different cause: **my own gate**. See below.
### "Two sessions sample a free-running clock" — ❌ REFUTED (2026-08-30, mine)
`jp-title-at-rest.txt` justified a second capture as probing the between-run axis
"where a free-running clock lands somewhere else on a fresh boot", and reported
its in-box **0.32 as capture noise**. Measured at the shutter instant, the sweep
strips sit **2526 px apart across two runs in different locales and different
sessions** — 1.6 % of a ~1600 px traverse. The plate pulse *is* part of the
animation, so gating on it phase-locks the shutter. **0.32 is a lower bound
produced by the instrument, not a property of the game**; the honest figure at an
arbitrary phase is 11.9. The era adjudication is unaffected — its margin, 16.72,
clears even 11.9. [details](structures/plate-pulse-phase-lock.md)
### Refutation attempt on `sylpheed-port` — ✅ THE CLAIM SURVIVED (2026-08-30)
**Target:** the port's rejection of a positional mechanism, resting on 98 % of
off-edge area matching exactly with a residual of ±12 levels *inside lit logos*.
**My attempt:** if the sweep leaves' ink crosses the logos, that residual could
be sweep ink our renderer omits — and phase-locking would have made it look
stable across sessions rather than exposing it.
**Result: refuted, the claim stands.** `jp-title-at-rest.txt` has five frames
~1.5 s apart *within* a run — not gated individually, so genuinely different
sweep phases — and the 350×396 logo ROI is **byte-identical across all of them
(0 / 138 600 px differing, max |d| 0), reproduced in two independent sessions**,
while 58 % of the whole frame moves as a contrast control. The sweep ink does
not land on the logos. The ±12 residual is not sweep.

View File

@@ -74,3 +74,29 @@
# scores moved 0.001-0.002 between sessions and the margin moved 0.001, against
# an in-box capture noise of 0.32. A margin between two renders scored on one
# capture is far more robust than either score is.
################################################################################
# 🔴 CORRECTION -- 2026-08-30, same day. The BETWEEN-SESSIONS block above rests
# on a premise I have now measured and it is FALSE.
#
# It reasons that a second session probes a new axis, "where a free-running
# clock lands somewhere else on a fresh boot". It does not. Both captures were
# shuttered on the plate pulse, and the plate's pulse is PART of the title
# animation, so the gate synchronises the shutter to the animation's phase.
#
# Measured (structures/plate-pulse-phase-lock.md): at the shutter instant, the
# sweep strips sit 25-26 px apart between two runs in DIFFERENT locales and
# different sessions -- 1.6 % of a ~1600 px traverse.
#
# CONSEQUENCES:
# * "in-box capture noise of 0.32" is a PHASE-LOCKED LOWER BOUND, not capture
# noise. At an arbitrary phase the figure is 11.9 (two EN captures a
# plateau-phase apart). Do not reuse 0.32 as a noise floor.
# * I read 0.32 as showing the JP title is still. It shows the GATE works.
#
# WHAT SURVIVES UNCHANGED:
# * The margin 16.72 exceeds even the un-locked 11.9, so the era adjudication
# holds either way -- and holds FOR THE REASON THIS FILE GIVES: noise moves
# both candidates together and nearly cancels in a margin.
# * The five-frames-per-run at-rest result, which is not gated per frame and
# therefore does sample different phases.

View File

@@ -196,3 +196,16 @@
# slightly non-uniform one (-4.0667 then -4.0625), and it PASSES. So the curvature
# is in the strip whose source data is exactly straight: it is not in the disc, and
# it is either in the measurement or in how the game advances the record.
################################################################################
# ✅ SETTLED 2026-08-30 -- and the hypothesis in this file is REFUTED.
# See data/title-sweep-jp-draw-capture.txt and structures/plate-pulse-phase-lock.md.
#
# The leaves ARE drawn on the JP title -- same three ROT strips, same
# dimensions, at HIGHER alpha than English. There is no occlusion and no
# absence.
#
# The 0.32-vs-11.9 tension that motivated the hypothesis was not a fact about
# the game at all: both JP captures were shuttered on the plate pulse, which
# phase-locks the shutter to the animation (25-26 px apart on a ~1600 px
# traverse). 11.9 is the honest number; 0.32 is the gate.

View File

@@ -0,0 +1,45 @@
# Are the sweep leaves DRAWN on the Japanese title? -- 2026-08-30
#
# THE TENSION THIS WAS RUN TO SETTLE (from title-sweep-drawn-at-rest.txt):
# two EN title captures a plateau-phase apart differ by RMSE 11.9 inside the
# adjudication box, while two JP title captures from different SESSIONS differ
# by 0.32 there. I hypothesised the game might not draw the leaves at rest on
# the JP title -- build 7's denser logo stack (katakana + crystalline burst)
# occluding them.
#
# INSTRUMENT: tools/re-capture/jp_draw_capture.sh -- sets console language ja
# (trap-restores en on ANY exit), ensure_single_emulator, boots with
# --log_ui_draws --ui_draw_capture_frames=150, arms F10 on the plate pulse.
# Locale restore VERIFIED: language back at 1 after the run.
#
# CONTROL: the same extraction run against the ENGLISH title draw log
# (/sylph-home/re/titledraw2), where the leaves are known to be drawn.
#
# TALL ROT STRIPS (h > w, h > 720) -- alpha is the vertex colour's high byte:
#
# EN title: 1299x1303 n=112 alpha 139..181 mean 160.0 rot=ROT
# 883x1134 n= 77 alpha 142..193 mean 168.1 rot=ROT
# 890x1134 n= 55 alpha 142..193 mean 165.9 rot=ROT
#
# JP title: 1299x1303 n= 82 alpha 141..212 mean 179.9 rot=ROT
# 883x1134 n= 76 alpha 144..231 mean 187.9 rot=ROT
# 890x1134 n= 33 alpha 149..229 mean 193.5 rot=ROT
#
# ✅ THE LEAVES ARE DRAWN ON THE JP TITLE. Same three strips, same dimensions,
# and at HIGHER alpha than English (mean 180/188/194 vs 160/168/166). The
# occlusion hypothesis is dead: there is no absence to explain.
#
# ⚠️ WHAT THIS LOG CANNOT SAY. These are ROT quads: the logged w x h is the
# AXIS-ALIGNED BOUNDING BOX of a rotated strip, and the ink is a narrow diagonal
# band inside it. The x spans (-634..992) cross the adjudication box's x range
# (389..776), but a bounding box crossing a box does NOT mean ink does. I made
# that inference first and it does not hold.
#
# ❌ AND THE SLOPES ARE NOT RATES. Least-squares over the captured frames gives
# 1299x1303 slope -7.193 px/frame rms 30.98 sign-changes 2/81
# 883x1134 slope +7.141 px/frame rms 29.49 sign-changes 4/75
# 890x1134 slope +6.962 px/frame rms 29.03 sign-changes 2/32
# Every fit FAILS the linearity gate (residual sign-changes far below ~30 %,
# rms ~30 px against a ~1600 px traverse): the motion is curved over the capture
# window, so +-7.1 is the chord of an arc, not a velocity. Do not quote it.
# This is the SAME failure the "6-7 px/frame" eyeball made -- see METHOD.md.

View File

@@ -0,0 +1,70 @@
# The plate-pulse gate phase-locks the shutter to the title animation
**measured** — 2026-08-30 · [data](../data/title-sweep-jp-draw-capture.txt) ·
instrument `tools/re-capture/jp_draw_capture.sh`, control the English title
draw log
## The claim
`wait_plate_pulse.py` waits for the title plate's glyph count to sit in
[500, 2500] for 12 samples, and every title capture in this corpus shutters on
it. It was adopted to answer *"has the screen settled?"* — and it does.
But the plate's pulse **is** part of the title's animation, so gating on it does
not only wait for settling: it **synchronises the shutter to the animation's
phase**. Two runs gated this way are not two samples of a free-running clock.
## The measurement
The x of each tall ROT strip at the **first captured frame** — the shutter
instant — in two independent runs, different sessions, *different locales*:
| strip | EN run | JP run | apart |
|---|---|---|---|
| 883×1134 | x = 109 | x = 83 | **26 px** |
| 1299×1303 | x = 486 | x = 461 | **25 px** |
Against a traverse of ~1600 px, that is **1.6 %**. Two boots, two locales, two
sessions, and the sweep is in essentially the same place both times.
## What it invalidates — my own reading
[`jp-title-at-rest.txt`](../data/jp-title-at-rest.txt) reasons that its second
capture probes a new axis, *"BETWEEN runs, where a free-running clock lands
somewhere else on a fresh boot"*, and reports **RMSE 0.32** in the era box as
the between-session **capture noise**.
🔴 **The clock does not land somewhere else.** The gate puts it back in the same
place. So:
* **0.32 is a phase-locked LOWER BOUND on capture noise, not capture noise.**
At an arbitrary phase the in-box figure is the **11.9** measured between two
EN captures a plateau-phase apart. Anything reusing 0.32 as "the noise floor"
is quoting the gate, not the game.
* I read the 0.32 as evidence the JP title is **still**. It is not. It is
evidence the **gate works**. I had it backwards.
* The whole-frame 116 492 px that *do* differ between those two sessions are
consistent with exactly this: ~25 px of residual jitter displacing two large
bright diagonal strips moves a lot of pixels globally while barely clipping
the era box.
## What it does NOT invalidate
**The era adjudication stands.** Its margin is **16.72** (41.69 fixed vs
58.41 stale), which exceeds even the un-locked **11.9** figure — so it survives
whichever noise number is correct. And the file's own key insight is untouched
and is the reason it survives: capture noise moves both candidates together and
**nearly cancels in a margin** (absolute scores moved 0.0010.002 between
sessions; the margin moved 0.001).
**The within-run at-rest result stands** — five frames ~1.5 s apart are *not*
gated individually, so they sample different phases, and the logo ROI is
byte-identical across them in **both** sessions while 58 % of the frame moves.
## Reach of the negative
This says the gate locks phase; it does not say by what mechanism. Both runs
boot the same ISO from the same state, so the pulse may simply occur at a fixed
offset from a deterministic boot rather than the gate doing the locking. **Two
runs deliberately shuttered at different phases would separate those** and were
not run.