@heretek-ai/epistemic-swarm 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/brainstorming/SKILL.md +13 -0
- package/.agents/skills/code_audit/SKILL.md +13 -0
- package/.agents/skills/epistemic_search/SKILL.md +13 -0
- package/.agents/skills/grilling/SKILL.md +13 -0
- package/.agents/skills/oss_scout/SKILL.md +13 -0
- package/.agents/skills/research_cache/SKILL.md +13 -0
- package/.agents/skills/swarm_config/SKILL.md +13 -0
- package/.claude-plugin/plugin.json +15 -5
- package/.omp/README.md +39 -0
- package/.omp/SYSTEM.md +12 -0
- package/.omp/commands/audit.md +10 -0
- package/.omp/commands/brainstorming.md +12 -0
- package/.omp/commands/grill.md +9 -0
- package/.omp/commands/scout.md +10 -0
- package/.omp/commands/swarm-config.md +10 -0
- package/.omp/commands/swarm.md +9 -0
- package/.omp/hooks/post/epistemic-audit.ts +16 -0
- package/.omp/hooks/pre/epistemic-redirect.ts +21 -0
- package/.omp/prompts/brainstorming.md +8 -0
- package/.omp/prompts/swarm.md +8 -0
- package/MARKETPLACE.md +8 -0
- package/README.md +53 -8
- package/bin/cli.js +27 -3
- package/config/domain_packs/biopharma.json +23 -0
- package/config/domain_packs/legal.json +19 -0
- package/config/domain_packs/quant.json +19 -0
- package/config/mcp-research-servers.json +7 -0
- package/config/mcp_launcher.py +48 -137
- package/config/opencode-snippet.json +58 -3
- package/config/searxng_mcp.py +42 -83
- package/extensions/pi/index.js +196 -28
- package/install.sh +20 -4
- package/package.json +40 -5
- package/plugins/antigravity/README.md +28 -0
- package/plugins/antigravity/agents/alpha-thesis.md +6 -0
- package/plugins/antigravity/agents/beta-antithesis.md +7 -0
- package/plugins/antigravity/agents/brainstormer.md +7 -0
- package/plugins/antigravity/agents/epistemic-auditor.md +5 -0
- package/plugins/antigravity/hooks.json +23 -0
- package/plugins/antigravity/mcp_config.json +33 -0
- package/plugins/antigravity/plugin.json +21 -0
- package/plugins/antigravity/rules/epistemic-integrity.md +6 -0
- package/plugins/antigravity/skills/brainstorming/SKILL.md +13 -0
- package/plugins/antigravity/skills/code_audit/SKILL.md +13 -0
- package/plugins/antigravity/skills/epistemic_search/SKILL.md +13 -0
- package/plugins/antigravity/skills/grilling/SKILL.md +13 -0
- package/plugins/antigravity/skills/oss_scout/SKILL.md +13 -0
- package/plugins/antigravity/skills/research_cache/SKILL.md +13 -0
- package/plugins/antigravity/skills/swarm_config/SKILL.md +13 -0
- package/plugins/codex/AGENTS.md.snippet +10 -0
- package/plugins/codex/README.md +37 -0
- package/plugins/codex/config.toml.snippet +28 -0
- package/plugins/codex/openai.yaml +24 -0
- package/plugins/codex/skills/brainstorming/SKILL.md +13 -0
- package/plugins/codex/skills/code_audit/SKILL.md +13 -0
- package/plugins/codex/skills/epistemic_search/SKILL.md +13 -0
- package/plugins/codex/skills/grilling/SKILL.md +13 -0
- package/plugins/codex/skills/oss_scout/SKILL.md +13 -0
- package/plugins/codex/skills/research_cache/SKILL.md +13 -0
- package/plugins/codex/skills/swarm_config/SKILL.md +13 -0
- package/plugins/gemini/GEMINI.md +15 -0
- package/plugins/gemini/README.md +19 -0
- package/plugins/gemini/commands/audit.toml +6 -0
- package/plugins/gemini/commands/brainstorming.toml +10 -0
- package/plugins/gemini/commands/grill.toml +6 -0
- package/plugins/gemini/commands/scout.toml +7 -0
- package/plugins/gemini/commands/swarm-config.toml +7 -0
- package/plugins/gemini/commands/swarm.toml +8 -0
- package/plugins/gemini/gemini-extension.json +38 -0
- package/plugins/gemini/hooks/hooks.json +11 -0
- package/plugins/gemini/skills/brainstorming/SKILL.md +13 -0
- package/plugins/gemini/skills/code_audit/SKILL.md +13 -0
- package/plugins/gemini/skills/epistemic_search/SKILL.md +13 -0
- package/plugins/gemini/skills/grilling/SKILL.md +13 -0
- package/plugins/gemini/skills/oss_scout/SKILL.md +13 -0
- package/plugins/gemini/skills/research_cache/SKILL.md +13 -0
- package/plugins/gemini/skills/swarm_config/SKILL.md +13 -0
- package/plugins/opencode/index.js +335 -118
- package/prompts/agent_brainstormer.md +97 -0
- package/runner/__pycache__/__init__.cpython-311.pyc +0 -0
- package/runner/__pycache__/auctioneer.cpython-311.pyc +0 -0
- package/runner/__pycache__/auditor_engine.cpython-311.pyc +0 -0
- package/runner/__pycache__/claim_store.cpython-311.pyc +0 -0
- package/runner/__pycache__/claim_witness.cpython-311.pyc +0 -0
- package/runner/__pycache__/living_dossiers.cpython-311.pyc +0 -0
- package/runner/__pycache__/mcp_protocol.cpython-311.pyc +0 -0
- package/runner/__pycache__/mcp_server.cpython-311.pyc +0 -0
- package/runner/__pycache__/pcrb.cpython-311.pyc +0 -0
- package/runner/__pycache__/pcrb_verify.cpython-311.pyc +0 -0
- package/runner/__pycache__/refinement.cpython-311.pyc +0 -0
- package/runner/__pycache__/research_swarm.cpython-311.pyc +0 -0
- package/runner/__pycache__/state_machine.cpython-311.pyc +0 -0
- package/runner/auctioneer.py +169 -0
- package/runner/auditor_engine.py +127 -12
- package/runner/claim_store.py +361 -0
- package/runner/claim_witness.py +183 -0
- package/runner/living_dossiers.py +355 -0
- package/runner/mcp_protocol.py +188 -0
- package/runner/mcp_server.py +567 -0
- package/runner/pcrb.py +212 -0
- package/runner/pcrb_verify.py +237 -0
- package/runner/refinement.py +335 -0
- package/runner/research_swarm.py +378 -94
- package/runner/tests/__pycache__/test_auction_order.cpython-311.pyc +0 -0
- package/runner/tests/__pycache__/test_claim_store.cpython-311.pyc +0 -0
- package/runner/tests/__pycache__/test_claim_witness.cpython-311.pyc +0 -0
- package/runner/tests/__pycache__/test_domain_packs.cpython-311.pyc +0 -0
- package/runner/tests/__pycache__/test_fleet_seam.cpython-311.pyc +0 -0
- package/runner/tests/__pycache__/test_living_dossiers.cpython-311.pyc +0 -0
- package/runner/tests/__pycache__/test_mcp_server.cpython-311.pyc +0 -0
- package/runner/tests/__pycache__/test_pcrb.cpython-311.pyc +0 -0
- package/runner/tests/__pycache__/test_refinement.cpython-311.pyc +0 -0
- package/runner/tests/__pycache__/test_swarm.cpython-311.pyc +0 -0
- package/runner/tests/fixtures/auction_objective.json +35 -0
- package/runner/tests/fixtures/borderline_claims.json +27 -0
- package/runner/tests/fixtures/divergence_objectives.json +31 -0
- package/runner/tests/test_auction_order.py +173 -0
- package/runner/tests/test_claim_store.py +162 -0
- package/runner/tests/test_claim_witness.py +186 -0
- package/runner/tests/test_domain_packs.py +217 -0
- package/runner/tests/test_fleet_seam.py +113 -0
- package/runner/tests/test_living_dossiers.py +204 -0
- package/runner/tests/test_mcp_server.py +212 -0
- package/runner/tests/test_pcrb.py +240 -0
- package/runner/tests/test_refinement.py +255 -0
- package/runner/tests/test_swarm.py +173 -15
- package/scripts/auction_experiment.py +180 -0
- package/scripts/build_adapters.py +183 -0
- package/scripts/divergence_experiment.py +184 -0
- package/skills/brainstorming/SKILL.md +106 -0
- package/skills/brainstorming/__init__.py +1 -0
- package/skills/brainstorming/scripts/brainstorm.py +200 -0
- package/skills/research_cache/__pycache__/__init__.cpython-311.pyc +0 -0
- package/skills/research_cache/__pycache__/hasher.cpython-311.pyc +0 -0
- package/skills/swarm_config/SKILL.md +1 -1
- package/skills/swarm_config/__pycache__/__init__.cpython-311.pyc +0 -0
- package/skills/swarm_config/__pycache__/configure.cpython-311.pyc +0 -0
- package/skills/swarm_config/configure.py +45 -11
package/extensions/pi/index.js
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* IUMBTEMS: I Use My Brain To Express My Self
|
|
3
|
-
* Native Extension for Pi (pi.dev)
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* Native Extension for Pi (pi.dev) and OMP (oh-my-pi)
|
|
4
|
+
*
|
|
5
|
+
* THIN REGISTRATION (Stream A2b): slash commands keep their UX; every body
|
|
6
|
+
* forwards to the canonical first-party MCP surface:
|
|
7
|
+
*
|
|
8
|
+
* python3 runner/mcp_server.py call <tool> '<json>'
|
|
9
|
+
*
|
|
10
|
+
* The one exception is the brainstorming context scaffold
|
|
11
|
+
* (skills/brainstorming/scripts/brainstorm.py), which is skill-local tooling,
|
|
12
|
+
* not a duplicate tool implementation.
|
|
6
13
|
*/
|
|
7
14
|
|
|
8
15
|
import { spawnSync } from 'child_process';
|
|
@@ -12,13 +19,47 @@ import { fileURLToPath } from 'url';
|
|
|
12
19
|
const __filename = fileURLToPath(import.meta.url);
|
|
13
20
|
const __dirname = path.dirname(__filename);
|
|
14
21
|
const PKG_ROOT = path.resolve(__dirname, '../..');
|
|
22
|
+
const MCP_SERVER = path.join(PKG_ROOT, 'runner', 'mcp_server.py');
|
|
23
|
+
|
|
24
|
+
/** Uniform dispatch: one-shot MCP call. Returns {ok, text}. */
|
|
25
|
+
function callMcp(tool, args = {}, ctx = {}) {
|
|
26
|
+
const res = spawnSync(
|
|
27
|
+
'python3',
|
|
28
|
+
[MCP_SERVER, 'call', tool, JSON.stringify(args || {})],
|
|
29
|
+
{
|
|
30
|
+
encoding: 'utf-8',
|
|
31
|
+
cwd: ctx.cwd || process.cwd(),
|
|
32
|
+
env: { ...process.env, PYTHONPATH: PKG_ROOT },
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
return {
|
|
36
|
+
ok: res.status === 0,
|
|
37
|
+
text: res.stdout || res.stderr,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Parse `/swarm-config --engine X --depth N --mode M [--show]` into tool args. */
|
|
42
|
+
function parseConfigArgs(raw) {
|
|
43
|
+
const tokens = raw.trim() ? raw.trim().split(/\s+/) : [];
|
|
44
|
+
const out = {};
|
|
45
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
46
|
+
const t = tokens[i];
|
|
47
|
+
if (t === '--engine' || t === '-e') out.search_engine = tokens[++i];
|
|
48
|
+
else if (t === '--depth' || t === '-d' || t === '--iterations') out.max_iterations = Number(tokens[++i]);
|
|
49
|
+
else if (t === '--mode' || t === '-m') out.mode = tokens[++i];
|
|
50
|
+
else if (t === '--divergence') out.divergence_threshold = Number(tokens[++i]);
|
|
51
|
+
// --show / bare invocation = read-only inspect (MCP tool's default)
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
15
55
|
|
|
16
56
|
export default function initPiExtension(pi) {
|
|
17
57
|
// Check if Pi extension API is available
|
|
18
58
|
if (!pi) return;
|
|
19
59
|
|
|
20
|
-
// 1. Register
|
|
60
|
+
// 1. Register Slash Commands
|
|
21
61
|
if (typeof pi.registerCommand === 'function') {
|
|
62
|
+
// /swarm: autonomous dialectic research
|
|
22
63
|
pi.registerCommand('swarm', {
|
|
23
64
|
description: 'Run IUMBTEMS dialectic research swarm on an objective',
|
|
24
65
|
usage: '/swarm <objective>',
|
|
@@ -30,41 +71,122 @@ export default function initPiExtension(pi) {
|
|
|
30
71
|
}
|
|
31
72
|
|
|
32
73
|
ctx.output?.(`🌟 [IUMBTEMS] Dispatching Dialectic Swarm: "${objective}"...`);
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
cwd: ctx.cwd || process.cwd(),
|
|
37
|
-
env: { ...process.env, PYTHONPATH: PKG_ROOT }
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
if (res.status === 0) {
|
|
41
|
-
ctx.output?.(res.stdout);
|
|
74
|
+
const r = callMcp('iumbtems_swarm_research', { objective }, ctx);
|
|
75
|
+
if (r.ok) {
|
|
76
|
+
ctx.output?.(r.text);
|
|
42
77
|
ctx.output?.('\n✅ Research complete! Summary written to .research/final_synthesis.md');
|
|
43
78
|
} else {
|
|
44
|
-
ctx.output?.(`❌ Swarm failed:\n${
|
|
79
|
+
ctx.output?.(`❌ Swarm failed:\n${r.text}`);
|
|
45
80
|
}
|
|
46
81
|
}
|
|
47
82
|
});
|
|
48
83
|
|
|
49
|
-
//
|
|
84
|
+
// /grill: Socratic assumption-inversion
|
|
50
85
|
pi.registerCommand('grill', {
|
|
51
86
|
description: 'Launch Socratic grilling and decision tree frontier exploration',
|
|
52
87
|
usage: '/grill [--objective <text>]',
|
|
53
88
|
handler: async (args, ctx) => {
|
|
54
89
|
ctx.output?.('🧠 [IUMBTEMS] Launching Socratic Grilling decision tree...');
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
|
|
90
|
+
const objective = args.trim();
|
|
91
|
+
const r = callMcp(
|
|
92
|
+
'iumbtems_socratic_frontier',
|
|
93
|
+
objective ? { objective, file: '.research/frontier.json' } : { file: '.research/frontier.json' },
|
|
94
|
+
ctx
|
|
95
|
+
);
|
|
96
|
+
ctx.output?.(r.text);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// /swarm-config: Inspect and tune research parameters
|
|
101
|
+
pi.registerCommand('swarm-config', {
|
|
102
|
+
description: 'Inspect or update Epistemic Swarm parameters (engine, depth, mode)',
|
|
103
|
+
usage: '/swarm-config [--engine <e>] [--depth <d>] [--mode <m>] [--show]',
|
|
104
|
+
handler: async (args, ctx) => {
|
|
105
|
+
const r = callMcp('iumbtems_config', parseConfigArgs(args), ctx);
|
|
106
|
+
ctx.output?.(r.text);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// /audit: Dialectic codebase architecture & security audit
|
|
111
|
+
pi.registerCommand('audit', {
|
|
112
|
+
description: 'Run dialectic codebase architectural and security audit with line-level proof',
|
|
113
|
+
usage: '/audit <target_path_or_scope>',
|
|
114
|
+
handler: async (args, ctx) => {
|
|
115
|
+
const target = args.trim() || 'Full repository architecture and vulnerability audit';
|
|
116
|
+
ctx.output?.(`🛡️ [IUMBTEMS Audit] Launching Codebase Audit for: "${target}"...`);
|
|
117
|
+
const r = callMcp('iumbtems_code_audit', { target }, ctx);
|
|
118
|
+
if (r.ok) {
|
|
119
|
+
ctx.output?.(r.text);
|
|
120
|
+
ctx.output?.('\n✅ Audit complete! Report written to .research/code_audit_report.md');
|
|
121
|
+
} else {
|
|
122
|
+
ctx.output?.(`❌ Audit failed:\n${r.text}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// /scout: Open-source software discovery & clean-room harvesting
|
|
128
|
+
pi.registerCommand('scout', {
|
|
129
|
+
description: 'Scout open-source software libraries, audit copyleft licenses & generate clean-room blueprints',
|
|
130
|
+
usage: '/scout <feature_or_algorithm>',
|
|
131
|
+
handler: async (args, ctx) => {
|
|
132
|
+
const feature = args.trim();
|
|
133
|
+
if (!feature) {
|
|
134
|
+
ctx.output?.('⚠️ Please provide a feature to scout. Example: /scout "Zero-dependency Raft consensus in Rust"');
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
ctx.output?.(`🔭 [IUMBTEMS Scout] Scouting open-source solutions for: "${feature}"...`);
|
|
138
|
+
const r = callMcp('iumbtems_oss_scout', { feature }, ctx);
|
|
139
|
+
if (r.ok) {
|
|
140
|
+
ctx.output?.(r.text);
|
|
141
|
+
ctx.output?.('\n✅ Scout complete! Blueprint written to .research/oss_scout_report.md');
|
|
142
|
+
} else {
|
|
143
|
+
ctx.output?.(`❌ Scout failed:\n${r.text}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// /brainstorming: Lateral creative ideation (divergent, speculative)
|
|
149
|
+
pi.registerCommand('brainstorming', {
|
|
150
|
+
description: 'Lateral brainstorming: novel feature vectors, paradigm inversions, falsifiable spikes',
|
|
151
|
+
usage: '/brainstorming <ambiguous-prompt>',
|
|
152
|
+
handler: async (args, ctx) => {
|
|
153
|
+
const objective = args.trim() || 'Where do we go from here?';
|
|
154
|
+
ctx.output?.(`💡 [IUMBTEMS Brainstorm] Diverging on: "${objective}"...`);
|
|
155
|
+
// Skill-local context scaffold (not a tool duplicate) -> then canonical tool.
|
|
156
|
+
const scaffold = path.join(PKG_ROOT, 'skills/brainstorming/scripts/brainstorm.py');
|
|
157
|
+
const pre = spawnSync('python3', [scaffold, '--objective', objective, '--show-context'], {
|
|
58
158
|
encoding: 'utf-8',
|
|
59
159
|
cwd: ctx.cwd || process.cwd()
|
|
60
160
|
});
|
|
61
|
-
ctx.output?.(
|
|
161
|
+
ctx.output?.(pre.stdout || pre.stderr);
|
|
162
|
+
const r = callMcp('iumbtems_brainstorm', { objective }, ctx);
|
|
163
|
+
if (r.ok) {
|
|
164
|
+
ctx.output?.(r.text);
|
|
165
|
+
ctx.output?.('\n✅ Brainstorm complete! Portfolio written to .research/brainstorm_report.md');
|
|
166
|
+
} else {
|
|
167
|
+
ctx.output?.(`❌ Brainstorm failed:\n${r.text}`);
|
|
168
|
+
}
|
|
62
169
|
}
|
|
63
170
|
});
|
|
171
|
+
|
|
172
|
+
// /brainstorm alias
|
|
173
|
+
try {
|
|
174
|
+
pi.registerCommand('brainstorm', {
|
|
175
|
+
description: 'Alias for /brainstorming',
|
|
176
|
+
usage: '/brainstorm <ambiguous-prompt>',
|
|
177
|
+
handler: async (args, ctx) => {
|
|
178
|
+
const cmds = typeof pi.getCommands === 'function' ? pi.getCommands() : {};
|
|
179
|
+
const target = cmds?.brainstorming?.handler || cmds?.['brainstorming'];
|
|
180
|
+
if (typeof target === 'function') return target(args, ctx);
|
|
181
|
+
ctx.output?.('Use /brainstorming <prompt> instead.');
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
} catch { /* alias is best-effort across pi/omp versions */ }
|
|
64
185
|
}
|
|
65
186
|
|
|
66
|
-
//
|
|
187
|
+
// 2. Register Agent Tools (thin forwarders)
|
|
67
188
|
if (typeof pi.registerTool === 'function') {
|
|
189
|
+
// Tool: iumbtems_verify_quote
|
|
68
190
|
pi.registerTool({
|
|
69
191
|
name: 'iumbtems_verify_quote',
|
|
70
192
|
description: 'Verify that an empirical claim quote matches verbatim text in the source cache',
|
|
@@ -76,15 +198,61 @@ export default function initPiExtension(pi) {
|
|
|
76
198
|
},
|
|
77
199
|
required: ['hash', 'quote']
|
|
78
200
|
},
|
|
79
|
-
execute: async (
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
201
|
+
execute: async (args = {}) => {
|
|
202
|
+
const r = callMcp('iumbtems_verify_quote', { hash: args.hash, quote: args.quote }, {});
|
|
203
|
+
return { content: [{ type: 'text', text: r.text }] };
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
// Tool: iumbtems_config
|
|
208
|
+
pi.registerTool({
|
|
209
|
+
name: 'iumbtems_config',
|
|
210
|
+
description: 'Inspect or modify Epistemic Swarm configuration parameters (search engine, depth, mode) in .research/config.json',
|
|
211
|
+
parameters: {
|
|
212
|
+
type: 'object',
|
|
213
|
+
properties: {
|
|
214
|
+
search_engine: { type: 'string', enum: ['duckduckgo', 'brave', 'firecrawl', 'searxng'] },
|
|
215
|
+
max_iterations: { type: 'integer', minimum: 1, maximum: 4 },
|
|
216
|
+
mode: { type: 'string', enum: ['research', 'audit', 'scout', 'hybrid', 'brainstorm'] },
|
|
217
|
+
divergence_threshold: { type: 'number', minimum: 0, maximum: 1 },
|
|
218
|
+
show: { type: 'boolean', default: false }
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
execute: async (args = {}) => {
|
|
222
|
+
const r = callMcp('iumbtems_config', parseConfigArgsFromObject(args), {});
|
|
223
|
+
return { content: [{ type: 'text', text: r.text }] };
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// Tool: iumbtems_brainstorm (lateral ideation)
|
|
228
|
+
pi.registerTool({
|
|
229
|
+
name: 'iumbtems_brainstorm',
|
|
230
|
+
description: 'Run lateral brainstorming: novel feature vectors, paradigm inversions, falsifiable spikes',
|
|
231
|
+
parameters: {
|
|
232
|
+
type: 'object',
|
|
233
|
+
properties: {
|
|
234
|
+
objective: { type: 'string', description: 'Ambiguous exploration prompt' },
|
|
235
|
+
mock_mode: { type: 'boolean', description: 'Mock mode without LLM tokens', default: false }
|
|
236
|
+
},
|
|
237
|
+
required: ['objective']
|
|
238
|
+
},
|
|
239
|
+
execute: async (args = {}) => {
|
|
240
|
+
const r = callMcp('iumbtems_brainstorm', {
|
|
241
|
+
objective: args.objective || 'Where do we go from here?',
|
|
242
|
+
mock_claude: Boolean(args.mock_mode)
|
|
243
|
+
}, {});
|
|
244
|
+
return { content: [{ type: 'text', text: r.text }] };
|
|
87
245
|
}
|
|
88
246
|
});
|
|
89
247
|
}
|
|
90
248
|
}
|
|
249
|
+
|
|
250
|
+
/** Map a structured args object onto the iumbtems_config tool contract. */
|
|
251
|
+
function parseConfigArgsFromObject(args = {}) {
|
|
252
|
+
const out = {};
|
|
253
|
+
if (args.search_engine) out.search_engine = args.search_engine;
|
|
254
|
+
if (args.max_iterations) out.max_iterations = args.max_iterations;
|
|
255
|
+
if (args.mode) out.mode = args.mode;
|
|
256
|
+
if (args.divergence_threshold !== undefined) out.divergence_threshold = args.divergence_threshold;
|
|
257
|
+
return out;
|
|
258
|
+
}
|
package/install.sh
CHANGED
|
@@ -21,10 +21,15 @@ echo "✅ Core prerequisites detected (Python $(python3 --version | cut -d' ' -f
|
|
|
21
21
|
mkdir -p "$CLAUDE_DIR/skills"
|
|
22
22
|
|
|
23
23
|
echo "🔗 Linking skills into $CLAUDE_DIR/skills/..."
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
echo " - $CLAUDE_DIR/skills
|
|
24
|
+
for skill in grilling research_cache epistemic_search swarm_config code_audit oss_scout brainstorming; do
|
|
25
|
+
# legacy research-cache dir name kept as alias for older configs
|
|
26
|
+
ln -sf "$REPO_DIR/skills/$skill" "$CLAUDE_DIR/skills/$skill"
|
|
27
|
+
echo " - $CLAUDE_DIR/skills/$skill -> $REPO_DIR/skills/$skill"
|
|
28
|
+
done
|
|
29
|
+
if [ ! -e "$CLAUDE_DIR/skills/research-cache" ]; then
|
|
30
|
+
ln -sf "$REPO_DIR/skills/research_cache" "$CLAUDE_DIR/skills/research-cache"
|
|
31
|
+
echo " - $CLAUDE_DIR/skills/research-cache -> $REPO_DIR/skills/research_cache (legacy alias)"
|
|
32
|
+
fi
|
|
28
33
|
|
|
29
34
|
# 3. Patch ~/.claude.json mcpServers non-destructively
|
|
30
35
|
if [ -f "$CLAUDE_JSON" ]; then
|
|
@@ -47,6 +52,15 @@ try:
|
|
|
47
52
|
claude_data["mcpServers"] = {}
|
|
48
53
|
|
|
49
54
|
for server_name, server_def in mcp_data.get("mcpServers", {}).items():
|
|
55
|
+
# The first-party iumbtems server must resolve absolutely: a relative
|
|
56
|
+
# "runner/mcp_server.py" only works when cwd is the repo root.
|
|
57
|
+
if server_name == "iumbtems":
|
|
58
|
+
server_def = dict(server_def)
|
|
59
|
+
server_def["args"] = [str(Path("$REPO_DIR") / "runner" / "mcp_server.py")]
|
|
60
|
+
env = dict(server_def.get("env") or {})
|
|
61
|
+
env["PYTHONPATH"] = "$REPO_DIR"
|
|
62
|
+
server_def["env"] = env
|
|
63
|
+
|
|
50
64
|
if server_name not in claude_data["mcpServers"]:
|
|
51
65
|
claude_data["mcpServers"][server_name] = server_def
|
|
52
66
|
print(f" + Added MCP server: {server_name}")
|
|
@@ -98,5 +112,7 @@ fi
|
|
|
98
112
|
echo ""
|
|
99
113
|
echo "🎉 Epistemic Swarm installation complete!"
|
|
100
114
|
echo " - Interactive Grilling: run /grilling inside Claude Code"
|
|
115
|
+
echo " - Lateral Brainstorming: run /brainstorming inside Claude Code (skills/brainstorming)"
|
|
116
|
+
echo " - Rebuild harness adapters: python3 scripts/build_adapters.py"
|
|
101
117
|
echo " - Headless Research Swarm: npx @heretek-ai/epistemic-swarm run \"<objective>\""
|
|
102
118
|
echo "========================================================"
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@heretek-ai/epistemic-swarm",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "IUMBTEMS: I Use My Brain To Express My Self — High-Integrity Dialectic Research Agent Harness for Claude Code, Pi (pi
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "IUMBTEMS: I Use My Brain To Express My Self — High-Integrity Dialectic Research Agent Harness for Claude Code, OpenCode V2, Pi, OMP (oh-my-pi), Gemini CLI, Codex CLI, and AntiGravity",
|
|
5
5
|
"main": "bin/cli.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"iumbtems": "bin/cli.js",
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
".": "./bin/cli.js",
|
|
12
12
|
"./opencode": "./plugins/opencode/index.js",
|
|
13
13
|
"./server": "./plugins/opencode/index.js",
|
|
14
|
-
"./pi": "./extensions/pi/index.js"
|
|
14
|
+
"./pi": "./extensions/pi/index.js",
|
|
15
|
+
"./omp": "./extensions/pi/index.js"
|
|
15
16
|
},
|
|
16
17
|
"publishConfig": {
|
|
17
18
|
"access": "public"
|
|
@@ -28,9 +29,15 @@
|
|
|
28
29
|
"iumbtems",
|
|
29
30
|
"i-use-my-brain-to-express-my-self",
|
|
30
31
|
"pi-package",
|
|
32
|
+
"omp-package",
|
|
31
33
|
"opencode",
|
|
32
34
|
"opencode-plugin",
|
|
33
35
|
"claude-code",
|
|
36
|
+
"gemini-cli",
|
|
37
|
+
"codex-cli",
|
|
38
|
+
"antigravity",
|
|
39
|
+
"oh-my-pi",
|
|
40
|
+
"omp",
|
|
34
41
|
"ai-agents",
|
|
35
42
|
"autonomous-agents",
|
|
36
43
|
"multi-agent-systems",
|
|
@@ -45,6 +52,8 @@
|
|
|
45
52
|
"deep-research",
|
|
46
53
|
"socratic-grilling",
|
|
47
54
|
"socratic-questioning",
|
|
55
|
+
"brainstorming",
|
|
56
|
+
"lateral-thinking",
|
|
48
57
|
"fact-checking",
|
|
49
58
|
"red-teaming",
|
|
50
59
|
"citation-validation",
|
|
@@ -64,12 +73,33 @@
|
|
|
64
73
|
"./skills/epistemic_search",
|
|
65
74
|
"./skills/swarm_config",
|
|
66
75
|
"./skills/code_audit",
|
|
67
|
-
"./skills/oss_scout"
|
|
76
|
+
"./skills/oss_scout",
|
|
77
|
+
"./skills/brainstorming"
|
|
68
78
|
],
|
|
69
79
|
"prompts": [
|
|
70
80
|
"./prompts/*.md"
|
|
71
81
|
]
|
|
72
82
|
},
|
|
83
|
+
"omp": {
|
|
84
|
+
"extensions": [
|
|
85
|
+
"./extensions/pi/index.js"
|
|
86
|
+
],
|
|
87
|
+
"skills": [
|
|
88
|
+
"./skills/grilling",
|
|
89
|
+
"./skills/research_cache",
|
|
90
|
+
"./skills/epistemic_search",
|
|
91
|
+
"./skills/swarm_config",
|
|
92
|
+
"./skills/code_audit",
|
|
93
|
+
"./skills/oss_scout",
|
|
94
|
+
"./skills/brainstorming"
|
|
95
|
+
],
|
|
96
|
+
"prompts": [
|
|
97
|
+
"./prompts/*.md"
|
|
98
|
+
],
|
|
99
|
+
"commands": [
|
|
100
|
+
"./.omp/commands/*.md"
|
|
101
|
+
]
|
|
102
|
+
},
|
|
73
103
|
"author": "Heretek AI",
|
|
74
104
|
"license": "Apache-2.0",
|
|
75
105
|
"files": [
|
|
@@ -81,6 +111,9 @@
|
|
|
81
111
|
"runner",
|
|
82
112
|
"extensions",
|
|
83
113
|
"plugins",
|
|
114
|
+
"scripts",
|
|
115
|
+
".agents",
|
|
116
|
+
".omp",
|
|
84
117
|
".claude-plugin",
|
|
85
118
|
"install.sh",
|
|
86
119
|
"README.md",
|
|
@@ -92,8 +125,10 @@
|
|
|
92
125
|
},
|
|
93
126
|
"scripts": {
|
|
94
127
|
"test": "python3 -m unittest discover -s runner/tests",
|
|
128
|
+
"build:adapters": "python3 scripts/build_adapters.py",
|
|
129
|
+
"check:adapters": "python3 scripts/build_adapters.py --check",
|
|
95
130
|
"validate:claude": "claude plugin validate --strict .claude-plugin/marketplace.json && claude plugin validate --strict .",
|
|
96
|
-
"prepack": "python3 -m unittest discover -s runner/tests",
|
|
131
|
+
"prepack": "python3 scripts/build_adapters.py && python3 -m unittest discover -s runner/tests",
|
|
97
132
|
"install-local": "bash install.sh"
|
|
98
133
|
}
|
|
99
134
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# IUMBTEMS for AntiGravity
|
|
2
|
+
|
|
3
|
+
Native AntiGravity plugin (`agy`). Install from git or local path:
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
agy plugin install https://github.com/Heretek-AI/IUMBTEMS --path plugins/antigravity
|
|
7
|
+
# or local clone:
|
|
8
|
+
agy plugin install /path/to/IUMBTEMS/plugins/antigravity
|
|
9
|
+
agy plugin list
|
|
10
|
+
agy plugin validate /path/to/IUMBTEMS/plugins/antigravity
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Layout follows the AntiGravity extensibility model:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
plugins/antigravity/
|
|
17
|
+
├── plugin.json # required manifest (name, description, skills, agents, rules)
|
|
18
|
+
├── mcp_config.json # MCP servers (brave-search, firecrawl, searxng via config/mcp_launcher.py)
|
|
19
|
+
├── hooks.json # pre/post tool hooks (WebSearch/WebFetch interception)
|
|
20
|
+
├── skills/ # generated copies of canonical skills/ (see scripts/build_adapters.py)
|
|
21
|
+
├── agents/ # subagent definitions (alpha-thesis, beta-antithesis, auditor, brainstormer)
|
|
22
|
+
└── rules/ # workspace rules (epistemic integrity invariant)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Skills auto-promote to slash commands (`/grilling`, `/brainstorming`, ...).
|
|
26
|
+
Set optional secrets via workspace settings / env:
|
|
27
|
+
`BRAVE_SEARCH_API_KEY`, `FIRECRAWL_API_KEY`, `FIRECRAWL_API_URL`, `SEARXNG_URL`.
|
|
28
|
+
Zero-key DuckDuckGo + readability fallback works with no keys.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# Alpha Thesis — Proponent Subagent (AntiGravity)
|
|
2
|
+
|
|
3
|
+
Read `prompts/agent_alpha_thesis.md` as system instructions.
|
|
4
|
+
Posture: constructive, empirical, affirmative.
|
|
5
|
+
Every `[VERIFIED:<hash>]` claim must point at `.research/sources/<sha256>.md`
|
|
6
|
+
with a verbatim quote substring. Never fabricate citations.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Beta Antithesis — Adversary Subagent (AntiGravity)
|
|
2
|
+
|
|
3
|
+
Read `prompts/agent_beta_antithesis.md` as system instructions.
|
|
4
|
+
Posture: hostile auditor, active falsifier.
|
|
5
|
+
For every thesis claim, run inverted queries ("why [claim] fails",
|
|
6
|
+
"[claim] debunked", "[claim] performance degradation") and log
|
|
7
|
+
`[NEGATIVE_KNOWLEDGE:<query>]` when nothing is found.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Brainstormer — Lateral Ideation Subagent (AntiGravity)
|
|
2
|
+
|
|
3
|
+
Read `prompts/agent_brainstormer.md` as system instructions.
|
|
4
|
+
Calibration: temperature 1.0-1.2, top_p 0.92.
|
|
5
|
+
Produce Novel Feature Vectors (3-5), Lateral Architectural Moves (2-3),
|
|
6
|
+
Experimental Hypotheses (2-3 with `[HYPOTHESIS:<falsification test>]`).
|
|
7
|
+
Never output bug-fix lists. Write only to `.research/`.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"pre_tool": [
|
|
4
|
+
{
|
|
5
|
+
"matcher": "WebSearch",
|
|
6
|
+
"action": "deny",
|
|
7
|
+
"reason": "Intercepted by epistemic-swarm: use epistemic search (python3 skills/epistemic_search/scripts/search.py \"<query>\") for SHA-256 cached verification."
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"matcher": "WebFetch",
|
|
11
|
+
"action": "deny",
|
|
12
|
+
"reason": "Intercepted by epistemic-swarm: use epistemic fetch (python3 skills/epistemic_search/scripts/fetch.py \"<url>\") for content-addressed caching."
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"post_tool": [
|
|
16
|
+
{
|
|
17
|
+
"matcher": "*",
|
|
18
|
+
"action": "log",
|
|
19
|
+
"reason": "Epistemic audit trail: verify [VERIFIED:<hash>] quotes against .research/sources/<sha256>.md."
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mcpServers": {
|
|
3
|
+
"brave-search": {
|
|
4
|
+
"command": "python3",
|
|
5
|
+
"args": ["${pluginPath}/../../config/mcp_launcher.py", "brave-search"],
|
|
6
|
+
"env": {
|
|
7
|
+
"BRAVE_SEARCH_API_KEY": "${BRAVE_SEARCH_API_KEY}"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"firecrawl": {
|
|
11
|
+
"command": "python3",
|
|
12
|
+
"args": ["${pluginPath}/../../config/mcp_launcher.py", "firecrawl"],
|
|
13
|
+
"env": {
|
|
14
|
+
"FIRECRAWL_API_KEY": "${FIRECRAWL_API_KEY}",
|
|
15
|
+
"FIRECRAWL_API_URL": "${FIRECRAWL_API_URL:-http://localhost:3002}"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"searxng": {
|
|
19
|
+
"command": "python3",
|
|
20
|
+
"args": ["${pluginPath}/../../config/mcp_launcher.py", "searxng"],
|
|
21
|
+
"env": {
|
|
22
|
+
"SEARXNG_URL": "${SEARXNG_URL:-http://localhost:8080}"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"iumbtems": {
|
|
26
|
+
"command": "python3",
|
|
27
|
+
"args": ["${pluginPath}/../../runner/mcp_server.py"],
|
|
28
|
+
"env": {
|
|
29
|
+
"PYTHONPATH": "${pluginPath}/../.."
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://antigravity.google/schemas/v1/plugin.json",
|
|
3
|
+
"name": "epistemic-swarm",
|
|
4
|
+
"version": "0.3.0",
|
|
5
|
+
"description": "IUMBTEMS Epistemic Swarm: dialectic research, code audit, OSS scout, and lateral brainstorming for AntiGravity.",
|
|
6
|
+
"author": "Heretek AI",
|
|
7
|
+
"license": "Apache-2.0",
|
|
8
|
+
"repository": "https://github.com/Heretek-AI/IUMBTEMS",
|
|
9
|
+
"homepage": "https://github.com/Heretek-AI/IUMBTEMS#readme",
|
|
10
|
+
"skills": [
|
|
11
|
+
"./skills/grilling",
|
|
12
|
+
"./skills/research_cache",
|
|
13
|
+
"./skills/epistemic_search",
|
|
14
|
+
"./skills/swarm_config",
|
|
15
|
+
"./skills/code_audit",
|
|
16
|
+
"./skills/oss_scout",
|
|
17
|
+
"./skills/brainstorming"
|
|
18
|
+
],
|
|
19
|
+
"agents": ["./agents"],
|
|
20
|
+
"rules": ["./rules"]
|
|
21
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# Epistemic Integrity (AntiGravity workspace rule)
|
|
2
|
+
|
|
3
|
+
All factual claims MUST carry `[VERIFIED:<hash>]`, `[INFERRED:<chain>]`,
|
|
4
|
+
`[HYPOTHESIS:<falsification>]`, or `[NEGATIVE_KNOWLEDGE:<query>]` tags
|
|
5
|
+
(see `prompts/base_epistemic_system.md`). Unverified parametric recollection
|
|
6
|
+
is quarantined. Fetch, verify, then assert.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Brainstorming (thin adapter stub)
|
|
2
|
+
|
|
3
|
+
This file is a POINTER, not the implementation. It exists so harness skill
|
|
4
|
+
discovery finds an entry; the real skill lives in the IUMBTEMS repo.
|
|
5
|
+
|
|
6
|
+
- Canonical prose & scripts: `skills/brainstorming/`
|
|
7
|
+
- Canonical programmatic surface: `python3 runner/mcp_server.py` (stdio MCP),
|
|
8
|
+
or one-shot: `python3 runner/mcp_server.py call <tool> '{...json...}'`
|
|
9
|
+
- MCP tools for this skill: `iumbtems_brainstorm`
|
|
10
|
+
|
|
11
|
+
Epistemic rules apply regardless of harness: tag claims as
|
|
12
|
+
`[VERIFIED: <hash>]`, `[INFERRED: <reasoning>]`, `[HYPOTHESIS: <test>]`, or
|
|
13
|
+
`[NEGATIVE_KNOWLEDGE: <query>]`. Writes go only to `.research/`.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Code Audit (thin adapter stub)
|
|
2
|
+
|
|
3
|
+
This file is a POINTER, not the implementation. It exists so harness skill
|
|
4
|
+
discovery finds an entry; the real skill lives in the IUMBTEMS repo.
|
|
5
|
+
|
|
6
|
+
- Canonical prose & scripts: `skills/code_audit/`
|
|
7
|
+
- Canonical programmatic surface: `python3 runner/mcp_server.py` (stdio MCP),
|
|
8
|
+
or one-shot: `python3 runner/mcp_server.py call <tool> '{...json...}'`
|
|
9
|
+
- MCP tools for this skill: `iumbtems_code_audit`
|
|
10
|
+
|
|
11
|
+
Epistemic rules apply regardless of harness: tag claims as
|
|
12
|
+
`[VERIFIED: <hash>]`, `[INFERRED: <reasoning>]`, `[HYPOTHESIS: <test>]`, or
|
|
13
|
+
`[NEGATIVE_KNOWLEDGE: <query>]`. Writes go only to `.research/`.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Epistemic Search (thin adapter stub)
|
|
2
|
+
|
|
3
|
+
This file is a POINTER, not the implementation. It exists so harness skill
|
|
4
|
+
discovery finds an entry; the real skill lives in the IUMBTEMS repo.
|
|
5
|
+
|
|
6
|
+
- Canonical prose & scripts: `skills/epistemic_search/`
|
|
7
|
+
- Canonical programmatic surface: `python3 runner/mcp_server.py` (stdio MCP),
|
|
8
|
+
or one-shot: `python3 runner/mcp_server.py call <tool> '{...json...}'`
|
|
9
|
+
- MCP tools for this skill: `brave_web_search / firecrawl_scrape (research MCP servers)`
|
|
10
|
+
|
|
11
|
+
Epistemic rules apply regardless of harness: tag claims as
|
|
12
|
+
`[VERIFIED: <hash>]`, `[INFERRED: <reasoning>]`, `[HYPOTHESIS: <test>]`, or
|
|
13
|
+
`[NEGATIVE_KNOWLEDGE: <query>]`. Writes go only to `.research/`.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Socratic Grilling (thin adapter stub)
|
|
2
|
+
|
|
3
|
+
This file is a POINTER, not the implementation. It exists so harness skill
|
|
4
|
+
discovery finds an entry; the real skill lives in the IUMBTEMS repo.
|
|
5
|
+
|
|
6
|
+
- Canonical prose & scripts: `skills/grilling/`
|
|
7
|
+
- Canonical programmatic surface: `python3 runner/mcp_server.py` (stdio MCP),
|
|
8
|
+
or one-shot: `python3 runner/mcp_server.py call <tool> '{...json...}'`
|
|
9
|
+
- MCP tools for this skill: `iumbtems_socratic_frontier`
|
|
10
|
+
|
|
11
|
+
Epistemic rules apply regardless of harness: tag claims as
|
|
12
|
+
`[VERIFIED: <hash>]`, `[INFERRED: <reasoning>]`, `[HYPOTHESIS: <test>]`, or
|
|
13
|
+
`[NEGATIVE_KNOWLEDGE: <query>]`. Writes go only to `.research/`.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# OSS Scout (thin adapter stub)
|
|
2
|
+
|
|
3
|
+
This file is a POINTER, not the implementation. It exists so harness skill
|
|
4
|
+
discovery finds an entry; the real skill lives in the IUMBTEMS repo.
|
|
5
|
+
|
|
6
|
+
- Canonical prose & scripts: `skills/oss_scout/`
|
|
7
|
+
- Canonical programmatic surface: `python3 runner/mcp_server.py` (stdio MCP),
|
|
8
|
+
or one-shot: `python3 runner/mcp_server.py call <tool> '{...json...}'`
|
|
9
|
+
- MCP tools for this skill: `iumbtems_oss_scout`
|
|
10
|
+
|
|
11
|
+
Epistemic rules apply regardless of harness: tag claims as
|
|
12
|
+
`[VERIFIED: <hash>]`, `[INFERRED: <reasoning>]`, `[HYPOTHESIS: <test>]`, or
|
|
13
|
+
`[NEGATIVE_KNOWLEDGE: <query>]`. Writes go only to `.research/`.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Research Cache (thin adapter stub)
|
|
2
|
+
|
|
3
|
+
This file is a POINTER, not the implementation. It exists so harness skill
|
|
4
|
+
discovery finds an entry; the real skill lives in the IUMBTEMS repo.
|
|
5
|
+
|
|
6
|
+
- Canonical prose & scripts: `skills/research_cache/`
|
|
7
|
+
- Canonical programmatic surface: `python3 runner/mcp_server.py` (stdio MCP),
|
|
8
|
+
or one-shot: `python3 runner/mcp_server.py call <tool> '{...json...}'`
|
|
9
|
+
- MCP tools for this skill: `iumbtems_verify_quote`
|
|
10
|
+
|
|
11
|
+
Epistemic rules apply regardless of harness: tag claims as
|
|
12
|
+
`[VERIFIED: <hash>]`, `[INFERRED: <reasoning>]`, `[HYPOTHESIS: <test>]`, or
|
|
13
|
+
`[NEGATIVE_KNOWLEDGE: <query>]`. Writes go only to `.research/`.
|