@@ -463,7 +463,7 @@ validate ──► materialize ──► host-local st2 scheduler/reconciler
463463 claims fail every conflicting owner before the first workspace write.
464464 Targeted reconciliation checks the selected owner against the full fleet, so
465465 selection cannot bypass this ownership boundary.
466- - ** R04:** Each machine schedules and reconciles only its pinned work. The st2
466+ - ** R04, R31 :** Each machine schedules and reconciles only its pinned work. The st2
467467 loop is deterministic; exactly one declared root agent provides intelligent
468468 host-local supervision, bounded recovery, and escalation. Filesystem reads
469469 never wake reconciliation; only create, modify, rename, or remove events may
@@ -473,6 +473,27 @@ validate ──► materialize ──► host-local st2 scheduler/reconciler
473473 failing to restart the agent, or terminally parking it, suppresses companion
474474 launch and stops an exact generated companion proved live; explicitly
475475 authored sibling tasks remain independent.
476+ Restart accounting is per task and persists across reconcile passes. Only a
477+ successful launch spends its declared budget. Each completed pass supplies
478+ the exact task IDs it proved alive; uninterrupted observed liveness may
479+ forgive a fail-mode budget according to the
480+ [ restart field contract] ( ./02-agent-spec/spec.md#f12 ) , while an unobserved task
481+ loses accrued recovery uptime. A pass that exits before execution neither
482+ supplies a liveness observation nor closes the accounting pass.
483+ [ PR #191 ] ( https://github.com/compoundingtech/st2/pull/191 ) provides cadence,
484+ recovery, and unobserved-pass evidence for this accounting.
485+ - ** R32:** Bounded non-interactive helpers such as ` pty list --json ` and
486+ ` pty metadata patch ` start in a fresh session whose leader PID is also its
487+ process-group ID. Standard output and error use regular temporary files, so a
488+ descendant inheriting those descriptors cannot hold a capture pipe open.
489+ After spawn, an input setup or write failure or a deadline expiry sends
490+ ` SIGKILL ` to the process group and explicitly terminates the direct child.
491+ st2 waits for that child until the cleanup deadline; if it cannot finish the
492+ wait synchronously, a background waiter takes ownership before the failure
493+ returns. The process-group signal reaches a descendant that outlives the
494+ direct child; terminating the direct child alone does not. [ PR
495+ #202 ] ( https://github.com/compoundingtech/st2/pull/202 ) provides
496+ descendant-lifetime and direct-child-reap evidence for this contract.
476497- ** R06:** st2 passes the complete effective task definition to the underlying
477498 launcher so manual and supervised restarts are equivalent. Harness readiness
478499 that depends on a dynamically selected account belongs to that declared
0 commit comments