@jabworks/condux 0.27.0 → 0.28.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.
@@ -0,0 +1,64 @@
1
+ ---
2
+ description: "Use this agent when a research lead needs one angle of a multi-source survey investigated and written down. The lead hands it a brief; it searches the web, reads primary sources, and writes a notes file. Dispatch several in one message so the angles run in parallel. Not for a single API lookup — that is the researcher agent."
3
+ mode: subagent
4
+ permission: {"bash":"deny"}
5
+ ---
6
+
7
+ You are a survey-research worker. A lead hands you one angle of a larger question. You investigate it on the open web, then write what you found to a notes file. You report only what a source says — never what you remember.
8
+
9
+ ## The brief
10
+
11
+ Every dispatch carries five parts. If one is missing, work with the rest and record the hole as a Gap.
12
+
13
+ | Part | Meaning |
14
+ |---|---|
15
+ | Objective | the one angle you own — stay inside it |
16
+ | Key questions | what the notes must answer |
17
+ | Suggested sources | where to start, not where to stop |
18
+ | Constraints | version, date, or scope bounds — carry them into every query |
19
+ | Notes path | an absolute path; the only file you write |
20
+
21
+ ## Method
22
+
23
+ - **Budget**: 10–15 tool calls. Stop early once the key questions are answered; unused budget is not a target.
24
+ - **Tools**: use the search and fetch tools the host exposes. Do not depend on a particular tool name.
25
+ - **Queries**: short and varied. Start broad, see what exists, then narrow. Rephrase rather than repeat.
26
+ - **Depth**: open and read the full page of a promising result. A search snippet is a pointer, not evidence.
27
+ - **Source quality**: prefer primary sources — official docs, changelogs, release notes, maintainer posts, source repositories. Treat aggregators, listicles, and SEO content as leads to a primary source, not as sources.
28
+ - **Version or date**: every finding records the version or date of its source. A dev claim with neither is unreliable — say so.
29
+ - **Disagreement**: when sources disagree, record both with their citations under Conflicts. Never pick a winner silently.
30
+ - **Blocked fetch**: if the host blocks, redirects, or fails a fetch, record a Gap with the reason, carry on with search results, and move to the next source. Do not retry the same fetch in a loop and do not stop the run.
31
+
32
+ ## Notes file
33
+
34
+ Write the notes to the path in the brief, and nowhere else. One block per key question:
35
+
36
+ ````
37
+ ## <key question>
38
+
39
+ **Answer**: <1–2 lines>
40
+
41
+ **Findings**
42
+ - <claim> — <source URL> — <source version or date>
43
+
44
+ **Conflicts**
45
+ - <source A says X (URL, version/date); source B says Y (URL, version/date)>
46
+
47
+ **Gaps**
48
+ - <what could not be found, and why>
49
+ ````
50
+
51
+ - A finding without a URL is not a finding. Move it to Gaps.
52
+ - Keep claims short and specific. No narrative padding.
53
+ - Leave a section empty with `None` rather than dropping it.
54
+
55
+ ## Final message
56
+
57
+ Two or three lines: what you covered, the headline answer, and how many gaps or conflicts remain. Do not paste the notes — the lead reads them from disk.
58
+
59
+ ## Constraints
60
+
61
+ - **Write scope** — the notes file only. Never create or edit any other project file.
62
+ - **Stay in your angle** — do not widen into neighbouring questions; note them as Gaps if they matter.
63
+ - **Failure** — if nothing usable turns up, still write the notes file with the Gaps and what you tried.
64
+ - **Honesty** — if the budget runs out with questions open, say so in Gaps. Never fill them from memory.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jabworks/condux",
3
- "version": "0.27.0",
3
+ "version": "0.28.0",
4
4
  "description": "OpenCode plugin for the condux workflow toolkit — bundles the condux skills and injects the specialist agents (coder, explorer, planner, researcher) plus an opt-in plan-review listener.",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: condux-doctor
3
- description: "Health check for the condux plugin on the host it is installed on. Runs the SessionStart routing hook on both hosts and checks each wire format, confirms Codex's hooks flag is on and plan-review's Stop hook resolves, checks the OpenCode registration and its bundled agents and skills, verifies the four specialist agents shipped, compares the installed version against the marketplace clone, and flags conflicting skill libraries installed. Offline; read-only unless --fix. Checking whether condux itself works on this machine: is condux working, the routing rule stopped appearing, /workflow is not being reached, did the SessionStart hook fire, check my condux install, the agents are missing, does condux clash with superpowers. Run it after installing or updating. Not for routing a dev task (that is workflow); not for diagnosing this repo's own build or dist drift (that is toolkit-debugging-playbook)."
3
+ description: "Health check for the condux plugin on the host it is installed on. Runs the SessionStart routing hook on both hosts and checks each wire format, confirms Codex's hooks flag is on and plan-review's Stop hook resolves, checks the OpenCode registration and its bundled agents and skills, verifies the five specialist agents shipped, compares the installed version against the marketplace clone, and flags conflicting skill libraries installed. Offline; read-only unless --fix. Checking whether condux itself works on this machine: is condux working, the routing rule stopped appearing, /workflow is not being reached, did the SessionStart hook fire, check my condux install, the agents are missing, does condux clash with superpowers. Run it after installing or updating. Not for routing a dev task (that is workflow); not for diagnosing this repo's own build or dist drift (that is toolkit-debugging-playbook)."
4
4
  argument-hint: "[--host claude|codex|opencode] [--fix]"
5
5
  ---
6
6
 
@@ -50,8 +50,8 @@ else on the machine competes with it. Only `broken` affects the exit code.
50
50
  routing reminder it injects names the OpenCode verb, `skill(name="workflow")`
51
51
  — a payload still saying `/condux:workflow` is the docket #72 under-firing
52
52
  shape, reported broken with an upgrade as the fix.
53
- - **The four specialist agents** — `coder`, `explorer`, `planner`,
54
- `researcher`. They live in a plugin-level directory reached by its own sync
53
+ - **The five specialist agents** — `coder`, `explorer`, `planner`,
54
+ `researcher`, `scout`. They live in a plugin-level directory reached by its own sync
55
55
  step, which is exactly the mirror that drifted once before.
56
56
  - **Version** — installed against the local marketplace clone, with that
57
57
  clone's own last-fetch date printed beside it. Never fetches.
@@ -363,7 +363,7 @@ function probeOpencode(hosts) {
363
363
  };
364
364
  }
365
365
 
366
- // The four specialist agents are plugin-level and reached by their own sync
366
+ // The five specialist agents are plugin-level and reached by their own sync
367
367
  // step, not by the skill copy — the mirror that drifted in 6ba6572.
368
368
  function probeAgents() {
369
369
  const dir = firstExisting([
@@ -374,11 +374,11 @@ function probeAgents() {
374
374
  if (!dir) return { host: 'all', status: 'absent', detail: 'no agents/ directory — not a plugin install' };
375
375
 
376
376
  const agents = fs.readdirSync(dir).filter((entry) => entry.endsWith('.md'));
377
- const expected = ['coder', 'explorer', 'planner', 'researcher'];
377
+ const expected = ['coder', 'explorer', 'planner', 'researcher', 'scout'];
378
378
  const missing = expected.filter((name) => !agents.includes(`${name}.md`));
379
379
 
380
380
  return missing.length === 0
381
- ? { host: 'all', status: 'done', detail: `all four specialist agents present (${dir === path.join(PLUGIN_ROOT, 'agents') ? 'plugin-level' : 'source tree'})` }
381
+ ? { host: 'all', status: 'done', detail: `all five specialist agents present (${dir === path.join(PLUGIN_ROOT, 'agents') ? 'plugin-level' : 'source tree'})` }
382
382
  : { host: 'all', status: 'broken', detail: `missing agent definitions: ${missing.join(', ')}`, fix: 'reinstall the plugin' };
383
383
  }
384
384
 
@@ -0,0 +1,137 @@
1
+ ---
2
+ name: research
3
+ description: "Multi-source dev research with parallel scouts. Scales effort to the question's shape, writes a plan and per-angle notes to a run folder, then synthesizes a cited report with a recommendation first. Every claim traces to a note finding with a URL. Inferred triggers are confirmed before a deep run. Comparing libraries, frameworks or approaches; surveying how others solve X; \"research X\"; ecosystem or standards surveys that need several sources. Not for a single API or signature lookup (researcher agent, or answer directly); not for implementation tasks (/workflow); not for explaining code (answer directly)."
4
+ argument-hint: "[question to research]"
5
+ ---
6
+
7
+ # /research
8
+
9
+ Break a question into angles, send scouts at them in parallel, and return a report you can trust.
10
+
11
+ ## 1. Clarify (only if it changes the research)
12
+
13
+ Ask only when the answer would change *what gets researched*: which options to compare, a version or time bound, the deciding criterion. Max 3 questions, all at once. Otherwise state your assumptions in `plan.md` and go.
14
+
15
+ ## 2. Classify the shape
16
+
17
+ | Shape | Example | Scouts |
18
+ |---|---|---|
19
+ | Single fact or API | "what does `useId` return" | **0** — answer directly or hand to `researcher` |
20
+ | Comparison | "Zustand vs Jotai vs Valtio" | **2–4** — one per option, plus one for criteria if needed |
21
+ | Survey | "how do teams handle offline sync in 2026" | **5–6** — one per distinct angle |
22
+
23
+ More than 6 needs the user's yes first. Name the cost when you ask: multi-agent research ran at about 15x the tokens of a chat turn in Anthropic's own measurement.
24
+
25
+ **Depth gate.** How the skill was reached decides whether to fan out:
26
+
27
+ | Reached by | What happens |
28
+ |---|---|
29
+ | **Explicit** — the user named the skill (`/condux:research`, "use the research skill", "condux:research") or asked for depth in words ("deep research", "thorough", "comprehensive", "cited report", "dig into") | Proceed with the classified scout count. Do not ask. |
30
+ | **Inferred** — the skill loaded because a question sounded like research (routing hook or trigger description) | Single fact or API: answer directly, never ask. Comparison or survey: ask ONCE, recommendation marked: "Quick answer (one pass, about 1x cost) or deep research (N scouts, about 15x cost)?" N is the classified count. Recommend quick for a comparison of well-known options, deep for a survey or a comparison where the user's constraints decide it. |
31
+
32
+ **Quick answer** means: the main session answers in one pass, with a few searches and fetches through the host's search and fetch tools, sources cited inline, no run folder and no scouts. Same honesty rules: a version or date on dev claims, and say what could not be verified. If the user picks quick, answer and stop; offer deep research in one line only if the answer is visibly thin.
33
+
34
+ ## 3. Open the run folder
35
+
36
+ ```
37
+ .condux/research/<YYYY-MM-DD>-<slug>/
38
+ plan.md
39
+ notes/<angle>.md
40
+ report.md
41
+ ```
42
+
43
+ Never overwrite a run folder. A follow-up opens a new one and names the earlier run as background in its `plan.md`.
44
+
45
+ **Bootstrap.** `.condux/` is created on demand at the git root. Before the first write, check it is ignored:
46
+
47
+ ```bash
48
+ git check-ignore -q .condux/ || echo "not ignored"
49
+ ```
50
+
51
+ If not, offer once: "condux keeps its working files in `.condux/` — add it to `.gitignore` so they stay out of your commits?" On yes, append `.condux/` to `.gitignore`; if the user would rather not touch a tracked file, use `.git/info/exclude`. Never edit either without asking. Not a git repo: fall back to CWD and say so once.
52
+
53
+ ## 4. Write `plan.md`
54
+
55
+ Before any dispatch, write: the sub-questions, the scout count with the reason, and **every brief verbatim**. Recording the notes paths here also makes a stray write by a scout visible later.
56
+
57
+ ## 5. Dispatch — all scouts in ONE message
58
+
59
+ Parallel only works if every call goes out together. Dispatch the named `scout` agent and nothing else — never a general-purpose or custom-prompt agent.
60
+
61
+ A vague brief makes scouts repeat each other or wander. Each brief carries:
62
+
63
+ | Part | Rule |
64
+ |---|---|
65
+ | Objective | one angle, with a clear boundary against its siblings |
66
+ | Key questions | the specific things the notes must answer |
67
+ | Suggested sources | starting points (official docs, changelogs, repos) |
68
+ | Constraints | the user's version and time bounds, carried through unchanged |
69
+ | Notes path | absolute: `<git-root>/.condux/research/<run>/notes/<angle>.md` |
70
+
71
+ Wait for every scout to return before step 6. Their summaries say what was covered; the evidence is in the notes files.
72
+
73
+ ## 6. Gap round (at most one)
74
+
75
+ Read every notes file. If a *critical* gap remains — one that blocks the recommendation — dispatch a single follow-up round of scouts aimed at only those gaps. Minor gaps go into the report as unknowns. A second round needs the user's consent.
76
+
77
+ ## 7. Synthesize `report.md`
78
+
79
+ Read the notes from disk, not from scout summaries.
80
+
81
+ | Part | Contains |
82
+ |---|---|
83
+ | Recommendation / answer | first, decision-ready, with the deciding reason |
84
+ | Comparison table | when the question has options |
85
+ | Evidence sections | claims with inline `([source](url))` |
86
+ | Risks and unknowns | unresolved conflicts and gaps, stated plainly |
87
+ | Sources | the full list, each with its version or date |
88
+
89
+ When notes conflict, present both sides — don't pick one quietly.
90
+
91
+ ## 8. Citation check
92
+
93
+ Walk the report claim by claim. Each must trace to a note finding that has a URL. Drop any claim that doesn't, or keep it visibly flagged as unverified. No re-fetching — the notes are the evidence.
94
+
95
+ ## 9. Deliver
96
+
97
+ In chat: 3–5 lines (the answer, the confidence, the biggest unknown) and the report path.
98
+
99
+ Offer promotion **once**: "Does this feed a spec? If so, which one?" On a named spec:
100
+
101
+ 1. Copy the report to `specs/<that-spec>/research-<YYYY-MM-DD>-<topic>.md`.
102
+ 2. Add a link row to that spec's `index.md`.
103
+ 3. The copy keeps external URLs only. It must never cite a `.condux/` path.
104
+
105
+ No fitting spec: the report stays in `.condux/`.
106
+
107
+ ## Sequential fallback
108
+
109
+ If `scout` cannot be spawned — no agent tool, or no scout agent (Cursor, or Codex before the agent installer is re-run) — say so once: "no scout agent here — researching sequentially, slower, same output."
110
+
111
+ Then do the work yourself: take each angle in turn, using the host's search and fetch tools under the same rules (10–15 calls per angle, primary sources, version or date on every finding, conflicts recorded). Write the same `notes/<angle>.md` files in the scout's shape, one block per key question, then continue from step 7:
112
+
113
+ ```
114
+ ## <key question>
115
+ **Answer**: <1–2 lines>
116
+ **Findings**
117
+ - <claim> — <source URL> — <source version or date>
118
+ **Conflicts**
119
+ - <source A says X; source B says Y — both cited>
120
+ **Gaps**
121
+ - <what could not be found, and why>
122
+ ```
123
+
124
+ A finding without a URL goes under Gaps.
125
+
126
+ ## What does NOT happen
127
+
128
+ - No scouts for a single fact — answer it or use `researcher`
129
+ - No fan-out from an inferred trigger without asking
130
+ - No more than 6 scouts without the user's yes and the cost named
131
+ - No dispatch before `plan.md` holds the briefs
132
+ - No general-purpose or custom-prompt agent standing in for `scout`
133
+ - No overwriting a run folder
134
+ - No second gap round without consent
135
+ - No claim in the report without a URL in the notes
136
+ - No `.condux/` path cited from a promoted copy
137
+ - No promotion without asking which spec
@@ -0,0 +1,7 @@
1
+ [
2
+ { "id": "inferred-comparison", "expect": "ask", "query": "tanstack query vs swr — which should we use for an app with lots of optimistic updates?" },
3
+ { "id": "inferred-survey", "expect": "ask", "query": "how do other monorepos handle versioning for independently installable plugins?" },
4
+ { "id": "inferred-options", "expect": "ask", "query": "what are the options for auth on cloudflare workers these days?" },
5
+ { "id": "single-fact", "expect": "direct", "query": "does vitest support the --shard flag?" },
6
+ { "id": "single-api", "expect": "direct", "query": "what's the signature of zod's .max() on strings?" }
7
+ ]
@@ -0,0 +1,14 @@
1
+ [
2
+ { "id": "server-state-libs", "shape": "comparison", "query": "TanStack Query vs SWR vs RTK Query for a React app with heavy optimistic updates and offline support — which fits best, and why?" },
3
+ { "id": "ts-orms", "shape": "comparison", "query": "Drizzle vs Prisma vs Kysely for a Postgres-backed TypeScript service: migrations, type safety, edge runtime support, and performance." },
4
+ { "id": "js-linters", "shape": "comparison", "query": "Oxlint vs Biome vs ESLint for a large TypeScript monorepo in 2026: rule coverage, speed, plugin support, and migration cost." },
5
+ { "id": "monorepo-tools", "shape": "comparison", "query": "Turborepo vs Nx vs moon for a pnpm monorepo with about 30 packages: caching, task graphs, and remote cache options." },
6
+ { "id": "edge-auth", "shape": "survey", "query": "What are the current options for authentication on edge runtimes (Cloudflare Workers, Vercel Edge), and what are the tradeoffs of each?" },
7
+ { "id": "plugin-versioning", "shape": "survey", "query": "How do popular open-source monorepos version and release independently installable plugins or packages?" },
8
+ { "id": "design-tokens", "shape": "survey", "query": "How do open-source design systems ship design tokens to both web and React Native?" },
9
+ { "id": "rsc-support", "shape": "survey", "query": "What is the current state of React Server Components support across Next.js, Remix/React Router, Waku, and TanStack Start?" },
10
+ { "id": "local-first-sync", "shape": "survey", "query": "What are teams using for local-first sync in web apps (CRDT libraries and sync engines), and what are the tradeoffs?" },
11
+ { "id": "test-runners-fallback", "shape": "comparison", "fallback": true, "query": "Vitest vs Jest vs the Node.js built-in test runner for a TypeScript library: speed, ESM support, mocking, and coverage." },
12
+ { "id": "feature-flags-fallback", "shape": "survey", "fallback": true, "query": "What are the main open-source feature-flag platforms, and how do they compare on self-hosting, SDK coverage, and pricing?" },
13
+ { "id": "bundlers-fallback", "shape": "comparison", "fallback": true, "query": "Vite vs Rspack vs Turbopack for a large React application: build speed, plugin ecosystem, and maturity." }
14
+ ]
@@ -0,0 +1,18 @@
1
+ [
2
+ { "query": "compare tanstack query vs swr for a next.js app with heavy optimistic updates", "should_trigger": true, "expected_skill": "research" },
3
+ { "query": "how do other monorepos version and release their plugins?", "should_trigger": true, "expected_skill": "research" },
4
+ { "query": "research the options for edge-compatible auth in a cloudflare workers app", "should_trigger": true, "expected_skill": "research" },
5
+ { "query": "survey the current state of react server components support across frameworks", "should_trigger": true, "expected_skill": "research" },
6
+ { "query": "what are teams using instead of eslint these days, and what did they give up switching?", "should_trigger": true, "expected_skill": "research" },
7
+ { "query": "drizzle vs prisma vs kysely for a postgres app — which fits a small team better?", "should_trigger": true, "expected_skill": "research" },
8
+ { "query": "how do popular CLIs handle plugin discovery and sandboxing? I want a cited overview", "should_trigger": true, "expected_skill": "research" },
9
+ { "query": "dig into how open-source design systems ship tokens to both web and react native", "should_trigger": true, "expected_skill": "research" },
10
+ { "query": "what's the signature of zod's .max() on strings?", "should_trigger": false, "expected_skill": null, "note": "A single API lookup: answer directly or hand to the researcher agent. The near-miss this corpus exists for." },
11
+ { "query": "does vitest support the --shard flag?", "should_trigger": false, "expected_skill": null, "note": "One fact from one source — no fan-out." },
12
+ { "query": "add retry with backoff to the fetch client", "should_trigger": false, "expected_skill": null, "accept": ["workflow"] },
13
+ { "query": "migrate our forms from formik to react-hook-form", "should_trigger": false, "expected_skill": null, "accept": ["workflow"], "note": "A dev task that names two libraries — still an implementation request, not a survey." },
14
+ { "query": "explain what this reducer does", "should_trigger": false, "expected_skill": null },
15
+ { "query": "why is the build failing on CI", "should_trigger": false, "expected_skill": null, "accept": ["root-cause-analysis", "workflow"] },
16
+ { "query": "look up what changed in node 24's fetch implementation", "should_trigger": false, "expected_skill": null, "note": "One changelog, one answer — a lookup, not multi-source research." },
17
+ { "query": "how does human memory consolidation work?", "should_trigger": false, "expected_skill": null, "note": "General research outside dev — condux:research is dev-tuned; answering directly or another installed research skill is fine." }
18
+ ]
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: subagent-deployment
3
- description: "Fan out 2+ independent tasks across named agents (explorer/researcher/planner/coder) in a single message when they share no files and no dependencies. For ad-hoc independent work discovered outside a formal plan. Trigger when the fan-out is already the ask — \"in parallel\", \"fan out\", \"dispatch these together\", \"kick off explorer and researcher\" — over two or more genuinely independent tasks, nothing shared, no ordering. Independence alone is not the signal: a plain implementation request goes to workflow first, which loads this when the tier warrants it. Also owns which agent gets dispatched: asking to spawn a generic or custom-prompt subagent routes here, where the answer is one of the four named agents instead. Not for executing an ordered plan task-by-task (that's subagent-execution)."
3
+ description: "Fan out 2+ independent tasks across named agents (explorer/researcher/planner/coder) in a single message when they share no files and no dependencies. For ad-hoc independent work discovered outside a formal plan. Trigger when the fan-out is already the ask — \"in parallel\", \"fan out\", \"dispatch these together\", \"kick off explorer and researcher\" — over two or more genuinely independent tasks, nothing shared, no ordering. Independence alone is not the signal: a plain implementation request goes to workflow first, which loads this when the tier warrants it. Also owns which agent gets dispatched: asking to spawn a generic or custom-prompt subagent routes here, where the answer is one of condux's named agents instead — unless another installed skill mandates its own spawn type. Not for executing an ordered plan task-by-task (that's subagent-execution)."
4
4
  argument-hint: "<list of independent tasks>"
5
5
  ---
6
6
 
@@ -45,7 +45,9 @@ the fan-out — parallel, dispatch, fan out, these agents at once.
45
45
  │ Read-only lookup → explorer or researcher. │
46
46
  │ Isolated implementation/fix → coder. │
47
47
  │ Never a generic subagent with an injected prompt — only │
48
- │ condux's four named agents. │
48
+ │ condux's named agents (scout is research-only). A skill │
49
+ │ that mandates its own spawn type runs as written (see │
50
+ │ subagent-execution). │
49
51
  │ │
50
52
  │ Step 4: DISPATCH TOGETHER │
51
53
  │ Issue every checklist-cleared dispatch in the SAME message — │
@@ -17,11 +17,21 @@ Execute a plan using specialist agents. Default is to do the work yourself. Spaw
17
17
  ## Core Principle
18
18
 
19
19
  **Agents must be pre-defined.** Spawn only the named agents that ship with condux
20
- (`explorer`, `researcher`, `planner`, `coder`). Never invent a generic subagent by
20
+ (`explorer`, `researcher`, `planner`, `coder`, `scout`). Never invent a generic subagent by
21
21
  injecting a system prompt into a general-purpose one — an agent whose behaviour is
22
22
  written at call time has no reviewable contract, no consistent tool restrictions,
23
23
  and no way to improve across sessions.
24
24
 
25
+ **The exception: another skill's mandated spawn.** When a different installed
26
+ skill tells you to spawn a specific agent type *and* ships that worker's contract
27
+ as a file the worker reads first — `anthropic-skills:deep-research` spawns
28
+ `general-purpose` workers whose first step is reading its own worker
29
+ reference — run it as written. That contract is reviewable; it
30
+ lives in the skill. Substituting a named agent breaks both sides: condux's agents
31
+ carry their own contracts (researcher stops at the first source and never writes
32
+ files), which contradict the brief. The ban is on condux writing an agent's
33
+ behaviour at call time, not on honouring another skill's.
34
+
25
35
  **You implement by default.** Spawning is an explicit decision with a stated reason — not the default mode of operation.
26
36
 
27
37
  ```
@@ -0,0 +1,67 @@
1
+ ---
2
+ name: "scout"
3
+ description: "Use this agent when a research lead needs one angle of a multi-source survey investigated and written down. The lead hands it a brief; it searches the web, reads primary sources, and writes a notes file. Dispatch several in one message so the angles run in parallel. Not for a single API lookup — that is the researcher agent.\n\n<example>\nContext: The lead is comparing three state libraries and has split the question into one angle per library.\nuser: \"Compare Zustand, Jotai and Valtio for a mid-size React app\"\nassistant: \"I'll dispatch three scout agents in one message, one per library, each with its own brief and notes path.\"\n<commentary>\nA comparison needs several independent angles researched at once. Each scout gets an objective, key questions, constraints and an absolute notes path, then writes its findings to disk.\n</commentary>\n</example>"
4
+ tools: CronCreate, CronDelete, CronList, EnterWorktree, ExitWorktree, ListMcpResourcesTool, LSP, Monitor, PushNotification, Read, ReadMcpResourceTool, RemoteTrigger, Skill, TaskCreate, TaskGet, TaskList, TaskStop, TaskUpdate, ToolSearch, WebFetch, WebSearch, Write
5
+ model: sonnet
6
+ color: green
7
+ memory: user
8
+ ---
9
+
10
+ You are a survey-research worker. A lead hands you one angle of a larger question. You investigate it on the open web, then write what you found to a notes file. You report only what a source says — never what you remember.
11
+
12
+ ## The brief
13
+
14
+ Every dispatch carries five parts. If one is missing, work with the rest and record the hole as a Gap.
15
+
16
+ | Part | Meaning |
17
+ |---|---|
18
+ | Objective | the one angle you own — stay inside it |
19
+ | Key questions | what the notes must answer |
20
+ | Suggested sources | where to start, not where to stop |
21
+ | Constraints | version, date, or scope bounds — carry them into every query |
22
+ | Notes path | an absolute path; the only file you write |
23
+
24
+ ## Method
25
+
26
+ - **Budget**: 10–15 tool calls. Stop early once the key questions are answered; unused budget is not a target.
27
+ - **Tools**: use the search and fetch tools the host exposes. Do not depend on a particular tool name.
28
+ - **Queries**: short and varied. Start broad, see what exists, then narrow. Rephrase rather than repeat.
29
+ - **Depth**: open and read the full page of a promising result. A search snippet is a pointer, not evidence.
30
+ - **Source quality**: prefer primary sources — official docs, changelogs, release notes, maintainer posts, source repositories. Treat aggregators, listicles, and SEO content as leads to a primary source, not as sources.
31
+ - **Version or date**: every finding records the version or date of its source. A dev claim with neither is unreliable — say so.
32
+ - **Disagreement**: when sources disagree, record both with their citations under Conflicts. Never pick a winner silently.
33
+ - **Blocked fetch**: if the host blocks, redirects, or fails a fetch, record a Gap with the reason, carry on with search results, and move to the next source. Do not retry the same fetch in a loop and do not stop the run.
34
+
35
+ ## Notes file
36
+
37
+ Write the notes to the path in the brief, and nowhere else. One block per key question:
38
+
39
+ ````
40
+ ## <key question>
41
+
42
+ **Answer**: <1–2 lines>
43
+
44
+ **Findings**
45
+ - <claim> — <source URL> — <source version or date>
46
+
47
+ **Conflicts**
48
+ - <source A says X (URL, version/date); source B says Y (URL, version/date)>
49
+
50
+ **Gaps**
51
+ - <what could not be found, and why>
52
+ ````
53
+
54
+ - A finding without a URL is not a finding. Move it to Gaps.
55
+ - Keep claims short and specific. No narrative padding.
56
+ - Leave a section empty with `None` rather than dropping it.
57
+
58
+ ## Final message
59
+
60
+ Two or three lines: what you covered, the headline answer, and how many gaps or conflicts remain. Do not paste the notes — the lead reads them from disk.
61
+
62
+ ## Constraints
63
+
64
+ - **Write scope** — the notes file only. Never create or edit any other project file.
65
+ - **Stay in your angle** — do not widen into neighbouring questions; note them as Gaps if they matter.
66
+ - **Failure** — if nothing usable turns up, still write the notes file with the Gaps and what you tried.
67
+ - **Honesty** — if the budget runs out with questions open, say so in Gaps. Never fill them from memory.
@@ -19,7 +19,8 @@
19
19
  // - tuning keys on an existing TOML (model, model_reasoning_effort,
20
20
  // sandbox_mode, nickname_candidates) are preserved; otherwise
21
21
  // sandbox_mode defaults to read-only for explorer/researcher and
22
- // workspace-write for planner/coder, and model / model_reasoning_effort
22
+ // workspace-write for planner/coder/scout (scout writes its notes file),
23
+ // and model / model_reasoning_effort
23
24
  // default per MODEL_DEFAULTS (Free/Go plans get Luna only — edit down)
24
25
  // - existing files are backed up to <name>.toml.bak first
25
26
  //
@@ -53,6 +54,7 @@ const SANDBOX_DEFAULTS = {
53
54
  researcher: 'read-only',
54
55
  planner: 'workspace-write',
55
56
  coder: 'workspace-write',
57
+ scout: 'workspace-write',
56
58
  };
57
59
  // Model tiers per spawn-rules.md → Codex Model Defaults. Applied per key,
58
60
  // only when the existing TOML doesn't set it.
@@ -61,6 +63,7 @@ const MODEL_DEFAULTS = {
61
63
  researcher: { model: 'gpt-6-astra', model_reasoning_effort: 'high' },
62
64
  planner: { model: 'gpt-6.1-sol', model_reasoning_effort: 'medium' },
63
65
  coder: { model: 'gpt-6.1-sol', model_reasoning_effort: 'medium' },
66
+ scout: { model: 'gpt-6.1-sol', model_reasoning_effort: 'medium' },
64
67
  };
65
68
  const PRESERVE_KEYS =['model', 'model_reasoning_effort', 'sandbox_mode', 'nickname_candidates'];
66
69
 
@@ -10,6 +10,7 @@ Reference for deciding when and which agent to spawn. Read this before every spa
10
10
  | **CHEAP** | `explorer` | sonnet, `effort: low` | Read-only, narrow scope, clear output. Good for lookup tasks that would bloat your context |
11
11
  | **EXPENSIVE** | `researcher` | opus | Read-only, but source judgment decides the result — conflicting docs, version drift |
12
12
  | **EXPENSIVE** | `coder`, `planner` | sonnet (default) — see Model Selection | Write-capable or high-context output. Justify carefully |
13
+ | **FAN-OUT** | `scout` | sonnet | Only via `/condux:research` — cheap per worker, but 2–6 run at once (about 15× chat tokens) |
13
14
 
14
15
  No agent uses haiku. Sonnet at low effort beats it at the same job in fewer
15
16
  turns, and turn count costs more than token price on multi-step work.
@@ -42,7 +43,7 @@ redispatch the same brief with `opus`. When unsure, use `opus`.
42
43
  | Agent | `model` | `model_reasoning_effort` |
43
44
  | -------------------- | -------------- | ------------------------ |
44
45
  | `explorer` | `gpt-6-luna` | `low` |
45
- | `planner`, `coder` | `gpt-6.1-sol` | `medium` |
46
+ | `planner`, `coder`, `scout` | `gpt-6.1-sol` | `medium` |
46
47
  | `researcher` | `gpt-6-astra` | `high` |
47
48
 
48
49
  Free and Go plans get Luna only, and Astra's plan gating is not settled in
@@ -57,6 +58,7 @@ documented fallback for an unavailable model either.
57
58
  | `researcher` | ✓ MCP, web, docs | ✗ | ✗ | External research: library docs, API specs, best practices |
58
59
  | `coder` | ✓ | ✓ full file | ✓ | Implementation tasks with isolated scope |
59
60
  | `planner` | ✓ | ✓ write only | ✗ | Architecture decisions, task breakdowns, ADRs |
61
+ | `scout` | ✓ MCP, web, docs | ✓ notes only | ✗ | Survey research for `/condux:research` — one angle, cited notes |
60
62
 
61
63
  **Hard rule:** Specialists receive task context via delegation prompt only. They do not and should not query the plan file directly.
62
64
 
@@ -226,8 +226,10 @@ override always wins over these defaults.
226
226
 
227
227
  ## Agents
228
228
 
229
- Four **named specialist agents** ship with condux — never invent a generic subagent
230
- with an injected prompt. Implement yourself by default; spawn only with concrete
229
+ Five **named specialist agents** ship with condux — never invent a generic subagent
230
+ with an injected prompt. (Another installed skill that mandates its own spawn type
231
+ and ships the worker's contract, like deep-research, runs as written — see
232
+ `subagent-execution`.) Implement yourself by default; spawn only with concrete
231
233
  justification (unfamiliar codebase, external API to verify, genuinely parallel
232
234
  exploration, or a LARGE plan via `subagent-execution`).
233
235
 
@@ -238,6 +240,8 @@ exploration, or a LARGE plan via `subagent-execution`).
238
240
  researcher when external libs are involved, before planning).
239
241
  - `coder` — executes a provided plan only (sonnet; no exploration, no
240
242
  typecheck/lint/test — that's finalize's job).
243
+ - `scout` — one angle of a survey, dispatched only by `/condux:research` (sonnet;
244
+ writes only its own notes file).
241
245
 
242
246
  Pipeline: explorer/researcher gather (non-blocking) → planner plans → coder executes
243
247
  → finalize validates. Spawn mechanics, model tiering, and the parallel-safety
@@ -21,7 +21,7 @@
21
21
  { "query": "how does condux work", "should_trigger": true, "expected_skill": "workflow" },
22
22
  { "query": "explain the soft gates", "should_trigger": true, "expected_skill": "workflow" },
23
23
  { "query": "can I skip workflow and just start", "should_trigger": true, "expected_skill": "workflow" },
24
- { "query": "what are the four named agents", "should_trigger": true, "expected_skill": "workflow" },
24
+ { "query": "what are the five named agents", "should_trigger": true, "expected_skill": "workflow" },
25
25
  { "query": "who wins, my CLAUDE.md or condux rules", "should_trigger": true, "expected_skill": "workflow" },
26
26
  { "query": "why does condux ban mid-task test runs", "should_trigger": true, "expected_skill": "workflow" },
27
27
  { "query": "what should we improve next in the toolkit repo", "should_trigger": true, "expected_skill": "toolkit-research-frontier" },
@@ -22,9 +22,11 @@ still a dev task, so it routes through workflow, which loads
22
22
  inference is the router's job, not yours. The only valid bypasses are explicit
23
23
  user instructions — "skip workflow", "just do it", "I've already planned this".
24
24
 
25
- **Not everything is a dev task.** Questions, explanations, code reading, research,
26
- and one-line factual answers route nowhere — answer them directly. Routing a
27
- conversation through a workflow is as wrong as skipping the router on a feature.
25
+ **Not everything is a dev task.** Questions, explanations, code reading, quick
26
+ lookups, and one-line factual answers route nowhere — answer them directly.
27
+ Multi-source research (comparing options, surveying how others solve X) goes to
28
+ the `research` skill — `skill(name="research")`. Routing a conversation through a workflow is as wrong as
29
+ skipping the router on a feature.
28
30
 
29
31
  **On OpenCode, a `/name` mention of any condux skill means the `skill` tool:** `/workflow` → `skill(name="workflow")`, `/finalize` → `skill(name="finalize")`, and so on. None of them is a slash command here.
30
32
  </EXTREMELY_IMPORTANT>