agent-orchestrator/backend/internal
harshitsinghbhandari 1eaaa4ce1d fix(observe): broaden reaper poll set + always report probe fact
Address blocker found in self-review (B1 + I1):

- Manager.RunningSessions previously filtered to runtime.State == RuntimeAlive,
  but a session enters Detecting with runtime axis = RuntimeProbeFailed (failed
  probe path, decide_bridge.go:72) or RuntimeMissing (detectingLC in
  manager_test.go:539). The filter silently parked every Detecting session, so
  the recovery path proved by manager_test.go:59 ("healthy probe recovers
  liveness-owned detecting -> working") and the terminal path proved by
  manager_test.go:79 ("dead+dead with no recent activity concludes killed")
  were both unreachable through the reaper. Broaden the predicate to "session
  is not in a terminal state" (mirrors the LCM's existing isTerminal helper)
  and document the wider semantics.

- reaper.probeOne now reports every probe result — including alive — back to
  the LCM as ApplyRuntimeObservation facts. The previous skip-alive
  optimization was a layering violation: the reaper has no business deciding
  what counts as a no-op. The LCM's ApplyRuntimeObservation already diffs
  against canonical and only Upserts on actual change, so steady-state alive
  stays cheap. With the broadened poll set, an alive probe for a Detecting
  session IS the recovery fact.

- Add unit tests for Manager.RunningSessions covering: nil-lister no-op, lister
  error propagation, and the full canonical state matrix (working/idle/
  needs_input/detecting-probefailed/detecting-missing/not_started included;
  terminated/done excluded).

- Update reaper tests: alive case now asserts the alive fact is reported; new
  "detecting session: alive probe reported so LCM can recover from quarantine"
  case locks in the recovery path; multi-runtime case now asserts both runtime
  facts flow through.

- Bump "session in poll set without handle metadata" log from Debug to Warn —
  it is an anomaly (OnSpawnCompleted should have written both keys), not a
  routine event.

- Document WithSessionLister must be called before any reaper attached to the
  Manager starts running (it is a bare field read; concurrent re-injection is
  meaningless anyway).
2026-05-29 22:18:54 +05:30
..
adapters fix: address LCM/SM review blockers R1, RA, R11, RB 2026-05-29 17:57:46 +05:30
config feat(backend): HTTP daemon skeleton (Phase 1a) — #10 (#14) 2026-05-29 10:02:53 +05:30
domain fix: align writer contract with schema-2 2026-05-29 16:13:14 +05:30
httpd feat(backend): HTTP daemon skeleton (Phase 1a) — #10 (#14) 2026-05-29 10:02:53 +05:30
lifecycle fix(observe): broaden reaper poll set + always report probe fact 2026-05-29 22:18:54 +05:30
observe/reaper fix(observe): broaden reaper poll set + always report probe fact 2026-05-29 22:18:54 +05:30
ports feat(observe): reaper for liveness probe + TickEscalations heartbeat (#9) 2026-05-29 22:10:29 +05:30
runfile feat(backend): HTTP daemon skeleton (Phase 1a) — #10 (#14) 2026-05-29 10:02:53 +05:30
session feat(observe): reaper for liveness probe + TickEscalations heartbeat (#9) 2026-05-29 22:10:29 +05:30