fdeops 3.15.2 → 3.17.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 (46) hide show
  1. package/README.md +61 -69
  2. package/adapters/AGENTS.md +1 -1
  3. package/adapters/GEMINI.md +1 -1
  4. package/adapters/LOCAL-LLM.md +4 -4
  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 -15
  9. package/bin/fde.js +150 -13
  10. package/bin/lib/render.js +2 -2
  11. package/bin/lib/trust.js +38 -3
  12. package/mcp/README.md +1 -1
  13. package/mcp/fdeops-ingest/package.json +1 -1
  14. package/mcp/recipes/README.md +1 -1
  15. package/package.json +1 -1
  16. package/plugin.json +1 -1
  17. package/skills/fde/SKILL.md +30 -31
  18. package/skills/fde/references/ai.md +1 -1
  19. package/skills/fde/references/{exec-narrative.md → board-memo.md} +1 -1
  20. package/skills/fde/references/business-case.md +2 -2
  21. package/skills/fde/references/{ingest-connect.md → connect.md} +1 -1
  22. package/skills/fde/references/discover.md +33 -14
  23. package/skills/fde/references/{trust-engineering.md → earn-trust.md} +1 -1
  24. package/skills/fde/references/{pattern-extract.md → encode-pattern.md} +1 -1
  25. package/skills/fde/references/eval-pack.md +1 -1
  26. package/skills/fde/references/{scope-defense.md → hold-scope.md} +2 -2
  27. package/skills/fde/references/ingest.md +3 -3
  28. package/skills/fde/references/land.md +2 -2
  29. package/skills/fde/references/{initiative-triage.md → pick-three.md} +1 -1
  30. package/skills/fde/references/plan.md +10 -7
  31. package/skills/fde/references/{sketch.md → poc.md} +1 -1
  32. package/skills/fde/references/{status.md → readout.md} +2 -2
  33. package/skills/fde/references/rescue.md +1 -1
  34. package/skills/fde/references/review.md +1 -1
  35. package/skills/fde/references/{rollback-drill.md → rollback.md} +1 -1
  36. package/skills/fde/references/{handoff-engineering.md → runbook.md} +3 -3
  37. package/skills/fde/references/{use-case-scoring.md → score-use-cases.md} +3 -3
  38. package/skills/fde/references/ship.md +121 -18
  39. package/skills/fde/references/{multi-customer-ops.md → switch-clients.md} +1 -1
  40. package/skills/fde/references/{assumption-audit.md → test-assumptions.md} +2 -2
  41. package/skills/fde/references/{options-analysis.md → three-options.md} +1 -1
  42. package/skills/fde/references/{blast-radius.md → what-breaks.md} +3 -3
  43. package/skills/fde/references/{stakeholder-radar.md → who-decides.md} +1 -1
  44. package/templates/.fde/assumptions.md +2 -2
  45. package/templates/.fde/reality.md +6 -1
  46. package/skills/fde/references/incremental-build.md +0 -100
package/README.md CHANGED
@@ -2,16 +2,9 @@
2
2
 
3
3
  **Forward deployed engineering skills for AI coding agents.**
4
4
 
5
- Skills encode the workflows, quality gates, and judgment Forward Deployed Engineers use on someone else's site. Packaged so an AI coding agent can run the embed end-to-end: discovery, POC, slice, on-site proof, eval, signed outcome. The workspace still compiles and commits. `@fde` does not leave.
5
+ Skills encode the workflows, quality gates, and judgment Forward Deployed Engineers use on someone else's site. Packaged so an AI coding agent can run the embed end-to-end: discovery, POC, their codebase (greenfield or brownfield), go-live, eval, signed outcome. The workspace still compiles and commits. `@fde` does not leave.
6
6
 
7
- ```text
8
- LAND DISCOVER PLAN SHIP PROVE CLOSE
9
- ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
10
- │ Brief │ ───▶ │ Reality│ ───▶ │ Sequence│───▶ │ Live │ ───▶ │ Signed │ ───▶ │ They │
11
- │ Trust │ │ Terrain│ │ Align │ │ slice │ │ off │ │ run │
12
- └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘
13
- /brief /discover /plan /ship /outcome /close
14
- ```
7
+ <img width="1774" height="887" alt="FDEops-githubposter" src="https://github.com/user-attachments/assets/9eb842d2-a356-4995-9057-841f1b2d15d6" />
15
8
 
16
9
  ---
17
10
 
@@ -21,23 +14,24 @@ Each command loads the same `@fde` skill. You never pick from 31 names.
21
14
 
22
15
  | What you're doing | Command | Key principle |
23
16
  |-------------------|---------|-----------|
24
- | Land the embed | `/brief` | Who signs done |
25
- | Find the real problem | `/discover` | Brief is a hypothesis |
26
- | Plan the sequence | `/plan` | Backwards from done |
27
- | Ship a slice | `/ship` | Live with a rollback |
28
- | Prove the outcome | `/outcome` | Promised, measured, accepted |
29
- | Close the embed | `/close` | They run it without you |
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 |
30
23
 
31
- Four tells the map does not cover:
24
+ Also:
32
25
 
33
26
  | What you're doing | Command | Key principle |
34
27
  |-------------------|---------|-----------|
35
- | Sponsor went silent | `/quiet` | Process or trust |
36
- | Scope dispute | `/agreed` | Dated receipts, or a gap |
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 |
37
30
  | After a meeting | `/debrief` | Notes into the record |
38
- | Walk-in / Friday | `/prep` `/status` | One page, then the ledger |
31
+ | Prep before the meeting | `/prep` | One page from the record |
32
+ | Friday sponsor update | `/readout` | Promised, measured, accepted |
39
33
 
40
- Skills also activate on English: naming a client, running a POC, slicing a feature, asking what was agreed. A throwaway one-liner in an unbound repo can skip `@fde`. A client slice cannot.
34
+ 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.
41
35
 
42
36
  ---
43
37
 
@@ -99,9 +93,9 @@ Requires Node.js >= 18. Override: `FDEOPS_ENGAGEMENT`. See [docs/install.md](doc
99
93
 
100
94
  ---
101
95
 
102
- ## All 31 Skills
96
+ ## All 30 Skills
103
97
 
104
- The commands above are the entry points. Under the hood, `@fde` activates these 31 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).
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).
105
99
 
106
100
  ### Land - Brief and trust
107
101
 
@@ -109,59 +103,58 @@ The commands above are the entry points. Under the hood, `@fde` activates these
109
103
  |--------|--------------|----------|
110
104
  | [land](skills/fde/references/land.md) | Interrogate the brief, map stakeholders, define success | New client, first meeting, just got the brief |
111
105
  | [audit](skills/fde/references/audit.md) | Verify claims, find the load-bearing wall | Taking over, previous consultant left |
112
- | [stakeholder-radar](skills/fde/references/stakeholder-radar.md) | Who decides, who blocks, who escalates | Need to know who matters |
113
- | [trust-engineering](skills/fde/references/trust-engineering.md) | Observer → trusted; navigate AI policy | Need access or credibility |
114
- | [scope-defense](skills/fde/references/scope-defense.md) | Scope receipts; the accumulation conversation | "Also can you…", timeline unchanged |
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 |
115
109
 
116
110
  ### Discover - Find the real problem
117
111
 
118
112
  | Skill | What It Does | Use When |
119
113
  |--------|--------------|----------|
120
- | [discover](skills/fde/references/discover.md) | Repo + workaround + the real problem | Brief feels wrong, shadow processes |
121
- | [assumption-audit](skills/fde/references/assumption-audit.md) | Untested assumptions by blast radius | Brief feels too neat |
122
- | [use-case-scoring](skills/fde/references/use-case-scoring.md) | Value × urgency × alignment / complexity | Everything is P0 |
123
- | [sketch](skills/fde/references/sketch.md) | Kill the killer assumption in a day | POC, spike, need to de-risk |
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 |
124
118
 
125
119
  ### Plan - Sequence the work
126
120
 
127
121
  | Skill | What It Does | Use When |
128
122
  |--------|--------------|----------|
129
- | [plan](skills/fde/references/plan.md) | Backwards from done, PR-sized | What order, what is done |
123
+ | [plan](skills/fde/references/plan.md) | Backwards from done, Kill if on each PR | What order, what is done |
130
124
  | [business-case](skills/fde/references/business-case.md) | Cost of nothing → investment → return | Defend budget or timeline |
131
- | [options-analysis](skills/fde/references/options-analysis.md) | Three genuine options | "What should we do?" |
132
- | [initiative-triage](skills/fde/references/initiative-triage.md) | Pick three from twenty urgents | Everything is urgent |
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 |
133
127
 
134
- ### Ship - Go live
128
+ ### Ship - On their repo, then live
135
129
 
136
130
  | Skill | What It Does | Use When |
137
131
  |--------|--------------|----------|
138
- | [incremental-build](skills/fde/references/incremental-build.md) | Vertical slices, on-site proof | Building on their codebase |
139
- | [blast-radius](skills/fde/references/blast-radius.md) | Impact from contained → irreversible | Touching shared infrastructure |
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 |
140
134
  | [rescue](skills/fde/references/rescue.md) | Production fire or trust fire | Down, or they went quiet |
141
- | [ship](skills/fde/references/ship.md) | Intent vs diff, pre-flight, rollback | Going live |
142
135
  | [review](skills/fde/references/review.md) | Did we only build what we agreed | Before merge, scope creep |
143
- | [rollback-drill](skills/fde/references/rollback-drill.md) | Test the escape route before 2am | "We can always revert" |
136
+ | [rollback](skills/fde/references/rollback.md) | Test the escape route before 2am | "We can always revert" |
144
137
 
145
- ### Prove - Outcome
138
+ ### Outcome - Get the number accepted
146
139
 
147
140
  | Skill | What It Does | Use When |
148
141
  |--------|--------------|----------|
149
- | [status](skills/fde/references/status.md) | Promised → measured → accepted | Friday, sponsor update |
142
+ | [readout](skills/fde/references/readout.md) | Promised → measured → accepted | Friday, sponsor update |
150
143
  | [demo-prep](skills/fde/references/demo-prep.md) | One number, five hard questions | Demo or exec walkthrough |
151
144
  | [debrief](skills/fde/references/debrief.md) | Meeting notes into the record | Just left a meeting |
152
- | [exec-narrative](skills/fde/references/exec-narrative.md) | Board / sponsor's boss | Justify continued investment |
145
+ | [board-memo](skills/fde/references/board-memo.md) | Board / sponsor's boss | Justify continued investment |
153
146
  | [dashboard](skills/fde/references/dashboard.md) | Portfolio, trust-ordered | All my customers |
154
147
  | [ingest](skills/fde/references/ingest.md) | Pull text you confirm | Transcript, Notion, Slack |
155
- | [ingest-connect](skills/fde/references/ingest-connect.md) | Wire a source MCP | Connect Granola |
148
+ | [connect](skills/fde/references/connect.md) | Wire a source MCP | Connect Granola |
156
149
 
157
150
  ### Close - They run it
158
151
 
159
152
  | Skill | What It Does | Use When |
160
153
  |--------|--------------|----------|
161
154
  | [close](skills/fde/references/close.md) | Handoff that survives you | Wrapping up |
162
- | [handoff-engineering](skills/fde/references/handoff-engineering.md) | Runbook, confidence scoring | They must operate without you |
163
- | [multi-customer-ops](skills/fde/references/multi-customer-ops.md) | Switch without bleed | 2+ clients |
164
- | [pattern-extract](skills/fde/references/pattern-extract.md) | If you did it twice, encode it | It will apply again |
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 |
165
158
  | [red-team](skills/fde/references/red-team.md) | Stress-test before they do | "Poke holes in this" |
166
159
 
167
160
  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)
@@ -191,7 +184,7 @@ One skill. One reference file per situation. One folder per client.
191
184
  ```
192
185
 
193
186
  - **Process, not prose.** Each reference is a workflow with an artifact and a checkpoint, not a tip sheet.
194
- - **Ground loop.** Name → characterise → prove where they live → log. The workspace compiles; `@fde` stays.
187
+ - **Ground loop.** Name → characterise → prove where they live → go live → log. The workspace compiles; `@fde` stays.
195
188
  - **You confirm.** Nothing is written until you say so.
196
189
  - **Progressive disclosure.** `SKILL.md` is the entry point. One `references/*.md` loads when routed.
197
190
  - **Local CLI.** Writes and status cost zero model tokens. The AI coding agent runs it.
@@ -206,37 +199,36 @@ Change hosts, install `@fde` on the new one, bind if needed, keep talking. The r
206
199
  fdeops/
207
200
  ├── skills/fde/ # the one skill hosts load
208
201
  │ ├── SKILL.md # router
209
- │ └── references/ # 31 skills + overlays (you never pick)
202
+ │ └── references/ # 30 skills + overlays (you never pick)
210
203
  │ ├── land.md # Land
211
204
  │ ├── audit.md
212
- │ ├── stakeholder-radar.md
213
- │ ├── trust-engineering.md
214
- │ ├── scope-defense.md
205
+ │ ├── who-decides.md
206
+ │ ├── earn-trust.md
207
+ │ ├── hold-scope.md
215
208
  │ ├── discover.md # Discover
216
- │ ├── assumption-audit.md
217
- │ ├── use-case-scoring.md
218
- │ ├── sketch.md
209
+ │ ├── test-assumptions.md
210
+ │ ├── score-use-cases.md
211
+ │ ├── poc.md
219
212
  │ ├── plan.md # Plan
220
213
  │ ├── business-case.md
221
- │ ├── options-analysis.md
222
- │ ├── initiative-triage.md
223
- │ ├── incremental-build.md # Ship
224
- │ ├── blast-radius.md
214
+ │ ├── three-options.md
215
+ │ ├── pick-three.md
216
+ │ ├── ship.md # Ship
217
+ │ ├── what-breaks.md
225
218
  │ ├── rescue.md
226
- │ ├── ship.md
227
219
  │ ├── review.md
228
- │ ├── rollback-drill.md
229
- │ ├── status.md # Prove
220
+ │ ├── rollback.md
221
+ │ ├── readout.md # Outcome
230
222
  │ ├── demo-prep.md
231
223
  │ ├── debrief.md
232
- │ ├── exec-narrative.md
224
+ │ ├── board-memo.md
233
225
  │ ├── dashboard.md
234
226
  │ ├── ingest.md
235
- │ ├── ingest-connect.md
227
+ │ ├── connect.md
236
228
  │ ├── close.md # Close
237
- │ ├── handoff-engineering.md
238
- │ ├── multi-customer-ops.md
239
- │ ├── pattern-extract.md
229
+ │ ├── runbook.md
230
+ │ ├── switch-clients.md
231
+ │ ├── encode-pattern.md
240
232
  │ ├── red-team.md
241
233
  │ ├── ai.md # overlays (on signal)
242
234
  │ ├── artifacts.md
@@ -251,11 +243,11 @@ fdeops/
251
243
  │ ├── ship.md
252
244
  │ ├── outcome.md
253
245
  │ ├── close.md
254
- │ ├── quiet.md
255
- │ ├── agreed.md
246
+ │ ├── trust.md
247
+ │ ├── receipts.md
256
248
  │ ├── debrief.md
257
249
  │ ├── prep.md
258
- │ └── status.md
250
+ │ └── readout.md
259
251
  ├── .claude-plugin/ # Claude Code marketplace
260
252
  ├── bin/ # local CLI: git + files, no network
261
253
  ├── hooks/ # session-start / session-stop / pre-compact
@@ -273,7 +265,7 @@ fdeops/
273
265
 
274
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.
275
267
 
276
- FDEOps is what you take on site. One `@fde` skill runs the embed from discovery to signed outcome: POC, slice, on-site proof, 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.
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.
277
269
 
278
270
  ---
279
271
 
@@ -313,7 +305,7 @@ Local only - `git` + files, no network, no telemetry. Plain markdown. The model
313
305
  ## Principles
314
306
 
315
307
  - **The artifact is the memory** - producing the work and recording it are one action
316
- - **Ground loop** - name the slice, characterise their code, prove it where they live, log the outcome
308
+ - **Ground loop** - name the change, characterise their code, prove it on their staging, go live, log the outcome
317
309
  - **Skills, not autonomy** - the kit says what to check; judgment stays yours
318
310
  - **Brief is a hypothesis** - discover before building the wrong thing
319
311
  - **Evidence on every claim** - these files get defended in the room
@@ -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, slices, characterisation, on-site proof, 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, small PRs, 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, slices, characterisation, on-site proof, 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, small PRs, 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.
@@ -62,13 +62,13 @@ 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 (31 skills, routing logic, evidence format, memory contract). Larger models handle it better:
65
+ The methodology 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
- | **7-8B** (Llama 3.1 8B, Mistral 7B, Qwen 2.5 7B) | Handles individual skills (status, log, land). May struggle with complex routing or multi-skill sessions. Good for the CLI-heavy workflow where you invoke skills explicitly. |
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
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. |
71
- | **70B+** (Llama 3.1 405B, DeepSeek V3, Qwen 2.5 72B) | Full capability. Handles regulated overlays, multi-customer ops, exec-narrative pyramid structure, complex handoff engineering. |
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
74
74
 
@@ -107,4 +107,4 @@ ollama run my-fde-model --system "$(cat skills/fde/SKILL.md)"
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
108
  - **Temperature 0.2-0.4 works best.** The methodology is 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 scope-defense." 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 method.
@@ -31,4 +31,4 @@ Defaults to the current directory if no path is given. Existing files are never
31
31
 
32
32
  ## The principle
33
33
 
34
- The adapter only tells the tool **where the brain is and how to behave**. All 31 skills, the overlays, and the memory contract live once in `skills/fde/SKILL.md`. Update the brain, every platform gets it. That's why fdeops feels native in whatever the FDE already uses, without five things to keep in sync.
34
+ The adapter only tells the tool **where the brain is and how to behave**. All 30 skills, the overlays, and the memory contract live once in `skills/fde/SKILL.md`. Update the brain, every platform gets it. That's why fdeops feels native in whatever the FDE already uses, without five things to keep in sync.
@@ -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, slices, characterisation, on-site proof, 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, small PRs, 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, slices, characterisation, on-site proof, 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, small PRs, 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
@@ -63,8 +63,8 @@ if (fs.existsSync(path.join(root, 'skills', 'fde', 'archive'))) {
63
63
  // v3: one skill + phase references (progressive disclosure)
64
64
  const requiredReferences = [
65
65
  'land.md', 'discover.md', 'audit.md', 'plan.md', 'review.md',
66
- 'rescue.md', 'ship.md', 'sketch.md', 'close.md', 'dashboard.md',
67
- 'debrief.md', 'status.md', 'demo-prep.md',
66
+ 'rescue.md', 'ship.md', 'poc.md', 'close.md', 'dashboard.md',
67
+ 'debrief.md', 'readout.md', 'demo-prep.md',
68
68
  'healthcare.md', 'fintech.md', 'gov.md',
69
69
  'ai.md', 'eval-pack.md',
70
70
  ]
@@ -84,8 +84,8 @@ ok('phase references')
84
84
  // file the work lands in. Prose-only guidance drifts into advice nobody can apply.
85
85
  const exampleReferences = [
86
86
  'land.md', 'discover.md', 'plan.md', 'ship.md', 'close.md',
87
- 'status.md', 'stakeholder-radar.md', 'options-analysis.md', 'business-case.md',
88
- 'assumption-audit.md', 'scope-defense.md',
87
+ 'readout.md', 'who-decides.md', 'three-options.md', 'business-case.md',
88
+ 'test-assumptions.md', 'hold-scope.md',
89
89
  ]
90
90
  for (const f of exampleReferences) {
91
91
  const p = path.join(root, 'skills', 'fde', 'references', f)
@@ -115,7 +115,7 @@ for (const refFile of mentioned) {
115
115
  ok(`router dispatch (${mentioned.length} reference targets verified) + memory contract`)
116
116
 
117
117
  // Public claims must match the router. The docs advertise a method count and a
118
- // per-domain list; both drifted from SKILL.md once (ingest / ingest-connect
118
+ // per-domain list; both drifted from SKILL.md once (ingest / connect
119
119
  // routed but undocumented), and a number nobody can verify is worse than none.
120
120
  {
121
121
  // Every routing row must parse. A row this misses is a method that could go
@@ -186,7 +186,7 @@ ok(`router dispatch (${mentioned.length} reference targets verified) + memory co
186
186
  }
187
187
  for (const rel of ['docs/skills.md', 'docs/skills-reference.md']) {
188
188
  const body = read(rel)
189
- // `-` is a word boundary, so \bingest\b matches inside `ingest-connect`:
189
+ // `-` is a word boundary, so \bscore\b matches inside `score-use-cases`:
190
190
  // a method 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(', ')}`)
@@ -203,6 +203,14 @@ ok(`router dispatch (${mentioned.length} reference targets verified) + memory co
203
203
  const extra = fs.readdirSync(refDir).filter(f => f.endsWith('.md') && !mentioned.includes(f))
204
204
  if (extra.length) fail(`unrouted reference file(s) - dead method: ${extra.join(', ')}`)
205
205
  else ok('no unrouted reference files')
206
+
207
+ // The on-site change loop lives in ship.md. A sibling method is a split.
208
+ for (const dead of ['small-prs.md', 'thin-slices.md', 'implement.md']) {
209
+ if (fs.existsSync(path.join(refDir, dead))) {
210
+ fail(`${dead} must not exist - that craft lives in ship.md`)
211
+ }
212
+ }
213
+ ok('ship is one method (no implement / small-prs / thin-slices sibling)')
206
214
  }
207
215
 
208
216
  const install = read('bin/install.js')
@@ -221,8 +229,10 @@ if (read('package.json').includes('postinstall')) {
221
229
  }
222
230
 
223
231
  const readme = read('README.md')
224
- if (/session\.gif|demo\.gif|<img /i.test(readme)) {
225
- fail('README must not embed images - front door is text; the recording lives in docs/USAGE.md')
232
+ if (/session\.gif|demo\.gif/i.test(readme)) {
233
+ fail('README must not embed session.gif or demo.gif - the recording lives in docs/USAGE.md')
234
+ } else if (/<img /i.test(readme) && !/user-attachments\/assets/.test(readme)) {
235
+ fail('README <img> must be the GitHub poster (user-attachments), not a local gif')
226
236
  } else ok('README is text (no gif)')
227
237
 
228
238
  const usage = read('docs/USAGE.md')
@@ -262,15 +272,17 @@ if (!readme.includes('AI coding agent')) {
262
272
  }
263
273
  ok('README clarity sections')
264
274
 
265
- for (const cmd of ['/brief', '/discover', '/plan', '/ship', '/outcome', '/close', '/debrief', '/prep', '/quiet', '/agreed', '/status']) {
275
+ for (const cmd of ['/brief', '/discover', '/plan', '/ship', '/outcome', '/close', '/debrief', '/prep', '/trust', '/receipts', '/readout']) {
266
276
  if (!readme.includes(cmd)) fail(`README must document slash command ${cmd}`)
267
277
  }
268
278
  if (/(^|[^\w/])\/got\b/.test(readme)) fail('README must use /outcome, not /got')
269
279
  ok('README slash commands documented')
270
280
 
271
- // Front-door map is the embed left-to-right (LANDCLOSE), not a pile of situations.
272
- if (!readme.slice(0, 4000).includes('LAND') || !readme.slice(0, 4000).includes('/discover')) {
273
- fail('README must include the LAND→CLOSE command-map diagram near the top')
281
+ // Front-door map is the embed left-to-right (LandClose). After the GitHub
282
+ // poster (#68) the table is the map: /brief /discover /plan /ship /outcome /close.
283
+ const front = readme.slice(0, 4000)
284
+ if (!['/brief', '/discover', '/plan', '/ship', '/outcome', '/close'].every(c => front.includes(c))) {
285
+ fail('README must include the Land→Close command map near the top')
274
286
  } else ok('README command-map diagram')
275
287
 
276
288
  if (readme.includes('your-client-repo')) {
@@ -536,7 +548,7 @@ if (pkg.version !== plugin.version) {
536
548
  if (plugin.commands !== './.claude/commands' || plugin.skills !== './skills') {
537
549
  fail('.claude-plugin/plugin.json must declare skills and commands')
538
550
  } else {
539
- for (const cmd of ['brief', 'discover', 'plan', 'ship', 'outcome', 'close', 'debrief', 'prep', 'quiet', 'agreed', 'status']) {
551
+ for (const cmd of ['brief', 'discover', 'plan', 'ship', 'outcome', 'close', 'debrief', 'prep', 'trust', 'receipts', 'readout']) {
540
552
  const rel = `.claude/commands/${cmd}.md`
541
553
  if (!fs.existsSync(path.join(root, rel))) fail(`${rel} missing`)
542
554
  else if (!read(rel).includes('@fde')) fail(`${rel} must load @fde`)
@@ -550,8 +562,8 @@ if (!fs.existsSync(path.join(root, 'mcp', 'fdeops-ingest', 'server.js'))) {
550
562
  fail('ingest MCP must expose ingest_stage')
551
563
  } else if (!read('skills/fde/references/ingest.md').includes('stage')) {
552
564
  fail('skills/fde/references/ingest.md missing stage contract')
553
- } else if (!fs.existsSync(path.join(root, 'skills', 'fde', 'references', 'ingest-connect.md'))) {
554
- fail('skills/fde/references/ingest-connect.md missing')
565
+ } else if (!fs.existsSync(path.join(root, 'skills', 'fde', 'references', 'connect.md'))) {
566
+ fail('skills/fde/references/connect.md missing')
555
567
  } else {
556
568
  for (const recipe of ['file.md', 'granola.md', 'slack.md', 'notion.md']) {
557
569
  if (!fs.existsSync(path.join(root, 'mcp', 'recipes', recipe))) fail(`mcp/recipes/${recipe} missing`)