The selectable run and after paths sliced the incoming vector behind an
attribute check alone, so a short vector reached the script as too few
positionals and raised a TypeError out of the runner. Both now resolve the
slice the same way the alwayson hooks do and report the mismatch instead.
The alwayson hook runners checked that a script declared an argument range
but never that the processing object's vector could fill it, so a caller
that did not bootstrap script args splatted fewer positionals than the hook
signature takes. Every registered script raised a TypeError per hook, and
postprocess_image runs per image, so one video generation produced a
traceback per script per frame.
resolve_script_args now answers with the slice or None, and each runner
skips on None. A script that declares no arguments still runs, since its
empty slice is complete rather than truncated.
ScriptSummary.record reset the reference timestamp immediately before
measuring against it, so every recorded duration was ~0 and report()
never logged script timings. Measure against the previous timestamp,
then advance it.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>