fdeops 3.17.0 → 3.21.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 (50) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +160 -149
  3. package/adapters/AGENTS.md +1 -1
  4. package/adapters/GEMINI.md +1 -1
  5. package/adapters/LOCAL-LLM.md +5 -5
  6. package/adapters/README.md +1 -1
  7. package/adapters/copilot-instructions.md +1 -1
  8. package/adapters/cursor.fde.mdc +1 -1
  9. package/bin/check.js +29 -10
  10. package/bin/fde.js +7 -7
  11. package/bin/lib/trust.js +4 -2
  12. package/mcp/fdeops-ingest/package.json +1 -1
  13. package/package.json +2 -2
  14. package/plugin.json +2 -2
  15. package/skills/fde/SKILL.md +34 -32
  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 +23 -9
  26. package/skills/fde/references/earn-trust.md +1 -1
  27. package/skills/fde/references/encode-pattern.md +4 -3
  28. package/skills/fde/references/eval-pack.md +4 -4
  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 +5 -5
  32. package/skills/fde/references/pick-three.md +1 -1
  33. package/skills/fde/references/plan.md +1 -1
  34. package/skills/fde/references/poc.md +8 -3
  35. package/skills/fde/references/readout.md +5 -4
  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 +3 -3
  39. package/skills/fde/references/rollback.md +1 -1
  40. package/skills/fde/references/runbook.md +5 -3
  41. package/skills/fde/references/score-use-cases.md +1 -1
  42. package/skills/fde/references/ship.md +11 -3
  43. package/skills/fde/references/switch-clients.md +1 -1
  44. package/skills/fde/references/test-assumptions.md +19 -8
  45. package/skills/fde/references/three-options.md +18 -11
  46. package/skills/fde/references/what-breaks.md +1 -1
  47. package/skills/fde/references/who-decides.md +1 -1
  48. package/templates/.fde/README.md +1 -1
  49. package/templates/.fde/assumptions.md +3 -2
  50. package/templates/.fde/terrain.md +1 -1
package/AGENTS.md CHANGED
@@ -4,7 +4,7 @@ This repository **is** fdeops - the engagement record for Forward Deployed Engin
4
4
 
5
5
  ## If you are helping use fdeops in an engagement
6
6
 
7
- Route via **`@fde`** - read `skills/fde/SKILL.md` (the single source of truth), pick the phase, do the work, and write `.fde/` memory. Never ask the human to pick a skill. Other tools get the same behavior through thin pointer files in [`adapters/`](adapters/README.md).
7
+ Route via **`@fde`** - read `skills/fde/SKILL.md` (the single source of truth), route to one `references/*.md`, do the work, and write `.fde/` memory. Never ask the human to pick a skill. Other tools get the same behavior through thin pointer files in [`adapters/`](adapters/README.md).
8
8
 
9
9
  ## If you are contributing to this repository
10
10
 
package/README.md CHANGED
@@ -2,89 +2,76 @@
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, their codebase (greenfield or brownfield), go-live, eval, signed outcome. The workspace still compiles and commits. `@fde` does not leave.
5
+ You're on a customer site. The AI coding agent writes code in their repo. This kit is the work around that code: the brief, who can say yes, proof on their staging then live, whether they signed off, whether they can run it after you leave.
6
6
 
7
- <img width="1774" height="887" alt="FDEops-githubposter" src="https://github.com/user-attachments/assets/9eb842d2-a356-4995-9057-841f1b2d15d6" />
7
+ Notes stay on your laptop. Their repo stays theirs. You confirm before anything is written down.
8
8
 
9
- ---
10
-
11
- ## Commands
12
-
13
- Each command loads the same `@fde` skill. You never pick from 31 names.
9
+ <img width="1536" height="1024" alt="fdeops" src="https://github.com/user-attachments/assets/2bcb8739-55ee-445d-8a1a-8b38433b7b58" />
14
10
 
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 |
11
+ ---
23
12
 
24
- Also:
13
+ ## Quick Start
25
14
 
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 |
15
+ **Try it first, nothing installed.** In any repo:
33
16
 
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.
17
+ ```bash
18
+ npx fdeops scan
19
+ ```
35
20
 
36
- ---
21
+ Two minutes. It prints what to look at on day one and the questions to ask. Local only, nothing written.
37
22
 
38
- ## Quick Start
23
+ **Then install the skill:**
39
24
 
40
25
  ```bash
41
26
  npx skills add suboss87/fdeops --skill fde
42
27
  ```
43
28
 
44
- Then one chat. Name the client. The AI coding agent binds.
29
+ One chat. Name the client:
45
30
 
46
31
  ```text
47
- @fde this is Acme
32
+ @fde this is client01
48
33
  ```
49
34
 
50
- Paste kickoff notes in the same thread. `@fde` routes; you confirm judgment. Same folder every time: `~/fde-engagements/<client>/.fde/`. Workflow: [docs/USAGE.md](docs/USAGE.md).
35
+ That creates `~/fde-engagements/client01/.fde/` on your laptop. Paste kickoff notes in the same thread. `@fde` picks what to check. You still decide.
36
+
37
+ Day to day: [docs/USAGE.md](docs/USAGE.md).
51
38
 
52
39
  <details>
53
- <summary><b>Claude Code (recommended)</b></summary>
40
+ <summary><b>Claude Code</b></summary>
54
41
 
55
42
  ```text
56
43
  /plugin marketplace add suboss87/fdeops
57
44
  /plugin install fdeops@fdeops
58
45
  ```
59
46
 
60
- Hooks load where you left off. Slash commands match the map above.
47
+ Hooks resume where you left off. Slash commands match the table below.
61
48
 
62
49
  </details>
63
50
 
64
51
  <details>
65
52
  <summary><b>Cursor</b></summary>
66
53
 
54
+ After the skill install, in the **client repo** you have open (pointer, not a second pack):
55
+
67
56
  ```bash
68
- npx skills add suboss87/fdeops --skill fde
57
+ npx fdeops adapters .
69
58
  ```
70
59
 
71
- Or `npx fdeops adapters .`. See [adapters/](adapters/README.md).
60
+ See [adapters/](adapters/README.md).
72
61
 
73
62
  </details>
74
63
 
75
64
  <details>
76
- <summary><b>Other agents</b></summary>
65
+ <summary><b>Air-gap, PATH, override</b></summary>
77
66
 
78
67
  ```bash
79
- npx skills add suboss87/fdeops --skill fde
68
+ git clone https://github.com/suboss87/fdeops.git && node bin/install.js
80
69
  ```
81
70
 
82
- Gemini, Copilot, Codex, local LLMs: [adapters/](adapters/README.md). Air-gapped: `git clone https://github.com/suboss87/fdeops.git && node bin/install.js`.
83
-
84
- Fallback if the agent cannot bind:
71
+ If the agent cannot create the folder:
85
72
 
86
73
  ```bash
87
- npx fdeops resume --init acme # ~/fde-engagements/acme + bind this checkout
74
+ npx fdeops resume --init client01 # ~/fde-engagements/client01
88
75
  ```
89
76
 
90
77
  Requires Node.js >= 18. Override: `FDEOPS_ENGAGEMENT`. See [docs/install.md](docs/install.md). Try the loop: `npx fdeops demo`.
@@ -93,71 +80,94 @@ Requires Node.js >= 18. Override: `FDEOPS_ENGAGEMENT`. See [docs/install.md](doc
93
80
 
94
81
  ---
95
82
 
83
+ ## Commands
84
+
85
+ One command per stage. Skills load automatically.
86
+
87
+ Six stages, same order every job: Land, Discover, Plan, Ship, Outcome, Close.
88
+
89
+ | What you're doing | Command | Stage |
90
+ |-------------------|---------|-------|
91
+ | First days. Get the brief. Name who signs. | `/brief` | Land |
92
+ | Check the brief is the real job. | `/discover` | Discover |
93
+ | Sequence from done, not from the ticket. | `/plan` | Plan |
94
+ | Prove it on their staging, then go live. | `/ship` | Ship |
95
+ | What you promised, measured, and who accepted. | `/outcome` | Outcome |
96
+ | Hand it over. They run it without you. | `/close` | Close |
97
+
98
+ Same `@fde`, when you need them: `/debrief` (notes into the record), `/prep` (one page before you walk in), `/trust` (process gap, or they stopped trusting you), `/receipts` (a dated line, or it did not happen), `/readout` (Friday page for the sponsor; not a seventh stage).
99
+
100
+ You can also just say it: naming a client, a POC, changing their checkout, going live, asking what was agreed. A typo in a repo that is not a client job can skip this. A named client, a POC, or go-live cannot.
101
+
102
+ ---
103
+
96
104
  ## All 30 Skills
97
105
 
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).
106
+ Thirty situations, grouped by stage. Not prompts - each one has steps, a file it writes, and a checkpoint with you. Type English or a slash command. `@fde` opens the matching skill. You never pick one by name.
107
+
108
+ Full detail: [docs/skills-reference.md](docs/skills-reference.md).
99
109
 
100
- ### Land - Brief and trust
110
+ ### Land
101
111
 
102
- | Skill | What It Does | Use When |
112
+ | Skill | What it does | Use when |
103
113
  |--------|--------------|----------|
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 |
114
+ | [land](skills/fde/references/land.md) | Interrogate the brief | New client, first meeting, just got the brief |
115
+ | [audit](skills/fde/references/audit.md) | Verify inherited claims | Taking over, previous consultant left |
116
+ | [who-decides](skills/fde/references/who-decides.md) | Map decision rights | Need to know who matters |
117
+ | [earn-trust](skills/fde/references/earn-trust.md) | Earn access | Need access or credibility |
118
+ | [hold-scope](skills/fde/references/hold-scope.md) | Hold scope | "Also can you…", timeline unchanged |
109
119
 
110
- ### Discover - Find the real problem
120
+ ### Discover
111
121
 
112
- | Skill | What It Does | Use When |
122
+ | Skill | What it does | Use when |
113
123
  |--------|--------------|----------|
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
+ | [discover](skills/fde/references/discover.md) | Frame the problem | Brief feels wrong, shadow processes |
125
+ | [test-assumptions](skills/fde/references/test-assumptions.md) | Test assumptions | Brief feels too neat |
126
+ | [score-use-cases](skills/fde/references/score-use-cases.md) | Score use cases | Everything is P0 |
127
+ | [poc](skills/fde/references/poc.md) | Validate the solution | POC, spike, need to de-risk |
118
128
 
119
- ### Plan - Sequence the work
129
+ ### Plan
120
130
 
121
- | Skill | What It Does | Use When |
131
+ | Skill | What it does | Use when |
122
132
  |--------|--------------|----------|
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 |
133
+ | [plan](skills/fde/references/plan.md) | Sequence the work | What order, what is done |
134
+ | [business-case](skills/fde/references/business-case.md) | Build the business case | Defend budget or timeline |
135
+ | [three-options](skills/fde/references/three-options.md) | Generate options | "What should we do?" |
136
+ | [pick-three](skills/fde/references/pick-three.md) | Prioritize three | Everything is urgent |
127
137
 
128
- ### Ship - On their repo, then live
138
+ ### Ship
129
139
 
130
- | Skill | What It Does | Use When |
140
+ | Skill | What it does | Use when |
131
141
  |--------|--------------|----------|
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" |
142
+ | [ship](skills/fde/references/ship.md) | Deliver the increment | Building, updating, or going live |
143
+ | [what-breaks](skills/fde/references/what-breaks.md) | Assess impact | Touching shared infrastructure |
144
+ | [rescue](skills/fde/references/rescue.md) | Resolve the incident | Down, or they went quiet |
145
+ | [review](skills/fde/references/review.md) | Review the change | Before merge, scope creep |
146
+ | [rollback](skills/fde/references/rollback.md) | Rehearse rollback | "We can always revert" |
137
147
 
138
- ### Outcome - Get the number accepted
148
+ ### Outcome
139
149
 
140
- | Skill | What It Does | Use When |
150
+ | Skill | What it does | Use when |
141
151
  |--------|--------------|----------|
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 |
152
+ | [readout](skills/fde/references/readout.md) | Report the outcome | Friday, sponsor update |
153
+ | [demo-prep](skills/fde/references/demo-prep.md) | Prepare the demo | Demo or exec walkthrough |
154
+ | [debrief](skills/fde/references/debrief.md) | Capture the meeting | Just left a meeting |
155
+ | [board-memo](skills/fde/references/board-memo.md) | Brief the board | Justify continued investment |
156
+ | [dashboard](skills/fde/references/dashboard.md) | View the portfolio | All my customers |
157
+ | [ingest](skills/fde/references/ingest.md) | Ingest sources | Transcript, Notion, Slack |
158
+ | [connect](skills/fde/references/connect.md) | Connect a source | Connect Granola |
149
159
 
150
- ### Close - They run it
160
+ ### Close
151
161
 
152
- | Skill | What It Does | Use When |
162
+ | Skill | What it does | Use when |
153
163
  |--------|--------------|----------|
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" |
164
+ | [close](skills/fde/references/close.md) | Transfer operations | Wrapping up |
165
+ | [runbook](skills/fde/references/runbook.md) | Write the runbook | They must operate without you |
166
+ | [switch-clients](skills/fde/references/switch-clients.md) | Switch engagements | 2+ clients |
167
+ | [encode-pattern](skills/fde/references/encode-pattern.md) | Encode the pattern | It will apply again |
168
+ | [red-team](skills/fde/references/red-team.md) | Challenge the plan | "Poke holes in this" |
159
169
 
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)
170
+ 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). AI companion (not a sixth overlay): [eval-pack](skills/fde/references/eval-pack.md).
161
171
 
162
172
  Optional pull: you add the source MCP; we **pull** on request. [mcp/recipes/](mcp/recipes/)
163
173
 
@@ -165,31 +175,84 @@ Optional pull: you add the source MCP; we **pull** on request. [mcp/recipes/](mc
165
175
 
166
176
  ## How Skills Work
167
177
 
168
- One skill. One reference file per situation. One folder per client.
178
+ One `@fde`. One file per situation. One folder per client.
169
179
 
170
180
  ```
171
- /brief or "@fde this is Acme"
172
-
173
-
174
- skills/fde/SKILL.md hosts load this one file
181
+ "@fde this is client01" creates ~/fde-engagements/client01/.fde/
182
+ /brief or English the AI coding agent loads skills/fde/SKILL.md
175
183
  │ routes. you never pick a skill by name
176
184
 
177
- references/land.md one workflow, then stop
185
+ references/<one>.md one skill, then stop
178
186
 
179
187
 
180
188
  fde CLI (local) dates, gates, redacts. no network
181
189
  │ after you confirm
182
190
 
183
- ~/fde-engagements/<client>/.fde/
191
+ ~/fde-engagements/client01/.fde/
184
192
  ```
185
193
 
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.
194
+ **A dated line, or it did not happen.** Promised measured accepted. If it is not in `.fde/`, it is not on the record.
195
+
196
+ **Confirm, then it is written.** The CLI stays on your laptop: git and files, no network. The AI coding agent runs the command. You say yes. Then it is in the folder.
191
197
 
192
- Change hosts, install `@fde` on the new one, bind if needed, keep talking. The record is not inside any vendor.
198
+ **The record is on your laptop.** Change hosts, install `@fde` on the new one, keep talking. The notes are not inside any vendor.
199
+
200
+ One skill hosts load: `skills/fde/SKILL.md`. It opens one file in `skills/fde/references/` and stops. Slash commands live in `.claude/commands/`. The local CLI is `bin/fde.js` (git + files, no network). Layout: [docs/REPO_LAYOUT.md](docs/REPO_LAYOUT.md).
201
+
202
+ ---
203
+
204
+ ## Engagement memory (`.fde/`)
205
+
206
+ One folder per client. Plain markdown. Grep it, copy it, take it into a meeting.
207
+
208
+ | File | Holds |
209
+ |------|-------|
210
+ | `context.md` | Where you are |
211
+ | `brief.md` / `success.md` | What they asked; what “done” is and who signs |
212
+ | `reality.md` / `terrain.md` | The real problem; the map |
213
+ | `stakeholders.md` | `[signal:green\|amber\|red]` |
214
+ | `trust-profile.md` | Sacred data, AI policy, approval chain |
215
+ | `decisions.md` / `risks.md` / `delivery.md` | Dated choices; live risks; what shipped and how it rolls back |
216
+
217
+ Schema: [docs/schema.md](docs/schema.md). Local HTML: `npx fdeops dashboard`.
218
+
219
+ ---
220
+
221
+ ## Who this is for
222
+
223
+ You sit with a customer's team. An AI coding agent writes in their repo. You need a record of the brief, who can say yes, what went live, and whether they signed off.
224
+
225
+ If you ship your own company's product from HQ, with no customer team that has to run it after you leave, you do not need this kit.
226
+
227
+ ---
228
+
229
+ ## Your data stays yours
230
+
231
+ The **CLI** is local: git + files, no network, no telemetry. The **host model** sees `.fde/` the agent loads (usually a bounded `context.md`) and any client code you open. It must not see `<private>` blocks - redacted from CLI, dashboard, and hooks; do not paste them or open them with file tools. Nothing is written until you confirm. `~/fde-engagements` is in `$HOME`; iCloud/Dropbox is an NDA incident waiting.
232
+
233
+ [PRIVACY.md](PRIVACY.md) · [SECURITY.md](SECURITY.md)
234
+
235
+ ---
236
+
237
+ ## Why FDEOps?
238
+
239
+ AI coding agents are built for a repo, not for a client. Left alone they skip who signs, whether the brief is true, and whether anyone accepted the number. Monday they start from the ticket again.
240
+
241
+ This is the kit you take on site. `@fde` runs the client work around the code. A local command dates every decision. The notes are markdown on your laptop. You confirm; then it is on the record.
242
+
243
+ ---
244
+
245
+ ## Principles
246
+
247
+ - **Who signs** - name them in the first days
248
+ - **Brief vs real job** - check the floor, not only the slide
249
+ - **Back from done** - sequence from signed-off, not from the ticket
250
+ - **Their staging then live** - prove it where they operate, then go live
251
+ - **Promised, measured, accepted** - a number nobody signed is claimed, not delivered
252
+ - **They run it** - if they cannot operate it without you, you are not done
253
+ - **A dated line, or it did not happen** - these files get defended in the room
254
+ - **One customer, one folder** - context never bleeds
255
+ - **The kit says what to check. You still decide.**
193
256
 
194
257
  ---
195
258
 
@@ -252,7 +315,7 @@ fdeops/
252
315
  ├── bin/ # local CLI: git + files, no network
253
316
  ├── hooks/ # session-start / session-stop / pre-compact
254
317
  ├── adapters/ # Cursor, Gemini, Copilot, Codex pointers
255
- ├── templates/.fde/ # memory files created on bind
318
+ ├── templates/.fde/ # memory files created on first client
256
319
  ├── examples/ # fictional walkthroughs
257
320
  ├── mcp/ # optional ingest + source recipes
258
321
  ├── evals/ # routing checks
@@ -261,58 +324,6 @@ fdeops/
261
324
 
262
325
  ---
263
326
 
264
- ## Why FDEOps?
265
-
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.
267
-
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.
269
-
270
- ---
271
-
272
- ## Engagement memory (`.fde/`)
273
-
274
- One folder per client. Plain markdown. Grep it, copy it, defend it.
275
-
276
- | File | Holds |
277
- |------|-------|
278
- | `context.md` | Where you are |
279
- | `brief.md` / `success.md` | What they asked; what “done” is and who signs |
280
- | `reality.md` / `terrain.md` | The real problem; the map |
281
- | `stakeholders.md` | `[signal:green\|amber\|red]` |
282
- | `trust-profile.md` | Sacred data, AI policy, approval chain |
283
- | `decisions.md` / `risks.md` / `delivery.md` | Dated choices; live risks; what shipped and how it rolls back |
284
-
285
- Schema: [docs/schema.md](docs/schema.md). Local HTML: `npx fdeops dashboard`.
286
-
287
- ---
288
-
289
- ## Who this is for
290
-
291
- You embed with a customer and an AI coding agent. Take this on the ground. Discovery through signed outcome lives in `@fde`. One `.fde/` per client so they do not blur.
292
-
293
- If you only write code in your own repo with no client record to defend, you do not need this kit.
294
-
295
- ---
296
-
297
- ## Your data stays yours
298
-
299
- Local only - `git` + files, no network, no telemetry. Plain markdown. The model sees client code only when you point the AI coding agent at it. `<private>` is redacted from CLI, dashboard, and hooks. Nothing is written until you confirm. `~/fde-engagements` is in `$HOME`; iCloud/Dropbox is an NDA incident waiting.
300
-
301
- [PRIVACY.md](PRIVACY.md) · [SECURITY.md](SECURITY.md)
302
-
303
- ---
304
-
305
- ## Principles
306
-
307
- - **The artifact is the memory** - producing the work and recording it are one action
308
- - **Ground loop** - name the change, characterise their code, prove it on their staging, go live, log the outcome
309
- - **Skills, not autonomy** - the kit says what to check; judgment stays yours
310
- - **Brief is a hypothesis** - discover before building the wrong thing
311
- - **Evidence on every claim** - these files get defended in the room
312
- - **One customer, one folder** - context never bleeds
313
-
314
- ---
315
-
316
327
  ## Contributing
317
328
 
318
329
  **[Subash Natarajan](https://www.linkedin.com/in/subashn/)**. [Issues](https://github.com/suboss87/fdeops/issues) · [Discussions](https://github.com/suboss87/fdeops/discussions) · [CONTRIBUTING.md](CONTRIBUTING.md) · [Code of Conduct](CODE_OF_CONDUCT.md)
@@ -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)
@@ -153,8 +153,8 @@ ok(`router dispatch (${mentioned.length} reference targets verified) + memory co
153
153
  }
154
154
  if (!routed.size) fail('check.js could not parse the SKILL.md routing table')
155
155
 
156
- // docs/skills-reference.md is the canonical per-method list: one row per
157
- // method inside the six domain tables, ending at the Overlays section.
156
+ // docs/skills-reference.md is the canonical per-skill list: one row per
157
+ // skill inside the six stage tables, ending at the Overlays section.
158
158
  const reference = read('docs/skills-reference.md')
159
159
  const documented = new Set()
160
160
  let documentedRows = 0
@@ -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'))) {