port: the rest() flash defect reaches all four splashes I ship; the port survives it

The Decoder censused rest()'s dwell fallback from the file side: 2305 elements
have no plateau, 1697 of those get a visible pose, and in GP_TITLE all four
visible fires are on the splash screens this port ships. Confirmed in my export.

Refinement to their description: they named the [0:a0 15:a255 30:a212 45:a0]
shape, but palogo_gamearts_eff and palogo_seta_eff hold 255 through t=30, so
their fallback lands on the flash PEAK rather than its decay. Same defect, worse
pose.

The port ships the right frame and there is now a number for it. Publisher splash
against the committed oracle capture: timeline (shipped) RMSE 2.17 / 0.01%
differing; --pose=rest 9.05 / 0.75% -- 75x the differing area on a screen I ship.
So the rule added to verify-screen's header after the title_jp mistake
generalises, and is demonstrated against an oracle rather than argued.

What did need fixing: ScreenView logged '(transparent at rest)' for every skipped
element whatever instant it posed, so it said that about palogo_sqex_eff, whose
resting alpha is 212. That is the same rest-versus-posed-instant confusion that
cost a wrong conclusion, pre-printed in the log. It now names the instant.
Controlled both ways: timeline says 'at t=6' and skips the flash, --pose=rest
still says 'at rest' and draws it.

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 11:53:01 +00:00
parent aa51e5af67
commit 9233ff1e08
2 changed files with 75 additions and 2 deletions

View File

@@ -640,7 +640,22 @@ func _draw() -> void:
else pose_at(element, time_units)
var colour := modulate_of(pose)
if colour.a <= 0.0:
skipped.append("%s (transparent at rest)" % id)
# 🔴 THIS LINE USED TO SAY "at rest" WHATEVER INSTANT IT HAD POSED.
#
# On the timeline path the pose is `pose_at(time_units)`, not
# `rest`, and on the screens where those differ the message named a
# pose it had not looked at. `palogo_sqex_eff` on the publisher
# splash is `[0:a0 15:a255 30:a212 45:a0]` -- a flash whose `rest`
# alpha is **212**. The port skips it correctly at the settled
# instant and then reported "transparent at rest" about a resting
# pose that is four-fifths opaque.
#
# ⚠️ That is not cosmetic. The rest-versus-posed-instant confusion is
# exactly what made me score a `--pose=rest` frame against a capture
# and write up a drift that did not exist (DECISIONS.md). A log line
# that erases the distinction is the same error, pre-printed.
skipped.append("%s (transparent %s)" % [id,
"at rest" if pose_mode == Pose.REST else "at t=%.0f" % time_units])
continue
var pivot := _vec(element.get("pivot", [0, 0]))
var pos := _vec(pose.get("pos", [0, 0]))