create-claude-cabinet 0.46.0 → 0.47.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.
- package/README.md +2 -6
- package/lib/cli.js +348 -91
- package/lib/copy.js +108 -6
- package/lib/db-setup.js +122 -17
- package/lib/metadata.js +51 -2
- package/lib/settings-merge.js +52 -10
- package/lib/watchtower-setup.js +22 -2
- package/package.json +1 -1
- package/templates/cabinet/advisories-state-schema.md +1 -1
- package/templates/cabinet/checklist-stats-schema.md +15 -1
- package/templates/cabinet/memory-lifecycle-contract.md +135 -0
- package/templates/cabinet/pib-db-access.md +13 -0
- package/templates/cabinet/watchtower-contracts.md +414 -0
- package/templates/cabinet/worktree-invocation-contract.md +87 -0
- package/templates/engagement/OVERVIEW.md +12 -0
- package/templates/engagement/__tests__/engagement.test.mjs +177 -2
- package/templates/engagement/__tests__/invoice-doc.test.mjs +195 -0
- package/templates/engagement/engagement-preview.mjs +100 -0
- package/templates/engagement/engagement-schema.md +240 -0
- package/templates/engagement/engagement.mjs +391 -11
- package/templates/engagement/pib-db-patches/pib-db-mcp-server.mjs +5 -44
- package/templates/engagement/pib-db-patches/pib-db.mjs +5 -2
- package/templates/hooks/action-completion-gate.sh +9 -3
- package/templates/hooks/memory-index-guard.sh +17 -11
- package/templates/hooks/watchtower-session-start.sh +24 -2
- package/templates/mcp/pib-db.json +1 -4
- package/templates/mux/bin/mux +8 -1
- package/templates/mux/config/help.txt +1 -0
- package/templates/rules/acknowledge-when-corrected.md +33 -0
- package/templates/rules/maintainability.md +11 -0
- package/templates/rules/memory-capture.md +26 -4
- package/templates/rules/plan-before-bulk-or-irreversible-actions.md +48 -0
- package/templates/rules/verify-before-asserting.md +79 -0
- package/templates/scripts/__tests__/ahead-check-origin.test.mjs +355 -0
- package/templates/scripts/__tests__/batch-disposition.test.mjs +98 -0
- package/templates/scripts/__tests__/claude-churn-authored.test.mjs +90 -0
- package/templates/scripts/__tests__/cross-ring-reader.test.mjs +505 -0
- package/templates/scripts/__tests__/dx-captures-briefing.test.mjs +169 -0
- package/templates/scripts/__tests__/hook-runner.test.mjs +247 -0
- package/templates/scripts/__tests__/narrative-corpus.test.mjs +247 -0
- package/templates/scripts/__tests__/phase-shim.test.mjs +112 -0
- package/templates/scripts/__tests__/qa-handoff-merge-state.test.mjs +162 -0
- package/templates/scripts/__tests__/resolve-cli.test.mjs +314 -0
- package/templates/scripts/__tests__/ring-state-ownership.test.mjs +120 -0
- package/templates/scripts/__tests__/ring1-content-detector.test.mjs +168 -0
- package/templates/scripts/__tests__/ring1-flagged-actions.test.mjs +135 -0
- package/templates/scripts/__tests__/ring1-script-drift.test.mjs +126 -0
- package/templates/scripts/__tests__/ring2-queue-reader.test.mjs +80 -0
- package/templates/scripts/__tests__/ring2-recall-canary.test.mjs +150 -0
- package/templates/scripts/__tests__/ring2-roster-review.test.mjs +311 -0
- package/templates/scripts/__tests__/ring3-chunk-merge.test.mjs +122 -0
- package/templates/scripts/__tests__/ring3-close-lenses.test.mjs +359 -0
- package/templates/scripts/__tests__/ring3-dedup.test.mjs +92 -12
- package/templates/scripts/__tests__/ring3-memory-titles.test.mjs +187 -0
- package/templates/scripts/__tests__/ring3-novelty-rescue.test.mjs +148 -0
- package/templates/scripts/__tests__/ring3-recent-slice.test.mjs +101 -0
- package/templates/scripts/__tests__/ring4-reconcile.test.mjs +393 -0
- package/templates/scripts/__tests__/shared-thread-reader.test.mjs +187 -0
- package/templates/scripts/__tests__/suppression-ledger.test.mjs +148 -0
- package/templates/scripts/__tests__/verify-backfill.test.mjs +103 -0
- package/templates/scripts/__tests__/verify-coverage.test.mjs +80 -0
- package/templates/scripts/__tests__/watchtower-snapshot.test.mjs +261 -0
- package/templates/scripts/__tests__/watchtower-sync.test.mjs +311 -0
- package/templates/scripts/load-triage-history.js +5 -2
- package/templates/scripts/pib-db-mcp-server.mjs +5 -44
- package/templates/scripts/pib-db-path.mjs +61 -0
- package/templates/scripts/pib-db.mjs +5 -2
- package/templates/scripts/validate-memory.mjs +214 -16
- package/templates/scripts/watchtower-advisories.mjs +7 -3
- package/templates/scripts/watchtower-build-context.mjs +192 -8
- package/templates/scripts/watchtower-cross-ring-reader.mjs +700 -0
- package/templates/scripts/watchtower-hook-runner.mjs +422 -0
- package/templates/scripts/watchtower-lib.mjs +273 -4
- package/templates/scripts/watchtower-narrative-corpus.mjs +385 -0
- package/templates/scripts/watchtower-phase-shim.mjs +171 -0
- package/templates/scripts/watchtower-queue.mjs +341 -3
- package/templates/scripts/watchtower-ring1.mjs +405 -45
- package/templates/scripts/watchtower-ring2.mjs +710 -68
- package/templates/scripts/watchtower-ring3-close.mjs +988 -147
- package/templates/scripts/watchtower-ring4-runner.sh +85 -0
- package/templates/scripts/watchtower-ring4.mjs +753 -0
- package/templates/scripts/watchtower-routines.mjs +1 -1
- package/templates/scripts/watchtower-snapshot.mjs +452 -0
- package/templates/scripts/watchtower-sync.mjs +393 -0
- package/templates/skills/briefing/SKILL.md +281 -41
- package/templates/skills/cabinet-process-therapist/SKILL.md +28 -0
- package/templates/skills/cabinet-security/SKILL.md +11 -0
- package/templates/skills/catch-up/SKILL.md +113 -0
- package/templates/skills/cc-publish/SKILL.md +53 -16
- package/templates/skills/cc-remember/SKILL.md +45 -0
- package/templates/skills/close/SKILL.md +107 -0
- package/templates/skills/collab-client/SKILL.md +22 -5
- package/templates/skills/collab-consultant/SKILL.md +110 -2
- package/templates/skills/debrief/SKILL.md +21 -4
- package/templates/skills/debrief-classic/SKILL.md +696 -0
- package/templates/skills/debrief-classic/calibration.md +44 -0
- package/templates/skills/debrief-classic/phases/audit-pattern-capture.md +78 -0
- package/templates/skills/debrief-classic/phases/auto-maintenance.md +48 -0
- package/templates/skills/debrief-classic/phases/checklist-feedback.md +123 -0
- package/templates/skills/debrief-classic/phases/close-work.md +163 -0
- package/templates/skills/debrief-classic/phases/health-checks.md +54 -0
- package/templates/skills/debrief-classic/phases/inventory.md +40 -0
- package/templates/skills/debrief-classic/phases/loose-ends.md +52 -0
- package/templates/skills/debrief-classic/phases/methodology-capture.md +223 -0
- package/templates/skills/debrief-classic/phases/qa-handoff-sweep.md +78 -0
- package/templates/skills/debrief-classic/phases/record-lessons.md +177 -0
- package/templates/skills/debrief-classic/phases/report.md +59 -0
- package/templates/skills/debrief-classic/phases/update-state.md +48 -0
- package/templates/skills/debrief-classic/phases/upstream-feedback.md +185 -0
- package/templates/skills/debrief-classic/phases/verify-coverage.md +101 -0
- package/templates/skills/execute/SKILL.md +71 -6
- package/templates/skills/execute/phases/commit-and-deploy.md +8 -0
- package/templates/skills/execute-group/SKILL.md +23 -26
- package/templates/skills/generate-plan-groups/SKILL.md +20 -0
- package/templates/skills/inbox/SKILL.md +84 -28
- package/templates/skills/memory/SKILL.md +22 -6
- package/templates/skills/orient/SKILL.md +71 -5
- package/templates/skills/orient-classic/SKILL.md +770 -0
- package/templates/skills/orient-classic/phases/auto-maintenance.md +52 -0
- package/templates/skills/orient-classic/phases/briefing.md +53 -0
- package/templates/skills/orient-classic/phases/cabinet.md +46 -0
- package/templates/skills/orient-classic/phases/checklist-status.md +54 -0
- package/templates/skills/orient-classic/phases/context.md +88 -0
- package/templates/skills/orient-classic/phases/data-sync.md +35 -0
- package/templates/skills/orient-classic/phases/deferred-check.md +55 -0
- package/templates/skills/orient-classic/phases/dx-captures.md +53 -0
- package/templates/skills/orient-classic/phases/health-checks.md +50 -0
- package/templates/skills/orient-classic/phases/verify-backfill.md +109 -0
- package/templates/skills/orient-classic/phases/work-scan.md +69 -0
- package/templates/skills/qa-drain/SKILL.md +38 -0
- package/templates/skills/qa-handoff/SKILL.md +287 -46
- package/templates/skills/setup-accounts/SKILL.md +38 -16
- package/templates/skills/threads/SKILL.md +4 -0
- package/templates/skills/validate/phases/validators.md +41 -0
- package/templates/skills/watchtower/SKILL.md +160 -8
- package/templates/verify-runtime/CONVENTIONS.md +9 -0
- package/templates/verify-runtime/README.md +37 -0
- package/templates/watchtower/config.json.template +8 -2
- package/templates/workflows/execute-group-complete.js +10 -1
|
@@ -0,0 +1,770 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: orient-classic
|
|
3
|
+
description: |
|
|
4
|
+
Pre-retirement standalone copy of the classic session-start briefing.
|
|
5
|
+
Reads project state, syncs data, scans work items, runs health checks,
|
|
6
|
+
then briefs you so the session starts informed. A self-contained skeleton
|
|
7
|
+
skill (phases/ directory pattern) that keeps working even after the live
|
|
8
|
+
/orient is retired or redefined by the watchtower transition — it does NOT
|
|
9
|
+
delegate to /orient. Use when: "orient-classic", "/orient-classic", or to
|
|
10
|
+
roll back to the classic session-start briefing during the transition. If
|
|
11
|
+
"quick" is mentioned, use the Quick Mode section — run core phases only,
|
|
12
|
+
skip presentation phases.
|
|
13
|
+
related:
|
|
14
|
+
- type: file
|
|
15
|
+
path: .claude/skills/orient-classic/phases/context.md
|
|
16
|
+
role: "Project-specific: what to read at session start"
|
|
17
|
+
- type: file
|
|
18
|
+
path: .claude/skills/orient-classic/phases/data-sync.md
|
|
19
|
+
role: "Project-specific: how to sync fresh data"
|
|
20
|
+
- type: file
|
|
21
|
+
path: .claude/skills/orient-classic/phases/work-scan.md
|
|
22
|
+
role: "Project-specific: what work items to check"
|
|
23
|
+
- type: file
|
|
24
|
+
path: .claude/skills/orient-classic/phases/deferred-check.md
|
|
25
|
+
role: "Project-specific: evaluate waiting triggers on deferred items"
|
|
26
|
+
- type: file
|
|
27
|
+
path: .claude/skills/orient-classic/phases/health-checks.md
|
|
28
|
+
role: "Project-specific: system health checks"
|
|
29
|
+
- type: file
|
|
30
|
+
path: .claude/skills/orient-classic/phases/auto-maintenance.md
|
|
31
|
+
role: "Project-specific: recurring session-start tasks"
|
|
32
|
+
- type: file
|
|
33
|
+
path: .claude/skills/orient-classic/phases/briefing.md
|
|
34
|
+
role: "Project-specific: how to present the orientation"
|
|
35
|
+
- type: file
|
|
36
|
+
path: .claude/skills/orient-classic/phases/cabinet.md
|
|
37
|
+
role: "Project-specific: which cabinet members to activate"
|
|
38
|
+
- type: file
|
|
39
|
+
path: .claude/skills/orient-classic/phases/skills-menu.md
|
|
40
|
+
role: "Project-specific: what skills to show after briefing"
|
|
41
|
+
- type: file
|
|
42
|
+
path: cabinet/_briefing.md
|
|
43
|
+
role: "Project identity and configuration"
|
|
44
|
+
argument-hint: "mode — e.g., 'quick'"
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
# /orient-classic — Session Briefing (classic)
|
|
48
|
+
|
|
49
|
+
This is the standalone classic copy of the original `/orient` skill,
|
|
50
|
+
preserved so the session-start briefing can be rolled back during the
|
|
51
|
+
watchtower transition. It is fully self-contained: every phase reference
|
|
52
|
+
below resolves to this skill's own `phases/` directory, so it keeps
|
|
53
|
+
working even after the live `/orient` is retired or redefined.
|
|
54
|
+
|
|
55
|
+
## Arguments
|
|
56
|
+
|
|
57
|
+
If `$ARGUMENTS` is provided:
|
|
58
|
+
- **'quick'**: Use Quick Mode — run core phases only, skip presentation
|
|
59
|
+
phases (the Quick Mode section below is self-contained).
|
|
60
|
+
- **Any other value**: Ignored; run normal full orientation.
|
|
61
|
+
- **Empty**: Run normal full orientation.
|
|
62
|
+
|
|
63
|
+
## Purpose
|
|
64
|
+
|
|
65
|
+
Start every session with a briefing. Before anyone makes a decision,
|
|
66
|
+
assemble what happened since last time, what needs attention, and what's
|
|
67
|
+
on the agenda. Without this, Claude starts every session blind — same
|
|
68
|
+
mistakes, same questions, same missed context. Orient reads the past so
|
|
69
|
+
debrief can write the future. That's the loop that gives your cabinet
|
|
70
|
+
continuity.
|
|
71
|
+
|
|
72
|
+
This is a **skeleton skill** using the `phases/` directory pattern. The
|
|
73
|
+
orchestration (what to do and in what order) is generic. Your project
|
|
74
|
+
defines the specifics — what files to read, what data to sync, what work
|
|
75
|
+
items to check — in phase files under `phases/`.
|
|
76
|
+
|
|
77
|
+
### Phase File Protocol
|
|
78
|
+
|
|
79
|
+
Phase files have three states:
|
|
80
|
+
|
|
81
|
+
| State | Meaning |
|
|
82
|
+
|-------|---------|
|
|
83
|
+
| Absent or empty | Use this skeleton's **default behavior** for the phase |
|
|
84
|
+
| Contains only `skip: true` | **Explicitly opted out** — skip this phase entirely |
|
|
85
|
+
| Contains content | **Custom behavior** — use the file's content instead |
|
|
86
|
+
|
|
87
|
+
The skeleton always does something reasonable when a phase file is absent.
|
|
88
|
+
Phase files customize, not enable. Use `skip: true` when you actively
|
|
89
|
+
don't want a phase to run — not even the default.
|
|
90
|
+
|
|
91
|
+
**Phase separation principle:** Phases that both gather data and act on
|
|
92
|
+
the results should use clear structural separation. Without it, the
|
|
93
|
+
model tends to treat data-gathering as completion — running a query
|
|
94
|
+
satisfies the "do something" impulse and the acting step gets skipped.
|
|
95
|
+
Use numbered steps with explicit transitions: "1. Query X. 2. **Now
|
|
96
|
+
act on the results above:** [specific action]." If the acting step is
|
|
97
|
+
critical, mark it as `**BLOCKING**` — querying is not processing.
|
|
98
|
+
|
|
99
|
+
## Why This Matters
|
|
100
|
+
|
|
101
|
+
If Claude Code starts a session without reading what happened last time,
|
|
102
|
+
it has no memory. If it ends a session without recording what happened,
|
|
103
|
+
the next session starts blind. Orient doesn't need to be complex — a
|
|
104
|
+
minimal orient reads a project description and a status file. A mature
|
|
105
|
+
orient pulls fresh data, checks queues, evaluates health, and surfaces
|
|
106
|
+
what needs attention. The complexity grows from use: each check gets
|
|
107
|
+
added because its absence caused a problem. But the loop itself must
|
|
108
|
+
exist from day one, or nothing that follows has a foundation.
|
|
109
|
+
|
|
110
|
+
## Workflow
|
|
111
|
+
|
|
112
|
+
### 0. Frontier-Model Watchdog (core)
|
|
113
|
+
|
|
114
|
+
The operator can designate a frontier model — the model heavy thinking is
|
|
115
|
+
supposed to run on — in `~/.claude/cc-registry.json` under the
|
|
116
|
+
`frontierModel` key (set via `npx create-claude-cabinet --frontier-model
|
|
117
|
+
<value>` or by hand). This check is **visibility only**: it never blocks,
|
|
118
|
+
pins, or routes anything. It exists because the session model is the
|
|
119
|
+
single lever controlling all heavy thinking (skills and spawned cabinet
|
|
120
|
+
members inherit it), and the failure mode is being accidentally on the
|
|
121
|
+
wrong model without noticing.
|
|
122
|
+
|
|
123
|
+
1. Read `frontierModel` from `~/.claude/cc-registry.json`:
|
|
124
|
+
```bash
|
|
125
|
+
node -e "try{const r=require(process.env.HOME+'/.claude/cc-registry.json');const k=(r.frontierModel||'').trim();if(k)console.log(k)}catch(e){}"
|
|
126
|
+
```
|
|
127
|
+
2. **Zero cases (silent no-op, no nag to configure):** key absent, file
|
|
128
|
+
absent, file unparseable, or key empty/whitespace-only. An empty
|
|
129
|
+
string is treated as absent — `''` is a substring of every model ID
|
|
130
|
+
and would match everything, leaving the watchdog permanently silent
|
|
131
|
+
while appearing configured.
|
|
132
|
+
3. Compare the key against this session's own model (you know which
|
|
133
|
+
model you are running as). **This is the canonical match rule** —
|
|
134
|
+
any other runtime implementing this check (e.g. the watchtower
|
|
135
|
+
SessionStart hook) references this definition rather than redefining
|
|
136
|
+
it:
|
|
137
|
+
- **Strip any bracketed runtime suffix from the session model ID
|
|
138
|
+
before exact comparison** — real session IDs carry one (e.g.
|
|
139
|
+
`claude-fable-5[1m]`); the suffix is session configuration, not
|
|
140
|
+
model identity. Alias containment uses the full unstripped ID.
|
|
141
|
+
- The key is an **exact model ID** if it starts with `claude-` AND
|
|
142
|
+
contains a digit (e.g. `claude-fable-5`, `claude-opus-4-8`).
|
|
143
|
+
Exact IDs require an exact, case-insensitive match against the
|
|
144
|
+
suffix-stripped session model ID.
|
|
145
|
+
- Otherwise the key is a **family alias** (e.g. `fable`, `opus`,
|
|
146
|
+
`claude-fable`). Aliases match if the session model ID contains
|
|
147
|
+
the alias, case-insensitively.
|
|
148
|
+
- Examples:
|
|
149
|
+
| Key | Session model | Verdict |
|
|
150
|
+
|---|---|---|
|
|
151
|
+
| `fable` | `claude-fable-5` | match (alias containment) |
|
|
152
|
+
| `fable` | `claude-opus-4-8` | MISMATCH — warn |
|
|
153
|
+
| `claude-fable-5` | `claude-fable-5` | match (exact) |
|
|
154
|
+
| `claude-fable-5` | `claude-fable-5[1m]` | match (exact; bracketed suffix stripped) |
|
|
155
|
+
| `claude-fable-5` | `claude-fable-5-20260301` | MISMATCH — warn (exact key, non-identical ID) |
|
|
156
|
+
| `claude-fable-6` | `claude-fable-5` | MISMATCH — warn (stale key nags loudly by design) |
|
|
157
|
+
| *(absent / empty)* | anything | silent no-op |
|
|
158
|
+
4. **On mismatch, the warning is the FIRST line of the briefing** —
|
|
159
|
+
before any other section, loud and unmissable:
|
|
160
|
+
> ⚠ **This session runs `<session model>`; your designated frontier
|
|
161
|
+
> model is `<key>`** — switch with `/model` or relaunch. (Update the
|
|
162
|
+
> designation with `npx create-claude-cabinet --frontier-model <new>`
|
|
163
|
+
> if it's stale.)
|
|
164
|
+
5. On match, say nothing. Do not block anything either way.
|
|
165
|
+
|
|
166
|
+
A stale key after a model-family transition produces a visible nag —
|
|
167
|
+
that is the design, not a bug: the failure mode is loud by construction,
|
|
168
|
+
and updating the key takes seconds.
|
|
169
|
+
|
|
170
|
+
Boundary note: on installs with the watchtower module, the same check
|
|
171
|
+
also runs in the SessionStart hook (warning lands before orient); on all
|
|
172
|
+
other installs, this orient step is the sole boundary.
|
|
173
|
+
|
|
174
|
+
### 1. Load Context (core)
|
|
175
|
+
|
|
176
|
+
Read `phases/context.md` for the list of files and state to load at
|
|
177
|
+
session start. This typically includes status files, memory from prior
|
|
178
|
+
sessions, and project-specific context.
|
|
179
|
+
|
|
180
|
+
**Default (absent/empty):** Read at minimum:
|
|
181
|
+
- The project's root `CLAUDE.md` (already loaded by Claude Code)
|
|
182
|
+
- `system-status.md` or equivalent state file if one exists
|
|
183
|
+
- `.claude/memory/patterns/` — enforcement patterns from prior sessions.
|
|
184
|
+
Scan the directory, read each pattern file. These are project-level
|
|
185
|
+
feedback that guides behavior (what to avoid, what to keep doing).
|
|
186
|
+
- **Built-in memory index.** Claude Code loads `MEMORY.md` from the
|
|
187
|
+
project's memory dir at session start automatically (200-line /
|
|
188
|
+
25KB budget). During orient, glance at the index sections and load
|
|
189
|
+
topic files whose descriptions match the session's likely focus.
|
|
190
|
+
Resolve the memory dir via:
|
|
191
|
+
```bash
|
|
192
|
+
node -e "console.log(require('./lib/project-context').resolveMemoryDir())" 2>/dev/null || \
|
|
193
|
+
echo "$HOME/.claude/projects/$(pwd | sed 's|/|-|g')/memory"
|
|
194
|
+
```
|
|
195
|
+
Health-check the dir with `node scripts/validate-memory.mjs --quiet`
|
|
196
|
+
if the script exists (surface violations under Attention Items).
|
|
197
|
+
|
|
198
|
+
- **Deployment method detection:** Check for deployment indicators and
|
|
199
|
+
surface the deploy command in the briefing so sessions don't default
|
|
200
|
+
to wrong deployment methods (e.g., `git push` when the project uses
|
|
201
|
+
`railway up`):
|
|
202
|
+
- `railway.toml` → Railway (`railway up --detach`)
|
|
203
|
+
- `fly.toml` → Fly.io (`fly deploy`)
|
|
204
|
+
- `vercel.json` or `.vercel/` → Vercel (`vercel --prod`)
|
|
205
|
+
- `netlify.toml` → Netlify (`netlify deploy --prod`)
|
|
206
|
+
- `.github/workflows/deploy*` → GitHub Actions (push triggers deploy)
|
|
207
|
+
- `Dockerfile` alone → manual container deploy (surface as "Docker-based,
|
|
208
|
+
check deployment docs")
|
|
209
|
+
|
|
210
|
+
If found, include in the briefing: "**Deployment:** [method] via [command]"
|
|
211
|
+
|
|
212
|
+
- **Platform → MCP registry (advisory):** when a deployment platform is
|
|
213
|
+
detected, check whether its agent/MCP integration is registered and, if
|
|
214
|
+
not, surface an advisory (subject to the dismissal state in the
|
|
215
|
+
health-checks section — advisory id `mcp:<platform>`). A missing
|
|
216
|
+
platform MCP has cost real debugging time. **This pass ships Railway
|
|
217
|
+
only**; the registry is shaped for future rows (platform → indicator →
|
|
218
|
+
probe key → install options) but only verified platforms are added
|
|
219
|
+
(vercel/fly/netlify had no GA agent-MCP surface as of 2026-06 — recheck
|
|
220
|
+
at the quarterly landscape review).
|
|
221
|
+
|
|
222
|
+
| Platform | Indicator | Probe (presence only) | Advisory options |
|
|
223
|
+
|---|---|---|---|
|
|
224
|
+
| Railway | `railway.toml` | a railway-ish key under `mcpServers` in `~/.claude.json` | local: `railway setup agent -y` · remote: register `mcp.railway.com` (OAuth, no local install) |
|
|
225
|
+
|
|
226
|
+
**Probe by exit code only — never read or echo `~/.claude.json` values**
|
|
227
|
+
(`mcpServers` holds tokens). For example:
|
|
228
|
+
```bash
|
|
229
|
+
grep -q 'railway' "$HOME/.claude.json" 2>/dev/null || echo "NOT REGISTERED"
|
|
230
|
+
```
|
|
231
|
+
If `~/.claude.json` is absent, skip the probe silently. If the key is
|
|
232
|
+
absent, surface:
|
|
233
|
+
> ⚠ Railway project detected but no Railway MCP registered. Register it
|
|
234
|
+
> for agent access — local: `railway setup agent -y`, or remote: add
|
|
235
|
+
> `mcp.railway.com` via OAuth. (Offer both; hardcode neither.)
|
|
236
|
+
|
|
237
|
+
The goal: build a mental model of where things stand before doing
|
|
238
|
+
anything else.
|
|
239
|
+
|
|
240
|
+
### Feedback pipeline check
|
|
241
|
+
|
|
242
|
+
> The feedback **outbox flush** is no longer orient's job. Watchtower
|
|
243
|
+
> Ring 1 (`flushFeedbackOutbox()` in `watchtower-lib.mjs`) is the sole
|
|
244
|
+
> owner of delivering `~/.claude/cc-feedback-outbox.json` into the CC
|
|
245
|
+
> repo's `feedback/`, every tick (act:d53ff509). Orient's duplicate
|
|
246
|
+
> flush used an incompatible `{date}-{slug}-{seq}.md` filename scheme
|
|
247
|
+
> that defeated Ring 1's skip-if-exists guard, causing re-delivery of
|
|
248
|
+
> already-resolved items — it has been retired.
|
|
249
|
+
|
|
250
|
+
1. **Scan wrong-write locations.** Check `.claude/memory/feedback/*.md`
|
|
251
|
+
and `.claude/feedback/*.md` for files that may be CC upstream
|
|
252
|
+
feedback misfiled. **Exclude project-scoped files** — skip any file
|
|
253
|
+
whose name starts with `feedback-project-` or whose frontmatter
|
|
254
|
+
contains `scope: project-specific`. Those are intentionally
|
|
255
|
+
project-scoped decisions/constraints, not CC upstream feedback; they
|
|
256
|
+
belong in the project's built-in memory dir (per-file curated entries
|
|
257
|
+
via `/cc-remember`), CLAUDE.md, or a pib-db deferred trigger — not
|
|
258
|
+
in the outbox.
|
|
259
|
+
If remaining candidates found: "Found N feedback files in [path]
|
|
260
|
+
that may be CC upstream feedback written to the wrong location.
|
|
261
|
+
Move to outbox?"
|
|
262
|
+
|
|
263
|
+
2. **Triage incoming feedback at arrival (CC source repo only).**
|
|
264
|
+
`feedback/` root means exactly one thing: *not yet triaged*. It is
|
|
265
|
+
an inbox, not a backlog — resolution state lives in pib-db, never
|
|
266
|
+
in file location. For each `.md` file in `feedback/` root (not
|
|
267
|
+
`resolved/`):
|
|
268
|
+
|
|
269
|
+
- **File it**: create a pib-db action (or attach to an existing
|
|
270
|
+
one), then prepend a one-line resolution stamp
|
|
271
|
+
(`> **Resolution (date):** tracked — act:xxxx`) and move the file
|
|
272
|
+
to `feedback/resolved/`.
|
|
273
|
+
- **Or decline it**: prepend the stamp with the decline reason and
|
|
274
|
+
move it to `feedback/resolved/`.
|
|
275
|
+
- **Or leave it** only when the triage genuinely needs the
|
|
276
|
+
operator — surface it in the briefing's Attention Items and say
|
|
277
|
+
why.
|
|
278
|
+
|
|
279
|
+
**BLOCKING** — counting the files is not triaging them. A file
|
|
280
|
+
still in root after two sessions is a process failure, not a
|
|
281
|
+
backlog item. (Rule adopted 2026-06-11 after 76 files accumulated
|
|
282
|
+
across two months and required a three-agent reconciliation sweep;
|
|
283
|
+
the file-location-as-status parallel to pib-db is exactly the
|
|
284
|
+
two-sources-of-truth drift `maintainability.md` warns about.)
|
|
285
|
+
|
|
286
|
+
### 2. Sync Data (core)
|
|
287
|
+
|
|
288
|
+
Read `phases/data-sync.md` for how to pull fresh canonical data from
|
|
289
|
+
remote sources (databases, APIs, shared storage).
|
|
290
|
+
|
|
291
|
+
**Skip (absent/empty).** Purely local projects don't need it. Projects
|
|
292
|
+
with remote canonical data stores define their sync commands here.
|
|
293
|
+
|
|
294
|
+
Report if sync fails — a stale local cache is better than no data, but
|
|
295
|
+
the user should know it's stale.
|
|
296
|
+
|
|
297
|
+
### 3. Scan Work Items (core)
|
|
298
|
+
|
|
299
|
+
Read `phases/work-scan.md` for what work items to check. This includes
|
|
300
|
+
whatever the project uses to track work: a backlog, task list, inbox,
|
|
301
|
+
queue, or issue tracker.
|
|
302
|
+
|
|
303
|
+
**Default (absent/empty):** If `scripts/pib-db.mjs` exists, run the
|
|
304
|
+
standard work scan.
|
|
305
|
+
|
|
306
|
+
**Access method:** Use `pib_*` MCP tools when available (see
|
|
307
|
+
`.claude/cabinet/pib-db-access.md`), fall back to `node scripts/pib-db.mjs`
|
|
308
|
+
CLI.
|
|
309
|
+
|
|
310
|
+
1. **Active projects and open actions:**
|
|
311
|
+
Use `pib_query` (or `node scripts/pib-db.mjs query`) with:
|
|
312
|
+
```sql
|
|
313
|
+
SELECT p.fid, p.name,
|
|
314
|
+
(SELECT COUNT(*) FROM actions a WHERE a.project_fid = p.fid AND a.completed = 0 AND a.deleted_at IS NULL) as open_actions
|
|
315
|
+
FROM projects p
|
|
316
|
+
WHERE p.status = 'active' AND p.deleted_at IS NULL
|
|
317
|
+
ORDER BY open_actions DESC
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
2. **Flagged actions** (prioritized items needing attention):
|
|
321
|
+
Use `pib_query` (or `node scripts/pib-db.mjs query`) with:
|
|
322
|
+
```sql
|
|
323
|
+
SELECT a.fid, a.text, p.name as project
|
|
324
|
+
FROM actions a
|
|
325
|
+
LEFT JOIN projects p ON a.project_fid = p.fid
|
|
326
|
+
WHERE a.flagged = 1 AND a.completed = 0 AND a.deleted_at IS NULL
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
3. **Staleness detection** — flag projects that need attention:
|
|
330
|
+
|
|
331
|
+
**Completion candidates** — active projects where all actions are done:
|
|
332
|
+
Use `pib_query` (or `node scripts/pib-db.mjs query`) with:
|
|
333
|
+
```sql
|
|
334
|
+
SELECT p.fid, p.name
|
|
335
|
+
FROM projects p
|
|
336
|
+
WHERE p.status = 'active' AND p.deleted_at IS NULL
|
|
337
|
+
AND (SELECT COUNT(*) FROM actions a WHERE a.project_fid = p.fid) > 0
|
|
338
|
+
AND (SELECT COUNT(*) FROM actions a WHERE a.project_fid = p.fid AND a.completed = 0 AND a.deleted_at IS NULL) = 0
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
**Stale projects** — active projects with no action completed in 14+ days:
|
|
342
|
+
Use `pib_query` (or `node scripts/pib-db.mjs query`) with:
|
|
343
|
+
```sql
|
|
344
|
+
SELECT p.fid, p.name,
|
|
345
|
+
MAX(a.completed_at) as last_completion
|
|
346
|
+
FROM projects p
|
|
347
|
+
LEFT JOIN actions a ON a.project_fid = p.fid AND a.completed = 1
|
|
348
|
+
WHERE p.status = 'active' AND p.deleted_at IS NULL
|
|
349
|
+
AND (SELECT COUNT(*) FROM actions a2 WHERE a2.project_fid = p.fid AND a2.completed = 0 AND a2.deleted_at IS NULL) > 0
|
|
350
|
+
GROUP BY p.fid
|
|
351
|
+
HAVING last_completion < date('now', '-14 days')
|
|
352
|
+
OR last_completion IS NULL
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
Surface in briefing as actionable signals:
|
|
356
|
+
- "N projects may be ready to close (0 open actions)"
|
|
357
|
+
- "N projects have had no activity in 14+ days"
|
|
358
|
+
|
|
359
|
+
4. **Spring-clean heuristic** — suggest `/spring-clean` when the backlog
|
|
360
|
+
shows structural cruft. Fire when ANY of:
|
|
361
|
+
- An active project has 10+ open actions AND no completion in 14+ days
|
|
362
|
+
- Total active projects > 7
|
|
363
|
+
Cap at once per 7 days — check if a spring-clean note exists in the
|
|
364
|
+
last 7 days of session context before surfacing. When it fires,
|
|
365
|
+
append to Attention Items:
|
|
366
|
+
*"Backlog may benefit from `/spring-clean` (N stale, M open actions
|
|
367
|
+
in mega-projects)."*
|
|
368
|
+
|
|
369
|
+
If pib-db doesn't exist, skip with no warning — the project may use
|
|
370
|
+
a different work tracking system configured in `phases/work-scan.md`.
|
|
371
|
+
|
|
372
|
+
### 4. Deferred-Trigger Evaluation (core)
|
|
373
|
+
|
|
374
|
+
Read `phases/deferred-check.md` for how to surface items waiting on
|
|
375
|
+
specific trigger conditions and evaluate whether any now apply in the
|
|
376
|
+
current session's context.
|
|
377
|
+
|
|
378
|
+
**Default (absent/empty):** If pib-db is available, call `pib_list_triggered`
|
|
379
|
+
(MCP) or `node scripts/pib-db.mjs list-triggered` (CLI fallback). If zero
|
|
380
|
+
items are returned, skip silently. Otherwise:
|
|
381
|
+
|
|
382
|
+
1. Surface items in the briefing under a "Deferred (N items with triggers)"
|
|
383
|
+
heading with each item's fid, text, trigger condition, and
|
|
384
|
+
last-checked status.
|
|
385
|
+
2. For each item, evaluate the trigger text against current session
|
|
386
|
+
context (project state, recent git activity, user's stated focus).
|
|
387
|
+
If unsure, mark `needs-info` rather than guessing `triggered`.
|
|
388
|
+
3. For each item, call `pib_mark_trigger_checked` with result
|
|
389
|
+
(`triggered | still-waiting | needs-info | condition-obsolete`)
|
|
390
|
+
and brief reasoning in notes.
|
|
391
|
+
4. Include any items that evaluated to `triggered` in the briefing's
|
|
392
|
+
**Attention Items** section. For each, collect the user's decision
|
|
393
|
+
via `AskUserQuestion`:
|
|
394
|
+
- `header`: `"Triggered"`
|
|
395
|
+
- `question`: "[fid] appears triggered — [trigger summary]. What to do?"
|
|
396
|
+
- `options`:
|
|
397
|
+
- Reopen — "Change status back to open, ready to work"
|
|
398
|
+
- Leave deferred — "Keep it deferred, not ready yet"
|
|
399
|
+
- Mark obsolete — "Trigger condition no longer relevant"
|
|
400
|
+
- `multiSelect: false`
|
|
401
|
+
|
|
402
|
+
Map: Reopen → status to open; Leave deferred → no-op; Mark obsolete
|
|
403
|
+
→ `pib_mark_trigger_checked` with `condition-obsolete`.
|
|
404
|
+
(See `skill-output-conventions.md`.)
|
|
405
|
+
|
|
406
|
+
**Cost control:** Cap this phase at 30 seconds total. If N > 10 items,
|
|
407
|
+
evaluate only the 5 least-recently-checked.
|
|
408
|
+
|
|
409
|
+
### 5. Health Checks (core)
|
|
410
|
+
|
|
411
|
+
Read `phases/health-checks.md` for system health and validation checks
|
|
412
|
+
to run at session start. These catch problems early — stale data, broken
|
|
413
|
+
references, failed background processes, configuration drift.
|
|
414
|
+
|
|
415
|
+
**Skip (absent/empty).** Projects add health checks as they discover
|
|
416
|
+
failure modes worth detecting early.
|
|
417
|
+
|
|
418
|
+
**Built-in check (always runs):** If `~/.claude/cc-registry.json`
|
|
419
|
+
exists, verify this project is in it and the entry is current. If
|
|
420
|
+
other registry entries point to paths that no longer exist, silently
|
|
421
|
+
note it — mention during briefing only if the user might care (e.g.,
|
|
422
|
+
"Your old project 'deal-v1' seems to have been deleted — want me to
|
|
423
|
+
remove it from the registry?").
|
|
424
|
+
|
|
425
|
+
### Environment advisories have a background home — skip when watchtower owns them
|
|
426
|
+
|
|
427
|
+
The LSP, platform-MCP, hookify, and briefing-file advisories below now have a
|
|
428
|
+
single home: the watchtower **SessionStart context builder**, which runs
|
|
429
|
+
`scripts/watchtower-advisories.mjs` with a persistent per-project dismissal
|
|
430
|
+
memory (`.claude/cabinet/advisories-state.json`; rules in
|
|
431
|
+
`.claude/cabinet/advisories-state-schema.md`) so nothing re-nags every
|
|
432
|
+
session. That module is the single implementation of the dismissal rules
|
|
433
|
+
(act:f9ea075d).
|
|
434
|
+
|
|
435
|
+
- **If watchtower is installed** (`~/.claude-cabinet/watchtower/config.json`
|
|
436
|
+
exists), the context builder already surfaced these advisories in the
|
|
437
|
+
ambient state injection — **SKIP the advisory checks below** (LSP, hookify,
|
|
438
|
+
briefing file). Re-running them here only double-nags.
|
|
439
|
+
- **Otherwise (no watchtower)**, run the checks below as **one-shot hints**
|
|
440
|
+
with no dismissal memory. If `scripts/watchtower-advisories.mjs` is present,
|
|
441
|
+
prefer shelling it (`node scripts/watchtower-advisories.mjs --project-path .`,
|
|
442
|
+
one hint per line) — it is the single implementation. These advisories
|
|
443
|
+
**show** an install command; they NEVER run it.
|
|
444
|
+
|
|
445
|
+
### LSP plugin check
|
|
446
|
+
|
|
447
|
+
Detect the project's tech stack and verify matching LSP plugins (advisory
|
|
448
|
+
ids `lsp:<lang>` — subject to the dismissal state above):
|
|
449
|
+
|
|
450
|
+
| Indicator | Language | Plugin | Install command |
|
|
451
|
+
|---|---|---|---|
|
|
452
|
+
| tsconfig.json or *.ts files | TypeScript | typescript-lsp | `/plugin install typescript-lsp` |
|
|
453
|
+
| pyproject.toml, requirements.txt, *.py | Python | pyright-lsp | `/plugin install pyright-lsp` |
|
|
454
|
+
| Cargo.toml | Rust | rust-analyzer-lsp | `/plugin install rust-analyzer-lsp` |
|
|
455
|
+
| go.mod | Go | gopls-lsp | `/plugin install gopls-lsp` |
|
|
456
|
+
| Gemfile or *.rb files | Ruby | ruby-lsp | `/plugin install ruby-lsp@claude-plugins-official` |
|
|
457
|
+
|
|
458
|
+
For each detected language, check if the plugin is installed:
|
|
459
|
+
```bash
|
|
460
|
+
claude plugin list 2>/dev/null | grep -q "<plugin-name>" || echo "NOT INSTALLED"
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
Surface missing plugins as health warnings (respecting the dismissal state):
|
|
464
|
+
> ⚠ TypeScript detected but typescript-lsp not installed. This plugin
|
|
465
|
+
> catches missing imports, type errors, and invalid props automatically
|
|
466
|
+
> after every edit. Install: `/plugin install typescript-lsp`
|
|
467
|
+
|
|
468
|
+
**Ruby is special — two more prerequisites.** The ruby-lsp plugin is a
|
|
469
|
+
no-op unless the gem is present AND the LSP tool is enabled. The advisory
|
|
470
|
+
MUST state both, or it sends the user into a silent no-op:
|
|
471
|
+
> ⚠ Ruby detected but ruby-lsp not active. Install the plugin
|
|
472
|
+
> (`/plugin install ruby-lsp@claude-plugins-official`), the gem
|
|
473
|
+
> (`gem install ruby-lsp`), and set `ENABLE_LSP_TOOL=1`.
|
|
474
|
+
|
|
475
|
+
Advisory only — do not block orient for missing plugins.
|
|
476
|
+
|
|
477
|
+
### hookify advisory (advisory id `plugin:hookify`)
|
|
478
|
+
|
|
479
|
+
If `.claude/rules/enforcement-pipeline.md` exists in the project AND
|
|
480
|
+
`hookify` is absent from `claude plugin list` output, surface a one-line
|
|
481
|
+
advisory (subject to the dismissal state above — note its signal is
|
|
482
|
+
**static**, so a declined hookify stays declined):
|
|
483
|
+
> ⚠ This project uses the enforcement pipeline but `hookify` isn't
|
|
484
|
+
> installed — it generates hooks from natural language. Install:
|
|
485
|
+
> `/plugin install hookify`
|
|
486
|
+
|
|
487
|
+
Edge case: if `claude plugin list` fails or hangs, skip silently —
|
|
488
|
+
advisory absence is safe.
|
|
489
|
+
|
|
490
|
+
### Unmerged branch check
|
|
491
|
+
|
|
492
|
+
Scan for branches with commits ahead of the main branch that may
|
|
493
|
+
represent unmerged work from prior sessions (especially worktree
|
|
494
|
+
sessions that ended without merging):
|
|
495
|
+
|
|
496
|
+
```bash
|
|
497
|
+
git for-each-ref --format='%(refname:short)' refs/heads/ | while read branch; do
|
|
498
|
+
ahead=$(git log --oneline main..$branch 2>/dev/null | wc -l | tr -d ' ')
|
|
499
|
+
if [ "$ahead" -gt 0 ]; then
|
|
500
|
+
echo "$branch: $ahead commits ahead"
|
|
501
|
+
fi
|
|
502
|
+
done
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
Also check `git worktree list` for active worktrees whose branches
|
|
506
|
+
have diverged from main.
|
|
507
|
+
|
|
508
|
+
Surface as advisory, then collect the decision via `AskUserQuestion`:
|
|
509
|
+
- `header`: `"Branch"`
|
|
510
|
+
- `question`: "Branch `[name]` has N commits ahead of main. What to do?"
|
|
511
|
+
- `options`:
|
|
512
|
+
- Merge — "Merge into main now"
|
|
513
|
+
- Continue — "Leave it, still working on it"
|
|
514
|
+
- Discard — "Delete the branch (destructive)"
|
|
515
|
+
- `multiSelect: false`
|
|
516
|
+
|
|
517
|
+
Map: Merge → `git merge [branch]` (surface conflicts if any). Continue →
|
|
518
|
+
no-op. Discard → warn "permanently deletes N commits" and require
|
|
519
|
+
explicit second confirmation before `git branch -D`.
|
|
520
|
+
|
|
521
|
+
**Known platform limitation:** The Claude Code Agent tool with
|
|
522
|
+
`isolation: "worktree"` branches from the remote tracking ref, not
|
|
523
|
+
local HEAD. Unpushed commits are invisible to worktree agents. Always
|
|
524
|
+
push before spawning worktree agents, or manually review their diffs
|
|
525
|
+
for spurious deletions of unpushed work.
|
|
526
|
+
|
|
527
|
+
### Briefing file check
|
|
528
|
+
|
|
529
|
+
Verify that cabinet briefing files exist at `.claude/cabinet/`. Without
|
|
530
|
+
these, cabinet members run without project context and produce generic
|
|
531
|
+
findings.
|
|
532
|
+
|
|
533
|
+
Check for `.claude/cabinet/_briefing.md` (the hub file). If absent:
|
|
534
|
+
|
|
535
|
+
> ⚠ No cabinet briefing files found at `.claude/cabinet/`. Cabinet
|
|
536
|
+
> members will run without project context. Run `/onboard` to generate
|
|
537
|
+
> them.
|
|
538
|
+
|
|
539
|
+
If briefing files exist at the project root (`_briefing.md`,
|
|
540
|
+
`_briefing-identity.md`, etc.) but NOT in `.claude/cabinet/`:
|
|
541
|
+
|
|
542
|
+
> ⚠ Briefing files found at project root but not in `.claude/cabinet/`
|
|
543
|
+
> where cabinet members expect them. Move them:
|
|
544
|
+
> `mkdir -p .claude/cabinet && mv _briefing*.md .claude/cabinet/`
|
|
545
|
+
|
|
546
|
+
Advisory — do not block orient for missing briefings.
|
|
547
|
+
|
|
548
|
+
> **Orient vs Pulse vs Audit:** Orient health checks verify *operational*
|
|
549
|
+
> state — is the system running, is data fresh, are processes alive?
|
|
550
|
+
> Pulse (embedded in orient) verifies *descriptive* accuracy — do counts
|
|
551
|
+
> match, do documented states match reality? Audit verifies *quality*
|
|
552
|
+
> through expert cabinet members — is the code sound, are conventions
|
|
553
|
+
> holding? Orient runs every session; pulse runs inside it; audit runs
|
|
554
|
+
> periodically. Each asks a different question about the same system.
|
|
555
|
+
|
|
556
|
+
### 6. Auto-Maintenance (core)
|
|
557
|
+
|
|
558
|
+
Read `phases/auto-maintenance.md` for recurring automated tasks that
|
|
559
|
+
should run every session. These are operations that would decay if left
|
|
560
|
+
to human memory — the anti-entropy principle in action.
|
|
561
|
+
|
|
562
|
+
**Default (absent/empty):** Run the built-in memory structural validator
|
|
563
|
+
if available: `node scripts/validate-memory.mjs --quiet || true`. Catches
|
|
564
|
+
orphan files, broken references, exceeded caps. Surface violations under
|
|
565
|
+
Attention Items. No periodic consolidation or compaction needed — memory
|
|
566
|
+
is file-based and self-persistent. Projects add additional maintenance
|
|
567
|
+
tasks as they discover operations that need regular execution.
|
|
568
|
+
|
|
569
|
+
### 7. Activate Cabinet Members (core)
|
|
570
|
+
|
|
571
|
+
Read `phases/cabinet.md` for which expert cabinet members or lenses
|
|
572
|
+
should be active during this session. Cabinet members watch for specific
|
|
573
|
+
concerns (quality, security, process adherence, non-project items)
|
|
574
|
+
without being explicitly invoked for each decision.
|
|
575
|
+
|
|
576
|
+
**Skip (absent/empty).**
|
|
577
|
+
|
|
578
|
+
### 8. Cabinet Consultations (core)
|
|
579
|
+
|
|
580
|
+
Spawn cabinet members whose `standing-mandate` includes `orient`.
|
|
581
|
+
|
|
582
|
+
**Discovery:** Read `.claude/skills/_index.json` and filter to entries
|
|
583
|
+
where `standingMandate` includes `"orient"`. Each matching entry has
|
|
584
|
+
a `directives.orient` field — this is the scoped task for that member.
|
|
585
|
+
If the index is missing, fall back to reading `cabinet-*/SKILL.md`
|
|
586
|
+
frontmatter for `standing-mandate` and `directives`.
|
|
587
|
+
|
|
588
|
+
**Index shape gotcha:** the file is a JSON *object* with a top-level
|
|
589
|
+
`skills` array — entries live at `.skills[]`, not at the document
|
|
590
|
+
root. If the file exists but fails to parse or has an unexpected
|
|
591
|
+
shape, SAY SO in the output and use the frontmatter fallback — never
|
|
592
|
+
silently skip consultations (a quiet parse failure has silently
|
|
593
|
+
skipped this core phase before).
|
|
594
|
+
|
|
595
|
+
**For each matching member**, spawn an agent with:
|
|
596
|
+
- The member's full SKILL.md (read from the `path` in the index)
|
|
597
|
+
- The context loaded in step 1 (project state, recent work)
|
|
598
|
+
- The member's `directives.orient` as the task
|
|
599
|
+
|
|
600
|
+
Spawn in parallel where possible. If a member has no directive for
|
|
601
|
+
`orient`, skip it — a standing mandate without a directive is a data
|
|
602
|
+
error, not a reason to give the member an open-ended task.
|
|
603
|
+
|
|
604
|
+
**Cost control:** These are lightweight passes, not full audits. Each
|
|
605
|
+
agent should complete in under 1 minute. Include their output in the
|
|
606
|
+
briefing only when they have something to contribute. Silent is fine.
|
|
607
|
+
|
|
608
|
+
**Persist actionable findings (BLOCKING — printing is not persisting):**
|
|
609
|
+
A finding that exists only as briefing prose evaporates the moment the
|
|
610
|
+
user scrolls past it. After collecting member output:
|
|
611
|
+
|
|
612
|
+
1. Classify each finding a member surfaced: **informational** (context
|
|
613
|
+
the user reads once — a status confirmation, color on the current
|
|
614
|
+
state) vs **actionable** (a new capability to evaluate, a breaking
|
|
615
|
+
change to check, a recurring gap — anything that implies future
|
|
616
|
+
work or a decision). When unsure, classify actionable: dismissing
|
|
617
|
+
a tracked item is cheap; an evaporated finding is unrecoverable.
|
|
618
|
+
2. **Now act on the classifications above.** Every actionable finding
|
|
619
|
+
MUST be persisted BEFORE the briefing renders:
|
|
620
|
+
- **Watchtower installed** (the queue API at
|
|
621
|
+
`~/.claude-cabinet/watchtower/scripts/watchtower-queue.mjs`
|
|
622
|
+
exists): file an `advisor-finding` inbox item — the SAME category
|
|
623
|
+
and discipline as Ring 3's session advisor pass (see "Session
|
|
624
|
+
Advisor Pass" in `watchtower-contracts.md`), never a parallel
|
|
625
|
+
path. Dedup first: read the project's pending items via
|
|
626
|
+
`listPending` and the recent resolved/dismissed corpus via
|
|
627
|
+
`listItems`; if an existing item already covers the finding,
|
|
628
|
+
reference its id instead of filing a duplicate. File via the
|
|
629
|
+
queue API (same temp-file + `createItem` pattern as /qa-handoff
|
|
630
|
+
Step 5) with title `<member-short-name>: <finding title>`,
|
|
631
|
+
`category: "advisor-finding"`, `filed_by: "manual"`, and
|
|
632
|
+
`evidence: {member, directive_key: "orient"}`. Cap at 2 filed
|
|
633
|
+
items per member per session (Phase 2m's cap) — file the most
|
|
634
|
+
consequential; the rest stay informational lines.
|
|
635
|
+
- **No watchtower, pib-db available, and the target project is
|
|
636
|
+
unambiguous:** create a pib-db action instead (`pib_create_action`
|
|
637
|
+
or `node scripts/pib-db.mjs`), carrying the member name and the
|
|
638
|
+
finding in the notes.
|
|
639
|
+
- **Neither available:** mark the finding **UNTRACKED** in its
|
|
640
|
+
briefing line — loudly, so the user knows nothing persists it.
|
|
641
|
+
3. Each briefing line for an actionable finding cites the filed id
|
|
642
|
+
(`dec-…` queue id or `act:…` fid) so the user can see it is
|
|
643
|
+
tracked, not merely mentioned.
|
|
644
|
+
|
|
645
|
+
### 9. Present Briefing (presentation)
|
|
646
|
+
|
|
647
|
+
Read `phases/briefing.md` for how to present the orientation results.
|
|
648
|
+
This phase controls format, sections, tone, and any time-aware or
|
|
649
|
+
context-aware presentation modes.
|
|
650
|
+
|
|
651
|
+
**Default (absent/empty):** Present a structured briefing with these
|
|
652
|
+
required sections in this order:
|
|
653
|
+
|
|
654
|
+
1. **Project State** — version, what's active, high-level status
|
|
655
|
+
2. **Work Items** — active projects, open action counts, flagged/overdue
|
|
656
|
+
items listed explicitly
|
|
657
|
+
3. **Attention Items** — anything surfaced by health checks, feedback
|
|
658
|
+
reports, extraction proposals, stale/completable projects
|
|
659
|
+
4. **Maintenance** — memory validator results (if any violations), any project-specific weekly tasks run
|
|
660
|
+
5. **Cabinet Notes** — output from cabinet consultations (only if they
|
|
661
|
+
had something to say). Actionable findings cite the id they were
|
|
662
|
+
filed under in step 8 (`dec-…` or `act:…`) — or say **UNTRACKED**
|
|
663
|
+
when no persistence layer was available.
|
|
664
|
+
|
|
665
|
+
Keep sections consistent across sessions. Omit a section only if it
|
|
666
|
+
has literally nothing to report (not "nothing interesting" — nothing
|
|
667
|
+
at all). Use the same section names and order every time.
|
|
668
|
+
|
|
669
|
+
### 10. Show Available Skills (core)
|
|
670
|
+
|
|
671
|
+
After the briefing, show the user what skills are available. This
|
|
672
|
+
serves the same purpose as a menu at a restaurant — you can't order
|
|
673
|
+
what you don't know exists.
|
|
674
|
+
|
|
675
|
+
**Default (absent/empty):** Invoke the `/menu` skill. This dynamically
|
|
676
|
+
discovers all skills in `.claude/skills/` (both CC upstream and project-
|
|
677
|
+
specific), reads their frontmatter, and presents them grouped by
|
|
678
|
+
auto-invocable vs manual. It also suggests which skills are most
|
|
679
|
+
relevant given current context.
|
|
680
|
+
|
|
681
|
+
Read `phases/skills-menu.md` for project-specific overrides (e.g.,
|
|
682
|
+
highlighting certain skills, suppressing others, or changing the
|
|
683
|
+
presentation format).
|
|
684
|
+
|
|
685
|
+
### 11. Discover Custom Phases
|
|
686
|
+
|
|
687
|
+
After running the core phases above, check for any additional phase
|
|
688
|
+
files in `phases/` that the skeleton doesn't define. These are project-
|
|
689
|
+
specific extensions. Each custom phase file declares its position in the
|
|
690
|
+
workflow (e.g., "runs after work scan, before briefing"). Execute them
|
|
691
|
+
at their declared position.
|
|
692
|
+
|
|
693
|
+
### 12. Name the Session
|
|
694
|
+
|
|
695
|
+
Rename the session so the sidebar is scannable. Every session that starts
|
|
696
|
+
with `/orient-classic` looks identical in the history — naming fixes this.
|
|
697
|
+
|
|
698
|
+
After the briefing and the user's response, derive a short name (3-6
|
|
699
|
+
words) from what the user says they're working on. If the user hasn't
|
|
700
|
+
stated a focus, ask.
|
|
701
|
+
|
|
702
|
+
## Phase Summary
|
|
703
|
+
|
|
704
|
+
| Phase | Absent = | What it customizes |
|
|
705
|
+
|-------|----------|-------------------|
|
|
706
|
+
| `context.md` | Default: read CLAUDE.md, status, memory | What files and state to load |
|
|
707
|
+
| `data-sync.md` | Skip | How to sync remote data |
|
|
708
|
+
| `work-scan.md` | Default: pib-db scan + staleness detection | What work items to check |
|
|
709
|
+
| `deferred-check.md` | Skip silently if no triggered items | Surface waiting items and evaluate triggers |
|
|
710
|
+
| `health-checks.md` | Skip | System health checks |
|
|
711
|
+
| `auto-maintenance.md` | Default: memory structural validator | Recurring session-start tasks |
|
|
712
|
+
| `cabinet.md` | Skip | Which cabinet members to activate |
|
|
713
|
+
| `briefing.md` | Default: simple summary | How to present orientation |
|
|
714
|
+
| `skills-menu.md` | Default: invoke /menu | What skills to show and how |
|
|
715
|
+
|
|
716
|
+
## Quick Mode
|
|
717
|
+
|
|
718
|
+
Phases are either **core** (maintain system state) or **presentation**
|
|
719
|
+
(surface information for the user). For lightweight sessions where the
|
|
720
|
+
user already knows what they're doing, skip presentation phases. Core
|
|
721
|
+
phases always run because they keep the system healthy.
|
|
722
|
+
|
|
723
|
+
- **Core phases** (always run): frontier-model watchdog, context,
|
|
724
|
+
data-sync, work-scan, deferred-check, health-checks, auto-maintenance,
|
|
725
|
+
cabinet, cabinet-consultations
|
|
726
|
+
- **Presentation phases** (skippable): briefing, skills-menu
|
|
727
|
+
|
|
728
|
+
A quick orient skips the presentation phases: instead of the full
|
|
729
|
+
briefing and the /menu invocation, output a compact confirmation —
|
|
730
|
+
attention items surfaced by the core phases, then a one-line pointer
|
|
731
|
+
that `/menu` lists available skills.
|
|
732
|
+
|
|
733
|
+
## Extending
|
|
734
|
+
|
|
735
|
+
To customize a phase: write content in the corresponding `phases/` file.
|
|
736
|
+
To skip a phase: leave the file empty or don't create it.
|
|
737
|
+
To add a phase the skeleton doesn't define: create a new file in
|
|
738
|
+
`phases/` with a description of when it runs relative to the core
|
|
739
|
+
phases. Claude reads whatever phase files exist at runtime.
|
|
740
|
+
|
|
741
|
+
Examples of phases mature projects add:
|
|
742
|
+
- Command queue processing (check for instructions from external UIs)
|
|
743
|
+
- Deferred item evaluation (re-check trigger conditions on paused work)
|
|
744
|
+
- Time-aware briefing modes (first session of day vs. returning session)
|
|
745
|
+
- Calendar integration (upcoming events that need preparation)
|
|
746
|
+
|
|
747
|
+
## Calibration
|
|
748
|
+
|
|
749
|
+
**Core failure this targets:** Starting a session without context, forcing
|
|
750
|
+
the user to reconstruct state from memory or ask for information the
|
|
751
|
+
system already has.
|
|
752
|
+
|
|
753
|
+
### Without Skill (Bad)
|
|
754
|
+
|
|
755
|
+
New session starts. Claude says "How can I help?" The user asks about
|
|
756
|
+
their project status — Claude searches files, reads logs, gives a partial
|
|
757
|
+
picture. The user asks about pending tasks — Claude queries again. The
|
|
758
|
+
user mentions something from last session — Claude has no memory of it.
|
|
759
|
+
|
|
760
|
+
Three round trips to assemble context that one orientation would have
|
|
761
|
+
surfaced. Meanwhile, an overdue deadline sits unmentioned because nobody
|
|
762
|
+
asked about it.
|
|
763
|
+
|
|
764
|
+
### With Skill (Good)
|
|
765
|
+
|
|
766
|
+
New session starts. Claude loads project state, syncs fresh data, scans
|
|
767
|
+
the work backlog, and presents: here's where things stand, here's what
|
|
768
|
+
needs attention, here's what changed since last time. The overdue item
|
|
769
|
+
is surfaced before the user has to remember it. One message, full
|
|
770
|
+
picture. The user decides what to work on from an informed position.
|