fdeops 3.17.0 → 3.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/README.md +160 -149
- package/adapters/AGENTS.md +1 -1
- package/adapters/GEMINI.md +1 -1
- package/adapters/LOCAL-LLM.md +5 -5
- package/adapters/README.md +1 -1
- package/adapters/copilot-instructions.md +1 -1
- package/adapters/cursor.fde.mdc +1 -1
- package/bin/check.js +29 -10
- package/bin/fde.js +7 -7
- package/bin/lib/trust.js +4 -2
- package/mcp/fdeops-ingest/package.json +1 -1
- package/package.json +2 -2
- package/plugin.json +2 -2
- package/skills/fde/SKILL.md +34 -32
- package/skills/fde/references/ai.md +2 -2
- package/skills/fde/references/audit.md +2 -2
- package/skills/fde/references/board-memo.md +1 -1
- package/skills/fde/references/business-case.md +1 -1
- package/skills/fde/references/close.md +1 -1
- package/skills/fde/references/connect.md +1 -1
- package/skills/fde/references/dashboard.md +2 -2
- package/skills/fde/references/debrief.md +1 -1
- package/skills/fde/references/demo-prep.md +1 -1
- package/skills/fde/references/discover.md +23 -9
- package/skills/fde/references/earn-trust.md +1 -1
- package/skills/fde/references/encode-pattern.md +4 -3
- package/skills/fde/references/eval-pack.md +4 -4
- package/skills/fde/references/hold-scope.md +1 -1
- package/skills/fde/references/ingest.md +1 -1
- package/skills/fde/references/land.md +5 -5
- package/skills/fde/references/pick-three.md +1 -1
- package/skills/fde/references/plan.md +1 -1
- package/skills/fde/references/poc.md +8 -3
- package/skills/fde/references/readout.md +5 -4
- package/skills/fde/references/red-team.md +1 -1
- package/skills/fde/references/rescue.md +3 -2
- package/skills/fde/references/review.md +3 -3
- package/skills/fde/references/rollback.md +1 -1
- package/skills/fde/references/runbook.md +5 -3
- package/skills/fde/references/score-use-cases.md +1 -1
- package/skills/fde/references/ship.md +11 -3
- package/skills/fde/references/switch-clients.md +1 -1
- package/skills/fde/references/test-assumptions.md +19 -8
- package/skills/fde/references/three-options.md +18 -11
- package/skills/fde/references/what-breaks.md +1 -1
- package/skills/fde/references/who-decides.md +1 -1
- package/templates/.fde/README.md +1 -1
- package/templates/.fde/assumptions.md +3 -2
- package/templates/.fde/terrain.md +1 -1
package/bin/fde.js
CHANGED
|
@@ -740,11 +740,11 @@ function appendLogEntry(eng, type, entry, opts = {}) {
|
|
|
740
740
|
// degrading to "nothing found" rather than guessing when the shape does not
|
|
741
741
|
// match. Never fabricate a number, a name, or a signal that is not in the text.
|
|
742
742
|
|
|
743
|
-
const PHASES = ['land', 'discover', 'plan', 'ship', '
|
|
744
|
-
const PHASE_ALIASES = { build: 'ship' } // legacy
|
|
743
|
+
const PHASES = ['land', 'discover', 'plan', 'ship', 'outcome', 'close']
|
|
744
|
+
const PHASE_ALIASES = { build: 'ship', prove: 'outcome' } // legacy names; public map is ship / outcome
|
|
745
745
|
const PHASE_LABELS = {
|
|
746
746
|
land: 'Land', discover: 'Discover', plan: 'Plan',
|
|
747
|
-
ship: 'Ship',
|
|
747
|
+
ship: 'Ship', outcome: 'Outcome', close: 'Close',
|
|
748
748
|
}
|
|
749
749
|
function canonicalPhase(phase) {
|
|
750
750
|
const p = String(phase).toLowerCase()
|
|
@@ -1412,7 +1412,7 @@ function cmdLog(args) {
|
|
|
1412
1412
|
const eng = resolveEngagement({ forWrite: true })
|
|
1413
1413
|
if (!eng) { console.error('no engagement - run: fde resume --init <name>'); process.exit(2) }
|
|
1414
1414
|
|
|
1415
|
-
// fde log phase <land|discover|plan|ship|
|
|
1415
|
+
// fde log phase <land|discover|plan|ship|outcome|close> - advances portfolio phase (prove → outcome)
|
|
1416
1416
|
if (type === 'phase') {
|
|
1417
1417
|
const phase = canonicalPhase((text || '').toLowerCase().trim())
|
|
1418
1418
|
if (!PHASES.includes(phase)) {
|
|
@@ -2237,7 +2237,7 @@ function collectDoctorIssues(eng) {
|
|
|
2237
2237
|
}
|
|
2238
2238
|
}
|
|
2239
2239
|
const success = readClean(eng, 'success.md')
|
|
2240
|
-
if (!firstLine(success, 80)) issues.push('success.md has no stated done-definition - fill before plan/
|
|
2240
|
+
if (!firstLine(success, 80)) issues.push('success.md has no stated done-definition - fill before plan/ship')
|
|
2241
2241
|
const ctxMd = readClean(eng, 'context.md')
|
|
2242
2242
|
if (!sectionBody(ctxMd, 'Next action', { lastNonEmpty: true })) {
|
|
2243
2243
|
issues.push('no ## Next action in context.md - Monday morning has nothing to drive')
|
|
@@ -2278,7 +2278,7 @@ function collectDoctorIssues(eng) {
|
|
|
2278
2278
|
}
|
|
2279
2279
|
// Failure-path (exception-led operating map): required once past discover.
|
|
2280
2280
|
// Land seeds; discover fills; plan+ without a real break→owner row is wallpaper.
|
|
2281
|
-
if (/^(plan|ship|
|
|
2281
|
+
if (/^(plan|ship|outcome|close)$/.test(s.phase) && !hasOperatingMapContent(eng)) {
|
|
2282
2282
|
issues.push(
|
|
2283
2283
|
`phase is ${s.phase} with empty operating map - fill terrain.md ## Operating map (exception-led): break → who notices → workaround → evidence`
|
|
2284
2284
|
)
|
|
@@ -3324,7 +3324,7 @@ function printUsage() {
|
|
|
3324
3324
|
fde triage TRIAGE block only (hooks / Cursor session entry)
|
|
3325
3325
|
fde log <type> <text> append decision|risk|delivery|contact (contact takes --signal red|amber|green; delivery "a|b|c" writes the value ledger; --force to allow secret-like text)
|
|
3326
3326
|
fde log risk --retire move matching open-risk bullets to ## Retired
|
|
3327
|
-
fde log phase <phase> set engagement phase (land|discover|plan|ship|
|
|
3327
|
+
fde log phase <phase> set engagement phase (land|discover|plan|ship|outcome|close)
|
|
3328
3328
|
fde log --undo remove the last CLI log/debrief entry from memory
|
|
3329
3329
|
fde debrief [file] meeting notes → memory (prefixed lines; --dry-run; --force)
|
|
3330
3330
|
fde debrief --smart heuristic propose (prints decision:/risk:/delivery:/contact:/next:); --apply after confirm
|
package/bin/lib/trust.js
CHANGED
|
@@ -98,9 +98,11 @@ function createTrustApi(deps) {
|
|
|
98
98
|
if (!m) return '?'
|
|
99
99
|
const raw = m[1].replace(/\*/g, '').trim()
|
|
100
100
|
if (!raw || /\|/.test(raw) || /^unset$/i.test(raw) || /^[\[(]/.test(raw)) return '?'
|
|
101
|
-
const one = raw.toLowerCase().match(/^(land|discover|plan|build|ship|prove|close)\b/)
|
|
101
|
+
const one = raw.toLowerCase().match(/^(land|discover|plan|build|ship|prove|outcome|close)\b/)
|
|
102
102
|
if (!one) return '?'
|
|
103
|
-
|
|
103
|
+
if (one[1] === 'build') return 'ship'
|
|
104
|
+
if (one[1] === 'prove') return 'outcome'
|
|
105
|
+
return one[1]
|
|
104
106
|
}
|
|
105
107
|
|
|
106
108
|
function countOpenRisks(eng) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fdeops",
|
|
3
|
-
"version": "3.
|
|
4
|
-
"description": "Forward deployed engineering skills for AI coding agents.
|
|
3
|
+
"version": "3.21.0",
|
|
4
|
+
"description": "Forward deployed engineering skills for AI coding agents. One @fde skill for the client work around the code: who can say yes, what went live, whether they signed off. Dated markdown on your laptop. You confirm each write.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"fdeops": "bin/install.js",
|
|
7
7
|
"fde": "bin/fde.js"
|
package/plugin.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "fdeops",
|
|
4
|
-
"version": "3.
|
|
5
|
-
"description": "Forward deployed engineering skills for AI coding agents
|
|
4
|
+
"version": "3.21.0",
|
|
5
|
+
"description": "Forward deployed engineering skills for AI coding agents. One @fde skill for the client work around the code. You confirm; then it lands in .fde/ on your laptop.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Subash Natarajan",
|
|
8
8
|
"url": "https://github.com/suboss87"
|
package/skills/fde/SKILL.md
CHANGED
|
@@ -7,7 +7,7 @@ description: Keeps the engagement record for client work. Use when they name a c
|
|
|
7
7
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
|
-
The **engagement record** for one client, from first meeting to signed outcome. One skill; six stages (land → close). You route; they never pick a skill. Confirm, then write `.fde/`. The workspace still compiles and commits. `@fde` does not leave.
|
|
10
|
+
The **engagement record** for one client, from first meeting to signed outcome. One skill; six stages (land → close). Same map at any scale, on greenfield or brownfield, in any industry (overlays). You route; they never pick a skill. Confirm, then write `.fde/`. The workspace still compiles and commits. `@fde` does not leave.
|
|
11
11
|
|
|
12
12
|
## When to use
|
|
13
13
|
|
|
@@ -77,7 +77,7 @@ Writes need a bind (`FDEOPS_ENGAGEMENT` or registry). Never install fdeops on in
|
|
|
77
77
|
|
|
78
78
|
## The memory contract
|
|
79
79
|
|
|
80
|
-
1. **On entry:** `fde resume` only. Pull other `.fde/` files when the
|
|
80
|
+
1. **On entry:** `fde resume` only. Pull other `.fde/` files when the skill needs them.
|
|
81
81
|
2. **Deliverable = memory.** The work *is* the `.fde/` file. The reference names which one.
|
|
82
82
|
3. **Evidence.** Every claim has a source. Traceable beats plausible.
|
|
83
83
|
4. **No invented facts.** People, quotes, meetings, numbers: they said it or the repo shows it. Else `unknown - ask: <question>`.
|
|
@@ -107,83 +107,83 @@ CLI is local (`git` + files, no network). You see their code only when they poin
|
|
|
107
107
|
|
|
108
108
|
Direct. Their words. No "Certainly." Playback 2-4 lines, then act. One question only when a missing fact changes the next move.
|
|
109
109
|
|
|
110
|
-
New embed: sprint / standard / programme changes depth, not which
|
|
110
|
+
New embed: sprint / standard / programme changes depth, not which skills exist. Before first code: safe place to break things, plus AI-code policy. Before go-live: who needs to know, what's the rollback. Before a sponsor artifact: as-is or gut-check first.
|
|
111
111
|
|
|
112
112
|
Muddy signal: name it ("discover or rescue - leaning X"). Never a phase-picker interview. Default: land if new, audit if takeover.
|
|
113
113
|
|
|
114
114
|
## Routing - 6 stages
|
|
115
115
|
|
|
116
|
-
Read **one** reference and follow it. Do not improvise from memory.
|
|
116
|
+
Work names (engage, diagnose, align, deliver, realize, transfer) are the same map. Read **one** reference and follow it. Do not improvise from memory.
|
|
117
117
|
|
|
118
118
|
### Land
|
|
119
119
|
|
|
120
120
|
| You hear | Skill | Reference |
|
|
121
121
|
|----------|-------|-----------|
|
|
122
|
-
|
|
|
122
|
+
| Engage, onboarding, starting fresh, new customer, first meeting, just got the brief, set product strategy, define success metrics, scope the brief | land | `references/land.md` |
|
|
123
123
|
| Taking over, previous consultant left, joining mid-project | audit | `references/audit.md` |
|
|
124
|
-
| Need to understand who matters, who decides, who blocks quietly | who-decides | `references/who-decides.md` |
|
|
124
|
+
| Need to understand who matters, who decides, map decision rights, who blocks quietly | who-decides | `references/who-decides.md` |
|
|
125
125
|
| Need to earn access, navigate AI policy, build credibility | earn-trust | `references/earn-trust.md` |
|
|
126
|
-
| "Also can you…", scope expanding, timeline unchanged | hold-scope | `references/hold-scope.md` |
|
|
126
|
+
| "Also can you…", scope expanding, timeline unchanged, hold scope, scope the brief after kickoff | hold-scope | `references/hold-scope.md` |
|
|
127
127
|
|
|
128
128
|
### Discover
|
|
129
129
|
|
|
130
130
|
| You hear | Skill | Reference |
|
|
131
131
|
|----------|-------|-----------|
|
|
132
|
-
|
|
|
133
|
-
| The brief feels too neat, assumptions untested, "we just need…" | test-assumptions | `references/test-assumptions.md` |
|
|
134
|
-
| Multiple use cases competing, "we want to do everything" | score-use-cases | `references/score-use-cases.md` |
|
|
135
|
-
| Need to validate a direction, prototype, demo to de-risk, **POC**, spike, killer assumption | poc | `references/poc.md` |
|
|
132
|
+
| Diagnose, don't know the real problem, brief feels wrong, shadow processes, frame discovery, understand the problem space, data not ready, data estate, catalog the data, parts of the problem, decompose | discover | `references/discover.md` |
|
|
133
|
+
| The brief feels too neat, assumptions untested, "we just need…", test assumptions, inherited convention, why do we always | test-assumptions | `references/test-assumptions.md` |
|
|
134
|
+
| Multiple use cases competing, "we want to do everything", score use cases | score-use-cases | `references/score-use-cases.md` |
|
|
135
|
+
| Need to validate a direction, prototype, demo to de-risk, **POC**, spike, killer assumption, validate the solution, build prototype | poc | `references/poc.md` |
|
|
136
136
|
|
|
137
137
|
### Plan
|
|
138
138
|
|
|
139
139
|
| You hear | Skill | Reference |
|
|
140
140
|
|----------|-------|-----------|
|
|
141
|
-
|
|
|
142
|
-
| Sponsor needs justification, need to defend budget or timeline | business-case | `references/business-case.md` |
|
|
143
|
-
| Significant decision, multiple approaches, "what should we do?" | three-options | `references/three-options.md` |
|
|
144
|
-
| 20 things are "urgent," need to pick the 3 that matter | pick-three | `references/pick-three.md` |
|
|
141
|
+
| Align, break this down, what order, sequence the build, plan the roadmap, create user stories, write the tasks | plan | `references/plan.md` |
|
|
142
|
+
| Sponsor needs justification, need to defend budget or timeline, build the business case | business-case | `references/business-case.md` |
|
|
143
|
+
| Significant decision, multiple approaches, "what should we do?", generate solutions, generate options, not the playbook, from the surviving facts | three-options | `references/three-options.md` |
|
|
144
|
+
| 20 things are "urgent," need to pick the 3 that matter, prioritize three | pick-three | `references/pick-three.md` |
|
|
145
145
|
|
|
146
146
|
### Ship
|
|
147
147
|
|
|
148
148
|
| You hear | Skill | Reference |
|
|
149
149
|
|----------|-------|-----------|
|
|
150
|
-
| What could go wrong, touching shared infrastructure, need to assess impact | what-breaks | `references/what-breaks.md` |
|
|
151
|
-
| Production down, urgent - OR stakeholder gone quiet, trust slipping | rescue | `references/rescue.md` |
|
|
152
|
-
|
|
|
153
|
-
| Review this change, is it safe, does it match what we agreed | review | `references/review.md` |
|
|
150
|
+
| What could go wrong, touching shared infrastructure, need to assess impact, assess impact, provision, IaC, shared infra | what-breaks | `references/what-breaks.md` |
|
|
151
|
+
| Production down, urgent, fix a prod bug, resolve incident, restore service - OR stakeholder gone quiet, trust slipping | rescue | `references/rescue.md` |
|
|
152
|
+
| Deliver, start building, update their checkout, first module, visible progress, their tests, POC follow-through, ready to deploy, going live, pre-flight, deliver the increment, build the increment, create the launch plan, design their UI | ship | `references/ship.md` |
|
|
153
|
+
| Review this change, review the pull request, is it safe, does it match what we agreed | review | `references/review.md` |
|
|
154
154
|
| Diff grew / scope creep in the PR / "did we only build what we said" / KEEP JUSTIFY SPLIT DROP | review (+ ship if going live) | `references/review.md` Stage 1 · `references/ship.md` Intent vs diff |
|
|
155
155
|
| Wrap the session / share the thinking / catch teammates up / before I open the PR | (memory contract - session digest) | SKILL.md **On exit** - write TL;DR + decisions/why into `.fde/`; no transcript sync |
|
|
156
|
-
| "We can always revert" - need to actually test the escape route | rollback | `references/rollback.md` |
|
|
156
|
+
| "We can always revert" - need to actually test the escape route, rehearse rollback | rollback | `references/rollback.md` |
|
|
157
157
|
|
|
158
|
-
###
|
|
158
|
+
### Outcome
|
|
159
159
|
|
|
160
160
|
| You hear | Skill | Reference |
|
|
161
161
|
|----------|-------|-----------|
|
|
162
|
-
|
|
|
163
|
-
| Demo coming up, show-and-tell, exec walkthrough | demo-prep | `references/demo-prep.md` |
|
|
164
|
-
| Just out of a meeting, raw notes, "they said…", "debrief" | debrief | the debrief verb (above) + `references/debrief.md` |
|
|
162
|
+
| Realize, weekly update due, "need to send the sponsor something", report the outcome | readout | `references/readout.md` |
|
|
163
|
+
| Demo coming up, show-and-tell, exec walkthrough, prepare the demo | demo-prep | `references/demo-prep.md` |
|
|
164
|
+
| Just out of a meeting, raw notes, "they said…", "debrief", user interviews, workshop notes, capture the meeting | debrief | the debrief verb (above) + `references/debrief.md` |
|
|
165
165
|
| Make sure we're up to date, pull what's relevant, fetch from Granola/Slack/Gmail/transcript | ingest | `references/ingest.md` (capability check → stage → propose → confirm → apply) |
|
|
166
166
|
| Connect a new MCP / connect Granola Slack or Notion / what can you pull | connect | `references/connect.md` (+ `mcp/recipes/`) |
|
|
167
167
|
| Prep me for a meeting / walk-in brief / "what should I know before I talk to…" | - | run `fde prep "<label>"`, present in plain language |
|
|
168
|
-
| Sponsor's boss needs a summary, board update, justify continued investment | board-memo | `references/board-memo.md` |
|
|
169
|
-
| Status across all my customers | dashboard | `references/dashboard.md` |
|
|
168
|
+
| Sponsor's boss needs a summary, board update, brief the board, justify continued investment | board-memo | `references/board-memo.md` |
|
|
169
|
+
| Status across all my customers, view the portfolio | dashboard | `references/dashboard.md` |
|
|
170
170
|
|
|
171
171
|
### Close
|
|
172
172
|
|
|
173
173
|
| You hear | Skill | Reference |
|
|
174
174
|
|----------|-------|-----------|
|
|
175
|
-
| Juggling 2+ customers, losing track, context-switching | switch-clients | `references/switch-clients.md` |
|
|
176
|
-
|
|
|
177
|
-
| Engagement ending, team needs to operate without you | runbook | `references/runbook.md` |
|
|
178
|
-
| Something worked well and will apply to future engagements | encode-pattern | `references/encode-pattern.md` |
|
|
179
|
-
| "Red-team this," "stress-test my plan," poke holes, what am I missing | red-team | `references/red-team.md` |
|
|
175
|
+
| Juggling 2+ customers, losing track, context-switching, switch engagements | switch-clients | `references/switch-clients.md` |
|
|
176
|
+
| Transfer, wrapping up, handoff, making yourself replaceable, transfer operations | close | `references/close.md` |
|
|
177
|
+
| Engagement ending, team needs to operate without you, write the runbook | runbook | `references/runbook.md` |
|
|
178
|
+
| Something worked well and will apply to future engagements, encode the pattern | encode-pattern | `references/encode-pattern.md` |
|
|
179
|
+
| "Red-team this," "stress-test my plan," poke holes, challenge the plan, what am I missing | red-team | `references/red-team.md` |
|
|
180
180
|
| "What did we agree about X?", scope dispute, receipts | - | run `fde receipts <term>`, answer with dates |
|
|
181
181
|
|
|
182
182
|
**Overlays - activate alongside any skill on signal, don't wait to be told:**
|
|
183
183
|
|
|
184
184
|
| Signal | Overlay |
|
|
185
185
|
|--------|---------|
|
|
186
|
-
| AI, ML, LLM, model, embeddings, RAG, agents, fine-tuning, inference, drift | `references/ai.md` |
|
|
186
|
+
| AI, ML, LLM, model, embeddings, RAG, agents, fine-tuning, inference, drift, train the model | `references/ai.md` |
|
|
187
187
|
| Golden set, eval suite, eval pack, pass/fail before AI ship, HITL gate for model, POC the model | `references/eval-pack.md` (+ `ai.md`) |
|
|
188
188
|
| Deck, slides, report, governance framework, compliance pack, ADR, PDF | `references/artifacts.md` |
|
|
189
189
|
| Patient data, PHI, HIPAA, EHR, clinical | `references/healthcare.md` |
|
|
@@ -195,7 +195,9 @@ Ready to build with no `terrain.md` / plan: discover or plan first. Takeover wit
|
|
|
195
195
|
## Principles
|
|
196
196
|
|
|
197
197
|
- Never ask the FDE to pick a phase. That's your job.
|
|
198
|
+
- Same six stages at any scale. Overlays carry the industry. Greenfield and brownfield change the first move inside ship, not the map.
|
|
198
199
|
- Ground loop on a bound client: name → characterise → prove on their staging → go live → log. Do not hand their repo to a generic coding pack.
|
|
200
|
+
- Do not call a change done until the signer in `success.md` can reject it on staging they operate.
|
|
199
201
|
- Read `context.md` before speaking. One sharp question - never a barrage.
|
|
200
202
|
- Never invent people, meetings, or numbers - `unknown - ask:` beats a polished lie.
|
|
201
203
|
- Every phase ends with its artifact written. No artifact, no "done."
|
|
@@ -38,7 +38,7 @@ Write model selection rationale to `decisions.md`. Include: models tested, test
|
|
|
38
38
|
|
|
39
39
|
## Engagement eval pack (before AI ships)
|
|
40
40
|
|
|
41
|
-
When any slice touches a model, embeddings, RAG, or an agent: create or update `.fde/evals.md` **before** ship. Full
|
|
41
|
+
When any slice touches a model, embeddings, RAG, or an agent: create or update `.fde/evals.md` **before** ship. Full skill: `references/eval-pack.md`. This is the engagement-local test set - not unit tests.
|
|
42
42
|
|
|
43
43
|
**Minimum pack (do not grow until the minimum exists):**
|
|
44
44
|
1. **Component + quality bar** - one sentence each; kill switch / fallback named.
|
|
@@ -47,7 +47,7 @@ When any slice touches a model, embeddings, RAG, or an agent: create or update `
|
|
|
47
47
|
4. **Pass/fail** - dated run; Verdict **SHIP** or **NO-SHIP**; critical fails must be 0.
|
|
48
48
|
5. **HITL gate** - which decisions need human review before action (align with `trust-profile.md`). Empty when policy requires review → NO-SHIP.
|
|
49
49
|
|
|
50
|
-
**When to write:** plan seeds the pack; poc/
|
|
50
|
+
**When to write:** plan seeds the pack; poc/ship grows goldens; ship requires Verdict SHIP and a receipt in `delivery.md` → `## Ship receipts`. Non-AI work skips this file entirely.
|
|
51
51
|
|
|
52
52
|
## RAG architecture (retrieval-augmented generation)
|
|
53
53
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# audit -
|
|
1
|
+
# audit - Verify inherited claims
|
|
2
2
|
|
|
3
3
|
**Enter when:** picking up someone else's work - previous consultant left, joining mid-project, half-done system.
|
|
4
4
|
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
Before forming any opinion:
|
|
10
10
|
|
|
11
11
|
1. **Inherit the paper.** Any previous `.fde/`, docs, README claims, ADRs, ticket history the FDE can export. Read it all - the previous FDE's decisions are evidence, not verdicts.
|
|
12
|
-
2. **Run the discover scans** (see `discover.md`
|
|
12
|
+
2. **Run the discover scans** (see `discover.md` part 1: churn, test gaps, "temporary" grep, AI components). On a takeover, add:
|
|
13
13
|
```bash
|
|
14
14
|
git log --format="%an" | sort | uniq -c | sort -rn | head # who actually built this
|
|
15
15
|
git log --since="60 days ago" --format="%ad %s" --date=short | head -20 # what was happening when they left
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# board-memo -
|
|
1
|
+
# board-memo - Brief the board
|
|
2
2
|
|
|
3
3
|
**Enter when:** the sponsor's boss needs a summary, a board update mentions the engagement, the FDE needs to justify continued investment, or a quarterly review is approaching.
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# business-case -
|
|
1
|
+
# business-case - Build the business case
|
|
2
2
|
|
|
3
3
|
**Enter when:** the sponsor needs justification for the next phase, the FDE needs to defend budget or timeline, a feature decision needs cost/benefit evidence, or poc produced a direction that needs funding.
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# dashboard - the portfolio
|
|
1
|
+
# dashboard - View the portfolio
|
|
2
2
|
|
|
3
3
|
**Enter when:** the FDE runs several customers and asks "where am I across everything?"
|
|
4
4
|
|
|
@@ -8,7 +8,7 @@ The visual artifact is rendered by code, not by you. `fde dashboard` reads every
|
|
|
8
8
|
|
|
9
9
|
## Method (you do this work)
|
|
10
10
|
|
|
11
|
-
0. **First move: `fde status`** - instant heuristic triage (trust-first ordering) across every engagement. Use it as the index; then deep-read only the folders that are red/amber or that the FDE asks about, and apply the full card
|
|
11
|
+
0. **First move: `fde status`** - instant heuristic triage (trust-first ordering) across every engagement. Use it as the index; then deep-read only the folders that are red/amber or that the FDE asks about, and apply the full card below.
|
|
12
12
|
1. **Find the engagements:** `~/fde-engagements/*/.fde/` (primary) · workspace `./.fde/` if present · paths the FDE names. Read each folder **separately** - never merge two customers.
|
|
13
13
|
2. **Per engagement, read the card the way a human would:**
|
|
14
14
|
- Name, phase, week
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# discover -
|
|
1
|
+
# discover - Frame the problem
|
|
2
2
|
|
|
3
3
|
**Enter when:** the brief feels wrong, the real problem is unclear, shadow processes are suspected, or any phase found that the map is missing.
|
|
4
4
|
|
|
@@ -54,6 +54,16 @@ Tests on **Question** - rewrite until all five hold:
|
|
|
54
54
|
|
|
55
55
|
Cannot write the Question → keep interrogating. Do not `fde scan`. Every later output of this phase aims at that Question. Sub-questions go to the operating map or `assumptions.md`, not into the Question.
|
|
56
56
|
|
|
57
|
+
## Parts of the problem (decompose only)
|
|
58
|
+
|
|
59
|
+
After the Question is locked, and **before** `fde scan` or any option: write what the problem is made of. No advice, no playbook, no solution.
|
|
60
|
+
|
|
61
|
+
If the stated brief hides a deeper job, name that deeper job in one sentence and **wait**. Do not silently replace their problem with yours.
|
|
62
|
+
|
|
63
|
+
In `terrain.md` under `## Parts`, list the smallest useful pieces that still change what you examine next. Typical cuts: people, process step, system, data, time, cost. For each piece: what it contains, and how it connects to the Question. Stop when a further split would not change where you dig.
|
|
64
|
+
|
|
65
|
+
Do not mark pieces as facts or assumptions here. That is `test-assumptions`. Do not assemble options here. That is `three-options`.
|
|
66
|
+
|
|
57
67
|
## Method - part 1: the codebase (you do this work)
|
|
58
68
|
|
|
59
69
|
**First move: `fde scan`** - it runs everything below deterministically in seconds (churn×tests, "temporary" archaeology, AI components, secrets redacted, previous attempts). Your job is then **interpretation**: read its output against the brief, follow the hotspots into the code, and connect the technical findings to the human signals in part 2.
|
|
@@ -105,7 +115,7 @@ The real spec is what people **do** when the system fails - not what the slide d
|
|
|
105
115
|
- **The hesitation.** When someone says "well, there's also this other thing we do…" - stop them, ask them to finish. The main story is what they're comfortable explaining; the hesitation is the real problem.
|
|
106
116
|
- **"Which part of the codebase do you least want to touch?"** The answer is unanimous and it's the load-bearing wall. Check it against your churn scan - when the human answer and the churn data agree, that's your first map landmark.
|
|
107
117
|
- **Shadow AI.** Someone pasting data into ChatGPT to cope = a real unmet need + an uncontrolled data risk. Note both.
|
|
108
|
-
- **Exception-led operating map.** For each real break (not the slide-deck process): what fails, who notices first, what they do today, and which artifact is trusted in that moment. Prefer exceptions over happy-path swimlanes - the workaround is the operating system. Write rows under `terrain.md` → `## Operating map (exception-led)`. If the section is missing on an older engagement, add it; never regenerate the rest of terrain. When AI is in play, also fill `## Intelligence placement` (deterministic vs LLM judgement vs human approve). **`fde doctor` requires at least one filled exception row before plan/
|
|
118
|
+
- **Exception-led operating map.** For each real break (not the slide-deck process): what fails, who notices first, what they do today, and which artifact is trusted in that moment. Prefer exceptions over happy-path swimlanes - the workaround is the operating system. Write rows under `terrain.md` → `## Operating map (exception-led)`. If the section is missing on an older engagement, add it; never regenerate the rest of terrain. When AI is in play, also fill `## Intelligence placement` (deterministic vs LLM judgement vs human approve). **`fde doctor` requires at least one filled exception row before plan/ship/outcome/close** - empty map after discover is a hygiene fail, not optional polish.
|
|
109
119
|
|
|
110
120
|
## Method - part 3: workshop facilitation
|
|
111
121
|
|
|
@@ -127,9 +137,11 @@ When discovery requires a structured session with multiple stakeholders (alignme
|
|
|
127
137
|
|
|
128
138
|
**After the room:** Summary in `decisions.md` within 2 hours. Decisions decay - what felt clear at 3pm is debatable by 5pm if unwritten.
|
|
129
139
|
|
|
130
|
-
## Method - part 4: data estate
|
|
140
|
+
## Method - part 4: data estate and the pipe
|
|
141
|
+
|
|
142
|
+
Always map the estate before you score a use case - not only when someone said "AI." A path they cannot feed is a discover miss, not a ship surprise.
|
|
131
143
|
|
|
132
|
-
|
|
144
|
+
**Their words first.** In `terrain.md`, write the names the floor uses for the workaround, the sheet, the exception path, and the person who left. Later plan/ship/review sentences use those names. Do not translate their floor into generic product language.
|
|
133
145
|
|
|
134
146
|
**The 5 questions (ask the data owner, not the sponsor):**
|
|
135
147
|
1. **Where does data live?** - List every source: databases, warehouses, SaaS exports, spreadsheets, S3 buckets, vendor APIs. Map it.
|
|
@@ -138,13 +150,15 @@ When the engagement involves AI, analytics, or data-heavy automation, assess the
|
|
|
138
150
|
4. **What's the quality?** - Sample 100 rows from each critical source. Check: nulls, duplicates, format consistency, semantic correctness. A 60% null rate in a key field = that source is fiction.
|
|
139
151
|
5. **What are the governance constraints?** - PII classification, retention policies, cross-border rules, consent basis. One missed constraint = a compliance stop later.
|
|
140
152
|
|
|
153
|
+
**The pipe (what talks to what).** For each source that a use case depends on, write: the system it flows from and to, the contract (object, table, file, API), whose credentials, what happens when the vendor 500s or the Monday file does not land, and whether the join the sponsor described actually exists. Their IdP, CRM, and warehouse are delivery work when the path needs them - policy questions in `trust-profile.md` are not a substitute.
|
|
154
|
+
|
|
141
155
|
**The data readiness matrix:**
|
|
142
156
|
|
|
143
|
-
| Source | Location | Freshness | Owner | Quality (sample) | Governance | Verdict |
|
|
144
|
-
|
|
145
|
-
| _fill per source_ | | | | | | Ready / Needs work / Blocker |
|
|
157
|
+
| Source | Location | Freshness | Owner | Quality (sample) | Governance | Pipe | Verdict |
|
|
158
|
+
|--------|----------|-----------|-------|-----------------|------------|------|---------|
|
|
159
|
+
| _fill per source_ | | | | | | | Ready / Needs work / Blocker |
|
|
146
160
|
|
|
147
|
-
A use case that depends on a "Blocker" source doesn't get scored - it gets a
|
|
161
|
+
A use case that depends on a "Blocker" source **or a Blocker pipe** doesn't get scored - it gets a remediation conversation first. `what-breaks` finding an invisible integration at ship is already too late. Write this to `terrain.md` under a `## Data estate` section.
|
|
148
162
|
|
|
149
163
|
## When scope is a transformation, not a single problem
|
|
150
164
|
|
|
@@ -171,7 +185,7 @@ Score every candidate use case before anything gets prototyped:
|
|
|
171
185
|
**Complication:** <what forces a decision now>
|
|
172
186
|
**Question:** <one decision-shaped sentence>
|
|
173
187
|
**Answer-space:** confirm brief / descope / rescope / pause - and what a yes looks like
|
|
174
|
-
**Implication for build:** <first
|
|
188
|
+
**Implication for build:** <first change they can see>
|
|
175
189
|
**Validated with:** <who, when>
|
|
176
190
|
```
|
|
177
191
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# earn-trust -
|
|
1
|
+
# earn-trust - Earn access
|
|
2
2
|
|
|
3
3
|
**Enter when:** new engagement where you don't have full access yet, trust is thin, the customer said "let's start small," or you need to navigate "we don't trust AI-generated code."
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# encode-pattern -
|
|
1
|
+
# encode-pattern - Encode the pattern
|
|
2
2
|
|
|
3
3
|
**Enter when:** the engagement is closing and reusable patterns exist, a technique worked well and will apply to future clients, the FDE notices themselves doing the same thing on a second engagement, or close identified a pattern worth preserving.
|
|
4
4
|
|
|
@@ -47,8 +47,9 @@ The difference between a 5-year FDE and a 15-year FDE is not talent - it's encod
|
|
|
47
47
|
| **Specific enough?** | Contains concrete steps, not just principles | "Build trust" / "Communicate well" - too vague to act on |
|
|
48
48
|
| **Repeatable?** | Applies to a class of situations, not just this one | Only worked because of a unique circumstance |
|
|
49
49
|
| **Falsifiable?** | You can tell when the pattern is working or not | No way to measure whether applying it helped |
|
|
50
|
+
| **Monday bag?** | You would refuse the next similar embed without this in your bag - a named move plus an artifact you can drop on day one (pipe questions, CAB dance, eval golden shape, floor-drill script) | "We learned to communicate." Patterns that only live in this client's `.fde/` do not compound |
|
|
50
51
|
|
|
51
|
-
**4. Classify by stage.** Patterns sort into the same stages as the
|
|
52
|
+
**4. Classify by stage.** Patterns sort into the same stages as the skills:
|
|
52
53
|
|
|
53
54
|
| Stage | Pattern type | Example |
|
|
54
55
|
|--------|-------------|---------|
|
|
@@ -56,7 +57,7 @@ The difference between a 5-year FDE and a 15-year FDE is not talent - it's encod
|
|
|
56
57
|
| **Discover** | Investigative / analytical | "The cron-job discovery checklist for legacy systems" |
|
|
57
58
|
| **Plan** | Structural / strategic | "The three-option presentation for nervous sponsors" |
|
|
58
59
|
| **Ship** | Technical / safety | "The Strangler Fig on financial transaction code" |
|
|
59
|
-
| **
|
|
60
|
+
| **Outcome** | Operational / process | "The regulated-environment change-approval timeline buffer" |
|
|
60
61
|
| **Close** | Knowledge / handoff | "The 2am document format that actually gets used" |
|
|
61
62
|
|
|
62
63
|
**5. Version and evolve.** Patterns are living documents:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# eval-pack -
|
|
1
|
+
# eval-pack - Gate the model before it acts
|
|
2
2
|
|
|
3
3
|
**Enter when:** the work touches AI/LLM/agents/RAG, or they need to POC a model, or ship/close is blocked because there is no evidence the non-deterministic path is safe. Activate alongside `ai.md`, `poc`, or `ship` - not instead of them.
|
|
4
4
|
|
|
@@ -22,9 +22,9 @@ Intelligence without evidence is token-maxing with a nicer name. An FDE earns tr
|
|
|
22
22
|
|
|
23
23
|
**3. Score pass/fail, not vibes.** Run the suite. Record count pass / fail. Failures get a failure-mode tag (missing data, wrong record, format drift, hallucination, retrieval miss, unsafe action, other).
|
|
24
24
|
|
|
25
|
-
**4. Human-in-the-loop gate.** Name which outcomes require human approve before side effects.
|
|
25
|
+
**4. Human-in-the-loop gate.** Name which outcomes require human approve before side effects. Judgement that has a side effect (write, send, transfer, ticket, deploy, pay, page) is **NO-SHIP** without a named human on their side in the loop. Do not write "none - allowed under policy" to bless lights-out write-access. Staging may run a supervised loop with a kill switch, a cost cap, and a golden set from **their** failures. Production stays gated until they have a written policy, a named owner, and dated eval receipts on real traffic.
|
|
26
26
|
|
|
27
|
-
**5. Ship rule.** Until `evals.md` shows Verdict **SHIP** with a dated run (critical fails = 0) and HITL filled
|
|
27
|
+
**5. Ship rule.** Until `evals.md` shows Verdict **SHIP** with a dated run (critical fails = 0) and HITL filled, AI-touching ship stays **fix-first**. Eval fails do not sit in a backlog - they reopen plan (descope, move the judgement, or kill the path). Log a one-line eval receipt in `delivery.md` → `## Ship receipts`. No "probably fine."
|
|
28
28
|
|
|
29
29
|
## Artifact - `evals.md`
|
|
30
30
|
|
|
@@ -39,5 +39,5 @@ Present to the FDE: suite size, pass rate, top failure mode, HITL gate, Verdict
|
|
|
39
39
|
- No golden set, no AI ship.
|
|
40
40
|
- Pass/fail beats “looks good.”
|
|
41
41
|
- Failure modes are the product - the happy path is table stakes.
|
|
42
|
-
- HITL is a gate, not a slide.
|
|
42
|
+
- HITL is a gate, not a slide. Side effects without a named human on their side are NO-SHIP.
|
|
43
43
|
- Non-AI work does not need this file.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# hold-scope -
|
|
1
|
+
# hold-scope - Hold scope
|
|
2
2
|
|
|
3
3
|
**Enter when:** "also can you…" mid-build, a stakeholder adds requirements without adjusting timeline, the FDE feels scope creeping but can't name it, or `success.md` no longer matches what's being asked.
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ingest -
|
|
1
|
+
# ingest - Ingest sources
|
|
2
2
|
|
|
3
3
|
**Enter when:** the FDE wants to catch the engagement up from external sources - "make sure Acme is up to date," "pull what's relevant," "grab today's Granola and Denise's last email." Raw transcripts and long emails that are too big to paste usefully.
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# land -
|
|
1
|
+
# land - Interrogate the brief
|
|
2
2
|
|
|
3
3
|
**Enter when:** new customer, first meeting, just got the brief, nothing started yet.
|
|
4
4
|
|
|
@@ -99,12 +99,12 @@ If `stakeholders.md` already has a `## Signal history` section (it does from the
|
|
|
99
99
|
|
|
100
100
|
**`trust-profile.md`** - sacred data (`<private>` tagged), fears heard, AI policy, approval chain. Sensitive: skip for status reads; use CLI/redacted surfaces; never paste raw `<private>` into prompts or subagents.
|
|
101
101
|
|
|
102
|
-
**`assumptions.md`** - seed every unverified claim from the brief (and the day-1 hypothesis) as rows with blast radius CRITICAL / LOAD-BEARING / CONVENIENCE and status `OPEN`. Do not wait for test-assumptions - land makes the register exist. Example:
|
|
102
|
+
**`assumptions.md`** - seed every unverified claim from the brief (and the day-1 hypothesis) as rows with Kind `UNKNOWN` (or `CONVENTION` if they said "we always"), blast radius CRITICAL / LOAD-BEARING / CONVENIENCE, and status `OPEN`. Do not wait for test-assumptions - land makes the register exist. Example:
|
|
103
103
|
|
|
104
104
|
```markdown
|
|
105
|
-
| # | Assumption | Blast radius | How we test | Status | Evidence |
|
|
106
|
-
|
|
107
|
-
| 1 | <claim from brief> | CRITICAL | <cheapest falsifying test> | OPEN | (stated, unverified) |
|
|
105
|
+
| # | Assumption | Kind | Blast radius | How we test | Status | Evidence |
|
|
106
|
+
|---|------------|------|--------------|-------------|--------|----------|
|
|
107
|
+
| 1 | <claim from brief> | UNKNOWN | CRITICAL | <cheapest falsifying test> | OPEN | (stated, unverified) |
|
|
108
108
|
```
|
|
109
109
|
|
|
110
110
|
One falsifiable hypothesis about the real problem also goes at the bottom of `brief.md` - discover / test-assumptions will test it.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# pick-three -
|
|
1
|
+
# pick-three - Prioritize three
|
|
2
2
|
|
|
3
3
|
**Enter when:** a transformation engagement with a long list of initiatives, the customer's roadmap has more items than weeks, competing teams want different things, or the FDE needs to recommend what to do *first* across a complex programme.
|
|
4
4
|
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
# poc -
|
|
1
|
+
# poc - Validate the solution
|
|
2
2
|
|
|
3
3
|
**Enter when:** a direction needs validating before committing real build time - POC, spike, show something, de-risk, pick between use cases. The output is something a sponsor can reject in a room this week, not a polished product.
|
|
4
4
|
|
|
5
|
-
**Read first:** `context.md`, `reality.md`. Load `terrain.md` only if the prototype touches the existing codebase.
|
|
5
|
+
**Read first:** `context.md`, `reality.md`. Load `terrain.md` only if the prototype touches the existing codebase. If `terrain.md` **Data estate** has a Blocker source this prototype needs, stop - that is discover, not a day's demo.
|
|
6
|
+
|
|
7
|
+
A green check on synthetic data is not a validated solution. The person who can say no has to see it on evidence they already believe.
|
|
6
8
|
|
|
7
9
|
## Method (you do this work)
|
|
8
10
|
|
|
9
|
-
**0. Name the killer assumption.** With the FDE: "What's the belief that kills the project if it's wrong?" Prototype **that** - not the pretty demo.
|
|
11
|
+
**0. Name the killer assumption.** With the FDE: "What's the belief that kills the project if it's wrong?" Prototype **that** - not the pretty demo. If `three-options` just ran: the cheapest test is for the recommended option first, unless they pick another.
|
|
12
|
+
|
|
13
|
+
**0b. Pass / fail before you build.** For the test you will run, write three lines in `prototype-log.md` first: what you will actually do (who you talk to, what you show, on whose screen); the result that **kills** this option; the result that keeps it alive. What you would learn either way. If every option's test would fail, name which `assumptions.md` block to reopen - do not invent a fourth playbook.
|
|
10
14
|
|
|
11
15
|
**1. Pick by score when several use cases compete.** Use the scoring model from `discover.md` - (Value × Data readiness) / Complexity. If discover already scored, reuse; never re-score independently.
|
|
12
16
|
|
|
@@ -35,6 +39,7 @@ Tell the FDE: did the riskiest assumption hold · what the customer's reaction a
|
|
|
35
39
|
## Principles
|
|
36
40
|
|
|
37
41
|
- Speed of learning beats code quality. Never more than a day.
|
|
42
|
+
- Write pass/fail before you build. A demo with no kill line is a show.
|
|
38
43
|
- Show it rough. Polish misleads.
|
|
39
44
|
- Prototype the killer assumption, not the demo.
|
|
40
45
|
- Kill fast; log the learning.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# readout -
|
|
1
|
+
# readout - Report the outcome
|
|
2
2
|
|
|
3
3
|
**Enter when:** the weekly update is due, an exec asks "where are we," or the FDE says "I need to send Dana something." This artifact decides renewals; engineers underinvest in it.
|
|
4
4
|
|
|
@@ -12,15 +12,16 @@
|
|
|
12
12
|
|
|
13
13
|
| Block | What to write | Source |
|
|
14
14
|
|-------|---------------|--------|
|
|
15
|
-
| **S - Situation** | Where we are against `success.md`, in their words | success.md, delivery value ledger |
|
|
15
|
+
| **S - Situation** | Where we are against `success.md`, in their words - including whether the floor still uses the old path | success.md, delivery value ledger, reality.md workaround |
|
|
16
16
|
| **C - Complication** | What changed, what is at risk, or what we learned (bad news first) | risks.md, assumptions DISPROVED/OPEN, stakeholders signal |
|
|
17
17
|
| **Q - Question / Ask** | The one decision or help you need from them | decisions.md, access/sign-off needs |
|
|
18
18
|
| **A - Answer** | What you recommend / what happens next week (≤3 bullets) | plan Now lane, delivery promised→measured |
|
|
19
19
|
|
|
20
20
|
Then add, still on the same page:
|
|
21
21
|
1. **Value this week** - from the value ledger: promised → measured (or "pending") → **accepted by whom**, with evidence citation. A measured number nobody on the customer side has agreed to is written as `claimed`, and the Ask never rests on it - if the whole case for the next phase is a claimed number, the real ask this week is "who signs off that this is real?".
|
|
22
|
-
2. **
|
|
23
|
-
3. **
|
|
22
|
+
2. **Are they using it?** - Situation must say whether the workaround is still open: spreadsheet still running, shadow paste still happening, named operator completed Tuesday's job on the new path without you at the keyboard. A measured metric with the old path still live is `claimed`. That week's Ask is not "fund phase 2." It is "who on their side stops the old way, by when."
|
|
23
|
+
3. **Kill / defer reminder** - one line from the plan kill list so scope fights stay visible.
|
|
24
|
+
4. **Hostile Q prep** - three questions a skeptical sponsor will ask, with one-line answers from memory.
|
|
24
25
|
|
|
25
26
|
Exec voice: no jargon, no hedging, every claim traceable (`(shipped Tue, delivery.md)`). Draft in the **FDE's voice, for the FDE to send** - never send anything yourself.
|
|
26
27
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# red-team -
|
|
1
|
+
# red-team - Challenge the plan
|
|
2
2
|
|
|
3
3
|
**Enter when:** the FDE says "red-team this," "stress-test my thinking," "poke holes in this," "what am I missing," "challenge my plan" - or anytime they are about to walk into a high-stakes conversation (sponsor meeting, accumulation conversation, handoff, go-live) and want their blind spots exposed first.
|
|
4
4
|
|