fix(runner): a source that was asked and handed nothing says so

NextAction returning ErrNoAction left the step with no skip reason, so a
run whose every model call failed on transport, a non-2xx, an empty
choices array or an echo mismatch printed no violations and exited 0.
Only llm-calls.jsonl knew it had never touched the app.

The reason now travels the path the other five already take, so it
reaches the trace, the summary, and the campaign's dispatched-action
exclusion. A held step never asks and keeps carrying nothing.
This commit is contained in:
pj committed 2026-08-18 14:16:42 +05:30
1 parent 1da0c3e118
commit 0646611a7f
5 files changed
+195 -11

No files matched your search

+4 -3
View File
@@ -48,9 +48,10 @@ type Step struct {
// retry budget. The verifier is skipped for these steps so transient
// state does not poison the previous/current extractor advance.
Transitional bool `json:"transitional,omitempty"`
// ActionSkipped names why NextAction was chosen but never dispatched, so a
// count of executed actions cannot be inflated by steps whose action the
// runner threw away. Empty when the action ran (or when none was chosen).
// ActionSkipped names why this step dispatched nothing: an action chosen and
// then thrown away, or a source that was asked and produced none. A count of
// executed actions cannot be inflated by either. Empty when the action ran,
// and empty on a held step, which never asked for one.
ActionSkipped string `json:"action_skipped,omitempty"`
// ObservationError names why this step's device read produced no tree,
// empty when a tree was read. A screen with no elements on it is a tree,