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.
Files changed (139) hide show
  1. package/README.md +2 -6
  2. package/lib/cli.js +348 -91
  3. package/lib/copy.js +108 -6
  4. package/lib/db-setup.js +122 -17
  5. package/lib/metadata.js +51 -2
  6. package/lib/settings-merge.js +52 -10
  7. package/lib/watchtower-setup.js +22 -2
  8. package/package.json +1 -1
  9. package/templates/cabinet/advisories-state-schema.md +1 -1
  10. package/templates/cabinet/checklist-stats-schema.md +15 -1
  11. package/templates/cabinet/memory-lifecycle-contract.md +135 -0
  12. package/templates/cabinet/pib-db-access.md +13 -0
  13. package/templates/cabinet/watchtower-contracts.md +414 -0
  14. package/templates/cabinet/worktree-invocation-contract.md +87 -0
  15. package/templates/engagement/OVERVIEW.md +12 -0
  16. package/templates/engagement/__tests__/engagement.test.mjs +177 -2
  17. package/templates/engagement/__tests__/invoice-doc.test.mjs +195 -0
  18. package/templates/engagement/engagement-preview.mjs +100 -0
  19. package/templates/engagement/engagement-schema.md +240 -0
  20. package/templates/engagement/engagement.mjs +391 -11
  21. package/templates/engagement/pib-db-patches/pib-db-mcp-server.mjs +5 -44
  22. package/templates/engagement/pib-db-patches/pib-db.mjs +5 -2
  23. package/templates/hooks/action-completion-gate.sh +9 -3
  24. package/templates/hooks/memory-index-guard.sh +17 -11
  25. package/templates/hooks/watchtower-session-start.sh +24 -2
  26. package/templates/mcp/pib-db.json +1 -4
  27. package/templates/mux/bin/mux +8 -1
  28. package/templates/mux/config/help.txt +1 -0
  29. package/templates/rules/acknowledge-when-corrected.md +33 -0
  30. package/templates/rules/maintainability.md +11 -0
  31. package/templates/rules/memory-capture.md +26 -4
  32. package/templates/rules/plan-before-bulk-or-irreversible-actions.md +48 -0
  33. package/templates/rules/verify-before-asserting.md +79 -0
  34. package/templates/scripts/__tests__/ahead-check-origin.test.mjs +355 -0
  35. package/templates/scripts/__tests__/batch-disposition.test.mjs +98 -0
  36. package/templates/scripts/__tests__/claude-churn-authored.test.mjs +90 -0
  37. package/templates/scripts/__tests__/cross-ring-reader.test.mjs +505 -0
  38. package/templates/scripts/__tests__/dx-captures-briefing.test.mjs +169 -0
  39. package/templates/scripts/__tests__/hook-runner.test.mjs +247 -0
  40. package/templates/scripts/__tests__/narrative-corpus.test.mjs +247 -0
  41. package/templates/scripts/__tests__/phase-shim.test.mjs +112 -0
  42. package/templates/scripts/__tests__/qa-handoff-merge-state.test.mjs +162 -0
  43. package/templates/scripts/__tests__/resolve-cli.test.mjs +314 -0
  44. package/templates/scripts/__tests__/ring-state-ownership.test.mjs +120 -0
  45. package/templates/scripts/__tests__/ring1-content-detector.test.mjs +168 -0
  46. package/templates/scripts/__tests__/ring1-flagged-actions.test.mjs +135 -0
  47. package/templates/scripts/__tests__/ring1-script-drift.test.mjs +126 -0
  48. package/templates/scripts/__tests__/ring2-queue-reader.test.mjs +80 -0
  49. package/templates/scripts/__tests__/ring2-recall-canary.test.mjs +150 -0
  50. package/templates/scripts/__tests__/ring2-roster-review.test.mjs +311 -0
  51. package/templates/scripts/__tests__/ring3-chunk-merge.test.mjs +122 -0
  52. package/templates/scripts/__tests__/ring3-close-lenses.test.mjs +359 -0
  53. package/templates/scripts/__tests__/ring3-dedup.test.mjs +92 -12
  54. package/templates/scripts/__tests__/ring3-memory-titles.test.mjs +187 -0
  55. package/templates/scripts/__tests__/ring3-novelty-rescue.test.mjs +148 -0
  56. package/templates/scripts/__tests__/ring3-recent-slice.test.mjs +101 -0
  57. package/templates/scripts/__tests__/ring4-reconcile.test.mjs +393 -0
  58. package/templates/scripts/__tests__/shared-thread-reader.test.mjs +187 -0
  59. package/templates/scripts/__tests__/suppression-ledger.test.mjs +148 -0
  60. package/templates/scripts/__tests__/verify-backfill.test.mjs +103 -0
  61. package/templates/scripts/__tests__/verify-coverage.test.mjs +80 -0
  62. package/templates/scripts/__tests__/watchtower-snapshot.test.mjs +261 -0
  63. package/templates/scripts/__tests__/watchtower-sync.test.mjs +311 -0
  64. package/templates/scripts/load-triage-history.js +5 -2
  65. package/templates/scripts/pib-db-mcp-server.mjs +5 -44
  66. package/templates/scripts/pib-db-path.mjs +61 -0
  67. package/templates/scripts/pib-db.mjs +5 -2
  68. package/templates/scripts/validate-memory.mjs +214 -16
  69. package/templates/scripts/watchtower-advisories.mjs +7 -3
  70. package/templates/scripts/watchtower-build-context.mjs +192 -8
  71. package/templates/scripts/watchtower-cross-ring-reader.mjs +700 -0
  72. package/templates/scripts/watchtower-hook-runner.mjs +422 -0
  73. package/templates/scripts/watchtower-lib.mjs +273 -4
  74. package/templates/scripts/watchtower-narrative-corpus.mjs +385 -0
  75. package/templates/scripts/watchtower-phase-shim.mjs +171 -0
  76. package/templates/scripts/watchtower-queue.mjs +341 -3
  77. package/templates/scripts/watchtower-ring1.mjs +405 -45
  78. package/templates/scripts/watchtower-ring2.mjs +710 -68
  79. package/templates/scripts/watchtower-ring3-close.mjs +988 -147
  80. package/templates/scripts/watchtower-ring4-runner.sh +85 -0
  81. package/templates/scripts/watchtower-ring4.mjs +753 -0
  82. package/templates/scripts/watchtower-routines.mjs +1 -1
  83. package/templates/scripts/watchtower-snapshot.mjs +452 -0
  84. package/templates/scripts/watchtower-sync.mjs +393 -0
  85. package/templates/skills/briefing/SKILL.md +281 -41
  86. package/templates/skills/cabinet-process-therapist/SKILL.md +28 -0
  87. package/templates/skills/cabinet-security/SKILL.md +11 -0
  88. package/templates/skills/catch-up/SKILL.md +113 -0
  89. package/templates/skills/cc-publish/SKILL.md +53 -16
  90. package/templates/skills/cc-remember/SKILL.md +45 -0
  91. package/templates/skills/close/SKILL.md +107 -0
  92. package/templates/skills/collab-client/SKILL.md +22 -5
  93. package/templates/skills/collab-consultant/SKILL.md +110 -2
  94. package/templates/skills/debrief/SKILL.md +21 -4
  95. package/templates/skills/debrief-classic/SKILL.md +696 -0
  96. package/templates/skills/debrief-classic/calibration.md +44 -0
  97. package/templates/skills/debrief-classic/phases/audit-pattern-capture.md +78 -0
  98. package/templates/skills/debrief-classic/phases/auto-maintenance.md +48 -0
  99. package/templates/skills/debrief-classic/phases/checklist-feedback.md +123 -0
  100. package/templates/skills/debrief-classic/phases/close-work.md +163 -0
  101. package/templates/skills/debrief-classic/phases/health-checks.md +54 -0
  102. package/templates/skills/debrief-classic/phases/inventory.md +40 -0
  103. package/templates/skills/debrief-classic/phases/loose-ends.md +52 -0
  104. package/templates/skills/debrief-classic/phases/methodology-capture.md +223 -0
  105. package/templates/skills/debrief-classic/phases/qa-handoff-sweep.md +78 -0
  106. package/templates/skills/debrief-classic/phases/record-lessons.md +177 -0
  107. package/templates/skills/debrief-classic/phases/report.md +59 -0
  108. package/templates/skills/debrief-classic/phases/update-state.md +48 -0
  109. package/templates/skills/debrief-classic/phases/upstream-feedback.md +185 -0
  110. package/templates/skills/debrief-classic/phases/verify-coverage.md +101 -0
  111. package/templates/skills/execute/SKILL.md +71 -6
  112. package/templates/skills/execute/phases/commit-and-deploy.md +8 -0
  113. package/templates/skills/execute-group/SKILL.md +23 -26
  114. package/templates/skills/generate-plan-groups/SKILL.md +20 -0
  115. package/templates/skills/inbox/SKILL.md +84 -28
  116. package/templates/skills/memory/SKILL.md +22 -6
  117. package/templates/skills/orient/SKILL.md +71 -5
  118. package/templates/skills/orient-classic/SKILL.md +770 -0
  119. package/templates/skills/orient-classic/phases/auto-maintenance.md +52 -0
  120. package/templates/skills/orient-classic/phases/briefing.md +53 -0
  121. package/templates/skills/orient-classic/phases/cabinet.md +46 -0
  122. package/templates/skills/orient-classic/phases/checklist-status.md +54 -0
  123. package/templates/skills/orient-classic/phases/context.md +88 -0
  124. package/templates/skills/orient-classic/phases/data-sync.md +35 -0
  125. package/templates/skills/orient-classic/phases/deferred-check.md +55 -0
  126. package/templates/skills/orient-classic/phases/dx-captures.md +53 -0
  127. package/templates/skills/orient-classic/phases/health-checks.md +50 -0
  128. package/templates/skills/orient-classic/phases/verify-backfill.md +109 -0
  129. package/templates/skills/orient-classic/phases/work-scan.md +69 -0
  130. package/templates/skills/qa-drain/SKILL.md +38 -0
  131. package/templates/skills/qa-handoff/SKILL.md +287 -46
  132. package/templates/skills/setup-accounts/SKILL.md +38 -16
  133. package/templates/skills/threads/SKILL.md +4 -0
  134. package/templates/skills/validate/phases/validators.md +41 -0
  135. package/templates/skills/watchtower/SKILL.md +160 -8
  136. package/templates/verify-runtime/CONVENTIONS.md +9 -0
  137. package/templates/verify-runtime/README.md +37 -0
  138. package/templates/watchtower/config.json.template +8 -2
  139. 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.