port: wire flow.json's dwell, assert the three authored values the port hardcodes

Applying the prior from six prior findings to authored/ itself: five keys had no
reader. dwell, ramp, left_right, input_during_transition, stems.

dwell is the one that mattered. Its own text says a measured hold goes there and
a number placed there did nothing -- and two iterations ago I asked the Decoder
for measurements destined for that slot. Wired now, and it stays EMPTY: the
splash dwells are declared on the disc and measured to agree.

I wired it to the wrong branch first and it did nothing, silently -- holding
longer after settle is absorbed because the screen still leaves at exit_time +
black_hold. A dwell must delay the departure. Caught only by testing the control:
+120 units moves the transition 4.46 -> 6.43 s.

ramp, left_right and input_during_transition describe hardcoded behaviour and are
written like switches. Rather than invent the missing implementations, they are
now asserted against the value the port was built for, naming the file -- which
is the distinction left_right's own why claims to make and was not making. The
validator is called, not merely defined.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF
This commit is contained in:
Sylpheed port agent
2026-08-30 03:16:35 +00:00
parent c4d7553e59
commit 141cef4047
2 changed files with 130 additions and 1 deletions

View File

@@ -6220,3 +6220,67 @@ full-frame and **0.000 %** across the band. A general floor could not coexist wi
either number. So the 0.301 % is specific to the attract band capture, and my
0.010.2 % rows are not sitting on a hidden floor. ⚠️ What that does *not* settle
is why those two frames differ — still theirs, and still worth an answer.
## Five authored values had no reader — including the one I asked for measurements into
Applying the prior from the last six findings — *a rule or capability nothing
exercises turns out broken or inert when someone looks* — to `authored/` itself.
Grepping every authored key for a reader in the exporter or the runtime:
| key | file | status |
|---|---|---|
| `dwell` | `flow.json` | 🔴 **no reader** — now wired |
| `ramp` | `timing.json` | no reader — now asserted |
| `left_right` | `flow.json` | no reader — now asserted |
| `input_during_transition` | `flow.json` | no reader — now asserted |
| `stems` | `audio.json` | no reader (`stems_why` is carried; the sum is hardcoded) |
Everything else — `se`, `bgm`, `voice`, `boot`, `screens`, `navigation.wrap`,
`draw_leaf_for`, `loop_leaf_on_screens`, `keyframe_units_per_second`,
`black_hold_units`, `archives`, `also_export`, `presentation`, `loop_mode`,
`initial_focus`, `skippable`, `then_video`, `after_video` — is read.
### 🔴 `dwell` is the one that mattered
Its own text says *"when a capture times the real boot, the extra hold per screen
goes here."* **A number placed there did nothing.** Two iterations ago I asked
the Decoder for measurements destined for exactly that slot; had they arrived,
they would have been filed into a value with no reader and the boot would have
been unchanged, silently — and I would have reported the boot as matching.
It is wired now, and **stays empty**. Nothing is authored into it: the splash
dwells are declared on the disc and measured to agree. Wiring the slot so that a
future number has an effect is the opposite of adopting one.
⚠️ **I wired it to the wrong branch first, and it did nothing — silently.** Holding
longer after settle changes nothing, because the screen still leaves when
`exit_time() + black_hold` arrives and the extra hold is absorbed. A dwell has to
delay the **departure**. I found it only because I tested the control:
+120 units moved the transition 4.46 s → **6.43 s**, +1.97 s, with the video
following by the same amount. Reproducing the exact defect I was removing, inside
the fix for it, is the strongest argument I have for testing that a wire carries
current rather than that it exists.
### The other three are asserted, not implemented
`ramp`, `left_right` and `input_during_transition` describe behaviour the port
**hardcodes**. That is fine for a record and dangerous for a switch, and they are
written like switches — setting `left_right` to `"move"` would change nothing and
warn nobody.
Rather than invent the missing implementations, `_check_authored_invariants`
**asserts the value the port was built against**, naming the file. Changing one
now produces an error instead of silence.
That is precisely the distinction `left_right`'s own `why` claims to be making —
*"written out rather than left unhandled so that 'the game ignores it' and 'we
never wired it' are different lines of code"* — and which was not in fact being
made, because nothing read the value that was supposed to make it.
✅ The validator is **called**, not merely defined. A validator nobody invokes is
the same defect it exists to catch, and this file now documents six other
instances of exactly that.
Verified: clean boot with no invariant errors and unchanged timings; setting
`left_right: "move"` produces the error; all five MODDING rules still pass; the
oracle rows are unmoved.