feat(status): area-coverage summary — every reconciled area, not "mostly skills"#32
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
rig statusrendered 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.
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 (anArearegistry + layer split), mirroringlayers.py. Thecicategory 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 rogueship.yml) routes to CI gates, never the~/binship merge gate.declared − missingarithmetic (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_ctloff Darwin rendersunsupported(not a falsein sync) — only when configured and genuinely no drift, so a real off-Darwin drift can never be masked.layers.py— addgitignore+tg_ctlto_CATEGORY_LAYER(the registry was meant to be exhaustive; both previously fell through to the GLOBAL default)._LAYER_HEADERSlifted to a module constant, shared with the per-item drift dump (one source of wording).Acceptance evidence
rig statusagainst a real agent-tools checkout — all 13 areas visible at a glance, grouped by layer, each with its honest state:The old output would dump 88 drift lines with
skills:dominating; the new summary surfaces every area (incl.repo settings: in sync, the once-buriedship,agent-hooks: drift (9)) in 16 lines.Tests
riglib/areas.pyregistry: 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.ymlrouting, 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.Full suite +
tests/smoke.sh(the CI gate: --help/doctor/init/apply-idempotency/status/non-git/tg-ctl + pytest) green. Reviewed across multiplereview --stagedrounds (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:repo settings: in synceven though detect() intentionally checks nothing (no remote → no drift). Should read not applicable / no GitHub remote.plan.notesentry (e.g.modelswith a missingchecker_path, or hook-bridge on an old agent-tools checkout) showsnot configured/in sync, hiding the skip. Status should surface skipped/blocked plan notes.tg_ctl.boot: falseshowsin syncin the summary while the dedicated detail line saysdisabled.🤖 Generated with Claude Code