@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.
Files changed (38) hide show
  1. package/README.md +250 -74
  2. package/dist/benchmarks/index.d.ts +5 -0
  3. package/dist/benchmarks/index.js +52 -0
  4. package/dist/chunk-DQ3PDMDP.js +115 -0
  5. package/dist/chunk-DQ3PDMDP.js.map +1 -0
  6. package/dist/chunk-ULXZI235.js +1855 -0
  7. package/dist/chunk-ULXZI235.js.map +1 -0
  8. package/dist/{chunk-U6KQ4FS3.js → chunk-VN2OGUUP.js} +306 -40
  9. package/dist/chunk-VN2OGUUP.js.map +1 -0
  10. package/dist/{chunk-WWY5FTKQ.js → chunk-W6VWYTNH.js} +10 -115
  11. package/dist/chunk-W6VWYTNH.js.map +1 -0
  12. package/dist/chunk-XVU5FFQA.js +49 -0
  13. package/dist/chunk-XVU5FFQA.js.map +1 -0
  14. package/dist/cli.js +4 -2
  15. package/dist/cli.js.map +1 -1
  16. package/dist/index-Cj5jRXOz.d.ts +426 -0
  17. package/dist/index.d.ts +1036 -169
  18. package/dist/index.js +3372 -558
  19. package/dist/index.js.map +1 -1
  20. package/dist/memory/index.d.ts +5 -70
  21. package/dist/memory/index.js +20 -4
  22. package/dist/types-CjqPcTTK.d.ts +319 -0
  23. package/docs/architecture.md +7 -5
  24. package/docs/eval/investment-material-facts.md +252 -0
  25. package/docs/eval/rag-eval-roadmap.md +119 -0
  26. package/docs/results/investment-thesis.md +306 -0
  27. package/docs/results/research-driving.md +265 -0
  28. package/docs/two-agent-research-ab.md +121 -10
  29. package/package.json +8 -9
  30. package/dist/chunk-MU5CEOGE.js +0 -387
  31. package/dist/chunk-MU5CEOGE.js.map +0 -1
  32. package/dist/chunk-U6KQ4FS3.js.map +0 -1
  33. package/dist/chunk-WWY5FTKQ.js.map +0 -1
  34. package/dist/profiles/index.d.ts +0 -194
  35. package/dist/profiles/index.js +0 -11
  36. package/docs/recursive-research-leaf.md +0 -86
  37. package/docs/supervisor-profiles.md +0 -295
  38. /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