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.
Files changed (224) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +170 -170
  3. package/bin/generate-manifest.mjs +463 -463
  4. package/bin/install.mjs +491 -491
  5. package/docs/HOOKS.md +243 -243
  6. package/docs/INBOX.md +233 -233
  7. package/ftm/SKILL.md +122 -122
  8. package/ftm-audit/SKILL.md +623 -541
  9. package/ftm-audit/references/protocols/PROJECT-PATTERNS.md +91 -91
  10. package/ftm-audit/references/protocols/RUNTIME-WIRING.md +66 -66
  11. package/ftm-audit/references/protocols/WIRING-CONTRACTS.md +135 -135
  12. package/ftm-audit/references/strategies/AUTO-FIX-STRATEGIES.md +69 -69
  13. package/ftm-audit/references/templates/REPORT-FORMAT.md +96 -96
  14. package/ftm-audit/scripts/run-knip.sh +23 -23
  15. package/ftm-audit.yml +2 -2
  16. package/ftm-brainstorm/SKILL.md +498 -498
  17. package/ftm-brainstorm/evals/evals.json +100 -100
  18. package/ftm-brainstorm/evals/promptfoo.yaml +109 -109
  19. package/ftm-brainstorm/references/agent-prompts.md +224 -224
  20. package/ftm-brainstorm/references/plan-template.md +121 -121
  21. package/ftm-brainstorm.yml +2 -2
  22. package/ftm-browse/SKILL.md +454 -454
  23. package/ftm-browse/daemon/browser-manager.ts +206 -206
  24. package/ftm-browse/daemon/bun.lock +30 -30
  25. package/ftm-browse/daemon/cli.ts +347 -347
  26. package/ftm-browse/daemon/commands.ts +410 -410
  27. package/ftm-browse/daemon/main.ts +357 -357
  28. package/ftm-browse/daemon/package.json +17 -17
  29. package/ftm-browse/daemon/server.ts +189 -189
  30. package/ftm-browse/daemon/snapshot.ts +519 -519
  31. package/ftm-browse/daemon/tsconfig.json +22 -22
  32. package/ftm-browse.yml +4 -4
  33. package/ftm-capture/SKILL.md +370 -370
  34. package/ftm-capture.yml +4 -4
  35. package/ftm-codex-gate/SKILL.md +361 -361
  36. package/ftm-codex-gate.yml +2 -2
  37. package/ftm-config/SKILL.md +345 -345
  38. package/ftm-config.default.yml +82 -80
  39. package/ftm-config.yml +2 -2
  40. package/ftm-council/SKILL.md +416 -416
  41. package/ftm-council/references/prompts/CLAUDE-INVESTIGATION.md +60 -60
  42. package/ftm-council/references/prompts/CODEX-INVESTIGATION.md +58 -58
  43. package/ftm-council/references/prompts/GEMINI-INVESTIGATION.md +58 -58
  44. package/ftm-council/references/prompts/REBUTTAL-TEMPLATE.md +57 -57
  45. package/ftm-council/references/protocols/PREREQUISITES.md +47 -47
  46. package/ftm-council/references/protocols/STEP-0-FRAMING.md +46 -46
  47. package/ftm-council.yml +2 -2
  48. package/ftm-dashboard/SKILL.md +163 -163
  49. package/ftm-dashboard.yml +4 -4
  50. package/ftm-debug/SKILL.md +1037 -1037
  51. package/ftm-debug/references/phases/PHASE-0-INTAKE.md +58 -58
  52. package/ftm-debug/references/phases/PHASE-1-TRIAGE.md +46 -46
  53. package/ftm-debug/references/phases/PHASE-2-WAR-ROOM-AGENTS.md +279 -279
  54. package/ftm-debug/references/phases/PHASE-3-TO-6-EXECUTION.md +436 -436
  55. package/ftm-debug/references/protocols/BLACKBOARD.md +86 -86
  56. package/ftm-debug/references/protocols/EDGE-CASES.md +103 -103
  57. package/ftm-debug.yml +2 -2
  58. package/ftm-diagram/SKILL.md +277 -277
  59. package/ftm-diagram.yml +2 -2
  60. package/ftm-executor/SKILL.md +777 -767
  61. package/ftm-executor/references/STYLE-TEMPLATE.md +73 -73
  62. package/ftm-executor/references/phases/PHASE-0-VERIFICATION.md +62 -62
  63. package/ftm-executor/references/phases/PHASE-2-AGENT-ASSEMBLY.md +34 -34
  64. package/ftm-executor/references/phases/PHASE-3-WORKTREES.md +38 -38
  65. package/ftm-executor/references/phases/PHASE-4-5-AUDIT.md +72 -72
  66. package/ftm-executor/references/phases/PHASE-4-DISPATCH.md +66 -66
  67. package/ftm-executor/references/phases/PHASE-5-5-CODEX-GATE.md +73 -73
  68. package/ftm-executor/references/protocols/DOCUMENTATION-BOOTSTRAP.md +36 -36
  69. package/ftm-executor/references/protocols/MODEL-PROFILE.md +59 -44
  70. package/ftm-executor/references/protocols/PROGRESS-TRACKING.md +66 -66
  71. package/ftm-executor/runtime/ftm-runtime.mjs +252 -252
  72. package/ftm-executor/runtime/package.json +8 -8
  73. package/ftm-executor.yml +2 -2
  74. package/ftm-git/SKILL.md +441 -441
  75. package/ftm-git/evals/evals.json +26 -26
  76. package/ftm-git/evals/promptfoo.yaml +75 -75
  77. package/ftm-git/hooks/post-commit-experience.sh +92 -92
  78. package/ftm-git/references/patterns/SECRET-PATTERNS.md +104 -104
  79. package/ftm-git/references/protocols/REMEDIATION.md +139 -139
  80. package/ftm-git/scripts/pre-commit-secrets.sh +110 -110
  81. package/ftm-git.yml +2 -2
  82. package/ftm-inbox/backend/adapters/_retry.py +64 -64
  83. package/ftm-inbox/backend/adapters/base.py +230 -230
  84. package/ftm-inbox/backend/adapters/freshservice.py +104 -104
  85. package/ftm-inbox/backend/adapters/gmail.py +125 -125
  86. package/ftm-inbox/backend/adapters/jira.py +136 -136
  87. package/ftm-inbox/backend/adapters/registry.py +192 -192
  88. package/ftm-inbox/backend/adapters/slack.py +110 -110
  89. package/ftm-inbox/backend/db/connection.py +54 -54
  90. package/ftm-inbox/backend/db/schema.py +78 -78
  91. package/ftm-inbox/backend/executor/__init__.py +7 -7
  92. package/ftm-inbox/backend/executor/engine.py +149 -149
  93. package/ftm-inbox/backend/executor/step_runner.py +98 -98
  94. package/ftm-inbox/backend/main.py +103 -103
  95. package/ftm-inbox/backend/models/__init__.py +1 -1
  96. package/ftm-inbox/backend/models/unified_task.py +36 -36
  97. package/ftm-inbox/backend/planner/__init__.py +6 -6
  98. package/ftm-inbox/backend/planner/generator.py +127 -127
  99. package/ftm-inbox/backend/planner/schema.py +34 -34
  100. package/ftm-inbox/backend/requirements.txt +5 -5
  101. package/ftm-inbox/backend/routes/execute.py +186 -186
  102. package/ftm-inbox/backend/routes/health.py +52 -52
  103. package/ftm-inbox/backend/routes/inbox.py +68 -68
  104. package/ftm-inbox/backend/routes/plan.py +271 -271
  105. package/ftm-inbox/bin/launchagent.mjs +91 -91
  106. package/ftm-inbox/bin/setup.mjs +188 -188
  107. package/ftm-inbox/bin/start.sh +10 -10
  108. package/ftm-inbox/bin/status.sh +17 -17
  109. package/ftm-inbox/bin/stop.sh +8 -8
  110. package/ftm-inbox/config.example.yml +55 -55
  111. package/ftm-inbox/package-lock.json +2898 -2898
  112. package/ftm-inbox/package.json +26 -26
  113. package/ftm-inbox/postcss.config.js +6 -6
  114. package/ftm-inbox/src/app.css +199 -199
  115. package/ftm-inbox/src/app.html +18 -18
  116. package/ftm-inbox/src/lib/api.ts +166 -166
  117. package/ftm-inbox/src/lib/components/ExecutionLog.svelte +81 -81
  118. package/ftm-inbox/src/lib/components/InboxFeed.svelte +143 -143
  119. package/ftm-inbox/src/lib/components/PlanStep.svelte +271 -271
  120. package/ftm-inbox/src/lib/components/PlanView.svelte +206 -206
  121. package/ftm-inbox/src/lib/components/StreamPanel.svelte +99 -99
  122. package/ftm-inbox/src/lib/components/TaskCard.svelte +190 -190
  123. package/ftm-inbox/src/lib/components/ui/EmptyState.svelte +63 -63
  124. package/ftm-inbox/src/lib/components/ui/KawaiiCard.svelte +86 -86
  125. package/ftm-inbox/src/lib/components/ui/PillButton.svelte +106 -106
  126. package/ftm-inbox/src/lib/components/ui/StatusBadge.svelte +67 -67
  127. package/ftm-inbox/src/lib/components/ui/StreamDrawer.svelte +149 -149
  128. package/ftm-inbox/src/lib/components/ui/ThemeToggle.svelte +80 -80
  129. package/ftm-inbox/src/lib/theme.ts +47 -47
  130. package/ftm-inbox/src/routes/+layout.svelte +76 -76
  131. package/ftm-inbox/src/routes/+page.svelte +401 -401
  132. package/ftm-inbox/svelte.config.js +12 -12
  133. package/ftm-inbox/tailwind.config.ts +63 -63
  134. package/ftm-inbox/tsconfig.json +13 -13
  135. package/ftm-inbox/vite.config.ts +6 -6
  136. package/ftm-intent/SKILL.md +241 -241
  137. package/ftm-intent.yml +2 -2
  138. package/ftm-manifest.json +3794 -3794
  139. package/ftm-map/SKILL.md +291 -291
  140. package/ftm-map/scripts/db.py +712 -712
  141. package/ftm-map/scripts/index.py +415 -415
  142. package/ftm-map/scripts/parser.py +224 -224
  143. package/ftm-map/scripts/queries/go-tags.scm +20 -20
  144. package/ftm-map/scripts/queries/javascript-tags.scm +35 -35
  145. package/ftm-map/scripts/queries/python-tags.scm +31 -31
  146. package/ftm-map/scripts/queries/ruby-tags.scm +19 -19
  147. package/ftm-map/scripts/queries/rust-tags.scm +37 -37
  148. package/ftm-map/scripts/queries/typescript-tags.scm +41 -41
  149. package/ftm-map/scripts/query.py +301 -301
  150. package/ftm-map/scripts/ranker.py +377 -377
  151. package/ftm-map/scripts/requirements.txt +5 -5
  152. package/ftm-map/scripts/setup-hooks.sh +27 -27
  153. package/ftm-map/scripts/setup.sh +56 -56
  154. package/ftm-map/scripts/test_db.py +364 -364
  155. package/ftm-map/scripts/test_parser.py +174 -174
  156. package/ftm-map/scripts/test_query.py +183 -183
  157. package/ftm-map/scripts/test_ranker.py +199 -199
  158. package/ftm-map/scripts/views.py +591 -591
  159. package/ftm-map.yml +2 -2
  160. package/ftm-mind/SKILL.md +1943 -1943
  161. package/ftm-mind/evals/promptfoo.yaml +142 -142
  162. package/ftm-mind/references/blackboard-schema.md +328 -328
  163. package/ftm-mind/references/complexity-guide.md +110 -110
  164. package/ftm-mind/references/event-registry.md +319 -319
  165. package/ftm-mind/references/mcp-inventory.md +296 -296
  166. package/ftm-mind/references/protocols/COMPLEXITY-SIZING.md +72 -72
  167. package/ftm-mind/references/protocols/MCP-HEURISTICS.md +32 -32
  168. package/ftm-mind/references/protocols/PLAN-APPROVAL.md +80 -80
  169. package/ftm-mind/references/reflexion-protocol.md +249 -249
  170. package/ftm-mind/references/routing/SCENARIOS.md +22 -22
  171. package/ftm-mind/references/routing-scenarios.md +35 -35
  172. package/ftm-mind.yml +2 -2
  173. package/ftm-pause/SKILL.md +395 -395
  174. package/ftm-pause/references/protocols/SKILL-RESTORE-PROTOCOLS.md +186 -186
  175. package/ftm-pause/references/protocols/VALIDATION.md +80 -80
  176. package/ftm-pause.yml +2 -2
  177. package/ftm-researcher/SKILL.md +275 -275
  178. package/ftm-researcher/evals/agent-diversity.yaml +17 -17
  179. package/ftm-researcher/evals/synthesis-quality.yaml +12 -12
  180. package/ftm-researcher/evals/trigger-accuracy.yaml +39 -39
  181. package/ftm-researcher/references/adaptive-search.md +116 -116
  182. package/ftm-researcher/references/agent-prompts.md +193 -193
  183. package/ftm-researcher/references/council-integration.md +193 -193
  184. package/ftm-researcher/references/output-format.md +203 -203
  185. package/ftm-researcher/references/synthesis-pipeline.md +165 -165
  186. package/ftm-researcher/scripts/score_credibility.py +234 -234
  187. package/ftm-researcher/scripts/validate_research.py +92 -92
  188. package/ftm-researcher.yml +2 -2
  189. package/ftm-resume/SKILL.md +518 -518
  190. package/ftm-resume/references/protocols/VALIDATION.md +172 -172
  191. package/ftm-resume.yml +2 -2
  192. package/ftm-retro/SKILL.md +380 -380
  193. package/ftm-retro/references/protocols/SCORING-RUBRICS.md +89 -89
  194. package/ftm-retro/references/templates/REPORT-FORMAT.md +109 -109
  195. package/ftm-retro.yml +2 -2
  196. package/ftm-routine/SKILL.md +170 -170
  197. package/ftm-routine.yml +4 -4
  198. package/ftm-state/blackboard/capabilities.json +5 -5
  199. package/ftm-state/blackboard/capabilities.schema.json +27 -27
  200. package/ftm-state/blackboard/context.json +23 -23
  201. package/ftm-state/blackboard/experiences/index.json +9 -9
  202. package/ftm-state/blackboard/patterns.json +6 -6
  203. package/ftm-state/schemas/context.schema.json +130 -130
  204. package/ftm-state/schemas/experience-index.schema.json +77 -77
  205. package/ftm-state/schemas/experience.schema.json +78 -78
  206. package/ftm-state/schemas/patterns.schema.json +44 -44
  207. package/ftm-upgrade/SKILL.md +194 -194
  208. package/ftm-upgrade/scripts/check-version.sh +76 -76
  209. package/ftm-upgrade/scripts/upgrade.sh +143 -143
  210. package/ftm-upgrade.yml +2 -2
  211. package/ftm-verify.yml +2 -2
  212. package/ftm.yml +2 -2
  213. package/hooks/ftm-blackboard-enforcer.sh +93 -93
  214. package/hooks/ftm-discovery-reminder.sh +90 -90
  215. package/hooks/ftm-drafts-gate.sh +61 -61
  216. package/hooks/ftm-event-logger.mjs +107 -107
  217. package/hooks/ftm-map-autodetect.sh +79 -79
  218. package/hooks/ftm-pending-sync-check.sh +22 -22
  219. package/hooks/ftm-plan-gate.sh +92 -92
  220. package/hooks/ftm-post-commit-trigger.sh +57 -57
  221. package/hooks/settings-template.json +81 -81
  222. package/install.sh +363 -363
  223. package/package.json +84 -84
  224. package/uninstall.sh +25 -25
@@ -1,193 +1,193 @@
1
- # ftm-council Integration
2
-
3
- ## When Council Is Invoked
4
-
5
- - Deep mode only (standard and quick skip council)
6
- - After normalize & dedup (Phase 1 of synthesis)
7
- - Input: all claims with agent_count >= 2, plus high-confidence unique claims (confidence > 0.8)
8
-
9
- ---
10
-
11
- ## Interface Contract
12
-
13
- ftm-researcher prepares a structured prompt for ftm-council:
14
-
15
- ```
16
- Evaluate these research findings for accuracy, completeness, and potential bias.
17
- For each claim below, independently assess:
18
- 1. Is the evidence sufficient to support this claim?
19
- 2. What would make this claim wrong?
20
- 3. Are there alternative explanations the research may have missed?
21
- 4. Rate your confidence in this claim (0-1).
22
-
23
- [claims formatted as numbered list with evidence and sources]
24
-
25
- Return your assessment for each claim with: verdict (supported/contested/insufficient),
26
- confidence, and reasoning.
27
- ```
28
-
29
- ### Payload Format
30
-
31
- ```json
32
- {
33
- "context": "Research evaluation for: [query]",
34
- "claims": [
35
- {
36
- "id": "f-001",
37
- "claim": "...",
38
- "evidence": "...",
39
- "sources": ["url1", "url2"],
40
- "source_types": ["peer_reviewed", "blog"],
41
- "agent_count": 3,
42
- "credibility_score": 0.78
43
- }
44
- ],
45
- "evaluation_criteria": "accuracy, completeness, potential bias"
46
- }
47
- ```
48
-
49
- ### Expected Response Format
50
-
51
- ```json
52
- {
53
- "evaluations": [
54
- {
55
- "claim_id": "f-001",
56
- "verdict": "supported | contested | insufficient",
57
- "confidence": 0.85,
58
- "reasoning": "...",
59
- "what_would_make_this_wrong": "...",
60
- "alternative_explanations": ["..."]
61
- }
62
- ],
63
- "provider_positions": {
64
- "claude": { "f-001": "supported", ... },
65
- "codex": { "f-001": "contested", ... },
66
- "gemini": { "f-001": "supported", ... }
67
- }
68
- }
69
- ```
70
-
71
- ---
72
-
73
- ## How Council Results Map Back
74
-
75
- | Council Verdict | Mapping |
76
- |---|---|
77
- | All 3 providers: "supported" | consensus tier |
78
- | 2 agree "supported", 1 contests | consensus tier with minority note |
79
- | 2 contest, 1 supports | contested tier |
80
- | All 3 contest | refuted tier |
81
- | Mixed with "insufficient" | unique_insights tier (needs more evidence) |
82
- | 2 "insufficient", 1 "supported" | unique_insights tier |
83
- | 2 "insufficient", 1 "contested" | refuted tier (not enough evidence to contest = rejection) |
84
-
85
- ### Tie-Breaking Rules
86
-
87
- When the mapping is ambiguous:
88
- 1. Prefer the more conservative tier (contested over consensus, refuted over unique_insights)
89
- 2. If all three providers give different verdicts, place in contested with full position details
90
- 3. If confidence scores diverge significantly (spread > 0.3), flag as high-uncertainty
91
-
92
- ---
93
-
94
- ## Fallback: Standalone Challengers
95
-
96
- When ftm-council is unavailable (Codex CLI or Gemini CLI not installed):
97
-
98
- Spawn 2 agents on the `review` model from ftm-config:
99
-
100
- ### Devil's Advocate Agent
101
-
102
- ```
103
- You are the Devil's Advocate in a research pipeline.
104
-
105
- Your sole purpose is to find reasons each claim is WRONG.
106
-
107
- For each claim below:
108
- 1. Search for counter-evidence using WebSearch
109
- 2. Identify logical gaps in the reasoning
110
- 3. Flag claims supported by only one source type
111
- 4. Check if the evidence actually supports the claim or if the claim overstates the evidence
112
- 5. Look for cherry-picked data or survivorship bias
113
-
114
- Be adversarial. The goal is to stress-test, not to confirm.
115
-
116
- CLAIMS TO CHALLENGE:
117
- [formatted list of claims with evidence]
118
-
119
- RETURN FORMAT:
120
- For each claim challenged, return:
121
- - claim_challenged: [the claim text]
122
- - challenge_type: counter_evidence | logical_gap | single_source | overstated | bias
123
- - counter_evidence: [what you found that contradicts or weakens the claim]
124
- - severity: high | medium | low
125
- - recommendation: reject | weaken | flag_for_review | accept_with_caveat
126
- ```
127
-
128
- ### Edge Case Hunter Agent
129
-
130
- ```
131
- You are the Edge Case Hunter in a research pipeline.
132
-
133
- Your sole purpose is to find where each claim BREAKS.
134
-
135
- For each claim below:
136
- 1. What happens at scale? (10x, 100x, 1000x users/data/requests)
137
- 2. What happens under adversarial conditions? (malicious input, DDoS, data poisoning)
138
- 3. What about accessibility? (screen readers, keyboard-only, low bandwidth)
139
- 4. What about the 1% case? (rare but catastrophic failure modes)
140
- 5. What about 5 years from now? (technology shifts, dependency deprecation, scaling limits)
141
- 6. What happens when the key assumption changes? (the market shifts, the API breaks, the team grows)
142
-
143
- CLAIMS TO STRESS-TEST:
144
- [formatted list of claims with evidence]
145
-
146
- RETURN FORMAT:
147
- For each claim stressed, return:
148
- - claim_challenged: [the claim text]
149
- - challenge_type: scale | adversarial | accessibility | edge_case | longevity | assumption_shift
150
- - failure_scenario: [specific scenario where this claim breaks]
151
- - severity: high | medium | low
152
- - recommendation: reject | weaken | flag_for_review | accept_with_caveat
153
- ```
154
-
155
- ### Fallback Mapping
156
-
157
- Map challenger results to tiers:
158
-
159
- | Challenger Result | Mapping |
160
- |---|---|
161
- | No challenges from either agent | consensus |
162
- | Challenges with weak counter-evidence (low severity) | consensus with note |
163
- | One agent challenges with medium severity | contested |
164
- | Both agents challenge with medium+ severity | contested (strong) |
165
- | Multiple high-severity challenges | refuted |
166
- | Only edge case challenges, no factual counter-evidence | consensus with edge-case notes |
167
-
168
- ---
169
-
170
- ## Council Availability Detection
171
-
172
- Before invoking ftm-council, check availability:
173
-
174
- 1. Check if `codex` CLI is installed: `which codex`
175
- 2. Check if `gemini` CLI is installed: `which gemini`
176
- 3. If both are available: use full council
177
- 4. If only one is available: use 2-provider council (reduced confidence in verdicts)
178
- 5. If neither is available: use fallback challenger agents
179
-
180
- Log the availability status in the research metadata.
181
-
182
- ---
183
-
184
- ## Per-Claim Council Invocation
185
-
186
- The conversational iteration protocol supports council invocation for individual claims:
187
-
188
- When the user says "council #N":
189
- 1. Extract finding N from the current research state
190
- 2. Send ONLY that claim to ftm-council with full evidence
191
- 3. Update the claim's tier based on council verdict
192
- 4. Re-render the disagreement map with the updated position
193
- 5. Report the council's reasoning to the user
1
+ # ftm-council Integration
2
+
3
+ ## When Council Is Invoked
4
+
5
+ - Deep mode only (standard and quick skip council)
6
+ - After normalize & dedup (Phase 1 of synthesis)
7
+ - Input: all claims with agent_count >= 2, plus high-confidence unique claims (confidence > 0.8)
8
+
9
+ ---
10
+
11
+ ## Interface Contract
12
+
13
+ ftm-researcher prepares a structured prompt for ftm-council:
14
+
15
+ ```
16
+ Evaluate these research findings for accuracy, completeness, and potential bias.
17
+ For each claim below, independently assess:
18
+ 1. Is the evidence sufficient to support this claim?
19
+ 2. What would make this claim wrong?
20
+ 3. Are there alternative explanations the research may have missed?
21
+ 4. Rate your confidence in this claim (0-1).
22
+
23
+ [claims formatted as numbered list with evidence and sources]
24
+
25
+ Return your assessment for each claim with: verdict (supported/contested/insufficient),
26
+ confidence, and reasoning.
27
+ ```
28
+
29
+ ### Payload Format
30
+
31
+ ```json
32
+ {
33
+ "context": "Research evaluation for: [query]",
34
+ "claims": [
35
+ {
36
+ "id": "f-001",
37
+ "claim": "...",
38
+ "evidence": "...",
39
+ "sources": ["url1", "url2"],
40
+ "source_types": ["peer_reviewed", "blog"],
41
+ "agent_count": 3,
42
+ "credibility_score": 0.78
43
+ }
44
+ ],
45
+ "evaluation_criteria": "accuracy, completeness, potential bias"
46
+ }
47
+ ```
48
+
49
+ ### Expected Response Format
50
+
51
+ ```json
52
+ {
53
+ "evaluations": [
54
+ {
55
+ "claim_id": "f-001",
56
+ "verdict": "supported | contested | insufficient",
57
+ "confidence": 0.85,
58
+ "reasoning": "...",
59
+ "what_would_make_this_wrong": "...",
60
+ "alternative_explanations": ["..."]
61
+ }
62
+ ],
63
+ "provider_positions": {
64
+ "claude": { "f-001": "supported", ... },
65
+ "codex": { "f-001": "contested", ... },
66
+ "gemini": { "f-001": "supported", ... }
67
+ }
68
+ }
69
+ ```
70
+
71
+ ---
72
+
73
+ ## How Council Results Map Back
74
+
75
+ | Council Verdict | Mapping |
76
+ |---|---|
77
+ | All 3 providers: "supported" | consensus tier |
78
+ | 2 agree "supported", 1 contests | consensus tier with minority note |
79
+ | 2 contest, 1 supports | contested tier |
80
+ | All 3 contest | refuted tier |
81
+ | Mixed with "insufficient" | unique_insights tier (needs more evidence) |
82
+ | 2 "insufficient", 1 "supported" | unique_insights tier |
83
+ | 2 "insufficient", 1 "contested" | refuted tier (not enough evidence to contest = rejection) |
84
+
85
+ ### Tie-Breaking Rules
86
+
87
+ When the mapping is ambiguous:
88
+ 1. Prefer the more conservative tier (contested over consensus, refuted over unique_insights)
89
+ 2. If all three providers give different verdicts, place in contested with full position details
90
+ 3. If confidence scores diverge significantly (spread > 0.3), flag as high-uncertainty
91
+
92
+ ---
93
+
94
+ ## Fallback: Standalone Challengers
95
+
96
+ When ftm-council is unavailable (Codex CLI or Gemini CLI not installed):
97
+
98
+ Spawn 2 agents on the `review` model from ftm-config:
99
+
100
+ ### Devil's Advocate Agent
101
+
102
+ ```
103
+ You are the Devil's Advocate in a research pipeline.
104
+
105
+ Your sole purpose is to find reasons each claim is WRONG.
106
+
107
+ For each claim below:
108
+ 1. Search for counter-evidence using WebSearch
109
+ 2. Identify logical gaps in the reasoning
110
+ 3. Flag claims supported by only one source type
111
+ 4. Check if the evidence actually supports the claim or if the claim overstates the evidence
112
+ 5. Look for cherry-picked data or survivorship bias
113
+
114
+ Be adversarial. The goal is to stress-test, not to confirm.
115
+
116
+ CLAIMS TO CHALLENGE:
117
+ [formatted list of claims with evidence]
118
+
119
+ RETURN FORMAT:
120
+ For each claim challenged, return:
121
+ - claim_challenged: [the claim text]
122
+ - challenge_type: counter_evidence | logical_gap | single_source | overstated | bias
123
+ - counter_evidence: [what you found that contradicts or weakens the claim]
124
+ - severity: high | medium | low
125
+ - recommendation: reject | weaken | flag_for_review | accept_with_caveat
126
+ ```
127
+
128
+ ### Edge Case Hunter Agent
129
+
130
+ ```
131
+ You are the Edge Case Hunter in a research pipeline.
132
+
133
+ Your sole purpose is to find where each claim BREAKS.
134
+
135
+ For each claim below:
136
+ 1. What happens at scale? (10x, 100x, 1000x users/data/requests)
137
+ 2. What happens under adversarial conditions? (malicious input, DDoS, data poisoning)
138
+ 3. What about accessibility? (screen readers, keyboard-only, low bandwidth)
139
+ 4. What about the 1% case? (rare but catastrophic failure modes)
140
+ 5. What about 5 years from now? (technology shifts, dependency deprecation, scaling limits)
141
+ 6. What happens when the key assumption changes? (the market shifts, the API breaks, the team grows)
142
+
143
+ CLAIMS TO STRESS-TEST:
144
+ [formatted list of claims with evidence]
145
+
146
+ RETURN FORMAT:
147
+ For each claim stressed, return:
148
+ - claim_challenged: [the claim text]
149
+ - challenge_type: scale | adversarial | accessibility | edge_case | longevity | assumption_shift
150
+ - failure_scenario: [specific scenario where this claim breaks]
151
+ - severity: high | medium | low
152
+ - recommendation: reject | weaken | flag_for_review | accept_with_caveat
153
+ ```
154
+
155
+ ### Fallback Mapping
156
+
157
+ Map challenger results to tiers:
158
+
159
+ | Challenger Result | Mapping |
160
+ |---|---|
161
+ | No challenges from either agent | consensus |
162
+ | Challenges with weak counter-evidence (low severity) | consensus with note |
163
+ | One agent challenges with medium severity | contested |
164
+ | Both agents challenge with medium+ severity | contested (strong) |
165
+ | Multiple high-severity challenges | refuted |
166
+ | Only edge case challenges, no factual counter-evidence | consensus with edge-case notes |
167
+
168
+ ---
169
+
170
+ ## Council Availability Detection
171
+
172
+ Before invoking ftm-council, check availability:
173
+
174
+ 1. Check if `codex` CLI is installed: `which codex`
175
+ 2. Check if `gemini` CLI is installed: `which gemini`
176
+ 3. If both are available: use full council
177
+ 4. If only one is available: use 2-provider council (reduced confidence in verdicts)
178
+ 5. If neither is available: use fallback challenger agents
179
+
180
+ Log the availability status in the research metadata.
181
+
182
+ ---
183
+
184
+ ## Per-Claim Council Invocation
185
+
186
+ The conversational iteration protocol supports council invocation for individual claims:
187
+
188
+ When the user says "council #N":
189
+ 1. Extract finding N from the current research state
190
+ 2. Send ONLY that claim to ftm-council with full evidence
191
+ 3. Update the claim's tier based on council verdict
192
+ 4. Re-render the disagreement map with the updated position
193
+ 5. Report the council's reasoning to the user