port: --linger, so a scripted walk can observe what arrives after it settles

Last iteration I inferred the returned plate's fade from code-path identity
because the harness could not watch it: `--script` quits the moment the last step
settles, and the plate arrives on its declared ramp ~3.6 s later. A film of
`--script=cancel` stopped at 168 units and never reached 214.

`--linger=SECONDS` holds the run open past the walk. `_script_settled` still waits
for a hold before shooting -- a shot taken mid-fade is a photograph of a fade --
this only changes what happens after the shot, which was "exit".

Pre-registered: the returned plate sits at its floor until 214 units, then rises
to full by 236, the same ramp the boot shows. Measured:

  units=208.75  0.145404   floor
  units=216.58  0.158596
  units=224.41  0.179036
  units=232.25  0.203050
  units=240.08  0.215005   full -- boot path gives 0.2142 at t=236

So the return fades, identically to the boot, and it is now OBSERVED rather than
argued from the branch it takes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018AHUQvXGyNcKonSEWsgWcX
This commit is contained in:
Sylpheed port agent
2026-09-01 19:51:55 +00:00
parent 1c2782247d
commit 975d24def2

View File

@@ -1333,6 +1333,22 @@ func _run_script() -> void:
# at, not the one it started from. See the note beside the early capture.
if _capture_to != "":
await _capture(_capture_to)
# 🔴 `--linger=SECONDS` KEEPS A SCRIPTED RUN ALIVE AFTER THE WALK SETTLES.
#
# Without it a scripted run quits the moment the last step settles, and
# ANYTHING THE SCREEN DOES AFTERWARDS IS UNOBSERVABLE. That is not
# hypothetical: the plate on a returned title arrives on its own declared
# ramp at t=214..236, which is ~3.6 s after the screen settles, and a film of
# `--script=cancel` stopped at 168 units and never reached it. The behaviour
# was inferred from code-path identity because the harness could not watch it.
#
# `_script_settled` waiting for a hold is right -- a shot taken mid-fade is a
# photograph of a fade. This does not change that. It changes what happens
# after the shot, which was "exit" and is now optionally "keep running".
var linger := float(_args().get("linger", "0"))
if linger > 0.0:
print("linger: holding %.2f s past the walk so late arrivals are observable" % linger)
await get_tree().create_timer(linger).timeout
get_tree().quit(0)