Skip to content

Operator UX: force-stop with reaping, liveness/family-health status, hot-reload - #85

Merged
fazpu merged 2 commits into
mainfrom
feat/operator-ux
Jul 20, 2026
Merged

Operator UX: force-stop with reaping, liveness/family-health status, hot-reload#85
fazpu merged 2 commits into
mainfrom
feat/operator-ux

Conversation

@fazpu

@fazpu fazpu commented Jul 20, 2026

Copy link
Copy Markdown
Member

Summary

Three operator-UX gaps felt while running a real program:

  • loopy stop --force — requests the stop and actively reaps the current iteration's spawned agent subprocesses via the existing reaper, so an abrupt stop leaves no orphaned agent CLIs (previously required manual pkill).
  • loopy status liveness + family-health — adds the age of the active session's most-recent activity, and surfaces rate-limited model families when the harness run.json carries them (best-effort; tolerates absence); plus a JSON form.
  • loopy reload — atomically refreshes the coordinator's cached preflight so a fixed prompt / reloadable coordinator-only config is picked up next iteration without a restart. Does not reload the session-frozen config_snapshot, goal, model/family, or workflow contracts/rosters — that immutability is load-bearing (documented).

Review

Implemented by Codex (gpt-5.6-sol xhigh); adversarially reviewed by Grok (grok-4.5) and me. Grok: SHIP-WITH-NITS — reload frozen-state safety sound (no mutation of config_snapshot/goal/model/contracts/rosters/tiers; membership changes fail closed); force-stop correctly reuses the reaper with host/run gates; status crash-safe. Nits are operator-edge semantics and test depth (CLI reaper test mocked; recovery-layer reaping tested with force=True).

Test plan

449 tests pass; ruff + pyright clean.

🤖 Generated with Claude Code — implemented by Codex, reviewed by Grok + Claude.

https://claude.ai/code/session_01EPYwF6cRYs2mfsfHF1hibc

fazpu and others added 2 commits July 20, 2026 13:48
…load

- loopy stop --force: requests the stop and actively reaps the current
  iteration's spawned agent subprocesses via the existing reaper, so an
  abrupt stop leaves no orphaned agent CLIs (previously required manual
  pkill).
- loopy status: adds a liveness signal (age of most-recent activity for
  the active session) and surfaces rate-limited model families when the
  harness run.json carries them (best-effort, tolerates absence); plus a
  JSON form.
- loopy reload: atomically refreshes the coordinator's cached preflight
  so a fixed prompt / reloadable coordinator-only config is picked up on
  the next iteration WITHOUT a restart. Deliberately does NOT reload the
  session-frozen config_snapshot, goal, model/family, or workflow
  contracts (that immutability is load-bearing) — documented precisely.

Implemented by codex (gpt-5.6-sol xhigh); pending Grok + human review.

Co-Authored-By: Codex (gpt-5.6-sol) <noreply@openai.com>
Claude-Session: https://claude.ai/code/session_01EPYwF6cRYs2mfsfHF1hibc
…s health

Publishes the operator-UX surface on the docs site: loopy stop --force
(reap active agents), loopy reload (refresh prompts/coordinator config at
the next boundary; not the frozen session policy), and the new status
health lines (last-activity liveness + rate-limited model families,
plus --json). Adds troubleshooting entries for a wedged loop, orphaned
agents, a rate-limited family, and a prompt fix not taking effect.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EPYwF6cRYs2mfsfHF1hibc
@fazpu
fazpu merged commit 190008c into main Jul 20, 2026
4 checks passed
@fazpu
fazpu deleted the feat/operator-ux branch July 20, 2026 12:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant