Console
What the system knows, and how the agents behave. Every change applies on the next run.
Which model does which job
Which model does which job and why, which answer engines are on, and the rules that stop any of it spending money on its own.
Two models, split on one rule: the larger one writes anything a human will read, and the smaller one does everything repetitive, structured, or search-shaped. That split is most of why the whole thing runs on about $80 a month of model calls instead of several hundred.
Rubric work in batches. Same quality as the larger model on a fixed rubric, at a fraction of the cost, and it runs over hundreds of rows.
One short judgement per article: is this relevant, what type, how strong. Cheap and high volume.
Anything that uses web search. The larger model stalled around 100 seconds in its search path during testing; this one answered with citations in about six.
Turns a sentence into a feed or keyword config. Small structured task, not a reasoning one.
Two of the eleven engines are Claude, with and without search, which is the point: the parametric one is the baseline.
A human reads this before a call. Worth the better model.
Goes out under an underwriter's name. The single place quality matters most in the whole build.
Same reason, plus it has to hold voice across three or four touches.
Published prose with structured data attached.
Creative structure: hooks, ordering, what to cut.
Reads spend against outcomes and writes the argument for what to keep funding.
| Job | Model | Why this one |
|---|---|---|
| Broker scoringlib/brokers.ts | claude-sonnet-5 | Rubric work in batches. Same quality as the larger model on a fixed rubric, at a fraction of the cost, and it runs over hundreds of rows. |
| Signal classificationlib/signals.ts | claude-sonnet-5 | One short judgement per article: is this relevant, what type, how strong. Cheap and high volume. |
| Broker researchlib/brief.ts | claude-sonnet-5 | Anything that uses web search. The larger model stalled around 100 seconds in its search path during testing; this one answered with citations in about six. |
| Monitor builderlib/monitor-build.ts | claude-sonnet-5 | Turns a sentence into a feed or keyword config. Small structured task, not a reasoning one. |
| Answer-engine auditlib/engines.ts | claude-sonnet-5 | Two of the eleven engines are Claude, with and without search, which is the point: the parametric one is the baseline. |
| Broker one-pagerlib/brief.ts | claude-opus-5 | A human reads this before a call. Worth the better model. |
| Email draftslib/drafts.ts | claude-opus-5 | Goes out under an underwriter's name. The single place quality matters most in the whole build. |
| Cadence stepslib/sequences.ts | claude-opus-5 | Same reason, plus it has to hold voice across three or four touches. |
| Gap page draftslib/aeo.ts | claude-opus-5 | Published prose with structured data attached. |
| Clip plannerlib/clips.ts | claude-opus-5 | Creative structure: hooks, ordering, what to cut. |
| Monthly readoutlib/spend-store.ts | claude-opus-5 | Reads spend against outcomes and writes the argument for what to keep funding. |
Answer engines
5 of 11 are answering today. The rest have adapters written and tested, waiting on a key.
Answering now
- Claude + searchAnthropicsearches the webClaude with live web search. What a Claude user gets today.
- Claude, no searchAnthropicno searchSame model, no search. The baseline: only what training data holds.
- Compound + searchGroqsearches the webGroq's agentic system: an open model that runs its own web searches.
- GPT-OSS 120BOpenAI open weightsno searchOpenAI's open-weights model, no search. What an OpenAI model says unprompted.
- Qwen 3.6Alibabano searchAlibaba's open model, no search. A non-US read on the same question.
2 more would cost nothingNeeds a key
These have free API keys. No card, about ten minutes, and the next audit run includes them.
- Gemini + GoogleGEMINI_API_KEYGemini grounded with Google Search. The closest an API gets to what Google shows a broker.
- Mistral LargeMISTRAL_API_KEYEurope's frontier lab, no search. A second parametric read.
Would cost money
- ChatGPT + searchOPENAI_API_KEYGPT with the web search tool through the Responses API.
- PerplexityPERPLEXITY_API_KEYSonar, the search-native answer engine.
- Grok + searchXAI_API_KEYGrok with live search, the answer engine inside X.
- DeepSeek V3DEEPSEEK_API_KEYThe other widely used open-weights model, no search.
Do you need an OpenAI account for this? Not to make the audit useful. An OpenAI model already answers in every run: GPT-OSS 120B is OpenAI's open-weights model, and it runs on the free Groq key. What a paid OpenAI key adds is specifically ChatGPT with browsing, which is a different answer from the same family. Worth having eventually, worth about $5 a month of usage, and not the first thing I would buy.
The cheaper move is the free Gemini key, because grounded Gemini is the closest an API gets to what Google shows a broker. And the honest limit is worth stating plainly: Google AI Overviews and AI Mode are not APIs at all. No key reaches them. That gap is the entire argument for buying a tracking tool, and it is why the stack page recommends one at day 30 rather than day 1.
Spending rules
What is allowed to cost money, and what cannot.
- Scheduled AI
- OnConfigured
The weekday sweep is allowed to run the classifier on a timer.
- Daily ceiling
- 200 model actions
Shared across every visitor, on top of the per-IP limits, so a public link cannot run up a bill. Reads are never limited.
- Everything else
- Runs when a person clicks
Writing a step, running the audit, generating a brief, scoring, sweeping. Nothing calls a model on its own.
How the agents are constrained
The parts that make model output safe to put in front of a broker.
- Grounding
- One shared facts block
Every call gets the same paragraph of verified facts about Shepherd: products, capacity, the Intact authority, the Procore and DroneDeploy loss numbers, and the vocabulary to use. It is stable text on purpose, so it caches as a prompt prefix and costs less each time.
- Structured output
- Schema-validated, not parsed
Anything the system stores comes back against a schema the model must satisfy, so a malformed answer fails loudly instead of being written to a table half-formed.
- House style
- Enforced twice
No em dashes, no exclamation marks, no hype. Models emit them anyway, so the rule is in the prompt and applied again on write and on render. A test fails if a stored draft carries one.
- Nothing sends itself
- Every draft waits for a personConfigured
No mail server is connected and no draft leaves without an underwriter approving it. The do-not-contact list is checked before anyone is enrolled, not at send time, so a suppressed broker never gets a draft written about them in the first place.
- What it will not do
- Invent a source
The research agent stores the URLs it actually read, the monitor builder refuses to invent an RSS URL and falls back to a keyword watch, and the audit records real answers only. Where a number is not measured, it carries a label saying so.