@tangle-network/agent-knowledge 1.10.0 → 1.11.1
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/README.md +250 -74
- package/dist/benchmarks/index.d.ts +5 -0
- package/dist/benchmarks/index.js +52 -0
- package/dist/chunk-DQ3PDMDP.js +115 -0
- package/dist/chunk-DQ3PDMDP.js.map +1 -0
- package/dist/chunk-ULXZI235.js +1855 -0
- package/dist/chunk-ULXZI235.js.map +1 -0
- package/dist/{chunk-U6KQ4FS3.js → chunk-VN2OGUUP.js} +306 -40
- package/dist/chunk-VN2OGUUP.js.map +1 -0
- package/dist/{chunk-WWY5FTKQ.js → chunk-W6VWYTNH.js} +10 -115
- package/dist/chunk-W6VWYTNH.js.map +1 -0
- package/dist/chunk-XVU5FFQA.js +49 -0
- package/dist/chunk-XVU5FFQA.js.map +1 -0
- package/dist/cli.js +4 -2
- package/dist/cli.js.map +1 -1
- package/dist/index-Cj5jRXOz.d.ts +426 -0
- package/dist/index.d.ts +1036 -169
- package/dist/index.js +3372 -558
- package/dist/index.js.map +1 -1
- package/dist/memory/index.d.ts +5 -70
- package/dist/memory/index.js +20 -4
- package/dist/types-CjqPcTTK.d.ts +319 -0
- package/docs/architecture.md +7 -5
- package/docs/eval/investment-material-facts.md +252 -0
- package/docs/eval/rag-eval-roadmap.md +119 -0
- package/docs/results/investment-thesis.md +306 -0
- package/docs/results/research-driving.md +265 -0
- package/docs/two-agent-research-ab.md +121 -10
- package/package.json +8 -9
- package/dist/chunk-MU5CEOGE.js +0 -387
- package/dist/chunk-MU5CEOGE.js.map +0 -1
- package/dist/chunk-U6KQ4FS3.js.map +0 -1
- package/dist/chunk-WWY5FTKQ.js.map +0 -1
- package/dist/profiles/index.d.ts +0 -194
- package/dist/profiles/index.js +0 -11
- package/docs/recursive-research-leaf.md +0 -86
- package/docs/supervisor-profiles.md +0 -295
- /package/dist/{profiles → benchmarks}/index.js.map +0 -0
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
# Skill: spawn a driver-loop as a leaf for a large sub-topic
|
|
2
|
-
|
|
3
|
-
Supervisor-facing guidance. The `runResearchSupervisor` brain (see
|
|
4
|
-
`src/research-supervisor.ts`) decomposes a goal into sub-topics and spawns one
|
|
5
|
-
researcher per sub-topic over the live `Scope`. By default each spawn is a **bare
|
|
6
|
-
worker**: a single researcher pass that adds sources and proposes pages.
|
|
7
|
-
|
|
8
|
-
For a **large** sub-topic, a single worker pass under-covers it. The recursive
|
|
9
|
-
move is to spawn, in place of that bare worker, a **driver-loop leaf** — a child
|
|
10
|
-
that is itself a driver running its own worker (the two-agent loop), so the
|
|
11
|
-
sub-topic gets verify + gap-fill + readiness-gate iteration, not one shot.
|
|
12
|
-
|
|
13
|
-
`agent-runtime`'s `Scope.spawn(agent, task, opts)` makes this a first-class
|
|
14
|
-
recursion: the spawned `Agent` can itself be a driver, not just a worker. The
|
|
15
|
-
supervisor spawns a child `Agent` whose `act(task, childScope)` runs
|
|
16
|
-
`runTwoAgentResearchLoop` (or its own `runResearchSupervisor`) scoped to the
|
|
17
|
-
sub-topic, against the SAME knowledge base root, with a sub-topic-scoped slice of
|
|
18
|
-
readiness specs. The conserved budget pool reserves `opts.budget` for the child
|
|
19
|
-
atomically and refunds the unspent remainder on settle, so a driver-loop leaf
|
|
20
|
-
spends from the same pool a bare worker would have — depth costs budget, not extra
|
|
21
|
-
budget.
|
|
22
|
-
|
|
23
|
-
## When it's worth it
|
|
24
|
-
|
|
25
|
-
Spawn a driver-loop leaf (instead of a bare worker) for a sub-topic when ANY of
|
|
26
|
-
these hold; otherwise spawn a bare worker.
|
|
27
|
-
|
|
28
|
-
| Signal | Bare worker | Driver-loop leaf |
|
|
29
|
-
| --- | --- | --- |
|
|
30
|
-
| **Breadth** — distinct readiness specs the sub-topic must close | 1–2 | 3+ |
|
|
31
|
-
| **Depth** — does a fact need a source THEN a derived claim citing it? | shallow (source ≈ answer) | layered (source → claim → cross-check) |
|
|
32
|
-
| **Expected rounds** — passes to reach no-blocking-gaps for the sub-topic | ~1 | 2+ (a worker's first pass predictably leaves blocking gaps) |
|
|
33
|
-
| **Verification risk** — is a wrong/duplicate source likely and costly here? | low | high (the leaf's driver rejects bad sources before they commit) |
|
|
34
|
-
| **Budget headroom** — iterations/tokens left in the pool for this branch | tight | comfortable (a leaf needs ≥ ~3× a worker's per-pass spend) |
|
|
35
|
-
|
|
36
|
-
Rule of thumb: **breadth ≥ 3 specs OR expected rounds ≥ 2 OR high verification
|
|
37
|
-
risk ⇒ driver-loop leaf.** A sub-topic that is one fact from one source is a bare
|
|
38
|
-
worker — wrapping it in a driver only burns budget on a loop that stops after
|
|
39
|
-
round 1.
|
|
40
|
-
|
|
41
|
-
## The shape
|
|
42
|
-
|
|
43
|
-
```ts
|
|
44
|
-
import type { Agent, Scope } from '@tangle-network/agent-runtime/loops'
|
|
45
|
-
import { runTwoAgentResearchLoop, type TwoAgentResearchLoopResult } from '@tangle-network/agent-knowledge'
|
|
46
|
-
|
|
47
|
-
// For a LARGE sub-topic, spawn a sub-driver leaf that runs the two-agent loop
|
|
48
|
-
// scoped to that sub-topic. The child shares the KB root and the conserved
|
|
49
|
-
// budget pool; it gets its own driver (verify + fill + gate) instead of a single
|
|
50
|
-
// worker pass. The child is an `Agent` whose `act` IS the two-agent loop.
|
|
51
|
-
const researchLeaf: Agent<typeof subTopic, TwoAgentResearchLoopResult> = {
|
|
52
|
-
name: `research-leaf:${subTopic.id}`,
|
|
53
|
-
async act(task, childScope: Scope<TwoAgentResearchLoopResult>) {
|
|
54
|
-
return runTwoAgentResearchLoop({
|
|
55
|
-
root, // the SAME knowledge base
|
|
56
|
-
goal: task.goal,
|
|
57
|
-
worker, // the sub-topic researcher
|
|
58
|
-
driver, // verifies the worker's sources, gap-fills, gates on readiness
|
|
59
|
-
driverResearches: true, // the leaf's driver also researches the missed gaps
|
|
60
|
-
readinessSpecs: task.specs, // the sub-topic's slice of the gate
|
|
61
|
-
signal: childScope.signal,
|
|
62
|
-
})
|
|
63
|
-
},
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Reserves `budget` from the conserved pool atomically; refunds on settle.
|
|
67
|
-
const spawned = scope.spawn(researchLeaf, subTopic, {
|
|
68
|
-
label: `research-leaf:${subTopic.id}`,
|
|
69
|
-
budget: perSubTopicBudget, // a slice of the conserved pool
|
|
70
|
-
})
|
|
71
|
-
if (!spawned.ok) {
|
|
72
|
-
// fail-closed: 'budget-exhausted' | 'depth-exceeded' — spawn a bare worker or stop.
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
A bare worker, by contrast, is `scope.spawn(workerFromBackend(backend)(...), …)`
|
|
77
|
-
of the researcher profile — no inner driver, no per-sub-topic readiness gate, one
|
|
78
|
-
pass.
|
|
79
|
-
|
|
80
|
-
## Why this is a leaf, not a fork
|
|
81
|
-
|
|
82
|
-
The driver-loop leaf is still ONE branch of the supervisor's tree. It reads and
|
|
83
|
-
writes the same knowledge base, settles back through the same `Scope`, and
|
|
84
|
-
spends from the same budget pool. The recursion is depth (a sub-driver inside a
|
|
85
|
-
branch), not a second knowledge base — there is exactly one KB, and the
|
|
86
|
-
supervisor's readiness gate over the whole KB is still what ends the run.
|
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
# Supervisor prompt + agent-profile ideas
|
|
2
|
-
|
|
3
|
-
Four `AgentProfile` sketches for the research/knowledge domain — a **researcher worker**, a
|
|
4
|
-
**verifier driver**, a **research supervisor**, and a thin **dedup-first verifier** — plus a port
|
|
5
|
-
plan for the existing `~/code/supervisor-lab`.
|
|
6
|
-
|
|
7
|
-
This is a *design doc*, not shipped code. Each sketch names the real primitive it composes (in
|
|
8
|
-
`agent-knowledge` or `supervisor-lab`) so building it is "assemble", not "invent". Where a primitive
|
|
9
|
-
already exists, the sketch says so and points at it — we extend, we do not fork.
|
|
10
|
-
|
|
11
|
-
## What we borrowed from emilkowalski/skills
|
|
12
|
-
|
|
13
|
-
[`emilkowalski/skills`](https://github.com/emilkowalski/skills) is a small pack of Claude skills for
|
|
14
|
-
design engineering (`emil-design-eng`, `review-animations`). It is not about agents, but its *skill
|
|
15
|
-
shape* is worth copying, and one structural choice maps directly onto our verifier:
|
|
16
|
-
|
|
17
|
-
- **Tight frontmatter, two fields.** `name` + a one-paragraph `description` that says *when* to
|
|
18
|
-
invoke. Nothing else. Our profiles' `description` should read the same way: a trigger, not a
|
|
19
|
-
feature list.
|
|
20
|
-
- **Terse non-negotiable rules over prose.** `review-animations` is "The Ten Non-Negotiable
|
|
21
|
-
Standards" — numbered, imperative, absolute ("Animate `transform` and `opacity` only").
|
|
22
|
-
A worker system prompt is more legible as a short numbered contract than as paragraphs.
|
|
23
|
-
- **"Default to flagging; approval is earned."** The review skill is *adversarial by posture* — it
|
|
24
|
-
exists to reject, and its output is a findings table + a verdict. This is exactly the right posture
|
|
25
|
-
for a verifier, and it informs the dedup point below.
|
|
26
|
-
- **`disable-model-invocation: true` on the reviewer.** The review skill is not auto-invoked by the
|
|
27
|
-
model; it is routed in deliberately. Our verifier is the same: a driver *calls* it at a gate, the
|
|
28
|
-
worker never invokes it on a whim.
|
|
29
|
-
- **Cheap because narrow.** Each skill does one thing. The review skill carries no design *generation*
|
|
30
|
-
ability — it only judges. That separation (generate vs. judge) is the whole reason the judge can be
|
|
31
|
-
thin.
|
|
32
|
-
|
|
33
|
-
### The dedup insight (why the verifier is a thin profile, not a heavy one)
|
|
34
|
-
|
|
35
|
-
`review-animations` is mostly a deduplicated rule set: the craft knowledge lives in `emil-design-eng`,
|
|
36
|
-
and the reviewer is a thin lens that *applies the same rules* to a diff. It does not re-derive taste;
|
|
37
|
-
it checks against a list.
|
|
38
|
-
|
|
39
|
-
Our verifier is the same. In this repo the "rules" are already deterministic code:
|
|
40
|
-
|
|
41
|
-
- `createResearcherValidator` (`src/profiles/researcher.ts:235`) — citation-density floor + namespace
|
|
42
|
-
check, **no LLM**.
|
|
43
|
-
- the `lint` / `validate --strict` CLI path — citation, link, and schema checks over markdown, **no
|
|
44
|
-
LLM** (`docs/architecture.md`, "The CLI ... does not call an LLM").
|
|
45
|
-
- `assessAuthoredProfile` / `profileRichnessFinding` in supervisor-lab's bench — a deterministic
|
|
46
|
-
"is this profile a stub" gate.
|
|
47
|
-
|
|
48
|
-
So the verifier profile should be **thin and cheap**: it mostly *calls the deterministic checker and
|
|
49
|
-
reports the verdict*, escalating to an LLM judge **only** for the residual a deterministic check can't
|
|
50
|
-
cover (does the cited source actually support the claim — a semantic check). A heavy verifier that
|
|
51
|
-
re-reasons every claim from scratch is wasted spend: the dedup already happened in the validator.
|
|
52
|
-
**Spend the model budget on the worker (generation is hard); keep the verifier a cheap lens (judging
|
|
53
|
-
against a list is easy).**
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## Sketch 1 — `grounded-researcher` (leaf worker)
|
|
58
|
-
|
|
59
|
-
**Status: already exists, twice.** `agent-knowledge` ships `researcherProfile()`
|
|
60
|
-
(`src/profiles/researcher.ts:130`) — `tools: { web_search, fs, shell }`, propose-don't-apply, with a
|
|
61
|
-
matching `createResearcherValidator`. `supervisor-lab` ships
|
|
62
|
-
`profiles/research/grounded-researcher.ts` (web-search MCP, search→cite→synthesize). This sketch is
|
|
63
|
-
the **canonical shape both converge on** — build new only if you need a variant; otherwise
|
|
64
|
-
`mergeAgentProfiles` over the existing one.
|
|
65
|
-
|
|
66
|
-
**When to use:** one self-contained research question, spawned one-per-sub-topic by a driver. The
|
|
67
|
-
leaf — it does not spawn.
|
|
68
|
-
|
|
69
|
-
**Tools / resources:** `web_search` (the `tcloud mcp` stdio server, or the `web_search: true` tool),
|
|
70
|
-
`fs` for writing the cited dossier, `shell` for `agent-knowledge index/lint`.
|
|
71
|
-
|
|
72
|
-
**System prompt (the contract):**
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
You are a grounded research WORKER. You answer ONE question, and every load-bearing
|
|
76
|
-
claim is traceable to a real source you actually retrieved.
|
|
77
|
-
|
|
78
|
-
THE LOOP — search → cite → synthesize:
|
|
79
|
-
1. SEARCH issue multiple focused web_search queries; never stop at the first hit.
|
|
80
|
-
2. CITE attach every load-bearing claim to its source (title + url/identifier).
|
|
81
|
-
A claim you cannot cite is a claim you do NOT make. Never invent a source.
|
|
82
|
-
3. SYNTH lead with the answer; note where sources agree, conflict, or leave a gap.
|
|
83
|
-
|
|
84
|
-
NON-NEGOTIABLE:
|
|
85
|
-
- Honest "the evidence is thin / conflicting" beats a confident hallucination.
|
|
86
|
-
- Citation density floor is enforced downstream — under-citing is a hard fail, not a warning.
|
|
87
|
-
- You are the LEAF. You do not spawn sub-workers.
|
|
88
|
-
|
|
89
|
-
Return your cited synthesis as the settled output (a structured object if a schema was passed).
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
**Why this shape:** the validator (`createResearcherValidator`) checks citation density and namespace
|
|
93
|
-
*deterministically*, so the prompt's job is only to make the worker *produce* citable output — the
|
|
94
|
-
checking is not the worker's job. That split is what keeps the verifier cheap (Sketch 4).
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## Sketch 2 — `verifier-driver` (the gate, NOT the judge)
|
|
99
|
-
|
|
100
|
-
**Status: composes existing primitives.** This is `agent-runtime`'s `verify({ implement, verifier })`
|
|
101
|
-
combinator (`src/runtime/personify/combinators.ts:333`) wired to a research worker + a thin checker.
|
|
102
|
-
**Do not write a new verify-loop** — the 2-node implement→gate already exists.
|
|
103
|
-
|
|
104
|
-
**When to use:** when "did the worker actually deliver" must be proven before the result counts —
|
|
105
|
-
i.e. always, on a graded run. A driver that runs ONE worker behind ONE gate.
|
|
106
|
-
|
|
107
|
-
**Tools:** the coordination verbs (`spawn_agent`, `await_event`, `steer_agent`) over a `Scope`, plus
|
|
108
|
-
the ability to call the deterministic checker (`agent-knowledge lint` / `createResearcherValidator`).
|
|
109
|
-
|
|
110
|
-
**System prompt (the contract):**
|
|
111
|
-
|
|
112
|
-
```
|
|
113
|
-
You are a VERIFIER-DRIVER. You spawn ONE research worker, then you GATE its output —
|
|
114
|
-
you never accept the worker's own say-so.
|
|
115
|
-
|
|
116
|
-
THE GATE — generate → check → decide:
|
|
117
|
-
1. SPAWN author a grounded-researcher worker for the question and spawn it.
|
|
118
|
-
2. AWAIT pull its settled output (await_event). Read the REAL output, not a summary.
|
|
119
|
-
3. CHECK run the DETERMINISTIC checker first (citation density, namespace, lint,
|
|
120
|
-
schema). This is cheap and catches most failures. Only if it PASSES do you
|
|
121
|
-
escalate to the one semantic question a checker can't answer:
|
|
122
|
-
"does each cited source actually support the claim it's attached to?"
|
|
123
|
-
4. DECIDE PASS → settle. FAIL → steer_agent with the SPECIFIC gap named
|
|
124
|
-
("claim X cites source Y but Y does not say X"), or respawn a sharper worker.
|
|
125
|
-
|
|
126
|
-
NON-NEGOTIABLE:
|
|
127
|
-
- selector != judge. You GATE (pass/fail against a contract); you do not re-rank or
|
|
128
|
-
rewrite the worker's content yourself.
|
|
129
|
-
- "Settled a file" is not delivery. The deterministic check passing is delivery.
|
|
130
|
-
- Default to FAILING. A pass is earned by surviving the checker, not by looking plausible.
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
**Why this shape:** the driver's intelligence is *deciding what to check and how to steer on a
|
|
134
|
-
fail*, not re-doing the research. The expensive judgment (does the source support the claim) is gated
|
|
135
|
-
behind the cheap deterministic checker, so on most runs the LLM-judge step never fires.
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
## Sketch 3 — `research-supervisor` (fan-out → fuse → recurse)
|
|
140
|
-
|
|
141
|
-
**Status: exists as `research-then-build-driver` + `parallel-fanout-supervisor` in supervisor-lab.**
|
|
142
|
-
This sketch is the **research-specialized merge** of those two — build new only as a thin overlay via
|
|
143
|
-
`mergeAgentProfiles`; the orchestration body is identical.
|
|
144
|
-
|
|
145
|
-
**When to use:** a research question too broad for one worker — needs decomposition into disjoint
|
|
146
|
-
sub-topics, parallel grounded workers, and a fused cited synthesis. The top of a research tree.
|
|
147
|
-
|
|
148
|
-
**Tools / resources:** coordination MCP (`spawn_agent` / `await_event` / `steer_agent` /
|
|
149
|
-
`answer_question` / `stop`) over a `Scope`; `web_search` to *ground the decomposition itself*; skills
|
|
150
|
-
`dynamic-workflows`, `orchestrating-workers`, `authoring-agent-profiles` (all already in
|
|
151
|
-
`supervisor-lab/skills/`).
|
|
152
|
-
|
|
153
|
-
**System prompt (the contract):**
|
|
154
|
-
|
|
155
|
-
```
|
|
156
|
-
You are a research SUPERVISOR. You do NOT research the topic yourself — you ground the
|
|
157
|
-
decomposition, fan out grounded-researcher workers, gate them, and FUSE their cited findings.
|
|
158
|
-
|
|
159
|
-
THE SHAPE — ground → fan-out → gate → fan-in:
|
|
160
|
-
1. GROUND web_search FIRST to see what actually exists. Let the real landscape, not
|
|
161
|
-
your priors, define the sub-topics. Cite what you find.
|
|
162
|
-
2. DECOMPOSE split into DISJOINT sub-questions — non-overlapping ownership.
|
|
163
|
-
3. FAN OUT author a grounded-researcher profile per sub-question; spawn ALL of them in
|
|
164
|
-
ONE wave before awaiting any. Vary their angles. Never spawn-await-spawn.
|
|
165
|
-
4. GATE drain await_event. For each settled worker, run the deterministic checker
|
|
166
|
-
(Sketch 4). REJECT uncited or unsupported claims — a finding without a
|
|
167
|
-
source is not a finding. Steer or respawn on a fail.
|
|
168
|
-
5. FAN IN author a FINAL synthesis worker that fuses ONLY the gated findings into one
|
|
169
|
-
cited answer. Never paste raw worker dumps. Check each result for failure first.
|
|
170
|
-
6. RECURSE if a sub-question is itself large, spawn a SUB-supervisor (this profile +
|
|
171
|
-
the coordination MCP) to own it.
|
|
172
|
-
|
|
173
|
-
NON-NEGOTIABLE:
|
|
174
|
-
- Author EACH worker as a FULL profile (name, description, prompt, model, tools, skills).
|
|
175
|
-
A 2-sentence prompt with no tools is a stub, not a worker — the richness gate will flag it.
|
|
176
|
-
- Never go blind: keep pulling until every spawned worker is terminal.
|
|
177
|
-
- Settle only on gated, cited output. Budget is conserved and depth is bounded by the Scope.
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
**Why this shape:** the supervisor's only real lever is *the quality of the profiles it authors* —
|
|
181
|
-
that is the capability `supervisor-lab` measures (`thinProfileRatio`,
|
|
182
|
-
`bench/supervise-topology.ts`). The gate (step 4) reuses the cheap verifier so the supervisor doesn't
|
|
183
|
-
burn its budget re-judging.
|
|
184
|
-
|
|
185
|
-
---
|
|
186
|
-
|
|
187
|
-
## Sketch 4 — `dedup-verifier` (thin, cheap, mostly deterministic)
|
|
188
|
-
|
|
189
|
-
**This is the emilkowalski dedup lesson made into a profile.** It is deliberately *thin* — the
|
|
190
|
-
"taste" lives in the deterministic validator, the profile is just the lens that applies it and
|
|
191
|
-
escalates only the residual.
|
|
192
|
-
|
|
193
|
-
**When to use:** called by a driver/supervisor at a gate (Sketch 2 step 3, Sketch 3 step 4). Never
|
|
194
|
-
auto-invoked — the verifier equivalent of `disable-model-invocation: true`.
|
|
195
|
-
|
|
196
|
-
**Tools:** `shell` (to run `agent-knowledge lint` / `validate --strict`), the
|
|
197
|
-
`createResearcherValidator` call, and an LLM *only* for the one semantic check. **No `web_search`, no
|
|
198
|
-
`fs` write, no generation tools** — a verifier that can edit content is a verifier that can cheat.
|
|
199
|
-
|
|
200
|
-
**System prompt (the whole thing — it's short on purpose):**
|
|
201
|
-
|
|
202
|
-
```
|
|
203
|
-
You are a VERIFIER. You judge ONE research output against a fixed contract. You default
|
|
204
|
-
to FAILING; a pass is earned. You never edit, research, or rewrite — you only judge.
|
|
205
|
-
|
|
206
|
-
ORDER (cheapest check first, stop at the first hard fail):
|
|
207
|
-
1. DETERMINISTIC run the validator/lint: citation density >= floor, namespace match,
|
|
208
|
-
links resolve, schema valid. If any fails → FAIL with the rule name.
|
|
209
|
-
~90% of failures die here, at zero LLM cost.
|
|
210
|
-
2. SEMANTIC ONLY if (1) passes: for each cited claim, does the cited source
|
|
211
|
-
actually support it? This is the one thing a checker can't do. Be terse.
|
|
212
|
-
|
|
213
|
-
OUTPUT: a findings table (claim | source | supported? | why) + a verdict (PASS / FAIL),
|
|
214
|
-
grouped by severity. No prose. A violation is a finding.
|
|
215
|
-
|
|
216
|
-
You carry NO generation ability by design. If you find yourself wanting to fix the
|
|
217
|
-
output, STOP — that is the worker's job, not yours.
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
**Why thin beats heavy here:** the dedup already happened in `createResearcherValidator` and the lint
|
|
221
|
-
path. A heavy verifier that re-reasons every claim with an LLM pays full model cost to re-derive a
|
|
222
|
-
check the validator does for free, and (worse) a verifier with generation tools can drift into doing
|
|
223
|
-
the work and grading itself. Thin + deterministic-first is both cheaper *and* harder to game. Measured
|
|
224
|
-
claim to test when built: on a real run, the LLM (step 2) should fire on **< ~10–20% of gated outputs**
|
|
225
|
-
because the deterministic check (step 1) absorbs the rest — if it fires on most, the validator floor
|
|
226
|
-
is mis-set, not the verifier.
|
|
227
|
-
|
|
228
|
-
---
|
|
229
|
-
|
|
230
|
-
## supervisor-lab — status and port plan
|
|
231
|
-
|
|
232
|
-
**It exists.** `~/code/supervisor-lab` is a real, non-trivial repo
|
|
233
|
-
(`github.com/tangle-network/supervisor-lab`), not a stub. `ls ~/code | grep -i supervisor` → it's
|
|
234
|
-
there.
|
|
235
|
-
|
|
236
|
-
It already is what one might propose to "create": the product/experiment layer for supervisor agents
|
|
237
|
-
over the `agent-runtime` substrate, dependency-one-way (`supervisor-lab → agent-runtime →
|
|
238
|
-
agent-eval`). It ships:
|
|
239
|
-
|
|
240
|
-
- **the two-agent loop, already ported** — `bench/supervise-topology.ts` is exactly the "two-agent
|
|
241
|
-
loop": a supervisor mounts the coordination MCP over a live `Scope`/`Supervisor`
|
|
242
|
-
(`createSupervisor`, `serveCoordinationMcp`), authors worker `AgentProfile`s as code, spawns them,
|
|
243
|
-
drains the bus (`await_event`), steers (`steer_agent`), and grades on a real judge. It has an
|
|
244
|
-
**OFFLINE $0 scripted path** and a LIVE cli-bridge path. This is the loop to plug these sketches
|
|
245
|
-
into — it does not need to be built.
|
|
246
|
-
- **profile archetypes** — `profiles/research/{grounded-researcher,research-then-build-driver}.ts`,
|
|
247
|
-
`profiles/engineering/{parallel-fanout-supervisor,long-horizon-plan-driver,hardware-auditor}.ts`.
|
|
248
|
-
Sketches 1 and 3 above are *already these files*.
|
|
249
|
-
- **a skill layer** — `skills/{authoring-agent-profiles,orchestrating-workers,dynamic-workflows,
|
|
250
|
-
spawning-research-loops}/SKILL.md`, each in the exact emilkowalski frontmatter+rules shape.
|
|
251
|
-
- **a catalog + ingest pipeline** — `src/catalog/`, `src/ingest/skills.ts` ingests vendored
|
|
252
|
-
Claude-Code-style skill packs (the same shape as `emilkowalski/skills`) by convention.
|
|
253
|
-
- **the richness gate** — `assessAuthoredProfile` / `profileRichnessFinding` / `thinProfileRatio`,
|
|
254
|
-
the deterministic "is this a stub" check that is the dedup-verifier's first line.
|
|
255
|
-
|
|
256
|
-
### How to port the two-agent loop (it's already there — this is how to extend it)
|
|
257
|
-
|
|
258
|
-
Because the loop already exists, "porting" means **adding these four profiles + the thin-verifier gate
|
|
259
|
-
into the existing harness**, not rebuilding it:
|
|
260
|
-
|
|
261
|
-
1. **Land the profiles as catalog files.** Sketches 1 and 3 are already
|
|
262
|
-
`profiles/research/grounded-researcher.ts` and `research-then-build-driver.ts`. Sketch 2
|
|
263
|
-
(`verifier-driver`) and Sketch 4 (`dedup-verifier`) are new files under
|
|
264
|
-
`profiles/research/` — author them as `defineAgentProfile` entries, resolve their skills via the
|
|
265
|
-
`skills(...)` helper in `profiles/_shared.ts` (fails closed on an unknown skill).
|
|
266
|
-
|
|
267
|
-
2. **Wire the dedup-verifier into the gate.** In `bench/supervise-topology.ts`, the worker's
|
|
268
|
-
`runWorker` already grades on `adapter.judge`. For research tasks, replace/augment that with the
|
|
269
|
-
deterministic `createResearcherValidator` + `agent-knowledge lint` path FIRST, and only escalate to
|
|
270
|
-
the LLM semantic check on a deterministic pass. This is the dedup point made executable: the
|
|
271
|
-
existing `assessAuthoredProfile` richness gate is the *profile* check; the validator is the
|
|
272
|
-
*output* check. Both run before any LLM judge.
|
|
273
|
-
|
|
274
|
-
3. **Add a research bench arm.** `supervise-topology.ts` auto-detects domain (repo vs. answer/text).
|
|
275
|
-
A research arm is an "answer/text" task whose `adapter.judge` is the cited-output validator. Add
|
|
276
|
-
`BENCH=research` that loads a research question + namespace and grades via
|
|
277
|
-
`createResearcherValidator`. The OFFLINE scripted path already proves the harness at $0; extend
|
|
278
|
-
`scriptedRun.workerResult` to emit a cited/uncited synthesis so the offline smoke exercises the
|
|
279
|
-
verifier without spend.
|
|
280
|
-
|
|
281
|
-
4. **Run the existing experiment knob.** The whole point of the lab is the one knob: catalog/skills
|
|
282
|
-
ON vs. OFF (`CATALOG=1`). With these profiles + the thin verifier in the catalog, run
|
|
283
|
-
capability-aware vs. baseline on a hard research task and read `thinProfileRatio` + delivery rate —
|
|
284
|
-
does giving the supervisor the research archetypes + the cheap gate produce better-composed teams
|
|
285
|
-
and more *cited, gated* deliveries.
|
|
286
|
-
|
|
287
|
-
### Cross-repo note
|
|
288
|
-
|
|
289
|
-
`agent-knowledge` already owns the deterministic research checker (`createResearcherValidator`, the
|
|
290
|
-
`lint`/`validate` CLI) and the researcher profile (`researcherProfile`,
|
|
291
|
-
`multiHarnessResearcherFanout`). The thin verifier should **call those**, not reimplement them —
|
|
292
|
-
`supervisor-lab` depends on `agent-runtime`, and the research checks live in `agent-knowledge`, so the
|
|
293
|
-
research bench arm pulls `@tangle-network/agent-knowledge` for the verifier's deterministic line. That
|
|
294
|
-
keeps the dedup in one place: the validator is authored once, the verifier profile is a thin lens over
|
|
295
|
-
it.
|
|
File without changes
|