fdeops 3.15.1 → 3.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +116 -78
  3. package/adapters/AGENTS.md +2 -2
  4. package/adapters/GEMINI.md +2 -2
  5. package/adapters/README.md +1 -1
  6. package/adapters/copilot-instructions.md +2 -2
  7. package/adapters/cursor.fde.mdc +3 -3
  8. package/bin/check.js +58 -6
  9. package/bin/fde.js +16 -16
  10. package/bin/lib/memory.js +1 -1
  11. package/bin/lib/render.js +1 -1
  12. package/bin/lib/trust.js +1 -1
  13. package/mcp/README.md +2 -2
  14. package/mcp/fdeops-ingest/README.md +8 -8
  15. package/mcp/fdeops-ingest/package.json +1 -1
  16. package/mcp/fdeops-ingest/server.js +1 -1
  17. package/mcp/recipes/README.md +2 -2
  18. package/mcp/recipes/file.md +1 -1
  19. package/mcp/recipes/granola.md +5 -5
  20. package/mcp/recipes/notion.md +2 -2
  21. package/mcp/recipes/slack.md +5 -5
  22. package/package.json +1 -1
  23. package/plugin.json +1 -1
  24. package/skills/fde/SKILL.md +36 -23
  25. package/skills/fde/references/ai.md +8 -8
  26. package/skills/fde/references/assumption-audit.md +2 -2
  27. package/skills/fde/references/blast-radius.md +1 -1
  28. package/skills/fde/references/business-case.md +3 -3
  29. package/skills/fde/references/close.md +5 -5
  30. package/skills/fde/references/debrief.md +2 -2
  31. package/skills/fde/references/discover.md +7 -7
  32. package/skills/fde/references/eval-pack.md +6 -6
  33. package/skills/fde/references/handoff-engineering.md +2 -2
  34. package/skills/fde/references/incremental-build.md +20 -11
  35. package/skills/fde/references/ingest-connect.md +6 -6
  36. package/skills/fde/references/ingest.md +14 -14
  37. package/skills/fde/references/initiative-triage.md +6 -6
  38. package/skills/fde/references/land.md +8 -8
  39. package/skills/fde/references/multi-customer-ops.md +1 -1
  40. package/skills/fde/references/options-analysis.md +2 -2
  41. package/skills/fde/references/plan.md +6 -6
  42. package/skills/fde/references/red-team.md +2 -2
  43. package/skills/fde/references/review.md +7 -7
  44. package/skills/fde/references/scope-defense.md +3 -3
  45. package/skills/fde/references/ship.md +16 -16
  46. package/skills/fde/references/sketch.md +3 -3
  47. package/skills/fde/references/stakeholder-radar.md +4 -4
  48. package/skills/fde/references/status.md +8 -8
  49. package/skills/fde/references/trust-engineering.md +1 -1
  50. package/skills/fde/references/use-case-scoring.md +1 -1
@@ -47,7 +47,7 @@ Score each dimension green/amber/red. This is the gate, not a suggestion:
47
47
  | Dimension | Green | Amber | Red |
48
48
  |-----------|-------|-------|-----|
49
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 |
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
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 |
52
52
  | **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
53
 
@@ -59,13 +59,13 @@ Score each dimension green/amber/red. This is the gate, not a suggestion:
59
59
  2. If Verdict is not **SHIP**, or Last run is older than the latest change-log row → **RED.**
60
60
  3. If `trust-profile.md` requires human-in-the-loop and the HITL gate has no reviewer → **RED.**
61
61
  4. Log in `delivery.md` → `## Ship receipts` before deploy: audit cite + eval receipt.
62
- 5. Non-AI deploys: Eval = **n/a** do not invent an empty pack.
62
+ 5. Non-AI deploys: Eval = **n/a** - do not invent an empty pack.
63
63
 
64
64
  Write the readiness score (including value + receipts) to `delivery.md` before deploying. The score is the evidence if anything goes wrong.
65
65
 
66
66
  ## Intent vs diff (before pre-blast)
67
67
 
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).
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).
69
69
 
70
70
  ```bash
71
71
  git diff <base>...HEAD --stat
@@ -77,22 +77,22 @@ Score every touched path (or logical hunk):
77
77
  | Path / change | Verdict | Rule |
78
78
  |---------------|---------|------|
79
79
  | | **KEEP** | Directly required for the stated intent |
80
- | | **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 |
82
- | | **DROP** | Noise (format-only, drive-by rename, unrelated tidy) revert before ship |
80
+ | | **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 |
82
+ | | **DROP** | Noise (format-only, drive-by rename, unrelated tidy) - revert before ship |
83
83
 
84
- **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>`.
84
+ **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
85
 
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.
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.
87
87
 
88
88
  ## Pre-blast challenge (before the deploy button)
89
89
 
90
- For any non-trivial go-live (shared infra, regulated data, irreversible migration, or first prod touch), run this once before canary not as theater, as a stop-the-line check:
90
+ For any non-trivial go-live (shared infra, regulated data, irreversible migration, or first prod touch), run this once before canary - not as theater, as a stop-the-line check:
91
91
 
92
92
  ```
93
93
  CLAIM: <what you are about to ship, in one sentence>
94
94
  WHY IT MATTERS: <blast radius / who feels pain if wrong>
95
- CHALLENGE: <the strongest argument this is not ready grounded in delivery.md / risks.md / trust-profile.md>
95
+ CHALLENGE: <the strongest argument this is not ready - grounded in delivery.md / risks.md / trust-profile.md>
96
96
  VERDICT: proceed | fix-first | sponsor conversation
97
97
  ```
98
98
 
@@ -116,11 +116,11 @@ grep -rnE "(api[_-]?key|secret|password|token)\s*[:=]\s*['\"][^'\"]{8,}" \
116
116
 
117
117
  ## Method - the deploy
118
118
 
119
- **Canary:** 15% of traffic, ≥10 minutes. Watch error rate, latency, and **the business metric this change affects**. Anything looks wrong → roll back immediately; investigate safely; redeploy when confident. Never investigate during the canary. Then stage up: 5% → 25% → 100%, each confirmed stable.
119
+ **Canary:** 1-5% of traffic, ≥10 minutes. Watch error rate, latency, and **the business metric this change affects**. Anything looks wrong → roll back immediately; investigate safely; redeploy when confident. Never investigate during the canary. Then stage up: 5% → 25% → 100%, each confirmed stable.
120
120
 
121
121
  **Programme-scale rollout (transformations)** - different problem from one service:
122
122
  1. **Pilot** - one team, one use case; success metrics defined *before* it starts (after = fitting metrics to results).
123
- 2. **Limited release** - 35 teams, real load; this is where the failure modes the pilot hid show up.
123
+ 2. **Limited release** - 3-5 teams, real load; this is where the failure modes the pilot hid show up.
124
124
  3. **Broad release** - self-serve onboarding; if teams still need the FDE to start, onboarding isn't finished.
125
125
  4. **Enterprise standard** - the FDE is no longer needed for this use case. That's the end state.
126
126
  Straight from pilot to standard = a high-profile failure at scale.
@@ -156,7 +156,7 @@ AI components: also define what *normal output* looks like and check a weekly sa
156
156
 
157
157
  **The scale sequence:**
158
158
  1. **Pilot** (1 team, controlled) → prove value, find failure modes
159
- 2. **Limited** (35 teams, real load) → prove operability, find scale bugs
159
+ 2. **Limited** (3-5 teams, real load) → prove operability, find scale bugs
160
160
  3. **Broad** (self-serve onboarding) → prove the team doesn't need the FDE
161
161
  4. **Standard** (enterprise default) → the FDE exits this workstream
162
162
 
@@ -172,7 +172,7 @@ Adoption isn't a handoff-stage problem - it starts during build. Software that l
172
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.
173
173
 
174
174
  **At launch:**
175
- - **Champion network.** Identify 23 power users per team who adopt early. Support them intensely - they become your multiplier.
175
+ - **Champion network.** Identify 2-3 power users per team who adopt early. Support them intensely - they become your multiplier.
176
176
  - **30-60-90 adoption targets.** Week 1: 20% of target users try it. Week 4: 50% use it weekly. Week 12: 80% can't imagine working without it. If week 1 misses → the onboarding is broken. If week 4 misses → the value proposition is wrong.
177
177
  - **The "switching cost" test.** If users can still do it the old way, they will. Adoption requires either: the old way is removed, the new way is dramatically better, or management mandates the switch. Know which lever applies.
178
178
 
@@ -190,9 +190,9 @@ Before 100%: canary clean, business metric verified, pulse written into `deliver
190
190
 
191
191
  Acme, shipping the failure-routing slice into a payments environment on a Thursday.
192
192
 
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.
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.
194
194
 
195
- 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.
195
+ 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
196
 
197
197
  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
198
 
@@ -1,6 +1,6 @@
1
1
  # sketch - prototype to kill or confirm a direction
2
2
 
3
- **Enter when:** a direction needs validating before committing real build time - show something, de-risk, pick between use cases.
3
+ **Enter when:** a direction needs validating before committing real build time - POC, spike, show something, de-risk, pick between use cases. The output is something a sponsor can reject in a room this week, not a polished product.
4
4
 
5
5
  **Read first:** `context.md`, `reality.md`. Load `terrain.md` only if the prototype touches the existing codebase.
6
6
 
@@ -10,7 +10,7 @@
10
10
 
11
11
  **1. Pick by score when several use cases compete.** Use the scoring model from `discover.md` - (Value × Data readiness) / Complexity. If discover already scored, reuse; never re-score independently.
12
12
 
13
- **2. Build the minimum that tests the assumption.** No error handling, no tests, no polish. Same-day demo if possible. Rough is honest - polish tricks people into believing it's further along than it is.
13
+ **2. Build the minimum that tests the assumption.** No error handling, no polish. Same-day demo if possible. Rough is honest. The POC is done when the person who can say no has seen it and reacted, not when the code looks finished.
14
14
 
15
15
  **3. AI directions - test these before anything else:**
16
16
  - Data: available, clean, sufficient volume? Synthetic-data prototypes say nothing about production behaviour.
@@ -20,7 +20,7 @@
20
20
 
21
21
  **4. Kill it immediately if:** the assumption is disproven · the customer ignores it (indifference is a signal, not neutrality) · 3 iterations and feedback isn't converging · it works but the customer can't explain or trust the output (unexplainable AI in a high-stakes context is not a solution). When killed: write down what was *learned*, not what was built. The learning is the asset.
22
22
 
23
- **5. Translate to business language** once validated: problem solved, cost of inaction, success in numbers, 23 trade-offs. Three sentences max for the stakeholder - can't say it in three, don't understand it yet.
23
+ **5. Translate to business language** once validated: problem solved, cost of inaction, success in numbers, 2-3 trade-offs. Three sentences max for the stakeholder - can't say it in three, don't understand it yet.
24
24
 
25
25
  ## Artifact
26
26
 
@@ -28,7 +28,7 @@ The org chart tells you who reports to whom. The stakeholder radar tells you who
28
28
 
29
29
  **3. The 48-hour rule.** A stakeholder who goes amber has roughly 48 hours before they go red. A stakeholder who goes red is already escalating above you. Respond same-day to amber signals - not with more delivery, with a conversation.
30
30
 
31
- **3b. One name per person.** If the table says "Denise Chen" and Signal history says "Denise" or "D. Chen", trust keys fork and prep lies. Consolidate to one spelling. `fde doctor` flags these identity clusters treat that as a fix, not a nit.
31
+ **3b. One name per person.** If the table says "Denise Chen" and Signal history says "Denise" or "D. Chen", trust keys fork and prep lies. Consolidate to one spelling. `fde doctor` flags these identity clusters - treat that as a fix, not a nit.
32
32
 
33
33
  **4. Detect the invisible escalation.** Three markers:
34
34
  - Questions shift from "what are you building" to "when will it be done" - someone above is asking.
@@ -76,11 +76,11 @@ One line per stakeholder who changed signal this week. If nobody changed: "Map s
76
76
 
77
77
  Acme, week 6. Priya's replies have gone from same-day to two days, and a phase-2 go/no-go is scheduled for Thursday.
78
78
 
79
- Two signals, not one feeling: response time doubled *and* a finance analyst nobody introduced started asking when the work completes. That combination is an invisible escalation someone above Priya is asking, and the meeting is already happening without the FDE.
79
+ Two signals, not one feeling: response time doubled *and* a finance analyst nobody introduced started asking when the work completes. That combination is an invisible escalation - someone above Priya is asking, and the meeting is already happening without the FDE.
80
80
 
81
- Positions: Priya is a supporter under pressure. Marco is a supporter who does not vote. Denise (finance) is the swing, and what she is protecting is not the budget line she cites it is that her team's escalation started this and she has nothing to show her own director. Raj is a firm opponent on the rewrite question, and no amount of the same argument moves him.
81
+ Positions: Priya is a supporter under pressure. Marco is a supporter who does not vote. Denise (finance) is the swing, and what she is protecting is not the budget line she cites - it is that her team's escalation started this and she has nothing to show her own director. Raj is a firm opponent on the rewrite question, and no amount of the same argument moves him.
82
82
 
83
- Sequence: Denise one-on-one Tuesday with the incident numbers in her units, then Priya Wednesday, so Priya walks in already knowing finance is not going to object. Pre-mortem sentence: *"Denise says 'we still don't know if this actually caught anything'"* which is precisely why Tuesday exists. `stakeholders.md` records `Priya | sponsor | green→amber | reply latency 1d → 2d, unintroduced analyst (Jul 3)`; `context.md` carries the sequence.
83
+ Sequence: Denise one-on-one Tuesday with the incident numbers in her units, then Priya Wednesday, so Priya walks in already knowing finance is not going to object. Pre-mortem sentence: *"Denise says 'we still don't know if this actually caught anything'"* - which is precisely why Tuesday exists. `stakeholders.md` records `Priya | sponsor | green→amber | reply latency 1d → 2d, unintroduced analyst (Jul 3)`; `context.md` carries the sequence.
84
84
 
85
85
  ## Principles
86
86
 
@@ -6,16 +6,16 @@
6
6
 
7
7
  ## Method (you do this work)
8
8
 
9
- **First:** run `fde status`. It prints the value ledger before trust promised → measured → accepted by, or `claimed, not yet accepted`. Those lines are the Situation. Do not invent a number the CLI did not print.
9
+ **First:** run `fde status`. It prints the value ledger before trust - promised → measured → accepted by, or `claimed, not yet accepted`. Those lines are the Situation. Do not invent a number the CLI did not print.
10
10
 
11
11
  **Always draft in SCQA.** One page maximum. No other shape.
12
12
 
13
13
  | Block | What to write | Source |
14
14
  |-------|---------------|--------|
15
- | **S Situation** | Where we are against `success.md`, in their words | success.md, delivery value ledger |
16
- | **C Complication** | What changed, what is at risk, or what we learned (bad news first) | risks.md, assumptions DISPROVED/OPEN, stakeholders signal |
17
- | **Q Question / Ask** | The one decision or help you need from them | decisions.md, access/sign-off needs |
18
- | **A Answer** | What you recommend / what happens next week (≤3 bullets) | plan Now lane, delivery promised→measured |
15
+ | **S - Situation** | Where we are against `success.md`, in their words | success.md, delivery value ledger |
16
+ | **C - Complication** | What changed, what is at risk, or what we learned (bad news first) | risks.md, assumptions DISPROVED/OPEN, stakeholders signal |
17
+ | **Q - Question / Ask** | The one decision or help you need from them | decisions.md, access/sign-off needs |
18
+ | **A - Answer** | What you recommend / what happens next week (≤3 bullets) | plan Now lane, delivery promised→measured |
19
19
 
20
20
  Then add, still on the same page:
21
21
  1. **Value this week** - from the value ledger: promised → measured (or "pending") → **accepted by whom**, with evidence citation. A measured number nobody on the customer side has agreed to is written as `claimed`, and the Ask never rests on it - if the whole case for the next phase is a claimed number, the real ask this week is "who signs off that this is real?".
@@ -36,7 +36,7 @@ Append the draft to `delivery.md` under `## Status - <date>` using the SCQA head
36
36
  **C:** ...
37
37
  **Q:** ...
38
38
  **A:** ...
39
- **Value ledger:** promised … / measured … / accepted by … (evidence) or `claimed, unaccepted`
39
+ **Value ledger:** promised … / measured … / accepted by … (evidence) - or `claimed, unaccepted`
40
40
  **Kill list reminder:** …
41
41
  **Hostile Qs:** 1) … 2) … 3) …
42
42
  ```
@@ -49,9 +49,9 @@ Walk the FDE through the Complication and the Ask - confirm the framing matches
49
49
 
50
50
  Acme, week 3, Priya's Friday update.
51
51
 
52
- **S:** failure routing is live; detection is 12 min against the 4h baseline in `success.md`. **C** leads with the bad news, not the win: the second incident was acked 40 minutes late because the rota has one name on it, and that name was on leave. **Q:** one ask a second name on the rota by Wednesday. **A:** three bullets, top of the Now lane.
52
+ **S:** failure routing is live; detection is 12 min against the 4h baseline in `success.md`. **C** leads with the bad news, not the win: the second incident was acked 40 minutes late because the rota has one name on it, and that name was on leave. **Q:** one ask - a second name on the rota by Wednesday. **A:** three bullets, top of the Now lane.
53
53
 
54
- Value ledger line: `promised 4h → 15min / measured 12min over 2 incidents / accepted by (Marco confirmed operationally, finance not yet)` → written as `claimed, unaccepted`, which is what makes the Ask honest rather than a victory lap.
54
+ Value ledger line: `promised 4h → 15min / measured 12min over 2 incidents / accepted by - (Marco confirmed operationally, finance not yet)` → written as `claimed, unaccepted`, which is what makes the Ask honest rather than a victory lap.
55
55
 
56
56
  Hostile Q prep, from memory not imagination: "why did we pay for alerting we already had?" → the receipt from `decisions.md` and the disabled-alerting finding in `reality.md`. Kill list reminder: the service rewrite is still deferred, accepted by Priya on Jun 12.
57
57
 
@@ -66,7 +66,7 @@ Mistakes happen. What matters is speed and honesty:
66
66
  **`trust-profile.md`** - updated sections:
67
67
  ```markdown
68
68
  ## Trust level
69
- Current: <level 05> as of <date>
69
+ Current: <level 0-5> as of <date>
70
70
  Evidence: <what earned this level>
71
71
  Next target: <level> - requires: <specific action>
72
72
 
@@ -10,7 +10,7 @@ The most dangerous moment in a multi-use-case engagement is when the technically
10
10
 
11
11
  **1. List every candidate.** From the brief, from discovery conversations, from the FDE's own observations. Include the ones the customer hasn't said aloud but the codebase implies - a high-churn module with no tests is a candidate even if nobody named it.
12
12
 
13
- **2. Score on five dimensions.** Each 15, with the scoring rubric below:
13
+ **2. Score on five dimensions.** Each 1-5, with the scoring rubric below:
14
14
 
15
15
  | Dimension | 1 | 3 | 5 |
16
16
  |-----------|---|---|---|