Skip to content

feat(status): area-coverage summary — every reconciled area, not "mostly skills"#32

Merged
alex-mextner merged 1 commit into
mainfrom
blitz/rig-status
Jun 17, 2026
Merged

feat(status): area-coverage summary — every reconciled area, not "mostly skills"#32
alex-mextner merged 1 commit into
mainfrom
blitz/rig-status

Conversation

@alex-mextner

Copy link
Copy Markdown
Owner

What

rig status rendered only the items that were drifting, as one flat dump dominated by skill rows (one per skill + a harness-link row each). Every other area — agent-hooks, the git-hook dispatcher, CI gates, the ship gate, MCP, AGENTS/CLAUDE symlinks, repo settings, harness, tmux, the model-freshness cron, the tg-ctl daemon — was buried under the skill lines or, when in sync, invisible. A user could not see the full picture of what rig manages and where it's out of sync.

ROADMAP: "rig status must cover ALL reconciled areas, not mostly skills" — group by area + the GLOBAL/REPO layer split; each area shows in-sync vs drift.

Note: the sibling ROADMAP items in the same heading cluster — the non-git handling ("non-git dir must NOT claim 'no rig.yaml, should be committed'") and the loud "extras are left for you to decide" reassurance in status + apply --helpalready landed in #27 (error-system v2). This PR closes the remaining, biggest gap: the area-coverage summary. I left the already-done work untouched.

How

Add an AREA SUMMARY headline at the top of rig status: every reconciled area, grouped by the GLOBAL/REPO layer, each with its state — not configured / in sync / drift (N declared-but-missing/modified[, M on-disk-not-declared]). The detailed per-item drift dump still follows as the detail.

  • riglib/areas.py — the single source of truth for the area list (an Area registry + layer split), mirroring layers.py. The ci category splits into two user-facing areas — CI gates and ship / gh ship — by action slot / drift item, direction-aware so a disk→config extra workflow (even a rogue ship.yml) routes to CI gates, never the ~/bin ship merge gate.
  • Counts are the unit-stable DRIFT counts; no fragile declared − missing arithmetic (a plan action and a drift item are not 1:1 across areas — gitignore is one action but two checks, a skill is a copy + a harness-link).
  • tg_ctl off Darwin renders unsupported (not a false in sync) — only when configured and genuinely no drift, so a real off-Darwin drift can never be masked.
  • layers.py — add gitignore + tg_ctl to _CATEGORY_LAYER (the registry was meant to be exhaustive; both previously fell through to the GLOBAL default).
  • _LAYER_HEADERS lifted to a module constant, shared with the per-item drift dump (one source of wording).

Acceptance evidence

rig status against a real agent-tools checkout — all 13 areas visible at a glance, grouped by layer, each with its honest state:

rig status
  repo: /private/var/folders/1c/d4v7_mrs4b9085f6w7w9p35c0000gn/T/tmp4y_pjvqk/repo
  stack: unknown  type: unknown
  config layers: repo:/private/var/folders/1c/d4v7_mrs4b9085f6w7w9p35c0000gn/T/tmp4y_pjvqk/repo/rig.yaml

  areas rig manages:
    GLOBAL — machine-wide (from ~/.config/rig/config.yaml)
      skills: drift (76 declared-but-missing/modified)
      agent-hooks (v1 descriptors): drift (9 declared-but-missing/modified)
      git-hooks dispatcher: not configured
      global gitignore excludes: drift (2 declared-but-missing/modified)
      MCP servers: not configured
      harness auto-mode + hook bridge: not configured
      tmux config: not configured
      model-freshness cron: not configured
      tg-ctl inbound daemon: drift (1 declared-but-missing/modified)
    REPO — this repository (from ./rig.yaml)
      CI gates: drift (1 declared-but-missing/modified)
      ship / `gh ship` merge gate: drift (1 declared-but-missing/modified)
      AGENTS.md / CLAUDE.md symlinks: drift (1 declared-but-missing/modified)
      repo settings (branch protection / GHAS / merge): in sync

  [GLOBAL] tg-ctl inbound daemon: drifted (tg-ctl boot LaunchAgent not installed)  (launchd boot agent, 'ai.hyperide.tg-ctl')

The old output would dump 88 drift lines with skills: dominating; the new summary surfaces every area (incl. repo settings: in sync, the once-buried ship, agent-hooks: drift (9)) in 16 lines.

Tests

riglib/areas.py registry: exhaustive vs the ROADMAP areas, layer partition, ci/ship split on action + drift + direction, frozen dataclass, every known category maps to an area / every area category is layer-classified (guards against a future category silently going uncounted — the headline/detail divergence this feature exists to prevent).

End-to-end status (drives main(["status", …])): all areas listed, drift counts, in-sync marking, partial drift, modified-direction counting, ci-extra + rogue-ship.yml routing, harness action↔drift coherence (no false in-sync for the merged auto-mode + hook-bridge area), gitignore one-action-two-checks in-sync, tg_ctl unsupported/disabled off Darwin, non-git GLOBAL-only.

...............................sssss                                     [100%]
679 passed, 5 skipped in 5.18s

Full suite + tests/smoke.sh (the CI gate: --help/doctor/init/apply-idempotency/status/non-git/tg-ctl + pytest) green. Reviewed across multiple review --staged rounds (Fable/Opus/Codex/GLM), all [ok]; every actionable correctness finding addressed.

Deferred (follow-ups, not regressions)

These are pre-existing detection-contract semantics the summary faithfully reflects (the old status surfaced nothing for them either); fixing them couples the summary to area-specific detect state or surfacing plan.notes, out of scope here:

  • A git repo with no GitHub remote shows repo settings: in sync even though detect() intentionally checks nothing (no remote → no drift). Should read not applicable / no GitHub remote.
  • An enabled-but-unprovisionable area that the plan builder skips with a plan.notes entry (e.g. models with a missing checker_path, or hook-bridge on an old agent-tools checkout) shows not configured / in sync, hiding the skip. Status should surface skipped/blocked plan notes.
  • tg_ctl.boot: false shows in sync in the summary while the dedicated detail line says disabled.

🤖 Generated with Claude Code

…tly skills"

`rig status` rendered only the items that WERE drifting, as one flat dump
dominated by skill rows (one per skill + a harness-link row each). Every other
area — agent-hooks, the git-hook dispatcher, CI gates, the ship gate, MCP,
AGENTS/CLAUDE symlinks, repo settings, harness, tmux, the model-freshness cron,
the tg-ctl daemon — was buried under the skill lines or, when in sync, invisible.
A user could not see the FULL picture of what rig manages and where it's out of
sync (ROADMAP "rig status must cover ALL reconciled areas, not mostly skills").

Add an AREA SUMMARY headline at the top of status: every reconciled area, grouped
by the GLOBAL/REPO layer, each with its state — "not configured" / "in sync" /
"drift (N declared-but-missing/modified[, M on-disk-not-declared])". The detailed
per-item drift dump still follows as the detail.

- riglib/areas.py: the single source of truth for the area list (Area registry +
  layer split), mirroring layers.py. The `ci` category splits into two
  user-facing areas — "CI gates" and "ship / gh ship" — by action slot / drift
  item, direction-aware so a disk->config extra workflow (even a rogue ship.yml)
  routes to CI gates, never the ~/bin ship merge gate.
- Counts are the unit-stable DRIFT counts; no fragile `declared - missing`
  arithmetic (a plan action and a drift item are not 1:1 across areas — gitignore
  is one action but two checks, a skill is a copy + a harness-link).
- tg_ctl off Darwin renders "unsupported" (not a false "in sync") only when there
  is genuinely no drift, and only when the area is configured.
- layers.py: add gitignore + tg_ctl to _CATEGORY_LAYER (the registry was meant to
  be exhaustive; both previously fell through to the GLOBAL default).
- _LAYER_HEADERS lifted to a module constant, shared with the per-item drift dump.

Tests: the registry (exhaustive vs the ROADMAP areas, layer partition, ci/ship
split on action + drift + direction, frozen dataclass, every known category maps
to an area / every area category is layer-classified), and end-to-end status:
all areas listed, drift counts, in-sync marking, partial drift, modified-direction
counting, ci-extra + rogue-ship.yml routing, harness action<->drift coherence,
gitignore one-action-two-checks in-sync, tg_ctl unsupported/disabled off Darwin,
non-git GLOBAL-only. Full suite + smoke green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@alex-mextner alex-mextner merged commit 2f08567 into main Jun 17, 2026
12 checks passed
@alex-mextner alex-mextner deleted the blitz/rig-status branch June 17, 2026 11:40
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