@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,143 @@
1
+ <purpose>
2
+ Convert an existing @-mentioned markdown file into a structured data surface. Analyzes the markdown structure, proposes a schema, migrates content, and generates all surface artifacts (JSON, hook, registration).
3
+ </purpose>
4
+
5
+ <user-story>
6
+ As an AI builder, I want to convert my existing markdown tracking files into structured surfaces so Claude gets cheap passive awareness instead of expensive @-file parsing.
7
+ </user-story>
8
+
9
+ <when-to-use>
10
+ - /base:surface convert {file-path}
11
+ - "convert this file to a surface", "make this a data surface"
12
+ - User has a markdown file they @-mention regularly and wants it structured
13
+ </when-to-use>
14
+
15
+ <context>
16
+ @.base/hooks/_template.py
17
+ @.base/workspace.json
18
+ </context>
19
+
20
+ <steps>
21
+
22
+ <step name="read" priority="first">
23
+ ## Step 1: Read & Analyze
24
+
25
+ 1. Read the specified markdown file completely
26
+ 2. Detect structure:
27
+ - **Headings** → potential categories or priority groups
28
+ - **Bold labels** (e.g., `**Status:**`) → field names
29
+ - **List items** → individual entries
30
+ - **Checkboxes** → checklist/progress fields
31
+ - **Dates** → timestamp fields
32
+ - **File paths** → location fields
33
+ - **Tables** → structured data (archived items, reference tables)
34
+ 3. Identify patterns:
35
+ - How many distinct items?
36
+ - What fields recur across items?
37
+ - Are there priority/status groupings?
38
+ - Is there an archived/done section?
39
+
40
+ Present findings:
41
+ ```
42
+ Detected structure in {file}:
43
+ Items found: {count}
44
+ Sections: {list of heading-based groups}
45
+ Recurring fields: {field names}
46
+ Archived section: {yes/no}
47
+ ```
48
+ </step>
49
+
50
+ <step name="propose">
51
+ ## Step 2: Propose Schema
52
+
53
+ Based on analysis, propose:
54
+
55
+ 1. **Surface name** — infer from filename (e.g., ACTIVE.md → "active")
56
+ 2. **Schema** — field names, types, required fields, ID prefix
57
+ 3. **Sample conversion** — show 2-3 items converted to JSON
58
+
59
+ ```
60
+ Proposed schema for "{name}":
61
+ ID prefix: {PREFIX}
62
+ Required: {fields}
63
+ Optional: {fields}
64
+ Priority levels: {if detected}
65
+
66
+ Sample conversion:
67
+ "{heading item}" →
68
+ {
69
+ "id": "PREFIX-001",
70
+ "title": "...",
71
+ "status": "...",
72
+ ...
73
+ }
74
+ ```
75
+
76
+ Ask: "Does this schema look right? Adjust anything?"
77
+
78
+ **Wait for response.**
79
+ </step>
80
+
81
+ <step name="confirm">
82
+ ## Step 3: Confirm
83
+
84
+ Apply any user adjustments to the schema. Lock it for generation.
85
+
86
+ If user is satisfied, confirm:
87
+ "Schema locked. I'll generate the surface and migrate {count} items."
88
+ </step>
89
+
90
+ <step name="generate">
91
+ ## Step 4: Generate Artifacts
92
+
93
+ Same generation as surface-create Step 5:
94
+ - `.base/data/{name}.json` — with migrated items (not empty)
95
+ - `.base/hooks/{name}-hook.py` — from _template.py with appropriate grouping
96
+ - workspace.json surface registration
97
+ - settings.json hook entry
98
+
99
+ Include staleness detection with sensible defaults based on detected priority levels.
100
+ </step>
101
+
102
+ <step name="migrate">
103
+ ## Step 5: Migrate Content
104
+
105
+ Parse every item from the markdown into JSON entries:
106
+ - Map heading groups to priority/category fields
107
+ - Map bold labels to field values
108
+ - Preserve checklists as arrays of {text, done} objects
109
+ - Preserve dates in ISO format
110
+ - Preserve file paths as location fields
111
+ - Map done/closed/archived sections to the archived array
112
+
113
+ Report:
114
+ ```
115
+ Migration complete:
116
+ Items migrated: {count}
117
+ Archived items: {count}
118
+ Unmapped items: {count, if any — list them}
119
+ ```
120
+
121
+ If any items couldn't be auto-mapped, present them for manual resolution.
122
+ </step>
123
+
124
+ <step name="cleanup">
125
+ ## Step 6: Clean Up
126
+
127
+ 1. Check if the original file is @-referenced in CLAUDE.md
128
+ 2. If found, offer: "Remove @{file} from CLAUDE.md? The surface hook replaces it."
129
+ 3. Suggest: "Original file preserved at {path} for reference."
130
+
131
+ Do NOT delete the original markdown file — the user decides its fate.
132
+ </step>
133
+
134
+ </steps>
135
+
136
+ <verification>
137
+ After conversion:
138
+ - [ ] .base/data/{name}.json exists with migrated items
139
+ - [ ] Item count matches source markdown
140
+ - [ ] .base/hooks/{name}-hook.py exists and produces output
141
+ - [ ] workspace.json and settings.json updated
142
+ - [ ] Original markdown file is untouched
143
+ </verification>
@@ -0,0 +1,184 @@
1
+ <purpose>
2
+ Create a new data surface through guided conversation. Generates: JSON data file, injection hook, workspace.json registration, and settings.json hook entry. The user answers questions; Claude generates everything.
3
+ </purpose>
4
+
5
+ <user-story>
6
+ As an AI builder, I want to create custom data surfaces so Claude has structured, passive awareness of any domain I track — without manually wiring JSON files, hooks, and config.
7
+ </user-story>
8
+
9
+ <when-to-use>
10
+ - /base:surface create {name}
11
+ - "create a surface", "add a new surface", "I want to track X"
12
+ - User wants structured data with hook injection and MCP access
13
+ </when-to-use>
14
+
15
+ <context>
16
+ @.base/hooks/_template.py
17
+ @.base/workspace.json
18
+ </context>
19
+
20
+ <steps>
21
+
22
+ <step name="define" priority="first">
23
+ ## Step 1: Define
24
+
25
+ Extract surface name from args or ask: "What should this surface be called? (lowercase, no spaces)"
26
+
27
+ **Validate:**
28
+ 1. Name is lowercase, alphanumeric + hyphens only
29
+ 2. Not already registered in workspace.json surfaces section
30
+ 3. No reserved names: "active", "backlog", "psmm", "staging"
31
+
32
+ Ask: "What does this surface track? (one sentence)"
33
+ → This becomes the `description` in workspace.json.
34
+
35
+ **Wait for response before proceeding.**
36
+ </step>
37
+
38
+ <step name="schema">
39
+ ## Step 2: Schema
40
+
41
+ Ask: "What fields does each item need?"
42
+
43
+ Guide through these decisions (one at a time):
44
+
45
+ 1. **Required fields** — What must every item have?
46
+ - Default minimum: `["title"]`
47
+ - Common additions: status, priority, category, assignee, due_date
48
+
49
+ 2. **ID prefix** — Auto-suggest first 3 chars of name, uppercase.
50
+ - e.g., surface "clients" → prefix "CLI"
51
+ - User can override
52
+
53
+ 3. **Priority/status enums** — If the surface has priority or status fields:
54
+ - Ask: "What priority levels?" (e.g., high, medium, low)
55
+ - Ask: "What status values?" (e.g., active, pending, done)
56
+
57
+ 4. **Time rules** (optional) — If the surface benefits from review-by dates:
58
+ - Ask: "Should items have review-by deadlines? If so, how many days per priority level?"
59
+ - Default: none
60
+
61
+ Build the schema object from answers:
62
+ ```json
63
+ {
64
+ "id_prefix": "CLI",
65
+ "required_fields": ["title", "status"],
66
+ "priority_levels": ["high", "medium", "low"],
67
+ "status_values": ["active", "pending", "done"]
68
+ }
69
+ ```
70
+
71
+ **Wait for response before proceeding.**
72
+ </step>
73
+
74
+ <step name="injection">
75
+ ## Step 3: Injection
76
+
77
+ Ask: "How should items appear in Claude's context each prompt?"
78
+
79
+ Guide through:
80
+
81
+ 1. **Grouping** — How to organize items in the injection?
82
+ - By priority (default) | By status | By date | Flat (no grouping)
83
+
84
+ 2. **Summary format** — What fields to show per line?
85
+ - Default: `- [ID] Title (status)`
86
+ - Can add: priority tag, due date, custom field
87
+
88
+ 3. **Staleness thresholds** — Days before an item is flagged STALE per priority:
89
+ - Suggest defaults based on priority levels from Step 2
90
+ - e.g., high: 5d, medium: 10d, low: 30d
91
+ - User can adjust
92
+
93
+ 4. **Behavioral mode:**
94
+ - Silent (default) — passive awareness, respond only when asked
95
+ - Proactive — mention items unprompted (rare, use for critical surfaces)
96
+ - Threshold — stay silent unless deadline/staleness threshold crossed
97
+
98
+ **Wait for response before proceeding.**
99
+ </step>
100
+
101
+ <step name="tools">
102
+ ## Step 4: Tools (Informational)
103
+
104
+ Inform the user:
105
+
106
+ "All 7 BASE MCP tools work automatically with your new surface:
107
+ - `base_list_surfaces` — see all surfaces
108
+ - `base_get_surface("{name}")` — read all items
109
+ - `base_get_item("{name}", id)` — get specific item
110
+ - `base_add_item("{name}", data)` — add new item (validates required fields, auto-generates ID)
111
+ - `base_update_item("{name}", id, data)` — update fields (resets staleness clock)
112
+ - `base_archive_item("{name}", id)` — move to archived
113
+ - `base_search(query, "{name}")` — search items
114
+
115
+ No configuration needed — BASE MCP auto-discovers surfaces from workspace.json."
116
+
117
+ **Continue to generation.**
118
+ </step>
119
+
120
+ <step name="generate" priority="critical">
121
+ ## Step 5: Generate
122
+
123
+ Create all artifacts:
124
+
125
+ **1. Data file:** `.base/data/{name}.json`
126
+ ```json
127
+ {
128
+ "surface": "{name}",
129
+ "version": 1,
130
+ "last_modified": "{timestamp}",
131
+ "items": [],
132
+ "archived": []
133
+ }
134
+ ```
135
+
136
+ **2. Hook file:** `.base/hooks/{name}-hook.py`
137
+ - Read `.base/hooks/_template.py` as the starting point
138
+ - Customize SURFACE_NAME, grouping logic, summary format, staleness thresholds, behavioral directive
139
+ - Use the injection decisions from Step 3
140
+ - Include `from datetime import date` for staleness calculation
141
+ - Follow the _template.py contract exactly
142
+
143
+ **3. Registration:** Add to `.base/workspace.json` surfaces section:
144
+ ```json
145
+ "{name}": {
146
+ "file": "data/{name}.json",
147
+ "description": "{description from Step 1}",
148
+ "hook": true,
149
+ "silent": true,
150
+ "schema": { ...schema from Step 2... }
151
+ }
152
+ ```
153
+
154
+ **4. Hook registration:** Add to `.claude/settings.json` UserPromptSubmit hooks:
155
+ ```json
156
+ {
157
+ "type": "command",
158
+ "command": "python3 {absolute_workspace_path}/.base/hooks/{name}-hook.py"
159
+ }
160
+ ```
161
+ Use absolute path resolved from workspace root.
162
+
163
+ **5. Report:**
164
+ ```
165
+ Surface "{name}" created:
166
+ Data: .base/data/{name}.json (empty, ready for items)
167
+ Hook: .base/hooks/{name}-hook.py (will inject next prompt)
168
+ Schema: {id_prefix}-NNN, {required_fields}
169
+ Tools: base_get_item("{name}", id), base_add_item("{name}", data), etc.
170
+
171
+ Add your first item: base_add_item("{name}", {title: "..."})
172
+ ```
173
+ </step>
174
+
175
+ </steps>
176
+
177
+ <verification>
178
+ After generation:
179
+ - [ ] .base/data/{name}.json exists and is valid JSON
180
+ - [ ] .base/hooks/{name}-hook.py exists and parses as valid Python
181
+ - [ ] workspace.json has the surface registration
182
+ - [ ] settings.json has the hook entry with absolute path
183
+ - [ ] Hook outputs correct XML when piped test input
184
+ </verification>
@@ -0,0 +1,42 @@
1
+ <purpose>
2
+ Display all registered data surfaces with item counts, hook status, and staleness summary.
3
+ </purpose>
4
+
5
+ <when-to-use>
6
+ - /base:surface list
7
+ - "what surfaces exist", "show surfaces", "list surfaces"
8
+ </when-to-use>
9
+
10
+ <steps>
11
+
12
+ <step name="read_and_display">
13
+ ## Show Surfaces
14
+
15
+ 1. Call `base_list_surfaces` to get all registered surfaces with item counts
16
+ 2. For each surface, read the data file to count stale items (items with no `updated` field or `updated` older than threshold)
17
+
18
+ Display as:
19
+
20
+ ```
21
+ Data Surfaces
22
+ ═══════════════════════════════════════
23
+
24
+ | Surface | Items | Hook | Description |
25
+ |---------|-------|------|-------------|
26
+ | active | 12 | ✓ | Active work items, projects, and tasks |
27
+ | backlog | 8 | ✓ | Future work queue, ideas, and deferred tasks |
28
+
29
+ Total: {count} surfaces, {total_items} items
30
+
31
+ Create a new surface: /base:surface create {name}
32
+ Convert a file: /base:surface convert {path}
33
+ ```
34
+
35
+ If no surfaces registered:
36
+ ```
37
+ No data surfaces registered.
38
+ Run /base:surface create {name} to create your first surface.
39
+ ```
40
+ </step>
41
+
42
+ </steps>
@@ -0,0 +1,112 @@
1
+ # ACTIVE.md Template
2
+
3
+ Output file: `.base/ACTIVE.md`
4
+
5
+ Symlink at workspace root: `ACTIVE.md → .base/ACTIVE.md` (for backward compatibility with hooks and rules that reference root-level ACTIVE.md)
6
+
7
+ ```template
8
+ # Active Work
9
+
10
+ > **Working memory for Claude Code sessions.** Read at session start, update as work progresses.
11
+ > This is NOT documentation - it's task tracking. Obsidian handles the knowledge graph.
12
+ >
13
+ > **Update workflow:** Claude asks status questions → User responds via voice → Claude updates this file.
14
+ > **Not active?** → Move to `BACKLOG.md` for future work queue.
15
+ > **Graduation:** Backlog items move here (as TASKS or under a PROJECT) when they get attention.
16
+
17
+ ---
18
+
19
+ ## URGENT
20
+
21
+ [Projects with hard deadlines or critical momentum. Max 2-3 at a time.]
22
+
23
+ ### {Project Name}
24
+ **Status:** [Current state — be specific]
25
+ **Location:** `{path/to/project/}`
26
+ **Deadline:** {YYYY-MM-DD}
27
+ **Next:** [Single most important next action]
28
+ **Blocked:** [What's preventing progress, or "None"]
29
+ **Notes:** [Context that helps a fresh session understand this project]
30
+
31
+ ---
32
+
33
+ ## HIGH PRIORITY
34
+
35
+ [Projects in active development without hard deadlines.]
36
+
37
+ ### {Project Name}
38
+ **Status:** [Current state]
39
+ **Location:** `{path/to/project/}`
40
+ **Target:** [Target date or milestone, if any]
41
+ **Next:** [Single most important next action]
42
+ **Blocked:** [What's preventing progress, or "None"]
43
+ **Notes:** [Context]
44
+
45
+ ---
46
+
47
+ ## ONGOING
48
+
49
+ [Always-running work. No end date. Check in during groom.]
50
+
51
+ ### {Project Name}
52
+ **Status:** [Current state]
53
+ **Location:** `{path/to/project/}`
54
+ **Next:** [What to do next or maintain]
55
+ **Notes:** [Context]
56
+
57
+ ---
58
+
59
+ ## TASKS
60
+
61
+ > Standalone work items graduated from backlog. Bounded, not ongoing. Close when done.
62
+
63
+ ### {Task Name}
64
+ **Status:** [In Progress | Blocked | Ready]
65
+ **Next:** [What needs to happen]
66
+ **Blocked:** [Dependencies, or "None"]
67
+ **Notes:** [Context. Include backlog origin if relevant.]
68
+
69
+ ---
70
+
71
+ ## DEFERRED
72
+
73
+ [Paused work. Revisit during groom.]
74
+
75
+ ---
76
+
77
+ ## DONE / CLOSED
78
+
79
+ | Project/Task | Outcome | Date |
80
+ |-------------|---------|------|
81
+ | {name} | {what happened} | {YYYY-MM-DD or Mon YYYY} |
82
+
83
+ ---
84
+
85
+ ## Quick Reference
86
+
87
+ | Project | Status | Priority |
88
+ |---------|--------|----------|
89
+ | {name} | {status} | **{URGENT/HIGH/MEDIUM/ONGOING}** |
90
+ ```
91
+
92
+ ## Field Documentation
93
+
94
+ | Field | Purpose | Update Cadence |
95
+ |-------|---------|---------------|
96
+ | Status | Current state of the project — be specific, not generic | Every session or when it changes |
97
+ | Location | Path to project folder or app directory | Set once, update on moves |
98
+ | Deadline | Hard deadline if one exists | Set once, update if it moves |
99
+ | Target | Soft target or milestone | Set once, update as needed |
100
+ | Next | THE single next action. Not a list. One thing. | Every session |
101
+ | Blocked | What's preventing progress. Forces clarity. | Update when blockers change |
102
+ | Notes | Context for a fresh Claude session to understand the project | Update when major shifts happen |
103
+
104
+ ## Section Rules
105
+
106
+ | Section | What Goes Here | Graduation Path |
107
+ |---------|---------------|----------------|
108
+ | URGENT | Hard deadlines, critical momentum | → DONE when shipped |
109
+ | HIGH | Active development, no hard deadline | → DONE when shipped, or → DEFERRED if paused |
110
+ | ONGOING | No end date, maintain indefinitely | Never closes, just evolves |
111
+ | TASKS | Bounded work from backlog. Has a finish line. | → DONE when complete |
112
+ | DEFERRED | Paused. Revisit during groom. | → Back to active, or → DONE/killed |
@@ -0,0 +1,100 @@
1
+ # BACKLOG.md Template
2
+
3
+ Output file: `.base/BACKLOG.md`
4
+
5
+ Symlink at workspace root: `BACKLOG.md → .base/BACKLOG.md` (for backward compatibility)
6
+
7
+ ```template
8
+ # Backlog
9
+
10
+ > **Future work, ideas, and deferred tasks.** Not actively working on these - they're queued.
11
+ > For active work, see `ACTIVE.md`. For project details, see `projects/{name}/PLANNING.md`.
12
+ >
13
+ > **Graduation:** Items move to ACTIVE.md (as TASKS or PROJECTS) during groom when ready to work on.
14
+ > **Time-based rules:** Items have review-by dates. Past review-by = "decide or kill." Past staleness = auto-archive.
15
+
16
+ **Last reviewed:** {YYYY-MM-DD}
17
+
18
+ ---
19
+
20
+ ## Quick Capture
21
+
22
+ > Raw ideas. Process into proper entries during groom.
23
+
24
+ - {idea}
25
+
26
+ ---
27
+
28
+ ## High Priority Queue
29
+
30
+ > Next up when capacity opens. Ready to start. Review-by: 7 days.
31
+
32
+ ### {Item Name}
33
+ **Priority:** High
34
+ **Location:** `{path/}` (if applicable)
35
+ **Planning:** `{projects/{name}/PLANNING.md}` (if complex)
36
+ **Context:** [Why this matters, background info]
37
+ **Next Steps:**
38
+ - [ ] [First action]
39
+ - [ ] [Second action]
40
+ **Added:** {YYYY-MM-DD}
41
+ **Notes:** [Additional context]
42
+
43
+ ---
44
+
45
+ ## Medium Priority
46
+
47
+ > Important but not urgent. Review-by: 14 days.
48
+
49
+ ### {Item Name}
50
+ **Priority:** Medium
51
+ **Location:** `{path/}`
52
+ **Context:** [Why this matters]
53
+ **Next Steps:**
54
+ - [ ] [First action]
55
+ **Added:** {YYYY-MM-DD}
56
+
57
+ ---
58
+
59
+ ## Low Priority / Someday
60
+
61
+ > Nice to have. May never happen. Review-by: 30 days.
62
+
63
+ ---
64
+
65
+ ## Processing Rules
66
+
67
+ 1. **Quick Capture** → dump raw idea, process during groom
68
+ 2. **Groom Review** → convert captures to proper entries with context
69
+ 3. **Time-based enforcement:**
70
+ - High: review-by 7 days from Added date
71
+ - Medium: review-by 14 days from Added date
72
+ - Low: review-by 30 days from Added date
73
+ - Staleness = 2x review-by → auto-archive with note
74
+ 4. **Graduate** → move to ACTIVE.md TASKS (bounded) or PROJECT (complex)
75
+ 5. **Kill** → delete if no longer relevant
76
+ 6. **Archive** → keep for reference but remove from active backlog
77
+ ```
78
+
79
+ ## Field Documentation
80
+
81
+ | Field | Purpose | Required? |
82
+ |-------|---------|-----------|
83
+ | Priority | Determines review-by threshold (H:7d, M:14d, L:30d) | Yes |
84
+ | Location | Path to relevant code/docs | If applicable |
85
+ | Planning | Link to PLANNING.md if complex | If applicable |
86
+ | Context | Why this matters — enough for a fresh session to understand | Yes |
87
+ | Next Steps | Concrete actions, not vague goals | Yes (at least 1) |
88
+ | Added | Date item entered backlog — drives time-based rules | Yes |
89
+ | Blocked by | Other backlog items or projects this depends on | If applicable |
90
+ | Notes | Extra context, links, decisions | Optional |
91
+
92
+ ## Graduation Criteria
93
+
94
+ An item is ready to graduate from backlog when:
95
+ - It has clear next steps defined
96
+ - The operator has capacity to work on it
97
+ - Any blockers have been resolved
98
+ - The operator explicitly says "let's do this" during groom
99
+
100
+ **Graduation is never automatic.** The groom flow asks: "Ready to work on any of these?" The operator decides.
@@ -0,0 +1,48 @@
1
+ # STATE.md Template
2
+
3
+ Output file: `.base/STATE.md`
4
+
5
+ ```template
6
+ # BASE — Workspace State
7
+
8
+ **Workspace:** {workspace-name}
9
+ **Last Groom:** {YYYY-MM-DD}
10
+ **Groom Cadence:** {cadence} ({day})
11
+ **Next Groom Due:** {YYYY-MM-DD}
12
+ **Drift Score:** {0-N}
13
+
14
+ ## Health
15
+
16
+ | Area | Status | Last Touched | Groom Due |
17
+ |------|--------|-------------|-----------|
18
+ | {area-name} | {Current|Stale|Critical} | {YYYY-MM-DD} | {YYYY-MM-DD} |
19
+
20
+ ## Satellites
21
+
22
+ | Project | Engine | Phase | Last Activity |
23
+ |---------|--------|-------|--------------|
24
+ | {project-name} | {paul|custom} | {current-phase} | {YYYY-MM-DD} |
25
+
26
+ ## Drift Indicators
27
+
28
+ - ACTIVE.md age: {N} days
29
+ - BACKLOG.md age: {N} days
30
+ - Backlog items past review-by: {N}
31
+ - Orphaned session contexts: {N}
32
+ - Untracked root files: {N}
33
+ - Satellites with stale state: {N}
34
+
35
+ ## Last Audit
36
+
37
+ **Date:** {YYYY-MM-DD}
38
+ **Phases:** {N}
39
+ **Outcome:** [Brief summary of what was cleaned/changed]
40
+ ```
41
+
42
+ ## Status Values
43
+
44
+ | Status | Meaning | Drift Contribution |
45
+ |--------|---------|-------------------|
46
+ | Current | Within groom cadence | 0 |
47
+ | Stale | Past groom cadence by 1-2x | Days overdue |
48
+ | Critical | Past groom cadence by 2x+ | Days overdue (weighted 2x) |
@@ -0,0 +1,50 @@
1
+ # Workspace Manifest Template
2
+
3
+ Output file: `.base/workspace.json`
4
+
5
+ ```template
6
+ {
7
+ "workspace": "{workspace-name}",
8
+ "created": "{YYYY-MM-DD}",
9
+ "groom_cadence": "{weekly|bi-weekly|monthly}",
10
+ "groom_day": "{day-of-week}",
11
+ "areas": {
12
+ "{area-name}": {
13
+ "type": "{working-memory|directory|config-cross-ref|system-layer|custom}",
14
+ "description": "[Human-readable purpose of this area]",
15
+ "paths": ["{file-or-directory-paths}"],
16
+ "groom": "{weekly|bi-weekly|monthly}",
17
+ "audit": {
18
+ "strategy": "{staleness|classify|cross-reference|dead-code|pipeline-status}",
19
+ "config": {}
20
+ }
21
+ }
22
+ },
23
+ "satellites": {
24
+ "{project-name}": {
25
+ "path": "{relative-path-to-project}",
26
+ "engine": "{paul|custom|none}",
27
+ "state": "{path-to-state-file}",
28
+ "registered": "{YYYY-MM-DD}"
29
+ }
30
+ }
31
+ }
32
+ ```
33
+
34
+ ## Field Documentation
35
+
36
+ | Field | Type | Description |
37
+ |-------|------|------------|
38
+ | workspace | string | Name of this workspace (typically the directory name) |
39
+ | created | date | When BASE was initialized in this workspace |
40
+ | groom_cadence | enum | Default grooming frequency for the workspace |
41
+ | groom_day | string | Preferred day for weekly grooming |
42
+ | areas | object | Map of tracked workspace areas |
43
+ | areas.*.type | enum | Classification of the area for audit strategy selection |
44
+ | areas.*.paths | array | Files or directories this area tracks |
45
+ | areas.*.groom | enum | Grooming frequency for this specific area (overrides default) |
46
+ | areas.*.audit.strategy | enum | Which audit strategy to apply (see audit-strategies.md) |
47
+ | areas.*.audit.config | object | Strategy-specific configuration |
48
+ | satellites | object | External projects tracked by BASE but managed by their own engines |
49
+ | satellites.*.engine | enum | What orchestration tool manages this project |
50
+ | satellites.*.state | string | Path to the project's state file for health checks |