fdeops 3.15.1 → 3.16.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 (56) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +132 -93
  3. package/adapters/AGENTS.md +2 -2
  4. package/adapters/GEMINI.md +2 -2
  5. package/adapters/LOCAL-LLM.md +3 -3
  6. package/adapters/README.md +1 -1
  7. package/adapters/copilot-instructions.md +2 -2
  8. package/adapters/cursor.fde.mdc +3 -3
  9. package/bin/check.js +66 -14
  10. package/bin/fde.js +16 -16
  11. package/bin/lib/memory.js +1 -1
  12. package/bin/lib/render.js +1 -1
  13. package/bin/lib/trust.js +1 -1
  14. package/mcp/README.md +3 -3
  15. package/mcp/fdeops-ingest/README.md +8 -8
  16. package/mcp/fdeops-ingest/package.json +1 -1
  17. package/mcp/fdeops-ingest/server.js +1 -1
  18. package/mcp/recipes/README.md +3 -3
  19. package/mcp/recipes/file.md +1 -1
  20. package/mcp/recipes/granola.md +5 -5
  21. package/mcp/recipes/notion.md +2 -2
  22. package/mcp/recipes/slack.md +5 -5
  23. package/package.json +1 -1
  24. package/plugin.json +1 -1
  25. package/skills/fde/SKILL.md +52 -39
  26. package/skills/fde/references/ai.md +9 -9
  27. package/skills/fde/references/{exec-narrative.md → board-memo.md} +1 -1
  28. package/skills/fde/references/business-case.md +5 -5
  29. package/skills/fde/references/close.md +5 -5
  30. package/skills/fde/references/{ingest-connect.md → connect.md} +7 -7
  31. package/skills/fde/references/debrief.md +2 -2
  32. package/skills/fde/references/discover.md +8 -8
  33. package/skills/fde/references/{trust-engineering.md → earn-trust.md} +2 -2
  34. package/skills/fde/references/{pattern-extract.md → encode-pattern.md} +1 -1
  35. package/skills/fde/references/eval-pack.md +6 -6
  36. package/skills/fde/references/{scope-defense.md → hold-scope.md} +4 -4
  37. package/skills/fde/references/ingest.md +16 -16
  38. package/skills/fde/references/land.md +10 -10
  39. package/skills/fde/references/{initiative-triage.md → pick-three.md} +7 -7
  40. package/skills/fde/references/plan.md +9 -9
  41. package/skills/fde/references/{sketch.md → poc.md} +4 -4
  42. package/skills/fde/references/{status.md → readout.md} +10 -10
  43. package/skills/fde/references/red-team.md +2 -2
  44. package/skills/fde/references/rescue.md +1 -1
  45. package/skills/fde/references/review.md +7 -7
  46. package/skills/fde/references/{rollback-drill.md → rollback.md} +1 -1
  47. package/skills/fde/references/{handoff-engineering.md → runbook.md} +5 -5
  48. package/skills/fde/references/{use-case-scoring.md → score-use-cases.md} +4 -4
  49. package/skills/fde/references/ship.md +16 -16
  50. package/skills/fde/references/{multi-customer-ops.md → switch-clients.md} +2 -2
  51. package/skills/fde/references/{assumption-audit.md → test-assumptions.md} +3 -3
  52. package/skills/fde/references/{incremental-build.md → thin-slices.md} +22 -13
  53. package/skills/fde/references/{options-analysis.md → three-options.md} +3 -3
  54. package/skills/fde/references/{blast-radius.md → what-breaks.md} +4 -4
  55. package/skills/fde/references/{stakeholder-radar.md → who-decides.md} +5 -5
  56. package/templates/.fde/assumptions.md +1 -1
@@ -1,23 +1,23 @@
1
1
  ---
2
2
  name: fde
3
- description: Keeps engagement memory for client work - sponsor, promise, what shipped, who accepted it. Use when the human names a client, customer or stakeholder. Use when they debrief a meeting or paste notes from one. Use when they ask what was agreed, or want dates and receipts. Use when they prep a client meeting or readout, when scope or trust shifts, or when they say @fde. Route the phase and run the local fde CLI (or npx --yes fdeops if it is not installed); never ask them to type commands. Not for ordinary code edits, unit tests, refactors or commits.
3
+ description: Keeps the engagement record for client work. Use when they name a client or stakeholder. Use when they debrief a meeting or paste notes. Use when they ask what was agreed. Use when they run a POC, slice a feature on the client's codebase, prove it on their staging, or need evals before a model acts. Use when they prep a readout, when trust shifts, or they say @fde. Route and run the local fde CLI (or npx --yes fdeops). Never ask them to type commands. Not for ordinary code edits in an unbound repo.
4
4
  ---
5
5
 
6
6
  # @fde
7
7
 
8
8
  ## Purpose
9
9
 
10
- The **engagement record** for one client. One skill; six stages (land → close). You pick the method; they never pick a skill. Confirm, then write `.fde/`. The host agent writes the TypeScript; you log what they got. The artifact is the memory.
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.
11
11
 
12
12
  ## When to use
13
13
 
14
14
  - They named a client, pasted notes, or asked what was agreed
15
15
  - The brief feels wrong, a sponsor went quiet, or Friday needs the ledger
16
- - Unbound ask the name once, then **you** run `fde resume --init`
16
+ - Unbound - ask the name once, then **you** run `fde resume --init`
17
17
 
18
18
  ## When NOT to use
19
19
 
20
- TypeScript errors, unit tests, refactors, git commits, generic debug: **host agent**. Agreed slice + code: implement in the host, then `fde log delivery`.
20
+ A one-line typo or compile error in a file that will not ship. On a bound client: stay here for POC, slice, characterisation, eval, go-live, rollback, and acceptance.
21
21
 
22
22
  ## Use these first
23
23
 
@@ -25,14 +25,26 @@ TypeScript errors, unit tests, refactors, git commits, generic debug: **host age
25
25
  |---------|-----------------|---------|-----------|
26
26
  | **The brief is wrong** | "If this works, who in their company would have to agree that it worked?" | `fde resume` then discover | `references/discover.md` |
27
27
  | **They went quiet** | "Is this a process gap, or a trust problem?" | `fde log contact "…" --signal amber\|red\|green` | `references/rescue.md` |
28
- | **When did we agree?** | Don't argue from memory. Search the record. | `fde receipts <term>` | |
29
- | **What did they get?** | A number nobody signed is claimed, not delivered. | `fde status` | `references/status.md` |
28
+ | **When did we agree?** | Don't argue from memory. Search the record. | `fde receipts <term>` | - |
29
+ | **What's the outcome?** | A number nobody signed is claimed, not delivered. | `fde status` | `references/readout.md` |
30
30
 
31
31
  After a meeting: `fde debrief --smart` → confirm → `--apply`. Walk-in: `fde prep`. Friday: `fde status`.
32
32
 
33
+ ## Ground loop
34
+
35
+ On someone else's site the work is not "write code, remember later." Every slice stays on `@fde`:
36
+
37
+ 1. **Name it** in `decisions.md` (plan) or kill it in a day (poc).
38
+ 2. **Characterise their code** before you change it (thin-slices). Their tests, their runner.
39
+ 3. **Prove it where they live.** Staging they operate, a screen the signer in `success.md` can reject.
40
+ 4. **If a model judges:** `evals.md` Verdict SHIP before the slice is done (eval-pack).
41
+ 5. **Log delivery.** Outcome is promised → measured → accepted, not a green CI.
42
+
43
+ A throwaway file can skip the loop. A client slice cannot.
44
+
33
45
  ## Human surface vs agent plumbing
34
46
 
35
- **FDE (human):** `@fde` + English, or `/brief` `/discover` `/plan` `/ship` `/got` `/close` `/debrief` `/prep` `/quiet` `/agreed` `/status`. Never a skill catalog.
47
+ **FDE (human):** `@fde` + English, or `/brief` `/discover` `/plan` `/ship` `/outcome` `/close` `/debrief` `/prep` `/trust` `/receipts` `/readout`. Never a skill catalog.
36
48
 
37
49
  **You (agent):** run the CLI. **Never tell the FDE to type** `fde …`. If unbound, you run `fde resume --init` after one question. Never ask them to run the CLI.
38
50
 
@@ -42,7 +54,7 @@ Fallbacks: `node ~/.claude/fdeops/fde.js …`, then `npx --yes fdeops …`. Skil
42
54
 
43
55
  1. `fde resume` (bounded `context.md`). `--full` only if you need the whole log.
44
56
  2. **NO ENGAGEMENT:** ask "What should we call this client?" then **you** init. Pasted notes → debrief after bind.
45
- 3. Playback 23 lines. `hygiene:` → offer `fde doctor`; **never auto-rewrite**.
57
+ 3. Playback 2-3 lines. `hygiene:` → offer `fde doctor`; **never auto-rewrite**.
46
58
  4. Route. Read **one** `references/*.md`. Confirm, then write.
47
59
 
48
60
  Writes need a bind (`FDEOPS_ENGAGEMENT` or registry). Never install fdeops on infrastructure they do not control.
@@ -54,13 +66,13 @@ Writes need a bind (`FDEOPS_ENGAGEMENT` or registry). Never install fdeops on in
54
66
  | debrief / pasted notes | `fde debrief --smart` → you rewrite prefixes → confirm → `--apply`. `--smart` is a gate, not a brain. `references/debrief.md` |
55
67
  | prep me for … | `fde prep "<label>"` |
56
68
  | when did we agree | `fde receipts <term>` |
57
- | sponsor update / what they got | `fde status` |
69
+ | sponsor update / the outcome | `fde status` |
58
70
  | they went quiet | `fde log contact "…" --signal amber\|green\|red` |
59
71
  | fieldbook page | `fde dashboard` |
60
- | clean up the fieldbook | `fde doctor` never auto-rewrite |
72
+ | clean up the fieldbook | `fde doctor` - never auto-rewrite |
61
73
  | scrub a secret | `fde redact <term>` then `--apply` after confirm |
62
74
  | pull Granola/Slack/transcript | capability check → `fde ingest stage` → confirm → apply. Never auto-apply. `references/ingest.md` |
63
- | connect an MCP | `references/ingest-connect.md` |
75
+ | connect an MCP | `references/connect.md` |
64
76
  | Obsidian / one window | `fde vault` (`--redacted` for a shared screen) |
65
77
 
66
78
  ## The memory contract
@@ -69,35 +81,35 @@ Writes need a bind (`FDEOPS_ENGAGEMENT` or registry). Never install fdeops on in
69
81
  2. **Deliverable = memory.** The work *is* the `.fde/` file. The reference names which one.
70
82
  3. **Evidence.** Every claim has a source. Traceable beats plausible.
71
83
  4. **No invented facts.** People, quotes, meetings, numbers: they said it or the repo shows it. Else `unknown - ask: <question>`.
72
- 5. **Session digest** (end of session and before a PR) thinking, not the chat. Confirm, then write. Never a transcript dump.
84
+ 5. **Session digest** (end of session and before a PR) - thinking, not the chat. Confirm, then write. Never a transcript dump.
73
85
 
74
86
  | Digest beat | Lands in |
75
87
  |-------------|----------|
76
88
  | **TL;DR** | `context.md` |
77
- | **Key decisions & why** | `decisions.md` skip if none |
89
+ | **Key decisions & why** | `decisions.md` - skip if none |
78
90
  | **Pivot / aha** | `context.md` or `decisions.md` |
79
91
  | **Scope + verification** | `delivery.md` if code/PR; else skip |
80
92
  | **Gotchas** | `context.md` |
81
- | **Next action** | existing `## Next action` **replace**; never append a second heading |
93
+ | **Next action** | existing `## Next action` - **replace**; never append a second heading |
82
94
 
83
95
  Judgment ships in the fieldbook. Raw transcripts stay on the machine. The `session-stop` hook is a thin backstop; **you** write the digest.
84
96
 
85
97
  6. **One customer, one folder.**
86
98
  7. Never drop `## Signal history` or `## Retired` when rewriting those files.
87
99
 
88
- **Don't invent.** Don't tell them to run the CLI. Don't fill `success.md` / `terrain.md` with guesses. Don't ship on "probably fine" intent vs diff, then pre-blast. Don't grill mid-flow. Don't sync transcripts into git.
100
+ **Don't invent.** Don't tell them to run the CLI. Don't fill `success.md` / `terrain.md` with guesses. Don't ship on "probably fine" - intent vs diff, then pre-blast. Don't grill mid-flow. Don't sync transcripts into git.
89
101
 
90
102
  ## Data boundary
91
103
 
92
- CLI is local (`git` + files, no network). You see their code only when they point you at it. AI policy unknown → ask before loading code. `<private>` is redacted from CLI/dashboard/hooks do not open raw private blocks with file tools.
104
+ CLI is local (`git` + files, no network). You see their code only when they point you at it. AI policy unknown → ask before loading code. `<private>` is redacted from CLI/dashboard/hooks - do not open raw private blocks with file tools.
93
105
 
94
106
  ## Voice
95
107
 
96
- Direct. Their words. No "Certainly." Playback 24 lines, then act. One question only when a missing fact changes the next move.
108
+ Direct. Their words. No "Certainly." Playback 2-4 lines, then act. One question only when a missing fact changes the next move.
97
109
 
98
110
  New embed: sprint / standard / programme changes depth, not which methods exist. Before first code: safe place to break things, plus AI-code policy. Before go-live: who needs to know, what's the rollback. Before a sponsor artifact: as-is or gut-check first.
99
111
 
100
- Muddy signal: name it ("discover or rescue leaning X"). Never a phase-picker interview. Default: land if new, audit if takeover.
112
+ Muddy signal: name it ("discover or rescue - leaning X"). Never a phase-picker interview. Default: land if new, audit if takeover.
101
113
 
102
114
  ## Routing - 6 stages
103
115
 
@@ -109,18 +121,18 @@ Read **one** reference and follow it. Do not improvise from memory.
109
121
  |----------|-------|-----------|
110
122
  | Starting fresh, new customer, first meeting, just got the brief | land | `references/land.md` |
111
123
  | Taking over, previous consultant left, joining mid-project | audit | `references/audit.md` |
112
- | Need to understand who matters, who decides, who blocks quietly | stakeholder-radar | `references/stakeholder-radar.md` |
113
- | Need to earn access, navigate AI policy, build credibility | trust-engineering | `references/trust-engineering.md` |
114
- | "Also can you…", scope expanding, timeline unchanged | scope-defense | `references/scope-defense.md` |
124
+ | Need to understand who matters, who decides, who blocks quietly | who-decides | `references/who-decides.md` |
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` |
115
127
 
116
128
  ### Discover
117
129
 
118
130
  | You hear | Skill | Reference |
119
131
  |----------|-------|-----------|
120
132
  | Don't know the real problem, brief feels wrong, shadow processes | discover | `references/discover.md` |
121
- | The brief feels too neat, assumptions untested, "we just need…" | assumption-audit | `references/assumption-audit.md` |
122
- | Multiple use cases competing, "we want to do everything" | use-case-scoring | `references/use-case-scoring.md` |
123
- | Need to validate a direction, prototype, demo to de-risk | sketch | `references/sketch.md` |
133
+ | The brief feels too neat, assumptions untested, "we just need…" | test-assumptions | `references/test-assumptions.md` |
134
+ | Multiple use cases competing, "we want to do everything" | score-use-cases | `references/score-use-cases.md` |
135
+ | Need to validate a direction, prototype, demo to de-risk, **POC**, spike, killer assumption | poc | `references/poc.md` |
124
136
 
125
137
  ### Plan
126
138
 
@@ -128,43 +140,43 @@ Read **one** reference and follow it. Do not improvise from memory.
128
140
  |----------|-------|-----------|
129
141
  | Break this down, what order, sequence the build | plan | `references/plan.md` |
130
142
  | Sponsor needs justification, need to defend budget or timeline | business-case | `references/business-case.md` |
131
- | Significant decision, multiple approaches, "what should we do?" | options-analysis | `references/options-analysis.md` |
132
- | 20 things are "urgent," need to pick the 3 that matter | initiative-triage | `references/initiative-triage.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` |
133
145
 
134
146
  ### Ship
135
147
 
136
148
  | You hear | Skill | Reference |
137
149
  |----------|-------|-----------|
138
- | Large feature, need visible progress every 23 days | incremental-build | `references/incremental-build.md` |
139
- | What could go wrong, touching shared infrastructure, need to assess impact | blast-radius | `references/blast-radius.md` |
150
+ | Large feature, need visible progress every 2-3 days, slice it, characterise their tests, POC follow-through | thin-slices | `references/thin-slices.md` |
151
+ | What could go wrong, touching shared infrastructure, need to assess impact | what-breaks | `references/what-breaks.md` |
140
152
  | Production down, urgent - OR stakeholder gone quiet, trust slipping | rescue | `references/rescue.md` |
141
153
  | Ready to deploy, going live, pre-flight check | ship | `references/ship.md` |
142
154
  | Review this change, is it safe, does it match what we agreed | review | `references/review.md` |
143
155
  | 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 |
144
- | 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 |
145
- | "We can always revert" - need to actually test the escape route | rollback-drill | `references/rollback-drill.md` |
156
+ | 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 |
157
+ | "We can always revert" - need to actually test the escape route | rollback | `references/rollback.md` |
146
158
 
147
159
  ### Prove
148
160
 
149
161
  | You hear | Skill | Reference |
150
162
  |----------|-------|-----------|
151
- | Weekly update due, "need to send the sponsor something" | status | `references/status.md` |
163
+ | Weekly update due, "need to send the sponsor something" | readout | `references/readout.md` |
152
164
  | Demo coming up, show-and-tell, exec walkthrough | demo-prep | `references/demo-prep.md` |
153
165
  | Just out of a meeting, raw notes, "they said…", "debrief" | debrief | the debrief verb (above) + `references/debrief.md` |
154
166
  | 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) |
155
- | Connect a new MCP / connect Granola Slack or Notion / what can you pull | ingest-connect | `references/ingest-connect.md` (+ `mcp/recipes/`) |
167
+ | Connect a new MCP / connect Granola Slack or Notion / what can you pull | connect | `references/connect.md` (+ `mcp/recipes/`) |
156
168
  | Prep me for a meeting / walk-in brief / "what should I know before I talk to…" | - | run `fde prep "<label>"`, present in plain language |
157
- | Sponsor's boss needs a summary, board update, justify continued investment | exec-narrative | `references/exec-narrative.md` |
169
+ | Sponsor's boss needs a summary, board update, justify continued investment | board-memo | `references/board-memo.md` |
158
170
  | Status across all my customers | dashboard | `references/dashboard.md` |
159
171
 
160
172
  ### Close
161
173
 
162
174
  | You hear | Skill | Reference |
163
175
  |----------|-------|-----------|
164
- | Juggling 2+ customers, losing track, context-switching | multi-customer-ops | `references/multi-customer-ops.md` |
176
+ | Juggling 2+ customers, losing track, context-switching | switch-clients | `references/switch-clients.md` |
165
177
  | Wrapping up, handoff, making yourself replaceable | close | `references/close.md` |
166
- | Engagement ending, team needs to operate without you | handoff-engineering | `references/handoff-engineering.md` |
167
- | Something worked well and will apply to future engagements | pattern-extract | `references/pattern-extract.md` |
178
+ | Engagement ending, team needs to operate without you | runbook | `references/runbook.md` |
179
+ | Something worked well and will apply to future engagements | encode-pattern | `references/encode-pattern.md` |
168
180
  | "Red-team this," "stress-test my plan," poke holes, what am I missing | red-team | `references/red-team.md` |
169
181
  | "What did we agree about X?", scope dispute, receipts | - | run `fde receipts <term>`, answer with dates |
170
182
 
@@ -173,7 +185,7 @@ Read **one** reference and follow it. Do not improvise from memory.
173
185
  | Signal | Overlay |
174
186
  |--------|---------|
175
187
  | AI, ML, LLM, model, embeddings, RAG, agents, fine-tuning, inference, drift | `references/ai.md` |
176
- | Golden set, eval suite, eval pack, pass/fail before AI ship, HITL gate for model | `references/eval-pack.md` (+ `ai.md`) |
188
+ | Golden set, eval suite, eval pack, pass/fail before AI ship, HITL gate for model, POC the model | `references/eval-pack.md` (+ `ai.md`) |
177
189
  | Deck, slides, report, governance framework, compliance pack, ADR, PDF | `references/artifacts.md` |
178
190
  | Patient data, PHI, HIPAA, EHR, clinical | `references/healthcare.md` |
179
191
  | Payments, cardholder data, PCI-DSS, anything that moves money | `references/fintech.md` |
@@ -184,8 +196,9 @@ Ready to build with no `terrain.md` / plan: discover or plan first. Takeover wit
184
196
  ## Principles
185
197
 
186
198
  - Never ask the FDE to pick a phase. That's your job.
187
- - Read `context.md` before speaking. One sharp question never a barrage.
188
- - Never invent people, meetings, or numbers `unknown - ask:` beats a polished lie.
199
+ - Ground loop on a bound client: name → characterise → prove where they live → log. Do not hand the slice to a generic coding pack.
200
+ - Read `context.md` before speaking. One sharp question - never a barrage.
201
+ - Never invent people, meetings, or numbers - `unknown - ask:` beats a polished lie.
189
202
  - Every phase ends with its artifact written. No artifact, no "done."
190
203
  - Evidence on every claim. The FDE will be challenged on these files.
191
204
  - Overlays activate on signal, not on request.
@@ -29,7 +29,7 @@ Never start with the most powerful model. Start with the cheapest that meets the
29
29
  4. **Does it need fine-tuning?** Only when: you have 500+ high-quality examples, the base model fails consistently on your domain, and the cost of inference at scale justifies the training cost.
30
30
 
31
31
  **Evaluation method (before choosing):**
32
- - Build a test set: 50100 representative inputs with expected outputs.
32
+ - Build a test set: 50-100 representative inputs with expected outputs.
33
33
  - Run every candidate model against the test set.
34
34
  - Score: accuracy, latency, cost per call, failure modes.
35
35
  - The cheapest model that scores above the quality threshold wins.
@@ -38,16 +38,16 @@ Write model selection rationale to `decisions.md`. Include: models tested, test
38
38
 
39
39
  ## Engagement eval pack (before AI ships)
40
40
 
41
- When any slice touches a model, embeddings, RAG, or an agent: create or update `.fde/evals.md` **before** ship. Full method: `references/eval-pack.md`. This is the engagement-local test set not unit tests.
41
+ When any slice touches a model, embeddings, RAG, or an agent: create or update `.fde/evals.md` **before** ship. Full method: `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
- 1. **Component + quality bar** one sentence each; kill switch / fallback named.
45
- 2. **Golden cases** 520 representative inputs with expected outputs and a pass rule. Prefer real production-shaped data (sanitized).
46
- 3. **Failure modes** at least the silent ones: hallucination/ungrounded, retrieval miss (if RAG), drift, cost runaway.
47
- 4. **Pass/fail** dated run; Verdict **SHIP** or **NO-SHIP**; critical fails must be 0.
48
- 5. **HITL gate** which decisions need human review before action (align with `trust-profile.md`). Empty when policy requires review → NO-SHIP.
44
+ 1. **Component + quality bar** - one sentence each; kill switch / fallback named.
45
+ 2. **Golden cases** - 5-20 representative inputs with expected outputs and a pass rule. Prefer real production-shaped data (sanitized).
46
+ 3. **Failure modes** - at least the silent ones: hallucination/ungrounded, retrieval miss (if RAG), drift, cost runaway.
47
+ 4. **Pass/fail** - dated run; Verdict **SHIP** or **NO-SHIP**; critical fails must be 0.
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; sketch/build grows goldens; ship requires Verdict SHIP and a receipt in `delivery.md` → `## Ship receipts`. Non-AI work skips this file entirely.
50
+ **When to write:** plan seeds the pack; poc/build 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
 
@@ -59,7 +59,7 @@ When the AI needs to answer questions about the client's data:
59
59
  3. **Generate** - chunks + query → LLM → answer with citations
60
60
 
61
61
  **Common failure modes:**
62
- - **Chunk size wrong.** Too small = lost context. Too large = noise drowns signal. Start at 5001000 tokens with 100-token overlap.
62
+ - **Chunk size wrong.** Too small = lost context. Too large = noise drowns signal. Start at 500-1000 tokens with 100-token overlap.
63
63
  - **No citation/grounding.** If the model can't point to where it found the answer, you can't verify it. Always require source attribution.
64
64
  - **Stale index.** Documents update, embeddings don't. Define the refresh cadence. Real-time for critical data, daily for reference docs.
65
65
  - **Retrieval miss.** The right document exists but wasn't retrieved. Test with known-answer queries where the answer IS in the corpus - if retrieval misses these, the embedding model or chunking strategy needs work.
@@ -1,4 +1,4 @@
1
- # exec-narrative - the story that gets the next phase funded
1
+ # board-memo - the story that gets the next phase funded
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,8 +1,8 @@
1
1
  # business-case - the economics that get the sponsor to say yes
2
2
 
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 sketch produced a direction that needs funding.
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
 
5
- **Read first:** `reality.md`, `success.md`, `delivery.md`, `context.md`. Load `business-case.md` from sketch if it exists - extend it, don't restart.
5
+ **Read first:** `reality.md`, `success.md`, `delivery.md`, `context.md`. Load `business-case.md` from poc if it exists - extend it, don't restart.
6
6
 
7
7
  Technical FDEs lose engagements by shipping good code without business justification. The sponsor's boss doesn't ask "is the code clean?" - they ask "what did we get for the money?" A business case translates technical work into the language that keeps the engagement alive.
8
8
 
@@ -30,7 +30,7 @@ Keep the drivers explicit. "We estimate $200K savings" means nothing. "3 people
30
30
 
31
31
  **3. Sensitivity check - name the two drivers that swing the result:**
32
32
 
33
- Every business case has 12 variables where a small change flips the outcome. Name them explicitly:
33
+ Every business case has 1-2 variables where a small change flips the outcome. Name them explicitly:
34
34
 
35
35
  > "This case holds if the team actually reclaims 6+ hours/week per person. If it's only 3 hours, the payback extends from 5 months to 14 months. The validation: measure time-spent before and after pilot with 2 team members."
36
36
 
@@ -75,9 +75,9 @@ Acme phase 2 needs funding. The case starts with the cost of doing nothing, not
75
75
 
76
76
  Anchor: two silent failures since March, each one day of finance reconciliation by hand plus a late close (`reality.md`, Marco's sheet). That is the number the sponsor already believes because her own team reported it.
77
77
 
78
- Driver model the sponsor can trace: incidents/quarter × hours of manual reconciliation × loaded cost, plus the tail risk of a late regulatory close stated separately, because mixing a certain small number with an uncertain large one is how a case loses credibility.
78
+ Driver model the sponsor can trace: incidents/quarter × hours of manual reconciliation × loaded cost, plus the tail risk of a late regulatory close - stated separately, because mixing a certain small number with an uncertain large one is how a case loses credibility.
79
79
 
80
- Sensitivity names the two drivers that swing it: incident frequency (2/quarter → 1/quarter and the case halves) and whether the manual re-run continues in parallel (if Marco keeps re-running every morning, the saving is theoretical). The second one is the honest weakness, so it is in the case rather than waiting to be found in the room with the condition that makes it hold: the morning re-run stops after two clean cycles, agreed with Marco.
80
+ Sensitivity names the two drivers that swing it: incident frequency (2/quarter → 1/quarter and the case halves) and whether the manual re-run continues in parallel (if Marco keeps re-running every morning, the saving is theoretical). The second one is the honest weakness, so it is in the case rather than waiting to be found in the room - with the condition that makes it hold: the morning re-run stops after two clean cycles, agreed with Marco.
81
81
 
82
82
  ## Principles
83
83
 
@@ -18,7 +18,7 @@ The engagement doesn't end at ship. It ends when the customer can maintain what
18
18
  - AI components: did they behave in production? What failure modes did the prototype hide? Is the team equipped to maintain them?
19
19
 
20
20
  **1b. Value + receipts close gate (refuse green close if any fail):**
21
- - Primary value bucket in `success.md` matches what the sponsor funded; at least one ledger row has **Measured** (not forever-`pending`) with evidence **and a named customer-side owner in Accepted by** for that bucket or the retrospective explicitly records “not measured; sponsor accepted pending.” A measured-but-unaccepted number closes as `claimed`; say so in the retrospective rather than closing green on arithmetic nobody signed.
21
+ - Primary value bucket in `success.md` matches what the sponsor funded; at least one ledger row has **Measured** (not forever-`pending`) with evidence **and a named customer-side owner in Accepted by** for that bucket - or the retrospective explicitly records “not measured; sponsor accepted pending.” A measured-but-unaccepted number closes as `claimed`; say so in the retrospective rather than closing green on arithmetic nobody signed.
22
22
  - Audit receipt exists for the final shipped path (exceptions/operating map walked; cite file).
23
23
  - Eval receipt: **n/a if no AI**, else final golden/eval result + HITL owner recorded; kill switch / fallback named in `handoff.md`.
24
24
  - One line in the retrospective: which bucket moved, by how much, vs baseline.
@@ -39,17 +39,17 @@ The engagement doesn't end at ship. It ends when the customer can maintain what
39
39
 
40
40
  ## Checkpoint
41
41
 
42
- Direct assessment to the FDE: did the engagement achieve `success.md` · 23 lessons that matter · is the pattern worth encoding · is the handoff complete or where are the gaps. Also: value bucket + audit receipt green; eval **n/a or green**. Pending Measured without sponsor acceptance = gap, not green close. Honest - a gap named now is cheaper than a callback in six weeks.
42
+ Direct assessment to the FDE: did the engagement achieve `success.md` · 2-3 lessons that matter · is the pattern worth encoding · is the handoff complete or where are the gaps. Also: value bucket + audit receipt green; eval **n/a or green**. Pending Measured without sponsor acceptance = gap, not green close. Honest - a gap named now is cheaper than a callback in six weeks.
43
43
 
44
44
  ## Worked example
45
45
 
46
46
  Acme, twelve weeks in, the FDE is rolling off.
47
47
 
48
- Retrospective against the receipts: `brief.md` asked for monitoring, `reality.md` proved it was ownership and the delta is the most useful paragraph in the file, because it is exactly the argument the next engagement will need.
48
+ Retrospective against the receipts: `brief.md` asked for monitoring, `reality.md` proved it was ownership - and the delta is the most useful paragraph in the file, because it is exactly the argument the next engagement will need.
49
49
 
50
- The close gate bites in a useful way. The ledger shows detection at 12 minutes measured across two real incidents, but **Accepted by** is empty Marco confirmed it in Slack, Denise (finance) never did, and Denise is whose escalation started the engagement. So it closes as `claimed` with a one-line retrospective note and a named next step, rather than a green close on a number nobody with budget agreed to.
50
+ The close gate bites in a useful way. The ledger shows detection at 12 minutes measured across two real incidents, but **Accepted by** is empty - Marco confirmed it in Slack, Denise (finance) never did, and Denise is whose escalation started the engagement. So it closes as `claimed` with a one-line retrospective note and a named next step, rather than a green close on a number nobody with budget agreed to.
51
51
 
52
- `handoff.md` is written for the person woken at 2am: the three things that break, what the page means, how to re-run manually the way Marco does, and who holds the tribal knowledge (Raj, who built the original job credited, because he protects it now). `patterns.md` gets *"unowned job" presents as "unmonitored job"* it has now happened twice.
52
+ `handoff.md` is written for the person woken at 2am: the three things that break, what the page means, how to re-run manually the way Marco does, and who holds the tribal knowledge (Raj, who built the original job - credited, because he protects it now). `patterns.md` gets *"unowned job" presents as "unmonitored job"* - it has now happened twice.
53
53
 
54
54
  ## Principles
55
55
 
@@ -1,4 +1,4 @@
1
- # ingest-connect - wire a source MCP in plain language
1
+ # connect - wire a source MCP in plain language
2
2
 
3
3
  **Enter when:** the FDE says "I want to connect a new MCP", "connect Granola / Slack / Notion", "how do I pull from …", or a pull request fails because no source tools exist.
4
4
 
@@ -15,15 +15,15 @@
15
15
 
16
16
  ## Method
17
17
 
18
- 1. **Ask one question** which source? (`file` / `granola` / `slack` / `notion` / other). If "other", ask for the MCP they intend to use. If they just want paste → send them to debrief and stop.
19
- 2. **Capability check (current session)** list MCP tools you can actually call:
18
+ 1. **Ask one question** - which source? (`file` / `granola` / `slack` / `notion` / other). If "other", ask for the MCP they intend to use. If they just want paste → send them to debrief and stop.
19
+ 2. **Capability check (current session)** - list MCP tools you can actually call:
20
20
  - Sink: `fde ingest` CLI (preferred) and/or `ingest_stage`
21
21
  - Source: anything that can **fetch** that system's content (not post)
22
22
  - Say clearly: *available now* vs *needs config*.
23
- 3. **Emit config for the source only** open `mcp/recipes/<source>.md`. Fill placeholders from *that product's* docs. Tell them to paste secrets into host env never into `.fde/`.
24
- 4. **Tell them where to paste** Cursor MCP settings / `mcp.json`. Claude Code: their MCP config. Save → reload MCP / restart session.
25
- 5. **Verify** after reload: re-run capability check. If source tools appear, offer a **test pull** staged to `.inbox/` only. Stop before apply unless they ask to propose.
26
- 6. **Handoff phrase** e.g. `@fde pull today's Acme Granola into the fieldbook`.
23
+ 3. **Emit config for the source only** - open `mcp/recipes/<source>.md`. Fill placeholders from *that product's* docs. Tell them to paste secrets into host env - never into `.fde/`.
24
+ 4. **Tell them where to paste** - Cursor MCP settings / `mcp.json`. Claude Code: their MCP config. Save → reload MCP / restart session.
25
+ 5. **Verify** - after reload: re-run capability check. If source tools appear, offer a **test pull** staged to `.inbox/` only. Stop before apply unless they ask to propose.
26
+ 6. **Handoff phrase** - e.g. `@fde pull today's Acme Granola into the fieldbook`.
27
27
 
28
28
  ## If they only want paste / files
29
29
 
@@ -12,7 +12,7 @@
12
12
 
13
13
  - The `fde` CLI is **local, deterministic, no AI**. `--smart` is a **gate + writer**, not a brain.
14
14
  - It keeps lines that already have `decision:` / `risk:` / `delivery:` / `contact:` / `next:` prefixes, plus a thin keyword pass (e.g. "we agreed", person+verb lines, "open question").
15
- - Real messy notes without prefixes often route **0 useful lines** everything else lands as a context dump. That is expected. **You are the router:** rewrite `.debrief-propose` with type prefixes, then `--apply`.
15
+ - Real messy notes without prefixes often route **0 useful lines** - everything else lands as a context dump. That is expected. **You are the router:** rewrite `.debrief-propose` with type prefixes, then `--apply`.
16
16
  - `.debrief-propose` is raw lines only (no routing annotations). "Edit if mis-routed" means **rewrite the line with the right prefix**, not leave a comment in the file.
17
17
 
18
18
  ## Method (you do this work)
@@ -22,7 +22,7 @@
22
22
  1. Save the FDE's notes to a temp `.md` file in the workspace (or pipe stdin).
23
23
  2. Run `fde debrief --smart <notes.md>` (or `npx fdeops debrief --smart …`).
24
24
  3. Open `.debrief-propose`. If lines lack type prefixes, **rewrite them** before showing the FDE, e.g.:
25
- - `decision: agreed chargebacks stay phase 2 Priya`
25
+ - `decision: agreed chargebacks stay phase 2 - Priya`
26
26
  - `risk: legal may reopen scope if we slip the SOW date`
27
27
  - `contact: Priya pushed hard on Friday deck [signal:amber]`
28
28
  - `next: send one-pager before Thursday 9am`
@@ -22,16 +22,16 @@ State your read, let the FDE correct, then discover.
22
22
 
23
23
  Use when the "problem" is unfalsifiable, success is undefined, or you cannot name the decision discovery informs. Skip when `reality.md` / `terrain.md` already pin a testable claim and the FDE is ready to dig.
24
24
 
25
- Same format as land one Q + GUESS, no checklist:
25
+ Same format as land - one Q + GUESS, no checklist:
26
26
 
27
27
  ```
28
28
  READ: <the real problem you think exists, in one sentence>
29
- CONFIDENCE: ~NN% missing: <what would falsify or confirm it>
29
+ CONFIDENCE: ~NN% - missing: <what would falsify or confirm it>
30
30
  Q: <one question that changes where you dig>
31
31
  GUESS: <your answer, so they can correct it>
32
32
  ```
33
33
 
34
- Stop when you can write the decision sentence under **Frame the decision first**. If a name, quote, or metric is still missing, write `unknown - ask:` never invent ops folklore to make the map look complete.
34
+ Stop when you can write the decision sentence under **Frame the decision first**. If a name, quote, or metric is still missing, write `unknown - ask:` - never invent ops folklore to make the map look complete.
35
35
 
36
36
  ## Frame the decision first
37
37
 
@@ -92,7 +92,7 @@ The real spec is what people **do** when the system fails - not what the slide d
92
92
  - **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.
93
93
  - **"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.
94
94
  - **Shadow AI.** Someone pasting data into ChatGPT to cope = a real unmet need + an uncontrolled data risk. Note both.
95
- - **Exception-led operating map.** For each real break (not the slide-deck process): what fails, who notices first, what they do today, and which artifact is trusted in that moment. Prefer exceptions over happy-path swimlanes the workaround is the operating system. Write rows under `terrain.md` → `## Operating map (exception-led)`. If the section is missing on an older engagement, add it; never regenerate the rest of terrain. When AI is in play, also fill `## Intelligence placement` (deterministic vs LLM judgement vs human approve). **`fde doctor` requires at least one filled exception row before plan/build/ship/close** empty map after discover is a hygiene fail, not optional polish.
95
+ - **Exception-led operating map.** For each real break (not the slide-deck process): what fails, who notices first, what they do today, and which artifact is trusted in that moment. Prefer exceptions over happy-path swimlanes - the workaround is the operating system. Write rows under `terrain.md` → `## Operating map (exception-led)`. If the section is missing on an older engagement, add it; never regenerate the rest of terrain. When AI is in play, also fill `## Intelligence placement` (deterministic vs LLM judgement vs human approve). **`fde doctor` requires at least one filled exception row before plan/build/ship/close** - empty map after discover is a hygiene fail, not optional polish.
96
96
 
97
97
  ## Method - part 3: workshop facilitation
98
98
 
@@ -137,13 +137,13 @@ A use case that depends on a "Blocker" source doesn't get scored - it gets a dat
137
137
 
138
138
  Score every candidate use case before anything gets prototyped:
139
139
 
140
- | Dimension | Question | 15 |
140
+ | Dimension | Question | 1-5 |
141
141
  |---|---|---|
142
142
  | Business value | What does it cost them unsolved? | |
143
143
  | Complexity | How hard to build safely? (5 = hardest) | |
144
144
  | Data readiness | Available, clean, sufficient volume today? | |
145
145
 
146
- **Score = (Value × Data readiness) / Complexity.** Highest score gets prototyped first (hand to `sketch`). A 5-value/1-complexity/5-readiness case scores 25; a 5-value/5-complexity/2-readiness case scores 2 - they look identical on a whiteboard. Never let a technically interesting use case override the score.
146
+ **Score = (Value × Data readiness) / Complexity.** Highest score gets prototyped first (hand to `poc`). A 5-value/1-complexity/5-readiness case scores 25; a 5-value/5-complexity/2-readiness case scores 2 - they look identical on a whiteboard. Never let a technically interesting use case override the score.
147
147
 
148
148
  ## Artifact (this IS the memory - write it as you work)
149
149
 
@@ -196,9 +196,9 @@ Stop. Don't form a fourth hypothesis. Three disproven reads means the brief is a
196
196
 
197
197
  Acme's brief blamed missing monitoring. Discovery goes to the workaround first.
198
198
 
199
- `git log` shows the reconciliation module at 47 commits/90d with no tests, all from one author who left in February. Marco (ops lead) turns out to keep a spreadsheet: every morning he re-runs the job manually and eyeballs the totals a habit nobody mentioned because to him it is just the job. That spreadsheet is the system of record when the job fails, which is the actual finding.
199
+ `git log` shows the reconciliation module at 47 commits/90d with no tests, all from one author who left in February. Marco (ops lead) turns out to keep a spreadsheet: every morning he re-runs the job manually and eyeballs the totals - a habit nobody mentioned because to him it is just the job. That spreadsheet is the system of record when the job fails, which is the actual finding.
200
200
 
201
- `reality.md`: **Confirmed:** the job has no owner, and the manual re-run masks failures for a day (evidence: Marco's sheet, Day 5; two silent failures since March, finance escalation Mar 14). **Stated brief was wrong because:** alerting existed last year and was disabled adding it again without an owner reproduces the same outcome. `terrain.md` gets the hotspot row and an operating-map row: `job fails silently → Marco notices next morning → re-runs by hand → spreadsheet is truth → LOAD-BEARING (Marco, Day 5)`.
201
+ `reality.md`: **Confirmed:** the job has no owner, and the manual re-run masks failures for a day (evidence: Marco's sheet, Day 5; two silent failures since March, finance escalation Mar 14). **Stated brief was wrong because:** alerting existed last year and was disabled - adding it again without an owner reproduces the same outcome. `terrain.md` gets the hotspot row and an operating-map row: `job fails silently → Marco notices next morning → re-runs by hand → spreadsheet is truth → LOAD-BEARING (Marco, Day 5)`.
202
202
 
203
203
  Checkpoint to the FDE names the sponsor decision this creates: fund ownership, or fund alerting and accept the same failure in six months.
204
204
 
@@ -1,4 +1,4 @@
1
- # trust-engineering - earning commit access one move at a time
1
+ # earn-trust - earning commit access one move at a time
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
 
@@ -66,7 +66,7 @@ Mistakes happen. What matters is speed and honesty:
66
66
  **`trust-profile.md`** - updated sections:
67
67
  ```markdown
68
68
  ## Trust level
69
- Current: <level 05> as of <date>
69
+ Current: <level 0-5> as of <date>
70
70
  Evidence: <what earned this level>
71
71
  Next target: <level> - requires: <specific action>
72
72
 
@@ -1,4 +1,4 @@
1
- # pattern-extract - if you did it twice, encode it
1
+ # encode-pattern - if you did it twice, encode it
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
 
@@ -1,6 +1,6 @@
1
1
  # eval-pack - prove the system before it acts
2
2
 
3
- **Enter when:** the work touches AI/LLM/agents/RAG, or ship/close is blocked because there is no evidence the non-deterministic path is safe. Activate alongside `ai.md`, `sketch`, `build`, or `ship` not instead of them.
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`, `thin-slices`, or `ship` - not instead of them.
4
4
 
5
5
  **Read first:** `trust-profile.md` (AI policy + HITL), `terrain.md` (operating map), `delivery.md`. Create or extend `evals.md`.
6
6
 
@@ -14,19 +14,19 @@ Intelligence without evidence is token-maxing with a nicer name. An FDE earns tr
14
14
 
15
15
  **1. Scope the judgement surface.** One sentence: which step uses model judgement, and what must never be autonomous.
16
16
 
17
- **2. Build a golden set (minimum 520 for a slice; prefer 50100 before broad scale).** For each case:
18
- - input (sanitized no `<private>` raw values)
17
+ **2. Build a golden set (minimum 5-20 for a slice; prefer 50-100 before broad scale).** For each case:
18
+ - input (sanitized - no `<private>` raw values)
19
19
  - expected outcome or expert-approved acceptance note
20
20
  - pass rule (exact / contains / short rubric)
21
21
  - source: real historical example / expert label / staged fixture
22
22
 
23
23
  **3. Score pass/fail, not vibes.** Run the suite. Record count pass / fail. Failures get a failure-mode tag (missing data, wrong record, format drift, hallucination, retrieval miss, unsafe action, other).
24
24
 
25
- **4. Human-in-the-loop gate.** Name which outcomes require human approve before side effects. If none, write why that is allowed under `trust-profile.md` AI policy do not invent permission.
25
+ **4. Human-in-the-loop gate.** Name which outcomes require human approve before side effects. If none, write why that is allowed under `trust-profile.md` AI policy - do not invent permission.
26
26
 
27
27
  **5. Ship rule.** Until `evals.md` shows Verdict **SHIP** with a dated run (critical fails = 0) and HITL filled when policy requires it, AI-touching ship stays **fix-first**. Log a one-line eval receipt in `delivery.md` → `## Ship receipts`.
28
28
 
29
- ## Artifact `evals.md`
29
+ ## Artifact - `evals.md`
30
30
 
31
31
  Create on first AI-touching slice (not at `resume --init`). Use the stub in `templates/.fde/evals.md`. Every claim needs a source. Missing evidence → leave the cell `unknown - ask:`, never invent scores.
32
32
 
@@ -38,6 +38,6 @@ Present to the FDE: suite size, pass rate, top failure mode, HITL gate, Verdict
38
38
 
39
39
  - No golden set, no AI ship.
40
40
  - Pass/fail beats “looks good.”
41
- - Failure modes are the product the happy path is table stakes.
41
+ - Failure modes are the product - the happy path is table stakes.
42
42
  - HITL is a gate, not a slide.
43
43
  - Non-AI work does not need this file.
@@ -1,4 +1,4 @@
1
- # scope-defense - holding the line without losing the relationship
1
+ # hold-scope - holding the line without losing the relationship
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
 
@@ -38,7 +38,7 @@ Log via `fde log decision "scope change: <summary> - requested by <who>, impact:
38
38
 
39
39
  **The key phrase: "Let me place it."** Not "that's out of scope" (adversarial) or "sure" (absorbed). "Let me place it" signals you're taking it seriously while buying time to assess the real cost.
40
40
 
41
- **4. The accumulation conversation.** When the scope receipts show a pattern - typically 35 absorbed changes - the FDE needs a conversation with the sponsor:
41
+ **4. The accumulation conversation.** When the scope receipts show a pattern - typically 3-5 absorbed changes - the FDE needs a conversation with the sponsor:
42
42
 
43
43
  Frame it as **protection, not complaint:**
44
44
  > "We've absorbed five changes since the original agreement. Each one made sense individually. Together, they've added roughly two weeks. I want to make sure the timeline expectation still matches - should we adjust the delivery date, or reprioritise to keep the original date?"
@@ -67,9 +67,9 @@ Acme, week 5. Nothing has been formally added, and the slice is a week late.
67
67
 
68
68
  The pattern shows in three receipts, not one argument: a "quick" finance CSV export (Jun 20, half a day, from Denise directly), retry-logic cleanup asked for mid-build (Jun 24, one day, Tom), and a dashboard tile "while you're in there" (Jun 27, half a day). Each was individually reasonable; together they are the slip.
69
69
 
70
- Three-bucket response, applied at the moment of the third ask rather than in a retrospective: the CSV export goes to Next with an accepted trade (it displaces the runbook polish), the retry cleanup goes to the kill list in `decisions.md` with the blast-radius reason, and the tile is absorbed because it is genuinely twenty minutes logged anyway, since an unlogged absorption is the one that gets forgotten in the accumulation conversation.
70
+ Three-bucket response, applied at the moment of the third ask rather than in a retrospective: the CSV export goes to Next with an accepted trade (it displaces the runbook polish), the retry cleanup goes to the kill list in `decisions.md` with the what-breaks reason, and the tile is absorbed because it is genuinely twenty minutes - logged anyway, since an unlogged absorption is the one that gets forgotten in the accumulation conversation.
71
71
 
72
- That conversation happens with Priya at three receipts, with the dates on screen: "these are the four asks, here is the two days, here is what moved." Not a complaint a decision she gets to make, with evidence, before the deadline makes it for her.
72
+ That conversation happens with Priya at three receipts, with the dates on screen: "these are the four asks, here is the two days, here is what moved." Not a complaint - a decision she gets to make, with evidence, before the deadline makes it for her.
73
73
 
74
74
  ## Principles
75
75