Dossier production on this site is performed by an autonomous research pipeline, not hand-curation. The pipeline is an instance of the research-loop template — a bash-only task-queue architecture aligned with DRIL (Afonso, Galiani, Gálvez & Sosa, NBER w35188): citation contracts with verbatim quotes, explicit gap records, an append-only ledger, frozen instrument snapshots per run, and a budget gate.
The work model
Everything is a task in a JSON queue. A driver pops the next runnable task, dispatches it to a worker, writes results back, and repeats until the queue drains or the budget cap trips.
| Type | Worker | Notes |
|---|---|---|
gather_api |
curl + jq (no model) | Forbes JSON API → 250 advisors, $0, exact |
gather_browser |
claude -p + chrome-devtools MCP (headless) |
Next-Gen list paginates via GraphQL |
merge |
jq | Normalized unit space, cross-list dedup |
enrich |
claude -p (Opus) + WebSearch/WebFetch |
One dossier per advisor, ~25 cited fields |
verify |
claude -p (Opus) |
Second opinion on low-confidence verify-set fields |
finalize |
claude -p |
Aggregate report |
The citation contract
Every enriched field is written to an append-only ledger shaped:
{"field": "firm", "next": {"value": "...", "confidence": "high",
"evidence": [{"quote": "<verbatim>", "url": "...", "source_role": "firm_official"},
{"quote": "<verbatim>", "url": "...", "source_role": "sec_finra_regulatory"}]}}
Fields the pipeline cannot source honestly get a gap record — reason, queries tried, sources checked — never a silent null. Low-confidence writes on the verify-set (AUM, firm type, CRD, value-prop quote) auto-enqueue an independent verify task.
Escalation & budget
Completeness below full on an API gather escalates to the browser worker automatically. Every model call's cost accrues against a hard BUDGET_USD gate; the loop halts cleanly at the cap and resumes exactly where it stopped.
Run stats
Regenerated as runs complete. Pilot run: 14 dossiers, 344 ledger writes, $20.52, 0 failed tasks, ~$1.25/dossier marginal on Opus.