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