From workflow-audit
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.
npx claudepluginhub terryc21/workflow-audit --plugin workflow-auditThis skill is limited to using the following tools:
> **Quick Ref:** Mode detect → ingest or analyze → interactive input → understand → size → impact → phased plan → risk → test → rollback → write → proceed.
Creates detailed implementation plans with file-level changes, test strategies, quantified estimates, and strict TDD order (docs→tests→impl) for features, refactors, and bug fixes.
Creates specs and phased file-level implementation plans for features, bugs, refactors by researching codebase with search, graph queries, and context files.
Share bugs, ideas, or general feedback.
Quick Ref: Mode detect → ingest or analyze → interactive input → understand → size → impact → phased plan → risk → test → rollback → write → proceed.
YOU MUST EXECUTE THIS WORKFLOW. Do not just describe it.
Required output: Every task MUST include Size, Urgency, Risk, ROI, Blast Radius, and LOE ratings. Do not omit these ratings.
Rating format: See
radar-suite-core.mdfor column definitions, indicator scale, and table formatting rules.
git status --short
If uncommitted changes exist:
AskUserQuestion with questions:
[
{
"question": "You have uncommitted changes. Commit before proceeding?",
"header": "Git",
"options": [
{"label": "Commit first (Recommended)", "description": "Save current work so you can revert if this skill modifies files"},
{"label": "Continue without committing", "description": "Proceed — I accept the risk"}
],
"multiSelect": false
}
]
If "Commit first": Ask for a commit message, stage changed files, and commit. Then proceed.
Plans describe WHAT to change and WHERE — never HOW.
A plan task says: "Add keyboard dismissal to AddItemView.swift:45-80 and EditItemView.swift:32-60. Acceptance: tapping outside any text field dismisses the keyboard."
A plan task does NOT say: "Add
.onTapGesture { UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder)...) }"Exception: Include code (≤10 lines) ONLY when referencing an existing pattern in the repo, showing a required API signature, or documenting a known framework gotcha. See examples.md for calibration.
Detect which mode to run in: audit-aware, workflow-audit-aware, or standalone.
# Check for codebase audit reports
Glob pattern=".agents/research/*-codebase-audit.md"
Glob pattern=".agents/research/*-tech-reportcard.md"
# Check for workflow audit handoff
Glob pattern=".workflow-audit/handoff.yaml"
Decision logic:
| Condition | Mode |
|---|---|
User passes --workflow-audit | Workflow-audit-aware (error if no handoff found) |
| User specifies audit mode | Audit-aware (error if no report found) |
| User specifies standalone mode | Standalone (ignore all reports) |
.workflow-audit/handoff.yaml found AND audit_date <14 days | Workflow-audit-aware |
| Codebase audit report found AND <14 days old | Audit-aware |
| Report found AND ≥14 days old | Standalone (warn: "Stale audit report found — run /codebase-audit for fresh data") |
| Both workflow-audit and codebase-audit found | Workflow-audit-aware takes priority (more specific) |
| No report found | Standalone |
Parse the report filename date: YYYY-MM-DD-codebase-audit.md or YYYY-MM-DD-tech-reportcard.md.
Parse audit_date from handoff.yaml for workflow-audit mode.
If multiple reports exist, use the most recent one.
Mode summary:
| Mode | Source | Ratings Pre-computed? | Convention Scan? |
|---|---|---|---|
| Audit-aware | .agents/research/*-codebase-audit.md | No — extract and rate | No — uses audit context |
| Workflow-audit-aware | .workflow-audit/handoff.yaml | Yes — use as-is | Yes — if no CLAUDE.md |
| Standalone | User-provided task description | No — rate from scratch | Yes — if no CLAUDE.md |
Output:
## Mode: [Audit-Aware / Workflow-Audit-Aware / Standalone]
Report: [filename or "none"]
Report age: [N days or "n/a"]
Staleness warnings: [count or "none"]
Skip this step in standalone mode — go to Step 2B.
Read the audit report and extract structured data.
Read file_path=".agents/research/[report-filename]"
Look for the GRADES_YAML HTML comment block first:
<!-- GRADES_YAML
categories:
- name: Architecture
score: 91
grade: A-
...
-->
If no YAML block, fall back to parsing the grade summary line:
**Overall: B+ (84)** (Arch A- [91] | Security C+ [77] | ...)
Scan the report for the prioritized findings list. Each finding should have:
| Condition | What to extract |
|---|---|
| Incomplete (I) grade | Category name + trigger description + file:line |
| DO NOT SHIP recommendation | All blocker items listed under the recommendation |
| CRITICAL findings | Full finding details |
## Report Digest
| Source | Date | Overall Grade |
|--------|------|---------------|
| [codebase-audit / tech-reportcard] | [date] | [grade] |
### Incomplete Triggers (if any)
| Category | Trigger | File |
|----------|---------|------|
| [category] | [description] | [file:line] |
### Ship Recommendation
[SHIP / CONDITIONAL SHIP / DO NOT SHIP] — [reason]
### Top Issues
| # | Category | Severity | Issue | File | LOE |
|---|----------|----------|-------|------|-----|
| 1 | [cat] | CRITICAL | [desc] | [file:line] | [Xh] |
| 2 | [cat] | HIGH | [desc] | [file:line] | [Xh] |
| ... | | | | | |
Skip this step in audit-aware mode — audit already did this work.
Base all analysis on current source code only. Do not read or reference
files in .agents/, scratch/, or prior audit reports (those are ingested
in Step 2A only). Every finding must come from scanning the actual codebase
as it exists now.
Scan the codebase for context relevant to the planned work:
# Find files related to the feature area
Glob pattern="**/*FeatureName*.swift"
Grep pattern="FeatureKeyword" glob="**/*.swift" output_mode="files_with_matches"
# Find existing patterns to follow
Grep pattern="class.*ViewModel|struct.*View.*body" glob="**/*.swift" output_mode="files_with_matches"
# Find dependencies that will be affected
Grep pattern="import.*ModuleName|ModuleName\\." glob="**/*.swift" output_mode="files_with_matches"
# Find test files for affected areas
Glob pattern="Tests/**/*FeatureName*Tests.swift"
Produce:
| File/Module | Relevance | Notes |
|---|---|---|
| [path] | High/Med/Low | [How it relates] |
| Pattern | Example Location | Apply To |
|---|---|---|
| [Pattern name] | [File path] | [Where to use] |
| This Feature Depends On | Type |
|---|---|
| [Module/file] | Required/Optional |
| This Feature Will Affect | Impact |
|---|---|
| [Module/file] | High/Med/Low |
Skip this step in audit-aware or standalone mode.
Read the workflow audit handoff brief and ingest pre-rated findings.
Read file_path=".workflow-audit/handoff.yaml"
Extract:
project, audit_date, source_files_scannedsummary counts (critical/high/medium/low)issues[] with their pre-computed ratingsRatings are pre-computed — do NOT re-rate issues from the handoff brief. The audit skill already applied the rating system. Use the ratings as-is for planning.
Compare file_timestamps from the handoff against current file modification dates:
# For each file in file_timestamps, check if it changed
stat -f "%Sm" -t "%Y-%m-%dT%H:%M:%SZ" "<file path>"
If files changed since audit:
If audit_date >14 days old:
/workflow-audit for fresh data"Read group_hint values from issues. Use them as suggestions for task grouping in Step 7:
group_hint are candidates for a single task## Handoff Digest
| Field | Value |
|-------|-------|
| Project | [name] |
| Audit Date | [date] |
| Files Scanned | [count] |
| Total Issues | [count] |
### Issue Summary (from audit)
| # | Finding | Urgency | Risk: Fix | Risk: No Fix | ROI | Blast Radius | Fix Effort | Group Hint | Stale? |
|---|---------|---------|-----------|--------------|-----|--------------|------------|------------|--------|
| 1 | [finding] | [urgency] | [risk_fix] | [risk_no_fix] | [roi] | [blast] | [effort] | [hint] | [Yes/No] |
### Staleness Warnings (if any)
| File | Audit Date | Current Date | Affected Issues |
|------|------------|--------------|-----------------|
| [path] | [date] | [date] | #1, #4 |
Skip in audit-aware mode (codebase audit provides enough context). Skip if project has a comprehensive CLAUDE.md (>100 lines with code patterns).
Detect project conventions automatically when no CLAUDE.md is available:
# Platform targets
grep -r "#if os(" Sources/ | head -5
# Data framework
grep -rl "@Model" Sources/ | head -3 # SwiftData
grep -rl "NSManagedObject" Sources/ | head -3 # CoreData
grep -rl "GRDB" Sources/ | head -3 # GRDB
# Feedback patterns
grep -rl "HapticManager\|UINotificationFeedbackGenerator" Sources/ | head -3
grep -rl "ToastManager\|toast\|snackbar" Sources/ | head -3
# Confirmation patterns
grep -rl "\.alert.*destructive\|confirmationDialog" Sources/ | head -3
# Navigation pattern
grep -rl "NavigationSplitView\|TabView\|NavigationStack" Sources/ | head -3
Display before planning begins:
## Detected Conventions
| Convention | Detected | Evidence |
|------------|----------|----------|
| Platforms | iOS + macOS | `#if os(iOS)` in 45 files |
| Data Framework | SwiftData | `@Model` in 12 files |
| Haptic Feedback | Yes | `HapticManager` in 8 files |
| Toast/Notifications | Yes | `ToastManager` in 15 files |
| Confirmation Dialogs | Yes | `.alert` with destructive in 22 files |
| Navigation | NavigationSplitView + TabView | Split view in 3 files, TabView in 1 |
This informs fix planning (e.g., "this project uses HapticManager, so feedback fixes should use it too").
IMPORTANT: Use AskUserQuestion to gather requirements.
AskUserQuestion with questions:
[
{
"question": "What type of work are you planning?",
"header": "Work Type",
"options": [
{"label": "New feature", "description": "Adding new functionality to the app"},
{"label": "Bug fix / improvement", "description": "Fixing issues or enhancing existing features"},
{"label": "Refactoring", "description": "Restructuring code without changing behavior"},
{"label": "Audit remediation", "description": "Fixing findings from a codebase audit or report card"}
],
"multiSelect": false
},
{
"question": "What is your risk tolerance?",
"header": "Risk",
"options": [
{"label": "Conservative", "description": "Minimize risk, smaller incremental changes"},
{"label": "Balanced", "description": "Reasonable risk for reasonable gains"},
{"label": "Aggressive", "description": "Accept higher risk for faster delivery"}
],
"multiSelect": false
},
{
"question": "What is your timeline?",
"header": "Timeline",
"options": [
{"label": "Urgent (days)", "description": "Must ship this week"},
{"label": "Normal (1-2 weeks)", "description": "Standard development cycle"},
{"label": "Flexible (weeks+)", "description": "No immediate deadline"}
],
"multiSelect": false
}
]
After the common questions, also ask:
AskUserQuestion with questions:
[
{
"question": "What scope should the plan cover?",
"header": "Scope",
"options": [
{"label": "Blockers only", "description": "Incomplete triggers + DO NOT SHIP items only"},
{"label": "Top 10 issues", "description": "The 10 highest-priority findings from the report"},
{"label": "All findings", "description": "Comprehensive plan covering every finding"},
{"label": "Pick specific items", "description": "I'll choose which findings to include"}
],
"multiSelect": false
}
]
If "Pick specific items" is selected, present the numbered findings list and ask which to include.
In standalone mode, ask for the feature/task description if not already provided via command arguments.
| Aspect | Details |
|---|---|
| What | [Restate the feature/task in your own words] |
| Why | [User benefit or business value] |
| Scope | [What's included and excluded] |
| # | As a... | I want... | So that... |
|---|---|---|---|
| 1 | [user type] | [capability] | [benefit] |
| 2 | [user type] | [capability] | [benefit] |
| # | Criterion | How to Verify |
|---|---|---|
| 1 | [What must be true] | [Test or check] |
| 2 | [What must be true] | [Test or check] |
| # | Category | Issue | Urgency | Risk | ROI | Blast | LOE | Blocker? |
|---|---|---|---|---|---|---|---|---|
| 1 | [cat] | [short description] | H/M/L | H/M/L | H/M/L | H/M/L | [Xh] | Yes/No |
| 2 | [cat] | [short description] | H/M/L | H/M/L | H/M/L | H/M/L | [Xh] | Yes/No |
Blocker? = Yes if the finding is an Incomplete trigger or DO NOT SHIP item.
Apply T-shirt sizes to every task before building the phased plan.
| Size | Files Touched | Typical Scope | Target |
|---|---|---|---|
| S | 1-2 files | Single fix, one-liner, config change | Combine sequential S tasks into one work unit |
| M | 3-5 files | Feature area fix, cross-cutting concern | Ideal task size — most tasks should be M |
| L | 5+ files | Architectural change, multi-system refactor | Split into 2-3 M tasks |
ItemListView.swift, combine them or reorder to eliminate conflicts.After sizing, annotate each task:
Task: "Add keyboard dismissal to item entry forms"
Size: M (4 files: AddItemView, EditItemView, AddItemViewModel, EditItemViewModel)
| Area | Files Affected | Risk Level | Notes |
|---|---|---|---|
| Models | [list] | High/Med/Low | [details] |
| ViewModels | [list] | High/Med/Low | [details] |
| Views | [list] | High/Med/Low | [details] |
| Services/Managers | [list] | High/Med/Low | [details] |
| Tests | [list] | High/Med/Low | [details] |
In audit-aware mode, populate this table from the report findings. Group findings by area and aggregate risk levels.
Include Phase A: Blockers as the first phase if there are Incomplete triggers or DO NOT SHIP items.
| Phase | # | Task | Size | Files | Urgency | Risk | ROI | Blast | LOE | Depends On |
|---|---|---|---|---|---|---|---|---|---|---|
| A: Blockers | 1 | [Incomplete trigger / DO NOT SHIP fix] | M | [files] | Critical | H | H | [scope] | [Xh] | - |
| A: Blockers | 2 | [Next blocker fix] | M | [files] | Critical | H | H | [scope] | [Xh] | - |
| B: High Priority | 3 | [HIGH severity fix] | M | [files] | H | M | H | [scope] | [Xh] | Phase A |
| B: High Priority | 4 | [HIGH severity fix] | M | [files] | H | M | H | [scope] | [Xh] | Task 3 |
| C: Medium Priority | 5 | [MEDIUM finding] | M | [files] | M | M | M | [scope] | [Xh] | Phase B |
| D: Low / Polish | 6 | [LOW finding / improvement] | S | [files] | L | L | M | [scope] | [Xh] | - |
Each task row MUST include:
Same table structure, but no Phase A: Blockers. Use standard phasing:
| Phase | # | Task | Size | Files | Urgency | Risk | ROI | Blast | LOE | Depends On |
|---|---|---|---|---|---|---|---|---|---|---|
| A: Foundation | 1 | [Foundation task] | M | [files] | H | L | H | [scope] | [Xh] | - |
| B: Core Logic | 2 | [Core implementation] | M | [files] | H | M | H | [scope] | [Xh] | Phase A |
| C: UI Integration | 3 | [UI work] | M | [files] | M | M | H | [scope] | [Xh] | Phase B |
| D: Polish | 4 | [Polish / edge cases] | S | [files] | L | L | M | [scope] | [Xh] | Phase C |
In audit-aware and workflow-audit-aware modes, every task MUST trace back to its source finding(s):
Task 3: "Fix actor isolation in BackgroundSyncManager"
Source: Audit finding #4 (Concurrency, HIGH)
Size: M (3 files: BackgroundSyncManager.swift, SyncService.swift, SyncServiceTests.swift)
Task 2: "Add confirmation dialogs to 5 destructive actions"
Source: Workflow-audit issues #3, #5, #8, #11, #14 (missing_confirmations)
Size: M (5 files)
Stale: No
Group related findings into single M-sized tasks where they share the same files or logical area. Do NOT create one task per finding — combine related findings. In workflow-audit mode, use group_hint as a starting point for grouping.
| Risk | Likelihood | Impact | Mitigation | Phase |
|---|---|---|---|---|
| [Risk description] | High/Med/Low | High/Med/Low | [How to mitigate] | [Which phase] |
In audit-aware mode, seed this table from cross-domain correlations in the report (e.g., concurrency issues that affect data persistence).
| Test Type | What to Test | Priority | Phase |
|---|---|---|---|
| Unit | [Functionality] | High/Med/Low | [Phase letter] |
| Integration | [Functionality] | High/Med/Low | [Phase letter] |
| UI | [Functionality] | High/Med/Low | [Phase letter] |
The Phase column ties each test to its implementation phase — tests for Phase A tasks are written/run during Phase A.
| Phase | Scenario | Rollback Action |
|---|---|---|
| [Phase letter] | [What could go wrong] | [How to undo] |
Per-phase rollback ensures each phase can be independently reverted if needed.
Display the full implementation plan inline (mode, digest/analysis, feature spec, sizing, impact, phased plan, risks, test plan, rollback), then write to .agents/research/ for future reference:
Write file_path=".agents/research/YYYY-MM-DD-implementation-plan.md" content="[full plan output]"
Use today's date. Include all tables, the mode header, and the report digest (if audit-aware).
| Deliverable | Status |
|---|---|
| Mode detection | Done |
| Report digest (audit) / Codebase analysis (standalone) | Done |
| Feature spec / Issue summary | Done |
| T-shirt sizing | Done |
| Impact analysis | Done |
| Phased implementation plan | Done |
| Risk assessment | Done |
| Test plan | Done |
| Rollback strategy | Done |
| Written to file | Done |
AskUserQuestion with questions:
[
{
"question": "How would you like to proceed?",
"header": "Action",
"options": [
{"label": "Start Phase A", "description": "Begin implementation with the first phase"},
{"label": "Refine the plan", "description": "Discuss or adjust before starting"},
{"label": "Save for later", "description": "Plan is saved — pick it up anytime"}
],
"multiSelect": false
}
]
User: "/plan add search feature"
Step 1: Mode = Standalone (no audit reports found)
Step 2B: Codebase analysis — found ItemListView, ItemListViewModel, Item model
Step 3: Work type = New feature, Risk = Balanced, Timeline = Normal
Step 4: Feature spec — search bar filtering items by title, category, notes
Step 5: T-shirt sizing — M (4 files: ItemListView, ItemListViewModel, Item+Search, SearchTests)
Step 6: Impact — Views (1 file), ViewModels (1 file), Models (1 extension), Tests (1 file)
Step 7: Plan
Phase A: Add searchText @State + .searchable to ItemListView (M, 3 files)
Phase B: Unit tests for filter matching (S, 1 file)
Step 8: Risk — Low (additive change)
Step 9: Tests — Unit: filter matching, empty query, case sensitivity (Phase A)
Step 10: Rollback — Revert .searchable modifier, remove filter computed property
Step 11: Written to .agents/research/2026-02-25-implementation-plan.md
Step 12: Ready to proceed?
| Problem | Solution |
|---|---|
| Can't find audit report | Check .agents/research/ for *-codebase-audit.md or *-tech-reportcard.md |
| Report is stale (>14 days) | Run /codebase-audit or /tech-talk-reportcard first, then re-plan |
| Too many findings to plan | Use "Blockers only" or "Top 10 issues" scope to focus |
| Tasks too large (L-sized) | Split along natural boundaries: model/view/test, or by sub-feature |
| Dependencies between phases unclear | Draw the dependency chain from data model → service → viewmodel → view |
| User unclear on scope | Use standalone mode with AskUserQuestion to clarify iteratively |
User: "/plan --audit" (recent codebase-audit report exists)
Step 1: Mode = Audit-Aware, Report: 2026-02-20-codebase-audit.md (5 days old)
Step 2A: Report Digest
Overall: C+ (77), Incomplete in Security (hardcoded API key)
Ship: DO NOT SHIP
Top 10: 2 CRITICAL, 3 HIGH, 5 MEDIUM
Step 3: Work type = Audit remediation, Risk = Conservative, Scope = Top 10 issues
Step 4: Issue Summary — 10 rows with Urgency/Risk/ROI/Blast/LOE, 1 blocker
Step 5: T-shirt sizing — grouped into 6 M-sized tasks + 1 S task
Step 6: Impact — Models (2 files), Services (3 files), Views (4 files), Tests (3 files)
Step 7: Plan
Phase A: Blockers — Remove hardcoded API key, move to Keychain (M, 3 files)
Phase B: High — Fix actor isolation in SyncManager, add missing @MainActor (M, 4 files)
Phase C: Medium — Add accessibility labels, fix Dynamic Type (M, 5 files → split into 2 tasks)
Step 8: Risk — Keychain migration could break existing users (Phase A, mitigate with fallback read)
Step 9: Tests — Unit: Keychain wrapper (A), actor isolation (B), accessibility (C)
Step 10: Rollback — Phase A: revert Keychain, restore inline key. Phase B: revert actor changes.
Step 11: Written to .agents/research/2026-02-25-implementation-plan.md
Step 12: Ready to proceed?