fdeops 3.15.2 → 3.17.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 (46) hide show
  1. package/README.md +61 -69
  2. package/adapters/AGENTS.md +1 -1
  3. package/adapters/GEMINI.md +1 -1
  4. package/adapters/LOCAL-LLM.md +4 -4
  5. package/adapters/README.md +1 -1
  6. package/adapters/copilot-instructions.md +1 -1
  7. package/adapters/cursor.fde.mdc +1 -1
  8. package/bin/check.js +27 -15
  9. package/bin/fde.js +150 -13
  10. package/bin/lib/render.js +2 -2
  11. package/bin/lib/trust.js +38 -3
  12. package/mcp/README.md +1 -1
  13. package/mcp/fdeops-ingest/package.json +1 -1
  14. package/mcp/recipes/README.md +1 -1
  15. package/package.json +1 -1
  16. package/plugin.json +1 -1
  17. package/skills/fde/SKILL.md +30 -31
  18. package/skills/fde/references/ai.md +1 -1
  19. package/skills/fde/references/{exec-narrative.md → board-memo.md} +1 -1
  20. package/skills/fde/references/business-case.md +2 -2
  21. package/skills/fde/references/{ingest-connect.md → connect.md} +1 -1
  22. package/skills/fde/references/discover.md +33 -14
  23. package/skills/fde/references/{trust-engineering.md → earn-trust.md} +1 -1
  24. package/skills/fde/references/{pattern-extract.md → encode-pattern.md} +1 -1
  25. package/skills/fde/references/eval-pack.md +1 -1
  26. package/skills/fde/references/{scope-defense.md → hold-scope.md} +2 -2
  27. package/skills/fde/references/ingest.md +3 -3
  28. package/skills/fde/references/land.md +2 -2
  29. package/skills/fde/references/{initiative-triage.md → pick-three.md} +1 -1
  30. package/skills/fde/references/plan.md +10 -7
  31. package/skills/fde/references/{sketch.md → poc.md} +1 -1
  32. package/skills/fde/references/{status.md → readout.md} +2 -2
  33. package/skills/fde/references/rescue.md +1 -1
  34. package/skills/fde/references/review.md +1 -1
  35. package/skills/fde/references/{rollback-drill.md → rollback.md} +1 -1
  36. package/skills/fde/references/{handoff-engineering.md → runbook.md} +3 -3
  37. package/skills/fde/references/{use-case-scoring.md → score-use-cases.md} +3 -3
  38. package/skills/fde/references/ship.md +121 -18
  39. package/skills/fde/references/{multi-customer-ops.md → switch-clients.md} +1 -1
  40. package/skills/fde/references/{assumption-audit.md → test-assumptions.md} +2 -2
  41. package/skills/fde/references/{options-analysis.md → three-options.md} +1 -1
  42. package/skills/fde/references/{blast-radius.md → what-breaks.md} +3 -3
  43. package/skills/fde/references/{stakeholder-radar.md → who-decides.md} +1 -1
  44. package/templates/.fde/assumptions.md +2 -2
  45. package/templates/.fde/reality.md +6 -1
  46. package/skills/fde/references/incremental-build.md +0 -100
@@ -31,15 +31,28 @@ 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 four lines 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
 
38
- Before any scanning, write one sentence at the top of your working notes:
38
+ Same SCQA spine as readout (`S → C → Q → A`), aimed at the floor, not a deck. Write it **before** any scan. Confirm with the FDE, then dig.
39
39
 
40
- > "What will the sponsor do differently because of this discovery?"
40
+ | Line | What it is | Fail if |
41
+ |------|------------|---------|
42
+ | **Situation** | What they already treat as true - the workaround, the sheet, the owner who left | It could be copied from the RFP |
43
+ | **Complication** | What broke, so they cannot stay here | No tension, or three problems joined by "and" |
44
+ | **Question** | One decision the named signer must make | It smuggles the solution ("how do we add alerting") |
45
+ | **Answer-space** | Shape of a satisfying answer: confirm brief / descope / rescope / pause | A novel, or "insights" |
41
46
 
42
- If you can't name the decision this informs (descope? rescope? pick use case A over B? touch module X first?), you're collecting trivia, not discovering. Every output of this phase is aimed at that decision.
47
+ Tests on **Question** - rewrite until all five hold:
48
+
49
+ 1. **Decision-shaped** - answering it changes what someone does.
50
+ 2. **Single** - one thing, not three.
51
+ 3. **Scoped** - who, where, by when.
52
+ 4. **Answerable** - evidence could settle it in this engagement.
53
+ 5. **Neutral** - does not assume the fix.
54
+
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.
43
56
 
44
57
  ## Method - part 1: the codebase (you do this work)
45
58
 
@@ -143,17 +156,22 @@ Score every candidate use case before anything gets prototyped:
143
156
  | Complexity | How hard to build safely? (5 = hardest) | |
144
157
  | Data readiness | Available, clean, sufficient volume today? | |
145
158
 
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.
159
+ **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
160
 
148
161
  ## Artifact (this IS the memory - write it as you work)
149
162
 
150
- **`reality.md`** - the readout the FDE takes into the sponsor meeting:
163
+ **`reality.md`** - the readout the FDE takes into the sponsor meeting. Keep the three schema lines the dashboard reads (`Working theory` / `Evidence` / `Differs from brief how`). Then the decision frame:
164
+
151
165
  ```markdown
152
166
  # Reality (actual problem)
153
- **Decision this informs:** <one line>
154
- **Confirmed:** <real problem> (evidence: <workaround/data/quote, source, day>)
155
- **Stated brief was wrong/right because:** <delta, with evidence>
156
- **Implication for build:** <thin-slice direction>
167
+ **Working theory:** <the real problem, one sentence>
168
+ **Evidence:** <workaround/data/quote, source, day>
169
+ **Differs from brief how:** <delta, with evidence>
170
+ **Situation:** <what the floor already treats as true>
171
+ **Complication:** <what forces a decision now>
172
+ **Question:** <one decision-shaped sentence>
173
+ **Answer-space:** confirm brief / descope / rescope / pause - and what a yes looks like
174
+ **Implication for build:** <first small PR>
157
175
  **Validated with:** <who, when>
158
176
  ```
159
177
 
@@ -180,11 +198,11 @@ Every line carries its evidence. `(churn: 47/90d)` `(ops lead, Day 5)` `(stated,
180
198
  ## Checkpoint (before any build)
181
199
 
182
200
  Present to the FDE, five things, one paragraph each - no padding:
183
- 1. The real problem, with the two strongest pieces of evidence.
201
+ 1. The Question, then the real problem, with the two strongest pieces of evidence.
184
202
  2. The top 3 risk areas of the codebase, one line of why each.
185
203
  3. What must not be touched without characterisation tests.
186
204
  4. The exception-led operating map: the two breaks that matter most, who owns the workaround, and where shadow systems live.
187
- 5. The recommendation: confirm brief / descope / rescope - and the decision it puts in front of the sponsor.
205
+ 5. The Answer-space: confirm brief / descope / rescope - and the decision it puts in front of the sponsor.
188
206
 
189
207
  If discovery revealed the problem is 3× the brief: the FDE tells the customer **before** telling themselves it's manageable. Lead with evidence, offer three paths (descope / rescope / pause-and-plan), confirm any reset in writing - update `success.md` and `brief.md` before continuing.
190
208
 
@@ -198,13 +216,14 @@ Acme's brief blamed missing monitoring. Discovery goes to the workaround first.
198
216
 
199
217
  `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
218
 
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)`.
219
+ `reality.md` keeps the schema, then the frame. **Working theory:** 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. **Differs from brief how:** alerting existed last year and was disabled - adding it again without an owner reproduces the same outcome. **Situation:** Marco re-runs the job every morning and the spreadsheet is truth when it fails. **Complication:** two silent failures since March already hit finance, and the author of the module left in February. **Question:** should Priya fund a named owner on the failure path, or fund alerting and accept the same miss in six months? **Answer-space:** fund ownership / fund alerting-as-theatre / pause until she names who acks. `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
220
 
203
- Checkpoint to the FDE names the sponsor decision this creates: fund ownership, or fund alerting and accept the same failure in six months.
221
+ Checkpoint to the FDE leads with that Question, not a tour of the repo.
204
222
 
205
223
  ## Principles
206
224
 
207
225
  - The brief is a hypothesis until evidence confirms it.
226
+ - No scan until the Question is one decision the signer must make.
208
227
  - The workaround is more honest than the requirements document.
209
228
  - Churn data + the human's "don't touch that" pointing at the same module = the map is true.
210
229
  - Never modify code before the terrain map exists.
@@ -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
 
@@ -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 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`, `sketch`, `incremental-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`, 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
 
@@ -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
 
@@ -67,7 +67,7 @@ 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
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
 
@@ -2,7 +2,7 @@
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
 
5
- **Connect / capability (different entry):** "connect a new MCP", "connect Granola/Slack/Notion", "what can you pull?" → `references/ingest-connect.md` first. Recipes: `mcp/recipes/` (file, granola, slack, notion).
5
+ **Connect / capability (different entry):** "connect a new MCP", "connect Granola/Slack/Notion", "what can you pull?" → `references/connect.md` first. Recipes: `mcp/recipes/` (file, granola, slack, notion).
6
6
 
7
7
  **Read first:** `context.md` (what's already logged, what's stale). Bind the engagement before staging anything.
8
8
 
@@ -22,7 +22,7 @@ List what you can actually call **this session**:
22
22
 
23
23
  1. **Sink** - `ingest_stage` / `fde ingest` available?
24
24
  2. **Sources** - which fetch tools exist (Granola-shaped, Slack, Notion, Drive, file-only)?
25
- 3. Tell the FDE in one line: *I can pull from X; Y is not connected.* If they asked to pull Y and it is missing → switch to `ingest-connect.md`. Never pretend a source exists.
25
+ 3. Tell the FDE in one line: *I can pull from X; Y is not connected.* If they asked to pull Y and it is missing → switch to `connect.md`. Never pretend a source exists.
26
26
 
27
27
  ## Ground loop (you do this work)
28
28
 
@@ -60,7 +60,7 @@ When a staged fact came from a named source, carry `via:<source>` on the applied
60
60
 
61
61
  ## MCP sink + recipes
62
62
 
63
- Optional `mcp/fdeops-ingest` wraps the same verbs over stdio. Source MCPs remain separate - the FDE adds whichever fetch tools they trust. Setup coach: `ingest-connect.md`. Copy-paste recipes: `mcp/recipes/`.
63
+ Optional `mcp/fdeops-ingest` wraps the same verbs over stdio. Source MCPs remain separate - the FDE adds whichever fetch tools they trust. Setup coach: `connect.md`. Copy-paste recipes: `mcp/recipes/`.
64
64
 
65
65
  ## Checkpoint
66
66
 
@@ -99,7 +99,7 @@ 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 assumption-audit - land makes the register exist. Example:
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:
103
103
 
104
104
  ```markdown
105
105
  | # | Assumption | Blast radius | How we test | Status | Evidence |
@@ -107,7 +107,7 @@ If `stakeholders.md` already has a `## Signal history` section (it does from the
107
107
  | 1 | <claim from brief> | CRITICAL | <cheapest falsifying test> | OPEN | (stated, unverified) |
108
108
  ```
109
109
 
110
- One falsifiable hypothesis about the real problem also goes at the bottom of `brief.md` - discover / assumption-audit will test it.
110
+ One falsifiable hypothesis about the real problem also goes at the bottom of `brief.md` - discover / test-assumptions will test it.
111
111
 
112
112
  ## Checkpoint
113
113
 
@@ -1,4 +1,4 @@
1
- # initiative-triage - when 20 things are "urgent," pick the 3 that matter
1
+ # pick-three - when 20 things are "urgent," pick the 3 that matter
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
 
@@ -2,7 +2,7 @@
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
 
5
- **Read first:** `reality.md`, `success.md`, `terrain.md`, `stakeholders.md`. Load `business-case.md` if sketch produced one. Not the full folder.
5
+ **Read first:** `reality.md`, `success.md`, `terrain.md`, `stakeholders.md`. Load `business-case.md` if poc produced one. Not the full folder.
6
6
 
7
7
  ## Validation gate (confirm understanding, clarify where it elevates)
8
8
 
@@ -22,13 +22,13 @@ An FDE plan is not a sprint backlog. The technical sequence is the easy part. Th
22
22
 
23
23
  ## Method (you do this work)
24
24
 
25
- **0. Lock scope first.** Read `success.md` and `assumptions.md`. If out-of-scope is undefined, define it now with the FDE - a plan on undefined scope accumulates silent commitments. If any CRITICAL assumption is still `OPEN`, stop and run assumption-audit / discover before sequencing work.
25
+ **0. Lock scope first.** Read `success.md`, `assumptions.md`, and the **Question** on `reality.md`. If out-of-scope is undefined, define it now with the FDE - a plan on undefined scope accumulates silent commitments. If any CRITICAL assumption is still `OPEN`, stop and run test-assumptions / discover before sequencing work. If `reality.md` has no Question, stop and finish discover - you are sequencing trivia.
26
26
 
27
27
  **1. Work backwards from success.** What's the last thing that must be true before done? And before that? That's the dependency chain - not a wish list.
28
28
 
29
29
  **2. Front-load the fragile.** Check `terrain.md` hotspots. Risky modules go early - fail fast, not in week three.
30
30
 
31
- **3. Slice vertically.** Each task delivers something visible and testable end to end ("user submits form, sees it saved"), never a horizontal layer ("build the database layer").
31
+ **3. One user action per change.** Each task delivers something visible and testable ("user submits form, sees it saved"), never a layer ("build the database layer"). See `ship`.
32
32
 
33
33
  **4. Size to 30-90 minutes, PR-sized.** Longer = two tasks. Each task implementable, testable, reviewable without a thousand-line diff.
34
34
 
@@ -36,7 +36,7 @@ An FDE plan is not a sprint backlog. The technical sequence is the easy part. Th
36
36
 
37
37
  **6. Stakeholder touchpoints every 2-3 tasks.** "Show progress to <name from stakeholders.md>." Not ceremony: a customer who sees small wins stays bought in; silence gets filled with doubt.
38
38
 
39
- **7. End with a kill list.** Every plan names what you will **not** do this phase. If everything is "later," you have no plan - you have a wish list. Cap **Now** at 3 slices (same discipline as initiative-triage).
39
+ **7. End with a kill list.** Every plan names what you will **not** do this phase. If everything is "later," you have no plan - you have a wish list. Cap **Now** at 3 PRs (same discipline as pick-three).
40
40
 
41
41
  **Acceptance criteria gate:** no task moves to build without written happy-path AND unhappy-path criteria. Can't write them = the task isn't understood; the open question goes to the customer **before** the task starts. Vague criteria surface later as scope creep and rework.
42
42
 
@@ -54,6 +54,7 @@ Delivers: <what someone can see/test>
54
54
  Accepts: <happy path> / <unhappy path>
55
55
  Touches: <files/systems - blast radius declared upfront>
56
56
  Risk: <what could go wrong + fallback>
57
+ Kill if: <the observation that voids this slice - copy from assumptions.md How we test, or the check that means stop>
57
58
  Verify: <specific check>
58
59
  Value promised: <business unit change this slice claims>
59
60
 
@@ -72,7 +73,7 @@ Value promised: <business unit change this slice claims>
72
73
  No kill list → not a finished plan. Reopen with the FDE until the deferrals are written.
73
74
  ## Checkpoint
74
75
 
75
- Walk the FDE through: sequence + why this order, where the fragile work sits, where the touchpoints land, the acceptance gate on task 1, and the kill list. One question: "Which stakeholder sees the first visible slice, and when?" Second: "Who accepted what we are not doing?"
76
+ Walk the FDE through: sequence + why this order, where the fragile work sits, where the touchpoints land, the acceptance gate and **Kill if** on task 1, and the kill list. One question: "Which stakeholder sees the first visible slice, and when?" Second: "Who accepted what we are not doing?" Third: "What observation stops task 1 this week?"
76
77
 
77
78
  ## Method - estimation (when the sponsor asks "how long, how much?")
78
79
 
@@ -96,6 +97,7 @@ Every FDE gets asked this in week one. The honest answer is a range, not a numbe
96
97
  - Add 30% buffer for integration work (it always takes longer).
97
98
  - Add 50% buffer for AI/ML work (eval cycles are unpredictable).
98
99
  - Name assumptions explicitly: "assumes API docs are accurate", "assumes staging environment exists."
100
+ - Each named assumption needs a **kill observation**: the result that voids the estimate. Copy it from `assumptions.md` → How we test. No kill observation = it is not an assumption, it is hope.
99
101
  - Revisit estimates every 2 weeks. An estimate that never updates is fiction.
100
102
 
101
103
  Write estimates to `decisions.md` under `## Sizing`. Include the assumptions - when they break, the estimate changes and the FDE has evidence for the conversation.
@@ -135,7 +137,7 @@ Never quietly update tasks. Name the reset: update `reality.md` and `success.md`
135
137
 
136
138
  Acme, after discover: the reconciliation job is unowned, Marco's spreadsheet is the real fallback.
137
139
 
138
- **Now** is three tasks, not eight. Task 1 is *failures reach a named human* - delivers a page to a rota, accepts "kill the job mid-run → the on-call is paged within 15 min", touches the job wrapper and the alert config, rollback is re-disable the route, verify by killing it in staging. Value promised: `risk-mitigation - a silent failure becomes a 15-minute one`.
140
+ **Now** is three tasks, not eight. Task 1 is *failures reach a named human* - delivers a page to a rota, accepts "kill the job mid-run → the on-call is paged within 15 min", touches the job wrapper and the alert config, rollback is re-disable the route, **Kill if:** a real failure page is acked by nobody on the rota (the *finance would act* assumption, DISPROVED if Marco is the only name that answers), verify by killing it in staging. Value promised: `risk-mitigation - a silent failure becomes a 15-minute one`.
139
141
 
140
142
  The kill list in `decisions.md` is where the plan earns its keep: the rewrite of the reconciliation service that Tom keeps proposing goes there - *deferred, the failure mode is ownership not architecture (Priya accepted, Jun 12)* - along with the finance dashboard finance asked for directly. Both stay visible so the same argument is not re-litigated in week 4 without a receipt.
141
143
 
@@ -148,5 +150,6 @@ First visible slice goes to Marco, not Priya: he is the one whose morning change
148
150
  - Every 2-3 tasks, a stakeholder touchpoint. Trust decays without visibility.
149
151
  - No written acceptance criteria, no build.
150
152
  - No kill list, no finished plan.
151
- - Estimates are ranges, not promises. Name the assumptions.
153
+ - No **Kill if** on a Now PR, that PR is hope.
154
+ - Estimates are ranges, not promises. Name the assumptions and the observation that voids them.
152
155
  - Migrations: leaf nodes first, core last. Rollback before cutover.
@@ -1,4 +1,4 @@
1
- # sketch - prototype to kill or confirm a direction
1
+ # poc - kill or confirm a direction in a day
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
 
@@ -1,4 +1,4 @@
1
- # status - the sponsor update that keeps the engagement alive
1
+ # readout - the sponsor update that keeps the engagement alive
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
 
@@ -24,7 +24,7 @@ Then add, still on the same page:
24
24
 
25
25
  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
26
 
27
- For board / renewal / sponsor's boss (longer pyramid): use `exec-narrative.md`. Do not invent a second weekly format.
27
+ For board / renewal / sponsor's boss (longer pyramid): use `board-memo.md`. Do not invent a second weekly format.
28
28
 
29
29
  ## Artifact
30
30
 
@@ -46,7 +46,7 @@ Customers remember who told them the truth before it cost them money.
46
46
 
47
47
  ## D. Pivot - the whole direction changed
48
48
 
49
- Not scope-defense (that's someone adding). This is: budget cut, new CTO arrives, strategic priority shift, acquisition changes everything, "we've decided to go a different direction." The engagement's foundation moved.
49
+ Not hold-scope (that's someone adding). This is: budget cut, new CTO arrives, strategic priority shift, acquisition changes everything, "we've decided to go a different direction." The engagement's foundation moved.
50
50
 
51
51
  **Signals:** new leadership asks "why are we doing this?", the sponsor's boss questions ROI, a competing initiative gets the resources, the quarterly priorities deck doesn't mention your project, the team you're embedded in gets reorganized.
52
52
 
@@ -34,7 +34,7 @@ Also check:
34
34
 
35
35
  **Stage 1 fails → stop** if any SPLIT/DROP remains, or JUSTIFY lacks a written sentence. Quality review on out-of-scope code is wasted work. Record the mismatch (and the KEEP/JUSTIFY/SPLIT/DROP tally) in `decisions.md`.
36
36
 
37
- Stakeholder "also can you…" mid-build is `scope-defense` - different axis. This stage is **code vs claim**.
37
+ Stakeholder "also can you…" mid-build is `hold-scope` - different axis. This stage is **code vs claim**.
38
38
 
39
39
  ## Stage 2 - is it safe to live with?
40
40
 
@@ -1,4 +1,4 @@
1
- # rollback-drill - test the escape route before you need it
1
+ # rollback - test the escape route before you need it
2
2
 
3
3
  **Enter when:** a deploy is planned for the next 48 hours, the FDE says "we can always revert," a previous rollback failed or took too long, or the engagement involves regulated/critical systems.
4
4
 
@@ -1,4 +1,4 @@
1
- # handoff-engineering - making yourself replaceable is the goal
1
+ # runbook - making yourself replaceable is the goal
2
2
 
3
3
  **Enter when:** the engagement is entering its final phase, the customer team needs to operate without the FDE, a new FDE is taking over, or the sponsor asks "what happens when you leave?"
4
4
 
@@ -103,9 +103,9 @@ Rollback: <exact command and expected time>
103
103
  - [ ] All access returned or transferred (repos, environments, admin panels)
104
104
  - [ ] No personal credentials left in the system (API keys, tokens, SSH keys)
105
105
  - [ ] `.fde/` folder handed to the successor or archived with the team
106
- - [ ] Final status sent to sponsor (see `status.md`)
106
+ - [ ] Final status sent to sponsor (see `readout.md`)
107
107
  - [ ] Retrospective completed (see `close.md`)
108
- - [ ] Patterns extracted (see `pattern-extract.md`)
108
+ - [ ] Patterns extracted (see `encode-pattern.md`)
109
109
 
110
110
  ## Artifact
111
111
 
@@ -1,8 +1,8 @@
1
- # use-case-scoring - pick the right battle, not the interesting one
1
+ # score-use-cases - pick the right battle, not the interesting one
2
2
 
3
3
  **Enter when:** multiple potential use cases compete for attention, the customer says "we want to do everything," a transformation engagement needs a starting point, or the FDE needs to recommend which problem to solve first.
4
4
 
5
- **Read first:** `reality.md`, `brief.md`, `terrain.md`, `context.md`. If `business-case.md` or `prototype-log.md` exist from sketch, load those - they carry forward.
5
+ **Read first:** `reality.md`, `brief.md`, `terrain.md`, `context.md`. If `business-case.md` or `prototype-log.md` exist from poc, load those - they carry forward.
6
6
 
7
7
  The most dangerous moment in a multi-use-case engagement is when the technically interesting problem wins over the high-value problem. Scoring replaces opinion with arithmetic. The arithmetic is wrong - all models are - but it's *visibly* wrong, which means it can be debated and corrected. Opinion can't.
8
8
 
@@ -59,7 +59,7 @@ Why this formula:
59
59
 
60
60
  ## Checkpoint
61
61
 
62
- Walk the FDE through the top 3 scores and the recommendation. One question: "Does the sponsor have a strong preference that overrides the scoring?" If yes, log it. If no, proceed with the highest score to sketch or plan.
62
+ Walk the FDE through the top 3 scores and the recommendation. One question: "Does the sponsor have a strong preference that overrides the scoring?" If yes, log it. If no, proceed with the highest score to poc or plan.
63
63
 
64
64
  ## Principles
65
65
 
@@ -1,10 +1,102 @@
1
- # ship - production without surprises
1
+ # ship - on their site, then live
2
2
 
3
- **Enter when:** a slice is built, reviewed, and ready to deploy.
3
+ **Enter when:** you are writing or updating on their codebase, they need to see something real, or you are going live.
4
4
 
5
- **Read first:** `context.md`, `delivery.md`, `success.md`. Load `trust-profile.md` if the deploy touches regulated data or needs an approval chain. Load `evals.md` when the deploy touches AI/ML/LLM/RAG/agents.
5
+ **Read first:** `context.md`, `decisions.md`, `delivery.md`, `success.md`. Load `terrain.md` before you touch their code. Load `trust-profile.md` if the deploy touches regulated data or needs an approval chain. Load `evals.md` when the work touches AI/ML/LLM/RAG/agents.
6
6
 
7
- Opening question, calm tech lead voice: **has anyone actually *run* the rollback, or is it still a slide?** If only planned, that's today's work - say so plainly.
7
+ Do not ask them to pick a mode. Name where you are, then start at the matching section:
8
+
9
+ - Nothing on their staging yet → **one change they can see**
10
+ - On staging, the signer in `success.md` can reject it → **go-live**
11
+ - Prod is the question → **go-live**. Do not start a second change.
12
+
13
+ If going live, opening question: **has anyone actually *run* the rollback, or is it still a slide?** If only planned, that's today's work - say so plainly.
14
+
15
+ A same-day throwaway that kills an assumption is `poc`. This method is the real change on a repo they will own, then production.
16
+
17
+ ## Field (name it once, then the same loop)
18
+
19
+ | | Brownfield | Greenfield |
20
+ |--|------------|------------|
21
+ | What you touch | Code they already run | A new path or empty tree they will own |
22
+ | First move | Characterise their tests, their runner, the workaround in `terrain.md` | First path a user can click. Not the whole product. |
23
+ | Proof | Their staging, a screen they already use | Their staging, or the environment they will operate. Local demo is not delivery. |
24
+ | Undo | Revert this change on its own | Same. If you cannot undo it, the design is coupled. |
25
+
26
+ Skip POC only when the killer assumption already lives in the repo (typical brownfield). If the bet is unproven, `poc` first.
27
+
28
+ ## Method - one change they can see
29
+
30
+ One change = one thing a user can do, with a test, that you can revert on its own. Not "all the APIs, then all the UI." Not a 2,000-line dump. A PR is how this often lands. It is not the job. The job is the change they can see.
31
+
32
+ ```
33
+ BAD (layers):
34
+ 1: all database models
35
+ 2: all API endpoints
36
+ 3: all UI components
37
+ 4: wire everything together (and pray)
38
+
39
+ GOOD (one user action each):
40
+ 1: User can create a payment (schema + endpoint + minimal UI) - testable
41
+ 2: User can view payment status (query + endpoint + UI) - testable
42
+ 3: Payment retry on failure (logic + endpoint + UI feedback) - testable
43
+ 4: Admin can void a payment (auth + logic + UI) - testable
44
+ ```
45
+
46
+ Each change is independently revertible.
47
+
48
+ **Before you start this change:**
49
+
50
+ - [ ] It is in `decisions.md` with acceptance criteria (happy + unhappy path)
51
+ - [ ] Blast radius declared: which files, which systems, which users affected
52
+ - [ ] Rollback named: revert this change, or something more specific
53
+ - [ ] No dependency on an unmerged change (if dependent, state it and land in order)
54
+ - [ ] `Kill if` is written - the observation that stops this change
55
+
56
+ **The loop.** In this order:
57
+
58
+ ```
59
+ Read existing code in the area (search before creating)
60
+ → Characterise what is already there (their tests, their runner; greenfield: the empty tree)
61
+ → Implement the smallest path that works
62
+ → Prove it on their staging (below)
63
+ → Cleanup pass (dedupe, simplify - behaviour unchanged)
64
+ → Self-review against acceptance criteria
65
+ → Commit with a message the client's team can read
66
+ → Update decisions.md + delivery.md
67
+ ```
68
+
69
+ **Prove it on their staging.** A green check on your laptop is not delivery.
70
+
71
+ - Run **their** test command, typecheck, or smallest proving path. Write the command and the result in `delivery.md`.
72
+ - If the signer in `success.md` cannot reject this on a screen they already use, it is not proven.
73
+ - Staging they operate beats a local demo. If you have no staging: `unknown - ask:` who owns an environment, then stop pretending it shipped.
74
+ - Model in the path: `eval-pack` until `evals.md` says SHIP. Do not skip because "it looked right in chat."
75
+
76
+ The proof is whatever this client already believes, plus one new receipt they can replay.
77
+
78
+ **Size.** Each change targets:
79
+
80
+ | Metric | Target | Why |
81
+ |--------|--------|-----|
82
+ | Lines changed | 100-300 | Reviewable in one sitting |
83
+ | Time to implement | 30-90 minutes | Testable before context decays |
84
+ | Files touched | 1-5 | Blast radius stays containable |
85
+ | Tests added | ≥1 per new behaviour | Proves this change; guards against regression |
86
+
87
+ Larger than 300 lines → split first. "It's all connected" means the design needs work, not a bigger dump.
88
+
89
+ **Show it.** Every 2-3 changes, something the customer can see: an endpoint they can hit, a UI they can click, a metric that moved, a risk that was retired. Technical progress invisible to stakeholders is trust decay. `delivery.md` gets updated after every visible change.
90
+
91
+ **The scope trap.** Mid-change discoveries ("this module also needs updating," "I should refactor this while I'm here"):
92
+
93
+ - If it's in `decisions.md`: do it as a separate change.
94
+ - If it's NOT in `decisions.md`: log it as a scope receipt (see `hold-scope.md`), don't touch it.
95
+ - Ugly code outside this change stays ugly. That is discipline, not laziness.
96
+
97
+ After each change: tests pass (state the command and result), acceptance criteria met, blast radius as declared, `Kill if` still false. After every 2-3: what did they see, and what's their signal? Then, when the signer can reject it on their staging, go-live below.
98
+
99
+ ---
8
100
 
9
101
  ## Deployment readiness gate (confirm the target before building the runway)
10
102
 
@@ -24,7 +116,7 @@ Before scoring readiness, confirm WHERE this is going. State it in 2-3 lines - b
24
116
  | **Compliance** | Region constraints? Data residency? Encryption requirements? CAB/change window? | |
25
117
  | **Infra-as-code** | Terraform/Pulumi/CDK/manual? State file location? | |
26
118
 
27
- **If anything is blank:** ask now. Discovering deployment constraints AFTER build is where timelines slip. If the client hasn't defined these yet, that's a conversation before you write the runbook - not after.
119
+ **If anything is blank:** ask now. Discovering deployment constraints after the change is where timelines slip. If the client hasn't defined these yet, that's a conversation before you write the runbook - not after.
28
120
 
29
121
  Write confirmed deployment context to `delivery.md` under a `## Deployment target` section.
30
122
 
@@ -46,9 +138,9 @@ Score each dimension green/amber/red. This is the gate, not a suggestion:
46
138
 
47
139
  | Dimension | Green | Amber | Red |
48
140
  |-----------|-------|-------|-----|
49
- | **Value bucket** | `success.md` names primary bucket (`cost-save` \| `risk-mitigation` \| `revenue-uplift`) and a baseline→target metric; this slice’s value-ledger row has **Bucket** + **Promised** | Bucket named; **Measured** still `pending` with a pulse date | No bucket, or Promised empty / ticket-theater only |
50
- | **Audit receipt** | Dated line in `delivery.md` (`## Ship receipts` or ledger Evidence) proving exceptions/operating path were walked - cite `terrain.md` / `reality.md` / `audit.md` | Path described, not verified this ship | No audit receipt for this slice |
51
- | **Eval receipt** | **n/a** (no AI on this slice) **or** `evals.md` Verdict SHIP with dated golden run + HITL gate named | Eval pack exists; known fails open with owner + date | AI in scope and no eval receipt |
141
+ | **Value bucket** | `success.md` names primary bucket (`cost-save` \| `risk-mitigation` \| `revenue-uplift`) and a baseline→target metric; this change's value-ledger row has **Bucket** + **Promised** | Bucket named; **Measured** still `pending` with a pulse date | No bucket, or Promised empty / ticket-theater only |
142
+ | **Audit receipt** | Dated line in `delivery.md` (`## Ship receipts` or ledger Evidence) proving exceptions/operating path were walked - cite `terrain.md` / `reality.md` / `audit.md` | Path described, not verified this ship | No audit receipt for this change |
143
+ | **Eval receipt** | **n/a** (no AI on this change) **or** `evals.md` Verdict SHIP with dated golden run + HITL gate named | Eval pack exists; known fails open with owner + date | AI in scope and no eval receipt |
52
144
  | **AI eval pack** | `.fde/evals.md` Verdict SHIP; goldens run this change; critical fails 0; HITL filled if policy requires | Pack exists; run stale vs change log | AI-touching deploy and pack missing / NO-SHIP / HITL required but empty |
53
145
 
54
146
  **Any RED = stop. Do not deploy. Fix the red dimension first.**
@@ -65,7 +157,7 @@ Write the readiness score (including value + receipts) to `delivery.md` before d
65
157
 
66
158
  ## Intent vs diff (before pre-blast)
67
159
 
68
- Ship the change you intended - not the drift that snuck in. Run this on the deploy branch against the **one-line intent** from `decisions.md` / `success.md` (the slice you said you were building).
160
+ Ship the change you intended - not the drift that snuck in. Run this on the deploy branch against the **one-line intent** from `decisions.md` / `success.md` (the change you said you were building).
69
161
 
70
162
  ```bash
71
163
  git diff <base>...HEAD --stat
@@ -78,12 +170,12 @@ Score every touched path (or logical hunk):
78
170
  |---------------|---------|------|
79
171
  | | **KEEP** | Directly required for the stated intent |
80
172
  | | **JUSTIFY** | Adjacent but load-bearing - one sentence why it must ship *now*, or split |
81
- | | **SPLIT** | Real work, wrong PR - park in `decisions.md` kill/Next; do not deploy with this slice |
173
+ | | **SPLIT** | Real work, wrong change - park in `decisions.md` kill/Next; do not deploy with this one |
82
174
  | | **DROP** | Noise (format-only, drive-by rename, unrelated tidy) - revert before ship |
83
175
 
84
176
  **Any SPLIT or DROP still in the tree = fix-first.** JUSTIFY without a written sentence = treat as SPLIT. Log a one-line receipt in `delivery.md`: `intent vs diff: KEEP n · JUSTIFY n · SPLIT n · DROP n - <intent>`.
85
177
 
86
- This is **code drift**, not stakeholder "also can you…" (that is `scope-defense`). Same family as review Stage 1 - ship refuses green when the diff outgrew the claim.
178
+ This is **code drift**, not stakeholder "also can you…" (that is `hold-scope`). Same family as review Stage 1 - ship refuses green when the diff outgrew the claim.
87
179
 
88
180
  ## Pre-blast challenge (before the deploy button)
89
181
 
@@ -164,12 +256,12 @@ Never skip a step. The sponsor always wants to skip from pilot to standard - tha
164
256
 
165
257
  ## Method - progressive adoption (built it, now people need to use it)
166
258
 
167
- Adoption isn't a handoff-stage problem - it starts during build. Software that launches to silence is software that gets decommissioned.
259
+ Adoption isn't a handoff-stage problem - it starts while you are still writing the change. Software that launches to silence is software that gets decommissioned.
168
260
 
169
- **During build:**
261
+ **During the change:**
170
262
  - **Feature flags from day one.** Every new capability behind a flag. Ship to 5% of users first. Watch behavior before opening to 100%.
171
263
  - **Feedback loops built in.** A thumbs-up/down, a "was this helpful?", a usage counter. Instrument adoption, don't assume it.
172
- - **Resistance signals.** Watch for: workaround creation (they built a spreadsheet instead of using the tool), drop-off after day 3 (onboarding fails), vocal detractors (one influential skeptic can kill adoption). Address these DURING build, not after launch.
264
+ - **Resistance signals.** Watch for: workaround creation (they built a spreadsheet instead of using the tool), drop-off after day 3 (onboarding fails), vocal detractors (one influential skeptic can kill adoption). Address these before launch, not after.
173
265
 
174
266
  **At launch:**
175
267
  - **Champion network.** Identify 2-3 power users per team who adopt early. Support them intensely - they become your multiplier.
@@ -180,24 +272,35 @@ Adoption isn't a handoff-stage problem - it starts during build. Software that l
180
272
 
181
273
  ## Artifact
182
274
 
183
- **`delivery.md`** - deployment record: what shipped, when, what it delivers in business terms, rollback procedure, pulse definition, **scale-readiness assessment, and adoption metrics**. Written for whoever inherits the system.
275
+ **`decisions.md`** - each change: what was implemented, what was tested, what was deferred, `Kill if`.
276
+
277
+ **`delivery.md`** - each visible change in business language; then the deployment record: what shipped, when, rollback procedure, pulse definition, **scale-readiness assessment, and adoption metrics**. Written for whoever inherits the system.
184
278
 
185
279
  ## Checkpoint
186
280
 
187
- Before 100%: canary clean, business metric verified, pulse written into `delivery.md`. Also green: value bucket named, audit receipt dated, eval receipt **n/a or pass**, **intent vs diff clean** (no unresolved SPLIT/DROP). Missing any of those → not green. For enterprise-scale: scale-readiness gate passed before broad rollout.
281
+ After each change: tests pass, acceptance criteria met, blast radius as declared, `Kill if` still false, proven on staging they operate.
282
+
283
+ Before 100% live: canary clean, business metric verified, pulse written into `delivery.md`. Also green: value bucket named, audit receipt dated, eval receipt **n/a or pass**, **intent vs diff clean** (no unresolved SPLIT/DROP). Missing any of those → not green. For enterprise-scale: scale-readiness gate passed before broad rollout.
188
284
 
189
285
  ## Worked example
190
286
 
191
- Acme, shipping the failure-routing slice into a payments environment on a Thursday.
287
+ Acme, brownfield. Plan Now has three changes, not "the payments rewrite."
192
288
 
193
- Readiness scoring catches two things the diff does not. The audit receipt is missing: the operating map says Marco's manual re-run is the fallback, and nobody has checked whether the new page fires *before* his morning run or after - if after, the alert changes nothing. That gets walked and cited before deploy. Second, the intent-vs-diff read shows the PR also touches the settlement retry that was deferred in build; it comes out.
289
+ Change 1 is *user sees retry status on a failed payment* - schema + endpoint + the existing ops screen, 180 lines, their `pytest -k payments` green, revert is this change. `Kill if:` the signer cannot reject it on the screen they already use. Ugly retry-queue code two files over stays ugly. `decisions.md` logs the change; `delivery.md` says ops can see a retry without opening the spreadsheet. Marco sees it on staging they operate. That is the proof. Local green was not.
290
+
291
+ Then Thursday go-live of the failure-routing change. Readiness scoring catches two things the diff does not. The audit receipt is missing: the operating map says Marco's manual re-run is the fallback, and nobody has checked whether the new page fires *before* his morning run or after - if after, the alert changes nothing. That gets walked and cited before deploy. Second, the intent-vs-diff read shows the PR also touches the settlement retry that was deferred; it comes out.
194
292
 
195
293
  Pre-blast challenge: "what does this break if it fires at 3am and nobody acks?" Answer: nothing breaks, but the rota is not yet agreed - so the deploy waits on a name, not on code. That is a one-day slip that prevents a fake green.
196
294
 
197
295
  After deploy: `delivery.md` ship receipt with the audit cite, the kill test evidence, and the rollback line. Eval receipt: n/a, no AI in this path.
198
296
 
297
+ Greenfield is the same loop with an empty tree: first path a user can click, on an environment they will operate, then this go-live. Not the whole product in one dump.
298
+
199
299
  ## Principles
200
300
 
301
+ - One user action per change. Layers are untestable until assembled.
302
+ - On their staging, and you can undo it. Local green is not delivery.
303
+ - The ugly code outside this change stays ugly. That's discipline, not laziness.
201
304
  - A deployment without a tested rollback is reckless.
202
305
  - Roll back on any canary anomaly; investigate safely.
203
306
  - Verify the business metric, not just the technical one.
@@ -1,4 +1,4 @@
1
- # multi-customer-ops - juggling engagements without dropping any
1
+ # switch-clients - juggling engagements without dropping any
2
2
 
3
3
  **Enter when:** the FDE is running 2+ engagements simultaneously, context-switching is causing mistakes or delays, a new customer is being onboarded while existing engagements are active, or the FDE says "I'm losing track."
4
4
 
@@ -1,4 +1,4 @@
1
- # assumption-audit - pressure-test the brief before building on it
1
+ # test-assumptions - pressure-test the brief before building on it
2
2
 
3
3
  **Enter when:** the brief feels too neat, the customer is very confident about the solution (not the problem), someone says "we just need…" about a complex system, or discover surfaced contradictions between what was said and what the codebase shows.
4
4
 
@@ -40,7 +40,7 @@ CONVENIENCE - if wrong, a task changes but the approach holds
40
40
  | "The team will adopt the new tool" | Ask three team members individually: "Show me how you'd use this" | 1h | 2 of 3 can describe a use case without prompting |
41
41
  | "The data is clean enough for ML" | Sample 200 records, count nulls/duplicates/format errors | 1h | <5% error rate on the fields the model needs |
42
42
 
43
- **4. Run the killer test first.** The assumption with the highest blast radius AND the cheapest validation gets tested immediately. This single principle saves more engagement time than any other: if the killer assumption is wrong, you've saved weeks; if it holds, you've bought confidence.
43
+ **4. Run the killer test first.** The assumption with the highest blast radius AND the cheapest validation gets tested immediately. This single principle saves more engagement time than any other: if the killer assumption is wrong, you've saved weeks; if it holds, you've bought confidence. Write the kill observation in `How we test` as the result that would **stop** the plan - plan copies that line onto each Now PR as `Kill if`.
44
44
 
45
45
  **5. Present findings as a fact base, not a challenge.**
46
46
 
@@ -1,4 +1,4 @@
1
- # options-analysis - three paths, not one recommendation
1
+ # three-options - three paths, not one recommendation
2
2
 
3
3
  **Enter when:** a significant technical or strategic decision needs to be made, the FDE is asked "what should we do?", the team is stuck between approaches, or a fork in the engagement requires the sponsor's input.
4
4