fdeops 3.17.0 → 3.20.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 (47) hide show
  1. package/README.md +74 -67
  2. package/adapters/AGENTS.md +1 -1
  3. package/adapters/GEMINI.md +1 -1
  4. package/adapters/LOCAL-LLM.md +5 -5
  5. package/adapters/README.md +1 -1
  6. package/adapters/copilot-instructions.md +1 -1
  7. package/adapters/cursor.fde.mdc +1 -1
  8. package/bin/check.js +27 -8
  9. package/bin/fde.js +7 -7
  10. package/bin/lib/trust.js +4 -2
  11. package/mcp/fdeops-ingest/package.json +1 -1
  12. package/package.json +1 -1
  13. package/plugin.json +1 -1
  14. package/skills/fde/SKILL.md +34 -32
  15. package/skills/fde/references/ai.md +2 -2
  16. package/skills/fde/references/audit.md +2 -2
  17. package/skills/fde/references/board-memo.md +1 -1
  18. package/skills/fde/references/business-case.md +1 -1
  19. package/skills/fde/references/close.md +1 -1
  20. package/skills/fde/references/connect.md +1 -1
  21. package/skills/fde/references/dashboard.md +2 -2
  22. package/skills/fde/references/debrief.md +1 -1
  23. package/skills/fde/references/demo-prep.md +1 -1
  24. package/skills/fde/references/discover.md +3 -3
  25. package/skills/fde/references/earn-trust.md +1 -1
  26. package/skills/fde/references/encode-pattern.md +3 -3
  27. package/skills/fde/references/eval-pack.md +1 -1
  28. package/skills/fde/references/hold-scope.md +1 -1
  29. package/skills/fde/references/ingest.md +1 -1
  30. package/skills/fde/references/land.md +1 -1
  31. package/skills/fde/references/pick-three.md +1 -1
  32. package/skills/fde/references/plan.md +1 -1
  33. package/skills/fde/references/poc.md +4 -2
  34. package/skills/fde/references/readout.md +1 -1
  35. package/skills/fde/references/red-team.md +1 -1
  36. package/skills/fde/references/rescue.md +3 -2
  37. package/skills/fde/references/review.md +1 -1
  38. package/skills/fde/references/rollback.md +1 -1
  39. package/skills/fde/references/runbook.md +1 -1
  40. package/skills/fde/references/score-use-cases.md +1 -1
  41. package/skills/fde/references/ship.md +6 -2
  42. package/skills/fde/references/switch-clients.md +1 -1
  43. package/skills/fde/references/test-assumptions.md +1 -1
  44. package/skills/fde/references/three-options.md +1 -1
  45. package/skills/fde/references/what-breaks.md +1 -1
  46. package/skills/fde/references/who-decides.md +1 -1
  47. package/templates/.fde/terrain.md +1 -1
package/README.md CHANGED
@@ -10,26 +10,28 @@ Skills encode the workflows, quality gates, and judgment Forward Deployed Engine
10
10
 
11
11
  ## Commands
12
12
 
13
- Each command loads the same `@fde` skill. You never pick from 31 names.
13
+ One command per stage. Skills load automatically.
14
14
 
15
- | What you're doing | Command | Key principle |
16
- |-------------------|---------|-----------|
17
- | First week on site | `/brief` | Name who signs done |
18
- | Find the real problem | `/discover` | Treat the brief as a hypothesis |
19
- | Sequence the work | `/plan` | Work backwards from done |
20
- | Ship to their production | `/ship` | One change they can see, then go live with a rollback you have run |
21
- | Get the number accepted | `/outcome` | Promised, measured, accepted |
22
- | Hand off so they run it | `/close` | They operate it without you |
15
+ Six commands map to the embed. Each one loads `@fde`, which opens the skill for that moment: a thin brief pulls land, a wrong brief pulls discover, a Friday number pulls readout. Sprint or programme. Greenfield or brownfield. Any industry. You never pick from 30 names.
16
+
17
+ | Work | Command | Stage | Principle |
18
+ |------|---------|-------|-----------|
19
+ | Engage | `/brief` | Land | Name who signs done |
20
+ | Diagnose | `/discover` | Discover | Treat the brief as a hypothesis |
21
+ | Align | `/plan` | Plan | Work backwards from done |
22
+ | Deliver | `/ship` | Ship | One visible change, then go live |
23
+ | Realize | `/outcome` | Outcome | Promised, measured, accepted |
24
+ | Transfer | `/close` | Close | They operate it without you |
23
25
 
24
26
  Also:
25
27
 
26
- | What you're doing | Command | Key principle |
27
- |-------------------|---------|-----------|
28
- | Sponsor went quiet | `/trust` | Process gap, or they stopped trusting you |
29
- | When did we agree? | `/receipts` | A dated line, or it did not happen |
30
- | After a meeting | `/debrief` | Notes into the record |
31
- | Prep before the meeting | `/prep` | One page from the record |
32
- | Friday sponsor update | `/readout` | Promised, measured, accepted |
28
+ | Work | Command | Principle |
29
+ |------|---------|-----------|
30
+ | Diagnose trust | `/trust` | Process gap, or they stopped trusting you |
31
+ | Find the receipt | `/receipts` | A dated line, or it did not happen |
32
+ | Capture the meeting | `/debrief` | Notes into the record |
33
+ | Prepare the meeting | `/prep` | One page from the record |
34
+ | Report the outcome | `/readout` | Promised, measured, accepted |
33
35
 
34
36
  Skills also activate on English: naming a client, running a POC, changing their checkout, going live, asking what was agreed. A throwaway one-liner in an unbound repo can skip `@fde`. Bound client work cannot.
35
37
 
@@ -95,67 +97,69 @@ Requires Node.js >= 18. Override: `FDEOPS_ENGAGEMENT`. See [docs/install.md](doc
95
97
 
96
98
  ## All 30 Skills
97
99
 
98
- The commands above are the entry points. Under the hood, `@fde` activates these 30 skills, each a structured workflow with steps, an artifact, and a checkpoint. You never pick one by name. Full detail: [docs/skills-reference.md](docs/skills-reference.md).
100
+ The catalog. 30 skills spanning the embed. Not prompts - structured workflows with steps, an artifact, and a checkpoint. Type English or a slash command. `@fde` activates the right skill. You never pick one by name.
101
+
102
+ Full detail: [docs/skills-reference.md](docs/skills-reference.md).
99
103
 
100
- ### Land - Brief and trust
104
+ ### Land - Engage
101
105
 
102
- | Skill | What It Does | Use When |
106
+ | Skill | What it does | Use when |
103
107
  |--------|--------------|----------|
104
- | [land](skills/fde/references/land.md) | Interrogate the brief, map stakeholders, define success | New client, first meeting, just got the brief |
105
- | [audit](skills/fde/references/audit.md) | Verify claims, find the load-bearing wall | Taking over, previous consultant left |
106
- | [who-decides](skills/fde/references/who-decides.md) | Who decides, who blocks, who escalates | Need to know who matters |
107
- | [earn-trust](skills/fde/references/earn-trust.md) | Observer trusted; navigate AI policy | Need access or credibility |
108
- | [hold-scope](skills/fde/references/hold-scope.md) | Scope receipts; the accumulation conversation | "Also can you…", timeline unchanged |
108
+ | [land](skills/fde/references/land.md) | Interrogate the brief | New client, first meeting, just got the brief |
109
+ | [audit](skills/fde/references/audit.md) | Verify inherited claims | Taking over, previous consultant left |
110
+ | [who-decides](skills/fde/references/who-decides.md) | Map decision rights | Need to know who matters |
111
+ | [earn-trust](skills/fde/references/earn-trust.md) | Earn access | Need access or credibility |
112
+ | [hold-scope](skills/fde/references/hold-scope.md) | Hold scope | "Also can you…", timeline unchanged |
109
113
 
110
- ### Discover - Find the real problem
114
+ ### Discover - Diagnose
111
115
 
112
- | Skill | What It Does | Use When |
116
+ | Skill | What it does | Use when |
113
117
  |--------|--------------|----------|
114
- | [discover](skills/fde/references/discover.md) | Question first, then repo + workaround | Brief feels wrong, shadow processes |
115
- | [test-assumptions](skills/fde/references/test-assumptions.md) | Untested assumptions by blast radius | Brief feels too neat |
116
- | [score-use-cases](skills/fde/references/score-use-cases.md) | Value × urgency × alignment / complexity | Everything is P0 |
117
- | [poc](skills/fde/references/poc.md) | Kill the killer assumption in a day | POC, spike, need to de-risk |
118
+ | [discover](skills/fde/references/discover.md) | Frame the problem | Brief feels wrong, shadow processes |
119
+ | [test-assumptions](skills/fde/references/test-assumptions.md) | Test assumptions | Brief feels too neat |
120
+ | [score-use-cases](skills/fde/references/score-use-cases.md) | Score use cases | Everything is P0 |
121
+ | [poc](skills/fde/references/poc.md) | Validate the solution | POC, spike, need to de-risk |
118
122
 
119
- ### Plan - Sequence the work
123
+ ### Plan - Align
120
124
 
121
- | Skill | What It Does | Use When |
125
+ | Skill | What it does | Use when |
122
126
  |--------|--------------|----------|
123
- | [plan](skills/fde/references/plan.md) | Backwards from done, Kill if on each PR | What order, what is done |
124
- | [business-case](skills/fde/references/business-case.md) | Cost of nothing investment → return | Defend budget or timeline |
125
- | [three-options](skills/fde/references/three-options.md) | Three genuine options | "What should we do?" |
126
- | [pick-three](skills/fde/references/pick-three.md) | Pick three from twenty urgents | Everything is urgent |
127
+ | [plan](skills/fde/references/plan.md) | Sequence the work | What order, what is done |
128
+ | [business-case](skills/fde/references/business-case.md) | Build the business case | Defend budget or timeline |
129
+ | [three-options](skills/fde/references/three-options.md) | Generate options | "What should we do?" |
130
+ | [pick-three](skills/fde/references/pick-three.md) | Prioritize three | Everything is urgent |
127
131
 
128
- ### Ship - On their repo, then live
132
+ ### Ship - Deliver
129
133
 
130
- | Skill | What It Does | Use When |
134
+ | Skill | What it does | Use when |
131
135
  |--------|--------------|----------|
132
- | [ship](skills/fde/references/ship.md) | One change they can see (greenfield or brownfield), proven on their staging, then go live | Building, updating, or going live |
133
- | [what-breaks](skills/fde/references/what-breaks.md) | Impact from contained → irreversible | Touching shared infrastructure |
134
- | [rescue](skills/fde/references/rescue.md) | Production fire or trust fire | Down, or they went quiet |
135
- | [review](skills/fde/references/review.md) | Did we only build what we agreed | Before merge, scope creep |
136
- | [rollback](skills/fde/references/rollback.md) | Test the escape route before 2am | "We can always revert" |
136
+ | [ship](skills/fde/references/ship.md) | Deliver the increment | Building, updating, or going live |
137
+ | [what-breaks](skills/fde/references/what-breaks.md) | Assess impact | Touching shared infrastructure |
138
+ | [rescue](skills/fde/references/rescue.md) | Resolve the incident | Down, or they went quiet |
139
+ | [review](skills/fde/references/review.md) | Review the change | Before merge, scope creep |
140
+ | [rollback](skills/fde/references/rollback.md) | Rehearse rollback | "We can always revert" |
137
141
 
138
- ### Outcome - Get the number accepted
142
+ ### Outcome - Realize
139
143
 
140
- | Skill | What It Does | Use When |
144
+ | Skill | What it does | Use when |
141
145
  |--------|--------------|----------|
142
- | [readout](skills/fde/references/readout.md) | Promised measured → accepted | Friday, sponsor update |
143
- | [demo-prep](skills/fde/references/demo-prep.md) | One number, five hard questions | Demo or exec walkthrough |
144
- | [debrief](skills/fde/references/debrief.md) | Meeting notes into the record | Just left a meeting |
145
- | [board-memo](skills/fde/references/board-memo.md) | Board / sponsor's boss | Justify continued investment |
146
- | [dashboard](skills/fde/references/dashboard.md) | Portfolio, trust-ordered | All my customers |
147
- | [ingest](skills/fde/references/ingest.md) | Pull text you confirm | Transcript, Notion, Slack |
148
- | [connect](skills/fde/references/connect.md) | Wire a source MCP | Connect Granola |
146
+ | [readout](skills/fde/references/readout.md) | Report the outcome | Friday, sponsor update |
147
+ | [demo-prep](skills/fde/references/demo-prep.md) | Prepare the demo | Demo or exec walkthrough |
148
+ | [debrief](skills/fde/references/debrief.md) | Capture the meeting | Just left a meeting |
149
+ | [board-memo](skills/fde/references/board-memo.md) | Brief the board | Justify continued investment |
150
+ | [dashboard](skills/fde/references/dashboard.md) | View the portfolio | All my customers |
151
+ | [ingest](skills/fde/references/ingest.md) | Ingest sources | Transcript, Notion, Slack |
152
+ | [connect](skills/fde/references/connect.md) | Connect a source | Connect Granola |
149
153
 
150
- ### Close - They run it
154
+ ### Close - Transfer
151
155
 
152
- | Skill | What It Does | Use When |
156
+ | Skill | What it does | Use when |
153
157
  |--------|--------------|----------|
154
- | [close](skills/fde/references/close.md) | Handoff that survives you | Wrapping up |
155
- | [runbook](skills/fde/references/runbook.md) | Runbook, confidence scoring | They must operate without you |
156
- | [switch-clients](skills/fde/references/switch-clients.md) | Switch without bleed | 2+ clients |
157
- | [encode-pattern](skills/fde/references/encode-pattern.md) | If you did it twice, encode it | It will apply again |
158
- | [red-team](skills/fde/references/red-team.md) | Stress-test before they do | "Poke holes in this" |
158
+ | [close](skills/fde/references/close.md) | Transfer operations | Wrapping up |
159
+ | [runbook](skills/fde/references/runbook.md) | Write the runbook | They must operate without you |
160
+ | [switch-clients](skills/fde/references/switch-clients.md) | Switch engagements | 2+ clients |
161
+ | [encode-pattern](skills/fde/references/encode-pattern.md) | Encode the pattern | It will apply again |
162
+ | [red-team](skills/fde/references/red-team.md) | Challenge the plan | "Poke holes in this" |
159
163
 
160
164
  Overlays (on signal, not on request): [ai](skills/fde/references/ai.md) · [artifacts](skills/fde/references/artifacts.md) · [fintech](skills/fde/references/fintech.md) · [healthcare](skills/fde/references/healthcare.md) · [gov](skills/fde/references/gov.md) · [eval-pack](skills/fde/references/eval-pack.md)
161
165
 
@@ -174,7 +178,7 @@ One skill. One reference file per situation. One folder per client.
174
178
  skills/fde/SKILL.md hosts load this one file
175
179
  │ routes. you never pick a skill by name
176
180
 
177
- references/land.md one workflow, then stop
181
+ references/land.md one skill, then stop
178
182
 
179
183
 
180
184
  fde CLI (local) dates, gates, redacts. no network
@@ -183,11 +187,13 @@ One skill. One reference file per situation. One folder per client.
183
187
  ~/fde-engagements/<client>/.fde/
184
188
  ```
185
189
 
186
- - **Process, not prose.** Each reference is a workflow with an artifact and a checkpoint, not a tip sheet.
187
- - **Ground loop.** Name → characterise → prove where they live → go live → log. The workspace compiles; `@fde` stays.
188
- - **You confirm.** Nothing is written until you say so.
189
- - **Progressive disclosure.** `SKILL.md` is the entry point. One `references/*.md` loads when routed.
190
- - **Local CLI.** Writes and status cost zero model tokens. The AI coding agent runs it.
190
+ **One skill routes.** Hosts load `@fde`. It reads the situation and opens one `references/*.md`. Slash commands and English both land here. You never pick a skill by name.
191
+
192
+ **Evidence, not memory.** Promised measured accepted. A dated line in `.fde/`, or it did not happen. Nothing is done on vibes.
193
+
194
+ **Confirm before write.** Local CLI: git and files, no network. `.fde/` on your laptop. The AI coding agent runs the command. You confirm. Then it is on the record.
195
+
196
+ **Progressive disclosure.** `SKILL.md` is the entry. One skill file loads when routed. Writes and status cost zero model tokens.
191
197
 
192
198
  Change hosts, install `@fde` on the new one, bind if needed, keep talking. The record is not inside any vendor.
193
199
 
@@ -263,9 +269,9 @@ fdeops/
263
269
 
264
270
  ## Why FDEOps?
265
271
 
266
- AI coding agents are built for a repo, not for a client. They forget the sponsor, the promise, who can say yes, and whether anyone accepted the number. Monday morning they start from the ticket again.
272
+ AI coding agents are built for a repo, not for a client. Left alone they skip who signs done, whether the brief is true, and whether anyone accepted the number. Monday morning they start from the ticket again.
267
273
 
268
- FDEOps is what you take on site. One `@fde` skill runs the embed from discovery to signed outcome: POC, their codebase, go-live, eval when a model judges, promised → measured → accepted. A local CLI dates every decision. `.fde/` is markdown on your laptop. You confirm; then it is on the record.
274
+ FDEOps is the catalog you take on site. One `@fde` skill runs the embed from discovery to signed outcome: POC, their codebase, go-live, eval when a model judges, promised → measured → accepted. A local CLI dates every decision. `.fde/` is markdown on your laptop. You confirm; then it is on the record.
269
275
 
270
276
  ---
271
277
 
@@ -304,6 +310,7 @@ Local only - `git` + files, no network, no telemetry. Plain markdown. The model
304
310
 
305
311
  ## Principles
306
312
 
313
+ - **One map** - any scale, greenfield or brownfield, any industry. Overlays carry the vertical
307
314
  - **The artifact is the memory** - producing the work and recording it are one action
308
315
  - **Ground loop** - name the change, characterise their code, prove it on their staging, go live, log the outcome
309
316
  - **Skills, not autonomy** - the kit says what to check; judgment stays yours
@@ -6,7 +6,7 @@ You are the AI coding agent for a **Forward Deployed Engineer (FDE)** - the huma
6
6
 
7
7
  When the FDE types **`@fde`**, names a client, pastes meeting notes, asks what was agreed, or describes embed work (quiet sponsor, brief feels wrong, Friday update) - load the skill. If `fde resume` says NO ENGAGEMENT: ask the client name once, then **you** run `fde resume --init <slug>`. Never tell them to type it.
8
8
 
9
- Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC, small PRs, characterisation, proof on their staging, eval, and go-live.
9
+ Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC, the change on their repo, characterisation, proof on their staging, eval, and go-live.
10
10
 
11
11
  - Skill (single source of truth): `~/.claude/skills/fde/SKILL.md`
12
12
  - **Never ask the FDE to pick a skill.** Read the situation, route silently, do the work.
@@ -6,7 +6,7 @@ Context for Gemini CLI when assisting a **Forward Deployed Engineer (FDE)** - th
6
6
 
7
7
  When the FDE types **`@fde`**, names a client, pastes meeting notes, asks what was agreed, or describes embed work (quiet sponsor, brief feels wrong, Friday update) - load the skill. If `fde resume` says NO ENGAGEMENT: ask the client name once, then **you** run `fde resume --init <slug>`. Never tell them to type it.
8
8
 
9
- Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC, small PRs, characterisation, proof on their staging, eval, and go-live.
9
+ Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC, the change on their repo, characterisation, proof on their staging, eval, and go-live.
10
10
 
11
11
  - Skill (single source of truth): `~/.claude/skills/fde/SKILL.md`
12
12
  - **Never ask the FDE to pick a skill.** Read the situation, route silently, do the work.
@@ -4,7 +4,7 @@ Use fdeops with **any local model** - Ollama, LM Studio, llama.cpp, vLLM, Open W
4
4
 
5
5
  ## Why it works
6
6
 
7
- fdeops is a SKILL.md file + markdown memory + a Node.js CLI. It calls no external API. The AI does the methodology; the CLI does the mechanics. Any model that can read a markdown system prompt can run fdeops.
7
+ fdeops is a SKILL.md file + markdown memory + a Node.js CLI. It calls no external API. The AI does the skills; the CLI does the mechanics. Any model that can read a markdown system prompt can run fdeops.
8
8
 
9
9
  ## Setup
10
10
 
@@ -62,12 +62,12 @@ The model reads SKILL.md, routes to the right skill, and produces artifacts in y
62
62
 
63
63
  ## Model size recommendations
64
64
 
65
- The methodology is detailed (30 skills, routing logic, evidence format, memory contract). Larger models handle it better:
65
+ The kit is detailed (30 skills, routing logic, evidence format, memory contract). Larger models handle it better:
66
66
 
67
67
  | Model class | Experience |
68
68
  |-------------|-----------|
69
69
  | **7-8B** (Llama 3.1 8B, Mistral 7B, Qwen 2.5 7B) | Handles individual skills (readout, log, land). May struggle with complex routing or multi-skill sessions. Good for the CLI-heavy workflow where you invoke skills explicitly. |
70
- | **13-34B** (Llama 3.1 13B, Mixtral 8x7B, Qwen 2.5 32B, DeepSeek-R1 32B) | Good across all domains. Routes correctly, follows memory contract, writes structured artifacts. Recommended minimum for full methodology use. |
70
+ | **13-34B** (Llama 3.1 13B, Mixtral 8x7B, Qwen 2.5 32B, DeepSeek-R1 32B) | Good across all domains. Routes correctly, follows memory contract, writes structured artifacts. Recommended minimum for full use. |
71
71
  | **70B+** (Llama 3.1 405B, DeepSeek V3, Qwen 2.5 72B) | Full capability. Handles regulated overlays, switch-clients, board-memo pyramid, runbook handoff. |
72
72
 
73
73
  ## The CLI works without ANY model
@@ -105,6 +105,6 @@ ollama run my-fde-model --system "$(cat skills/fde/SKILL.md)"
105
105
  ## Tips for local models
106
106
 
107
107
  - **Context window matters.** SKILL.md + references can be large. Use a model with at least 8K context; 32K+ is ideal for loading skill references on demand.
108
- - **Temperature 0.2-0.4 works best.** The methodology is structured - lower temperature keeps routing accurate and artifacts consistent.
108
+ - **Temperature 0.2-0.4 works best.** The skills are structured - lower temperature keeps routing accurate and artifacts consistent.
109
109
  - **Use the CLI for mechanics.** Don't ask the model to do what the CLI already does deterministically. Use `fde scan` for repo recon, `fde log` for memory writes, `fde receipts` for searching. Let the model handle judgment, routing, and artifact drafting.
110
- - **Explicit skill invocation.** If a smaller model struggles with routing, you can invoke skills directly: "@fde run the discover phase" or "@fde use hold-scope." The model skips routing and goes straight to the method.
110
+ - **Explicit skill invocation.** If a smaller model struggles with routing, you can invoke skills directly: "@fde run the discover phase" or "@fde use hold-scope." The model skips routing and goes straight to the skill.
@@ -2,7 +2,7 @@
2
2
 
3
3
  **One brain, thin adapters.** fdeops has a single source of truth - the `@fde` skill at `skills/fde/SKILL.md` and the `fde` CLI. Each AI coding tool discovers it through a small pointer file in the place that tool already looks. No forked logic, no five copies to maintain - every adapter says the same thing: *route via `@fde`, read/write `.fde/` memory, talk like a peer, never touch what isn't yours.*
4
4
 
5
- **Switching tools:** the fieldbook does not live in the agent. It lives at `~/fde-engagements/<client>/.fde/`. Point a new tool at a bound workspace, drop adapters (or install the skill/plugin for that tool), and the same client record opens. Auto session hooks are Claude Code-first; elsewhere load via `@fde` / `fde resume`. See [README § How it works](../README.md#how-it-works).
5
+ **Switching tools:** the fieldbook does not live in the agent. It lives at `~/fde-engagements/<client>/.fde/`. Point a new tool at a bound workspace, drop adapters (or install the skill/plugin for that tool), and the same client record opens. Auto session hooks are Claude Code-first; elsewhere load via `@fde` / `fde resume`. See [README § How Skills Work](../README.md#how-skills-work).
6
6
 
7
7
  ## What goes where
8
8
 
@@ -6,7 +6,7 @@ You are the AI coding agent for a **Forward Deployed Engineer (FDE)** - the huma
6
6
 
7
7
  When the FDE types **`@fde`**, names a client, pastes meeting notes, asks what was agreed, or describes embed work (quiet sponsor, brief feels wrong, Friday update) - load the skill. If `fde resume` says NO ENGAGEMENT: ask the client name once, then **you** run `fde resume --init <slug>`. Never tell them to type it.
8
8
 
9
- Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC, small PRs, characterisation, proof on their staging, eval, and go-live.
9
+ Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC, the change on their repo, characterisation, proof on their staging, eval, and go-live.
10
10
 
11
11
  - Skill (single source of truth): `~/.claude/skills/fde/SKILL.md`
12
12
  - **Never ask the FDE to pick a skill.** Read the situation, route silently, do the work.
@@ -11,7 +11,7 @@ You are the AI coding agent for a **Forward Deployed Engineer (FDE)** - the huma
11
11
 
12
12
  When the FDE types **`@fde`**, names a client, pastes meeting notes, asks what was agreed, or describes embed work (quiet sponsor, brief feels wrong, Friday update) - load `@fde`. If `fde resume` says NO ENGAGEMENT: ask the client name once, then **you** run `fde resume --init <slug>`. Never tell them to type it.
13
13
 
14
- Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC, small PRs, characterisation, proof on their staging, eval, and go-live.
14
+ Do **not** load `@fde` for a one-line typo in an unbound repo. On a bound client, stay on `@fde` for POC, the change on their repo, characterisation, proof on their staging, eval, and go-live.
15
15
 
16
16
  - Skill (single source of truth): `~/.claude/skills/fde/SKILL.md` (or the copy this install placed)
17
17
  - **Never ask the FDE to pick a skill.** Read the situation, route silently, do the work.
package/bin/check.js CHANGED
@@ -57,7 +57,7 @@ for (const dir of fs.readdirSync(path.join(root, 'skills'))) {
57
57
  ok('skills structure')
58
58
 
59
59
  if (fs.existsSync(path.join(root, 'skills', 'fde', 'archive'))) {
60
- fail('skills/fde/archive must not exist - unrouted methods are dead code')
60
+ fail('skills/fde/archive must not exist - unrouted skills are dead code')
61
61
  } else ok('no archived skill dump')
62
62
 
63
63
  // v3: one skill + phase references (progressive disclosure)
@@ -164,7 +164,7 @@ ok(`router dispatch (${mentioned.length} reference targets verified) + memory co
164
164
  documentedRows++
165
165
  documented.add(m[1])
166
166
  // A link nobody followed is the same unverifiable claim this gate exists for:
167
- // the target must exist, and it must be the method the text names.
167
+ // the target must exist, and it must be the skill the text names.
168
168
  if (m[2] !== `${m[1]}.md`) {
169
169
  fail(`docs/skills-reference.md links [${m[1]}] at references/${m[2]}`)
170
170
  } else if (!fs.existsSync(path.join(root, 'skills', 'fde', 'references', m[2]))) {
@@ -172,13 +172,13 @@ ok(`router dispatch (${mentioned.length} reference targets verified) + memory co
172
172
  }
173
173
  }
174
174
  if (documented.size !== documentedRows) {
175
- fail(`docs/skills-reference.md lists ${documentedRows} method rows for ${documented.size} methods - a duplicate row inflates the count`)
175
+ fail(`docs/skills-reference.md lists ${documentedRows} skill rows for ${documented.size} skills - a duplicate row inflates the count`)
176
176
  }
177
177
  const undocumented = [...routed].filter(name => !documented.has(name))
178
178
  if (undocumented.length) {
179
179
  fail(`SKILL.md routes skill(s) missing from docs/skills-reference.md: ${undocumented.join(', ')}`)
180
180
  }
181
- // and the other direction: a documented method nothing routes to is a method
181
+ // and the other direction: a documented skill nothing routes to is a skill
182
182
  // the agent can never reach, advertised anyway.
183
183
  const unrouted = [...documented].filter(name => !routed.has(name))
184
184
  if (unrouted.length) {
@@ -187,7 +187,7 @@ ok(`router dispatch (${mentioned.length} reference targets verified) + memory co
187
187
  for (const rel of ['docs/skills.md', 'docs/skills-reference.md']) {
188
188
  const body = read(rel)
189
189
  // `-` is a word boundary, so \bscore\b matches inside `score-use-cases`:
190
- // a method could disappear from the docs behind a hyphenated sibling.
190
+ // a skill could disappear from the docs behind a hyphenated sibling.
191
191
  const absent = [...documented].filter(name => !new RegExp(`(?<![\\w-])${name}(?![\\w-])`).test(body))
192
192
  if (absent.length) fail(`${rel} does not list skill(s): ${absent.join(', ')}`)
193
193
  const claims = [...body.matchAll(/(\d+)\s+skills/g)].map(m => Number(m[1]))
@@ -201,16 +201,23 @@ ok(`router dispatch (${mentioned.length} reference targets verified) + memory co
201
201
 
202
202
  const refDir = path.join(root, 'skills', 'fde', 'references')
203
203
  const extra = fs.readdirSync(refDir).filter(f => f.endsWith('.md') && !mentioned.includes(f))
204
- if (extra.length) fail(`unrouted reference file(s) - dead method: ${extra.join(', ')}`)
204
+ if (extra.length) fail(`unrouted reference file(s) - dead skill: ${extra.join(', ')}`)
205
205
  else ok('no unrouted reference files')
206
206
 
207
- // The on-site change loop lives in ship.md. A sibling method is a split.
207
+ // The on-site change loop lives in ship.md. A sibling skill is a split.
208
208
  for (const dead of ['small-prs.md', 'thin-slices.md', 'implement.md']) {
209
209
  if (fs.existsSync(path.join(refDir, dead))) {
210
210
  fail(`${dead} must not exist - that craft lives in ship.md`)
211
211
  }
212
212
  }
213
- ok('ship is one method (no implement / small-prs / thin-slices sibling)')
213
+ ok('ship is one skill (no implement / small-prs / thin-slices sibling)')
214
+
215
+ if (/^### Prove\b/m.test(read('skills/fde/SKILL.md'))) {
216
+ fail('SKILL.md must not use Prove as a stage heading - the public stage is Outcome')
217
+ } else ok('SKILL.md stage heading is Outcome')
218
+ if (/\b31 names\b|\b31 skills\b/.test(read('README.md'))) {
219
+ fail('README must not advertise 31 skills')
220
+ } else ok('README skill count is 30')
214
221
  }
215
222
 
216
223
  const install = read('bin/install.js')
@@ -349,6 +356,18 @@ for (const rx of derivativeFraming) {
349
356
  if (/docs\/internal|PMF_360/i.test(readme)) {
350
357
  fail('README must not link docs/internal or PMF_360')
351
358
  }
359
+ if (!/One command per stage/.test(readme) || !/Skills load automatically/.test(readme)) {
360
+ fail('README must formulate Commands as: one command per stage, skills load automatically')
361
+ }
362
+ if (!/Not prompts/.test(readme)) {
363
+ fail('README catalog must say skills are not prompts')
364
+ }
365
+ if (/\b(30|31|37)\s+methods\b|\broutes methods\b|\bphase methods\b|\bfield methods\b|\bengagement methods\b/.test(readme)) {
366
+ fail('README must call the catalog skills, not methods')
367
+ }
368
+ if (/\broutes methods\b|\bphase methods\b|\bengagement methods\b/.test(usage)) {
369
+ fail('docs/USAGE.md must call them skills, not methods')
370
+ }
352
371
  ok('README tone')
353
372
 
354
373
  if (fs.existsSync(path.join(root, '.codex')) || fs.existsSync(path.join(root, '.opencode'))) {
package/bin/fde.js CHANGED
@@ -740,11 +740,11 @@ function appendLogEntry(eng, type, entry, opts = {}) {
740
740
  // degrading to "nothing found" rather than guessing when the shape does not
741
741
  // match. Never fabricate a number, a name, or a signal that is not in the text.
742
742
 
743
- const PHASES = ['land', 'discover', 'plan', 'ship', 'prove', 'close']
744
- const PHASE_ALIASES = { build: 'ship' } // legacy SDLC name; public map is ship
743
+ const PHASES = ['land', 'discover', 'plan', 'ship', 'outcome', 'close']
744
+ const PHASE_ALIASES = { build: 'ship', prove: 'outcome' } // legacy names; public map is ship / outcome
745
745
  const PHASE_LABELS = {
746
746
  land: 'Land', discover: 'Discover', plan: 'Plan',
747
- ship: 'Ship', prove: 'Prove', close: 'Close',
747
+ ship: 'Ship', outcome: 'Outcome', close: 'Close',
748
748
  }
749
749
  function canonicalPhase(phase) {
750
750
  const p = String(phase).toLowerCase()
@@ -1412,7 +1412,7 @@ function cmdLog(args) {
1412
1412
  const eng = resolveEngagement({ forWrite: true })
1413
1413
  if (!eng) { console.error('no engagement - run: fde resume --init <name>'); process.exit(2) }
1414
1414
 
1415
- // fde log phase <land|discover|plan|ship|prove|close> - advances portfolio phase
1415
+ // fde log phase <land|discover|plan|ship|outcome|close> - advances portfolio phase (prove → outcome)
1416
1416
  if (type === 'phase') {
1417
1417
  const phase = canonicalPhase((text || '').toLowerCase().trim())
1418
1418
  if (!PHASES.includes(phase)) {
@@ -2237,7 +2237,7 @@ function collectDoctorIssues(eng) {
2237
2237
  }
2238
2238
  }
2239
2239
  const success = readClean(eng, 'success.md')
2240
- if (!firstLine(success, 80)) issues.push('success.md has no stated done-definition - fill before plan/build')
2240
+ if (!firstLine(success, 80)) issues.push('success.md has no stated done-definition - fill before plan/ship')
2241
2241
  const ctxMd = readClean(eng, 'context.md')
2242
2242
  if (!sectionBody(ctxMd, 'Next action', { lastNonEmpty: true })) {
2243
2243
  issues.push('no ## Next action in context.md - Monday morning has nothing to drive')
@@ -2278,7 +2278,7 @@ function collectDoctorIssues(eng) {
2278
2278
  }
2279
2279
  // Failure-path (exception-led operating map): required once past discover.
2280
2280
  // Land seeds; discover fills; plan+ without a real break→owner row is wallpaper.
2281
- if (/^(plan|ship|prove|close)$/.test(s.phase) && !hasOperatingMapContent(eng)) {
2281
+ if (/^(plan|ship|outcome|close)$/.test(s.phase) && !hasOperatingMapContent(eng)) {
2282
2282
  issues.push(
2283
2283
  `phase is ${s.phase} with empty operating map - fill terrain.md ## Operating map (exception-led): break → who notices → workaround → evidence`
2284
2284
  )
@@ -3324,7 +3324,7 @@ function printUsage() {
3324
3324
  fde triage TRIAGE block only (hooks / Cursor session entry)
3325
3325
  fde log <type> <text> append decision|risk|delivery|contact (contact takes --signal red|amber|green; delivery "a|b|c" writes the value ledger; --force to allow secret-like text)
3326
3326
  fde log risk --retire move matching open-risk bullets to ## Retired
3327
- fde log phase <phase> set engagement phase (land|discover|plan|ship|prove|close)
3327
+ fde log phase <phase> set engagement phase (land|discover|plan|ship|outcome|close)
3328
3328
  fde log --undo remove the last CLI log/debrief entry from memory
3329
3329
  fde debrief [file] meeting notes → memory (prefixed lines; --dry-run; --force)
3330
3330
  fde debrief --smart heuristic propose (prints decision:/risk:/delivery:/contact:/next:); --apply after confirm
package/bin/lib/trust.js CHANGED
@@ -98,9 +98,11 @@ function createTrustApi(deps) {
98
98
  if (!m) return '?'
99
99
  const raw = m[1].replace(/\*/g, '').trim()
100
100
  if (!raw || /\|/.test(raw) || /^unset$/i.test(raw) || /^[\[(]/.test(raw)) return '?'
101
- const one = raw.toLowerCase().match(/^(land|discover|plan|build|ship|prove|close)\b/)
101
+ const one = raw.toLowerCase().match(/^(land|discover|plan|build|ship|prove|outcome|close)\b/)
102
102
  if (!one) return '?'
103
- return one[1] === 'build' ? 'ship' : one[1]
103
+ if (one[1] === 'build') return 'ship'
104
+ if (one[1] === 'prove') return 'outcome'
105
+ return one[1]
104
106
  }
105
107
 
106
108
  function countOpenRisks(eng) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fdeops-ingest-mcp",
3
- "version": "3.17.0",
3
+ "version": "3.20.0",
4
4
  "private": true,
5
5
  "description": "Thin stdio MCP sink for FDEOps ingest (stage → propose → apply). Zero runtime dependencies.",
6
6
  "bin": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fdeops",
3
- "version": "3.17.0",
3
+ "version": "3.20.0",
4
4
  "description": "Forward deployed engineering skills for AI coding agents. Your agent forgets the client every morning - the sponsor, the promise, who signed off. FDEOps keeps that as dated markdown on your laptop: one @fde skill, a deterministic local CLI, and hooks that make it automatic. Claude Code plugin and any agent that loads skills.",
5
5
  "bin": {
6
6
  "fdeops": "bin/install.js",
package/plugin.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "fdeops",
4
- "version": "3.17.0",
4
+ "version": "3.20.0",
5
5
  "description": "Forward deployed engineering skills for AI coding agents: per-client memory in local .fde/ files, one @fde skill. Local-only, no network.",
6
6
  "author": {
7
7
  "name": "Subash Natarajan",
@@ -7,7 +7,7 @@ description: Keeps the engagement record for client work. Use when they name a c
7
7
 
8
8
  ## Purpose
9
9
 
10
- The **engagement record** for one client, from first meeting to signed outcome. One skill; six stages (land → close). You route; they never pick a skill. Confirm, then write `.fde/`. The workspace still compiles and commits. `@fde` does not leave.
10
+ The **engagement record** for one client, from first meeting to signed outcome. One skill; six stages (land → close). Same map at any scale, on greenfield or brownfield, in any industry (overlays). You route; they never pick a skill. Confirm, then write `.fde/`. The workspace still compiles and commits. `@fde` does not leave.
11
11
 
12
12
  ## When to use
13
13
 
@@ -77,7 +77,7 @@ Writes need a bind (`FDEOPS_ENGAGEMENT` or registry). Never install fdeops on in
77
77
 
78
78
  ## The memory contract
79
79
 
80
- 1. **On entry:** `fde resume` only. Pull other `.fde/` files when the method needs them.
80
+ 1. **On entry:** `fde resume` only. Pull other `.fde/` files when the skill needs them.
81
81
  2. **Deliverable = memory.** The work *is* the `.fde/` file. The reference names which one.
82
82
  3. **Evidence.** Every claim has a source. Traceable beats plausible.
83
83
  4. **No invented facts.** People, quotes, meetings, numbers: they said it or the repo shows it. Else `unknown - ask: <question>`.
@@ -107,83 +107,83 @@ CLI is local (`git` + files, no network). You see their code only when they poin
107
107
 
108
108
  Direct. Their words. No "Certainly." Playback 2-4 lines, then act. One question only when a missing fact changes the next move.
109
109
 
110
- New embed: sprint / standard / programme changes depth, not which methods exist. Before first code: safe place to break things, plus AI-code policy. Before go-live: who needs to know, what's the rollback. Before a sponsor artifact: as-is or gut-check first.
110
+ New embed: sprint / standard / programme changes depth, not which skills exist. Before first code: safe place to break things, plus AI-code policy. Before go-live: who needs to know, what's the rollback. Before a sponsor artifact: as-is or gut-check first.
111
111
 
112
112
  Muddy signal: name it ("discover or rescue - leaning X"). Never a phase-picker interview. Default: land if new, audit if takeover.
113
113
 
114
114
  ## Routing - 6 stages
115
115
 
116
- Read **one** reference and follow it. Do not improvise from memory.
116
+ Work names (engage, diagnose, align, deliver, realize, transfer) are the same map. Read **one** reference and follow it. Do not improvise from memory.
117
117
 
118
118
  ### Land
119
119
 
120
120
  | You hear | Skill | Reference |
121
121
  |----------|-------|-----------|
122
- | Starting fresh, new customer, first meeting, just got the brief | land | `references/land.md` |
122
+ | Engage, onboarding, starting fresh, new customer, first meeting, just got the brief, set product strategy, define success metrics, scope the brief | land | `references/land.md` |
123
123
  | Taking over, previous consultant left, joining mid-project | audit | `references/audit.md` |
124
- | Need to understand who matters, who decides, who blocks quietly | who-decides | `references/who-decides.md` |
124
+ | Need to understand who matters, who decides, map decision rights, who blocks quietly | who-decides | `references/who-decides.md` |
125
125
  | Need to earn access, navigate AI policy, build credibility | earn-trust | `references/earn-trust.md` |
126
- | "Also can you…", scope expanding, timeline unchanged | hold-scope | `references/hold-scope.md` |
126
+ | "Also can you…", scope expanding, timeline unchanged, hold scope, scope the brief after kickoff | hold-scope | `references/hold-scope.md` |
127
127
 
128
128
  ### Discover
129
129
 
130
130
  | You hear | Skill | Reference |
131
131
  |----------|-------|-----------|
132
- | Don't know the real problem, brief feels wrong, shadow processes | discover | `references/discover.md` |
133
- | The brief feels too neat, assumptions untested, "we just need…" | test-assumptions | `references/test-assumptions.md` |
134
- | Multiple use cases competing, "we want to do everything" | score-use-cases | `references/score-use-cases.md` |
135
- | Need to validate a direction, prototype, demo to de-risk, **POC**, spike, killer assumption | poc | `references/poc.md` |
132
+ | Diagnose, don't know the real problem, brief feels wrong, shadow processes, frame discovery, understand the problem space, data not ready, data estate, catalog the data | discover | `references/discover.md` |
133
+ | The brief feels too neat, assumptions untested, "we just need…", test assumptions | test-assumptions | `references/test-assumptions.md` |
134
+ | Multiple use cases competing, "we want to do everything", score use cases | score-use-cases | `references/score-use-cases.md` |
135
+ | Need to validate a direction, prototype, demo to de-risk, **POC**, spike, killer assumption, validate the solution, build prototype | poc | `references/poc.md` |
136
136
 
137
137
  ### Plan
138
138
 
139
139
  | You hear | Skill | Reference |
140
140
  |----------|-------|-----------|
141
- | Break this down, what order, sequence the build | plan | `references/plan.md` |
142
- | Sponsor needs justification, need to defend budget or timeline | business-case | `references/business-case.md` |
143
- | Significant decision, multiple approaches, "what should we do?" | three-options | `references/three-options.md` |
144
- | 20 things are "urgent," need to pick the 3 that matter | pick-three | `references/pick-three.md` |
141
+ | Align, break this down, what order, sequence the build, plan the roadmap, create user stories, write the tasks | plan | `references/plan.md` |
142
+ | Sponsor needs justification, need to defend budget or timeline, build the business case | business-case | `references/business-case.md` |
143
+ | Significant decision, multiple approaches, "what should we do?", generate solutions, generate options | three-options | `references/three-options.md` |
144
+ | 20 things are "urgent," need to pick the 3 that matter, prioritize three | pick-three | `references/pick-three.md` |
145
145
 
146
146
  ### Ship
147
147
 
148
148
  | You hear | Skill | Reference |
149
149
  |----------|-------|-----------|
150
- | What could go wrong, touching shared infrastructure, need to assess impact | what-breaks | `references/what-breaks.md` |
151
- | Production down, urgent - OR stakeholder gone quiet, trust slipping | rescue | `references/rescue.md` |
152
- | Start building, update their checkout, first module, visible progress, their tests, POC follow-through, ready to deploy, going live, pre-flight | ship | `references/ship.md` |
153
- | Review this change, is it safe, does it match what we agreed | review | `references/review.md` |
150
+ | What could go wrong, touching shared infrastructure, need to assess impact, assess impact, provision, IaC, shared infra | what-breaks | `references/what-breaks.md` |
151
+ | Production down, urgent, fix a prod bug, resolve incident, restore service - OR stakeholder gone quiet, trust slipping | rescue | `references/rescue.md` |
152
+ | Deliver, start building, update their checkout, first module, visible progress, their tests, POC follow-through, ready to deploy, going live, pre-flight, deliver the increment, build the increment, create the launch plan, design their UI | ship | `references/ship.md` |
153
+ | Review this change, review the pull request, is it safe, does it match what we agreed | review | `references/review.md` |
154
154
  | Diff grew / scope creep in the PR / "did we only build what we said" / KEEP JUSTIFY SPLIT DROP | review (+ ship if going live) | `references/review.md` Stage 1 · `references/ship.md` Intent vs diff |
155
155
  | Wrap the session / share the thinking / catch teammates up / before I open the PR | (memory contract - session digest) | SKILL.md **On exit** - write TL;DR + decisions/why into `.fde/`; no transcript sync |
156
- | "We can always revert" - need to actually test the escape route | rollback | `references/rollback.md` |
156
+ | "We can always revert" - need to actually test the escape route, rehearse rollback | rollback | `references/rollback.md` |
157
157
 
158
- ### Prove
158
+ ### Outcome
159
159
 
160
160
  | You hear | Skill | Reference |
161
161
  |----------|-------|-----------|
162
- | Weekly update due, "need to send the sponsor something" | readout | `references/readout.md` |
163
- | Demo coming up, show-and-tell, exec walkthrough | demo-prep | `references/demo-prep.md` |
164
- | Just out of a meeting, raw notes, "they said…", "debrief" | debrief | the debrief verb (above) + `references/debrief.md` |
162
+ | Realize, weekly update due, "need to send the sponsor something", report the outcome | readout | `references/readout.md` |
163
+ | Demo coming up, show-and-tell, exec walkthrough, prepare the demo | demo-prep | `references/demo-prep.md` |
164
+ | Just out of a meeting, raw notes, "they said…", "debrief", user interviews, workshop notes, capture the meeting | debrief | the debrief verb (above) + `references/debrief.md` |
165
165
  | Make sure we're up to date, pull what's relevant, fetch from Granola/Slack/Gmail/transcript | ingest | `references/ingest.md` (capability check → stage → propose → confirm → apply) |
166
166
  | Connect a new MCP / connect Granola Slack or Notion / what can you pull | connect | `references/connect.md` (+ `mcp/recipes/`) |
167
167
  | Prep me for a meeting / walk-in brief / "what should I know before I talk to…" | - | run `fde prep "<label>"`, present in plain language |
168
- | Sponsor's boss needs a summary, board update, justify continued investment | board-memo | `references/board-memo.md` |
169
- | Status across all my customers | dashboard | `references/dashboard.md` |
168
+ | Sponsor's boss needs a summary, board update, brief the board, justify continued investment | board-memo | `references/board-memo.md` |
169
+ | Status across all my customers, view the portfolio | dashboard | `references/dashboard.md` |
170
170
 
171
171
  ### Close
172
172
 
173
173
  | You hear | Skill | Reference |
174
174
  |----------|-------|-----------|
175
- | Juggling 2+ customers, losing track, context-switching | switch-clients | `references/switch-clients.md` |
176
- | Wrapping up, handoff, making yourself replaceable | close | `references/close.md` |
177
- | Engagement ending, team needs to operate without you | runbook | `references/runbook.md` |
178
- | Something worked well and will apply to future engagements | encode-pattern | `references/encode-pattern.md` |
179
- | "Red-team this," "stress-test my plan," poke holes, what am I missing | red-team | `references/red-team.md` |
175
+ | Juggling 2+ customers, losing track, context-switching, switch engagements | switch-clients | `references/switch-clients.md` |
176
+ | Transfer, wrapping up, handoff, making yourself replaceable, transfer operations | close | `references/close.md` |
177
+ | Engagement ending, team needs to operate without you, write the runbook | runbook | `references/runbook.md` |
178
+ | Something worked well and will apply to future engagements, encode the pattern | encode-pattern | `references/encode-pattern.md` |
179
+ | "Red-team this," "stress-test my plan," poke holes, challenge the plan, what am I missing | red-team | `references/red-team.md` |
180
180
  | "What did we agree about X?", scope dispute, receipts | - | run `fde receipts <term>`, answer with dates |
181
181
 
182
182
  **Overlays - activate alongside any skill on signal, don't wait to be told:**
183
183
 
184
184
  | Signal | Overlay |
185
185
  |--------|---------|
186
- | AI, ML, LLM, model, embeddings, RAG, agents, fine-tuning, inference, drift | `references/ai.md` |
186
+ | AI, ML, LLM, model, embeddings, RAG, agents, fine-tuning, inference, drift, train the model | `references/ai.md` |
187
187
  | Golden set, eval suite, eval pack, pass/fail before AI ship, HITL gate for model, POC the model | `references/eval-pack.md` (+ `ai.md`) |
188
188
  | Deck, slides, report, governance framework, compliance pack, ADR, PDF | `references/artifacts.md` |
189
189
  | Patient data, PHI, HIPAA, EHR, clinical | `references/healthcare.md` |
@@ -195,7 +195,9 @@ Ready to build with no `terrain.md` / plan: discover or plan first. Takeover wit
195
195
  ## Principles
196
196
 
197
197
  - Never ask the FDE to pick a phase. That's your job.
198
+ - Same six stages at any scale. Overlays carry the industry. Greenfield and brownfield change the first move inside ship, not the map.
198
199
  - Ground loop on a bound client: name → characterise → prove on their staging → go live → log. Do not hand their repo to a generic coding pack.
200
+ - Do not call a change done until the signer in `success.md` can reject it on staging they operate.
199
201
  - Read `context.md` before speaking. One sharp question - never a barrage.
200
202
  - Never invent people, meetings, or numbers - `unknown - ask:` beats a polished lie.
201
203
  - Every phase ends with its artifact written. No artifact, no "done."
@@ -38,7 +38,7 @@ Write model selection rationale to `decisions.md`. Include: models tested, test
38
38
 
39
39
  ## Engagement eval pack (before AI ships)
40
40
 
41
- When any slice touches a model, embeddings, RAG, or an agent: create or update `.fde/evals.md` **before** ship. Full method: `references/eval-pack.md`. This is the engagement-local test set - not unit tests.
41
+ When any slice touches a model, embeddings, RAG, or an agent: create or update `.fde/evals.md` **before** ship. Full skill: `references/eval-pack.md`. This is the engagement-local test set - not unit tests.
42
42
 
43
43
  **Minimum pack (do not grow until the minimum exists):**
44
44
  1. **Component + quality bar** - one sentence each; kill switch / fallback named.
@@ -47,7 +47,7 @@ When any slice touches a model, embeddings, RAG, or an agent: create or update `
47
47
  4. **Pass/fail** - dated run; Verdict **SHIP** or **NO-SHIP**; critical fails must be 0.
48
48
  5. **HITL gate** - which decisions need human review before action (align with `trust-profile.md`). Empty when policy requires review → NO-SHIP.
49
49
 
50
- **When to write:** plan seeds the pack; poc/build grows goldens; ship requires Verdict SHIP and a receipt in `delivery.md` → `## Ship receipts`. Non-AI work skips this file entirely.
50
+ **When to write:** plan seeds the pack; poc/ship grows goldens; ship requires Verdict SHIP and a receipt in `delivery.md` → `## Ship receipts`. Non-AI work skips this file entirely.
51
51
 
52
52
  ## RAG architecture (retrieval-augmented generation)
53
53
 
@@ -1,4 +1,4 @@
1
- # audit - taking over mid-engagement
1
+ # audit - Verify inherited claims
2
2
 
3
3
  **Enter when:** picking up someone else's work - previous consultant left, joining mid-project, half-done system.
4
4
 
@@ -9,7 +9,7 @@
9
9
  Before forming any opinion:
10
10
 
11
11
  1. **Inherit the paper.** Any previous `.fde/`, docs, README claims, ADRs, ticket history the FDE can export. Read it all - the previous FDE's decisions are evidence, not verdicts.
12
- 2. **Run the discover scans** (see `discover.md` method part 1: churn, test gaps, "temporary" grep, AI components). On a takeover, add:
12
+ 2. **Run the discover scans** (see `discover.md` part 1: churn, test gaps, "temporary" grep, AI components). On a takeover, add:
13
13
  ```bash
14
14
  git log --format="%an" | sort | uniq -c | sort -rn | head # who actually built this
15
15
  git log --since="60 days ago" --format="%ad %s" --date=short | head -20 # what was happening when they left
@@ -1,4 +1,4 @@
1
- # board-memo - the story that gets the next phase funded
1
+ # board-memo - Brief the board
2
2
 
3
3
  **Enter when:** the sponsor's boss needs a summary, a board update mentions the engagement, the FDE needs to justify continued investment, or a quarterly review is approaching.
4
4
 
@@ -1,4 +1,4 @@
1
- # business-case - the economics that get the sponsor to say yes
1
+ # business-case - Build the business case
2
2
 
3
3
  **Enter when:** the sponsor needs justification for the next phase, the FDE needs to defend budget or timeline, a feature decision needs cost/benefit evidence, or poc produced a direction that needs funding.
4
4
 
@@ -1,4 +1,4 @@
1
- # close - handoff and pattern extraction
1
+ # close - Transfer operations
2
2
 
3
3
  **Enter when:** the engagement is ending - the customer team must run this without the FDE.
4
4
 
@@ -1,4 +1,4 @@
1
- # connect - wire a source MCP in plain language
1
+ # connect - Connect a source
2
2
 
3
3
  **Enter when:** the FDE says "I want to connect a new MCP", "connect Granola / Slack / Notion", "how do I pull from …", or a pull request fails because no source tools exist.
4
4
 
@@ -1,4 +1,4 @@
1
- # dashboard - the portfolio view
1
+ # dashboard - View the portfolio
2
2
 
3
3
  **Enter when:** the FDE runs several customers and asks "where am I across everything?"
4
4
 
@@ -8,7 +8,7 @@ The visual artifact is rendered by code, not by you. `fde dashboard` reads every
8
8
 
9
9
  ## Method (you do this work)
10
10
 
11
- 0. **First move: `fde status`** - instant heuristic triage (trust-first ordering) across every engagement. Use it as the index; then deep-read only the folders that are red/amber or that the FDE asks about, and apply the full card method below.
11
+ 0. **First move: `fde status`** - instant heuristic triage (trust-first ordering) across every engagement. Use it as the index; then deep-read only the folders that are red/amber or that the FDE asks about, and apply the full card below.
12
12
  1. **Find the engagements:** `~/fde-engagements/*/.fde/` (primary) · workspace `./.fde/` if present · paths the FDE names. Read each folder **separately** - never merge two customers.
13
13
  2. **Per engagement, read the card the way a human would:**
14
14
  - Name, phase, week
@@ -1,4 +1,4 @@
1
- # debrief - capture the meeting before it evaporates
1
+ # debrief - Capture the meeting
2
2
 
3
3
  **Enter when:** the FDE just left a meeting/call and dumps raw notes, a transcript, or "they said…". Highest-frequency moment in FDE life. Capture within the hour.
4
4
 
@@ -1,4 +1,4 @@
1
- # demo-prep - the demo is the heartbeat of the engagement
1
+ # demo-prep - Prepare the demo
2
2
 
3
3
  **Enter when:** a demo, show-and-tell, or exec walkthrough is coming. FDE engagements live demo-to-demo; a flat demo costs more than a slipped task.
4
4
 
@@ -1,4 +1,4 @@
1
- # discover - find the real problem, map the terrain
1
+ # discover - Frame the problem
2
2
 
3
3
  **Enter when:** the brief feels wrong, the real problem is unclear, shadow processes are suspected, or any phase found that the map is missing.
4
4
 
@@ -105,7 +105,7 @@ The real spec is what people **do** when the system fails - not what the slide d
105
105
  - **The hesitation.** When someone says "well, there's also this other thing we do…" - stop them, ask them to finish. The main story is what they're comfortable explaining; the hesitation is the real problem.
106
106
  - **"Which part of the codebase do you least want to touch?"** The answer is unanimous and it's the load-bearing wall. Check it against your churn scan - when the human answer and the churn data agree, that's your first map landmark.
107
107
  - **Shadow AI.** Someone pasting data into ChatGPT to cope = a real unmet need + an uncontrolled data risk. Note both.
108
- - **Exception-led operating map.** For each real break (not the slide-deck process): what fails, who notices first, what they do today, and which artifact is trusted in that moment. Prefer exceptions over happy-path swimlanes - the workaround is the operating system. Write rows under `terrain.md` → `## Operating map (exception-led)`. If the section is missing on an older engagement, add it; never regenerate the rest of terrain. When AI is in play, also fill `## Intelligence placement` (deterministic vs LLM judgement vs human approve). **`fde doctor` requires at least one filled exception row before plan/build/ship/close** - empty map after discover is a hygiene fail, not optional polish.
108
+ - **Exception-led operating map.** For each real break (not the slide-deck process): what fails, who notices first, what they do today, and which artifact is trusted in that moment. Prefer exceptions over happy-path swimlanes - the workaround is the operating system. Write rows under `terrain.md` → `## Operating map (exception-led)`. If the section is missing on an older engagement, add it; never regenerate the rest of terrain. When AI is in play, also fill `## Intelligence placement` (deterministic vs LLM judgement vs human approve). **`fde doctor` requires at least one filled exception row before plan/ship/outcome/close** - empty map after discover is a hygiene fail, not optional polish.
109
109
 
110
110
  ## Method - part 3: workshop facilitation
111
111
 
@@ -171,7 +171,7 @@ Score every candidate use case before anything gets prototyped:
171
171
  **Complication:** <what forces a decision now>
172
172
  **Question:** <one decision-shaped sentence>
173
173
  **Answer-space:** confirm brief / descope / rescope / pause - and what a yes looks like
174
- **Implication for build:** <first small PR>
174
+ **Implication for build:** <first change they can see>
175
175
  **Validated with:** <who, when>
176
176
  ```
177
177
 
@@ -1,4 +1,4 @@
1
- # earn-trust - earning commit access one move at a time
1
+ # earn-trust - Earn access
2
2
 
3
3
  **Enter when:** new engagement where you don't have full access yet, trust is thin, the customer said "let's start small," or you need to navigate "we don't trust AI-generated code."
4
4
 
@@ -1,4 +1,4 @@
1
- # encode-pattern - if you did it twice, encode it
1
+ # encode-pattern - Encode the pattern
2
2
 
3
3
  **Enter when:** the engagement is closing and reusable patterns exist, a technique worked well and will apply to future clients, the FDE notices themselves doing the same thing on a second engagement, or close identified a pattern worth preserving.
4
4
 
@@ -48,7 +48,7 @@ The difference between a 5-year FDE and a 15-year FDE is not talent - it's encod
48
48
  | **Repeatable?** | Applies to a class of situations, not just this one | Only worked because of a unique circumstance |
49
49
  | **Falsifiable?** | You can tell when the pattern is working or not | No way to measure whether applying it helped |
50
50
 
51
- **4. Classify by stage.** Patterns sort into the same stages as the methods:
51
+ **4. Classify by stage.** Patterns sort into the same stages as the skills:
52
52
 
53
53
  | Stage | Pattern type | Example |
54
54
  |--------|-------------|---------|
@@ -56,7 +56,7 @@ The difference between a 5-year FDE and a 15-year FDE is not talent - it's encod
56
56
  | **Discover** | Investigative / analytical | "The cron-job discovery checklist for legacy systems" |
57
57
  | **Plan** | Structural / strategic | "The three-option presentation for nervous sponsors" |
58
58
  | **Ship** | Technical / safety | "The Strangler Fig on financial transaction code" |
59
- | **Prove** | Operational / process | "The regulated-environment change-approval timeline buffer" |
59
+ | **Outcome** | Operational / process | "The regulated-environment change-approval timeline buffer" |
60
60
  | **Close** | Knowledge / handoff | "The 2am document format that actually gets used" |
61
61
 
62
62
  **5. Version and evolve.** Patterns are living documents:
@@ -1,4 +1,4 @@
1
- # eval-pack - prove the system before it acts
1
+ # eval-pack - Gate the model before it acts
2
2
 
3
3
  **Enter when:** the work touches AI/LLM/agents/RAG, or they need to POC a model, or ship/close is blocked because there is no evidence the non-deterministic path is safe. Activate alongside `ai.md`, `poc`, or `ship` - not instead of them.
4
4
 
@@ -1,4 +1,4 @@
1
- # hold-scope - holding the line without losing the relationship
1
+ # hold-scope - Hold scope
2
2
 
3
3
  **Enter when:** "also can you…" mid-build, a stakeholder adds requirements without adjusting timeline, the FDE feels scope creeping but can't name it, or `success.md` no longer matches what's being asked.
4
4
 
@@ -1,4 +1,4 @@
1
- # ingest - pull large artifacts into the fieldbook loop
1
+ # ingest - Ingest sources
2
2
 
3
3
  **Enter when:** the FDE wants to catch the engagement up from external sources - "make sure Acme is up to date," "pull what's relevant," "grab today's Granola and Denise's last email." Raw transcripts and long emails that are too big to paste usefully.
4
4
 
@@ -1,4 +1,4 @@
1
- # land - first 48 hours
1
+ # land - Interrogate the brief
2
2
 
3
3
  **Enter when:** new customer, first meeting, just got the brief, nothing started yet.
4
4
 
@@ -1,4 +1,4 @@
1
- # pick-three - when 20 things are "urgent," pick the 3 that matter
1
+ # pick-three - Prioritize three
2
2
 
3
3
  **Enter when:** a transformation engagement with a long list of initiatives, the customer's roadmap has more items than weeks, competing teams want different things, or the FDE needs to recommend what to do *first* across a complex programme.
4
4
 
@@ -1,4 +1,4 @@
1
- # plan - sequence the work
1
+ # plan - Sequence the work
2
2
 
3
3
  **Enter when:** scope is understood and the work needs breaking down - a slice, a phase, or the whole delivery.
4
4
 
@@ -1,8 +1,10 @@
1
- # poc - kill or confirm a direction in a day
1
+ # poc - Validate the solution
2
2
 
3
3
  **Enter when:** a direction needs validating before committing real build time - POC, spike, show something, de-risk, pick between use cases. The output is something a sponsor can reject in a room this week, not a polished product.
4
4
 
5
- **Read first:** `context.md`, `reality.md`. Load `terrain.md` only if the prototype touches the existing codebase.
5
+ **Read first:** `context.md`, `reality.md`. Load `terrain.md` only if the prototype touches the existing codebase. If `terrain.md` **Data estate** has a Blocker source this prototype needs, stop - that is discover, not a day's demo.
6
+
7
+ A green check on synthetic data is not a validated solution. The person who can say no has to see it on evidence they already believe.
6
8
 
7
9
  ## Method (you do this work)
8
10
 
@@ -1,4 +1,4 @@
1
- # readout - the sponsor update that keeps the engagement alive
1
+ # readout - Report the outcome
2
2
 
3
3
  **Enter when:** the weekly update is due, an exec asks "where are we," or the FDE says "I need to send Dana something." This artifact decides renewals; engineers underinvest in it.
4
4
 
@@ -1,4 +1,4 @@
1
- # red-team - adversarial stress-test of your plan, position, or deliverable
1
+ # red-team - Challenge the plan
2
2
 
3
3
  **Enter when:** the FDE says "red-team this," "stress-test my thinking," "poke holes in this," "what am I missing," "challenge my plan" - or anytime they are about to walk into a high-stakes conversation (sponsor meeting, accumulation conversation, handoff, go-live) and want their blind spots exposed first.
4
4
 
@@ -1,4 +1,4 @@
1
- # rescue - production fire, trust fire, or wrong-brief mid-build
1
+ # rescue - Resolve the incident
2
2
 
3
3
  **Enter when:** production is down, something's bleeding - OR a stakeholder went quiet, confidence is slipping, or three weeks into the build the brief turned out to be wrong. Trust fires get the same urgency as outages.
4
4
 
@@ -13,7 +13,8 @@ Open by narrowing time, like a human: "Walk me through the last couple hours - d
13
13
  git log --since="6 hours ago" --format="%ad %an %s" --date=relative
14
14
  ```
15
15
 
16
- **The sequence:**
16
+ **The sequence:** no fix until the cause is named. A symptom patch is the second incident.
17
+
17
18
  1. **Stabilise first.** Roll back? Disable the broken path? Route around it? Buy time before diagnosing. The instinct to fix fast causes the second incident.
18
19
  2. **Name the unknowns.** "We don't know if the queue is corrupted / if this hits all users / if the cache is stale." Written down. Named unknowns are safer than assumed knowns.
19
20
  3. **Assume maximum blast radius.** The unrecognised integration in the stack trace is load-bearing until proven otherwise.
@@ -1,4 +1,4 @@
1
- # review - two stages, always in order
1
+ # review - Review the change
2
2
 
3
3
  **Enter when:** a change needs review before merge - "is this safe," "does it match what we agreed."
4
4
 
@@ -1,4 +1,4 @@
1
- # rollback - test the escape route before you need it
1
+ # rollback - Rehearse rollback
2
2
 
3
3
  **Enter when:** a deploy is planned for the next 48 hours, the FDE says "we can always revert," a previous rollback failed or took too long, or the engagement involves regulated/critical systems.
4
4
 
@@ -1,4 +1,4 @@
1
- # runbook - making yourself replaceable is the goal
1
+ # runbook - Write the runbook
2
2
 
3
3
  **Enter when:** the engagement is entering its final phase, the customer team needs to operate without the FDE, a new FDE is taking over, or the sponsor asks "what happens when you leave?"
4
4
 
@@ -1,4 +1,4 @@
1
- # score-use-cases - pick the right battle, not the interesting one
1
+ # score-use-cases - Score use cases
2
2
 
3
3
  **Enter when:** multiple potential use cases compete for attention, the customer says "we want to do everything," a transformation engagement needs a starting point, or the FDE needs to recommend which problem to solve first.
4
4
 
@@ -1,4 +1,4 @@
1
- # ship - on their site, then live
1
+ # ship - Deliver the increment
2
2
 
3
3
  **Enter when:** you are writing or updating on their codebase, they need to see something real, or you are going live.
4
4
 
@@ -12,7 +12,7 @@ Do not ask them to pick a mode. Name where you are, then start at the matching s
12
12
 
13
13
  If going live, opening question: **has anyone actually *run* the rollback, or is it still a slide?** If only planned, that's today's work - say so plainly.
14
14
 
15
- A same-day throwaway that kills an assumption is `poc`. This method is the real change on a repo they will own, then production.
15
+ A same-day throwaway that kills an assumption is `poc`. This skill is the real change on a repo they will own, then production.
16
16
 
17
17
  ## Field (name it once, then the same loop)
18
18
 
@@ -25,6 +25,10 @@ A same-day throwaway that kills an assumption is `poc`. This method is the real
25
25
 
26
26
  Skip POC only when the killer assumption already lives in the repo (typical brownfield). If the bet is unproven, `poc` first.
27
27
 
28
+ **Done means:** the signer in `success.md` can reject this on staging they operate. A green check on your laptop is not delivery. Do not start the next change until this one is rejectable.
29
+
30
+ If `terrain.md` **Data estate** lists a **Blocker** this change depends on: stop. That is discover, not ship. Do not build a path they cannot feed.
31
+
28
32
  ## Method - one change they can see
29
33
 
30
34
  One change = one thing a user can do, with a test, that you can revert on its own. Not "all the APIs, then all the UI." Not a 2,000-line dump. A PR is how this often lands. It is not the job. The job is the change they can see.
@@ -1,4 +1,4 @@
1
- # switch-clients - juggling engagements without dropping any
1
+ # switch-clients - Switch engagements
2
2
 
3
3
  **Enter when:** the FDE is running 2+ engagements simultaneously, context-switching is causing mistakes or delays, a new customer is being onboarded while existing engagements are active, or the FDE says "I'm losing track."
4
4
 
@@ -1,4 +1,4 @@
1
- # test-assumptions - pressure-test the brief before building on it
1
+ # test-assumptions - Test assumptions
2
2
 
3
3
  **Enter when:** the brief feels too neat, the customer is very confident about the solution (not the problem), someone says "we just need…" about a complex system, or discover surfaced contradictions between what was said and what the codebase shows.
4
4
 
@@ -1,4 +1,4 @@
1
- # three-options - three paths, not one recommendation
1
+ # three-options - Generate options
2
2
 
3
3
  **Enter when:** a significant technical or strategic decision needs to be made, the FDE is asked "what should we do?", the team is stuck between approaches, or a fork in the engagement requires the sponsor's input.
4
4
 
@@ -1,4 +1,4 @@
1
- # what-breaks - know what breaks before you touch it
1
+ # what-breaks - Assess impact
2
2
 
3
3
  **Enter when:** about to make a change on a system you don't fully understand, touching a high-churn module from `terrain.md`, modifying shared infrastructure (auth, database, messaging), or the FDE asks "what could go wrong?"
4
4
 
@@ -1,4 +1,4 @@
1
- # who-decides - reading the room before it reads you
1
+ # who-decides - Map decision rights
2
2
 
3
3
  **Enter when:** new stakeholders appear, signals shift mid-engagement, a meeting felt off but you can't say why, or it's been two weeks and the map hasn't been updated.
4
4
 
@@ -9,7 +9,7 @@
9
9
  ## Operating map (exception-led)
10
10
 
11
11
  <!-- How work actually runs when the happy path fails. Fill in discover; leave blank until heard/seen.
12
- fde doctor requires ≥1 real exception row before plan/build/ship/close. -->
12
+ fde doctor requires ≥1 real exception row before plan/ship/outcome/close. -->
13
13
 
14
14
  | Exception / break | Who notices first | What they do today (workaround) | System of record then | Blast if wrong | Evidence |
15
15
  |-------------------|-------------------|---------------------------------|-----------------------|----------------|----------|