From radar-suite
Orchestrates radar audit skills: run full sequence or targeted via git changes/directories, manage unified findings ledger, verify fixes, link issues.
npx claudepluginhub terryc21/radar-suite --plugin radar-suiteThis skill uses the workspace's default tool permissions.
> Single command to run any radar skill or the full audit sequence.
Aggregates 5 companion radar skills plus 5 grep domains for unified A-F codebase grading and ship/no-ship decisions. Tracks velocity, diffs audits, and celebrates improvements.
Runs cross-codebase quality audits using parallel specialist agents (QA, Hacker, Performance presets) for systemic bug detection after major features or periodically.
Decomposes epics into trackable tasks with Size, Urgency, Risk, ROI, Blast Radius, LOE ratings. Audit-aware (codebase reports), workflow-audit-aware (handoff.yaml), standalone modes with git safety checks.
Share bugs, ideas, or general feedback.
Single command to run any radar skill or the full audit sequence.
radar-suite-core.md Tier System for full spec)| Command | Tier | Description |
|---|---|---|
/radar-suite | 1 | Interactive menu (default: single skill) |
/radar-suite [skill] | 1 | Run specific skill (data-model, time-bomb, roundtrip, ui-path, ui-enhancer, capstone) |
/radar-suite --skills dmr,tbr | 2 | Targeted: run 2-3 skills with cross-skill handoffs |
/radar-suite --changed | 2 | Targeted: auto-select skills from git diff |
/radar-suite --changed --since YYYY-MM-DD | 2 | Targeted: auto-select from changes since date |
/radar-suite --scope [path] | 2 | Targeted: restrict audit to a directory subtree |
/radar-suite --full | 3 | Full pipeline: all 6 skills + capstone + UX enhancements |
/radar-suite full | 3 | Alias for --full (backward compatible) |
| Flag | Description |
|---|---|
--fresh | Archive prior ledger.yaml and known-intentional.yaml before this run; treat the codebase as never-before-audited. See "Fresh Scan Check" section. |
--no-fresh | Skip the fresh-scan prompt; always continue with existing state. Useful for scripted/CI runs. |
| Command | Description |
|---|---|
/radar-suite status | Show audit progress across all skills |
/radar-suite resume | Resume from last checkpoint |
/radar-suite ledger | View unified finding ledger with optional filters |
/radar-suite ledger --open | Show open findings only |
/radar-suite ledger --deferred | Show deferred findings only |
/radar-suite ledger --impact crash | Filter by impact category (crash, data-loss, ux-broken, ux-degraded, polish, hygiene) |
/radar-suite ledger --skill [name] | Filter by source skill |
/radar-suite deferred | Generate DEFERRED.md from ledger |
/radar-suite verify | Re-verify all fixed findings |
/radar-suite verify RS-NNN | Re-verify a single finding |
/radar-suite verify --changed | Re-verify only findings in changed files |
/radar-suite link RS-NNN --root-cause-of RS-NNN [RS-NNN...] | Link findings as root cause/symptom |
/radar-suite link RS-NNN --duplicate-of RS-NNN | Mark finding as duplicate |
/radar-suite link RS-NNN --supersedes RS-NNN | Mark finding as superseding another |
| Skill | Purpose | Est. Time |
|---|---|---|
| data-model-radar | Audit @Model layer for completeness, serialization, relationships | ~30-60 min |
| time-bomb-radar | Find deferred operations that crash on aged data | ~15-25 min |
| roundtrip-radar | Trace user workflows end-to-end for data safety | ~20-40 min |
| ui-path-radar | Find dead ends, broken promises, navigation issues | ~15-30 min |
| ui-enhancer-radar | Visual UI audit with design intent interview | ~20-45 min |
| capstone-radar | Aggregate grades, ship/no-ship decision | ~15-30 min |
On EVERY /radar-suite invocation, check .radar-suite/session-prefs.yaml:
If file exists AND has experience_level set: Show stored preferences and ask [Enter to continue] or type "change" to adjust settings. Then proceed to Stale-Deferred Check, then Interactive Menu.
If file does not exist OR experience_level is missing: Run full setup below before presenting the menu, fix timing, or any audit work. Do NOT skip this. Do NOT jump to exploration.
Q1 — Experience level?
Q2 — Table format?
Q3 — Fix handling?
Q4 — Explain what this skill does?
Store answers in .radar-suite/session-prefs.yaml as experience_level, table_format, fix_mode. See radar-suite-core.md for experience-level output rules.
The invocation flow is strictly:
Never skip steps 1-5. Never start exploration or scanning before completing them.
After session setup completes (step 1), write or update a memory file that captures the cross-cutting rules most commonly violated during long sessions. This memory survives context compression and is re-loaded from disk on every session.
File: Write to the project's auto-memory directory (the same location used by the auto memory system). The file name is radar_suite_execution_rules.md.
Content (write exactly this, substituting session prefs):
---
name: Radar Suite execution rules
description: Auto-generated rules for radar-suite display and behavior. Re-read before every AskUserQuestion.
type: feedback
---
1. 9-column table at every decision point: #, Finding, Urgency, Risk:Fix, Risk:No Fix, ROI, Blast Radius, Fix Effort, Status. Omit Status on first display only. Include on every re-display. Skip if TABLE_FORMAT = none.
2. Finding IDs always include short_title: RS-NNN (short description), never bare RS-NNN.
3. Progress banner after every wave, phase, or commit. Never leave a blank prompt. Always follow with the rating table (per rule 1), then AskUserQuestion.
4. Recommend fixing over deferring when effort <= Medium and finding is in scope.
5. Session prefs: experience=[USER_EXPERIENCE], tables=[TABLE_FORMAT], fixes=[FIX_MODE]. Re-read .radar-suite/session-prefs.yaml if unsure.
6. Enumerate-then-verify: any domain grade must cite files read and patterns checked. "Looks clean" without grep is a failing grade for the auditor.
Rules:
[USER_EXPERIENCE], [TABLE_FORMAT], [FIX_MODE] with actual values from session-prefs.yaml- [Radar Suite execution rules](radar_suite_execution_rules.md) -- auto-generated display and behavior rulesOn invocation without arguments, present:
Radar Suite — What would you like to audit?
SINGLE SKILL (Tier 1 — quick, focused)
1. Data models — @Model layer gaps and inconsistencies (~30-60 min)
2. Time bombs — Deferred operations that crash on aged data (~15-25 min)
3. User workflows — Data through complete user journeys (~20-40 min)
4. Navigation paths — Dead ends and broken navigation (~15-30 min)
5. UI polish — Visual audit of specific views (~20-45 min)
TARGETED (Tier 2 — 2-3 skills with cross-skill handoffs)
6. Auto-select from changes — skills chosen by git diff
7. Pick skills — choose 2-3 skills manually
FULL PIPELINE (Tier 3 — all skills + capstone)
8. Full audit — all 6 skills in sequence (~2.5-4 hours)
OTHER
9. Release readiness — Capstone only (aggregate existing findings)
10. Resume / Status / Ledger
Menu routing:
tier: 1 in session prefs, invoke the single skill directly.--changed auto-selection logic (see below).tier: 2.tier: 3, run Full Audit Sequence.Before starting any audit, ask the user when fixes should be applied. Use AskUserQuestion with this question:
"When should findings be fixed?"
| Option | Description |
|---|---|
| Fix recommended after each skill (Recommended) | After each skill completes, fix findings that are high urgency + low effort + small blast radius. Defer the rest to a post-capstone fix session. Best balance of momentum and thoroughness. |
| Fix all after each skill | Fix every finding before moving to the next skill. Thorough but slower — you may fix issues that capstone would deprioritize. |
| Fix all after capstone | Run all 5 skills first for the complete picture, then fix everything in one focused session using the capstone report as a punch list. Fastest audit but largest fix backlog. |
When the user selects "Fix recommended after each skill," the skill determines which findings to fix immediately vs. defer using these rules:
Fix now (all three must be true):
urgency >= HIGHfix_effort is trivial or smallblast_radius <= 2 filesDefer to post-capstone:
After capstone-radar completes, always present the deferred findings as a fix backlog:
Deferred.md with ratingsThis ensures no finding is silently dropped. Every deferred item either gets fixed or explicitly saved.
Save the user's choice in .radar-suite/session-prefs.yaml as fix_timing: recommended | all_per_skill | all_after_capstone. Each individual skill reads this to know whether to enter fix mode after scanning.
After session setup completes and the execution rules memory is written, but before the Stale-Deferred Check reads .radar-suite/ledger.yaml, offer the user the option to archive prior radar-suite state and run from a clean slate.
Skip the question entirely if:
.radar-suite/ledger.yaml does not exist (this is already a fresh project — nothing to archive)--fresh flag (decision already made; go straight to archiving)--no-fresh flag (explicit opt-out)Otherwise, ask via a single AskUserQuestion:
Question (header: "Fresh scan"): "Run from a clean slate? Your current ledger has [N] open findings, [M] deferred, [K] fixed, plus [P] entries in known-intentional.yaml."
Options:
- "No, keep existing state (Recommended)" — continue normally; prior findings, accepted risks, and known-intentional suppressions remain in effect
- "Yes, archive and start fresh" — move ledger.yaml + known-intentional.yaml to .radar-suite/archive/, then run as if this were a brand-new project
- "Show me what's in the ledger first" — display a summary, then re-ask
Populate the counts by reading the existing ledger.yaml and known-intentional.yaml if they exist. If a count is zero, omit that fragment from the question text.
When the user opts in, perform these operations atomically before any other step proceeds:
STAMP=$(date +%Y-%m-%d-%H%M%S)mkdir -p .radar-suite/archive/.radar-suite/ledger.yaml → .radar-suite/archive/ledger-pre-fresh-${STAMP}.yaml.radar-suite/known-intentional.yaml → .radar-suite/archive/known-intentional-pre-fresh-${STAMP}.yaml.radar-suite/session-prefs.yaml — user's preferences are not audit data and stay in effect.radar-suite/checkpoint.yaml — separate concern (resume vs. fresh are different operations).radar-suite/{skill}-handoff.yaml — within-run pipeline files, not cross-run state. Will be overwritten naturally..radar-suite/archive/* — the archive itself stays untouched✓ Archived prior state to .radar-suite/archive/ledger-pre-fresh-2026-04-30-061500.yaml and known-intentional-pre-fresh-2026-04-30-061500.yaml. Starting fresh.
Render a compact summary:
Current radar-suite state:
Open findings: [N] ← will be re-derived from scratch on a fresh scan
Deferred findings: [M] ← will need to be re-deferred manually
Fixed findings: [K] ← reintroduction detection will be lost; fingerprints reset
Accepted risks: [A] ← will need to be re-accepted
Known-intentional: [P] ← will need to be re-confirmed; expect more false positives initially
Archive location on archive: .radar-suite/archive/ledger-pre-fresh-YYYY-MM-DD-HHMMSS.yaml
Then re-ask the original question (without the "Show me" option this time, to prevent loops).
Both flags work on any invocation, regardless of which command follows:
| Flag | Effect |
|---|---|
/radar-suite --fresh [...] | Skip the question. Always archive and start fresh. Useful for power users and scripted runs. |
/radar-suite --no-fresh [...] | Skip the question. Always keep existing state. Useful when you want to make sure no archive happens (e.g., in a git pre-commit hook). |
If both flags are passed, --no-fresh wins. Log a one-line warning.
archive/ is permanent unless the user manually clears it.If a user changes their mind after a fresh scan, they can restore the prior state by hand:
mv .radar-suite/archive/ledger-pre-fresh-YYYY-MM-DD-HHMMSS.yaml .radar-suite/ledger.yaml
mv .radar-suite/archive/known-intentional-pre-fresh-YYYY-MM-DD-HHMMSS.yaml .radar-suite/known-intentional.yaml
This is intentionally a manual operation — automating "undo a fresh scan" inside radar-suite would create a confusing two-history-streams problem. The archive is the source of truth; mv is the API.
At every /radar-suite invocation (any command), read .radar-suite/ledger.yaml and check for deferred findings past their review_by date:
⚠️ 3 deferred findings are past their review date:
RS-002 [CRITICAL] Cascade delete crash — review by Apr 8 (overdue 7 days)
RS-011 [MEDIUM] DonationRecord FMV — review by Apr 10 (overdue 5 days)
RS-019 [LOW] Spacing in SettingsView — review by Apr 12 (overdue 3 days)
Review now? [Yes / Snooze 7 days / Dismiss]
On "Yes": Present each overdue finding with options: Fix now, Re-defer (with new review date), Accept risk, Dismiss.
On "Snooze": Update review_by to today + 7 days for all overdue findings.
On "Dismiss": Proceed without reviewing. The check will fire again next invocation.
/radar-suite deferred generates a markdown file from the ledger:
# Deferred Findings
Auto-generated from .radar-suite/ledger.yaml. Do not edit directly.
Generated: 2026-04-08
| ID | Finding | Impact | Severity | Release Gate | Review By | Age |
|----|---------|--------|----------|-------------|-----------|-----|
| RS-002 | Cascade delete crash | crash | CRITICAL | pre-release | Apr 8 ⚠️ OVERDUE | 30d |
| RS-011 | DonationRecord FMV | data-loss | MEDIUM | post-release | Apr 10 | 28d |
| RS-019 | Spacing in SettingsView | polish | LOW | next-major | May 8 | 14d |
Overdue items are marked with ⚠️ OVERDUE.
Age is calculated from discovered date.
The file is written to the project root as DEFERRED.md (or .radar-suite/DEFERRED.md if the project root is not appropriate).
/radar-suite link creates relationships between findings in the ledger.
/radar-suite link RS-002 --root-cause-of RS-003 RS-004 RS-005
/radar-suite link RS-009 --duplicate-of RS-007
/radar-suite link RS-015 --supersedes RS-001
/radar-suite link RS-010 --symptom-of RS-002
When linking --root-cause-of, the system records the relationship so that when the root cause is later marked fixed, all symptoms automatically move to pending_recheck. See Finding Relationships in radar-suite-core.md.
/radar-suite verify re-verifies fixed findings to catch regressions.
.radar-suite/ledger.yamlfixedshasum -a 256)fixed.file_hash_at_fixfixed.verification_pattern
As part of verification, also check .radar-suite/known-intentional.yaml for orphaned entries:
file path still exists (glob match)Orphaned known-intentional entries:
KI-003: Sources/Old/RemovedFile.swift — file no longer exists
KI-007: Sources/Legacy/*.swift — no matching files
Options:
1. **Remove orphaned entries (Recommended)**
2. **Keep all** — leave for manual review
═══════════════════════════════════════════════
RADAR SUITE VERIFY — [N] fixed findings checked
═══════════════════════════════════════════════
✓ RS-001 CSVManager.swift — still fixed (file unchanged)
✓ RS-003 BackupManager.swift — still fixed (re-verified)
✗ RS-014 PhotoManager.swift — REGRESSION DETECTED (force unwrap returned)
⚠ RS-019 SafeDeletionManager.swift — needs manual review (no grep pattern)
Summary: [N] confirmed, [N] regressions, [N] need manual review
Options:
1. **Fix regressions now (Recommended)** — address the [N] reopened findings
2. **Show regression details** — see what changed in each file
3. **Done** — exit verification
--skills)When --skills is provided:
radar-suite-core.md (dmr, tbr, rtr, upr, uer).tier: 2 and tier_skills: [abbreviations] in .radar-suite/session-prefs.yaml.radar-suite-core.md Pipeline UX Enhancements).--changed)git diff --name-only against the base branch (default: main). If --since YYYY-MM-DD is provided, use git diff --name-only HEAD@{YYYY-MM-DD} instead.radar-suite-core.md to map changed file patterns to skill abbreviations.--scope)When --scope [path] is provided, restrict all skill scans to files within the specified directory subtree. This narrows the audit without changing tier behavior. Can be combined with --skills or --changed.
Triggered by /radar-suite --full, /radar-suite full, or menu option 8. Sets tier: 3 in session prefs.
Execute skills in this order:
Apply all 6 pipeline UX enhancements from radar-suite-core.md:
RS-002 (cascade delete crash)).Between skills: Write handoff YAML, emit pipeline-level progress banner, present fixes per fix timing preference, ask to continue or pause.
On pause: Save checkpoint so user can resume later.
Show audit progress across all skills:
Radar Suite Status:
Fix timing: Fix recommended after each skill
| Skill | Last Run | Findings | Fixed | Deferred |
|-------|----------|----------|-------|----------|
| data-model-radar | 2 days ago | 12 | 10 | 2 |
| roundtrip-radar | 2 days ago | 8 | 6 | 2 |
| ui-path-radar | not run | — | — | — |
| ui-enhancer-radar | not run | — | — | — |
| capstone-radar | not run | — | — | — |
Deferred backlog: 4 findings awaiting post-capstone fix session
Next recommended: ui-path-radar
/radar-suite ledger displays findings from .radar-suite/ledger.yaml -- the unified cross-skill finding store.
| Flag | Description |
|---|---|
--open | Show open findings only |
--deferred | Show deferred findings only |
--fixed | Show fixed findings only |
--accepted | Show accepted findings only |
--impact [category] | Filter by impact category: crash, data-loss, ux-broken, ux-degraded, polish, hygiene |
--skill [name] | Filter by source skill (e.g., roundtrip-radar) |
--severity [level] | Filter by severity: CRITICAL, HIGH, MEDIUM, LOW |
═══════════════════════════════════════════════
RADAR SUITE LEDGER — [N] findings ([N] open, [N] fixed, [N] deferred)
Last session: [skill] on [date]
═══════════════════════════════════════════════
CRASH RISK ([N] findings)
RS-002 [CRITICAL] Cascade delete on archived items (time-bomb-radar) — open
RS-014 [HIGH] Force unwrap on nil photo data (roundtrip-radar) — fixed 2026-04-10
DATA LOSS ([N] findings)
RS-001 [HIGH] CSV export drops Room and UPC (roundtrip-radar) — open
RS-007 [HIGH] InsuranceProfile not in backup (data-model-radar) — deferred (review by May 8)
UX BROKEN ([N] findings)
RS-009 [HIGH] Settings > Export has no back button (ui-path-radar) — fixed 2026-04-09
POLISH ([N] findings)
...
Options:
1. **Filter** — apply additional filters
2. **Details [RS-NNN]** — show full finding details with history
3. **Fix [RS-NNN]** — mark a finding as fixed
4. **Defer [RS-NNN]** — defer a finding with reason and review date
5. **Done** — exit ledger view
/radar-suite ledger RS-001 shows full details:
RS-001 [HIGH] CSV export drops Room and UPC columns on import
Status: open
Impact: data-loss
Source: roundtrip-radar (also flagged by: data-model-radar)
File: Sources/Managers/CSVManager.swift:142
Confidence: verified
Evidence: grep confirmed importCSV reads 25 fields, exportCSV writes 27
Discovered: 2026-04-08
Related: RS-007, RS-011
History:
2026-04-08 discovered by roundtrip-radar
2026-04-08 also flagged by data-model-radar
If .radar-suite/ledger.yaml doesn't exist:
No finding ledger found. Run an audit skill to create one.
Recommended: /radar-suite full (run all skills) or /radar-suite data-model (start with foundation)
Each skill writes .radar-suite/[skill]-handoff.yaml on completion.
Capstone-radar reads all handoffs to:
See radar-suite-core.md for: Experience-Level Output Rules, Session Persistence, Checkpoint & Resume, Accepted Risks, Wave-Based Fix Presentation, Table Format, Issue Rating Tables, Unified Finding Ledger Protocol.