fdeops 3.17.0 → 3.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +160 -149
  3. package/adapters/AGENTS.md +1 -1
  4. package/adapters/GEMINI.md +1 -1
  5. package/adapters/LOCAL-LLM.md +5 -5
  6. package/adapters/README.md +1 -1
  7. package/adapters/copilot-instructions.md +1 -1
  8. package/adapters/cursor.fde.mdc +1 -1
  9. package/bin/check.js +29 -10
  10. package/bin/fde.js +7 -7
  11. package/bin/lib/trust.js +4 -2
  12. package/mcp/fdeops-ingest/package.json +1 -1
  13. package/package.json +2 -2
  14. package/plugin.json +2 -2
  15. package/skills/fde/SKILL.md +34 -32
  16. package/skills/fde/references/ai.md +2 -2
  17. package/skills/fde/references/audit.md +2 -2
  18. package/skills/fde/references/board-memo.md +1 -1
  19. package/skills/fde/references/business-case.md +1 -1
  20. package/skills/fde/references/close.md +1 -1
  21. package/skills/fde/references/connect.md +1 -1
  22. package/skills/fde/references/dashboard.md +2 -2
  23. package/skills/fde/references/debrief.md +1 -1
  24. package/skills/fde/references/demo-prep.md +1 -1
  25. package/skills/fde/references/discover.md +23 -9
  26. package/skills/fde/references/earn-trust.md +1 -1
  27. package/skills/fde/references/encode-pattern.md +4 -3
  28. package/skills/fde/references/eval-pack.md +4 -4
  29. package/skills/fde/references/hold-scope.md +1 -1
  30. package/skills/fde/references/ingest.md +1 -1
  31. package/skills/fde/references/land.md +5 -5
  32. package/skills/fde/references/pick-three.md +1 -1
  33. package/skills/fde/references/plan.md +1 -1
  34. package/skills/fde/references/poc.md +8 -3
  35. package/skills/fde/references/readout.md +5 -4
  36. package/skills/fde/references/red-team.md +1 -1
  37. package/skills/fde/references/rescue.md +3 -2
  38. package/skills/fde/references/review.md +3 -3
  39. package/skills/fde/references/rollback.md +1 -1
  40. package/skills/fde/references/runbook.md +5 -3
  41. package/skills/fde/references/score-use-cases.md +1 -1
  42. package/skills/fde/references/ship.md +11 -3
  43. package/skills/fde/references/switch-clients.md +1 -1
  44. package/skills/fde/references/test-assumptions.md +19 -8
  45. package/skills/fde/references/three-options.md +18 -11
  46. package/skills/fde/references/what-breaks.md +1 -1
  47. package/skills/fde/references/who-decides.md +1 -1
  48. package/templates/.fde/README.md +1 -1
  49. package/templates/.fde/assumptions.md +3 -2
  50. package/templates/.fde/terrain.md +1 -1
package/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', 'prove', 'close']
744
- const PHASE_ALIASES = { build: 'ship' } // legacy SDLC name; public map is ship
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', prove: 'Prove', close: 'Close',
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|prove|close> - advances portfolio phase
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/build')
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|prove|close)$/.test(s.phase) && !hasOperatingMapContent(eng)) {
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|prove|close)
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
- return one[1] === 'build' ? 'ship' : one[1]
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) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fdeops-ingest-mcp",
3
- "version": "3.17.0",
3
+ "version": "3.21.0",
4
4
  "private": true,
5
5
  "description": "Thin stdio MCP sink for FDEOps ingest (stage → propose → apply). Zero runtime dependencies.",
6
6
  "bin": {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "fdeops",
3
- "version": "3.17.0",
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.",
3
+ "version": "3.21.0",
4
+ "description": "Forward deployed engineering skills for AI coding agents. One @fde skill for the client work around the code: who can say yes, what went live, whether they signed off. Dated markdown on your laptop. You confirm each write.",
5
5
  "bin": {
6
6
  "fdeops": "bin/install.js",
7
7
  "fde": "bin/fde.js"
package/plugin.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "fdeops",
4
- "version": "3.17.0",
5
- "description": "Forward deployed engineering skills for AI coding agents: per-client memory in local .fde/ files, one @fde skill. Local-only, no network.",
4
+ "version": "3.21.0",
5
+ "description": "Forward deployed engineering skills for AI coding agents. One @fde skill for the client work around the code. You confirm; then it lands in .fde/ on your laptop.",
6
6
  "author": {
7
7
  "name": "Subash Natarajan",
8
8
  "url": "https://github.com/suboss87"
@@ -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 method needs them.
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 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.
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
- | Starting fresh, new customer, first meeting, just got the brief | land | `references/land.md` |
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
- | Don't know the real problem, brief feels wrong, shadow processes | discover | `references/discover.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` |
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, parts of the problem, decompose | discover | `references/discover.md` |
133
+ | The brief feels too neat, assumptions untested, "we just need…", test assumptions, inherited convention, why do we always | 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
- | Break this down, what order, sequence the build | plan | `references/plan.md` |
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, not the playbook, from the surviving facts | 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
- | Start building, update their checkout, first module, visible progress, their tests, POC follow-through, ready to deploy, going live, pre-flight | ship | `references/ship.md` |
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
- ### Prove
158
+ ### Outcome
159
159
 
160
160
  | You hear | Skill | Reference |
161
161
  |----------|-------|-----------|
162
- | Weekly update due, "need to send the sponsor something" | readout | `references/readout.md` |
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
- | Wrapping up, handoff, making yourself replaceable | close | `references/close.md` |
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 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 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/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/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 - taking over mid-engagement
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` method part 1: churn, test gaps, "temporary" grep, AI components). On a takeover, add:
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 - the story that gets the next phase funded
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 - the economics that get the sponsor to say yes
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
- # close - handoff and pattern extraction
1
+ # close - Transfer operations
2
2
 
3
3
  **Enter when:** the engagement is ending - the customer team must run this without the FDE.
4
4
 
@@ -1,4 +1,4 @@
1
- # connect - wire a source MCP in plain language
1
+ # connect - Connect a source
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
 
@@ -1,4 +1,4 @@
1
- # dashboard - the portfolio view
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 method below.
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
- # debrief - capture the meeting before it evaporates
1
+ # debrief - Capture the meeting
2
2
 
3
3
  **Enter when:** the FDE just left a meeting/call and dumps raw notes, a transcript, or "they said…". Highest-frequency moment in FDE life. Capture within the hour.
4
4
 
@@ -1,4 +1,4 @@
1
- # demo-prep - the demo is the heartbeat of the engagement
1
+ # demo-prep - Prepare the demo
2
2
 
3
3
  **Enter when:** a demo, show-and-tell, or exec walkthrough is coming. FDE engagements live demo-to-demo; a flat demo costs more than a slipped task.
4
4
 
@@ -1,4 +1,4 @@
1
- # discover - find the real problem, map the terrain
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
 
@@ -54,6 +54,16 @@ Tests on **Question** - rewrite until all five hold:
54
54
 
55
55
  Cannot write the Question → keep interrogating. Do not `fde scan`. Every later output of this phase aims at that Question. Sub-questions go to the operating map or `assumptions.md`, not into the Question.
56
56
 
57
+ ## Parts of the problem (decompose only)
58
+
59
+ After the Question is locked, and **before** `fde scan` or any option: write what the problem is made of. No advice, no playbook, no solution.
60
+
61
+ If the stated brief hides a deeper job, name that deeper job in one sentence and **wait**. Do not silently replace their problem with yours.
62
+
63
+ In `terrain.md` under `## Parts`, list the smallest useful pieces that still change what you examine next. Typical cuts: people, process step, system, data, time, cost. For each piece: what it contains, and how it connects to the Question. Stop when a further split would not change where you dig.
64
+
65
+ Do not mark pieces as facts or assumptions here. That is `test-assumptions`. Do not assemble options here. That is `three-options`.
66
+
57
67
  ## Method - part 1: the codebase (you do this work)
58
68
 
59
69
  **First move: `fde scan`** - it runs everything below deterministically in seconds (churn×tests, "temporary" archaeology, AI components, secrets redacted, previous attempts). Your job is then **interpretation**: read its output against the brief, follow the hotspots into the code, and connect the technical findings to the human signals in part 2.
@@ -105,7 +115,7 @@ The real spec is what people **do** when the system fails - not what the slide d
105
115
  - **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
116
  - **"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
117
  - **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/build/ship/close** - empty map after discover is a hygiene fail, not optional polish.
118
+ - **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
119
 
110
120
  ## Method - part 3: workshop facilitation
111
121
 
@@ -127,9 +137,11 @@ When discovery requires a structured session with multiple stakeholders (alignme
127
137
 
128
138
  **After the room:** Summary in `decisions.md` within 2 hours. Decisions decay - what felt clear at 3pm is debatable by 5pm if unwritten.
129
139
 
130
- ## Method - part 4: data estate assessment
140
+ ## Method - part 4: data estate and the pipe
141
+
142
+ Always map the estate before you score a use case - not only when someone said "AI." A path they cannot feed is a discover miss, not a ship surprise.
131
143
 
132
- When the engagement involves AI, analytics, or data-heavy automation, assess the data estate before scoring use cases:
144
+ **Their words first.** In `terrain.md`, write the names the floor uses for the workaround, the sheet, the exception path, and the person who left. Later plan/ship/review sentences use those names. Do not translate their floor into generic product language.
133
145
 
134
146
  **The 5 questions (ask the data owner, not the sponsor):**
135
147
  1. **Where does data live?** - List every source: databases, warehouses, SaaS exports, spreadsheets, S3 buckets, vendor APIs. Map it.
@@ -138,13 +150,15 @@ When the engagement involves AI, analytics, or data-heavy automation, assess the
138
150
  4. **What's the quality?** - Sample 100 rows from each critical source. Check: nulls, duplicates, format consistency, semantic correctness. A 60% null rate in a key field = that source is fiction.
139
151
  5. **What are the governance constraints?** - PII classification, retention policies, cross-border rules, consent basis. One missed constraint = a compliance stop later.
140
152
 
153
+ **The pipe (what talks to what).** For each source that a use case depends on, write: the system it flows from and to, the contract (object, table, file, API), whose credentials, what happens when the vendor 500s or the Monday file does not land, and whether the join the sponsor described actually exists. Their IdP, CRM, and warehouse are delivery work when the path needs them - policy questions in `trust-profile.md` are not a substitute.
154
+
141
155
  **The data readiness matrix:**
142
156
 
143
- | Source | Location | Freshness | Owner | Quality (sample) | Governance | Verdict |
144
- |--------|----------|-----------|-------|-----------------|------------|---------|
145
- | _fill per source_ | | | | | | Ready / Needs work / Blocker |
157
+ | Source | Location | Freshness | Owner | Quality (sample) | Governance | Pipe | Verdict |
158
+ |--------|----------|-----------|-------|-----------------|------------|------|---------|
159
+ | _fill per source_ | | | | | | | Ready / Needs work / Blocker |
146
160
 
147
- A use case that depends on a "Blocker" source doesn't get scored - it gets a data remediation conversation first. Write this to `terrain.md` under a `## Data estate` section.
161
+ A use case that depends on a "Blocker" source **or a Blocker pipe** doesn't get scored - it gets a remediation conversation first. `what-breaks` finding an invisible integration at ship is already too late. Write this to `terrain.md` under a `## Data estate` section.
148
162
 
149
163
  ## When scope is a transformation, not a single problem
150
164
 
@@ -171,7 +185,7 @@ Score every candidate use case before anything gets prototyped:
171
185
  **Complication:** <what forces a decision now>
172
186
  **Question:** <one decision-shaped sentence>
173
187
  **Answer-space:** confirm brief / descope / rescope / pause - and what a yes looks like
174
- **Implication for build:** <first small PR>
188
+ **Implication for build:** <first change they can see>
175
189
  **Validated with:** <who, when>
176
190
  ```
177
191
 
@@ -1,4 +1,4 @@
1
- # earn-trust - earning commit access one move at a time
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 - if you did it twice, encode it
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
 
@@ -47,8 +47,9 @@ The difference between a 5-year FDE and a 15-year FDE is not talent - it's encod
47
47
  | **Specific enough?** | Contains concrete steps, not just principles | "Build trust" / "Communicate well" - too vague to act on |
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
+ | **Monday bag?** | You would refuse the next similar embed without this in your bag - a named move plus an artifact you can drop on day one (pipe questions, CAB dance, eval golden shape, floor-drill script) | "We learned to communicate." Patterns that only live in this client's `.fde/` do not compound |
50
51
 
51
- **4. Classify by stage.** Patterns sort into the same stages as the methods:
52
+ **4. Classify by stage.** Patterns sort into the same stages as the skills:
52
53
 
53
54
  | Stage | Pattern type | Example |
54
55
  |--------|-------------|---------|
@@ -56,7 +57,7 @@ The difference between a 5-year FDE and a 15-year FDE is not talent - it's encod
56
57
  | **Discover** | Investigative / analytical | "The cron-job discovery checklist for legacy systems" |
57
58
  | **Plan** | Structural / strategic | "The three-option presentation for nervous sponsors" |
58
59
  | **Ship** | Technical / safety | "The Strangler Fig on financial transaction code" |
59
- | **Prove** | Operational / process | "The regulated-environment change-approval timeline buffer" |
60
+ | **Outcome** | Operational / process | "The regulated-environment change-approval timeline buffer" |
60
61
  | **Close** | Knowledge / handoff | "The 2am document format that actually gets used" |
61
62
 
62
63
  **5. Version and evolve.** Patterns are living documents:
@@ -1,4 +1,4 @@
1
- # eval-pack - prove the system before it acts
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
 
@@ -22,9 +22,9 @@ Intelligence without evidence is token-maxing with a nicer name. An FDE earns tr
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. Judgement that has a side effect (write, send, transfer, ticket, deploy, pay, page) is **NO-SHIP** without a named human on their side in the loop. Do not write "none - allowed under policy" to bless lights-out write-access. Staging may run a supervised loop with a kill switch, a cost cap, and a golden set from **their** failures. Production stays gated until they have a written policy, a named owner, and dated eval receipts on real traffic.
26
26
 
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`.
27
+ **5. Ship rule.** Until `evals.md` shows Verdict **SHIP** with a dated run (critical fails = 0) and HITL filled, AI-touching ship stays **fix-first**. Eval fails do not sit in a backlog - they reopen plan (descope, move the judgement, or kill the path). Log a one-line eval receipt in `delivery.md` → `## Ship receipts`. No "probably fine."
28
28
 
29
29
  ## Artifact - `evals.md`
30
30
 
@@ -39,5 +39,5 @@ Present to the FDE: suite size, pass rate, top failure mode, HITL gate, Verdict
39
39
  - No golden set, no AI ship.
40
40
  - Pass/fail beats “looks good.”
41
41
  - Failure modes are the product - the happy path is table stakes.
42
- - HITL is a gate, not a slide.
42
+ - HITL is a gate, not a slide. Side effects without a named human on their side are NO-SHIP.
43
43
  - Non-AI work does not need this file.
@@ -1,4 +1,4 @@
1
- # hold-scope - holding the line without losing the relationship
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 - pull large artifacts into the fieldbook loop
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
- # land - first 48 hours
1
+ # land - Interrogate the brief
2
2
 
3
3
  **Enter when:** new customer, first meeting, just got the brief, nothing started yet.
4
4
 
@@ -99,12 +99,12 @@ If `stakeholders.md` already has a `## Signal history` section (it does from the
99
99
 
100
100
  **`trust-profile.md`** - sacred data (`<private>` tagged), fears heard, AI policy, approval chain. Sensitive: skip for status reads; use CLI/redacted surfaces; never paste raw `<private>` into prompts or subagents.
101
101
 
102
- **`assumptions.md`** - seed every unverified claim from the brief (and the day-1 hypothesis) as rows with blast radius CRITICAL / LOAD-BEARING / CONVENIENCE and status `OPEN`. Do not wait for test-assumptions - land makes the register exist. Example:
102
+ **`assumptions.md`** - seed every unverified claim from the brief (and the day-1 hypothesis) as rows with Kind `UNKNOWN` (or `CONVENTION` if they said "we always"), blast radius CRITICAL / LOAD-BEARING / CONVENIENCE, and status `OPEN`. Do not wait for test-assumptions - land makes the register exist. Example:
103
103
 
104
104
  ```markdown
105
- | # | Assumption | Blast radius | How we test | Status | Evidence |
106
- |---|------------|--------------|-------------|--------|----------|
107
- | 1 | <claim from brief> | CRITICAL | <cheapest falsifying test> | OPEN | (stated, unverified) |
105
+ | # | Assumption | Kind | Blast radius | How we test | Status | Evidence |
106
+ |---|------------|------|--------------|-------------|--------|----------|
107
+ | 1 | <claim from brief> | UNKNOWN | CRITICAL | <cheapest falsifying test> | OPEN | (stated, unverified) |
108
108
  ```
109
109
 
110
110
  One falsifiable hypothesis about the real problem also goes at the bottom of `brief.md` - discover / test-assumptions will test it.
@@ -1,4 +1,4 @@
1
- # pick-three - when 20 things are "urgent," pick the 3 that matter
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,4 +1,4 @@
1
- # plan - sequence the work
1
+ # plan - Sequence the work
2
2
 
3
3
  **Enter when:** scope is understood and the work needs breaking down - a slice, a phase, or the whole delivery.
4
4
 
@@ -1,12 +1,16 @@
1
- # poc - kill or confirm a direction in a day
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
 
9
- **0. Name the killer assumption.** With the FDE: "What's the belief that kills the project if it's wrong?" Prototype **that** - not the pretty demo.
11
+ **0. Name the killer assumption.** With the FDE: "What's the belief that kills the project if it's wrong?" Prototype **that** - not the pretty demo. If `three-options` just ran: the cheapest test is for the recommended option first, unless they pick another.
12
+
13
+ **0b. Pass / fail before you build.** For the test you will run, write three lines in `prototype-log.md` first: what you will actually do (who you talk to, what you show, on whose screen); the result that **kills** this option; the result that keeps it alive. What you would learn either way. If every option's test would fail, name which `assumptions.md` block to reopen - do not invent a fourth playbook.
10
14
 
11
15
  **1. Pick by score when several use cases compete.** Use the scoring model from `discover.md` - (Value × Data readiness) / Complexity. If discover already scored, reuse; never re-score independently.
12
16
 
@@ -35,6 +39,7 @@ Tell the FDE: did the riskiest assumption hold · what the customer's reaction a
35
39
  ## Principles
36
40
 
37
41
  - Speed of learning beats code quality. Never more than a day.
42
+ - Write pass/fail before you build. A demo with no kill line is a show.
38
43
  - Show it rough. Polish misleads.
39
44
  - Prototype the killer assumption, not the demo.
40
45
  - Kill fast; log the learning.
@@ -1,4 +1,4 @@
1
- # readout - the sponsor update that keeps the engagement alive
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
 
@@ -12,15 +12,16 @@
12
12
 
13
13
  | Block | What to write | Source |
14
14
  |-------|---------------|--------|
15
- | **S - Situation** | Where we are against `success.md`, in their words | success.md, delivery value ledger |
15
+ | **S - Situation** | Where we are against `success.md`, in their words - including whether the floor still uses the old path | success.md, delivery value ledger, reality.md workaround |
16
16
  | **C - Complication** | What changed, what is at risk, or what we learned (bad news first) | risks.md, assumptions DISPROVED/OPEN, stakeholders signal |
17
17
  | **Q - Question / Ask** | The one decision or help you need from them | decisions.md, access/sign-off needs |
18
18
  | **A - Answer** | What you recommend / what happens next week (≤3 bullets) | plan Now lane, delivery promised→measured |
19
19
 
20
20
  Then add, still on the same page:
21
21
  1. **Value this week** - from the value ledger: promised → measured (or "pending") → **accepted by whom**, with evidence citation. A measured number nobody on the customer side has agreed to is written as `claimed`, and the Ask never rests on it - if the whole case for the next phase is a claimed number, the real ask this week is "who signs off that this is real?".
22
- 2. **Kill / defer reminder** - one line from the plan kill list so scope fights stay visible.
23
- 3. **Hostile Q prep** - three questions a skeptical sponsor will ask, with one-line answers from memory.
22
+ 2. **Are they using it?** - Situation must say whether the workaround is still open: spreadsheet still running, shadow paste still happening, named operator completed Tuesday's job on the new path without you at the keyboard. A measured metric with the old path still live is `claimed`. That week's Ask is not "fund phase 2." It is "who on their side stops the old way, by when."
23
+ 3. **Kill / defer reminder** - one line from the plan kill list so scope fights stay visible.
24
+ 4. **Hostile Q prep** - three questions a skeptical sponsor will ask, with one-line answers from memory.
24
25
 
25
26
  Exec voice: no jargon, no hedging, every claim traceable (`(shipped Tue, delivery.md)`). Draft in the **FDE's voice, for the FDE to send** - never send anything yourself.
26
27
 
@@ -1,4 +1,4 @@
1
- # red-team - adversarial stress-test of your plan, position, or deliverable
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