fdeops 3.10.0 → 3.11.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.
@@ -1,10 +1,10 @@
1
1
  # Recipe: local file / paste (no source MCP)
2
2
 
3
- **Use when:** you already have a transcript, `.eml`, or export on disk — or you paste into chat.
3
+ **Use when:** you already have a transcript, `.eml`, or export on disk — or you paste into chat. This is the default FDE path.
4
4
 
5
5
  ## Setup
6
6
 
7
- None beyond the FDEOps sink (`fde` CLI and optionally `fdeops-ingest` MCP).
7
+ None. Bound workspace + `fde ingest` (or `@fde debrief` for short notes).
8
8
 
9
9
  ## Pull phrase
10
10
 
@@ -12,14 +12,14 @@ None beyond the FDEOps sink (`fde` CLI and optionally `fdeops-ingest` MCP).
12
12
  @fde stage this transcript into the fieldbook and propose updates
13
13
  ```
14
14
 
15
- (or attach / point at a path)
15
+ (or attach / point at a path, or paste and say debrief)
16
16
 
17
17
  ## Agent steps
18
18
 
19
- 1. Bind engagement.
20
- 2. `fde ingest stage --source file --title "<short>" <path>` (or stdin).
21
- 3. `fde ingest propose <id>` → rewrite prefixes → show FDE → on confirm `fde ingest apply`.
19
+ 1. Bind engagement (`fde resume`).
20
+ 2. Short paste → debrief verb. Long file → `fde ingest stage --source file --title "<short>" <path>`.
21
+ 3. Propose → rewrite prefixes → show FDE → on confirm apply.
22
22
 
23
23
  ## mcp.json
24
24
 
25
- Not required for the source. Optional sink only — see [../fdeops-ingest/README.md](../fdeops-ingest/README.md).
25
+ Not required.
@@ -2,16 +2,19 @@
2
2
 
3
3
  **Use when:** meeting notes live in Granola (or a similar notes MCP). FDEOps does not ship a Granola server — you add whichever MCP/export path you trust.
4
4
 
5
+ Daily path if the notes are already in chat or on disk: paste to `@fde debrief` or [file.md](./file.md). This recipe is only for **pull**.
6
+
5
7
  ## Setup (once)
6
8
 
7
- 1. Install / enable a **Granola (or notes) MCP** in Cursor/Claude per that product’s docs.
8
- 2. Add the FDEOps **sink** MCP (`fdeops-ingest`) — [../fdeops-ingest/README.md](../fdeops-ingest/README.md).
9
- 3. Reload MCP / restart the agent host.
10
- 4. Test: `@fde what can you pull?` — agent should see both sink tools and the notes source tools.
9
+ 1. Enable a **Granola (or notes) MCP** in Cursor/Claude per that product’s docs.
10
+ 2. Reload MCP / restart the host.
11
+ 3. Test: `@fde what can you pull?` — notes-source tools should appear.
12
+
13
+ The sink is **`fde ingest` in this bound workspace.** You do not need `fdeops-ingest` MCP for daily pull.
11
14
 
12
15
  ### Example mcp.json shape (illustrative)
13
16
 
14
- Replace `granola-mcp` command/args with whatever the real server documents. FDEOps only needs *some* tool that returns transcript text.
17
+ Replace command/args with whatever the real Granola MCP documents. FDEOps only needs *some* tool that returns transcript text.
15
18
 
16
19
  ```json
17
20
  {
@@ -22,19 +25,12 @@ Replace `granola-mcp` command/args with whatever the real server documents. FDEO
22
25
  "env": {
23
26
  "GRANOLA_API_KEY": "from-your-secrets"
24
27
  }
25
- },
26
- "fdeops-ingest": {
27
- "command": "node",
28
- "args": ["/absolute/path/to/fdeops/mcp/fdeops-ingest/server.js"],
29
- "env": {
30
- "FDEOPS_ENGAGEMENT": "/Users/you/fde-engagements/acme/.fde"
31
- }
32
28
  }
33
29
  }
34
30
  }
35
31
  ```
36
32
 
37
- **No Granola MCP available?** Export transcript to a file → follow [file.md](./file.md).
33
+ **No Granola MCP available?** Export transcript to a file → [file.md](./file.md).
38
34
 
39
35
  ## Pull phrase
40
36
 
@@ -44,15 +40,15 @@ Replace `granola-mcp` command/args with whatever the real server documents. FDEO
44
40
 
45
41
  ## Agent steps
46
42
 
47
- 1. Capability check — if no notes/Granola tools, run connect flow (`ingest-connect.md`).
48
- 2. Fetch transcript via source MCP (or ask which meeting).
49
- 3. `ingest_stage` / `fde ingest stage --source granola --title ""`.
50
- 4. Propose confirm apply. Never auto-apply.
43
+ 1. Capability check — notes-source tools present?
44
+ 2. Fetch transcript text (ask which meeting if ambiguous).
45
+ 3. `fde ingest stage --source granola --title "<short>"` then propose → confirm → apply.
46
+ 4. Extract decisions/risks/next do not dump the raw transcript into `.fde/`.
51
47
 
52
48
  ## Common fails
53
49
 
54
50
  | Symptom | Fix |
55
51
  |---------|-----|
56
- | Agent says it can’t reach Granola | MCP not saved / host not reloaded / wrong env key |
57
- | Wrong client inbox | Set `FDEOPS_ENGAGEMENT` or bind workspace (`fde resume --init`) |
58
- | Empty propose | Agent must rewrite `.debrief-propose` with type prefixes |
52
+ | No Granola tools | Source MCP not loaded they save + reload |
53
+ | Wrong meeting | One clarifying question, then fetch |
54
+ | Wrong engagement | `fde resume` in this workspace before staging |
@@ -1,13 +1,14 @@
1
1
  # Recipe: Notion docs / meeting notes
2
2
 
3
- **Use when:** useful engagement notes live in Notion. FDEOps does not ship a Notion server — use a Notion MCP (or export markdown).
3
+ **Use when:** useful engagement notes live in Notion. FDEOps does not ship a Notion server — use a Notion MCP (or export markdown). We do not write back to Notion.
4
4
 
5
5
  ## Setup (once)
6
6
 
7
- 1. Enable a **Notion MCP** (official or community) with a token that can read the pages you need.
8
- 2. Add **fdeops-ingest** sink [../fdeops-ingest/README.md](../fdeops-ingest/README.md).
9
- 3. Reload MCP / restart host.
10
- 4. Test: `@fde what can you pull?`
7
+ 1. Enable a **Notion MCP** (official or community) with a token that can **read** the pages you need.
8
+ 2. Reload MCP / restart host.
9
+ 3. Test: `@fde what can you pull?`
10
+
11
+ The sink is **`fde ingest` in this bound workspace.** `fdeops-ingest` MCP is optional.
11
12
 
12
13
  ### Example mcp.json shape (illustrative)
13
14
 
@@ -20,13 +21,6 @@
20
21
  "env": {
21
22
  "NOTION_TOKEN": "from-your-secrets"
22
23
  }
23
- },
24
- "fdeops-ingest": {
25
- "command": "node",
26
- "args": ["/absolute/path/to/fdeops/mcp/fdeops-ingest/server.js"],
27
- "env": {
28
- "FDEOPS_ENGAGEMENT": "/Users/you/fde-engagements/acme/.fde"
29
- }
30
24
  }
31
25
  }
32
26
  }
@@ -42,15 +36,19 @@
42
36
 
43
37
  ## Agent steps
44
38
 
45
- 1. Capability check — Notion tools present?
46
- 2. Fetch page/block text via Notion MCP (ask which page if ambiguous).
47
- 3. Stage with `--source notion`.
48
- 4. Propose → confirm → apply.
39
+ 1. Capability check — Notion read tools present?
40
+ 2. Fetch page/block text (ask which page if ambiguous).
41
+ 3. `fde ingest stage --source notion --title "<short>"` → propose → confirm → apply.
42
+
43
+ ## Never
44
+
45
+ - Create or edit Notion pages from FDEOps.
46
+ - Ambient-sync a database.
49
47
 
50
48
  ## Common fails
51
49
 
52
50
  | Symptom | Fix |
53
51
  |---------|-----|
54
52
  | 401 / forbidden | Token lacks access to that workspace/page |
55
- | Huge page dump | Stage full text in `.inbox/`; propose only short dated facts |
56
- | Wrong engagement | Bind / `FDEOPS_ENGAGEMENT` |
53
+ | Huge page dump | Stage full text in `.inbox/`; apply only short dated facts |
54
+ | Wrong engagement | Bind this workspace before staging |
@@ -0,0 +1,61 @@
1
+ # Recipe: Slack (pull only)
2
+
3
+ **Use when:** useful context lives in a Slack thread or channel. FDEOps does **not** ship a Slack server, does **not** post messages, and does **not** sync channels.
4
+
5
+ You add whatever Slack MCP your host already supports. We only accept **text you pulled**, then the same confirm loop as a debrief.
6
+
7
+ ## Setup (once)
8
+
9
+ 1. Enable a **Slack MCP** (official or community) with read access to the threads you need.
10
+ 2. Reload MCP / restart the host.
11
+ 3. Test: `@fde what can you pull?` — Slack fetch tools should appear. The FDEOps **CLI** (`fde ingest`) is the sink if this workspace is bound; you do not need `fdeops-ingest` MCP for daily use.
12
+
13
+ ### Example mcp.json shape (illustrative)
14
+
15
+ Replace the Slack server with whatever that MCP actually documents. Do not invent a package name.
16
+
17
+ ```json
18
+ {
19
+ "mcpServers": {
20
+ "slack": {
21
+ "command": "npx",
22
+ "args": ["-y", "YOUR-SLACK-MCP-PACKAGE"],
23
+ "env": {
24
+ "SLACK_BOT_TOKEN": "from-your-secrets"
25
+ }
26
+ }
27
+ }
28
+ }
29
+ ```
30
+
31
+ Optional sink MCP (only if you are not running `fde ingest` from this workspace): see [../fdeops-ingest/README.md](../fdeops-ingest/README.md). Pass `engagement` as the path to this client's `.fde/` (from `fde resume --bind`).
32
+
33
+ **No Slack MCP?** Copy the thread to a file or paste into chat → [file.md](./file.md) or `@fde debrief`.
34
+
35
+ ## Pull phrase
36
+
37
+ ```text
38
+ @fde pull yesterday's #acme-launch thread into the fieldbook
39
+ ```
40
+
41
+ ## Agent steps
42
+
43
+ 1. Capability check — Slack **read** tools present? If not → this recipe, then stop.
44
+ 2. Fetch the thread/channel as **text** (ask which channel/thread if ambiguous).
45
+ 3. `fde ingest stage --source slack --title "<short>"` (CLI in this bound workspace).
46
+ 4. Propose → FDE confirms → apply. Extract decisions/risks/asks — do not dump the thread into `.fde/`.
47
+
48
+ ## Never
49
+
50
+ - Post, reply, or react in Slack from FDEOps.
51
+ - Background-sync a channel.
52
+ - Auto-apply.
53
+
54
+ ## Common fails
55
+
56
+ | Symptom | Fix |
57
+ |---------|-----|
58
+ | No Slack tools | Source MCP not loaded — they save + reload; we cannot silent-install |
59
+ | Missing channel | Token/scopes cannot read that workspace — their Slack admin, not FDEOps |
60
+ | Huge dump | Stage full text in `.inbox/`; apply only short dated facts |
61
+ | Wrong client | Bind this workspace (`fde resume`) before staging |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fdeops",
3
- "version": "3.10.0",
3
+ "version": "3.11.0",
4
4
  "description": "Field kit for engineers embedded in client work - a real CLI (recon, memory, portfolio), one @fde skill with field judgment on top, and hooks that make it automatic. Claude Code plugin and any agent that loads skills.",
5
5
  "bin": {
6
6
  "fdeops": "bin/install.js",
package/plugin.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "fdeops",
4
- "version": "3.10.0",
4
+ "version": "3.11.0",
5
5
  "description": "Engagement fieldbook for Forward Deployed Engineers: per-client memory in local .fde/ files, one @fde skill, land to close methodology. Local-only, no network.",
6
6
  "author": {
7
7
  "name": "Subash Natarajan",
@@ -83,13 +83,14 @@ When NOT to interrogate or challenge: unambiguous one-liners, mechanical ops, FD
83
83
  | (session entry / where are we) | `fde resume` or use injected TRIAGE; `fde resume --init <name>` only if unbound |
84
84
  | Day-1 look at the repo | `fde scan` - then you interpret against the brief |
85
85
  | "Debrief these notes" / pastes meeting notes | Prefer `fde debrief --smart <notes>` → **you** (the agent) rewrite `.debrief-propose` with `decision:`/`risk:`/`delivery:`/`contact:`/`next:` prefixes where needed → show FDE → on confirm `fde debrief --apply`. `--smart` is a prefix/keyword gate, not a brain. Fallback: structure prefixed lines yourself, show FDE, then `fde debrief` |
86
- | "Make sure we're up to date" / "pull relevant info" / "pull from Granola/email/transcript" | Bind engagement; **capability check** (which source MCPs exist this session — never pretend). If missing → connect flow. Else fetch → `fde ingest stage` `fde ingest propose` → rewrite prefixes → show FDE → on confirm `fde ingest apply`. **Never auto-apply. Never ambient sync.** Detail: `references/ingest.md` |
87
- | "Connect a new MCP" / "connect Granola/Notion" / "what can you pull?" | Follow `references/ingest-connect.md`: ask which source emit `mcp.json` from `mcp/recipes/` + sink block → they save/reload in Cursor/Claude → verify tools → optional test stage to `.inbox/` only. You cannot silently install host MCPs. |
86
+ | "Make sure we're up to date" / "pull relevant info" / "pull from Granola/Slack/transcript" | Bind engagement; **capability check** (which *source* MCPs exist — never pretend). If missing → connect flow. Else fetch text → `fde ingest stage` **in this workspace** propose → rewrite prefixes → show FDE → on confirm `fde ingest apply`. MCP sink is optional; if used, pass `engagement` from `fde resume --bind`. **Never auto-apply. Never push. Never ambient sync.** Detail: `references/ingest.md` |
87
+ | "Connect a new MCP" / "connect Granola/Slack/Notion" / "what can you pull?" | Follow `references/ingest-connect.md`: source MCP only; sink is `fde ingest` here. They save/reload; you cannot silent-install. Paste still works with no MCP. |
88
88
  | "Prep me for the meeting with …" / walk-in brief | `fde prep "<short label>"` - present the brief in plain language; do not invent facts missing from `.fde/` |
89
89
  | "When did we agree…?" / scope dispute | `fde receipts <term>` - answer with dates; no hit = gap, not proof |
90
90
  | "Draft the sponsor update" / how are we doing | `fde status` then follow `references/status.md` for the narrative |
91
91
  | "Log that they went quiet" / trust signal | `fde log contact "…" --signal amber\|green\|red`. If they already named the color ("log that as amber"), that is the confirm — write it. If they only described the situation, playback the color once, then write. |
92
92
  | Want the HTML fieldbook | `fde dashboard` |
93
+ | "Open my clients in Obsidian" / one window over everything / "can I show this to the sponsor?" | `fde vault` (add `--redacted` for a shared screen). Derived and disposable: it is rebuilt from `.fde/` on every run and never read back, so tell them to keep logging to the fieldbook, not to the vault. |
93
94
  | "Clean up the fieldbook" / hygiene / memory feels messy | `fde doctor` - walk issues in plain language; propose fixes; never auto-rewrite without confirm. Includes structural gaps: empty operating map (plan+), stakeholder name forks (Denise vs Denise Chen), duplicates, ship/close risks. Contradictions need judgment (brief vs reality) - doctor is structural; you handle meaning. |
94
95
  | "Scrub this secret / redact that token" (buried line, not just last write) | `fde redact <term>` preview, then `fde redact <term> --apply` after confirm. Undo is last-write only; redact is for buried lines. Remind them to rotate the real credential. |
95
96
 
@@ -271,8 +272,8 @@ Running the engagement and ending it well.
271
272
  | Weekly update due, "need to send the sponsor something" | status | `references/status.md` |
272
273
  | Demo coming up, show-and-tell, exec walkthrough | demo-prep | `references/demo-prep.md` |
273
274
  | Just out of a meeting, raw notes, "they said…", "debrief" | debrief | the debrief verb (above) + `references/debrief.md` |
274
- | Make sure we're up to date, pull what's relevant, fetch from Granola/Gmail/transcript | ingest | `references/ingest.md` (capability check → stage → propose → confirm → apply) |
275
- | Connect a new MCP / connect Granola or Notion / what can you pull | ingest-connect | `references/ingest-connect.md` (+ `mcp/recipes/`) |
275
+ | 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) |
276
+ | Connect a new MCP / connect Granola Slack or Notion / what can you pull | ingest-connect | `references/ingest-connect.md` (+ `mcp/recipes/`) |
276
277
  | Prep me for a meeting / walk-in brief / "what should I know before I talk to…" | - | run `fde prep "<label>"`, present in plain language |
277
278
  | Sponsor's boss needs a summary, board update, justify continued investment | exec-narrative | `references/exec-narrative.md` |
278
279
  | Status across all my customers | dashboard | `references/dashboard.md` |
@@ -1,36 +1,34 @@
1
1
  # ingest-connect - wire a source MCP in plain language
2
2
 
3
- **Enter when:** the FDE says "I want to connect a new MCP", "connect Granola / Notion / Drive", "how do I pull from …", or a pull request fails because no source tools exist.
3
+ **Enter when:** the FDE says "I want to connect a new MCP", "connect Granola / Slack / Notion", "how do I pull from …", or a pull request fails because no source tools exist.
4
4
 
5
- **Read first:** `references/ingest.md` (sink contract). Recipe pack: `mcp/recipes/` in the fdeops install (file, granola, notion).
5
+ **Read first:** `references/ingest.md` (sink contract). Recipes: `mcp/recipes/` (file, granola, slack, notion).
6
6
 
7
7
  **Who runs setup:** you guide; the **host** (Cursor/Claude) must save MCP config. You cannot silently install servers into the host.
8
8
 
9
9
  ## Honest contract
10
10
 
11
- - FDEOps = **sink** (`fdeops-ingest` / `fde ingest`). Sources = **whatever MCP the FDE adds**.
12
- - You produce a ready config snippet + steps. They save + reload. Then you verify with a capability check + optional test stage.
13
- - Never invent that Granola/Notion is available if tools are missing. Never ambient sync. Never auto-apply to `.fde/`.
11
+ - **Daily work does not need a source MCP.** Paste notes → debrief. File on disk `fde ingest`.
12
+ - **Connect means a source**, not FDEOps. Granola/Slack/Notion credentials stay with that MCP. FDEOps never pushes, never ambient-syncs, never stores their tokens.
13
+ - **Sink is the CLI in this bound workspace** (`fde ingest`). `fdeops-ingest` MCP is optional. If you use it, pass `engagement` as the `.fde/` path from `fde resume --bind` (MCP servers often do not inherit the workspace bind).
14
+ - Never invent that Granola/Slack is available if tools are missing. Never auto-apply to `.fde/`.
14
15
 
15
16
  ## Method
16
17
 
17
- 1. **Ask one question** — which source? (`file` / `granola` / `notion` / other name). If "other", ask for the MCP package or docs URL they intend to use.
18
+ 1. **Ask one question** — which source? (`file` / `granola` / `slack` / `notion` / other). If "other", ask for the MCP they intend to use. If they just want paste → send them to debrief and stop.
18
19
  2. **Capability check (current session)** — list MCP tools you can actually call:
19
- - Sink present? (`ingest_stage` / `ingest_list` / or `fde ingest` CLI)
20
- - Source present? (anything that can fetch that system's content)
20
+ - Sink: `fde ingest` CLI (preferred) and/or `ingest_stage`
21
+ - Source: anything that can **fetch** that system's content (not post)
21
22
  - Say clearly: *available now* vs *needs config*.
22
- 3. **Emit config** open the matching recipe under `mcp/recipes/<source>.md`. Fill absolute paths:
23
- - path to `mcp/fdeops-ingest/server.js` (from this fdeops install)
24
- - `FDEOPS_ENGAGEMENT` this client's `…/<slug>/.fde`
25
- - placeholders for source API keys (tell them to paste secrets into host env — do not commit keys into the fieldbook)
26
- 4. **Tell them where to paste** — Cursor: MCP settings / `~/.cursor/mcp.json` (or project MCP). Claude Code: MCP config per their docs. One sentence: save → reload MCP / restart session.
27
- 5. **Verify** — after they confirm reload: re-run capability check. If source tools appear, offer a **test pull** into `.inbox/` only (stage + show list). Stop before apply unless they ask to propose.
28
- 6. **Handoff phrase** — give them the daily line, e.g. `@fde pull today's Acme Granola into the fieldbook`.
23
+ 3. **Emit config for the source only** open `mcp/recipes/<source>.md`. Fill placeholders from *that product's* docs. Tell them to paste secrets into host env — never into `.fde/`.
24
+ 4. **Tell them where to paste** — Cursor MCP settings / `mcp.json`. Claude Code: their MCP config. Save → reload MCP / restart session.
25
+ 5. **Verify** — after reload: re-run capability check. If source tools appear, offer a **test pull** staged to `.inbox/` only. Stop before apply unless they ask to propose.
26
+ 6. **Handoff phrase** e.g. `@fde pull today's Acme Granola into the fieldbook`.
29
27
 
30
- ## If they only want the sink
28
+ ## If they only want paste / files
31
29
 
32
- Still wire `fdeops-ingest` (or rely on CLI). File drops work with [mcp/recipes/file.md](../../../mcp/recipes/file.md) without any source MCP.
30
+ Do not add MCP. Use debrief or [mcp/recipes/file.md](../../../mcp/recipes/file.md).
33
31
 
34
32
  ## Checkpoint
35
33
 
36
- Before ending connect: (1) sink reachable, (2) source reachable or honest gap, (3) they know the pull phrase. Do not write `.fde/` during connect.
34
+ Before ending connect: (1) they know paste still works, (2) source reachable or honest gap, (3) they know the pull phrase. Do not write `.fde/` during connect.
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Enter when:** the FDE wants to catch the engagement up from external sources — "make sure Acme is up to date," "pull what's relevant," "grab today's Granola and Denise's last email." Raw transcripts and long emails that are too big to paste usefully.
4
4
 
5
- **Connect / capability (different entry):** "connect a new MCP", "connect Granola/Notion", "what can you pull?" → `references/ingest-connect.md` first. Recipes: `mcp/recipes/` (file, granola, notion).
5
+ **Connect / capability (different entry):** "connect a new MCP", "connect Granola/Slack/Notion", "what can you pull?" → `references/ingest-connect.md` first. Recipes: `mcp/recipes/` (file, granola, slack, notion).
6
6
 
7
7
  **Read first:** `context.md` (what's already logged, what's stale). Bind the engagement before staging anything.
8
8
 
@@ -11,7 +11,8 @@
11
11
  ## Honest contract (read once)
12
12
 
13
13
  - FDEOps owns the **sink only**: stage raw pulls → propose → confirm → apply. Nothing writes `.fde/` unreviewed.
14
- - **Source MCPs are the FDE's.** Granola, Gmail, Notion, custom — whatever they configured in Cursor/Claude. fdeops does not bundle OAuth, connectors, or ambient sync.
14
+ - **Source MCPs are the FDE's.** Granola, Slack, Notion, Gmail, custom — whatever they configured in Cursor/Claude. fdeops does not bundle OAuth, connectors, or ambient sync, and **does not push** to those tools.
15
+ - Prefer **`fde ingest` in this bound workspace.** Optional `fdeops-ingest` MCP: pass `engagement` (path to `.fde/` from `fde resume --bind`) because MCP cwd often is not the client workspace.
15
16
  - The core `fde` CLI stays local (git + file reads). Source credentials live with that MCP; fdeops never stores them.
16
17
  - After apply, raw stays in `.inbox/`; the system of record (`.fde/`) stays thin dated facts.
17
18
 
@@ -20,7 +21,7 @@
20
21
  List what you can actually call **this session**:
21
22
 
22
23
  1. **Sink** — `ingest_stage` / `fde ingest` available?
23
- 2. **Sources** — which fetch tools exist (Granola-shaped, Notion, Drive, file-only)?
24
+ 2. **Sources** — which fetch tools exist (Granola-shaped, Slack, Notion, Drive, file-only)?
24
25
  3. Tell the FDE in one line: *I can pull from X; Y is not connected.* If they asked to pull Y and it is missing → switch to `ingest-connect.md`. Never pretend a source exists.
25
26
 
26
27
  ## Ground loop (you do this work)
@@ -67,6 +68,6 @@ Before apply, read back the 2–3 most consequential captures in one breath —
67
68
 
68
69
  ## Principles
69
70
 
70
- - Pull on request, not on a schedule. No auto-poll, no vacuum of inbox or Slack.
71
+ - Pull on request, not on a schedule. No auto-poll, no vacuum of inbox or Slack. No posting back.
71
72
  - Staging is not memory. Only `--apply` after confirm writes `.fde/`.
72
73
  - Large artifact → ingest stage first; pasted short notes → debrief verb directly (`references/debrief.md`).
@@ -4,8 +4,8 @@
4
4
 
5
5
  | # | Assumption | Blast radius | How we test | Status | Evidence |
6
6
  |---|------------|--------------|-------------|--------|----------|
7
- | 1 | *(seed from brief - stated, unverified)* | CRITICAL / LOAD-BEARING / CONVENIENCE | | OPEN | |
8
7
 
9
- **Status values:** `OPEN` · `TESTING` · `CONFIRMED` · `DISPROVED` · `PARKED`
8
+ **Blast radius:** `CRITICAL` · `LOAD-BEARING` · `CONVENIENCE`
9
+ **Status:** `OPEN` · `TESTING` · `CONFIRMED` · `DISPROVED` · `PARKED`
10
10
 
11
11
  **Rule:** a CRITICAL assumption still OPEN blocks plan. DISPROVED → update `reality.md` / `success.md` and log the reset in `decisions.md` the same day.
@@ -6,13 +6,5 @@
6
6
 
7
7
  ## Decision log
8
8
 
9
- <!-- Use this format for each decision. The rationale is the part that survives the engagement. -->
10
-
11
- <!--
12
- ### [Date] Decision title
13
- - Context: what prompted this decision
14
- - Options considered: what was on the table
15
- - Decision: what was chosen
16
- - Rationale: why this over the alternatives
17
- - Owner: who approved
18
- -->
9
+ <!-- Dated lines: what was chosen, and why over the alternatives. Long form: docs/schema.md
10
+ - [2026-07-18] kept the vendor connector over an in-house rewrite - Priya wants the Q3 audit clean first -->
@@ -6,7 +6,9 @@
6
6
 
7
7
  | Date | Slice | Bucket | Promised | Measured | Accepted by | Evidence | Rollback |
8
8
  |------|-------|--------|----------|----------|-------------|----------|----------|
9
- | | | *(cost-save / risk-mitigation / revenue-uplift)* | *(what we said it would change)* | *(what actually changed, or pending)* | *(customer-side name + date, or it stays claimed)* | *(who/when/metric)* | |
9
+
10
+ **Bucket:** `cost-save` · `risk-mitigation` · `revenue-uplift`
11
+ **Accepted by:** a customer-side name and date - without one the value stays *claimed*, not accepted.
10
12
 
11
13
  ## Ship receipts
12
14
 
@@ -14,7 +16,9 @@
14
16
 
15
17
  | Date | Slice | Audit receipt | Eval receipt |
16
18
  |------|-------|---------------|--------------|
17
- | | | *(dated cite: exceptions/operating path verified — terrain/reality/audit)* | *(n/a \| evals.md pass + HITL owner)* |
19
+
20
+ **Audit receipt:** dated cite that the exception/operating path was verified (`terrain.md` / `reality.md`).
21
+ **Eval receipt:** `n/a` unless AI touches the slice, else `evals.md` pass + the HITL owner.
18
22
 
19
23
  ## Shipped
20
24
 
@@ -13,13 +13,11 @@
13
13
 
14
14
  | ID | Input (sanitized) | Expected | Pass rule | Last run | Result |
15
15
  |----|-------------------|----------|-----------|----------|--------|
16
- | G1 | | | | | |
17
16
 
18
17
  ## Failure modes
19
18
 
20
19
  | Mode | How it shows up | Detection | Mitigation |
21
20
  |------|-----------------|-----------|------------|
22
- | | | | |
23
21
 
24
22
  ## Pass / fail (this ship)
25
23
  - **Golden:** _/_ pass (threshold: _)
@@ -31,7 +29,6 @@
31
29
 
32
30
  | Decision / action | Autonomous OK? | Reviewer role | Escalation |
33
31
  |-------------------|----------------|---------------|------------|
34
- | | | | |
35
32
 
36
33
  **HITL rule for this ship:**
37
34
 
@@ -39,4 +36,3 @@
39
36
 
40
37
  | Date | What changed | Pack re-run? | Notes |
41
38
  |------|--------------|--------------|-------|
42
- | | | | |
@@ -2,4 +2,6 @@
2
2
 
3
3
  | Risk | Status | Owner | Mitigation |
4
4
  |------|--------|-------|------------|
5
- | | open | | |
5
+
6
+ **Status:** `open` · `mitigating` · `closed` · `accepted`
7
+ <!-- `fde log risk "<text>"` appends a dated line; the table is for live, owned risk. -->
@@ -5,7 +5,8 @@
5
5
 
6
6
  | Name | Role | Stance | Notes |
7
7
  |------|------|--------|-------|
8
- | | | champion / neutral / resistant | |
8
+
9
+ **Stance:** `champion` · `neutral` · `resistant`
9
10
 
10
11
  **Trust signal:** green | amber | red
11
12
  **Last trust check:**
@@ -13,7 +13,6 @@
13
13
 
14
14
  | Exception / break | Who notices first | What they do today (workaround) | System of record then | Blast if wrong | Evidence |
15
15
  |-------------------|-------------------|---------------------------------|-----------------------|----------------|----------|
16
- | | | | | | |
17
16
 
18
17
  **Shadow systems / silent workarounds:**
19
18
  **Sacred / untouchable in ops:**
@@ -23,4 +22,3 @@
23
22
 
24
23
  | Step | Deterministic | Model judgement | Human approve |
25
24
  |------|---------------|-----------------|---------------|
26
- | | | | |