Navigatoran agent team for 500 reps

Navigator

A team of agents that does the market, account, and prospect research, drafts and checks every touch, handles replies, and tells each rep what to do next.

Designed for 500 BDRs, built to run at 1,000. A concept for a 500-rep sales org, prepared by James Holm, September 2026.

How it's built

Five layers. Click any part to see its job, what it takes in, what it sends on, and what replaces it if it isn't available.

Signals and data

Where the facts come from

Signals with receipts, contacts, warm paths, CRM state

Identity and memory

One id per company, one place everything lands

Resolved accounts, cached briefs, scores with reason codes

The agent team

OpenAI models, prompts kept portable. Built with Codex.

Approved drafts, call lists, intro requests, tasks

Execution

Where touches actually happen

Playbooks, cards, approvals, coverage

Rep interface

Where a rep lives all day

loopOutcomes go back to Snowflake. Replies, meetings, and opps update the account state, recalibrate scoring weights monthly, and grade the graders: an email QA called an A should reply like an A.

A rep's morning

One account, start to finish, as Marcus sees it in Slack. The panel beside it shows which tool or agent did each piece of work. Larkspur Dynamics and everyone in it are fictional.

#navigator-marcusNavigator, Marcus Bell, Jenna Okafor

How data moves

Where each fact enters, what happens to it at every hop, and how outcomes find their way back to the tables the score is built from. Read it top to bottom. On a phone, the figure scrolls sideways.

SteadyBaseClaySalesforce TheSwarmMoltSets, ApolloApollo, Nooks signals, people, callsprivate-company playsaccounts, opps, tasks intro pathsverified contactssends, replies, calls share + delta feedpush + webhooknightly sync API, weeklyon demandwebhooks, live Resolve Account rows get one account_id (LEI, CIK, ticker, domain, LinkedIn, legal name plus jurisdiction) and the Salesforce id. Contact rows key on (account_id, LinkedIn URL). Two candidates is ambiguity, never a match. Review queue ambiguous rows a person decides ambiguous resolved rows, append-only, source_url kept on every signal Snowflake core dbt: raw to core to marts. Deterministic scoring lives here too. accountscontactssignalsbriefs touchesoutcomesscores one per account_idpersona, channelquote + source_urlcache, fresh_until draft_id, qa_gradereply, meeting, opptier, reasons Suppression is a view over accounts and contacts: customers, open opps, do-not-contact, competitors. nightly, and on every new signal Score fit 40 + signal 35 + timing 15 + relationship 10 gives the score, the tier (A, B, C by segment) and the priority (P1 to P4). SQL makes the numbers; the model writes the three reasons a rep reads. score or signal changed Orchestrator wakes once per account suppression, caps, geo rules, is the brief still fresh? Account researchProspect researchMessagingQA skipped if brief is freshreads cache first, thenSteadyBase, Clay committee by personaMoltSets email gradeTheSwarm warm path receipted claims onlyemail, call opener,LinkedIn note grade A+ to Fevery claim to a receiptbelow B goes back below B: rewrite Model: OpenAI, GPT-5.5 for drafts and GPT-5 nano for classification. Tools: SteadyBase MCP, MoltSets MCP, Snowflake. card Slack card to the rep brief, score with reasons, draft with grade, next action, buttons. Tier A sends on its own within caps. Tier B waits for a tap. Tier C gets research and a warm path only. tap, or Tier A on its own ApolloNooksTheSwarmCentralizeSalesforce sequence, capscall list, call prepintro requestdeal map, coveragetask, event, opp opens, replies, call dispositions, meetings, opps, written to outcomes and joined to the touch and the signal that started them monthly: refit the weights, check QA grades against replies
Three things the picture is arguing for: every row is resolved to one account_id before it is stored, agents read the cache before they research, and outcomes return to the same tables the score is computed from.

One signal, hop by hop

What happens to a record at each stage, and how often.

Collecthourly, nightly, liveSteadyBase signals arrive as shared Snowflake views and as a delta feed polled on a cursor, so nothing is replayed or skipped. Clay pushes enriched rows and fires a webhook when a play matches. Salesforce syncs nightly. Apollo and Nooks post events as they happen. TheSwarm paths refresh weekly per account.
Resolveon arrivalEach account row is matched to one account_id through the identifier ladder and to its Salesforce id. Contacts key on account_id plus LinkedIn URL. Ambiguous or conflicting rows go to a review queue; nothing is guessed, and a subsidiary carrying its parent's website is caught here.
Storehourly buildsRaw tables are append-only and keep the source URL on every signal. dbt builds the core tables and the marts the playbook and the manager view read. A signal without a source URL never gets past raw.
Scorenightly, and on every signalSQL computes fit, signal, timing, and relationship. Tier follows from segment; priority from the score. The model turns the components into three plain-language reasons a rep can read in five seconds.
Decideevent-drivenThe orchestrator wakes for an account when its score or signals change. It checks suppression, send caps, and whether the brief is still fresh. Only then do agents run, and only the ones needed.
Research and draftper account, cached 14 daysAccount research writes or refreshes the brief. Prospect research fills the committee with a verified channel and a warm path. Messaging drafts from receipted facts only. QA grades; below B goes back for a rewrite. Agents read the cache first and call vendors only for what is missing.
Act7 AM local, then liveA card lands in Slack. Tier A sends within caps. Tier B waits for a tap. Tier C gets research and a warm path only. Taps become Apollo enrollments, Nooks calls, TheSwarm intro requests, Centralize maps, and Salesforce tasks.
Learnlive, refit monthlyOpens, replies, call dispositions, meetings, and opps are written to outcomes, joined to the touch and the signal that started them. Monthly, the weights are refit against what converted, and QA grades are checked against reply rates.

Rules for the data

The constraints the pipeline enforces, not the ones it hopes for.

  • Receipted or not stored. A signal without a source URL is rejected at ingest. The quote is stored verbatim; the model never paraphrases it into outreach.
  • Dedupe on account_id and nothing else. Ticker and domain are joins of convenience. If two rows share an id, that is a bug to fix upstream, not a merge for a rep to notice.
  • Contact data stays in the data layer. Email and mobile live in Snowflake and Apollo. A prompt gets a first name, a title, and the brief. It never sees a phone number.
  • Suppression runs twice. Once at search time through MoltSets and Clay exclude lists, so suppressed people never come back, and again immediately before any send.
  • Briefs expire. Older than 14 days, or older than the newest signal on the account, and the brief is rebuilt before a rep sees it.
  • Every touch carries its draft id and QA grade. A reply can always be traced to the exact words that earned it, which is what makes the monthly grade check possible.
  • Geography gates autonomy. Every contact carries a country. Tier A applies only in permitted geographies, EU contacts are always human-approved, and mobiles are scrubbed against do-not-call lists before any call list is built.
  • Retention follows the company's CRM policy. Vendor DPAs cover SteadyBase, MoltSets, TheSwarm, and Centralize; transcripts from Nooks keep the same retention as Gong or the call recorder already in place.

Tables the system keeps

The core schema, trimmed to the columns that carry the design.

accountsaccount_id, sfdc_id, name, domain, ticker, segment, tier, owner_id, parent_account_id, suppressed (bool, why)
contactscontact_id, account_id, linkedin_url, persona, title, role_start, email, email_grade, email_validated_at, mobile, source
signalssignal_id, account_id, signal_type, quote, source_url, page_ref, event_date, evidence_tier, verified, source (steadybase | clay), first_seen
briefsaccount_id, brief_md, why_now, sources[], written_at, fresh_until, model, tokens
scoresaccount_id, as_of, fit, signal, timing, relationship, score, priority, reasons[], weights_version
touchestouch_id, account_id, contact_id, channel, draft_id, qa_grade, tier, sent_by (agent | rep), sent_at, sequence_id
outcomesoutcome_id, touch_id, kind (open | reply | call | meeting | opp), class (interested | objection | ...), at, detail
warm_pathsaccount_id, contact_id, connector_id, overlap (work | school | investor), strength, refreshed_at

How we'd build it

One repo, six parts, three weeks to a live pod. Each part starts as a one-page spec (the interface, the tables it reads and writes, the tests that prove it), gets generated with Codex in a fresh session, and is reviewed before it merges. The models are OpenAI's; prompts and evals live in the repo, so a model change is a pull request, not a rewrite.

The spec is a repo

The demo is the pitch. The spec is what gets handed to Codex on day one: github.com/holmjames/navigator. It fixes every decision a builder would otherwise re-make, and the two parts that can be executable already are: the orchestrator's rules and the scoring arithmetic, 49 tests, green.

PathWhat it settlesFormStatus
CLAUDE.md, AGENTS.mdConventions, build order, the ten rules that are tests before they are code, what never gets built, how vendor keys are handled.Read firstwritten
docs/scoring.mdEvery term of the score defined to the point, with Larkspur worked through to 91. data/scoring.sql is the production version; data/scoring_reference.py is the oracle it must match.Spec plus SQL plus Pythontested
docs/rules.mdThe orchestrator's rules of engagement: nine gates in order, channel choice, autonomy, follow-up cadence, every reply class. agents/orchestrator/decide.py is the same thing as a pure function.Spec plus code44 tests
data/schema.sqlRaw, core, and marts in full: every table, the https check on signals, the one-identifier-one-account constraint, the suppression view, the playbook mart the Slack card reads.DDL, dbt skeletonwritten
agents/prompts/Seven prompts with JSON output schemas: brief, draft, QA rubric with hard ceilings, reply classes, reason codes, prospect rows, the Monday brief.Markdown with frontmatterwritten
integrations/One file per vendor: auth, the exact endpoints and tools used, payload shapes, limits, prices with dates, and the things that still need verifying (two of them could change the execution layer).Twelve fileswritten
plays/, slack/, ops/, ingest/The five plays as Clay column specs with budgets, the Block Kit cards and manifest, caps and kill switches and the cost meter, how each source lands.SPEC.md with acceptance listswritten
evals/A fictional 200-account book with planted identity traps, golden briefs and drafts including four that must fail QA, reply cases, and the expected scores.Fixtures and teststested
PROMPT.mdThe kickoff prompt: read order, environment checks, the build order, the PR discipline.One pagewritten

What gets built

Everything is code, including the Clay plays, so a change is a pull request and a rollback is a revert.

PartWhat it isStackWhen
data/Snowflake schemas and dbt models (raw to core to marts), the scoring SQL, the reason-code function, the suppression view, the playbook mart each rep's card is read from.Snowflake, dbt, Cortex for reason codesweek 1
ingest/A SteadyBase poller on the delta-feed cursor plus the nightly bulk pull, a Clay webhook receiver, the Salesforce sync config, TheSwarm and MoltSets clients, Apollo and Nooks event handlers. Every row through the resolver before it lands.Snowflake tasks and n8n for schedules and webhooks; code only where an answer is due in secondsweeks 1 to 2
agents/The orchestrator, the eight agents, their prompts and tool definitions, and the evals. GPT-5.5 for drafting and QA, GPT-5 nano for classification and reason codes, nightly jobs on the batch API. MCP clients for SteadyBase and MoltSets.Python, OpenAI Agents SDK, MCPweek 2
slack/The Bolt app: morning playbook, one card per account, action handlers (approve, edit, call, snooze, disqualify), the reply thread, and the manager view.Slack Bolt, Block Kitweeks 1 to 2
plays/The five Clay tables and their templates, exported as JSON and documented, so a play can be reviewed, reproduced, and turned off. Each play has a row budget.Clay, HTTP enrichments, JSONweek 1
ops/Secrets in a vault (vendor keys never sit in a Clay cell), send caps per tier, a kill switch per tier and per play, a cost meter per agent and per account, and an audit log of every send.Same workers, one dashboard, alerts to Slackweek 3

Code or configuration

Most of Navigator is scheduled batch work, which is what Snowflake, Clay, and a flow tool already do well. Code is reserved for the three places it is actually required.

JobLeast-code homeWhy it can live there
Signals inSteadyBase shared views; Clay's Snowflake destination; Salesforce through the native connector; Apollo and Nooks webhooks into n8nEvery source already pushes or shares; nothing has to be polled in code except the SteadyBase delta feed, which is one scheduled HTTP call with a stored cursor
EnrichmentClay columns: MoltSets, TheSwarm, and Apollo as HTTP enrichments in the waterfallClay is the scheduler and the retry logic; a worker would only duplicate it
Scoring and reasonsdbt models on Snowflake tasks; reason codes through Cortex, which hosts OpenAI models on Azure-region accountsNightly SQL with a model call inside it, no service to run
Briefs, drafts, QANightly batch: Cortex in SQL where the region allows it, otherwise one n8n flow that files an OpenAI batch job and collects itThousands of rows a night with no latency requirement is batch work, not agent work
Repliesn8n: Apollo reply webhook, classify, draft, post to Slack, send on approvalEvent-driven and low volume; a flow tool's home turf
Slack cards and buttonsCode. A small Bolt appSlack needs the button endpoint to answer in three seconds and the Edit flow opens a modal; flow tools handle this badly and Zapier not at all
OrchestratorCode. One decision function with tests, called from the nightly run and from the reply flowThe rules of engagement (routing, caps, geography, tiers) have to be reviewable and testable, which is what code with a test suite is for
Evals and the cost meterCode. A golden set in the repo, run in CIPrompt regressions are caught before a send, not after

Zapier fits a ten-rep pilot's glue and nothing past it: per-task pricing at 100,000 touches a month costs more than the model, and it cannot host the Slack endpoint. n8n, self-hosted in the company's cloud or on n8n's cloud plan, is the flow tool that scales; it still needs someone watching it, which is why the batch work sits in Snowflake wherever it can.

If procurement is slower than three weeks

Week one runs on tools already approved. Each new vendor joins the waterfall when it clears security, and nothing downstream changes shape.

LayerRuns on day oneJoins when cleared
SignalsClay plays on job posts, funding, tech detection, and Claygent research; SteadyBase if it is already in placeSteadyBase for receipted quotes on the public book
IdentityA domain-first ladder in Snowflake with a review queue, Salesforce ids mappedThe SteadyBase resolver for LEI, CIK, and the corporate tree
ContactsApolloMoltSets in front of Apollo for verified email and mobile
Warm pathsNone; the relationship term scores zero and the orchestrator goes coldTheSwarm on the book, then Centralize on live deals
Everything elseSnowflake, Salesforce, Apollo sequences, Nooks, Slack, OpenAIUnchanged

Week by week, and what done looks like

Every Friday ends with a demo the pilot pod's manager can react to.

Week 1, foundationdata, plays, skeleton

The book is in Snowflake with one id per account and a match rate we can argue with. Five plays fire on real accounts. Every account has a score with three reasons. The Slack bot posts a plain card.

Friday demo: the board for one pod, ranked, with reasons. No drafts yet.

Week 2, agentsbriefs, drafts, playbook

Briefs cached for the pod's accounts. Drafts with QA grades. Verified email for most P1 contacts, and a warm path where one exists. The morning playbook runs for 10 to 20 reps. Tier A stays off.

Friday demo: a rep's morning, live, on real accounts.

Week 3, the loopexecution, replies, outcomes

Taps enroll in Apollo and land on Nooks lists. Replies are classified and drafted. Centralize is on live deals for the AE handoff. Outcomes are written. The manager view is live. Tier A turns on for SMB with caps.

Friday demo: signal to meeting, end to end, with the log beside it.

Afterpods of fifty a week

Tier boundaries tuned from the first month's replies. First weight refit at day 30. Each new pod gets the same three Friday demos, compressed into one.

Who does what

One builder, five people who unblock the builder.

GTM engineer (this role)
Owns the repo, the agents, the plays, the Slack app, the cost meter, and the Friday demo. Writes the specs, generates the code, reviews it, ships it.
Data engineer, part time, heaviest in week 1
Snowflake access and warehouses, the Salesforce sync, dbt review, compute guardrails.
RevOps
Salesforce fields and task types, the suppression rules, territory mapping onto account_id, and the definition of "actioned."
Pilot pod manager
Picks the reps, sets tier boundaries with sales leadership, brings the Friday feedback, decides when Tier A turns on.
Security and legal
Vendor review and DPAs for SteadyBase, MoltSets, TheSwarm, and Centralize. Retention rules for transcripts and contact data.
Enablement and product marketing
The voice guide and the product-claims library the QA agent checks drafts against, so nothing about the product gets invented.

What it costs to run, and the dial for each

The pilot's cost meter makes cost per meeting a number on the manager view. These are the drivers; the Scale tab runs them at list prices.

Model tokens
Briefs and drafts are the bulk. Dials: the 14-day cache, a small model for classification and reason codes and a large one for drafts, and Tier C accounts getting research only.
Clay rows
Dials: research once, suppression applied at search time so excluded rows are never bought, and a row budget per play with an alert at 80%.
MoltSets
Flat plan, so the dial is coverage, not volume. Apollo behind it on every row.
SteadyBase
Per tenant, and likely already in place. The delta feed means no re-pulling the book.
Snowflake compute
Nightly builds and scoring. Dials: incremental dbt models and one small warehouse dedicated to the pipeline.
Already paid for
Slack, Salesforce, Apollo, Nooks, Centralize seats. Navigator adds calls to them, not licenses.

Risks, and what stops them

The ones worth naming before someone else does.

AI writing to CFOs embarrasses the brand
Receipted claims only, a QA gate before any send, autonomy by tier, send caps, and a kill switch per tier and per play.
Deliverability at 500-rep volume
Caps enforced in Apollo, domain warmup, grade A and B emails only, bounces feed suppression the same hour.
A vendor is in beta, issues keys by hand, or is a very small company
MoltSets and SteadyBase both are. Apollo is the fallback on every contact row. For SteadyBase specifically: the company owns the account_id map in its own Snowflake, the resolver ladder is documented and reproducible, receipts are stored as URLs so signals outlive the vendor, and nothing downstream depends on the MCP being up.
Cold outreach rules differ by country
Contacts carry a country, and it gates autonomy. Tier A auto-send only in permitted geographies, US and Canada to start. EU contacts are always human-approved under a documented legitimate-interest basis. Business email only, never a personal-email endpoint. Mobiles are scrubbed against do-not-call lists before any Nooks list, and there is no SMS.
Reps don't use it
One tap in Slack, nothing to learn, and the manager view shows who actions signals within 24 hours.
Duplicates and wrong accounts at 1,000 reps
The resolver with a review queue, never a merge on name or domain, and territories keyed to account_id.
Prompts drift, quality slides
A golden set of briefs and emails runs in CI, prompt changes are pull requests, and QA grades are checked against reply rates monthly.
Privacy
Contact data stays out of prompts, no personal emails, DPAs with every vendor, retention matched to CRM policy.

How we'd know the pilot worked

Measured from week 1 so there is a baseline, with an account-level holdout inside the pilot pod: the same reps, a random 30% of their accounts on the old process. A separate control pod would carry manager and territory differences, and reps talk.

Signals actioned within 24 hoursTarget 70% or better. Today's number is unknown, which is itself the first finding.
Reply rate on Navigator touchesNavigator accounts against the holdout accounts, same reps, by play and by tier.
Meetings per rep per weekThe number leadership actually cares about. Navigator accounts versus holdout accounts, same reps.
QA grade versus reply rateDo A emails reply like A emails. If not, the grader is wrong and gets fixed before the sends do.
Research minutes per daySelf-reported by the pod in week 1 and week 3. The scale math on the last tab uses this input.
Cost per meeting, all inModel tokens plus vendor rows, from the cost meter, so the 1,000-rep case is arithmetic and not a hope.

Scale and pilot

Every number here is an input. These defaults are illustrative; swap in your own and the math updates.

Assumptions

Per rep, per working day, for the accounts a rep touches.

Capacity returned

Time a rep gets back for conversations, not a headcount number.

Hours per rep per dayback in the calendar for calls and replies
Hours per rep per week
Hours across the team per week
Same system at 1,000 repsno new ops headcount; the marginal cost is model calls and enrichment rows

Why research once matters

Enrichment rows per month across the team: every touch re-researching the account, versus one brief per worked account, refreshed every 14 days or on a new signal.

Re-research per touch
Cached, 14-day refresh

What it costs to run

Volumes come from the assumptions above. Unit prices are public list prices as of September 28, 2026; a contract number replaces any of them.

Model
Rows and seats
For the ratios

The monthly bill

Run cost only. Apollo, Nooks, Salesforce, and Slack are already licensed; the build and the GTM engineer are not in here.

Per month
per rep per month
per touch
per meeting booked
per hour of rep time returned
per month at 1,000 reps
of the bill is the model

Token counts per job are estimates baked into the page (a brief is about 7,000 in and 800 out; a draft 3,000 and 350; QA 3,500 and 250; a reply 2,500 and 350; small-model jobs 1,200 to 2,000 in). The cost meter in the pilot replaces them with measured numbers.

Autonomy by tier

How 500 reps become 1,000 without the ops team doubling: the agent's freedom scales with how little a mistake costs.

TierWhoAgent mayGuardrails
ASMB, under 200 employeesSend email and LinkedIn touches on its ownUS and Canada to start; caps of 40 sends a day per rep and 2 per contact a week; QA grade B or better; receipted claims only
BMid-marketDraft everything, pick the next action, enroll after a one-tap approvalRep approves each send; call scripts are suggestions
CEnterprise and strategicResearch, map the committee, find warm paths, propose timingA human writes every word; intros go through the connector, never around them

Three weeks to a live pod

Ten to twenty reps first. Then pods of fifty a week.

week 1

Foundation

  • Book into Snowflake, resolved to one id per account
  • Scoring v1 in SQL with reason codes
  • Five signal plays: SteadyBase triggers for public accounts, Clay for the rest
  • Slack bot skeleton
week 2

Agents

  • Account research and messaging with QA in front
  • MoltSets and Apollo in the contact waterfall
  • TheSwarm on the book for warm paths
  • Morning playbook to the pilot pod
week 3

The loop

  • Apollo and Nooks execution, transcripts back
  • Reply agent on the shared inbox
  • Centralize on live deals for AE handoff
  • Outcomes to Snowflake, manager view

After that: one pod a week, tier boundaries tuned from the first month's replies, and the first weight recalibration at day 30.

Decisions to make together

The design changes depending on the answers.

  1. How much of the book is public. SteadyBase is shaped around SEC filers. Whatever share is private or mid-market is Clay's job, and that sets Clay's budget.
  2. Where the SteadyBase pilot stops today. If signals already land in Snowflake and Slack, the gap is wiring them into what reps do each morning, and that is most of the work.
  3. Tier boundaries. Which segments get auto-send, and what the caps are. This is a sales leadership call, not an ops one.
  4. One relationship layer or two. TheSwarm finds warm paths in bulk before contact; Centralize maps the committee once a deal is live. If budget forces one, start with TheSwarm in Clay and add Centralize for the AE handoff.
  5. Which OpenAI models, and where prompts live. GPT-5.5 for drafting and GPT-5 nano for classification to start, prompts versioned in the repo with evals, so a model change is a pull request.