feed-the-machine 1.6.1 → 1.7.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/LICENSE +21 -21
- package/README.md +170 -170
- package/bin/brain.py +1340 -0
- package/bin/convert_claude_skills_to_codex.py +490 -0
- package/bin/generate-manifest.mjs +463 -463
- package/bin/harden_codex_skills.py +141 -0
- package/bin/install.mjs +491 -491
- package/bin/migrate-eng-buddy-data.py +875 -0
- package/bin/playbook_engine/__init__.py +1 -0
- package/bin/playbook_engine/conftest.py +8 -0
- package/bin/playbook_engine/extractor.py +33 -0
- package/bin/playbook_engine/manager.py +102 -0
- package/bin/playbook_engine/models.py +84 -0
- package/bin/playbook_engine/registry.py +35 -0
- package/bin/playbook_engine/test_extractor.py +72 -0
- package/bin/playbook_engine/test_integration.py +129 -0
- package/bin/playbook_engine/test_manager.py +85 -0
- package/bin/playbook_engine/test_models.py +166 -0
- package/bin/playbook_engine/test_registry.py +67 -0
- package/bin/playbook_engine/test_tracer.py +86 -0
- package/bin/playbook_engine/tracer.py +93 -0
- package/bin/tasks_db.py +456 -0
- package/docs/HOOKS.md +243 -243
- package/docs/INBOX.md +233 -233
- package/ftm/SKILL.md +125 -122
- package/ftm-audit/SKILL.md +623 -623
- package/ftm-audit/references/protocols/PROJECT-PATTERNS.md +91 -91
- package/ftm-audit/references/protocols/RUNTIME-WIRING.md +66 -66
- package/ftm-audit/references/protocols/WIRING-CONTRACTS.md +135 -135
- package/ftm-audit/references/strategies/AUTO-FIX-STRATEGIES.md +69 -69
- package/ftm-audit/references/templates/REPORT-FORMAT.md +96 -96
- package/ftm-audit/scripts/run-knip.sh +23 -23
- package/ftm-audit.yml +2 -2
- package/ftm-brainstorm/SKILL.md +1003 -498
- package/ftm-brainstorm/evals/evals.json +180 -100
- package/ftm-brainstorm/evals/promptfoo.yaml +109 -109
- package/ftm-brainstorm/references/agent-prompts.md +552 -224
- package/ftm-brainstorm/references/plan-template.md +209 -121
- package/ftm-brainstorm.yml +2 -2
- package/ftm-browse/SKILL.md +454 -454
- package/ftm-browse/daemon/browser-manager.ts +206 -206
- package/ftm-browse/daemon/bun.lock +30 -30
- package/ftm-browse/daemon/cli.ts +347 -347
- package/ftm-browse/daemon/commands.ts +410 -410
- package/ftm-browse/daemon/main.ts +357 -357
- package/ftm-browse/daemon/package.json +17 -17
- package/ftm-browse/daemon/server.ts +189 -189
- package/ftm-browse/daemon/snapshot.ts +519 -519
- package/ftm-browse/daemon/tsconfig.json +22 -22
- package/ftm-browse.yml +4 -4
- package/ftm-capture/SKILL.md +370 -370
- package/ftm-capture.yml +4 -4
- package/ftm-codex-gate/SKILL.md +361 -361
- package/ftm-codex-gate.yml +2 -2
- package/ftm-config/SKILL.md +422 -345
- package/ftm-config.default.yml +125 -82
- package/ftm-config.yml +44 -2
- package/ftm-council/SKILL.md +416 -416
- package/ftm-council/references/prompts/CLAUDE-INVESTIGATION.md +60 -60
- package/ftm-council/references/prompts/CODEX-INVESTIGATION.md +58 -58
- package/ftm-council/references/prompts/GEMINI-INVESTIGATION.md +58 -58
- package/ftm-council/references/prompts/REBUTTAL-TEMPLATE.md +57 -57
- package/ftm-council/references/protocols/PREREQUISITES.md +47 -47
- package/ftm-council/references/protocols/STEP-0-FRAMING.md +46 -46
- package/ftm-council.yml +2 -2
- package/ftm-dashboard/SKILL.md +163 -163
- package/ftm-dashboard.yml +4 -4
- package/ftm-debug/SKILL.md +1037 -1037
- package/ftm-debug/references/phases/PHASE-0-INTAKE.md +58 -58
- package/ftm-debug/references/phases/PHASE-1-TRIAGE.md +46 -46
- package/ftm-debug/references/phases/PHASE-2-WAR-ROOM-AGENTS.md +279 -279
- package/ftm-debug/references/phases/PHASE-3-TO-6-EXECUTION.md +436 -436
- package/ftm-debug/references/protocols/BLACKBOARD.md +86 -86
- package/ftm-debug/references/protocols/EDGE-CASES.md +103 -103
- package/ftm-debug.yml +2 -2
- package/ftm-diagram/SKILL.md +277 -277
- package/ftm-diagram.yml +2 -2
- package/ftm-executor/SKILL.md +777 -777
- package/ftm-executor/references/STYLE-TEMPLATE.md +73 -73
- package/ftm-executor/references/phases/PHASE-0-VERIFICATION.md +62 -62
- package/ftm-executor/references/phases/PHASE-2-AGENT-ASSEMBLY.md +34 -34
- package/ftm-executor/references/phases/PHASE-3-WORKTREES.md +38 -38
- package/ftm-executor/references/phases/PHASE-4-5-AUDIT.md +72 -72
- package/ftm-executor/references/phases/PHASE-4-DISPATCH.md +66 -66
- package/ftm-executor/references/phases/PHASE-5-5-CODEX-GATE.md +73 -73
- package/ftm-executor/references/protocols/DOCUMENTATION-BOOTSTRAP.md +36 -36
- package/ftm-executor/references/protocols/MODEL-PROFILE.md +59 -59
- package/ftm-executor/references/protocols/PROGRESS-TRACKING.md +66 -66
- package/ftm-executor/runtime/ftm-runtime.mjs +252 -252
- package/ftm-executor/runtime/package.json +8 -8
- package/ftm-executor.yml +2 -2
- package/ftm-git/SKILL.md +441 -441
- package/ftm-git/evals/evals.json +26 -26
- package/ftm-git/evals/promptfoo.yaml +75 -75
- package/ftm-git/hooks/post-commit-experience.sh +92 -92
- package/ftm-git/references/patterns/SECRET-PATTERNS.md +104 -104
- package/ftm-git/references/protocols/REMEDIATION.md +139 -139
- package/ftm-git/scripts/pre-commit-secrets.sh +110 -110
- package/ftm-git.yml +2 -2
- package/ftm-inbox/backend/__pycache__/main.cpython-314.pyc +0 -0
- package/ftm-inbox/backend/adapters/_retry.py +64 -64
- package/ftm-inbox/backend/adapters/base.py +230 -230
- package/ftm-inbox/backend/adapters/freshservice.py +104 -104
- package/ftm-inbox/backend/adapters/gmail.py +125 -125
- package/ftm-inbox/backend/adapters/jira.py +136 -136
- package/ftm-inbox/backend/adapters/registry.py +192 -192
- package/ftm-inbox/backend/adapters/slack.py +110 -110
- package/ftm-inbox/backend/db/connection.py +54 -54
- package/ftm-inbox/backend/db/schema.py +78 -78
- package/ftm-inbox/backend/executor/__init__.py +7 -7
- package/ftm-inbox/backend/executor/engine.py +149 -149
- package/ftm-inbox/backend/executor/step_runner.py +98 -98
- package/ftm-inbox/backend/main.py +103 -103
- package/ftm-inbox/backend/models/__init__.py +1 -1
- package/ftm-inbox/backend/models/unified_task.py +36 -36
- package/ftm-inbox/backend/planner/__init__.py +6 -6
- package/ftm-inbox/backend/planner/__pycache__/__init__.cpython-314.pyc +0 -0
- package/ftm-inbox/backend/planner/__pycache__/generator.cpython-314.pyc +0 -0
- package/ftm-inbox/backend/planner/__pycache__/schema.cpython-314.pyc +0 -0
- package/ftm-inbox/backend/planner/generator.py +127 -127
- package/ftm-inbox/backend/planner/schema.py +34 -34
- package/ftm-inbox/backend/requirements.txt +5 -5
- package/ftm-inbox/backend/routes/__pycache__/plan.cpython-314.pyc +0 -0
- package/ftm-inbox/backend/routes/execute.py +186 -186
- package/ftm-inbox/backend/routes/health.py +52 -52
- package/ftm-inbox/backend/routes/inbox.py +68 -68
- package/ftm-inbox/backend/routes/plan.py +271 -271
- package/ftm-inbox/bin/launchagent.mjs +91 -91
- package/ftm-inbox/bin/setup.mjs +188 -188
- package/ftm-inbox/bin/start.sh +10 -10
- package/ftm-inbox/bin/status.sh +17 -17
- package/ftm-inbox/bin/stop.sh +8 -8
- package/ftm-inbox/config.example.yml +55 -55
- package/ftm-inbox/package-lock.json +2898 -2898
- package/ftm-inbox/package.json +26 -26
- package/ftm-inbox/postcss.config.js +6 -6
- package/ftm-inbox/src/app.css +199 -199
- package/ftm-inbox/src/app.html +18 -18
- package/ftm-inbox/src/lib/api.ts +166 -166
- package/ftm-inbox/src/lib/components/ExecutionLog.svelte +81 -81
- package/ftm-inbox/src/lib/components/InboxFeed.svelte +143 -143
- package/ftm-inbox/src/lib/components/PlanStep.svelte +271 -271
- package/ftm-inbox/src/lib/components/PlanView.svelte +206 -206
- package/ftm-inbox/src/lib/components/StreamPanel.svelte +99 -99
- package/ftm-inbox/src/lib/components/TaskCard.svelte +190 -190
- package/ftm-inbox/src/lib/components/ui/EmptyState.svelte +63 -63
- package/ftm-inbox/src/lib/components/ui/KawaiiCard.svelte +86 -86
- package/ftm-inbox/src/lib/components/ui/PillButton.svelte +106 -106
- package/ftm-inbox/src/lib/components/ui/StatusBadge.svelte +67 -67
- package/ftm-inbox/src/lib/components/ui/StreamDrawer.svelte +149 -149
- package/ftm-inbox/src/lib/components/ui/ThemeToggle.svelte +80 -80
- package/ftm-inbox/src/lib/theme.ts +47 -47
- package/ftm-inbox/src/routes/+layout.svelte +76 -76
- package/ftm-inbox/src/routes/+page.svelte +401 -401
- package/ftm-inbox/svelte.config.js +12 -12
- package/ftm-inbox/tailwind.config.ts +63 -63
- package/ftm-inbox/tsconfig.json +13 -13
- package/ftm-inbox/vite.config.ts +6 -6
- package/ftm-intent/SKILL.md +241 -241
- package/ftm-intent.yml +2 -2
- package/ftm-manifest.json +3794 -3794
- package/ftm-map/SKILL.md +291 -291
- package/ftm-map/scripts/db.py +712 -712
- package/ftm-map/scripts/index.py +415 -415
- package/ftm-map/scripts/parser.py +224 -224
- package/ftm-map/scripts/queries/go-tags.scm +20 -20
- package/ftm-map/scripts/queries/javascript-tags.scm +35 -35
- package/ftm-map/scripts/queries/python-tags.scm +31 -31
- package/ftm-map/scripts/queries/ruby-tags.scm +19 -19
- package/ftm-map/scripts/queries/rust-tags.scm +37 -37
- package/ftm-map/scripts/queries/typescript-tags.scm +41 -41
- package/ftm-map/scripts/query.py +301 -301
- package/ftm-map/scripts/ranker.py +377 -377
- package/ftm-map/scripts/requirements.txt +5 -5
- package/ftm-map/scripts/setup-hooks.sh +27 -27
- package/ftm-map/scripts/setup.sh +56 -56
- package/ftm-map/scripts/test_db.py +364 -364
- package/ftm-map/scripts/test_parser.py +174 -174
- package/ftm-map/scripts/test_query.py +183 -183
- package/ftm-map/scripts/test_ranker.py +199 -199
- package/ftm-map/scripts/views.py +591 -591
- package/ftm-map.yml +2 -2
- package/ftm-mind/SKILL.md +201 -1943
- package/ftm-mind/evals/promptfoo.yaml +142 -142
- package/ftm-mind/references/blackboard-protocol.md +110 -0
- package/ftm-mind/references/blackboard-schema.md +328 -328
- package/ftm-mind/references/complexity-guide.md +110 -110
- package/ftm-mind/references/complexity-sizing.md +138 -0
- package/ftm-mind/references/decide-act-protocol.md +172 -0
- package/ftm-mind/references/direct-execution.md +51 -0
- package/ftm-mind/references/environment-discovery.md +77 -0
- package/ftm-mind/references/event-registry.md +319 -319
- package/ftm-mind/references/mcp-inventory.md +300 -296
- package/ftm-mind/references/ops-routing.md +47 -0
- package/ftm-mind/references/orient-protocol.md +234 -0
- package/ftm-mind/references/personality.md +40 -0
- package/ftm-mind/references/protocols/COMPLEXITY-SIZING.md +72 -72
- package/ftm-mind/references/protocols/MCP-HEURISTICS.md +32 -32
- package/ftm-mind/references/protocols/PLAN-APPROVAL.md +80 -80
- package/ftm-mind/references/reflexion-protocol.md +249 -249
- package/ftm-mind/references/routing/SCENARIOS.md +22 -22
- package/ftm-mind/references/routing-scenarios.md +35 -35
- package/ftm-mind.yml +2 -2
- package/ftm-ops.yml +4 -0
- package/ftm-pause/SKILL.md +395 -395
- package/ftm-pause/references/protocols/SKILL-RESTORE-PROTOCOLS.md +186 -186
- package/ftm-pause/references/protocols/VALIDATION.md +80 -80
- package/ftm-pause.yml +2 -2
- package/ftm-researcher/SKILL.md +275 -275
- package/ftm-researcher/evals/agent-diversity.yaml +17 -17
- package/ftm-researcher/evals/synthesis-quality.yaml +12 -12
- package/ftm-researcher/evals/trigger-accuracy.yaml +39 -39
- package/ftm-researcher/references/adaptive-search.md +116 -116
- package/ftm-researcher/references/agent-prompts.md +193 -193
- package/ftm-researcher/references/council-integration.md +193 -193
- package/ftm-researcher/references/output-format.md +203 -203
- package/ftm-researcher/references/synthesis-pipeline.md +165 -165
- package/ftm-researcher/scripts/score_credibility.py +234 -234
- package/ftm-researcher/scripts/validate_research.py +92 -92
- package/ftm-researcher.yml +2 -2
- package/ftm-resume/SKILL.md +518 -518
- package/ftm-resume/references/protocols/VALIDATION.md +172 -172
- package/ftm-resume.yml +2 -2
- package/ftm-retro/SKILL.md +380 -380
- package/ftm-retro/references/protocols/SCORING-RUBRICS.md +89 -89
- package/ftm-retro/references/templates/REPORT-FORMAT.md +109 -109
- package/ftm-retro.yml +2 -2
- package/ftm-routine/SKILL.md +170 -170
- package/ftm-routine.yml +4 -4
- package/ftm-state/blackboard/capabilities.json +5 -5
- package/ftm-state/blackboard/capabilities.schema.json +27 -27
- package/ftm-state/blackboard/context.json +37 -23
- package/ftm-state/blackboard/experiences/doom-statusline-fix.json +26 -0
- package/ftm-state/blackboard/experiences/hackathon-pages-site.json +26 -0
- package/ftm-state/blackboard/experiences/hindsight-sso-kickoff.json +42 -0
- package/ftm-state/blackboard/experiences/index.json +58 -9
- package/ftm-state/blackboard/experiences/learning-ragnarok-api-access.json +23 -0
- package/ftm-state/blackboard/experiences/nordlayer-members-auto-assign.json +26 -0
- package/ftm-state/blackboard/experiences/saml2aws-stale-session-fix.json +41 -0
- package/ftm-state/blackboard/patterns.json +6 -6
- package/ftm-state/schemas/context.schema.json +130 -130
- package/ftm-state/schemas/experience-index.schema.json +77 -77
- package/ftm-state/schemas/experience.schema.json +78 -78
- package/ftm-state/schemas/patterns.schema.json +44 -44
- package/ftm-upgrade/SKILL.md +194 -194
- package/ftm-upgrade/scripts/check-version.sh +76 -76
- package/ftm-upgrade/scripts/upgrade.sh +143 -143
- package/ftm-upgrade.yml +2 -2
- package/ftm-verify.yml +2 -2
- package/ftm.yml +2 -2
- package/hooks/ftm-auto-log.sh +137 -0
- package/hooks/ftm-blackboard-enforcer.sh +93 -93
- package/hooks/ftm-discovery-reminder.sh +90 -90
- package/hooks/ftm-drafts-gate.sh +61 -61
- package/hooks/ftm-event-logger.mjs +107 -107
- package/hooks/ftm-install-hooks.sh +240 -0
- package/hooks/ftm-learning-capture.sh +117 -0
- package/hooks/ftm-map-autodetect.sh +79 -79
- package/hooks/ftm-pending-sync-check.sh +22 -22
- package/hooks/ftm-plan-gate.sh +92 -92
- package/hooks/ftm-post-commit-trigger.sh +57 -57
- package/hooks/ftm-post-compaction.sh +138 -0
- package/hooks/ftm-pre-compaction.sh +147 -0
- package/hooks/ftm-session-end.sh +52 -0
- package/hooks/ftm-session-snapshot.sh +213 -0
- package/hooks/settings-template.json +81 -81
- package/install.sh +363 -363
- package/package.json +84 -84
- package/uninstall.sh +25 -25
package/ftm-capture/SKILL.md
CHANGED
|
@@ -1,370 +1,370 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ftm-capture
|
|
3
|
-
description: Extract reusable routines, playbooks, and reference docs from the current session's work. Reads session context (blackboard, daily log, tool history), asks clarifying questions about generalizability, then writes to all three ftm knowledge layers. Use when user says "capture this", "save this as a routine", "make a playbook from this", "ftm capture", "codify this", "turn this into a routine", "extract the pattern", "save what we did", "learn from this", "remember how to do this", "don't make me explain this again".
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
## Events
|
|
7
|
-
|
|
8
|
-
### Emits
|
|
9
|
-
- `capture_complete` — when all three artifacts (routine, playbook, reference doc) are written
|
|
10
|
-
- `experience_recorded` — when the capture is logged to the blackboard experience layer
|
|
11
|
-
- `known_issue_recorded` — when API gotchas or failure workarounds are encoded
|
|
12
|
-
|
|
13
|
-
### Listens To
|
|
14
|
-
- `task_completed` — can be auto-triggered after task completion to suggest capture
|
|
15
|
-
- `pattern_discovered` — if ftm-retro identifies a recurring workflow, suggest capture
|
|
16
|
-
|
|
17
|
-
# FTM Capture — Session-to-Knowledge Extractor
|
|
18
|
-
|
|
19
|
-
Turns what you just did into reusable automation. Reads the current session's work (blackboard context, daily log, tool calls, experiences), asks 2-4 clarifying questions about generalizability, then writes to all three ftm knowledge layers simultaneously.
|
|
20
|
-
|
|
21
|
-
## Why This Exists
|
|
22
|
-
|
|
23
|
-
Every time you complete a repeatable workflow (SSO setup, service catalog creation, vendor onboarding, incident response), the knowledge lives only in the conversation. Next session starts from zero. ftm-capture closes this gap by extracting the pattern while context is fresh and writing it to durable storage that ftm-mind, ftm-routine, and
|
|
24
|
-
|
|
25
|
-
## Output Artifacts
|
|
26
|
-
|
|
27
|
-
ftm-capture writes to **three locations** simultaneously:
|
|
28
|
-
|
|
29
|
-
| Artifact | Location | Format | Consumer |
|
|
30
|
-
|---|---|---|---|
|
|
31
|
-
| **Routine** | `~/.ftm/routines/{name}.yml` | YAML with phases/steps | `ftm-routine` (executable) |
|
|
32
|
-
| **Playbook** | `~/.claude/
|
|
33
|
-
| **Reference Doc** | `~/Documents/Code/panda/docs/playbooks/{name}.md` | Markdown with gotchas | Future agents + humans |
|
|
34
|
-
|
|
35
|
-
All three are kept in sync. The routine is the executable version, the playbook has exact tool parameters, and the reference doc has the context and gotchas.
|
|
36
|
-
|
|
37
|
-
## Operating Modes
|
|
38
|
-
|
|
39
|
-
### Mode 1: Explicit Capture (`/ftm capture [name]`)
|
|
40
|
-
|
|
41
|
-
User invokes directly after completing work. This is the primary mode.
|
|
42
|
-
|
|
43
|
-
### Mode 2: Auto-Suggest (via ftm-retro or ftm-mind)
|
|
44
|
-
|
|
45
|
-
After ftm-retro scores an execution, if it detects a repeatable pattern, it suggests: "This looks like a reusable workflow. Run `/ftm capture` to save it."
|
|
46
|
-
|
|
47
|
-
ftm-mind can also suggest capture when it detects the user doing something they've done before (matching experiences in the blackboard).
|
|
48
|
-
|
|
49
|
-
### Mode 3: Inline Capture (mid-session)
|
|
50
|
-
|
|
51
|
-
User says "capture this" or "save what we just did" while still working. Capture the completed portion and note what's still in progress.
|
|
52
|
-
|
|
53
|
-
## Execution Protocol
|
|
54
|
-
|
|
55
|
-
### Step 1: Gather Session Context
|
|
56
|
-
|
|
57
|
-
Read these files in order:
|
|
58
|
-
|
|
59
|
-
1. **Blackboard context**: `~/.claude/ftm-state/blackboard/context.json`
|
|
60
|
-
- Extract: `current_task`, `recent_decisions`, `active_constraints`
|
|
61
|
-
2. **Today's daily log**: `~/.claude/
|
|
62
|
-
- Extract: completed items, tool calls, blockers encountered, lessons learned
|
|
63
|
-
3. **Recent experiences**: `~/.claude/ftm-state/blackboard/experiences/index.json`
|
|
64
|
-
- Filter for entries from today's session
|
|
65
|
-
- Load matching experience files for their `lessons` and `decisions_made`
|
|
66
|
-
4. **Existing routines**: `ls ~/.ftm/routines/` — check if a routine for this workflow already exists
|
|
67
|
-
5. **Existing playbooks**: `ls ~/.claude/
|
|
68
|
-
6. **Existing reference docs**: `ls ~/Documents/Code/panda/docs/playbooks/` — check for existing doc
|
|
69
|
-
|
|
70
|
-
If an existing artifact covers this workflow, the capture becomes an **update** not a create. Load the existing version and merge new learnings.
|
|
71
|
-
|
|
72
|
-
### Step 2: Identify the Pattern
|
|
73
|
-
|
|
74
|
-
From the gathered context, identify:
|
|
75
|
-
|
|
76
|
-
- **Workflow name**: kebab-case identifier (e.g., `sso-full-setup`, `vendor-onboarding`, `incident-response`)
|
|
77
|
-
- **Trigger**: What kicks off this workflow? (ticket type, user request, event)
|
|
78
|
-
- **Phases**: Major stages of the workflow (e.g., "Okta setup", "Freshservice config", "Vendor coordination")
|
|
79
|
-
- **Steps per phase**: Specific actions with tools, parameters, and verification
|
|
80
|
-
- **Decision points**: Where does the workflow branch based on input? (e.g., "SCIM supported?" → yes/no path)
|
|
81
|
-
- **Known issues**: API gotchas, workarounds, things that failed and were fixed
|
|
82
|
-
- **Environment assumptions**: What repo, what API access, what tools are available?
|
|
83
|
-
|
|
84
|
-
### Step 3: Clarifying Questions (2-4 max)
|
|
85
|
-
|
|
86
|
-
Ask the user focused questions to determine generalizability. DO NOT ask more than 4 questions. Pick the most important from:
|
|
87
|
-
|
|
88
|
-
**Generalizability questions:**
|
|
89
|
-
- "Is this always [SAML/OIDC] or does it vary by vendor?"
|
|
90
|
-
- "Are the approvers always [names] or does that change per app?"
|
|
91
|
-
- "Should this routine always use the API, or sometimes browser?"
|
|
92
|
-
- "Are there apps where [specific step] wouldn't apply?"
|
|
93
|
-
|
|
94
|
-
**Scope questions:**
|
|
95
|
-
- "Should this cover [adjacent step] too, or is that separate?"
|
|
96
|
-
- "Does this workflow change if the app supports SCIM?"
|
|
97
|
-
- "Should I parameterize [specific value] or hardcode it?"
|
|
98
|
-
|
|
99
|
-
**Environment questions:**
|
|
100
|
-
- "Does this only work in the ragnarok repo, or should it be repo-agnostic?"
|
|
101
|
-
- "Are there API access requirements I should document?"
|
|
102
|
-
|
|
103
|
-
### Step 4: Write the Routine (`~/.ftm/routines/{name}.yml`)
|
|
104
|
-
|
|
105
|
-
Follow the exact YAML format used by ftm-routine:
|
|
106
|
-
|
|
107
|
-
```yaml
|
|
108
|
-
name: {kebab-case-name}
|
|
109
|
-
description: |
|
|
110
|
-
{What this routine does, when to use it, critical ordering rules}
|
|
111
|
-
trigger: manual
|
|
112
|
-
tags: [{relevant, tags}]
|
|
113
|
-
|
|
114
|
-
# Usage:
|
|
115
|
-
# /ftm-routine {name}
|
|
116
|
-
# or: "{natural language trigger}"
|
|
117
|
-
#
|
|
118
|
-
# Required context:
|
|
119
|
-
# - {param}: {description}
|
|
120
|
-
|
|
121
|
-
phases:
|
|
122
|
-
- name: "Phase N: {Phase Name}"
|
|
123
|
-
steps:
|
|
124
|
-
- name: {Step description}
|
|
125
|
-
action: {api|playwright_cli|python_browser|mcp|skill|routine|comms|manual|wait}
|
|
126
|
-
tool: {tool_name}
|
|
127
|
-
params: {exact parameters}
|
|
128
|
-
notes: |
|
|
129
|
-
{Gotchas, workarounds, known issues}
|
|
130
|
-
approval: {none|review|approve}
|
|
131
|
-
|
|
132
|
-
known_issues:
|
|
133
|
-
- issue: "{Issue name}"
|
|
134
|
-
description: "{What goes wrong}"
|
|
135
|
-
fix: "{How to fix it}"
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
**Critical rules for routine writing:**
|
|
139
|
-
- Every step must specify the exact tool/action — no vague "do X"
|
|
140
|
-
- Include `notes` on steps that have known gotchas
|
|
141
|
-
- Use `approval: approve` for destructive or externally-visible actions
|
|
142
|
-
- Parameterize with `{curly_braces}` for values that change per invocation
|
|
143
|
-
- Include `known_issues` section with every API/tool gotcha discovered during the session
|
|
144
|
-
- Include environment assumptions (repo, API access, etc.) in the description
|
|
145
|
-
|
|
146
|
-
### Step 5: Write the Playbook (`~/.claude/
|
|
147
|
-
|
|
148
|
-
Follow the exact JSON format used by
|
|
149
|
-
|
|
150
|
-
```json
|
|
151
|
-
{
|
|
152
|
-
"id": "{kebab-case-name}",
|
|
153
|
-
"name": "{Human-readable name}",
|
|
154
|
-
"description": "{What and when}",
|
|
155
|
-
"trigger_keywords": ["{keywords}"],
|
|
156
|
-
"input_params": {
|
|
157
|
-
"{param}": {"type": "string", "description": "...", "required": true}
|
|
158
|
-
},
|
|
159
|
-
"steps": [
|
|
160
|
-
{
|
|
161
|
-
"number": 1,
|
|
162
|
-
"description": "{What this step does}",
|
|
163
|
-
"tool": "{exact_tool_name}",
|
|
164
|
-
"tool_params": {"exact": "params"},
|
|
165
|
-
"requires_human": false,
|
|
166
|
-
"notes": "{Gotchas}"
|
|
167
|
-
}
|
|
168
|
-
],
|
|
169
|
-
"rollback": {
|
|
170
|
-
"description": "{How to undo}",
|
|
171
|
-
"steps": ["{exact}", "{reversal}", "{steps}"]
|
|
172
|
-
},
|
|
173
|
-
"known_issues": [
|
|
174
|
-
{"issue": "{Name}", "description": "...", "fix": "..."}
|
|
175
|
-
],
|
|
176
|
-
"confidence": 1.0,
|
|
177
|
-
"version": 1,
|
|
178
|
-
"executions": 0,
|
|
179
|
-
"source": "captured",
|
|
180
|
-
"related_links": {}
|
|
181
|
-
}
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
**Critical rules for playbook writing:**
|
|
185
|
-
- Every step must have exact `tool` and `tool_params` —
|
|
186
|
-
- Include `rollback` section with exact reversal steps
|
|
187
|
-
- Set `requires_human: true` for steps needing auth, visual verification, or judgment
|
|
188
|
-
- `source: "captured"` distinguishes from `"manual"` or `"observed"`
|
|
189
|
-
|
|
190
|
-
### Step 6: Write the Reference Doc (`~/Documents/Code/panda/docs/playbooks/{name}.md`)
|
|
191
|
-
|
|
192
|
-
This is the human-readable + agent-readable reference that captures context, gotchas, and decision rationale:
|
|
193
|
-
|
|
194
|
-
```markdown
|
|
195
|
-
# {Workflow Name} — {Type} Playbook
|
|
196
|
-
|
|
197
|
-
## Purpose
|
|
198
|
-
{What this workflow does and when to use it}
|
|
199
|
-
|
|
200
|
-
## Execution Method
|
|
201
|
-
{Primary: API / Browser / Mixed — and why}
|
|
202
|
-
|
|
203
|
-
## Prerequisites
|
|
204
|
-
{API access, repo, tools, credentials needed}
|
|
205
|
-
|
|
206
|
-
## Phases
|
|
207
|
-
### Phase 1: {Name}
|
|
208
|
-
{Steps with exact tool calls, selectors, API endpoints}
|
|
209
|
-
|
|
210
|
-
### Phase 2: {Name}
|
|
211
|
-
...
|
|
212
|
-
|
|
213
|
-
## Known Issues & Gotchas
|
|
214
|
-
{Every API quirk, UI gotcha, and workaround discovered}
|
|
215
|
-
|
|
216
|
-
## Decision Points
|
|
217
|
-
{Where the workflow branches and how to decide}
|
|
218
|
-
|
|
219
|
-
## Information Needed from User
|
|
220
|
-
{What to collect before starting}
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
### Step 7: Record Experience
|
|
224
|
-
|
|
225
|
-
Write to `~/.claude/ftm-state/blackboard/experiences/{name}-capture.json`:
|
|
226
|
-
|
|
227
|
-
```json
|
|
228
|
-
{
|
|
229
|
-
"id": "{name}-capture",
|
|
230
|
-
"timestamp": "{ISO timestamp}",
|
|
231
|
-
"task_type": "knowledge-capture",
|
|
232
|
-
"tags": ["{workflow-type}", "capture", "routine", "playbook"],
|
|
233
|
-
"outcome": "success",
|
|
234
|
-
"description": "Captured {workflow name} as routine + playbook + reference doc",
|
|
235
|
-
"lessons": ["{key learnings encoded}"],
|
|
236
|
-
"files_touched": [
|
|
237
|
-
"~/.ftm/routines/{name}.yml",
|
|
238
|
-
"~/.claude/
|
|
239
|
-
"~/Documents/Code/panda/docs/playbooks/{name}.md"
|
|
240
|
-
],
|
|
241
|
-
"confidence": 1.0
|
|
242
|
-
}
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
Update `experiences/index.json` with the new entry.
|
|
246
|
-
|
|
247
|
-
### Step 8: Update Blackboard Context
|
|
248
|
-
|
|
249
|
-
Update `~/.claude/ftm-state/blackboard/context.json`:
|
|
250
|
-
- Set `current_task.status` to reflect capture completion
|
|
251
|
-
- Add to `recent_decisions`: what was captured and why
|
|
252
|
-
|
|
253
|
-
### Step 9: Report to User
|
|
254
|
-
|
|
255
|
-
Show a summary:
|
|
256
|
-
|
|
257
|
-
```
|
|
258
|
-
Captured: {workflow name}
|
|
259
|
-
|
|
260
|
-
Written to:
|
|
261
|
-
Routine: ~/.ftm/routines/{name}.yml
|
|
262
|
-
Playbook: ~/.claude/
|
|
263
|
-
Reference: ~/Documents/Code/panda/docs/playbooks/{name}.md
|
|
264
|
-
|
|
265
|
-
Known issues encoded: {count}
|
|
266
|
-
Parameters: {list of parameterized values}
|
|
267
|
-
Phases: {count} phases, {count} steps
|
|
268
|
-
|
|
269
|
-
Next time, run: /ftm-routine {name}
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
## Updating Existing Artifacts
|
|
273
|
-
|
|
274
|
-
If Step 1 finds an existing routine/playbook/reference doc:
|
|
275
|
-
|
|
276
|
-
1. Load the existing version
|
|
277
|
-
2. Show the user what exists vs what's new
|
|
278
|
-
3. Ask: "Update existing or create new version?"
|
|
279
|
-
4. If updating:
|
|
280
|
-
- Merge new steps into existing phases
|
|
281
|
-
- Add new known_issues (don't duplicate)
|
|
282
|
-
- Increment `version` in playbook JSON
|
|
283
|
-
- Add "Updated: {date} — {what changed}" to reference doc
|
|
284
|
-
5. If creating new:
|
|
285
|
-
- Use a different name (e.g., `sso-full-setup-v2`)
|
|
286
|
-
|
|
287
|
-
## Integration Points
|
|
288
|
-
|
|
289
|
-
### ftm-mind
|
|
290
|
-
ftm-mind knows about ftm-capture in its capability inventory. When ftm-mind detects:
|
|
291
|
-
- User completing a repeatable workflow
|
|
292
|
-
- Matching experiences in the blackboard (same task_type done 2+ times)
|
|
293
|
-
- User saying anything about "remembering" or "next time"
|
|
294
|
-
|
|
295
|
-
It should suggest: "This looks like a reusable pattern. Want me to `/ftm capture` it?"
|
|
296
|
-
|
|
297
|
-
### ftm-retro
|
|
298
|
-
After ftm-retro scores an execution, if the workflow is repeatable, it should note: "Consider running `/ftm capture {name}` to save this as a routine."
|
|
299
|
-
|
|
300
|
-
### ftm-routine
|
|
301
|
-
ftm-routine reads from `~/.ftm/routines/`. Anything ftm-capture writes there becomes immediately available via `/ftm-routine {name}`.
|
|
302
|
-
|
|
303
|
-
###
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
### Environment Awareness
|
|
307
|
-
|
|
308
|
-
When capturing, always note the environment context:
|
|
309
|
-
- **If in `~/Documents/Code/ragnarok`**: Full API access to Okta, Freshservice, Slack, AWS (via shared_services). Prefer API over browser.
|
|
310
|
-
- **If in other repos**: May not have API access. Default to browser automation or MCP tools.
|
|
311
|
-
- **Always document**: Which APIs are used, what credentials are needed, what repo provides the client libraries.
|
|
312
|
-
|
|
313
|
-
This prevents future sessions from trying to use APIs they don't have access to.
|
|
314
|
-
|
|
315
|
-
## Requirements
|
|
316
|
-
|
|
317
|
-
- reference: `~/.claude/ftm-state/blackboard/context.json` | required | current task and recent decisions for pattern extraction
|
|
318
|
-
- reference: `~/.claude/
|
|
319
|
-
- reference: `~/.claude/ftm-state/blackboard/experiences/index.json` | required | today's session experiences
|
|
320
|
-
- reference: `~/.ftm/routines/` | optional | check for existing routines before creating new one
|
|
321
|
-
- reference: `~/.claude/
|
|
322
|
-
- reference: `~/Documents/Code/panda/docs/playbooks/` | optional | check for existing reference docs before creating
|
|
323
|
-
|
|
324
|
-
## Risk
|
|
325
|
-
|
|
326
|
-
- level: low_write
|
|
327
|
-
- scope: writes YAML routine to ~/.ftm/routines/, JSON playbook to ~/.claude/
|
|
328
|
-
- rollback: delete the three written artifact files; remove experience entry from blackboard experiences/
|
|
329
|
-
|
|
330
|
-
## Approval Gates
|
|
331
|
-
|
|
332
|
-
- trigger: existing artifact found for this workflow name | action: show existing vs new content, ask user to confirm update or create new version
|
|
333
|
-
- trigger: Step 3 clarifying questions answered | action: proceed to write all three artifacts automatically (no additional gate)
|
|
334
|
-
- complexity_routing: micro → auto | small → auto | medium → auto | large → auto | xl → auto
|
|
335
|
-
|
|
336
|
-
## Fallbacks
|
|
337
|
-
|
|
338
|
-
- condition: blackboard context.json missing | action: ask user directly about the workflow to capture instead of reading from blackboard
|
|
339
|
-
- condition: daily log missing or empty | action: skip daily log extraction, rely on conversation context and blackboard experiences
|
|
340
|
-
- condition: ~/.ftm/routines/ directory doesn't exist | action: create directory before writing routine
|
|
341
|
-
- condition: docs/playbooks/ directory doesn't exist | action: create directory before writing reference doc
|
|
342
|
-
- condition: existing artifact found but cannot be parsed | action: treat as missing, create fresh artifact
|
|
343
|
-
|
|
344
|
-
## Capabilities
|
|
345
|
-
|
|
346
|
-
- mcp: none required directly (reads files and writes artifacts)
|
|
347
|
-
- env: none required
|
|
348
|
-
|
|
349
|
-
## Event Payloads
|
|
350
|
-
|
|
351
|
-
### capture_complete
|
|
352
|
-
- skill: string — "ftm-capture"
|
|
353
|
-
- workflow_name: string — kebab-case name of captured workflow
|
|
354
|
-
- routine_path: string — absolute path to written routine YAML
|
|
355
|
-
- playbook_path: string — absolute path to written playbook JSON
|
|
356
|
-
- reference_path: string — absolute path to written reference doc
|
|
357
|
-
- phases_count: number — number of workflow phases captured
|
|
358
|
-
- steps_count: number — total steps across all phases
|
|
359
|
-
- known_issues_count: number — API gotchas encoded
|
|
360
|
-
|
|
361
|
-
### experience_recorded
|
|
362
|
-
- skill: string — "ftm-capture"
|
|
363
|
-
- experience_path: string — path to written experience file
|
|
364
|
-
- workflow_name: string — name of captured workflow
|
|
365
|
-
|
|
366
|
-
### known_issue_recorded
|
|
367
|
-
- skill: string — "ftm-capture"
|
|
368
|
-
- workflow_name: string — workflow this issue belongs to
|
|
369
|
-
- issue: string — issue name
|
|
370
|
-
- fix: string — remediation approach encoded
|
|
1
|
+
---
|
|
2
|
+
name: ftm-capture
|
|
3
|
+
description: Extract reusable routines, playbooks, and reference docs from the current session's work. Reads session context (blackboard, daily log, tool history), asks clarifying questions about generalizability, then writes to all three ftm knowledge layers. Use when user says "capture this", "save this as a routine", "make a playbook from this", "ftm capture", "codify this", "turn this into a routine", "extract the pattern", "save what we did", "learn from this", "remember how to do this", "don't make me explain this again".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Events
|
|
7
|
+
|
|
8
|
+
### Emits
|
|
9
|
+
- `capture_complete` — when all three artifacts (routine, playbook, reference doc) are written
|
|
10
|
+
- `experience_recorded` — when the capture is logged to the blackboard experience layer
|
|
11
|
+
- `known_issue_recorded` — when API gotchas or failure workarounds are encoded
|
|
12
|
+
|
|
13
|
+
### Listens To
|
|
14
|
+
- `task_completed` — can be auto-triggered after task completion to suggest capture
|
|
15
|
+
- `pattern_discovered` — if ftm-retro identifies a recurring workflow, suggest capture
|
|
16
|
+
|
|
17
|
+
# FTM Capture — Session-to-Knowledge Extractor
|
|
18
|
+
|
|
19
|
+
Turns what you just did into reusable automation. Reads the current session's work (blackboard context, daily log, tool calls, experiences), asks 2-4 clarifying questions about generalizability, then writes to all three ftm knowledge layers simultaneously.
|
|
20
|
+
|
|
21
|
+
## Why This Exists
|
|
22
|
+
|
|
23
|
+
Every time you complete a repeatable workflow (SSO setup, service catalog creation, vendor onboarding, incident response), the knowledge lives only in the conversation. Next session starts from zero. ftm-capture closes this gap by extracting the pattern while context is fresh and writing it to durable storage that ftm-mind, ftm-routine, and ftm-ops can all access.
|
|
24
|
+
|
|
25
|
+
## Output Artifacts
|
|
26
|
+
|
|
27
|
+
ftm-capture writes to **three locations** simultaneously:
|
|
28
|
+
|
|
29
|
+
| Artifact | Location | Format | Consumer |
|
|
30
|
+
|---|---|---|---|
|
|
31
|
+
| **Routine** | `~/.ftm/routines/{name}.yml` | YAML with phases/steps | `ftm-routine` (executable) |
|
|
32
|
+
| **Playbook** | `~/.claude/ftm-ops/playbooks/{name}.json` | JSON with exact tool params | ftm-ops playbook engine |
|
|
33
|
+
| **Reference Doc** | `~/Documents/Code/panda/docs/playbooks/{name}.md` | Markdown with gotchas | Future agents + humans |
|
|
34
|
+
|
|
35
|
+
All three are kept in sync. The routine is the executable version, the playbook has exact tool parameters, and the reference doc has the context and gotchas.
|
|
36
|
+
|
|
37
|
+
## Operating Modes
|
|
38
|
+
|
|
39
|
+
### Mode 1: Explicit Capture (`/ftm capture [name]`)
|
|
40
|
+
|
|
41
|
+
User invokes directly after completing work. This is the primary mode.
|
|
42
|
+
|
|
43
|
+
### Mode 2: Auto-Suggest (via ftm-retro or ftm-mind)
|
|
44
|
+
|
|
45
|
+
After ftm-retro scores an execution, if it detects a repeatable pattern, it suggests: "This looks like a reusable workflow. Run `/ftm capture` to save it."
|
|
46
|
+
|
|
47
|
+
ftm-mind can also suggest capture when it detects the user doing something they've done before (matching experiences in the blackboard).
|
|
48
|
+
|
|
49
|
+
### Mode 3: Inline Capture (mid-session)
|
|
50
|
+
|
|
51
|
+
User says "capture this" or "save what we just did" while still working. Capture the completed portion and note what's still in progress.
|
|
52
|
+
|
|
53
|
+
## Execution Protocol
|
|
54
|
+
|
|
55
|
+
### Step 1: Gather Session Context
|
|
56
|
+
|
|
57
|
+
Read these files in order:
|
|
58
|
+
|
|
59
|
+
1. **Blackboard context**: `~/.claude/ftm-state/blackboard/context.json`
|
|
60
|
+
- Extract: `current_task`, `recent_decisions`, `active_constraints`
|
|
61
|
+
2. **Today's daily log**: `~/.claude/ftm-ops/daily/{today}.md`
|
|
62
|
+
- Extract: completed items, tool calls, blockers encountered, lessons learned
|
|
63
|
+
3. **Recent experiences**: `~/.claude/ftm-state/blackboard/experiences/index.json`
|
|
64
|
+
- Filter for entries from today's session
|
|
65
|
+
- Load matching experience files for their `lessons` and `decisions_made`
|
|
66
|
+
4. **Existing routines**: `ls ~/.ftm/routines/` — check if a routine for this workflow already exists
|
|
67
|
+
5. **Existing playbooks**: `ls ~/.claude/ftm-ops/playbooks/` — check for existing playbook
|
|
68
|
+
6. **Existing reference docs**: `ls ~/Documents/Code/panda/docs/playbooks/` — check for existing doc
|
|
69
|
+
|
|
70
|
+
If an existing artifact covers this workflow, the capture becomes an **update** not a create. Load the existing version and merge new learnings.
|
|
71
|
+
|
|
72
|
+
### Step 2: Identify the Pattern
|
|
73
|
+
|
|
74
|
+
From the gathered context, identify:
|
|
75
|
+
|
|
76
|
+
- **Workflow name**: kebab-case identifier (e.g., `sso-full-setup`, `vendor-onboarding`, `incident-response`)
|
|
77
|
+
- **Trigger**: What kicks off this workflow? (ticket type, user request, event)
|
|
78
|
+
- **Phases**: Major stages of the workflow (e.g., "Okta setup", "Freshservice config", "Vendor coordination")
|
|
79
|
+
- **Steps per phase**: Specific actions with tools, parameters, and verification
|
|
80
|
+
- **Decision points**: Where does the workflow branch based on input? (e.g., "SCIM supported?" → yes/no path)
|
|
81
|
+
- **Known issues**: API gotchas, workarounds, things that failed and were fixed
|
|
82
|
+
- **Environment assumptions**: What repo, what API access, what tools are available?
|
|
83
|
+
|
|
84
|
+
### Step 3: Clarifying Questions (2-4 max)
|
|
85
|
+
|
|
86
|
+
Ask the user focused questions to determine generalizability. DO NOT ask more than 4 questions. Pick the most important from:
|
|
87
|
+
|
|
88
|
+
**Generalizability questions:**
|
|
89
|
+
- "Is this always [SAML/OIDC] or does it vary by vendor?"
|
|
90
|
+
- "Are the approvers always [names] or does that change per app?"
|
|
91
|
+
- "Should this routine always use the API, or sometimes browser?"
|
|
92
|
+
- "Are there apps where [specific step] wouldn't apply?"
|
|
93
|
+
|
|
94
|
+
**Scope questions:**
|
|
95
|
+
- "Should this cover [adjacent step] too, or is that separate?"
|
|
96
|
+
- "Does this workflow change if the app supports SCIM?"
|
|
97
|
+
- "Should I parameterize [specific value] or hardcode it?"
|
|
98
|
+
|
|
99
|
+
**Environment questions:**
|
|
100
|
+
- "Does this only work in the ragnarok repo, or should it be repo-agnostic?"
|
|
101
|
+
- "Are there API access requirements I should document?"
|
|
102
|
+
|
|
103
|
+
### Step 4: Write the Routine (`~/.ftm/routines/{name}.yml`)
|
|
104
|
+
|
|
105
|
+
Follow the exact YAML format used by ftm-routine:
|
|
106
|
+
|
|
107
|
+
```yaml
|
|
108
|
+
name: {kebab-case-name}
|
|
109
|
+
description: |
|
|
110
|
+
{What this routine does, when to use it, critical ordering rules}
|
|
111
|
+
trigger: manual
|
|
112
|
+
tags: [{relevant, tags}]
|
|
113
|
+
|
|
114
|
+
# Usage:
|
|
115
|
+
# /ftm-routine {name}
|
|
116
|
+
# or: "{natural language trigger}"
|
|
117
|
+
#
|
|
118
|
+
# Required context:
|
|
119
|
+
# - {param}: {description}
|
|
120
|
+
|
|
121
|
+
phases:
|
|
122
|
+
- name: "Phase N: {Phase Name}"
|
|
123
|
+
steps:
|
|
124
|
+
- name: {Step description}
|
|
125
|
+
action: {api|playwright_cli|python_browser|mcp|skill|routine|comms|manual|wait}
|
|
126
|
+
tool: {tool_name}
|
|
127
|
+
params: {exact parameters}
|
|
128
|
+
notes: |
|
|
129
|
+
{Gotchas, workarounds, known issues}
|
|
130
|
+
approval: {none|review|approve}
|
|
131
|
+
|
|
132
|
+
known_issues:
|
|
133
|
+
- issue: "{Issue name}"
|
|
134
|
+
description: "{What goes wrong}"
|
|
135
|
+
fix: "{How to fix it}"
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Critical rules for routine writing:**
|
|
139
|
+
- Every step must specify the exact tool/action — no vague "do X"
|
|
140
|
+
- Include `notes` on steps that have known gotchas
|
|
141
|
+
- Use `approval: approve` for destructive or externally-visible actions
|
|
142
|
+
- Parameterize with `{curly_braces}` for values that change per invocation
|
|
143
|
+
- Include `known_issues` section with every API/tool gotcha discovered during the session
|
|
144
|
+
- Include environment assumptions (repo, API access, etc.) in the description
|
|
145
|
+
|
|
146
|
+
### Step 5: Write the Playbook (`~/.claude/ftm-ops/playbooks/{name}.json`)
|
|
147
|
+
|
|
148
|
+
Follow the exact JSON format used by ftm-ops playbooks:
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"id": "{kebab-case-name}",
|
|
153
|
+
"name": "{Human-readable name}",
|
|
154
|
+
"description": "{What and when}",
|
|
155
|
+
"trigger_keywords": ["{keywords}"],
|
|
156
|
+
"input_params": {
|
|
157
|
+
"{param}": {"type": "string", "description": "...", "required": true}
|
|
158
|
+
},
|
|
159
|
+
"steps": [
|
|
160
|
+
{
|
|
161
|
+
"number": 1,
|
|
162
|
+
"description": "{What this step does}",
|
|
163
|
+
"tool": "{exact_tool_name}",
|
|
164
|
+
"tool_params": {"exact": "params"},
|
|
165
|
+
"requires_human": false,
|
|
166
|
+
"notes": "{Gotchas}"
|
|
167
|
+
}
|
|
168
|
+
],
|
|
169
|
+
"rollback": {
|
|
170
|
+
"description": "{How to undo}",
|
|
171
|
+
"steps": ["{exact}", "{reversal}", "{steps}"]
|
|
172
|
+
},
|
|
173
|
+
"known_issues": [
|
|
174
|
+
{"issue": "{Name}", "description": "...", "fix": "..."}
|
|
175
|
+
],
|
|
176
|
+
"confidence": 1.0,
|
|
177
|
+
"version": 1,
|
|
178
|
+
"executions": 0,
|
|
179
|
+
"source": "captured",
|
|
180
|
+
"related_links": {}
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**Critical rules for playbook writing:**
|
|
185
|
+
- Every step must have exact `tool` and `tool_params` — ftm-ops executes these literally
|
|
186
|
+
- Include `rollback` section with exact reversal steps
|
|
187
|
+
- Set `requires_human: true` for steps needing auth, visual verification, or judgment
|
|
188
|
+
- `source: "captured"` distinguishes from `"manual"` or `"observed"`
|
|
189
|
+
|
|
190
|
+
### Step 6: Write the Reference Doc (`~/Documents/Code/panda/docs/playbooks/{name}.md`)
|
|
191
|
+
|
|
192
|
+
This is the human-readable + agent-readable reference that captures context, gotchas, and decision rationale:
|
|
193
|
+
|
|
194
|
+
```markdown
|
|
195
|
+
# {Workflow Name} — {Type} Playbook
|
|
196
|
+
|
|
197
|
+
## Purpose
|
|
198
|
+
{What this workflow does and when to use it}
|
|
199
|
+
|
|
200
|
+
## Execution Method
|
|
201
|
+
{Primary: API / Browser / Mixed — and why}
|
|
202
|
+
|
|
203
|
+
## Prerequisites
|
|
204
|
+
{API access, repo, tools, credentials needed}
|
|
205
|
+
|
|
206
|
+
## Phases
|
|
207
|
+
### Phase 1: {Name}
|
|
208
|
+
{Steps with exact tool calls, selectors, API endpoints}
|
|
209
|
+
|
|
210
|
+
### Phase 2: {Name}
|
|
211
|
+
...
|
|
212
|
+
|
|
213
|
+
## Known Issues & Gotchas
|
|
214
|
+
{Every API quirk, UI gotcha, and workaround discovered}
|
|
215
|
+
|
|
216
|
+
## Decision Points
|
|
217
|
+
{Where the workflow branches and how to decide}
|
|
218
|
+
|
|
219
|
+
## Information Needed from User
|
|
220
|
+
{What to collect before starting}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Step 7: Record Experience
|
|
224
|
+
|
|
225
|
+
Write to `~/.claude/ftm-state/blackboard/experiences/{name}-capture.json`:
|
|
226
|
+
|
|
227
|
+
```json
|
|
228
|
+
{
|
|
229
|
+
"id": "{name}-capture",
|
|
230
|
+
"timestamp": "{ISO timestamp}",
|
|
231
|
+
"task_type": "knowledge-capture",
|
|
232
|
+
"tags": ["{workflow-type}", "capture", "routine", "playbook"],
|
|
233
|
+
"outcome": "success",
|
|
234
|
+
"description": "Captured {workflow name} as routine + playbook + reference doc",
|
|
235
|
+
"lessons": ["{key learnings encoded}"],
|
|
236
|
+
"files_touched": [
|
|
237
|
+
"~/.ftm/routines/{name}.yml",
|
|
238
|
+
"~/.claude/ftm-ops/playbooks/{name}.json",
|
|
239
|
+
"~/Documents/Code/panda/docs/playbooks/{name}.md"
|
|
240
|
+
],
|
|
241
|
+
"confidence": 1.0
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Update `experiences/index.json` with the new entry.
|
|
246
|
+
|
|
247
|
+
### Step 8: Update Blackboard Context
|
|
248
|
+
|
|
249
|
+
Update `~/.claude/ftm-state/blackboard/context.json`:
|
|
250
|
+
- Set `current_task.status` to reflect capture completion
|
|
251
|
+
- Add to `recent_decisions`: what was captured and why
|
|
252
|
+
|
|
253
|
+
### Step 9: Report to User
|
|
254
|
+
|
|
255
|
+
Show a summary:
|
|
256
|
+
|
|
257
|
+
```
|
|
258
|
+
Captured: {workflow name}
|
|
259
|
+
|
|
260
|
+
Written to:
|
|
261
|
+
Routine: ~/.ftm/routines/{name}.yml
|
|
262
|
+
Playbook: ~/.claude/ftm-ops/playbooks/{name}.json
|
|
263
|
+
Reference: ~/Documents/Code/panda/docs/playbooks/{name}.md
|
|
264
|
+
|
|
265
|
+
Known issues encoded: {count}
|
|
266
|
+
Parameters: {list of parameterized values}
|
|
267
|
+
Phases: {count} phases, {count} steps
|
|
268
|
+
|
|
269
|
+
Next time, run: /ftm-routine {name}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
## Updating Existing Artifacts
|
|
273
|
+
|
|
274
|
+
If Step 1 finds an existing routine/playbook/reference doc:
|
|
275
|
+
|
|
276
|
+
1. Load the existing version
|
|
277
|
+
2. Show the user what exists vs what's new
|
|
278
|
+
3. Ask: "Update existing or create new version?"
|
|
279
|
+
4. If updating:
|
|
280
|
+
- Merge new steps into existing phases
|
|
281
|
+
- Add new known_issues (don't duplicate)
|
|
282
|
+
- Increment `version` in playbook JSON
|
|
283
|
+
- Add "Updated: {date} — {what changed}" to reference doc
|
|
284
|
+
5. If creating new:
|
|
285
|
+
- Use a different name (e.g., `sso-full-setup-v2`)
|
|
286
|
+
|
|
287
|
+
## Integration Points
|
|
288
|
+
|
|
289
|
+
### ftm-mind
|
|
290
|
+
ftm-mind knows about ftm-capture in its capability inventory. When ftm-mind detects:
|
|
291
|
+
- User completing a repeatable workflow
|
|
292
|
+
- Matching experiences in the blackboard (same task_type done 2+ times)
|
|
293
|
+
- User saying anything about "remembering" or "next time"
|
|
294
|
+
|
|
295
|
+
It should suggest: "This looks like a reusable pattern. Want me to `/ftm capture` it?"
|
|
296
|
+
|
|
297
|
+
### ftm-retro
|
|
298
|
+
After ftm-retro scores an execution, if the workflow is repeatable, it should note: "Consider running `/ftm capture {name}` to save this as a routine."
|
|
299
|
+
|
|
300
|
+
### ftm-routine
|
|
301
|
+
ftm-routine reads from `~/.ftm/routines/`. Anything ftm-capture writes there becomes immediately available via `/ftm-routine {name}`.
|
|
302
|
+
|
|
303
|
+
### ftm-ops
|
|
304
|
+
ftm-ops's playbook engine reads from `~/.claude/ftm-ops/playbooks/`. Captured playbooks show up on the dashboard's Playbooks tab.
|
|
305
|
+
|
|
306
|
+
### Environment Awareness
|
|
307
|
+
|
|
308
|
+
When capturing, always note the environment context:
|
|
309
|
+
- **If in `~/Documents/Code/ragnarok`**: Full API access to Okta, Freshservice, Slack, AWS (via shared_services). Prefer API over browser.
|
|
310
|
+
- **If in other repos**: May not have API access. Default to browser automation or MCP tools.
|
|
311
|
+
- **Always document**: Which APIs are used, what credentials are needed, what repo provides the client libraries.
|
|
312
|
+
|
|
313
|
+
This prevents future sessions from trying to use APIs they don't have access to.
|
|
314
|
+
|
|
315
|
+
## Requirements
|
|
316
|
+
|
|
317
|
+
- reference: `~/.claude/ftm-state/blackboard/context.json` | required | current task and recent decisions for pattern extraction
|
|
318
|
+
- reference: `~/.claude/ftm-ops/daily/{today}.md` | optional | daily log for completed items and tool calls
|
|
319
|
+
- reference: `~/.claude/ftm-state/blackboard/experiences/index.json` | required | today's session experiences
|
|
320
|
+
- reference: `~/.ftm/routines/` | optional | check for existing routines before creating new one
|
|
321
|
+
- reference: `~/.claude/ftm-ops/playbooks/` | optional | check for existing playbooks before creating
|
|
322
|
+
- reference: `~/Documents/Code/panda/docs/playbooks/` | optional | check for existing reference docs before creating
|
|
323
|
+
|
|
324
|
+
## Risk
|
|
325
|
+
|
|
326
|
+
- level: low_write
|
|
327
|
+
- scope: writes YAML routine to ~/.ftm/routines/, JSON playbook to ~/.claude/ftm-ops/playbooks/, and Markdown reference doc to ~/Documents/Code/panda/docs/playbooks/; writes experience to blackboard; does not modify project source code
|
|
328
|
+
- rollback: delete the three written artifact files; remove experience entry from blackboard experiences/
|
|
329
|
+
|
|
330
|
+
## Approval Gates
|
|
331
|
+
|
|
332
|
+
- trigger: existing artifact found for this workflow name | action: show existing vs new content, ask user to confirm update or create new version
|
|
333
|
+
- trigger: Step 3 clarifying questions answered | action: proceed to write all three artifacts automatically (no additional gate)
|
|
334
|
+
- complexity_routing: micro → auto | small → auto | medium → auto | large → auto | xl → auto
|
|
335
|
+
|
|
336
|
+
## Fallbacks
|
|
337
|
+
|
|
338
|
+
- condition: blackboard context.json missing | action: ask user directly about the workflow to capture instead of reading from blackboard
|
|
339
|
+
- condition: daily log missing or empty | action: skip daily log extraction, rely on conversation context and blackboard experiences
|
|
340
|
+
- condition: ~/.ftm/routines/ directory doesn't exist | action: create directory before writing routine
|
|
341
|
+
- condition: docs/playbooks/ directory doesn't exist | action: create directory before writing reference doc
|
|
342
|
+
- condition: existing artifact found but cannot be parsed | action: treat as missing, create fresh artifact
|
|
343
|
+
|
|
344
|
+
## Capabilities
|
|
345
|
+
|
|
346
|
+
- mcp: none required directly (reads files and writes artifacts)
|
|
347
|
+
- env: none required
|
|
348
|
+
|
|
349
|
+
## Event Payloads
|
|
350
|
+
|
|
351
|
+
### capture_complete
|
|
352
|
+
- skill: string — "ftm-capture"
|
|
353
|
+
- workflow_name: string — kebab-case name of captured workflow
|
|
354
|
+
- routine_path: string — absolute path to written routine YAML
|
|
355
|
+
- playbook_path: string — absolute path to written playbook JSON
|
|
356
|
+
- reference_path: string — absolute path to written reference doc
|
|
357
|
+
- phases_count: number — number of workflow phases captured
|
|
358
|
+
- steps_count: number — total steps across all phases
|
|
359
|
+
- known_issues_count: number — API gotchas encoded
|
|
360
|
+
|
|
361
|
+
### experience_recorded
|
|
362
|
+
- skill: string — "ftm-capture"
|
|
363
|
+
- experience_path: string — path to written experience file
|
|
364
|
+
- workflow_name: string — name of captured workflow
|
|
365
|
+
|
|
366
|
+
### known_issue_recorded
|
|
367
|
+
- skill: string — "ftm-capture"
|
|
368
|
+
- workflow_name: string — workflow this issue belongs to
|
|
369
|
+
- issue: string — issue name
|
|
370
|
+
- fix: string — remediation approach encoded
|