status-audit
/status-audit — Story Status Reconciliation
CRITICAL EXECUTION RULE: Do NOT spawn sub-agents (Task tool) for this skill. Call all MCP tools and Bash commands directly in the main conversation. Sub-agents do not have reliable access to the knowledge-base MCP server.
Usage
/status-audit [--fix] [--epic=platform] [--story=STORY-ID]
Examples:
/status-audit # Full audit of all platform stories (report only)
/status-audit --fix # Audit + apply all KB corrections
/status-audit --story=KBAR-0040 # Audit a single story
/status-audit --epic=platform --fix # Audit + fix all platform stories
What It Does
Performs a five-part audit and optionally fixes all detected issues:
| Section | What It Checks |
|---|---|
| A. Legacy Stage Directories | Stories that still exist in old-style stage dirs (backlog/, in-progress/, etc.) — flags for migration to flat stories/ layout |
| B. KB State Mismatch | Stories in flat stories/ on disk vs KB state field — flags stories on disk not in KB, and vice versa |
| C. Orphaned Worktrees | Active git worktree list entries vs worktree_list_active KB records |
| D. Deferred KB Writes | DEFERRED-KB-WRITES.yaml files on disk that were never processed |
| E. Artifact Sync | Key artifacts on disk (CHECKPOINT.yaml, EVIDENCE.yaml, QA-VERIFY.yaml) vs KB artifact records |
Source of truth: The KB is the authoritative source for story state. Filesystem directories are for artifact storage only — status is never inferred from directory location.
Execution Steps
Step 0 — Parse Arguments
Extract --fix flag, --epic (default: platform), --story (optional single story filter).
Step 1 — Git Worktree Scan
Run via Bash tool:
git worktree list
Parse output into a map: { path → branch }. Extract story IDs from branch names matching pattern story/STORY-ID or story/STORY-ID-*.
Example:
/repo/tree/story/KBAR-0050 e2d613a4 [story/KBAR-0050] → KBAR-0050
/repo/tree/story/WINT-1120 56f9fede [story/WINT-1120] → WINT-1120
Store as GIT_WORKTREES: { storyId → { path, branch, commit } }
Step 2 — KB Worktree Query
Call MCP tool directly:
mcp__knowledge-base__worktree_list_active({})
→ KB_WORKTREES: { storyId → { path, branch, status } }
If tool fails, set KB_WORKTREES = {} and note in output.
Step 3 — Filesystem Scan
Scan A: Flat stories/ directories (canonical)
Run via Bash tool to find all story directories in the flat layout:
find plans/future/platform -type d \
-regextype posix-extended \
-regex '.*/stories/[A-Z]+-[0-9]+$'
For each path found, extract:
story_id: last path segment (e.g.,KBAR-0040)story_path: full path (e.g.,plans/future/platform/wint/stories/KBAR-0040)
Store as DISK_STORIES: { storyId → { story_path } }
Scan B: Legacy stage directories (flag for migration)
Run via Bash tool to find stories still in old-style stage directories:
find plans/future/platform -mindepth 2 -maxdepth 5 -type d \
-regextype posix-extended \
-regex '.*/(backlog|created|elaboration|ready-to-work|in-progress|needs-code-review|failed-code-review|ready-for-qa|failed-qa|UAT|completed)/[A-Z]+-[0-9]+$'
For each path found, extract:
story_id: last path segmentstage_dir: parent directory namelegacy_path: full path
Store as LEGACY_STORIES: { storyId → { legacy_path, stage_dir } }. These are flagged in Section A.
If --story flag is set, filter both scans to just that story ID.
Step 4 — KB Story Query
Call MCP tool directly:
mcp__knowledge-base__kb_list_stories({
epic: "platform",
limit: 100
})
If result has 100 stories (may be paginated), call again with offset: 100, repeat until exhausted.
Store as KB_STORIES: { storyId → { state, story_dir, priority, blocked } }
Step 5 — Deferred KB Writes Scan
Run via Bash tool:
find plans/future/platform -name "DEFERRED-KB-WRITES.yaml" -type f
For each file found, read the first few lines to extract:
deferred_attimestampreasonstory_idfrom the writes array
Store as DEFERRED_WRITES: [ { file_path, story_id, deferred_at, reason } ]
Step 6 — Artifact Scan
For each story in DISK_STORIES, check for key artifact files in the canonical path and its _implementation/ subdirectory:
# For each canonical_path:
ls {canonical_path}/
ls {canonical_path}/_implementation/ 2>/dev/null
Key artifacts to flag if present on disk:
CHECKPOINT.yamlor_implementation/CHECKPOINT.yamlEVIDENCE.yamlor_implementation/EVIDENCE.yamlQA-VERIFY.yamlor_implementation/QA-VERIFY.yamlDEFERRED-KB-WRITES.yaml(already in Step 5, skip here)
Then check KB artifacts:
mcp__knowledge-base__kb_list_artifacts({ story_id: STORY_ID })
Only call kb_list_artifacts for stories that have at least one key artifact on disk and are in DISK_STORIES. Batch these calls — do not call for every story.
Compare disk artifacts vs KB artifact artifact_type values:
CHECKPOINT.yaml→ typecheckpointEVIDENCE.yaml→ typeevidenceQA-VERIFY.yaml→ typeqa_gate
Flag stories where disk artifacts exist but no corresponding KB artifact type is found.
Step 7 — Build Report
Section A: Legacy Stage Directories
For each story in LEGACY_STORIES:
STORY-ID legacy: in-progress/STORY-ID → needs migration to stories/STORY-ID/
Stories in legacy directories should be manually moved to {FEATURE_DIR}/stories/{STORY_ID}/ and the KB updated accordingly. Run with --fix to update KB state from these directories.
Section B: KB State Mismatches
Compare DISK_STORIES vs KB_STORIES:
- If story is in
DISK_STORIESbut NOT inKB_STORIES: flag as Not in KB (on disk, not registered) - If story is in
KB_STORIESbut NOT inDISK_STORIES: flag as No directory (in KB, no story directory) - If
KB_STORIES[id].story_dirdoesn't match the path inDISK_STORIES: flag as Path mismatch
Also include stories from LEGACY_STORIES in KB comparisons — their KB state is preserved but directory needs migration.
Also flag if KB_STORIES[id].story_dir doesn't match the canonical path on disk.
Section C: Orphaned Worktrees
Cross-reference GIT_WORKTREES vs KB_WORKTREES:
- In git but not in KB → Untracked worktree (git has it, KB doesn't know)
- In KB but not in git → Orphaned KB record (KB thinks it's active, git worktree is gone)
- In both → OK (show as healthy)
Section D: Deferred KB Writes
List all DEFERRED-KB-WRITES.yaml files with their age (current date minus deferred_at) and story ID.
Section E: Artifact Sync Gaps
List stories where disk artifacts exist but KB has no corresponding artifact record.
Step 8 — Output Format
═══════════════════════════════════════════════════════
STATUS AUDIT — plans/future/platform
Scanned: {N} stories on disk | {M} in KB | {date}
═══════════════════════════════════════════════════════
── A. LEGACY STAGE DIRECTORIES ({count} stories) ─────────────────────
KBAR-0040 legacy: in-progress/KBAR-0040 → migrate to stories/KBAR-0040/
LNGG-0030 legacy: UAT/LNGG-0030 → migrate to stories/LNGG-0030/
...
── B. KB STATE MISMATCHES ({count} stories) ─────────────────────────
Story Disk Dir Disk State KB State Action
────────── ────────────── ──────────── ───────────── ──────────────
INFR-0040 UAT/ in_qa ready_for_qa UPDATE NEEDED
KBAR-0020 UAT/ in_qa ready UPDATE NEEDED
LNGG-0040 UAT/ in_qa (not in KB) INSERT NEEDED
WINT-0110 UAT/ in_qa ready UPDATE NEEDED
...
── C. WORKTREES ({git_count} in git, {kb_count} in KB) ──────────────
Story Git Worktree KB Record Status
────────── ────────────────────────────── ────────── ───────────────
KBAR-0050 tree/story/KBAR-0050 ✗ missing UNTRACKED
WINT-1120 tree/story/WINT-1120 ✗ missing UNTRACKED
WKFL-007 tree/story/WKFL-007 ✗ missing UNTRACKED
...
── D. DEFERRED KB WRITES ({count} files) ────────────────────────────
File Story Age Reason
──────────────────────────────────────────────── ───────── ────── ──────────────────────────
UAT/INFR-0040/DEFERRED-KB-WRITES.yaml INFR-0040 10 days KB tools unavailable in PM
...
── E. ARTIFACT SYNC GAPS ({count} stories) ──────────────────────────
Story Disk Artifacts KB Artifacts Missing in KB
────────── ──────────────────────────────── ───────────── ─────────────────
INFR-0041 CHECKPOINT, EVIDENCE, QA-VERIFY (none) checkpoint, evidence, qa_gate
AUDT-0010 CHECKPOINT, EVIDENCE checkpoint evidence
...
═══════════════════════════════════════════════════════
SUMMARY
Legacy stage dirs: {A_count} stories need migration
KB state mismatches: {B_count} (updates needed)
Orphaned worktrees: {C_count}
Deferred writes: {D_count} files
Artifact gaps: {E_count} stories
{if --fix}
Applying fixes...
{else}
Run with --fix to apply all KB corrections.
{/if}
═══════════════════════════════════════════════════════
Step 9 — Apply Fixes (only if --fix flag is set)
Apply in this order:
Fix A: Legacy Stage Directories
Legacy stage directories cannot be auto-migrated (requires moving files and potentially active work). Flag as:
⚠ LEGACY directories require manual migration:
For each story: mv {legacy_path} {FEATURE_DIR}/stories/{STORY_ID}/
Then update KB story_dir:
kb_update_story({ story_id, story_dir: "{FEATURE_DIR}/stories/{STORY_ID}" })
List each legacy path for easy access.
Fix B: KB State + story_dir Updates
For each mismatch in Section B:
mcp__knowledge-base__kb_update_story({
story_id: STORY_ID,
state: kb_expected_state,
story_dir: canonical_path
})
For stories not in KB (INSERT NEEDED): use kb_get_story first to confirm absence, then use the appropriate insert tool. If no insert tool is available, flag for manual action.
Fix C: Worktree Records
For UNTRACKED (in git, not in KB): these are legitimate active worktrees — do NOT auto-register since we don't know if they're truly in-progress or abandoned. Instead, flag them with instructions:
⚠ UNTRACKED worktrees require manual verification:
Run /wt-status to see full worktree health, then
use /wt-finish or /wt-cleanup to resolve.
For ORPHANED KB records (in KB but not in git): call mcp__knowledge-base__worktree_mark_complete for each.
Fix D: Deferred Writes
These cannot be auto-applied here because the write payloads vary. Instead, output:
⚠ DEFERRED-KB-WRITES.yaml files must be processed manually:
Run /kb-compress or read each file and apply writes via kb_update_story.
List each file path for easy access.
Fix E: Artifact Sync
Artifact content sync is out of scope for auto-fix (requires reading and re-uploading full file content). Flag as:
⚠ Artifact gaps noted. To sync, run /qa-verify-story or /checkpoint for each affected story,
which will re-write artifacts to KB as part of normal workflow.
Step 10 — Post-Fix Summary
After applying fixes, show:
Fix Results:
✓ {N} KB story_dir paths corrected
✓ {N} orphaned worktree KB records marked complete
⚠ {N} legacy stage directories need manual migration
⚠ {N} untracked worktrees need manual review (/wt-status)
⚠ {N} deferred write files need manual processing
⚠ {N} artifact gaps need re-verification
Edge Cases
| Scenario | Behavior |
|---|---|
Legacy story in UAT/ or other stage dir |
Flagged in Section A as needing migration to stories/ layout |
Nested story dir (e.g., stories/KBAR-0020/KBAR-0020) |
Skip inner dir — it's an artifact folder |
| Story in git worktree but no active work / clearly abandoned | Flag for manual review, don't auto-remove |
kb_list_stories pagination |
Keep calling with increasing offset until total exhausted |
Story on disk but --story filter doesn't match |
Skip |
KB state is completed but story is in a legacy stage dir |
KB wins — KB is the authoritative source. Flag dir for migration. |