@chrisai/base 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +157 -0
  2. package/bin/install.js +340 -0
  3. package/package.json +40 -0
  4. package/src/commands/audit-claude-md.md +31 -0
  5. package/src/commands/audit.md +33 -0
  6. package/src/commands/carl-hygiene.md +33 -0
  7. package/src/commands/groom.md +35 -0
  8. package/src/commands/history.md +27 -0
  9. package/src/commands/pulse.md +33 -0
  10. package/src/commands/scaffold.md +33 -0
  11. package/src/commands/status.md +28 -0
  12. package/src/commands/surface-convert.md +35 -0
  13. package/src/commands/surface-create.md +34 -0
  14. package/src/commands/surface-list.md +27 -0
  15. package/src/framework/context/base-principles.md +71 -0
  16. package/src/framework/frameworks/audit-strategies.md +53 -0
  17. package/src/framework/frameworks/satellite-registration.md +44 -0
  18. package/src/framework/tasks/audit-claude-md.md +68 -0
  19. package/src/framework/tasks/audit.md +64 -0
  20. package/src/framework/tasks/carl-hygiene.md +160 -0
  21. package/src/framework/tasks/groom.md +164 -0
  22. package/src/framework/tasks/history.md +34 -0
  23. package/src/framework/tasks/pulse.md +83 -0
  24. package/src/framework/tasks/scaffold.md +167 -0
  25. package/src/framework/tasks/status.md +35 -0
  26. package/src/framework/tasks/surface-convert.md +143 -0
  27. package/src/framework/tasks/surface-create.md +184 -0
  28. package/src/framework/tasks/surface-list.md +42 -0
  29. package/src/framework/templates/active-md.md +112 -0
  30. package/src/framework/templates/backlog-md.md +100 -0
  31. package/src/framework/templates/state-md.md +48 -0
  32. package/src/framework/templates/workspace-json.md +50 -0
  33. package/src/hooks/_template.py +129 -0
  34. package/src/hooks/active-hook.py +115 -0
  35. package/src/hooks/backlog-hook.py +107 -0
  36. package/src/hooks/base-pulse-check.py +206 -0
  37. package/src/hooks/psmm-injector.py +67 -0
  38. package/src/hooks/satellite-detection.py +131 -0
  39. package/src/packages/base-mcp/index.js +108 -0
  40. package/src/packages/base-mcp/package.json +10 -0
  41. package/src/packages/base-mcp/tools/surfaces.js +404 -0
  42. package/src/packages/carl-mcp/index.js +115 -0
  43. package/src/packages/carl-mcp/package.json +10 -0
  44. package/src/packages/carl-mcp/tools/decisions.js +269 -0
  45. package/src/packages/carl-mcp/tools/domains.js +361 -0
  46. package/src/packages/carl-mcp/tools/psmm.js +204 -0
  47. package/src/packages/carl-mcp/tools/staging.js +245 -0
  48. package/src/skill/base.md +111 -0
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: base:history
3
+ description: Workspace evolution timeline
4
+ allowed-tools: [Read, Glob, Bash]
5
+ ---
6
+
7
+ <objective>
8
+ Show workspace evolution — grooming history, audits, major changes over time.
9
+
10
+ **When to use:** "workspace history", "show evolution", "what's changed".
11
+ </objective>
12
+
13
+ <execution_context>
14
+ @.claude/skills/base/tasks/history.md
15
+ </execution_context>
16
+
17
+ <context>
18
+ @.base/STATE.md
19
+ </context>
20
+
21
+ <process>
22
+ Follow task: @.claude/skills/base/tasks/history.md
23
+ </process>
24
+
25
+ <success_criteria>
26
+ - [ ] Timeline of workspace events displayed
27
+ </success_criteria>
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: base:pulse
3
+ description: Daily workspace health briefing
4
+ allowed-tools: [Read, Glob, Grep, Bash]
5
+ ---
6
+
7
+ <objective>
8
+ Workspace health briefing — drift score, stale areas, overdue grooming, quick status.
9
+
10
+ **When to use:** Session start, "what's the state of my workspace", daily check-in.
11
+ </objective>
12
+
13
+ <execution_context>
14
+ @.claude/skills/base/tasks/pulse.md
15
+ @.claude/skills/base/context/base-principles.md
16
+ </execution_context>
17
+
18
+ <context>
19
+ $ARGUMENTS
20
+
21
+ @.base/workspace.json
22
+ @.base/STATE.md
23
+ </context>
24
+
25
+ <process>
26
+ Follow task: @.claude/skills/base/tasks/pulse.md
27
+ </process>
28
+
29
+ <success_criteria>
30
+ - [ ] Drift score calculated and displayed
31
+ - [ ] Stale areas identified
32
+ - [ ] Groom cadence checked
33
+ </success_criteria>
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: base:scaffold
3
+ description: Set up BASE in a new workspace
4
+ argument-hint: "[--full]"
5
+ allowed-tools: [Read, Write, Edit, Glob, Bash, AskUserQuestion]
6
+ ---
7
+
8
+ <objective>
9
+ Guided workspace setup — scan, configure, install BASE infrastructure. Optional --full mode adds operational templates.
10
+
11
+ **When to use:** First-time BASE installation, "set up base", "scaffold my workspace".
12
+ </objective>
13
+
14
+ <execution_context>
15
+ @.claude/skills/base/tasks/scaffold.md
16
+ @.claude/skills/base/templates/workspace-json.md
17
+ @.claude/skills/base/templates/state-md.md
18
+ </execution_context>
19
+
20
+ <context>
21
+ $ARGUMENTS
22
+ </context>
23
+
24
+ <process>
25
+ Follow task: @.claude/skills/base/tasks/scaffold.md
26
+ </process>
27
+
28
+ <success_criteria>
29
+ - [ ] .base/ directory structure created
30
+ - [ ] workspace.json generated from scan
31
+ - [ ] STATE.md initialized
32
+ - [ ] Hooks and MCP servers installed (if --full)
33
+ </success_criteria>
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: base:status
3
+ description: Quick workspace health check
4
+ allowed-tools: [Read, Glob, Bash]
5
+ ---
6
+
7
+ <objective>
8
+ One-liner workspace health status — drift score and area summary.
9
+
10
+ **When to use:** Quick check, "workspace status", "how's my workspace".
11
+ </objective>
12
+
13
+ <execution_context>
14
+ @.claude/skills/base/tasks/status.md
15
+ </execution_context>
16
+
17
+ <context>
18
+ @.base/workspace.json
19
+ @.base/STATE.md
20
+ </context>
21
+
22
+ <process>
23
+ Follow task: @.claude/skills/base/tasks/status.md
24
+ </process>
25
+
26
+ <success_criteria>
27
+ - [ ] Health status displayed
28
+ </success_criteria>
@@ -0,0 +1,35 @@
1
+ ---
2
+ name: base:surface-convert
3
+ description: Convert a markdown file into a data surface
4
+ argument-hint: "<file-path>"
5
+ allowed-tools: [Read, Write, Edit, Glob, Bash, AskUserQuestion]
6
+ ---
7
+
8
+ <objective>
9
+ Convert an existing @-mentioned markdown file into a structured data surface. Analyzes structure, proposes schema, migrates content.
10
+
11
+ **When to use:** User has a markdown file they want to convert to a structured surface.
12
+ </objective>
13
+
14
+ <execution_context>
15
+ @.claude/skills/base/tasks/surface-convert.md
16
+ @.base/hooks/_template.py
17
+ </execution_context>
18
+
19
+ <context>
20
+ $ARGUMENTS
21
+
22
+ @.base/workspace.json
23
+ </context>
24
+
25
+ <process>
26
+ Follow task: @.claude/skills/base/tasks/surface-convert.md
27
+ </process>
28
+
29
+ <success_criteria>
30
+ - [ ] .base/data/{name}.json created with migrated items
31
+ - [ ] .base/hooks/{name}-hook.py created
32
+ - [ ] workspace.json updated with surface registration
33
+ - [ ] settings.json updated with hook entry
34
+ - [ ] Original markdown file preserved
35
+ </success_criteria>
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: base:surface-create
3
+ description: Create a new data surface (guided)
4
+ argument-hint: "[surface-name]"
5
+ allowed-tools: [Read, Write, Edit, Glob, Bash, AskUserQuestion]
6
+ ---
7
+
8
+ <objective>
9
+ Create a new data surface through guided conversation. Generates JSON data file, injection hook, workspace.json registration, and settings.json hook entry.
10
+
11
+ **When to use:** User wants to track something new as a structured data surface.
12
+ </objective>
13
+
14
+ <execution_context>
15
+ @.claude/skills/base/tasks/surface-create.md
16
+ @.base/hooks/_template.py
17
+ </execution_context>
18
+
19
+ <context>
20
+ $ARGUMENTS
21
+
22
+ @.base/workspace.json
23
+ </context>
24
+
25
+ <process>
26
+ Follow task: @.claude/skills/base/tasks/surface-create.md
27
+ </process>
28
+
29
+ <success_criteria>
30
+ - [ ] .base/data/{name}.json created
31
+ - [ ] .base/hooks/{name}-hook.py created
32
+ - [ ] workspace.json updated with surface registration
33
+ - [ ] settings.json updated with hook entry
34
+ </success_criteria>
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: base:surface-list
3
+ description: Show all registered data surfaces
4
+ allowed-tools: [Read, Bash]
5
+ ---
6
+
7
+ <objective>
8
+ Display all registered data surfaces with item counts and hook status.
9
+
10
+ **When to use:** User wants to see what surfaces exist.
11
+ </objective>
12
+
13
+ <execution_context>
14
+ @.claude/skills/base/tasks/surface-list.md
15
+ </execution_context>
16
+
17
+ <context>
18
+ @.base/workspace.json
19
+ </context>
20
+
21
+ <process>
22
+ Follow task: @.claude/skills/base/tasks/surface-list.md
23
+ </process>
24
+
25
+ <success_criteria>
26
+ - [ ] All registered surfaces displayed with counts
27
+ </success_criteria>
@@ -0,0 +1,71 @@
1
+ # BASE Principles
2
+
3
+ ## Core Laws
4
+
5
+ 1. **If it's not current, it's harmful.** Stale context documents feed AI bad information. Maintenance isn't optional.
6
+ 2. **Every file earns its place.** If you can't explain why it's here in 5 seconds, it moves or dies.
7
+ 3. **Archive > delete.** When in doubt, archive. You can always delete later. You can't un-delete.
8
+ 4. **The workspace is the product.** Treat it like production code, not a scratch pad.
9
+ 5. **Clean as you go.** The best time to file something correctly is when you create it. The second best time is now.
10
+ 6. **Scaffold generates manifest. Manifest drives everything.** One configuration point. No manual bookkeeping.
11
+ 7. **Tools register themselves.** PAUL projects auto-register with BASE. No human memory required.
12
+
13
+ ## Drift Score
14
+
15
+ Drift is the gap between documented state and actual state. Measured in days-overdue across all tracked areas.
16
+
17
+ - **0** — Everything current. Workspace is clean.
18
+ - **1-7** — Minor drift. Normal during execution sprints. Fix at next groom.
19
+ - **8-14** — Moderate drift. Context documents are likely misleading AI. Groom soon.
20
+ - **15+** — Critical drift. Sessions are operating on stale context. Groom NOW.
21
+
22
+ ## Maintenance Cadence
23
+
24
+ | What | Default Cadence | Override |
25
+ |------|----------------|---------|
26
+ | ACTIVE.md | Every session or weekly | workspace.json |
27
+ | BACKLOG.md | Weekly groom | workspace.json |
28
+ | Project directory | Monthly | workspace.json |
29
+ | Tools/MCP | Monthly | workspace.json |
30
+ | System layer | Monthly | workspace.json |
31
+ | Full audit | Quarterly or after major shifts | On demand |
32
+
33
+ ## Backlog Rules
34
+
35
+ Items have time-based properties enforced by grooming:
36
+
37
+ - **Added** — auto-set when item enters backlog
38
+ - **Review-by** — priority-based: High=7d, Medium=14d, Low=30d
39
+ - **Staleness** — 2x review-by threshold. Auto-archive if reached without action.
40
+
41
+ During groom: items past review-by surface as "decide or kill." Items past staleness auto-archive with a note.
42
+
43
+ ## Graduation Flow
44
+
45
+ Backlog items don't sit forever. They graduate to ACTIVE.md when the operator is ready to work on them.
46
+
47
+ ```
48
+ BACKLOG (waiting review)
49
+ → ACTIVE.md TASKS (standalone, bounded work items)
50
+ → ACTIVE.md PROJECT (complex work warranting its own project entry)
51
+ → DONE (closed with outcome + date)
52
+ ```
53
+
54
+ **TASKS vs PROJECTS:** A task is bounded — it has a finish line. "Extract .mcp.json secrets" is a task. "Build the CARL MCP server" might start as a task but could become a project if it grows. The operator decides during groom.
55
+
56
+ **Graduation is never automatic.** The groom flow asks explicitly: "Ready to work on any backlog items?" The operator decides what graduates and where it lands.
57
+
58
+ **Items can also move backward:** An ACTIVE task that loses priority can return to backlog. A project that stalls can move to DEFERRED. Nothing is permanent.
59
+
60
+ ## Scaffold Modes
61
+
62
+ BASE scaffold operates in two modes:
63
+
64
+ - **Standard** (`/base:scaffold`) — Data layer only. Creates `.base/` with workspace.json, STATE.md, ROADMAP.md. Scans and tracks what exists. Framework-agnostic.
65
+ - **Full** (`/base:scaffold --full`) — Data layer + operational templates. Creates ACTIVE.md, BACKLOG.md from templates. Offers CLAUDE.md audit. Sets up symlinks. The "batteries included" version for AI builders who want the full system.
66
+
67
+ Standard mode works for any workspace. Full mode provides Chris's proven operational structure.
68
+
69
+ ## File Location
70
+
71
+ BASE operates strictly out of `.base/`. All state files (ACTIVE.md, BACKLOG.md, STATE.md, workspace.json, ROADMAP.md) live in `.base/`. Symlinks at workspace root are a **migration tool only** — offered when existing references (CLAUDE.md @mentions, hooks) would break. New installations never need symlinks. `.base/` is the canonical location.
@@ -0,0 +1,53 @@
1
+ # Audit Strategies
2
+
3
+ Reusable audit strategies that can be applied to any workspace area. The workspace manifest (`workspace.json`) maps areas to strategies. The audit command reads the manifest and applies the appropriate strategy to each area.
4
+
5
+ ## Strategies
6
+
7
+ ### staleness
8
+ **Applies to:** Working memory files (ACTIVE.md, BACKLOG.md, any tracked document)
9
+ **What it does:** Check file modification timestamps against configured thresholds. Flag files past their groom cadence.
10
+ **Config:**
11
+ - `threshold_days` — days after which the file is considered stale
12
+ **Output:** List of stale files with age, recommended action (update or review)
13
+
14
+ ### classify
15
+ **Applies to:** Directories with lifecycle items (projects/, clients/)
16
+ **What it does:** List all items in the directory. For each, present to operator for classification: active, archive, or delete. Check for planning docs, recent activity, git history.
17
+ **Config:**
18
+ - `states` — classification options (default: ["active", "archive", "delete"])
19
+ - `archive_path` — where archived items go (default: `{path}/_archive/`)
20
+ **Output:** Classification decisions, items moved to archive, items deleted
21
+
22
+ ### cross-reference
23
+ **Applies to:** Tools/servers that have a config file mapping (e.g., MCP servers vs .mcp.json)
24
+ **What it does:** Compare directory contents against a configuration file. Identify directories not referenced in config (orphaned) and config entries pointing to missing directories (broken).
25
+ **Config:**
26
+ - `config_file` — path to the configuration file to cross-reference
27
+ **Output:** Orphaned items, broken references, recommendations
28
+
29
+ ### dead-code
30
+ **Applies to:** System directories (hooks, commands, skills)
31
+ **What it does:** Scan for files that appear unused — no references from other files, no recent invocations, no clear purpose. Presents findings for human decision.
32
+ **Config:**
33
+ - `reference_check` — whether to search for references in other files (default: true)
34
+ **Output:** Potentially dead files with evidence, operator decides keep/delete
35
+
36
+ ### pipeline-status
37
+ **Applies to:** Content pipelines, task queues, any workflow with stages
38
+ **What it does:** Check items in each pipeline stage. Flag stuck items (in same stage too long), empty stages, bottlenecks.
39
+ **Config:**
40
+ - `stages` — ordered list of pipeline stages
41
+ - `stuck_threshold_days` — days in one stage before flagging
42
+ **Output:** Pipeline health report, stuck items, stage distribution
43
+
44
+ ## Extending Strategies
45
+
46
+ Custom strategies can be added for workspace-specific needs. A strategy is defined by:
47
+ 1. A name (kebab-case)
48
+ 2. What it applies to (description)
49
+ 3. What it checks (logic)
50
+ 4. What config it needs (parameters)
51
+ 5. What it outputs (findings format)
52
+
53
+ Add custom strategies to this file and reference them in `workspace.json`.
@@ -0,0 +1,44 @@
1
+ # Satellite Registration Framework
2
+
3
+ ## What Are Satellites
4
+
5
+ Satellites are projects that live in their own git repos inside the workspace (e.g., `apps/*`). They run their own Claude Code sessions independently. BASE needs visibility into them without owning them.
6
+
7
+ ## Registration Flow
8
+
9
+ ### Automatic (via PAUL init)
10
+ When `/paul:init` runs in a subdirectory:
11
+ 1. Check if parent directory has `.base/workspace.json`
12
+ 2. If yes, write registration entry: project name, path, engine type, state file path, date
13
+ 3. Report: "Registered with BASE workspace: {workspace-name}"
14
+
15
+ ### Automatic (via BASE scaffold)
16
+ When `/base:scaffold` runs:
17
+ 1. Scan configured satellite directories (default: `apps/`)
18
+ 2. Detect existing `.paul/` directories
19
+ 3. Auto-register discovered projects
20
+ 4. Report: "Found {N} satellite projects. Registered."
21
+
22
+ ### Automatic (via BASE groom)
23
+ During groom:
24
+ 1. Read registered satellites from workspace.json
25
+ 2. Check each path exists (clean up broken registrations)
26
+ 3. Scan satellite directories for unregistered projects with `.paul/`
27
+ 4. Flag: "Found unregistered project: {name}. Register?"
28
+
29
+ ## Health Checks
30
+
31
+ During `/base:pulse` and `/base:groom`, for each satellite:
32
+ 1. Read the state file (e.g., `.paul/STATE.md`)
33
+ 2. Check last modification date
34
+ 3. Extract current phase/milestone if parseable
35
+ 4. Report health: active, stale, or unknown
36
+
37
+ BASE never modifies satellite state. It only reads and reports. PAUL (or whatever engine) manages the project. BASE manages the workspace those projects live in.
38
+
39
+ ## Deregistration
40
+
41
+ Satellites are deregistered when:
42
+ - The project directory no longer exists (auto-cleaned during groom)
43
+ - The user explicitly removes it during audit
44
+ - The project is archived (moved to `_archive/` or similar)
@@ -0,0 +1,68 @@
1
+ <purpose>
2
+ Audit an existing CLAUDE.md and generate a recommended alternative (CLAUDE.base.md) that follows BASE workspace conventions. Never overwrites the user's existing file.
3
+ </purpose>
4
+
5
+ <user-story>
6
+ As an AI builder setting up BASE, I want my CLAUDE.md audited against best practices, so that I get a recommended version I can adopt without losing my current config.
7
+ </user-story>
8
+
9
+ <when-to-use>
10
+ - During /base:scaffold (optional step)
11
+ - When user says "audit my claude.md", "improve my claude.md"
12
+ - Entry point routes here via /base:audit-claude-md
13
+ </when-to-use>
14
+
15
+ <steps>
16
+
17
+ <step name="read_existing" priority="first">
18
+ Read the user's existing CLAUDE.md.
19
+
20
+ 1. Read `CLAUDE.md` from workspace root
21
+ 2. If no CLAUDE.md exists, skip audit and generate fresh from template
22
+ 3. Parse sections: identify what's covered (identity, structure, conventions, tool config, etc.)
23
+ 4. Note what's missing vs BASE best practices
24
+ </step>
25
+
26
+ <step name="assess_and_recommend">
27
+ Compare against BASE workspace conventions.
28
+
29
+ Check for:
30
+ - [ ] Working memory references (@ACTIVE.md, @BACKLOG.md, @STATE.md)
31
+ - [ ] Workspace structure tree (accurate to actual filesystem?)
32
+ - [ ] Git strategy documentation
33
+ - [ ] Tool priority declarations (LSP, etc.)
34
+ - [ ] Business/identity context (who, what, why)
35
+ - [ ] CARL/BASE integration references
36
+ - [ ] Key locations table
37
+ - [ ] Documentation system description
38
+ - [ ] Banned words / style preferences
39
+
40
+ For each missing or outdated section, prepare a recommendation.
41
+ </step>
42
+
43
+ <step name="generate_alternative">
44
+ Generate CLAUDE.base.md as a recommended version.
45
+
46
+ 1. Build a complete CLAUDE.md following BASE conventions
47
+ 2. Preserve all existing content that's still accurate
48
+ 3. Add missing sections from BASE template
49
+ 4. Update workspace structure tree to match actual filesystem
50
+ 5. Write to `CLAUDE.base.md` (NOT CLAUDE.md)
51
+ 6. Present diff summary: "Here's what changed vs your current CLAUDE.md"
52
+
53
+ Tell user: "Review CLAUDE.base.md. If you want to adopt it, rename it to CLAUDE.md. Your original is untouched."
54
+ </step>
55
+
56
+ </steps>
57
+
58
+ <output>
59
+ CLAUDE.base.md file in workspace root — a recommended CLAUDE.md following BASE conventions. Original CLAUDE.md is never modified.
60
+ </output>
61
+
62
+ <acceptance-criteria>
63
+ - [ ] Existing CLAUDE.md read and analyzed
64
+ - [ ] All BASE best-practice sections checked
65
+ - [ ] CLAUDE.base.md generated with recommendations
66
+ - [ ] Original CLAUDE.md untouched
67
+ - [ ] User informed of differences and how to adopt
68
+ </acceptance-criteria>
@@ -0,0 +1,64 @@
1
+ <purpose>
2
+ Deep workspace optimization. Dynamically generate audit phases from the workspace manifest, run each area's configured audit strategy, and execute operator-approved changes.
3
+ </purpose>
4
+
5
+ <user-story>
6
+ As an AI builder, I want a thorough workspace audit that adapts to my workspace structure, so that every area gets properly reviewed regardless of how complex my setup is.
7
+ </user-story>
8
+
9
+ <when-to-use>
10
+ - Quarterly or after major workspace shifts
11
+ - When user says "base audit", "deep clean", "optimize workspace"
12
+ - Entry point routes here via /base:audit
13
+ </when-to-use>
14
+
15
+ <steps>
16
+
17
+ <step name="generate_phases" priority="first">
18
+ Read workspace manifest and generate audit phases dynamically.
19
+
20
+ 1. Read `.base/workspace.json`
21
+ 2. For each area, create an audit phase using its configured strategy
22
+ 3. Present phase list: "Audit will cover {N} phases: {list with strategies}"
23
+ 4. Create task tracking for each phase
24
+
25
+ **Wait for operator confirmation. Allow them to skip or reorder phases.**
26
+ </step>
27
+
28
+ <step name="execute_phases">
29
+ Run each phase using its configured audit strategy.
30
+
31
+ For each phase:
32
+ 1. Announce: "Phase {N}: {area-name} ({strategy})"
33
+ 2. Execute the strategy (reference frameworks/audit-strategies.md)
34
+ 3. Present findings
35
+ 4. Collect operator decisions (keep/archive/delete/move)
36
+ 5. Execute approved changes
37
+ 6. Mark phase complete
38
+
39
+ Strategies are documented in `@frameworks/audit-strategies.md`.
40
+ </step>
41
+
42
+ <step name="record_audit">
43
+ Record the audit results.
44
+
45
+ 1. Update `.base/STATE.md`
46
+ 2. Write audit record to `.base/audits/{YYYY-MM-DD}.md`
47
+ 3. Log to `.base/ROADMAP.md`
48
+ 4. Report final summary: phases completed, items changed, new drift score
49
+ </step>
50
+
51
+ </steps>
52
+
53
+ <output>
54
+ Complete workspace audit with dynamic phases. All areas reviewed, changes executed, audit recorded.
55
+ </output>
56
+
57
+ <acceptance-criteria>
58
+ - [ ] Phases generated dynamically from manifest (not hardcoded)
59
+ - [ ] Each area audited using its configured strategy
60
+ - [ ] Operator approved all changes before execution
61
+ - [ ] Audit record written to audits/ directory
62
+ - [ ] STATE.md updated
63
+ - [ ] ROADMAP.md updated with audit entry
64
+ </acceptance-criteria>