fdeops 3.16.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 (51) hide show
  1. package/README.md +82 -84
  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 +2 -2
  6. package/adapters/copilot-instructions.md +1 -1
  7. package/adapters/cursor.fde.mdc +1 -1
  8. package/bin/check.js +42 -11
  9. package/bin/fde.js +157 -20
  10. package/bin/lib/render.js +2 -2
  11. package/bin/lib/trust.js +42 -5
  12. package/mcp/fdeops-ingest/package.json +1 -1
  13. package/package.json +1 -1
  14. package/plugin.json +1 -1
  15. package/skills/fde/SKILL.md +43 -42
  16. package/skills/fde/references/ai.md +2 -2
  17. package/skills/fde/references/audit.md +2 -2
  18. package/skills/fde/references/board-memo.md +1 -1
  19. package/skills/fde/references/business-case.md +1 -1
  20. package/skills/fde/references/close.md +1 -1
  21. package/skills/fde/references/connect.md +1 -1
  22. package/skills/fde/references/dashboard.md +2 -2
  23. package/skills/fde/references/debrief.md +1 -1
  24. package/skills/fde/references/demo-prep.md +1 -1
  25. package/skills/fde/references/discover.md +34 -15
  26. package/skills/fde/references/earn-trust.md +1 -1
  27. package/skills/fde/references/encode-pattern.md +3 -3
  28. package/skills/fde/references/eval-pack.md +2 -2
  29. package/skills/fde/references/hold-scope.md +1 -1
  30. package/skills/fde/references/ingest.md +1 -1
  31. package/skills/fde/references/land.md +1 -1
  32. package/skills/fde/references/pick-three.md +1 -1
  33. package/skills/fde/references/plan.md +10 -7
  34. package/skills/fde/references/poc.md +4 -2
  35. package/skills/fde/references/readout.md +1 -1
  36. package/skills/fde/references/red-team.md +1 -1
  37. package/skills/fde/references/rescue.md +3 -2
  38. package/skills/fde/references/review.md +1 -1
  39. package/skills/fde/references/rollback.md +1 -1
  40. package/skills/fde/references/runbook.md +1 -1
  41. package/skills/fde/references/score-use-cases.md +1 -1
  42. package/skills/fde/references/ship.md +124 -17
  43. package/skills/fde/references/switch-clients.md +1 -1
  44. package/skills/fde/references/test-assumptions.md +2 -2
  45. package/skills/fde/references/three-options.md +1 -1
  46. package/skills/fde/references/what-breaks.md +1 -1
  47. package/skills/fde/references/who-decides.md +1 -1
  48. package/templates/.fde/assumptions.md +1 -1
  49. package/templates/.fde/reality.md +6 -1
  50. package/templates/.fde/terrain.md +1 -1
  51. package/skills/fde/references/thin-slices.md +0 -100
package/README.md CHANGED
@@ -2,43 +2,38 @@
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
 
18
11
  ## Commands
19
12
 
20
- Each command loads the same `@fde` skill. You never pick from 31 names.
13
+ One command per stage. Skills load automatically.
21
14
 
22
- | What you're doing | Command | Key principle |
23
- |-------------------|---------|-----------|
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 |
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 |
30
25
 
31
26
  Also:
32
27
 
33
- | What you're doing | Command | Key principle |
34
- |-------------------|---------|-----------|
35
- | Sponsor went silent | `/trust` | Process or trust |
36
- | Scope dispute | `/receipts` | Dated, or a gap |
37
- | After a meeting | `/debrief` | Notes into the record |
38
- | Walk-in | `/prep` | One page from the record |
39
- | Friday readout | `/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 |
40
35
 
41
- 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.
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.
42
37
 
43
38
  ---
44
39
 
@@ -100,70 +95,71 @@ Requires Node.js >= 18. Override: `FDEOPS_ENGAGEMENT`. See [docs/install.md](doc
100
95
 
101
96
  ---
102
97
 
103
- ## All 31 Skills
98
+ ## All 30 Skills
99
+
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.
104
101
 
105
- 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).
102
+ Full detail: [docs/skills-reference.md](docs/skills-reference.md).
106
103
 
107
- ### Land - Brief and trust
104
+ ### Land - Engage
108
105
 
109
- | Skill | What It Does | Use When |
106
+ | Skill | What it does | Use when |
110
107
  |--------|--------------|----------|
111
- | [land](skills/fde/references/land.md) | Interrogate the brief, map stakeholders, define success | New client, first meeting, just got the brief |
112
- | [audit](skills/fde/references/audit.md) | Verify claims, find the load-bearing wall | Taking over, previous consultant left |
113
- | [who-decides](skills/fde/references/who-decides.md) | Who decides, who blocks, who escalates | Need to know who matters |
114
- | [earn-trust](skills/fde/references/earn-trust.md) | Observer trusted; navigate AI policy | Need access or credibility |
115
- | [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 |
116
113
 
117
- ### Discover - Find the real problem
114
+ ### Discover - Diagnose
118
115
 
119
- | Skill | What It Does | Use When |
116
+ | Skill | What it does | Use when |
120
117
  |--------|--------------|----------|
121
- | [discover](skills/fde/references/discover.md) | Repo + workaround + the real problem | Brief feels wrong, shadow processes |
122
- | [test-assumptions](skills/fde/references/test-assumptions.md) | Untested assumptions by blast radius | Brief feels too neat |
123
- | [score-use-cases](skills/fde/references/score-use-cases.md) | Value × urgency × alignment / complexity | Everything is P0 |
124
- | [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 |
125
122
 
126
- ### Plan - Sequence the work
123
+ ### Plan - Align
127
124
 
128
- | Skill | What It Does | Use When |
125
+ | Skill | What it does | Use when |
129
126
  |--------|--------------|----------|
130
- | [plan](skills/fde/references/plan.md) | Backwards from done, PR-sized | What order, what is done |
131
- | [business-case](skills/fde/references/business-case.md) | Cost of nothing investment → return | Defend budget or timeline |
132
- | [three-options](skills/fde/references/three-options.md) | Three genuine options | "What should we do?" |
133
- | [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 |
134
131
 
135
- ### Ship - Go live
132
+ ### Ship - Deliver
136
133
 
137
- | Skill | What It Does | Use When |
134
+ | Skill | What it does | Use when |
138
135
  |--------|--------------|----------|
139
- | [thin-slices](skills/fde/references/thin-slices.md) | Vertical slices, on-site proof | Building on their codebase |
140
- | [what-breaks](skills/fde/references/what-breaks.md) | Impact from contained → irreversible | Touching shared infrastructure |
141
- | [rescue](skills/fde/references/rescue.md) | Production fire or trust fire | Down, or they went quiet |
142
- | [ship](skills/fde/references/ship.md) | Intent vs diff, pre-flight, rollback | Going live |
143
- | [review](skills/fde/references/review.md) | Did we only build what we agreed | Before merge, scope creep |
144
- | [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" |
145
141
 
146
- ### Prove - Outcome
142
+ ### Outcome - Realize
147
143
 
148
- | Skill | What It Does | Use When |
144
+ | Skill | What it does | Use when |
149
145
  |--------|--------------|----------|
150
- | [readout](skills/fde/references/readout.md) | Promised measured → accepted | Friday, sponsor update |
151
- | [demo-prep](skills/fde/references/demo-prep.md) | One number, five hard questions | Demo or exec walkthrough |
152
- | [debrief](skills/fde/references/debrief.md) | Meeting notes into the record | Just left a meeting |
153
- | [board-memo](skills/fde/references/board-memo.md) | Board / sponsor's boss | Justify continued investment |
154
- | [dashboard](skills/fde/references/dashboard.md) | Portfolio, trust-ordered | All my customers |
155
- | [ingest](skills/fde/references/ingest.md) | Pull text you confirm | Transcript, Notion, Slack |
156
- | [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 |
157
153
 
158
- ### Close - They run it
154
+ ### Close - Transfer
159
155
 
160
- | Skill | What It Does | Use When |
156
+ | Skill | What it does | Use when |
161
157
  |--------|--------------|----------|
162
- | [close](skills/fde/references/close.md) | Handoff that survives you | Wrapping up |
163
- | [runbook](skills/fde/references/runbook.md) | Runbook, confidence scoring | They must operate without you |
164
- | [switch-clients](skills/fde/references/switch-clients.md) | Switch without bleed | 2+ clients |
165
- | [encode-pattern](skills/fde/references/encode-pattern.md) | If you did it twice, encode it | It will apply again |
166
- | [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" |
167
163
 
168
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)
169
165
 
@@ -182,7 +178,7 @@ One skill. One reference file per situation. One folder per client.
182
178
  skills/fde/SKILL.md hosts load this one file
183
179
  │ routes. you never pick a skill by name
184
180
 
185
- references/land.md one workflow, then stop
181
+ references/land.md one skill, then stop
186
182
 
187
183
 
188
184
  fde CLI (local) dates, gates, redacts. no network
@@ -191,11 +187,13 @@ One skill. One reference file per situation. One folder per client.
191
187
  ~/fde-engagements/<client>/.fde/
192
188
  ```
193
189
 
194
- - **Process, not prose.** Each reference is a workflow with an artifact and a checkpoint, not a tip sheet.
195
- - **Ground loop.** Name → characterise → prove where they live → log. The workspace compiles; `@fde` stays.
196
- - **You confirm.** Nothing is written until you say so.
197
- - **Progressive disclosure.** `SKILL.md` is the entry point. One `references/*.md` loads when routed.
198
- - **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.
199
197
 
200
198
  Change hosts, install `@fde` on the new one, bind if needed, keep talking. The record is not inside any vendor.
201
199
 
@@ -207,7 +205,7 @@ Change hosts, install `@fde` on the new one, bind if needed, keep talking. The r
207
205
  fdeops/
208
206
  ├── skills/fde/ # the one skill hosts load
209
207
  │ ├── SKILL.md # router
210
- │ └── references/ # 31 skills + overlays (you never pick)
208
+ │ └── references/ # 30 skills + overlays (you never pick)
211
209
  │ ├── land.md # Land
212
210
  │ ├── audit.md
213
211
  │ ├── who-decides.md
@@ -221,13 +219,12 @@ fdeops/
221
219
  │ ├── business-case.md
222
220
  │ ├── three-options.md
223
221
  │ ├── pick-three.md
224
- │ ├── thin-slices.md # Ship
222
+ │ ├── ship.md # Ship
225
223
  │ ├── what-breaks.md
226
224
  │ ├── rescue.md
227
- │ ├── ship.md
228
225
  │ ├── review.md
229
226
  │ ├── rollback.md
230
- │ ├── readout.md # Prove
227
+ │ ├── readout.md # Outcome
231
228
  │ ├── demo-prep.md
232
229
  │ ├── debrief.md
233
230
  │ ├── board-memo.md
@@ -272,9 +269,9 @@ fdeops/
272
269
 
273
270
  ## Why FDEOps?
274
271
 
275
- 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.
276
273
 
277
- 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.
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.
278
275
 
279
276
  ---
280
277
 
@@ -313,8 +310,9 @@ Local only - `git` + files, no network, no telemetry. Plain markdown. The model
313
310
 
314
311
  ## Principles
315
312
 
313
+ - **One map** - any scale, greenfield or brownfield, any industry. Overlays carry the vertical
316
314
  - **The artifact is the memory** - producing the work and recording it are one action
317
- - **Ground loop** - name the slice, characterise their code, prove it where they live, log the outcome
315
+ - **Ground loop** - name the change, characterise their code, prove it on their staging, go live, log the outcome
318
316
  - **Skills, not autonomy** - the kit says what to check; judgment stays yours
319
317
  - **Brief is a hypothesis** - discover before building the wrong thing
320
318
  - **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, 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, 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, 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 (31 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
 
@@ -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, 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, 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, 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,8 +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
+
207
+ // The on-site change loop lives in ship.md. A sibling skill 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 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')
206
221
  }
207
222
 
208
223
  const install = read('bin/install.js')
@@ -221,8 +236,10 @@ if (read('package.json').includes('postinstall')) {
221
236
  }
222
237
 
223
238
  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')
239
+ if (/session\.gif|demo\.gif/i.test(readme)) {
240
+ fail('README must not embed session.gif or demo.gif - the recording lives in docs/USAGE.md')
241
+ } else if (/<img /i.test(readme) && !/user-attachments\/assets/.test(readme)) {
242
+ fail('README <img> must be the GitHub poster (user-attachments), not a local gif')
226
243
  } else ok('README is text (no gif)')
227
244
 
228
245
  const usage = read('docs/USAGE.md')
@@ -268,9 +285,11 @@ for (const cmd of ['/brief', '/discover', '/plan', '/ship', '/outcome', '/close'
268
285
  if (/(^|[^\w/])\/got\b/.test(readme)) fail('README must use /outcome, not /got')
269
286
  ok('README slash commands documented')
270
287
 
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')
288
+ // Front-door map is the embed left-to-right (LandClose). After the GitHub
289
+ // poster (#68) the table is the map: /brief /discover /plan /ship /outcome /close.
290
+ const front = readme.slice(0, 4000)
291
+ if (!['/brief', '/discover', '/plan', '/ship', '/outcome', '/close'].every(c => front.includes(c))) {
292
+ fail('README must include the Land→Close command map near the top')
274
293
  } else ok('README command-map diagram')
275
294
 
276
295
  if (readme.includes('your-client-repo')) {
@@ -337,6 +356,18 @@ for (const rx of derivativeFraming) {
337
356
  if (/docs\/internal|PMF_360/i.test(readme)) {
338
357
  fail('README must not link docs/internal or PMF_360')
339
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
+ }
340
371
  ok('README tone')
341
372
 
342
373
  if (fs.existsSync(path.join(root, '.codex')) || fs.existsSync(path.join(root, '.opencode'))) {