Files
Mike SchwarzandOpenRig contributors 71e66bfa25 fix(daemon): evaluate the busiest ceremony families past the family limit (#357)
* fix(daemon): evaluate the busiest ceremony families past the family limit

When more than 200 handoff families had queue activity in the observation
window, the passive ceremony source threw health_passive_family_limit. Health
reads combine all sources, so the whole projection failed: `rig health` and
the TUI HEALTH view returned an error instead of any finding, including
context pressure, and the scheduled evaluation recorded only that error.

Past the limit the source now evaluates the 200 families with the most queue
transitions in the window, breaking ties by lineage ID. A family qualifies by
its transition count, so this keeps every family that could qualify unless
more than 200 do. Families at or below the limit are evaluated exactly as
before.

The result says it is partial. The health list and `rig health policy`
(engine.lastEvaluation.coverage) report the source's total, evaluated and
omitted counts, the limit and the order. `rig health` and the TUI HEALTH view
mark it PARTIAL. Omitted families were not evaluated and are never presented
as healthy.

* fix(daemon): report the scheduled evaluation's own coverage

The scheduled evaluation read the passive source's latest coverage after the
whole evaluation finished. A health read served while it awaited delivery
replaced that coverage, so the evaluation reported another read's counts.
When diagnosis policy is disabled, no read happens, and it reported coverage
left by an earlier request.

The evaluation now snapshots coverage right after its own read and returns it
with the result; a skipped evaluation returns null. The TUI summary line puts
PARTIAL before the variable-length finding summary, so a narrow line cannot
truncate it away.

---------

Co-authored-by: OpenRig contributors <noreply@openrig.dev>
2026-10-01 16:34:09 -07:00
..

@openrig/tui — mission-control TUI

The explorer / master-detail "k9s for rigs" surface: left Explorer (Topology · Specs · Scopes · Needs-You), right content pane, top command bar, ambient rig-stream footer. OBSERVE / NAVIGATE / DRIVE-STRUCTURE only — ACT / PRODUCE / REVIEW-ARTIFACT surfaces live in Studio, not here. Zero runtime dependencies; it reads the daemon's EXISTING projections (two renderers, one projection — src/daemon-client.ts is the entire HTTP surface).

Run — one herdr tile, daemon-direct

The TUI runs as ONE pane/tile inside herdr's wall (any tmux pane works the same way — the tile IS a tmux pane; no extra multiplexer, no integration layer):

# inside a herdr tile / tmux pane, daemon-direct (OPENRIG_URL or default):
node packages/tui/dist/main.js --instance tui-1

# options:
#   --instance <id>   instance id (socket address; multi-instance ready)
#   --url <daemon>    daemon base URL (default $OPENRIG_URL or http://127.0.0.1:7433)
#   --socket <path>   control socket (default $OPENRIG_TUI_SOCKET or $OPENRIG_HOME/run/tui-<id>.sock)
#   --demo            labeled demo fixture instead of live reads (never mixes with live)

An agent can compose a view and open it for the operator via the rig terminal primitive pointing at that command.

Driving it (human or agent — same grammar, same state)

Command bar / keyboard / mouse / control socket all mutate ONE view-state through ONE path. Safe-core grammar: :topology :specs :scopes :needs · /<filter> · host|rig|pod|agent|spec <name> · tab table|overview · spec-of <agent> · running <spec>. Keys: arrows + Enter navigate the explorer, f toggles the footer, q quits.

In Scopes, select a mission or use mission <name>. Its workflow rows open the current work, owner, recorded waiting reason, wake mechanism, next action and bound sources. workflow <instance-id> and packet <qitem-id> address those pages within the selected mission. Release ceremony, post-release housekeeping and an authored successor remain separate. A receipt is an attributed record, not an automatic acceptance verdict; bound source hashes describe compilation, not an assertion that current source bytes are identical.

Specs separates authored declarations from observed consumers. Open a consumer to inspect its served runtime and seat binding; missing source stays explicit. The selected source is re-read on refresh even if the library revision did not change. back or Escape returns to the previous selection, tab and scroll. Escape first cancels editing or clears an active filter. On long spec pages, Up/Down scroll by default; Right enters links, then Up/Down and Enter follow them. rig tui commands --json lists the shared command registry.

Agents: tmux send-keys of any command is the always-available floor; the control socket is the addressable-screen API — one command per line, one JSON reply per line, plus state for a read-only state query:

printf 'agent dev.impl\n' | nc -U ~/.openrig/run/tui-tui-1.sock

Socket rules (arch standing constraint): every socket command goes through the one resolver/mutation path, and verbs stay OBSERVE/NAVIGATE/DRIVE-STRUCTURE only. Unix-socket paths must stay under ~104 bytes (sun_path) — keep the default runtime dir.

Tests

npm test          # vitest: grammar, state, parity (mouse/kbd/command), hydration
                  # fixtures, socket contract, §4.A route audit, --demo gate