fdeops 3.5.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/AGENTS.md +18 -0
- package/CLAUDE.md.template +25 -0
- package/LICENSE +21 -0
- package/README.md +328 -0
- package/adapters/AGENTS.md +24 -0
- package/adapters/GEMINI.md +24 -0
- package/adapters/README.md +31 -0
- package/adapters/copilot-instructions.md +24 -0
- package/adapters/cursor.fde.mdc +29 -0
- package/bin/check.js +260 -0
- package/bin/fde.js +690 -0
- package/bin/install.js +220 -0
- package/hooks/hooks.json +40 -0
- package/hooks/pre-compact +66 -0
- package/hooks/run-hook.cmd +3 -0
- package/hooks/session-start +91 -0
- package/hooks/session-stop +86 -0
- package/package.json +52 -0
- package/skills/fde/SKILL.md +219 -0
- package/skills/fde/references/ai.md +91 -0
- package/skills/fde/references/artifacts.md +247 -0
- package/skills/fde/references/assumption-audit.md +77 -0
- package/skills/fde/references/audit.md +61 -0
- package/skills/fde/references/blast-radius.md +91 -0
- package/skills/fde/references/build.md +98 -0
- package/skills/fde/references/business-case.md +78 -0
- package/skills/fde/references/close.md +43 -0
- package/skills/fde/references/dashboard.md +40 -0
- package/skills/fde/references/debrief.md +36 -0
- package/skills/fde/references/debug.md +55 -0
- package/skills/fde/references/demo-prep.md +31 -0
- package/skills/fde/references/discover.md +163 -0
- package/skills/fde/references/exec-narrative.md +108 -0
- package/skills/fde/references/fintech.md +48 -0
- package/skills/fde/references/gov.md +47 -0
- package/skills/fde/references/handoff-engineering.md +139 -0
- package/skills/fde/references/healthcare.md +45 -0
- package/skills/fde/references/incremental-build.md +91 -0
- package/skills/fde/references/initiative-triage.md +78 -0
- package/skills/fde/references/land.md +75 -0
- package/skills/fde/references/multi-customer-ops.md +114 -0
- package/skills/fde/references/observability.md +103 -0
- package/skills/fde/references/options-analysis.md +81 -0
- package/skills/fde/references/pattern-extract.md +93 -0
- package/skills/fde/references/plan.md +108 -0
- package/skills/fde/references/qa-live.md +113 -0
- package/skills/fde/references/rescue.md +81 -0
- package/skills/fde/references/review.md +53 -0
- package/skills/fde/references/rollback-drill.md +102 -0
- package/skills/fde/references/scope-defense.md +71 -0
- package/skills/fde/references/security-audit.md +105 -0
- package/skills/fde/references/ship.md +121 -0
- package/skills/fde/references/sketch.md +40 -0
- package/skills/fde/references/stakeholder-radar.md +68 -0
- package/skills/fde/references/status.md +30 -0
- package/skills/fde/references/test-on-legacy.md +108 -0
- package/skills/fde/references/trust-engineering.md +100 -0
- package/skills/fde/references/use-case-scoring.md +70 -0
- package/templates/.fde/README.md +13 -0
- package/templates/.fde/brief.md +8 -0
- package/templates/.fde/context.md +14 -0
- package/templates/.fde/decisions.md +18 -0
- package/templates/.fde/delivery.md +7 -0
- package/templates/.fde/reality.md +7 -0
- package/templates/.fde/retrospectives/.gitkeep +0 -0
- package/templates/.fde/risks.md +5 -0
- package/templates/.fde/stakeholders.md +10 -0
- package/templates/.fde/success.md +7 -0
- package/templates/.fde/terrain.md +7 -0
- package/templates/.fde/trust-profile.md +11 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# qa-live - test it like a user, not like an engineer
|
|
2
|
+
|
|
3
|
+
**Enter when:** a feature is built and needs to be verified from the user's perspective, the team says "it works on my machine," a demo is coming and the feature hasn't been clicked through, or a post-deploy smoke test is needed.
|
|
4
|
+
|
|
5
|
+
**Read first:** `delivery.md` (what was built), `decisions.md` (acceptance criteria), `success.md` (what the customer expects to see), `context.md`.
|
|
6
|
+
|
|
7
|
+
Unit tests prove the code works. QA proves the *feature* works - from the user's chair, on a real browser, with real data patterns. The FDE who ships a feature that passes all tests but fails the first user click has shipped a defect.
|
|
8
|
+
|
|
9
|
+
## Method (you do this work)
|
|
10
|
+
|
|
11
|
+
**1. Write the test script from the user's story, not the code.**
|
|
12
|
+
|
|
13
|
+
Start with `success.md` and `decisions.md` acceptance criteria. For each acceptance criterion, write the human steps:
|
|
14
|
+
|
|
15
|
+
```markdown
|
|
16
|
+
## Test: User can retry a failed payment
|
|
17
|
+
Precondition: User has a failed payment in their history
|
|
18
|
+
Steps:
|
|
19
|
+
1. Navigate to payment history
|
|
20
|
+
2. Click the failed payment
|
|
21
|
+
3. Click "Retry payment"
|
|
22
|
+
4. Confirm the retry dialog
|
|
23
|
+
5. Observe the result
|
|
24
|
+
Expected: Payment processes successfully, status updates to "Completed"
|
|
25
|
+
Also check: Error message if retry fails, loading state during processing
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**2. The five perspectives.** Test each feature from five angles that unit tests can't reach:
|
|
29
|
+
|
|
30
|
+
| Perspective | What to test | Common FDE finding |
|
|
31
|
+
|------------|-------------|-------------------|
|
|
32
|
+
| **Happy path** | Does the main flow work end-to-end? | Works locally, fails with real data volumes |
|
|
33
|
+
| **Error path** | What happens when things go wrong? | Error messages are developer-facing, not user-facing |
|
|
34
|
+
| **Edge cases** | Empty states, max lengths, special characters, concurrent users | The empty state shows "undefined" instead of a helpful message |
|
|
35
|
+
| **Performance** | Is it fast enough for real use? | Works fine with 10 records, unusable with 10,000 |
|
|
36
|
+
| **Accessibility** | Can it be used with keyboard only? Does the screen reader make sense? | Tab order is broken, focus traps in modals |
|
|
37
|
+
|
|
38
|
+
**3. Real browser testing.** Open the actual application in a browser and click through:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
Before each test:
|
|
42
|
+
- Clear relevant caches/state
|
|
43
|
+
- Use realistic test data (not "test test test")
|
|
44
|
+
- Note the browser and viewport size
|
|
45
|
+
|
|
46
|
+
During each test:
|
|
47
|
+
- Open DevTools console - watch for errors
|
|
48
|
+
- Open DevTools network tab - watch for failed requests
|
|
49
|
+
- Time the critical actions (user-perceivable latency)
|
|
50
|
+
|
|
51
|
+
After each test:
|
|
52
|
+
- Screenshot the result (before/after when relevant)
|
|
53
|
+
- Note any console errors even if the test "passed"
|
|
54
|
+
- Note any UX friction even if technically correct
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**4. The health score.** Rate the feature across five dimensions, 1–5:
|
|
58
|
+
|
|
59
|
+
| Dimension | 1 (broken) | 3 (acceptable) | 5 (polished) |
|
|
60
|
+
|-----------|-----------|----------------|--------------|
|
|
61
|
+
| **Functionality** | Critical path fails | Happy path works, errors unhandled | All paths work, errors graceful |
|
|
62
|
+
| **Performance** | >5s load time | <2s load time | <500ms load time, no layout shifts |
|
|
63
|
+
| **Error handling** | Crashes or shows stack trace | Shows error message | Shows actionable error with recovery option |
|
|
64
|
+
| **Data handling** | Corrupts or loses data | Handles normal data correctly | Handles edge cases (empty, large, special chars) |
|
|
65
|
+
| **User experience** | Confusing or broken layout | Functional but rough | Intuitive, consistent with the rest of the app |
|
|
66
|
+
|
|
67
|
+
**Overall health = average of five scores.** Below 3.0 → not ready to ship. 3.0–4.0 → shippable with known issues. 4.0+ → confident to demo.
|
|
68
|
+
|
|
69
|
+
**5. The bug report format.** For each issue found:
|
|
70
|
+
|
|
71
|
+
```markdown
|
|
72
|
+
## Bug: <one-line summary>
|
|
73
|
+
Severity: critical / high / medium / low
|
|
74
|
+
Steps to reproduce:
|
|
75
|
+
1. <exact steps>
|
|
76
|
+
2. <exact steps>
|
|
77
|
+
Expected: <what should happen>
|
|
78
|
+
Actual: <what happened>
|
|
79
|
+
Evidence: <screenshot, console error, network request>
|
|
80
|
+
Environment: <browser, viewport, data state>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**6. Re-verify after fixes.** After each bug is fixed:
|
|
84
|
+
- Re-run the exact reproduction steps
|
|
85
|
+
- Check that the fix didn't break adjacent functionality
|
|
86
|
+
- Update the health score
|
|
87
|
+
- Screenshot the fixed state
|
|
88
|
+
|
|
89
|
+
## Artifact
|
|
90
|
+
|
|
91
|
+
**`delivery.md`** - the health score and test results for each shipped feature:
|
|
92
|
+
```markdown
|
|
93
|
+
## QA: <feature name> - <date>
|
|
94
|
+
Health score: 4.2 / 5.0
|
|
95
|
+
Tests run: 8 passed, 1 failed (fixed), 1 known issue (low severity)
|
|
96
|
+
Bugs found: 2 (1 fixed, 1 deferred to next sprint)
|
|
97
|
+
Ready to demo: YES / NO
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**`decisions.md`** - bugs deferred with rationale (why it's acceptable to ship with this known issue).
|
|
101
|
+
|
|
102
|
+
## Checkpoint
|
|
103
|
+
|
|
104
|
+
One line: "Feature tested from user perspective. Health score: <N>/5. <N> bugs found, <N> fixed, <N> deferred. Ready to demo: yes/no." If not ready: the specific blocker.
|
|
105
|
+
|
|
106
|
+
## Principles
|
|
107
|
+
|
|
108
|
+
- Test from the user's chair, not the developer's IDE.
|
|
109
|
+
- Real browser, real data patterns, real network conditions.
|
|
110
|
+
- Console errors during a "passing" test are still findings.
|
|
111
|
+
- Health score below 3.0 = not ready to ship, regardless of test suite.
|
|
112
|
+
- Every bug gets a reproduction recipe, not a description.
|
|
113
|
+
- A feature that passes all unit tests but fails the first click is a defect.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# rescue - production fire, trust fire, or wrong-brief mid-build
|
|
2
|
+
|
|
3
|
+
**Enter when:** production is down, something's bleeding - OR a stakeholder went quiet, confidence is slipping, or three weeks into the build the brief turned out to be wrong. Trust fires get the same urgency as outages.
|
|
4
|
+
|
|
5
|
+
**Read first:** `context.md`, `risks.md` only. Pull specific module context only once you know what you're looking at.
|
|
6
|
+
|
|
7
|
+
First move - one disambiguator if unclear: **"Is production broken right now, or is this a trust/alignment problem?"**
|
|
8
|
+
|
|
9
|
+
## A. Technical fire (you do this work)
|
|
10
|
+
|
|
11
|
+
Open by narrowing time, like a human: "Walk me through the last couple hours - deploys, config, anything that moved." Something always changed; "nothing changed" means nobody's looked:
|
|
12
|
+
```bash
|
|
13
|
+
git log --since="6 hours ago" --format="%ad %an %s" --date=relative
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
**The sequence:**
|
|
17
|
+
1. **Stabilise first.** Roll back? Disable the broken path? Route around it? Buy time before diagnosing. The instinct to fix fast causes the second incident.
|
|
18
|
+
2. **Name the unknowns.** "We don't know if the queue is corrupted / if this hits all users / if the cache is stale." Written down. Named unknowns are safer than assumed knowns.
|
|
19
|
+
3. **Assume maximum blast radius.** The unrecognised integration in the stack trace is load-bearing until proven otherwise.
|
|
20
|
+
4. **Minimum safe change.** Often a read-only query first - observe before acting. Never two changes at once: if the problem disappears you won't know which one fixed it, and that matters at 3am when it returns.
|
|
21
|
+
5. **One hypothesis at a time.** "If X, then Y should produce Z." Test, document, next.
|
|
22
|
+
6. **Instrument before touching.** A change without observability is a change without evidence.
|
|
23
|
+
|
|
24
|
+
**Tell the FDE three things, nothing else** (they need to act): what to do right now to stop it worsening · most likely cause on current evidence · what must not be touched yet.
|
|
25
|
+
|
|
26
|
+
## B. Trust fire (you coach - calm, no panic coding)
|
|
27
|
+
|
|
28
|
+
**Signals:** a stakeholder stops responding or routes around the FDE · meetings shorten, decisions defer · "is the timeline still realistic?" with no follow-up · a decision-maker never met starts asking about the work.
|
|
29
|
+
|
|
30
|
+
**The read:** the stakeholder who goes quiet is not losing interest - **they are escalating above you.** Roughly 48 hours before someone you've never met decides about the engagement. Respond same-day.
|
|
31
|
+
|
|
32
|
+
**The move:** do NOT push harder on delivery - more commits won't warm a cold sponsor. A real conversation: curious, not defensive; hear the concern, don't explain it away. Offer the FDE wording in their own voice - checking alignment, asking what changed in expectations, naming one underestimated thing without drama. Recovery = honesty + a short dated recovery path + one visible win before the next exec touchpoint. Log what was said and agreed in `decisions.md` before the day ends.
|
|
33
|
+
|
|
34
|
+
## C. Wrong brief, mid-build
|
|
35
|
+
|
|
36
|
+
The most politically dangerous moment in FDE work: visible progress toward the wrong thing. Never absorb it silently.
|
|
37
|
+
|
|
38
|
+
1. **Stop the work.** Every further line builds on a known-wrong foundation.
|
|
39
|
+
2. **Write the evidence, not the interpretation.** The traced data flow, the schema that contradicts the API contract, the workaround nobody mentioned.
|
|
40
|
+
3. **Conversation before the day ends.** Not email: "We need twenty minutes. We found something important." Waiting reads as concealment.
|
|
41
|
+
4. **Evidence before recommendations.** A customer who reaches the conclusion themselves owns the reset.
|
|
42
|
+
5. **Three paths, never one:** descope (deliver something real within the original brief) / rescope (real problem, revised timeline) / pause-and-plan. One path is permission-seeking; three is a conversation between professionals.
|
|
43
|
+
6. **Reset in writing** - update `success.md` and `reality.md`, get explicit acknowledgement - before building resumes.
|
|
44
|
+
|
|
45
|
+
Customers remember who told them the truth before it cost them money.
|
|
46
|
+
|
|
47
|
+
## D. Pivot - the whole direction changed
|
|
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.
|
|
50
|
+
|
|
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
|
+
|
|
53
|
+
**The pivot protocol:**
|
|
54
|
+
1. **Acknowledge immediately.** Don't pretend the old brief still applies. "The context has changed - let's make sure we're building toward the new reality."
|
|
55
|
+
2. **Protect what's already delivered.** Shipped value is not un-shipped by a pivot. Name it: "Here's what's live and working. That value is real regardless of direction."
|
|
56
|
+
3. **Assess salvageability.** What from the current work applies to the new direction? What's dead? What can be repurposed? Present this honestly - don't stretch to make everything fit.
|
|
57
|
+
4. **Three paths (same pattern as wrong-brief):**
|
|
58
|
+
- **Redirect** - current work pivots to serve the new priority (minimal waste).
|
|
59
|
+
- **Pause** - freeze current scope, start fresh discovery on new direction.
|
|
60
|
+
- **Graceful close** - deliver what's done, document everything, hand off cleanly.
|
|
61
|
+
5. **Reset the artifacts.** Update `success.md` (new definition of success), `reality.md` (new context), `brief.md` (new direction). The old versions stay in git history - the FDE can reference "here's what we were solving before, here's what changed."
|
|
62
|
+
6. **Re-earn trust fast.** A pivot is a trust moment. The FDE who smoothly redirects gains credibility. The FDE who fights the pivot or pretends nothing changed loses it. Deliver one visible win in the new direction within the first week.
|
|
63
|
+
|
|
64
|
+
**Commercial awareness:** A pivot may change the SOW. Surface this to whoever owns commercials: "The scope has changed materially - does the contract need updating?" Don't assume; don't ignore.
|
|
65
|
+
|
|
66
|
+
## Artifact
|
|
67
|
+
|
|
68
|
+
**`chaos-log.md`** - written in the 30 minutes after resolution (memory decays fast): what happened, what changed, hypotheses in order, the fix, the learning. **`risks.md`** - new risks the crisis revealed. **`decisions.md`** - trust-fire conversations, agreements, and pivot decisions. Update `reality.md`/`terrain.md` if the crisis or pivot disproved them.
|
|
69
|
+
|
|
70
|
+
## Checkpoint
|
|
71
|
+
|
|
72
|
+
Stable + log written + one question answered with the FDE: does this change what we thought we knew? If yes, the relevant artifact gets updated now, not "later."
|
|
73
|
+
|
|
74
|
+
## Principles
|
|
75
|
+
|
|
76
|
+
- Stabilise before diagnosing.
|
|
77
|
+
- Named unknowns beat assumed knowns. Minimum safe change, one hypothesis.
|
|
78
|
+
- Never production without a tested rollback - even in a crisis.
|
|
79
|
+
- A trust fire is a same-day fire.
|
|
80
|
+
- The chaos log is written before the day ends.
|
|
81
|
+
- A pivot is a trust moment - redirect smoothly, don't fight the new reality.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# review - two stages, always in order
|
|
2
|
+
|
|
3
|
+
**Enter when:** a change needs review before merge - "is this safe," "does it match what we agreed."
|
|
4
|
+
|
|
5
|
+
**Read first:** `context.md`, `decisions.md`, `trust-profile.md`, `terrain.md`. Not `reality.md`/`stakeholders.md` - irrelevant to reviewing code against agreed scope.
|
|
6
|
+
|
|
7
|
+
Engagement review ≠ product-company review: a codebase you don't own, systems you can't fully see, a customer who can't afford a bad release.
|
|
8
|
+
|
|
9
|
+
## Pre-flight: is this reviewable?
|
|
10
|
+
|
|
11
|
+
Thousands of lines or dozens of unrelated files → **stop**, recommend the split in `decisions.md`, route to plan. Review loops fail on huge diffs. Ask: one agreed task, or did scope merge mid-build?
|
|
12
|
+
|
|
13
|
+
## Stage 1 - did we build what we agreed? (you do this work)
|
|
14
|
+
|
|
15
|
+
Check the diff against `decisions.md` - what was *explicitly decided*, not what seems right:
|
|
16
|
+
- Matches agreed scope?
|
|
17
|
+
- Any sacred system from `trust-profile.md` touched?
|
|
18
|
+
- Any sensitive data newly in scope?
|
|
19
|
+
- Rollback path defined before build still honoured?
|
|
20
|
+
|
|
21
|
+
**Stage 1 fails → stop.** Quality review on out-of-scope code is wasted work. Record the specific mismatch in `decisions.md`.
|
|
22
|
+
|
|
23
|
+
## Stage 2 - is it safe to live with?
|
|
24
|
+
|
|
25
|
+
Five dimensions, line-specific ("line 47 fails under concurrent writes - no lock"), never "could be better":
|
|
26
|
+
|
|
27
|
+
- **Correctness** - does what it says; edge cases; error paths traced.
|
|
28
|
+
- **Blast radius** - what breaks at 2am; downstream systems; failure mode loud (errors surface) or silent (data corrupts over time)?
|
|
29
|
+
- **Security** - input validation at boundaries; no secrets in logs; no new attack surface; `trust-profile.md` sensitivity classes respected.
|
|
30
|
+
- **Rollback** - revertible in under 5 minutes, documented? "We'd need a data migration to roll back" is a blocker.
|
|
31
|
+
- **AI policy & components** - human-review requirements honoured; model output treated as untrusted until validated; fallback exists; inputs/outputs logged; outputs bounded so a hallucination can't cascade; in regulated environments a human can explain why the AI decided X (compliance requirement, not preference).
|
|
32
|
+
|
|
33
|
+
**Structural pass on AI-heavy or data-touching changes:** migrations reversible · destructive SQL guarded · PII/PCI/PHI paths match `trust-profile.md` · side effects (flags, webhooks, emails, jobs) fire only when intended · magic strings that break on rename · new behaviour has a test or an explicit reason it can't yet. One line problem, one line fix.
|
|
34
|
+
|
|
35
|
+
## The review-fix loop (until clean)
|
|
36
|
+
|
|
37
|
+
1. Read the full diff before commenting.
|
|
38
|
+
2. Verdicts: **Stage 1: Pass / Blocked (reason)** · **Stage 2: Pass / Concerns (line-specific)**.
|
|
39
|
+
3. Fix only **real** findings tied to this change - no drive-by refactors. Reject false positives with one sentence why.
|
|
40
|
+
4. Add or update a test per bug found where possible.
|
|
41
|
+
5. Re-run tests/typechecks - state what ran.
|
|
42
|
+
6. Re-review. Repeat until Pass/Pass or a human must decide scope/product.
|
|
43
|
+
|
|
44
|
+
## Artifact
|
|
45
|
+
|
|
46
|
+
**`decisions.md`** - each cycle logged: what was reviewed, flagged, fixed, verified. Stage 1 failures recorded with the specific mismatch.
|
|
47
|
+
|
|
48
|
+
## Principles
|
|
49
|
+
|
|
50
|
+
- Stage 1 before Stage 2. Wrong scope reviewed well is still wrong scope.
|
|
51
|
+
- Specific or silent - vague concerns waste everyone's time.
|
|
52
|
+
- No rollback path = first finding.
|
|
53
|
+
- A clean review proves this diff is safe as agreed - not that the feature was right.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# rollback-drill - test the escape route before you need it
|
|
2
|
+
|
|
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
|
+
|
|
5
|
+
**Read first:** `delivery.md` (the deployment record), `terrain.md`, `trust-profile.md` (for change-approval requirements), `context.md`.
|
|
6
|
+
|
|
7
|
+
"We can always revert" is the most dangerous sentence in deployment. A rollback plan that hasn't been tested is a wish, not a plan. The drill proves the escape route works before you need it at 2am.
|
|
8
|
+
|
|
9
|
+
## Method (you do this work)
|
|
10
|
+
|
|
11
|
+
**1. Map the rollback path for every change type:**
|
|
12
|
+
|
|
13
|
+
| Change type | Rollback method | Complication | Test |
|
|
14
|
+
|-------------|----------------|--------------|------|
|
|
15
|
+
| **Code deploy** | Revert the PR / redeploy previous version | Feature flags, cache invalidation | Deploy previous version to staging, verify function |
|
|
16
|
+
| **Database migration** | Down migration script | Irreversible migrations (column drops, data transforms) | Run down migration on staging copy |
|
|
17
|
+
| **Config change** | Restore previous config | Propagation delay, dependent service restarts | Flip config, verify all services pick it up |
|
|
18
|
+
| **Infrastructure** | Terraform/Pulumi rollback or manual | State drift, dependent resources | Plan the rollback, review the diff |
|
|
19
|
+
| **Data backfill** | Restore from backup or reverse script | Mixed old/new data states | Run reverse on a 100-row sample |
|
|
20
|
+
|
|
21
|
+
**2. Identify the irreversible components.** Some changes can't be rolled back:
|
|
22
|
+
|
|
23
|
+
- Column drops after data migration
|
|
24
|
+
- Encryption key rotations after old key is destroyed
|
|
25
|
+
- External API version deprecations
|
|
26
|
+
- Emails/notifications already sent
|
|
27
|
+
- Published API changes consumed by third parties
|
|
28
|
+
|
|
29
|
+
For each irreversible component: **what's the compensating action?** Not "undo" but "what do we do to recover the same effect?"
|
|
30
|
+
|
|
31
|
+
**3. Run the drill.** On staging or a test environment - never on production:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
DRILL PROTOCOL:
|
|
35
|
+
1. Deploy the change (confirm it works)
|
|
36
|
+
2. Start a timer
|
|
37
|
+
3. Execute the documented rollback procedure - exactly as written, no shortcuts
|
|
38
|
+
4. Measure: time to complete, services affected, data state after
|
|
39
|
+
5. Verify: can users still do the critical path?
|
|
40
|
+
6. Record: what worked, what was unclear, what failed
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**4. The drill report.** Honest, specific, actionable:
|
|
44
|
+
|
|
45
|
+
```markdown
|
|
46
|
+
## Rollback drill - <date>
|
|
47
|
+
Change: <what was deployed>
|
|
48
|
+
Environment: staging
|
|
49
|
+
Rollback method: <what was executed>
|
|
50
|
+
Time to rollback: <minutes:seconds>
|
|
51
|
+
Result: PASS / FAIL / PARTIAL
|
|
52
|
+
|
|
53
|
+
What worked:
|
|
54
|
+
- Code revert completed in 45s
|
|
55
|
+
- Feature flag disabled correctly
|
|
56
|
+
|
|
57
|
+
What didn't:
|
|
58
|
+
- Database down migration left orphan rows in junction table
|
|
59
|
+
- Cache took 3 minutes to invalidate (stale data served)
|
|
60
|
+
|
|
61
|
+
Actions before production deploy:
|
|
62
|
+
- [ ] Fix down migration to clean junction table
|
|
63
|
+
- [ ] Add cache-bust step to rollback procedure
|
|
64
|
+
- [ ] Verify cache invalidation time is acceptable
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**5. The "acceptable rollback time" conversation.** With the FDE and the team:
|
|
68
|
+
|
|
69
|
+
> "If this deploy fails in production, how long can the system be in a degraded state before it's a business problem?"
|
|
70
|
+
|
|
71
|
+
| Answer | Implication |
|
|
72
|
+
|--------|-------------|
|
|
73
|
+
| "Minutes" | Automated rollback trigger needed - human decision loop is too slow |
|
|
74
|
+
| "An hour" | Manual rollback is acceptable if the procedure is tested and documented |
|
|
75
|
+
| "A day" | Gradual rollback is fine - feature flag off, monitor, clean up next morning |
|
|
76
|
+
| "It can't fail" | Blue/green deployment with instant traffic switch - test both environments |
|
|
77
|
+
|
|
78
|
+
**6. Change-approval environments (CAB).** In regulated industries:
|
|
79
|
+
|
|
80
|
+
- The rollback procedure is part of the change ticket - filed before the approval window.
|
|
81
|
+
- The drill evidence goes with the change request: "Rollback tested on <date>, completed in <time>, no issues."
|
|
82
|
+
- A drill that fails → the change ticket isn't ready. Better to discover that now than during the CAB.
|
|
83
|
+
|
|
84
|
+
## Artifact
|
|
85
|
+
|
|
86
|
+
**`delivery.md`** - the drill report, attached to the deployment record for this change. The evidence that the rollback works.
|
|
87
|
+
|
|
88
|
+
**`risks.md`** - any irreversible components identified, with the compensating action.
|
|
89
|
+
|
|
90
|
+
**`decisions.md`** - if the drill failed and the deployment is delayed: what failed, the fix, the revised timeline.
|
|
91
|
+
|
|
92
|
+
## Checkpoint
|
|
93
|
+
|
|
94
|
+
One statement: "Rollback tested on staging. Time: <N minutes>. Result: <pass/fail>. Production deploy is / is not ready." If not ready: the specific blocker and when it'll be resolved.
|
|
95
|
+
|
|
96
|
+
## Principles
|
|
97
|
+
|
|
98
|
+
- A rollback plan that hasn't been tested is a wish.
|
|
99
|
+
- Time the drill. If it takes 45 minutes on staging, it takes 90 in production at 2am.
|
|
100
|
+
- Identify the irreversible components and name the compensating action.
|
|
101
|
+
- The drill report is evidence for the change ticket and the team's confidence.
|
|
102
|
+
- A drill that fails is a success - you found the problem before production did.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# scope-defense - holding the line without losing the relationship
|
|
2
|
+
|
|
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
|
+
|
|
5
|
+
**Read first:** `success.md` (the agreed boundary), `decisions.md`, `context.md`. Load `stakeholders.md` to know who's asking and their signal.
|
|
6
|
+
|
|
7
|
+
Scope creep is the leading cause of FDE engagement failure - not technical complexity, not timeline pressure. It's silent: no single request feels unreasonable, but twenty reasonable requests add three months. The skill is saying "that's phase two" without the customer hearing "no."
|
|
8
|
+
|
|
9
|
+
## Method (you do this work)
|
|
10
|
+
|
|
11
|
+
**1. Detect before it compounds.** Three patterns that signal creep before it's named:
|
|
12
|
+
|
|
13
|
+
| Pattern | What it sounds like | What's actually happening |
|
|
14
|
+
|---------|--------------------|--------------------------|
|
|
15
|
+
| **The friendly addition** | "While you're in there, could you also…" | Adjacent work getting absorbed without timeline adjustment |
|
|
16
|
+
| **The evolved requirement** | "Oh, what I actually meant was…" | The original scope was never clear enough - `success.md` needs updating |
|
|
17
|
+
| **The stakeholder swap** | A new person starts requesting features the original sponsor didn't | Power shifted; the real scope is being rewritten informally |
|
|
18
|
+
|
|
19
|
+
**2. The scope receipt.** Every request gets logged with its origin and cost - not as bureaucracy, but as evidence for the conversation that's coming:
|
|
20
|
+
|
|
21
|
+
```markdown
|
|
22
|
+
## Scope change - <date>
|
|
23
|
+
Requested by: <who>
|
|
24
|
+
Request: <what, in their words>
|
|
25
|
+
Impact: <hours/days added, what gets pushed>
|
|
26
|
+
Status: absorbed / deferred to phase 2 / needs conversation
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Log via `fde log decision "scope change: <summary> - requested by <who>, impact: <estimate>"` or direct append to `decisions.md`.
|
|
30
|
+
|
|
31
|
+
**3. The three-bucket response.** Never say "no" - say "here's where it fits":
|
|
32
|
+
|
|
33
|
+
| Bucket | What you say | When to use |
|
|
34
|
+
|--------|-------------|-------------|
|
|
35
|
+
| **This phase** | "That fits - I'll add it to the current plan. Timeline stays the same." | The request is small and genuinely within the agreed scope |
|
|
36
|
+
| **Next phase** | "That's real - let me capture it properly so it doesn't get lost. It's phase-two work because <reason>." | The request is valid but adds to the timeline |
|
|
37
|
+
| **Separate engagement** | "That's a different problem - it deserves its own brief and its own timeline." | The request is a new project wearing a small-ask costume |
|
|
38
|
+
|
|
39
|
+
**The key phrase: "Let me place it."** Not "that's out of scope" (adversarial) or "sure" (absorbed). "Let me place it" signals you're taking it seriously while buying time to assess the real cost.
|
|
40
|
+
|
|
41
|
+
**4. The accumulation conversation.** When the scope receipts show a pattern - typically 3–5 absorbed changes - the FDE needs a conversation with the sponsor:
|
|
42
|
+
|
|
43
|
+
Frame it as **protection, not complaint:**
|
|
44
|
+
> "We've absorbed five changes since the original agreement. Each one made sense individually. Together, they've added roughly two weeks. I want to make sure the timeline expectation still matches - should we adjust the delivery date, or reprioritise to keep the original date?"
|
|
45
|
+
|
|
46
|
+
Evidence-based: point to `decisions.md` scope receipts with dates and requesters. The sponsor who sees the pattern is an ally; the sponsor who discovers the delay at the end is a problem.
|
|
47
|
+
|
|
48
|
+
**5. The commercial boundary.** In paid engagements, scope creep silently moves billing and liability:
|
|
49
|
+
|
|
50
|
+
- If the engagement is time-and-materials: scope creep is the client's money, but flag it - they deserve to know what they're buying.
|
|
51
|
+
- If the engagement is fixed-price: every absorbed scope change is a gift the FDE's company didn't agree to. Surface it to whoever owns the commercials.
|
|
52
|
+
- If the engagement has a success fee: scope changes that move the success criteria affect compensation. Log it.
|
|
53
|
+
|
|
54
|
+
## Artifact
|
|
55
|
+
|
|
56
|
+
**`decisions.md`** - scope receipts, dated and attributed. The running record the accumulation conversation references.
|
|
57
|
+
|
|
58
|
+
**`success.md`** - updated ONLY when a scope change is explicitly agreed. Never silently expanded. Each update: what changed, who agreed, date.
|
|
59
|
+
|
|
60
|
+
## Checkpoint
|
|
61
|
+
|
|
62
|
+
Weekly check: count the scope receipts since last conversation. Three or more unaddressed → recommend the accumulation conversation to the FDE. Zero → "scope holding, `success.md` current."
|
|
63
|
+
|
|
64
|
+
## Principles
|
|
65
|
+
|
|
66
|
+
- "Let me place it" is the phrase. Not "no," not "sure."
|
|
67
|
+
- Every scope change gets a receipt. The receipt is the evidence.
|
|
68
|
+
- Three unaddressed scope changes → accumulation conversation.
|
|
69
|
+
- Scope creep kills engagements that technical failure couldn't.
|
|
70
|
+
- `success.md` is a contract - update it explicitly or defend it.
|
|
71
|
+
- The FDE who absorbs everything is liked for three weeks and blamed for three months.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# security-audit - find the holes before someone else does
|
|
2
|
+
|
|
3
|
+
**Enter when:** the engagement touches auth, payments, user data, or external integrations; the customer mentions compliance (SOC2, PCI, HIPAA); a new API endpoint is being shipped; or the FDE is asked "is this secure?"
|
|
4
|
+
|
|
5
|
+
**Read first:** `trust-profile.md` (data classification, AI policy, compliance requirements), `terrain.md`, `context.md`. Load the relevant regulated overlay (fintech/healthcare/gov) if the signal is present.
|
|
6
|
+
|
|
7
|
+
On an FDE engagement, security mistakes are twice as dangerous: you break someone else's system, with their users' data, under their compliance obligations. The FDE who finds the vulnerability before production earns trust that lasts the entire engagement.
|
|
8
|
+
|
|
9
|
+
## Method (you do this work)
|
|
10
|
+
|
|
11
|
+
**1. Threat model in five minutes.** Not a ceremony - five questions before looking at code:
|
|
12
|
+
|
|
13
|
+
| Question | What it reveals |
|
|
14
|
+
|----------|----------------|
|
|
15
|
+
| Where does untrusted data enter? | HTTP requests, file uploads, webhooks, LLM outputs, message queues |
|
|
16
|
+
| What's worth stealing? | Credentials, PII, payment data, API keys, session tokens |
|
|
17
|
+
| What's worth breaking? | Auth system, payment flow, admin actions, data integrity |
|
|
18
|
+
| Who's the attacker? | External (internet), internal (employee), adjacent (other tenant), automated (bot) |
|
|
19
|
+
| What's the worst realistic outcome? | Data breach, financial loss, regulatory fine, reputation damage |
|
|
20
|
+
|
|
21
|
+
Write the answers before scanning code. The threat model tells you where to look; code scanning without a threat model is reading every room in a building instead of checking the doors.
|
|
22
|
+
|
|
23
|
+
**2. The STRIDE pass.** For each trust boundary (where data crosses from untrusted to trusted):
|
|
24
|
+
|
|
25
|
+
| Threat | Check | Common FDE finding |
|
|
26
|
+
|--------|-------|-------------------|
|
|
27
|
+
| **Spoofing** | Can someone impersonate a user/service? | Missing auth on internal endpoints ("it's behind the VPN" is not auth) |
|
|
28
|
+
| **Tampering** | Can data be altered in transit or at rest? | Unparameterised SQL, unsigned webhooks, client-side validation as sole gate |
|
|
29
|
+
| **Repudiation** | Can an action be denied later? | No audit log on admin actions, no timestamp on state changes |
|
|
30
|
+
| **Information disclosure** | Can data leak? | Stack traces in production errors, PII in logs, verbose error messages |
|
|
31
|
+
| **Denial of service** | Can it be overwhelmed? | No rate limiting on auth endpoints, unbounded file uploads, no pagination |
|
|
32
|
+
| **Elevation of privilege** | Can a user gain access they shouldn't? | IDOR (changing user ID in URL), missing role checks on endpoints |
|
|
33
|
+
|
|
34
|
+
**3. The automated scan.** Run these - they catch what manual review misses:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# Secrets in code (repeat --include per extension)
|
|
38
|
+
grep -rnE "(api[_-]?key|secret|password|token|private[_-]?key)\s*[:=]\s*['\"][^'\"]{8,}" \
|
|
39
|
+
--include="*.js" --include="*.ts" --include="*.py" --include="*.env" \
|
|
40
|
+
--include="*.yaml" --include="*.json" . | grep -vE "example|template|test|mock" | head -20
|
|
41
|
+
|
|
42
|
+
# Dependency vulnerabilities
|
|
43
|
+
npm audit 2>/dev/null || pip audit 2>/dev/null || echo "no package audit available"
|
|
44
|
+
|
|
45
|
+
# SQL injection patterns
|
|
46
|
+
grep -rnE "(SELECT|INSERT|UPDATE|DELETE).*\+.*\"|f['\"].*{.*}.*SELECT" \
|
|
47
|
+
--include="*.js" --include="*.ts" --include="*.py" . | head -10
|
|
48
|
+
|
|
49
|
+
# Dangerous patterns
|
|
50
|
+
grep -rnE "eval\(|innerHTML\s*=|document\.write\(|exec\(|__import__" \
|
|
51
|
+
--include="*.js" --include="*.ts" --include="*.py" . | head -10
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**4. The AI security check.** If the system uses AI/LLM components:
|
|
55
|
+
|
|
56
|
+
| Check | Finding if yes |
|
|
57
|
+
|-------|---------------|
|
|
58
|
+
| Is model output used in SQL, shell commands, or HTML without sanitisation? | Injection via prompt - treat model output as untrusted input |
|
|
59
|
+
| Is the system prompt relied on as a security boundary? | Prompt injection bypasses it - enforce permissions in code |
|
|
60
|
+
| Are secrets or cross-tenant data in the context window? | Data leakage via prompt extraction |
|
|
61
|
+
| Are tool/agent permissions scoped? | Excessive agency - model can take actions it shouldn't |
|
|
62
|
+
| Are token/rate/recursion limits set? | Unbounded consumption or infinite loops |
|
|
63
|
+
|
|
64
|
+
**5. Classify findings by severity and action:**
|
|
65
|
+
|
|
66
|
+
| Severity | Criteria | Action |
|
|
67
|
+
|----------|----------|--------|
|
|
68
|
+
| **Critical** | Exploitable now, real data at risk | Stop other work. Fix before next merge. |
|
|
69
|
+
| **High** | Exploitable with effort, or compliance violation | Fix this phase. Track in `risks.md`. |
|
|
70
|
+
| **Medium** | Defense-in-depth gap, no immediate exploit | Log it. Fix when the module is next touched. |
|
|
71
|
+
| **Low** | Best practice gap, no exploit path | Note for the handoff document. |
|
|
72
|
+
|
|
73
|
+
**6. Present findings as protection, not criticism.**
|
|
74
|
+
|
|
75
|
+
The internal team built this system under constraints. Frame findings as shared wins:
|
|
76
|
+
|
|
77
|
+
> "Found three endpoints without rate limiting - adding that now prevents the bot attack that hit [company in their industry] last quarter. Here's the fix."
|
|
78
|
+
|
|
79
|
+
Not: "Your auth is broken." Even if it is.
|
|
80
|
+
|
|
81
|
+
## Artifact
|
|
82
|
+
|
|
83
|
+
**`risks.md`** - each finding with severity, evidence, remediation, and status:
|
|
84
|
+
```markdown
|
|
85
|
+
## Security finding: <title> - <severity>
|
|
86
|
+
Where: <file:line or endpoint>
|
|
87
|
+
Evidence: <what you found>
|
|
88
|
+
Risk: <what an attacker could do>
|
|
89
|
+
Remediation: <specific fix>
|
|
90
|
+
Status: fixed / in-progress / logged-for-handoff
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**`trust-profile.md`** - update if new sensitive data paths, AI components, or compliance requirements were discovered.
|
|
94
|
+
|
|
95
|
+
## Checkpoint
|
|
96
|
+
|
|
97
|
+
Summary to the FDE: findings by severity count, the one critical/high finding that needs immediate attention (if any), and the overall security posture in one sentence. If no critical findings: "No exploitable issues found in this pass - next audit at <trigger>."
|
|
98
|
+
|
|
99
|
+
## Principles
|
|
100
|
+
|
|
101
|
+
- Threat model first, scan second. Know where to look before looking everywhere.
|
|
102
|
+
- Treat model output as untrusted input - always.
|
|
103
|
+
- Frame findings as protection, not criticism. The team built under constraints.
|
|
104
|
+
- Secrets in code outrank every other finding. Check first.
|
|
105
|
+
- A security audit with no findings either found nothing or didn't look hard enough - state which.
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# ship - production without surprises
|
|
2
|
+
|
|
3
|
+
**Enter when:** a slice is built, reviewed, and ready to deploy.
|
|
4
|
+
|
|
5
|
+
**Read first:** `context.md`, `delivery.md`. Load `trust-profile.md` if the deploy touches regulated data or needs an approval chain.
|
|
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.
|
|
8
|
+
|
|
9
|
+
## Method - readiness gate (score before touching the deploy button)
|
|
10
|
+
|
|
11
|
+
Score each dimension green/amber/red. This is the gate, not a suggestion:
|
|
12
|
+
|
|
13
|
+
| Dimension | Green | Amber | Red |
|
|
14
|
+
|-----------|-------|-------|-----|
|
|
15
|
+
| Tests | All pass on deploy branch | Flaky tests skipped with justification | Failures present or tests not run |
|
|
16
|
+
| Rollback | Tested end-to-end (not planned - TESTED) | Documented but untested | No rollback path defined |
|
|
17
|
+
| Sign-off | Stakeholder approval in `decisions.md` with date | Verbal approval, not logged | No approval sought |
|
|
18
|
+
| Runbook | Exists and someone other than you has read it | Exists but unreviewed | Missing |
|
|
19
|
+
| Monitoring | Alerts configured, owner named, dashboard live | Alerts configured, no named owner | No monitoring |
|
|
20
|
+
|
|
21
|
+
**Any RED = stop. Do not deploy. Fix the red dimension first.**
|
|
22
|
+
**2+ AMBER = sponsor conversation before deploying.** Present the ambers and get explicit "proceed" or "fix first."
|
|
23
|
+
|
|
24
|
+
Write the readiness score to `delivery.md` before deploying. The score is the evidence if anything goes wrong.
|
|
25
|
+
|
|
26
|
+
## Method - pre-flight (you verify each, confirmed not assumed)
|
|
27
|
+
|
|
28
|
+
- All tests pass - state the command and result.
|
|
29
|
+
- No hardcoded secrets/credentials (repeat `--include` per extension - brace globs silently match nothing):
|
|
30
|
+
```bash
|
|
31
|
+
grep -rnE "(api[_-]?key|secret|password|token)\s*[:=]\s*['\"][^'\"]{8,}" \
|
|
32
|
+
--include="*.js" --include="*.ts" --include="*.py" --include="*.env" \
|
|
33
|
+
--include="*.yaml" --include="*.json" . | grep -vE "example|template|test" | head
|
|
34
|
+
```
|
|
35
|
+
- DB migrations reversible.
|
|
36
|
+
- Rollback documented **and tested**.
|
|
37
|
+
- Monitoring alerts configured, someone watching.
|
|
38
|
+
- Team knows the deploy is happening.
|
|
39
|
+
- Not a Friday unless genuine emergency with someone on call.
|
|
40
|
+
- **Change approval (CAB) environments:** window open, ticket approved. In banking/healthcare/gov, deploying outside an approved window is a compliance finding even when the deploy succeeds. "We didn't know there was a CAB process" is not a defence - find out before the deploy date.
|
|
41
|
+
|
|
42
|
+
## Method - the deploy
|
|
43
|
+
|
|
44
|
+
**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.
|
|
45
|
+
|
|
46
|
+
**Programme-scale rollout (transformations)** - different problem from one service:
|
|
47
|
+
1. **Pilot** - one team, one use case; success metrics defined *before* it starts (after = fitting metrics to results).
|
|
48
|
+
2. **Limited release** - 3–5 teams, real load; this is where the failure modes the pilot hid show up.
|
|
49
|
+
3. **Broad release** - self-serve onboarding; if teams still need the FDE to start, onboarding isn't finished.
|
|
50
|
+
4. **Enterprise standard** - the FDE is no longer needed for this use case. That's the end state.
|
|
51
|
+
Straight from pilot to standard = a high-profile failure at scale.
|
|
52
|
+
|
|
53
|
+
## Method - after
|
|
54
|
+
|
|
55
|
+
Smoke tests against production. Verify the business metric moved the right way. Then **define the pulse before closing the laptop** - a deploy without a pulse is one you'll hear about only when it breaks:
|
|
56
|
+
|
|
57
|
+
1. **Metric:** the number that says it's working - "p99 on payment endpoint < 800ms", not "errors low."
|
|
58
|
+
2. **Frequency:** daily week one, weekly after, monthly when stable.
|
|
59
|
+
3. **Threshold:** the exact value that triggers incident response. Nobody knows the number → nobody acts until too late.
|
|
60
|
+
|
|
61
|
+
AI components: also define what *normal output* looks like and check a weekly sample of real production outputs - drift is technically-valid-but-wrong, and no exception will fire.
|
|
62
|
+
|
|
63
|
+
## Method - scale readiness (pilot proved it, now deploy enterprise-wide)
|
|
64
|
+
|
|
65
|
+
95% of AI pilots fail to reach production. The gap isn't technical - it's organizational, governance, and infrastructure readiness. This checklist determines whether the pilot is ready to scale.
|
|
66
|
+
|
|
67
|
+
**The scale-readiness gate (all must be YES before broad rollout):**
|
|
68
|
+
|
|
69
|
+
| Dimension | Question | Ready? |
|
|
70
|
+
|-----------|----------|--------|
|
|
71
|
+
| **Infra** | Can the system handle 10× current load without architectural change? | |
|
|
72
|
+
| **Ops** | Can someone other than the FDE operate it at 2am? (runbook exists, tested) | |
|
|
73
|
+
| **Data** | Is the data pipeline automated, not manual? Does it handle upstream schema changes? | |
|
|
74
|
+
| **Security** | Has infosec signed off for production data at scale? | |
|
|
75
|
+
| **Cost** | Is the cost model viable at 10× volume? (AI inference costs scale non-linearly) | |
|
|
76
|
+
| **Governance** | Is there an owner, a review cadence, and an escalation path? | |
|
|
77
|
+
| **Support** | Can users get help without the FDE? (docs, training, L1 support path) | |
|
|
78
|
+
| **Measurement** | Are success metrics automated and dashboarded, not manually calculated? | |
|
|
79
|
+
|
|
80
|
+
**If any dimension is "No":** that's the work before scaling. Name it, size it, put it in the plan. Scaling without readiness = a high-profile failure that kills the entire programme.
|
|
81
|
+
|
|
82
|
+
**The scale sequence:**
|
|
83
|
+
1. **Pilot** (1 team, controlled) → prove value, find failure modes
|
|
84
|
+
2. **Limited** (3–5 teams, real load) → prove operability, find scale bugs
|
|
85
|
+
3. **Broad** (self-serve onboarding) → prove the team doesn't need the FDE
|
|
86
|
+
4. **Standard** (enterprise default) → the FDE exits this workstream
|
|
87
|
+
|
|
88
|
+
Never skip a step. The sponsor always wants to skip from pilot to standard - that's the conversation the FDE protects.
|
|
89
|
+
|
|
90
|
+
## Method - progressive adoption (built it, now people need to use it)
|
|
91
|
+
|
|
92
|
+
Adoption isn't a handoff-stage problem - it starts during build. Software that launches to silence is software that gets decommissioned.
|
|
93
|
+
|
|
94
|
+
**During build:**
|
|
95
|
+
- **Feature flags from day one.** Every new capability behind a flag. Ship to 5% of users first. Watch behavior before opening to 100%.
|
|
96
|
+
- **Feedback loops built in.** A thumbs-up/down, a "was this helpful?", a usage counter. Instrument adoption, don't assume it.
|
|
97
|
+
- **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.
|
|
98
|
+
|
|
99
|
+
**At launch:**
|
|
100
|
+
- **Champion network.** Identify 2–3 power users per team who adopt early. Support them intensely - they become your multiplier.
|
|
101
|
+
- **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.
|
|
102
|
+
- **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.
|
|
103
|
+
|
|
104
|
+
**Write adoption metrics to `delivery.md`:** active users, frequency, drop-off points, resistance signals. This is the evidence for renewal.
|
|
105
|
+
|
|
106
|
+
## Artifact
|
|
107
|
+
|
|
108
|
+
**`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.
|
|
109
|
+
|
|
110
|
+
## Checkpoint
|
|
111
|
+
|
|
112
|
+
Before 100%: canary clean, business metric verified, pulse written into `delivery.md`. Any item unconfirmed → the deploy waits. For enterprise-scale: scale-readiness gate passed before broad rollout.
|
|
113
|
+
|
|
114
|
+
## Principles
|
|
115
|
+
|
|
116
|
+
- A deployment without a tested rollback is reckless.
|
|
117
|
+
- Roll back on any canary anomaly; investigate safely.
|
|
118
|
+
- Verify the business metric, not just the technical one.
|
|
119
|
+
- No pulse, no done.
|
|
120
|
+
- Scale readiness is organizational, not just technical. Check all 8 dimensions.
|
|
121
|
+
- Adoption is measured from day one, not hoped for at launch.
|