feed-the-machine 1.5.0 → 1.6.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/generate-manifest.mjs +463 -463
- package/bin/install.mjs +491 -491
- package/docs/HOOKS.md +243 -243
- package/docs/INBOX.md +233 -233
- package/ftm/SKILL.md +122 -122
- package/ftm-audit/SKILL.md +623 -541
- 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 +498 -498
- package/ftm-brainstorm/evals/evals.json +100 -100
- package/ftm-brainstorm/evals/promptfoo.yaml +109 -109
- package/ftm-brainstorm/references/agent-prompts.md +224 -224
- package/ftm-brainstorm/references/plan-template.md +121 -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 +345 -345
- package/ftm-config.default.yml +82 -80
- package/ftm-config.yml +2 -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 -767
- 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 -44
- 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/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/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/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 +1943 -1943
- package/ftm-mind/evals/promptfoo.yaml +142 -142
- package/ftm-mind/references/blackboard-schema.md +328 -328
- package/ftm-mind/references/complexity-guide.md +110 -110
- package/ftm-mind/references/event-registry.md +319 -319
- package/ftm-mind/references/mcp-inventory.md +296 -296
- 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-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 +23 -23
- package/ftm-state/blackboard/experiences/index.json +9 -9
- 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-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-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/settings-template.json +81 -81
- package/install.sh +363 -363
- package/package.json +84 -84
- package/uninstall.sh +25 -25
package/ftm-researcher/SKILL.md
CHANGED
|
@@ -1,275 +1,275 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ftm-researcher
|
|
3
|
-
description: Deep parallel research engine with 7 domain-specialized finder agents, adversarial review via ftm-council, adaptive wave-based search, structured reconciliation with disagreement maps, credibility scoring, and conversational iteration. Use when the user wants thorough research on any topic — "research X", "find out about Y", "what's the state of the art on Z", "compare approaches to W", "deep dive into X", "look into Y". Also invoked by ftm-brainstorm for its research sprints. Triggers on "research", "investigate", "deep dive", "state of the art", "compare", "find examples of", "what's out there for", "how do others handle", "find me evidence", "look into". For idea exploration and brainstorming, use ftm-brainstorm instead (which calls ftm-researcher internally for research).
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# ftm-researcher
|
|
7
|
-
|
|
8
|
-
Deep parallel research engine with 7 domain-specialized finder agents, adversarial review via ftm-council, adaptive wave-based search, structured reconciliation with disagreement maps, credibility scoring, and conversational iteration.
|
|
9
|
-
|
|
10
|
-
## Events
|
|
11
|
-
|
|
12
|
-
### Emits
|
|
13
|
-
- `research_complete` — when synthesis pipeline finishes and structured output is ready
|
|
14
|
-
- Payload: `{ query, mode, findings_count, consensus_count, contested_count, unique_count, sources_count, duration_ms }`
|
|
15
|
-
- `task_completed` — when the full research session finishes (including any conversational iteration)
|
|
16
|
-
- Payload: `{ task_title, duration_ms }`
|
|
17
|
-
|
|
18
|
-
### Listens To
|
|
19
|
-
- `task_received` — begin research when ftm-mind or ftm-brainstorm routes a research request
|
|
20
|
-
- Expected payload: `{ task_description, plan_path, wave_number, task_number }`
|
|
21
|
-
- Note: `depth_mode` and `context_register` are derived internally from request context, not from event payload
|
|
22
|
-
|
|
23
|
-
## Config Read
|
|
24
|
-
|
|
25
|
-
Read `~/.claude/ftm-config.yml`:
|
|
26
|
-
- Use `planning` model from the active profile for finder agents
|
|
27
|
-
- Use `review` model for fallback challenger agents
|
|
28
|
-
- Read `execution.per_skill_overrides.ftm-researcher` for agent cap (default 10 if override absent, fall back to `execution.max_parallel_agents` if neither is set)
|
|
29
|
-
|
|
30
|
-
## Blackboard Read
|
|
31
|
-
|
|
32
|
-
On startup, load context from the FTM blackboard:
|
|
33
|
-
1. Load `~/.claude/ftm-blackboard/context.json`
|
|
34
|
-
2. Filter experiences by `task_type: "research"`
|
|
35
|
-
3. Load matching experience files to inform agent dispatch and subtopic decomposition
|
|
36
|
-
4. Load `~/.claude/ftm-blackboard/patterns.json` for recurring research patterns
|
|
37
|
-
|
|
38
|
-
## Mode System
|
|
39
|
-
|
|
40
|
-
Three depth modes calibrate agent count, synthesis pipeline, and council invocation:
|
|
41
|
-
|
|
42
|
-
```
|
|
43
|
-
Quick: 3 finders (Web Surveyor, GitHub Miner, Codebase Analyst), no council, no reconciler.
|
|
44
|
-
Single-pass synthesis by orchestrator. ~1-2 min.
|
|
45
|
-
|
|
46
|
-
Standard: 7 finders + reconciler, no council. Normalize → rank → reconcile. ~3-5 min.
|
|
47
|
-
|
|
48
|
-
Deep: 7 finders → adaptive wave 2 → ftm-council → reconciler. Full pipeline. ~5-10 min.
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
Mode is detected from request context:
|
|
52
|
-
- "quick look" / "briefly" / "just a quick" → quick mode
|
|
53
|
-
- "deep dive" / "thorough" / "comprehensive" / "exhaustive" → deep mode
|
|
54
|
-
- Default (no explicit signal) → standard mode
|
|
55
|
-
|
|
56
|
-
## The Main Loop
|
|
57
|
-
|
|
58
|
-
```
|
|
59
|
-
PHASE 0: REPO SCAN
|
|
60
|
-
Silent background Explore agent scans the local codebase (same as ftm-brainstorm).
|
|
61
|
-
Produces: project_context { tech_stack, key_files, existing_patterns, integration_points }
|
|
62
|
-
Used by: Codebase Analyst finder + orchestrator subtopic decomposition
|
|
63
|
-
|
|
64
|
-
PHASE 1: INTAKE
|
|
65
|
-
- Parse the research question
|
|
66
|
-
- Detect depth mode
|
|
67
|
-
- Decompose into 7 subtopics (one per finder domain)
|
|
68
|
-
- Load blackboard context and filter relevant prior research
|
|
69
|
-
|
|
70
|
-
PHASE 2: WAVE 1
|
|
71
|
-
- Dispatch 7 finders in parallel, each with:
|
|
72
|
-
- Their unique domain constraint
|
|
73
|
-
- Their assigned subtopic
|
|
74
|
-
- Project context from Phase 0
|
|
75
|
-
- Context register (accumulated findings from prior waves/turns)
|
|
76
|
-
- Summary of previous findings to build on (do NOT re-search)
|
|
77
|
-
- Collect all findings (3-8 per agent = 21-56 total)
|
|
78
|
-
|
|
79
|
-
PHASE 3: ADAPTIVE REFINEMENT (deep mode only)
|
|
80
|
-
- Analyze wave 1 findings across 4 dimensions:
|
|
81
|
-
SATURATED: subtopic has 3+ diverse findings — reassign agent to a gap
|
|
82
|
-
THIN: subtopic has 1-2 findings — same agent, more specific query
|
|
83
|
-
GAP: subtopic has 0 findings — agent gets broader query + alternative terms
|
|
84
|
-
CONTESTED: 2+ agents directly contradict — assign 2 agents (one per side) to resolve
|
|
85
|
-
SURPRISE: findings outside original subtopics — assign most relevant agent to explore
|
|
86
|
-
- Dispatch wave 2 agents with reshaped queries
|
|
87
|
-
- Merge wave 2 findings with wave 1 before synthesis
|
|
88
|
-
|
|
89
|
-
PHASE 4: SYNTHESIS PIPELINE
|
|
90
|
-
See ftm-researcher/references/synthesis-pipeline.md for full pipeline.
|
|
91
|
-
Summary:
|
|
92
|
-
1. Normalize & deduplicate (group by semantic similarity, track agent_count, source diversity)
|
|
93
|
-
2. Adversarial review: ftm-council (deep mode) or fallback challengers (standard mode)
|
|
94
|
-
3. Pairwise rank contested claims (LLM-as-judge tournament)
|
|
95
|
-
4. Reconcile into disagreement map (consensus / contested / unique / refuted tiers)
|
|
96
|
-
|
|
97
|
-
PHASE 5: PRESENT
|
|
98
|
-
- Render disagreement map as structured markdown
|
|
99
|
-
- Show consensus findings, contested pairs, unique insights (flagged), refuted claims
|
|
100
|
-
- Include source summary table (type | count | avg credibility)
|
|
101
|
-
- Emit `research_complete` event
|
|
102
|
-
|
|
103
|
-
PHASE 6: ITERATE
|
|
104
|
-
- Enter conversational iteration mode
|
|
105
|
-
- Wait for user response
|
|
106
|
-
- Route based on intent (see Conversational Iteration Protocol below)
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## Conversational Iteration Protocol
|
|
110
|
-
|
|
111
|
-
After presenting results, the skill enters iteration mode. Route user responses:
|
|
112
|
-
|
|
113
|
-
- "dig deeper on finding #N" / "more on #N" → spawn 3 targeted agents on that specific finding's topic
|
|
114
|
-
- "I disagree with X" / "I think X is wrong because Y" → spawn counter-evidence agents, update findings
|
|
115
|
-
- "focus on [angle]" / "what about the security angle" → reshape subtopics with new weighting, re-dispatch
|
|
116
|
-
- "council finding #N" / "get more opinions on #N" → route specific claim to ftm-council
|
|
117
|
-
- "more on [agent]'s findings" → re-dispatch that agent with broader query
|
|
118
|
-
- "compare A vs B" → spawn comparison agent with both findings as context
|
|
119
|
-
- "done" / "thanks" / "that's enough" / "looks good" → finalize, write blackboard, emit events
|
|
120
|
-
|
|
121
|
-
Each iteration:
|
|
122
|
-
1. Updates the structured JSON artifact
|
|
123
|
-
2. Re-renders the markdown output
|
|
124
|
-
3. Updates the context register for subsequent turns
|
|
125
|
-
|
|
126
|
-
## Agent Roster
|
|
127
|
-
|
|
128
|
-
See `ftm-researcher/references/agent-prompts.md` for full prompts.
|
|
129
|
-
|
|
130
|
-
| Agent | Domain | Source Types |
|
|
131
|
-
|---|---|---|
|
|
132
|
-
| Web Surveyor | Blog posts, case studies, tutorials, technical write-ups | blog, news |
|
|
133
|
-
| Academic Scout | Papers (arxiv, ACM, IEEE), official docs, RFCs, specs | peer_reviewed, primary, official_docs |
|
|
134
|
-
| GitHub Miner | GitHub repos, OSS implementations, code patterns | code_repo |
|
|
135
|
-
| Competitive Analyst | Products, user reviews (Reddit/HN/Twitter), market analysis | forum, news |
|
|
136
|
-
| Stack Overflow Digger | Stack Overflow, community Q&A, pitfalls, solved problems | qa_site |
|
|
137
|
-
| Codebase Analyst | Local repo only — Grep, Read, Glob tools, git log | codebase |
|
|
138
|
-
| Historical Investigator | Solutions from 5-10+ years ago, evolution, failed approaches | primary, blog |
|
|
139
|
-
|
|
140
|
-
## Synthesis Pipeline
|
|
141
|
-
|
|
142
|
-
See `ftm-researcher/references/synthesis-pipeline.md` for full specification.
|
|
143
|
-
|
|
144
|
-
5 phases: Normalize → Adversarial Review → Pairwise Rank → Reconcile → Render
|
|
145
|
-
|
|
146
|
-
Output tiers:
|
|
147
|
-
1. **Consensus** — 3+ agents agree, council agreed, multiple source types. Highest confidence.
|
|
148
|
-
2. **Contested** — Council disagreed or pairwise ranking was close. Present both sides.
|
|
149
|
-
3. **Unique Insights** — 1 agent only, not contradicted. High value OR hallucination — flag for user.
|
|
150
|
-
4. **Refuted** — Council rejected or pairwise loser with weak evidence. Still present briefly.
|
|
151
|
-
|
|
152
|
-
## Adaptive Search
|
|
153
|
-
|
|
154
|
-
See `ftm-researcher/references/adaptive-search.md` for full protocol.
|
|
155
|
-
|
|
156
|
-
Deep mode only. Reshapes wave 2 queries based on wave 1 coverage analysis across 4 dimensions: SATURATED, THIN, GAP, CONTESTED, SURPRISE.
|
|
157
|
-
|
|
158
|
-
## Output Format
|
|
159
|
-
|
|
160
|
-
See `ftm-researcher/references/output-format.md` for JSON schema and markdown template.
|
|
161
|
-
|
|
162
|
-
Primary output: structured JSON artifact for skill-to-skill consumption (ftm-brainstorm, ftm-executor).
|
|
163
|
-
Secondary output: rendered markdown for human display.
|
|
164
|
-
|
|
165
|
-
## Council Integration
|
|
166
|
-
|
|
167
|
-
See `ftm-researcher/references/council-integration.md` for full protocol.
|
|
168
|
-
|
|
169
|
-
Deep mode only. Routes top claims through ftm-council (Claude + Codex + Gemini independent review).
|
|
170
|
-
|
|
171
|
-
Fallback (council unavailable): 2 standalone agents on the `review` model:
|
|
172
|
-
- Devil's Advocate — finds reasons each claim is WRONG
|
|
173
|
-
- Edge Case Hunter — finds where each claim BREAKS
|
|
174
|
-
|
|
175
|
-
## Credibility Scoring
|
|
176
|
-
|
|
177
|
-
See `ftm-researcher/scripts/score_credibility.py` for implementation.
|
|
178
|
-
|
|
179
|
-
4 dimensions (weighted):
|
|
180
|
-
- Source type weight (35%): primary > peer_reviewed > official_docs > news > blog > forum
|
|
181
|
-
- Recency (20%): decay based on age, faster for fast-moving topics
|
|
182
|
-
- Domain authority (25%): HIGH_AUTHORITY domains (arxiv, MDN, AWS docs) score 0.9
|
|
183
|
-
- Bias detection (20%): sensationalism penalties, balanced language bonuses
|
|
184
|
-
|
|
185
|
-
Bonuses and penalties:
|
|
186
|
-
- Corroboration bonus: +0.15 if independently found by 2+ agents from different source types
|
|
187
|
-
- Circular sourcing: -0.20 flag if multiple sources trace to same original
|
|
188
|
-
|
|
189
|
-
Trust levels: high (>=0.75) | moderate (>=0.55) | low (>=0.35) | verify (<0.35)
|
|
190
|
-
|
|
191
|
-
## Blackboard Write
|
|
192
|
-
|
|
193
|
-
After `research_complete` or session end:
|
|
194
|
-
1. Update `~/.claude/ftm-blackboard/context.json` with research session summary
|
|
195
|
-
2. Write experience file: `~/.claude/ftm-blackboard/experiences/research-[timestamp].json`
|
|
196
|
-
- Fields: query, mode, findings_count, top_consensus_claims, source_diversity, duration_ms
|
|
197
|
-
3. Update `~/.claude/ftm-blackboard/index.json` with new experience entry
|
|
198
|
-
4. Emit `task_completed` event
|
|
199
|
-
|
|
200
|
-
## Session State (for ftm-pause/resume)
|
|
201
|
-
|
|
202
|
-
The following state is persisted for pause/resume support:
|
|
203
|
-
- Current phase (0-6)
|
|
204
|
-
- Depth mode
|
|
205
|
-
- All wave 1 and wave 2 findings (raw)
|
|
206
|
-
- Synthesis state (normalized claims, council verdicts, ranked pairs)
|
|
207
|
-
- Disagreement map (current version)
|
|
208
|
-
- Conversation history (iteration turns)
|
|
209
|
-
- Context register (accumulated findings across turns)
|
|
210
|
-
- Project context from Phase 0 repo scan
|
|
211
|
-
|
|
212
|
-
## References
|
|
213
|
-
|
|
214
|
-
- `ftm-researcher/references/agent-prompts.md` — 7 finder agent prompts + orchestrator decomposition protocol
|
|
215
|
-
- `ftm-researcher/references/synthesis-pipeline.md` — 5-phase synthesis pipeline + reconciler prompt
|
|
216
|
-
- `ftm-researcher/references/adaptive-search.md` — Wave 1 → wave 2 refinement protocol
|
|
217
|
-
- `ftm-researcher/references/output-format.md` — JSON schema + markdown template + iteration protocol
|
|
218
|
-
- `ftm-researcher/references/council-integration.md` — ftm-council interface + fallback challenger prompts
|
|
219
|
-
- `ftm-researcher/scripts/score_credibility.py` — Source credibility scoring
|
|
220
|
-
- `ftm-researcher/scripts/validate_research.py` — Research output validation
|
|
221
|
-
|
|
222
|
-
## Requirements
|
|
223
|
-
|
|
224
|
-
- config: `~/.claude/ftm-config.yml` | optional | planning and review model profiles, per_skill_overrides.ftm-researcher agent cap
|
|
225
|
-
- reference: `ftm-researcher/references/agent-prompts.md` | required | 7 finder agent prompts and orchestrator decomposition protocol
|
|
226
|
-
- reference: `ftm-researcher/references/synthesis-pipeline.md` | required | 5-phase synthesis pipeline
|
|
227
|
-
- reference: `ftm-researcher/references/adaptive-search.md` | optional | wave 2 adaptive refinement (deep mode only)
|
|
228
|
-
- reference: `ftm-researcher/references/output-format.md` | required | JSON schema and markdown template
|
|
229
|
-
- reference: `ftm-researcher/references/council-integration.md` | optional | ftm-council interface (deep mode only)
|
|
230
|
-
- reference: `~/.claude/ftm-blackboard/context.json` | optional | session state
|
|
231
|
-
- reference: `~/.claude/ftm-blackboard/patterns.json` | optional | recurring research patterns
|
|
232
|
-
|
|
233
|
-
## Risk
|
|
234
|
-
|
|
235
|
-
- level: read_only
|
|
236
|
-
- scope: reads web sources and local codebase via agents; writes blackboard experience entry; writes structured JSON artifact; does not modify project source files
|
|
237
|
-
- rollback: no project mutations; blackboard write can be reverted by editing JSON files
|
|
238
|
-
|
|
239
|
-
## Approval Gates
|
|
240
|
-
|
|
241
|
-
- trigger: research complete and user says "done" / "thanks" | action: finalize, write blackboard, emit events
|
|
242
|
-
- trigger: deep mode and ftm-council invoked | action: council runs automatically on top claims (no user gate needed for this step)
|
|
243
|
-
- complexity_routing: micro → auto | small → auto | medium → auto | large → auto | xl → auto
|
|
244
|
-
|
|
245
|
-
## Fallbacks
|
|
246
|
-
|
|
247
|
-
- condition: ftm-council not available (deep mode) | action: use 2 fallback challenger agents (Devil's Advocate + Edge Case Hunter) instead
|
|
248
|
-
- condition: agent cap exceeded | action: queue excess agents and dispatch after current wave completes
|
|
249
|
-
- condition: research agent returns no findings | action: broaden query and retry; if still empty, report "No prior art found — this may be novel"
|
|
250
|
-
- condition: blackboard missing | action: proceed without experience-informed shortcuts
|
|
251
|
-
|
|
252
|
-
## Capabilities
|
|
253
|
-
|
|
254
|
-
- mcp: `WebSearch` | optional | finder agents for web, GitHub, and competitive research
|
|
255
|
-
- mcp: `WebFetch` | optional | fetching specific URLs found during research
|
|
256
|
-
- mcp: `sequential-thinking` | optional | complex synthesis and reconciliation
|
|
257
|
-
|
|
258
|
-
## Event Payloads
|
|
259
|
-
|
|
260
|
-
### research_complete
|
|
261
|
-
- skill: string — "ftm-researcher"
|
|
262
|
-
- query: string — original research question
|
|
263
|
-
- mode: string — "quick" | "standard" | "deep"
|
|
264
|
-
- findings_count: number — total normalized findings
|
|
265
|
-
- consensus_count: number — findings with 3+ agent agreement
|
|
266
|
-
- contested_count: number — findings with council disagreement
|
|
267
|
-
- unique_count: number — single-agent findings
|
|
268
|
-
- sources_count: number — total sources cited
|
|
269
|
-
- council_used: boolean — whether ftm-council was invoked
|
|
270
|
-
- duration_ms: number — total research duration
|
|
271
|
-
|
|
272
|
-
### task_completed
|
|
273
|
-
- skill: string — "ftm-researcher"
|
|
274
|
-
- task_title: string — research topic title
|
|
275
|
-
- duration_ms: number — total session duration including iterations
|
|
1
|
+
---
|
|
2
|
+
name: ftm-researcher
|
|
3
|
+
description: Deep parallel research engine with 7 domain-specialized finder agents, adversarial review via ftm-council, adaptive wave-based search, structured reconciliation with disagreement maps, credibility scoring, and conversational iteration. Use when the user wants thorough research on any topic — "research X", "find out about Y", "what's the state of the art on Z", "compare approaches to W", "deep dive into X", "look into Y". Also invoked by ftm-brainstorm for its research sprints. Triggers on "research", "investigate", "deep dive", "state of the art", "compare", "find examples of", "what's out there for", "how do others handle", "find me evidence", "look into". For idea exploration and brainstorming, use ftm-brainstorm instead (which calls ftm-researcher internally for research).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ftm-researcher
|
|
7
|
+
|
|
8
|
+
Deep parallel research engine with 7 domain-specialized finder agents, adversarial review via ftm-council, adaptive wave-based search, structured reconciliation with disagreement maps, credibility scoring, and conversational iteration.
|
|
9
|
+
|
|
10
|
+
## Events
|
|
11
|
+
|
|
12
|
+
### Emits
|
|
13
|
+
- `research_complete` — when synthesis pipeline finishes and structured output is ready
|
|
14
|
+
- Payload: `{ query, mode, findings_count, consensus_count, contested_count, unique_count, sources_count, duration_ms }`
|
|
15
|
+
- `task_completed` — when the full research session finishes (including any conversational iteration)
|
|
16
|
+
- Payload: `{ task_title, duration_ms }`
|
|
17
|
+
|
|
18
|
+
### Listens To
|
|
19
|
+
- `task_received` — begin research when ftm-mind or ftm-brainstorm routes a research request
|
|
20
|
+
- Expected payload: `{ task_description, plan_path, wave_number, task_number }`
|
|
21
|
+
- Note: `depth_mode` and `context_register` are derived internally from request context, not from event payload
|
|
22
|
+
|
|
23
|
+
## Config Read
|
|
24
|
+
|
|
25
|
+
Read `~/.claude/ftm-config.yml`:
|
|
26
|
+
- Use `planning` model from the active profile for finder agents
|
|
27
|
+
- Use `review` model for fallback challenger agents
|
|
28
|
+
- Read `execution.per_skill_overrides.ftm-researcher` for agent cap (default 10 if override absent, fall back to `execution.max_parallel_agents` if neither is set)
|
|
29
|
+
|
|
30
|
+
## Blackboard Read
|
|
31
|
+
|
|
32
|
+
On startup, load context from the FTM blackboard:
|
|
33
|
+
1. Load `~/.claude/ftm-blackboard/context.json`
|
|
34
|
+
2. Filter experiences by `task_type: "research"`
|
|
35
|
+
3. Load matching experience files to inform agent dispatch and subtopic decomposition
|
|
36
|
+
4. Load `~/.claude/ftm-blackboard/patterns.json` for recurring research patterns
|
|
37
|
+
|
|
38
|
+
## Mode System
|
|
39
|
+
|
|
40
|
+
Three depth modes calibrate agent count, synthesis pipeline, and council invocation:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
Quick: 3 finders (Web Surveyor, GitHub Miner, Codebase Analyst), no council, no reconciler.
|
|
44
|
+
Single-pass synthesis by orchestrator. ~1-2 min.
|
|
45
|
+
|
|
46
|
+
Standard: 7 finders + reconciler, no council. Normalize → rank → reconcile. ~3-5 min.
|
|
47
|
+
|
|
48
|
+
Deep: 7 finders → adaptive wave 2 → ftm-council → reconciler. Full pipeline. ~5-10 min.
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Mode is detected from request context:
|
|
52
|
+
- "quick look" / "briefly" / "just a quick" → quick mode
|
|
53
|
+
- "deep dive" / "thorough" / "comprehensive" / "exhaustive" → deep mode
|
|
54
|
+
- Default (no explicit signal) → standard mode
|
|
55
|
+
|
|
56
|
+
## The Main Loop
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
PHASE 0: REPO SCAN
|
|
60
|
+
Silent background Explore agent scans the local codebase (same as ftm-brainstorm).
|
|
61
|
+
Produces: project_context { tech_stack, key_files, existing_patterns, integration_points }
|
|
62
|
+
Used by: Codebase Analyst finder + orchestrator subtopic decomposition
|
|
63
|
+
|
|
64
|
+
PHASE 1: INTAKE
|
|
65
|
+
- Parse the research question
|
|
66
|
+
- Detect depth mode
|
|
67
|
+
- Decompose into 7 subtopics (one per finder domain)
|
|
68
|
+
- Load blackboard context and filter relevant prior research
|
|
69
|
+
|
|
70
|
+
PHASE 2: WAVE 1
|
|
71
|
+
- Dispatch 7 finders in parallel, each with:
|
|
72
|
+
- Their unique domain constraint
|
|
73
|
+
- Their assigned subtopic
|
|
74
|
+
- Project context from Phase 0
|
|
75
|
+
- Context register (accumulated findings from prior waves/turns)
|
|
76
|
+
- Summary of previous findings to build on (do NOT re-search)
|
|
77
|
+
- Collect all findings (3-8 per agent = 21-56 total)
|
|
78
|
+
|
|
79
|
+
PHASE 3: ADAPTIVE REFINEMENT (deep mode only)
|
|
80
|
+
- Analyze wave 1 findings across 4 dimensions:
|
|
81
|
+
SATURATED: subtopic has 3+ diverse findings — reassign agent to a gap
|
|
82
|
+
THIN: subtopic has 1-2 findings — same agent, more specific query
|
|
83
|
+
GAP: subtopic has 0 findings — agent gets broader query + alternative terms
|
|
84
|
+
CONTESTED: 2+ agents directly contradict — assign 2 agents (one per side) to resolve
|
|
85
|
+
SURPRISE: findings outside original subtopics — assign most relevant agent to explore
|
|
86
|
+
- Dispatch wave 2 agents with reshaped queries
|
|
87
|
+
- Merge wave 2 findings with wave 1 before synthesis
|
|
88
|
+
|
|
89
|
+
PHASE 4: SYNTHESIS PIPELINE
|
|
90
|
+
See ftm-researcher/references/synthesis-pipeline.md for full pipeline.
|
|
91
|
+
Summary:
|
|
92
|
+
1. Normalize & deduplicate (group by semantic similarity, track agent_count, source diversity)
|
|
93
|
+
2. Adversarial review: ftm-council (deep mode) or fallback challengers (standard mode)
|
|
94
|
+
3. Pairwise rank contested claims (LLM-as-judge tournament)
|
|
95
|
+
4. Reconcile into disagreement map (consensus / contested / unique / refuted tiers)
|
|
96
|
+
|
|
97
|
+
PHASE 5: PRESENT
|
|
98
|
+
- Render disagreement map as structured markdown
|
|
99
|
+
- Show consensus findings, contested pairs, unique insights (flagged), refuted claims
|
|
100
|
+
- Include source summary table (type | count | avg credibility)
|
|
101
|
+
- Emit `research_complete` event
|
|
102
|
+
|
|
103
|
+
PHASE 6: ITERATE
|
|
104
|
+
- Enter conversational iteration mode
|
|
105
|
+
- Wait for user response
|
|
106
|
+
- Route based on intent (see Conversational Iteration Protocol below)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Conversational Iteration Protocol
|
|
110
|
+
|
|
111
|
+
After presenting results, the skill enters iteration mode. Route user responses:
|
|
112
|
+
|
|
113
|
+
- "dig deeper on finding #N" / "more on #N" → spawn 3 targeted agents on that specific finding's topic
|
|
114
|
+
- "I disagree with X" / "I think X is wrong because Y" → spawn counter-evidence agents, update findings
|
|
115
|
+
- "focus on [angle]" / "what about the security angle" → reshape subtopics with new weighting, re-dispatch
|
|
116
|
+
- "council finding #N" / "get more opinions on #N" → route specific claim to ftm-council
|
|
117
|
+
- "more on [agent]'s findings" → re-dispatch that agent with broader query
|
|
118
|
+
- "compare A vs B" → spawn comparison agent with both findings as context
|
|
119
|
+
- "done" / "thanks" / "that's enough" / "looks good" → finalize, write blackboard, emit events
|
|
120
|
+
|
|
121
|
+
Each iteration:
|
|
122
|
+
1. Updates the structured JSON artifact
|
|
123
|
+
2. Re-renders the markdown output
|
|
124
|
+
3. Updates the context register for subsequent turns
|
|
125
|
+
|
|
126
|
+
## Agent Roster
|
|
127
|
+
|
|
128
|
+
See `ftm-researcher/references/agent-prompts.md` for full prompts.
|
|
129
|
+
|
|
130
|
+
| Agent | Domain | Source Types |
|
|
131
|
+
|---|---|---|
|
|
132
|
+
| Web Surveyor | Blog posts, case studies, tutorials, technical write-ups | blog, news |
|
|
133
|
+
| Academic Scout | Papers (arxiv, ACM, IEEE), official docs, RFCs, specs | peer_reviewed, primary, official_docs |
|
|
134
|
+
| GitHub Miner | GitHub repos, OSS implementations, code patterns | code_repo |
|
|
135
|
+
| Competitive Analyst | Products, user reviews (Reddit/HN/Twitter), market analysis | forum, news |
|
|
136
|
+
| Stack Overflow Digger | Stack Overflow, community Q&A, pitfalls, solved problems | qa_site |
|
|
137
|
+
| Codebase Analyst | Local repo only — Grep, Read, Glob tools, git log | codebase |
|
|
138
|
+
| Historical Investigator | Solutions from 5-10+ years ago, evolution, failed approaches | primary, blog |
|
|
139
|
+
|
|
140
|
+
## Synthesis Pipeline
|
|
141
|
+
|
|
142
|
+
See `ftm-researcher/references/synthesis-pipeline.md` for full specification.
|
|
143
|
+
|
|
144
|
+
5 phases: Normalize → Adversarial Review → Pairwise Rank → Reconcile → Render
|
|
145
|
+
|
|
146
|
+
Output tiers:
|
|
147
|
+
1. **Consensus** — 3+ agents agree, council agreed, multiple source types. Highest confidence.
|
|
148
|
+
2. **Contested** — Council disagreed or pairwise ranking was close. Present both sides.
|
|
149
|
+
3. **Unique Insights** — 1 agent only, not contradicted. High value OR hallucination — flag for user.
|
|
150
|
+
4. **Refuted** — Council rejected or pairwise loser with weak evidence. Still present briefly.
|
|
151
|
+
|
|
152
|
+
## Adaptive Search
|
|
153
|
+
|
|
154
|
+
See `ftm-researcher/references/adaptive-search.md` for full protocol.
|
|
155
|
+
|
|
156
|
+
Deep mode only. Reshapes wave 2 queries based on wave 1 coverage analysis across 4 dimensions: SATURATED, THIN, GAP, CONTESTED, SURPRISE.
|
|
157
|
+
|
|
158
|
+
## Output Format
|
|
159
|
+
|
|
160
|
+
See `ftm-researcher/references/output-format.md` for JSON schema and markdown template.
|
|
161
|
+
|
|
162
|
+
Primary output: structured JSON artifact for skill-to-skill consumption (ftm-brainstorm, ftm-executor).
|
|
163
|
+
Secondary output: rendered markdown for human display.
|
|
164
|
+
|
|
165
|
+
## Council Integration
|
|
166
|
+
|
|
167
|
+
See `ftm-researcher/references/council-integration.md` for full protocol.
|
|
168
|
+
|
|
169
|
+
Deep mode only. Routes top claims through ftm-council (Claude + Codex + Gemini independent review).
|
|
170
|
+
|
|
171
|
+
Fallback (council unavailable): 2 standalone agents on the `review` model:
|
|
172
|
+
- Devil's Advocate — finds reasons each claim is WRONG
|
|
173
|
+
- Edge Case Hunter — finds where each claim BREAKS
|
|
174
|
+
|
|
175
|
+
## Credibility Scoring
|
|
176
|
+
|
|
177
|
+
See `ftm-researcher/scripts/score_credibility.py` for implementation.
|
|
178
|
+
|
|
179
|
+
4 dimensions (weighted):
|
|
180
|
+
- Source type weight (35%): primary > peer_reviewed > official_docs > news > blog > forum
|
|
181
|
+
- Recency (20%): decay based on age, faster for fast-moving topics
|
|
182
|
+
- Domain authority (25%): HIGH_AUTHORITY domains (arxiv, MDN, AWS docs) score 0.9
|
|
183
|
+
- Bias detection (20%): sensationalism penalties, balanced language bonuses
|
|
184
|
+
|
|
185
|
+
Bonuses and penalties:
|
|
186
|
+
- Corroboration bonus: +0.15 if independently found by 2+ agents from different source types
|
|
187
|
+
- Circular sourcing: -0.20 flag if multiple sources trace to same original
|
|
188
|
+
|
|
189
|
+
Trust levels: high (>=0.75) | moderate (>=0.55) | low (>=0.35) | verify (<0.35)
|
|
190
|
+
|
|
191
|
+
## Blackboard Write
|
|
192
|
+
|
|
193
|
+
After `research_complete` or session end:
|
|
194
|
+
1. Update `~/.claude/ftm-blackboard/context.json` with research session summary
|
|
195
|
+
2. Write experience file: `~/.claude/ftm-blackboard/experiences/research-[timestamp].json`
|
|
196
|
+
- Fields: query, mode, findings_count, top_consensus_claims, source_diversity, duration_ms
|
|
197
|
+
3. Update `~/.claude/ftm-blackboard/index.json` with new experience entry
|
|
198
|
+
4. Emit `task_completed` event
|
|
199
|
+
|
|
200
|
+
## Session State (for ftm-pause/resume)
|
|
201
|
+
|
|
202
|
+
The following state is persisted for pause/resume support:
|
|
203
|
+
- Current phase (0-6)
|
|
204
|
+
- Depth mode
|
|
205
|
+
- All wave 1 and wave 2 findings (raw)
|
|
206
|
+
- Synthesis state (normalized claims, council verdicts, ranked pairs)
|
|
207
|
+
- Disagreement map (current version)
|
|
208
|
+
- Conversation history (iteration turns)
|
|
209
|
+
- Context register (accumulated findings across turns)
|
|
210
|
+
- Project context from Phase 0 repo scan
|
|
211
|
+
|
|
212
|
+
## References
|
|
213
|
+
|
|
214
|
+
- `ftm-researcher/references/agent-prompts.md` — 7 finder agent prompts + orchestrator decomposition protocol
|
|
215
|
+
- `ftm-researcher/references/synthesis-pipeline.md` — 5-phase synthesis pipeline + reconciler prompt
|
|
216
|
+
- `ftm-researcher/references/adaptive-search.md` — Wave 1 → wave 2 refinement protocol
|
|
217
|
+
- `ftm-researcher/references/output-format.md` — JSON schema + markdown template + iteration protocol
|
|
218
|
+
- `ftm-researcher/references/council-integration.md` — ftm-council interface + fallback challenger prompts
|
|
219
|
+
- `ftm-researcher/scripts/score_credibility.py` — Source credibility scoring
|
|
220
|
+
- `ftm-researcher/scripts/validate_research.py` — Research output validation
|
|
221
|
+
|
|
222
|
+
## Requirements
|
|
223
|
+
|
|
224
|
+
- config: `~/.claude/ftm-config.yml` | optional | planning and review model profiles, per_skill_overrides.ftm-researcher agent cap
|
|
225
|
+
- reference: `ftm-researcher/references/agent-prompts.md` | required | 7 finder agent prompts and orchestrator decomposition protocol
|
|
226
|
+
- reference: `ftm-researcher/references/synthesis-pipeline.md` | required | 5-phase synthesis pipeline
|
|
227
|
+
- reference: `ftm-researcher/references/adaptive-search.md` | optional | wave 2 adaptive refinement (deep mode only)
|
|
228
|
+
- reference: `ftm-researcher/references/output-format.md` | required | JSON schema and markdown template
|
|
229
|
+
- reference: `ftm-researcher/references/council-integration.md` | optional | ftm-council interface (deep mode only)
|
|
230
|
+
- reference: `~/.claude/ftm-blackboard/context.json` | optional | session state
|
|
231
|
+
- reference: `~/.claude/ftm-blackboard/patterns.json` | optional | recurring research patterns
|
|
232
|
+
|
|
233
|
+
## Risk
|
|
234
|
+
|
|
235
|
+
- level: read_only
|
|
236
|
+
- scope: reads web sources and local codebase via agents; writes blackboard experience entry; writes structured JSON artifact; does not modify project source files
|
|
237
|
+
- rollback: no project mutations; blackboard write can be reverted by editing JSON files
|
|
238
|
+
|
|
239
|
+
## Approval Gates
|
|
240
|
+
|
|
241
|
+
- trigger: research complete and user says "done" / "thanks" | action: finalize, write blackboard, emit events
|
|
242
|
+
- trigger: deep mode and ftm-council invoked | action: council runs automatically on top claims (no user gate needed for this step)
|
|
243
|
+
- complexity_routing: micro → auto | small → auto | medium → auto | large → auto | xl → auto
|
|
244
|
+
|
|
245
|
+
## Fallbacks
|
|
246
|
+
|
|
247
|
+
- condition: ftm-council not available (deep mode) | action: use 2 fallback challenger agents (Devil's Advocate + Edge Case Hunter) instead
|
|
248
|
+
- condition: agent cap exceeded | action: queue excess agents and dispatch after current wave completes
|
|
249
|
+
- condition: research agent returns no findings | action: broaden query and retry; if still empty, report "No prior art found — this may be novel"
|
|
250
|
+
- condition: blackboard missing | action: proceed without experience-informed shortcuts
|
|
251
|
+
|
|
252
|
+
## Capabilities
|
|
253
|
+
|
|
254
|
+
- mcp: `WebSearch` | optional | finder agents for web, GitHub, and competitive research
|
|
255
|
+
- mcp: `WebFetch` | optional | fetching specific URLs found during research
|
|
256
|
+
- mcp: `sequential-thinking` | optional | complex synthesis and reconciliation
|
|
257
|
+
|
|
258
|
+
## Event Payloads
|
|
259
|
+
|
|
260
|
+
### research_complete
|
|
261
|
+
- skill: string — "ftm-researcher"
|
|
262
|
+
- query: string — original research question
|
|
263
|
+
- mode: string — "quick" | "standard" | "deep"
|
|
264
|
+
- findings_count: number — total normalized findings
|
|
265
|
+
- consensus_count: number — findings with 3+ agent agreement
|
|
266
|
+
- contested_count: number — findings with council disagreement
|
|
267
|
+
- unique_count: number — single-agent findings
|
|
268
|
+
- sources_count: number — total sources cited
|
|
269
|
+
- council_used: boolean — whether ftm-council was invoked
|
|
270
|
+
- duration_ms: number — total research duration
|
|
271
|
+
|
|
272
|
+
### task_completed
|
|
273
|
+
- skill: string — "ftm-researcher"
|
|
274
|
+
- task_title: string — research topic title
|
|
275
|
+
- duration_ms: number — total session duration including iterations
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
# ftm-researcher/evals/agent-diversity.yaml
|
|
2
|
-
description: Verify 7 finder agents produce non-overlapping results from different domains
|
|
3
|
-
prompts:
|
|
4
|
-
- vars:
|
|
5
|
-
input: "Research how to implement WebSocket connections in a Node.js application"
|
|
6
|
-
assert:
|
|
7
|
-
- type: contains
|
|
8
|
-
value: "web_surveyor"
|
|
9
|
-
- type: contains
|
|
10
|
-
value: "github_miner"
|
|
11
|
-
- type: contains
|
|
12
|
-
value: "codebase_analyst"
|
|
13
|
-
- type: javascript
|
|
14
|
-
value: |
|
|
15
|
-
// Verify at least 5 different agent_roles appear in findings
|
|
16
|
-
const roles = new Set(output.findings?.map(f => f.agent_role) || []);
|
|
17
|
-
return roles.size >= 5;
|
|
1
|
+
# ftm-researcher/evals/agent-diversity.yaml
|
|
2
|
+
description: Verify 7 finder agents produce non-overlapping results from different domains
|
|
3
|
+
prompts:
|
|
4
|
+
- vars:
|
|
5
|
+
input: "Research how to implement WebSocket connections in a Node.js application"
|
|
6
|
+
assert:
|
|
7
|
+
- type: contains
|
|
8
|
+
value: "web_surveyor"
|
|
9
|
+
- type: contains
|
|
10
|
+
value: "github_miner"
|
|
11
|
+
- type: contains
|
|
12
|
+
value: "codebase_analyst"
|
|
13
|
+
- type: javascript
|
|
14
|
+
value: |
|
|
15
|
+
// Verify at least 5 different agent_roles appear in findings
|
|
16
|
+
const roles = new Set(output.findings?.map(f => f.agent_role) || []);
|
|
17
|
+
return roles.size >= 5;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
# ftm-researcher/evals/synthesis-quality.yaml
|
|
2
|
-
description: Verify synthesis pipeline produces valid disagreement maps
|
|
3
|
-
prompts:
|
|
4
|
-
- vars:
|
|
5
|
-
input: "Given these 10 findings from different agents, produce a disagreement map"
|
|
6
|
-
assert:
|
|
7
|
-
- type: contains
|
|
8
|
-
value: "consensus"
|
|
9
|
-
- type: contains
|
|
10
|
-
value: "contested"
|
|
11
|
-
- type: contains
|
|
12
|
-
value: "unique_insights"
|
|
1
|
+
# ftm-researcher/evals/synthesis-quality.yaml
|
|
2
|
+
description: Verify synthesis pipeline produces valid disagreement maps
|
|
3
|
+
prompts:
|
|
4
|
+
- vars:
|
|
5
|
+
input: "Given these 10 findings from different agents, produce a disagreement map"
|
|
6
|
+
assert:
|
|
7
|
+
- type: contains
|
|
8
|
+
value: "consensus"
|
|
9
|
+
- type: contains
|
|
10
|
+
value: "contested"
|
|
11
|
+
- type: contains
|
|
12
|
+
value: "unique_insights"
|