runner: time-boxed exit + end-of-run summary (P5a) - #18
Conversation
…mpaign) The two additive runner changes DD-025 §7a/§7.2 specified, so an operator campaign can bound a coverage-guided run and read its result: - -Dclosurejvm.run.duration (10m/30s/500ms/bare-seconds): stop the loop and exit CLEANLY at the deadline. A Job activeDeadlineSeconds SIGKILL would report Failed AND skip the summary write, so the bound is enforced inside the runner instead. When set without an iteration arg, the deadline governs. - -Dclosurejvm.summary.out=<path>: on shutdown, write the StatusReporter snapshot JSON (coverage %, findings, crashes, invariants, iterations) to <path> for a supervisor to read. Via a shutdown hook so it lands on both a normal and a deadline-triggered exit. parseDurationMillis unit-tested (suffixes, bare seconds, whitespace/case, fractional). USAGE flags documented. Full suite green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JuGqspSB9zpA5AyvHJBiDK
|
@claude please review — first slice of operator P5a (DD-025): the two additive runner changes ( Worth checking:
|
|
Claude finished @ianp94's task in 3m 14s —— View job Review — runner: time-boxed exit + end-of-run summary (P5a)
Solid, well-scoped additive slice — clean-exit time-box and shutdown-hook summary are both the right shape for DD-025 §7a. One finding I'd fix before this feeds the operator Job, plus a couple of minor notes. 1. Summary will silently report all-zeros unless
|
…eview) Real silent-failure gap: StatusReporter's counters are all no-ops unless -Dclosurejvm.status=true, but snapshotJson() always returns valid JSON — so summary.out without status would write a plausible all-zeros summary (coverage 0, findings 0), which an operator reads as a clean run rather than a misconfiguration. Warn loudly on that combination. (The campaign reconciler already passes status=true; this catches hand-runs.) Also documented in USAGE: summary.out requires status=true, and the duration deadline is best-effort (checked between iterations, so a slow in-flight request can overrun it). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JuGqspSB9zpA5AyvHJBiDK
|
Fixed the silent-failure gap (#1) in |
First slice of operator P5a (DD-025): the two additive runner changes the campaign needs, so the harness itself is ready before the operator drives it.
-Dclosurejvm.run.duration(10m/30s/500ms/bare-seconds) — stops the coverage-guided loop and exits cleanly at the deadline. Enforced inside the runner, not via JobactiveDeadlineSeconds: a SIGKILL would reportFailedand skip the summary write (both broken). When set without an iteration count, the deadline governs.-Dclosurejvm.summary.out=<path>— on shutdown, writes theStatusReportersnapshot JSON (coverage %, findings, crashes, invariants, iterations) for the operator to read into campaign status (DD-025 §7a, decoupled from the dashboard). Written via a shutdown hook so it lands on normal and deadline exits.parseDurationMillisunit-tested (suffixes / bare seconds / whitespace+case / fractional). USAGE flags documented. Full Java suite green.Next P5a slices: the
closurejvm/runnerimage, theClosureJVMCampaignCRD + reconciler (+ coverage-classes initContainer), and the e2e.🤖 Generated with Claude Code
https://claude.ai/code/session_01JuGqspSB9zpA5AyvHJBiDK