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.
- package/README.md +61 -69
- package/adapters/AGENTS.md +1 -1
- package/adapters/GEMINI.md +1 -1
- package/adapters/LOCAL-LLM.md +4 -4
- package/adapters/README.md +1 -1
- package/adapters/copilot-instructions.md +1 -1
- package/adapters/cursor.fde.mdc +1 -1
- package/bin/check.js +27 -15
- package/bin/fde.js +150 -13
- package/bin/lib/render.js +2 -2
- package/bin/lib/trust.js +38 -3
- package/mcp/README.md +1 -1
- package/mcp/fdeops-ingest/package.json +1 -1
- package/mcp/recipes/README.md +1 -1
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/skills/fde/SKILL.md +30 -31
- package/skills/fde/references/ai.md +1 -1
- package/skills/fde/references/{exec-narrative.md → board-memo.md} +1 -1
- package/skills/fde/references/business-case.md +2 -2
- package/skills/fde/references/{ingest-connect.md → connect.md} +1 -1
- package/skills/fde/references/discover.md +33 -14
- package/skills/fde/references/{trust-engineering.md → earn-trust.md} +1 -1
- package/skills/fde/references/{pattern-extract.md → encode-pattern.md} +1 -1
- package/skills/fde/references/eval-pack.md +1 -1
- package/skills/fde/references/{scope-defense.md → hold-scope.md} +2 -2
- package/skills/fde/references/ingest.md +3 -3
- package/skills/fde/references/land.md +2 -2
- package/skills/fde/references/{initiative-triage.md → pick-three.md} +1 -1
- package/skills/fde/references/plan.md +10 -7
- package/skills/fde/references/{sketch.md → poc.md} +1 -1
- package/skills/fde/references/{status.md → readout.md} +2 -2
- package/skills/fde/references/rescue.md +1 -1
- package/skills/fde/references/review.md +1 -1
- package/skills/fde/references/{rollback-drill.md → rollback.md} +1 -1
- package/skills/fde/references/{handoff-engineering.md → runbook.md} +3 -3
- package/skills/fde/references/{use-case-scoring.md → score-use-cases.md} +3 -3
- package/skills/fde/references/ship.md +121 -18
- package/skills/fde/references/{multi-customer-ops.md → switch-clients.md} +1 -1
- package/skills/fde/references/{assumption-audit.md → test-assumptions.md} +2 -2
- package/skills/fde/references/{options-analysis.md → three-options.md} +1 -1
- package/skills/fde/references/{blast-radius.md → what-breaks.md} +3 -3
- package/skills/fde/references/{stakeholder-radar.md → who-decides.md} +1 -1
- package/templates/.fde/assumptions.md +2 -2
- package/templates/.fde/reality.md +6 -1
- 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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 `
|
|
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
|
-
**
|
|
154
|
-
**
|
|
155
|
-
**
|
|
156
|
-
**
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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`, `
|
|
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
|
|
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
|
|
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/
|
|
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 `
|
|
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: `
|
|
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
|
|
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 /
|
|
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
|
-
#
|
|
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
|
|
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 `
|
|
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.
|
|
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
|
|
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
|
-
-
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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 `
|
|
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
|
|
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
|
|
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
|
|
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
|
-
#
|
|
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 `
|
|
106
|
+
- [ ] Final status sent to sponsor (see `readout.md`)
|
|
107
107
|
- [ ] Retrospective completed (see `close.md`)
|
|
108
|
-
- [ ] Patterns extracted (see `pattern
|
|
108
|
+
- [ ] Patterns extracted (see `encode-pattern.md`)
|
|
109
109
|
|
|
110
110
|
## Artifact
|
|
111
111
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# use-
|
|
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
|
|
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
|
|
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 -
|
|
1
|
+
# ship - on their site, then live
|
|
2
2
|
|
|
3
|
-
**Enter when:**
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
51
|
-
| **Eval receipt** | **n/a** (no AI on this
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
**`
|
|
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
|
-
|
|
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,
|
|
287
|
+
Acme, brownfield. Plan Now has three changes, not "the payments rewrite."
|
|
192
288
|
|
|
193
|
-
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
|
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
|
|