The first agent Made and BioCreative are building together, traced stage by stage: a form fill on the Made website → a junk/qualify gate → do we already know this person and this company → if not, create them properly → run the same enrichment and classification ladder every other account and contact runs → map territory and owner → arrive at one clean, SSO-ready picture of who they are and how they relate to us → and only then decide what to actually do about it. 9 phases, 46 stages. Every stage names the real Edge Function, RPC, cron job or table behind it — and says plainly whether that thing exists, is stale, or has never been built. Click any stage for its full reference card.
✓ Live-verified 2026-07-29 against the Transfer DB (jrfcfayphcmaxsixxupu), the Reporting DB (xyopyttkhoxvnyeyijzb), 44 pg_cron jobs, 75 deployed Edge Functions, the os_agents/os_skills registry and the bc-made crontab — not doc claims
Live & runningBuilt · partially filled or staleGap · blocking, or built but not runDesigned, not builtFree — SQL, regex, deterministicPaid — Claude, Clay, FullEnrich, Brave, Firecrawl
Read this first — why this page exists
The agent is the easy part. The foundation underneath it is the work.
BEACON is a genuinely small piece of software: one Edge Function, one or two LLM calls, a decision table, an email. If the only question were "can we build the agent," the answer is yes, quickly.
That is not the question. The question is whether the agent's answer is worth anything — and that depends entirely on whether the account and contact data underneath it is clean, current, resolved and complete. An agent that confidently routes a lead to the wrong rep, or greets a five-year customer as a cold stranger, is worse than no agent at all, because now it is wrong at machine speed and nobody is checking.
So this page deliberately spends eight of its nine phases on the foundation and one on the agent's actual decision. Every amber and red marker below is a place where BEACON's answer would currently be weaker than it should be. Some are being fixed right now in the data-cleanup work; some nobody has looked at yet. All of them are named, because the entire point of choosing this as the first joint build is to see exactly where the floor is before we put weight on it.
Phase G · Capture
A form fill arrives — and mostly evaporates
The most important finding on this page lives in this phase. Made has 26 live HubSpot forms and a working nightly sync, but no record of any individual form submission anywhere in the data layer. We know that 719 contacts submitted something, 830 times in total. We do not know which form, when, or what they typed — and the free-text message is the entire input BEACON was specced to reason over.
Phase H · Triage
Is this even worth running through the machine?
The cheap gate that protects everything downstream. Normalize the raw payload, then one LLM call decides junk vs. real — a job seeker, an employment-verification request, a vendor pitch, a malformed email. This is the part everyone pictures when they say "the agent," and it is roughly 5% of the work. None of it is built, and none of it is hard — this is the only phase on the page where "not built" genuinely isn't a problem.
Phase I · Recognition
Do we already know this person, and this company?
The phase that separates a useful agent from an embarrassing one. Made already owns the system that answers this — MADE-ID plus the Monocle graph — and it is genuinely good: 4,595 accounts and 102,529 contacts at 100% ID coverage, 108,415 cross-system contact mappings. Do not build a second one. The gap here isn't capability, it's timing: resolution runs on a 10-minute drain, so a brand-new inbound contact is still unresolved at the exact moment BEACON needs the answer.
Phase J · Admission
If we don't know them, admit them properly
The discipline that keeps the database trustworthy once an agent can create rows. Made's existing rule is exactly right and BEACON must inherit it unchanged: a new company is always created non-ICP and pending review, so an agent can never quietly promote noise into a live target. Provenance is stamped on the way in, so six months from now anyone can ask "where did this row come from" and get a real answer.
The latency ladder — why the five-minute promise and the current plumbing can't both be true
Measured 2026-07-29 from the live cron schedules. Bars are illustrative against a 48-hour worst case. This is the clearest single argument that the foundation matters more than the agent: every bar below happens before BEACON has anything worth reasoning about.
The spec's promise— lead-to-first-response under 5 minutes, 24/7. This is the KPI Made wrote down, and the one the agent is accountable for.
5 min
Form → HubSpot— instant, and entirely HubSpot's. Nothing to fix here.
~1 sec
HubSpot → Reporting DB— the nightly hubspot-nightly sync. A form submitted at 09:00 waits for tonight.
up to 24 h
Reporting → Transfer DB— a second daily cron at 06:15 UTC. If the nightly lands after 06:15, this adds another full day. Transfer sits 23 rows behind Reporting right now, which is this gap made visible.
up to 24 h
Transfer → canonical contact ID— the 10-minute MADE-ID drain. Fast in absolute terms, but still 2× the entire SLA budget.
up to 10 min
Canonical ID → full relationship picture— the Monocle RPC. Genuinely instant once the ID exists. This part is excellent and needs nothing.
<1 sec
…and then enrichment, if the company is new— the domain lookup is seconds, but Clay is credit-gated behind a 12,787-deep queue and the persona pass is a separate Claude call. For a brand-new company this is not minutes.
hours → weeks
Worst case, an inbound lead is fully resolved, enriched and SSO-ready ~48 hours after they hit submit — and that assumes the Clay queue gets funded. The five-minute KPI is not achievable on the batch path, and no amount of agent cleverness changes that. This is a plumbing decision, not an AI decision.
The resolution — two speeds, not one
Answer fast on what you know; get complete later
Fast path (meets the KPI). A HubSpot-native webhook fires the instant a form creates or updates a contact, straight at BEACON — bypassing both nightly syncs entirely. BEACON attempts an immediate synchronous identity lookup: exact email against the contact map, exact domain against known companies and aliases. If it resolves, pull the full Monocle overlay and route on real relationship knowledge. If it doesn't — a genuinely new company — don't block the SLA waiting for resolution. Decide on the raw form fields plus Made's own RAG, ship the routing email, and flag the decision row for a backfill pass once the standard pipeline catches up.
Slow path (unchanged, never duplicated). The nightly sync → Transfer → MADE-ID drain → Monocle overlay stays exactly as it is, as the system of record for reporting, dedup and CRM-wide identity. BEACON only ever reads from it. It never re-implements it and never races it.
The cost of the fast path is honest: it answers with less context. A brand-new company gets a decision made on a domain and a paragraph of text, not on a scored, enriched, classified account. That's an acceptable trade for an internal routing email — and an unacceptable one for anything that writes to the CRM or contacts the lead directly. That distinction is exactly what the tier table below encodes.
Decision architecture — five tiers, and where a human sits in each
What BEACON is allowed to do on its own
Made's submitted spec described these as a flat list of cases. Written as ordered tiers, the human-in-the-loop boundaries become unambiguous — and it becomes obvious which tier deserves the most scrutiny.
Tier
When it fires
What happens
Human
0 · Known
Contact or company resolves to an account with an assigned rep, a prior opportunity, an active campaign, or a customer flag
Route to the existing owner, overriding territory. A known customer's inbound must never look like a cold lead.
None — but logged
1 · Confident
No existing relationship; capability match is clear, territory resolves cleanly, geo passes
Auto-route: email straight to the correct BDM. Subject [New Lead – {Territory}] {Company}
None — tightest audit
2 · Borderline
Fit can't be decided confidently
Still ships — to the likely BDM, with Inside Sales copied and the message labelled borderline. Widens the audience rather than stopping.
Copied in
3 · Ambiguous
Research empty, systems down, or genuinely unclear — plus every off-hours submission
Holds. No email sent. Flagged to the Inside Sales Manager with the full message and everything researched. Released by a human.
Must release
4 · Disqualified
Job seeker, employment verification, vendor pitch, or fails the geo rule
Never contacts the lead. Filed to a labelled disqualified group and retained for review, so misfires stay findable.
Reviews in batch
Why Tier 1 gets the closest watch: Tiers 3 and 4 are cheap to reverse — a human looks before anything leaves the building. A wrong Tier 1 is the only failure mode that reaches a person unreviewed. So the threshold should be biased conservatively: when in doubt, drop to Tier 2. Recommend an explicit circuit-breaker — if disagreement on Tier 1 auto-routes exceeds a set rate in any week, Tier 1 switches off and everything falls to Tier 2 until it's corrected.
Phase K · Account build-out
The account ladder BEACON has to wait for
A new company arrives thin and has to be built up rung by rung before it can be scored — and therefore before any message about it can be specific. This is the existing account ladder, unchanged; BEACON triggers it rather than replacing it. Every amber and red rung here is a reason an inbound lead's routing email would read generically.
Phase L · Contact build-out
The contact ladder — filter cheap, enrich selectively
The whole phase is one resource-optimisation pattern: free SQL tags everyone, an opinionated gate sets aside people who can't buy, and only the survivors cost money. The first three rungs are effectively complete. The rung that produces the actual persona — the input any message generator genuinely wants — has reached 8% of the database.
Phase M · Mapping
Territory, owner, and who actually gets the email
Good news that changes the build: the territory table and the rep roster already exist — 73 location rows mapping states, provinces and countries to territories and named reps with email addresses. That closes two of the plan's open questions outright. What remains is thinner: the account-ownership field Tier 0 depends on is populated on 8 accounts out of 4,595.
Phase N · The clean picture
Who they are, and how they relate to us
Everything above converges here — one view, one lookup, one paragraph a human or a model can act on. This is the handoff boundary, and a field missing here is precisely what forces a message into a weaker, more generic tier. The bundle covers all 4,595 accounts; the question is never whether the row exists, it's how much of it is filled in.
Phase O · So how do we proceed?
Here the honest answer is: this hasn't been decided, and it shouldn't be decided by us. Everything above produces a clean, resolved, enriched picture of an inbound lead. What Made does with that picture is a business choice with four credible answers — and they differ enormously in risk, not in difficulty. All four are shown as designed-not-built, with what each would actually need. The recommendation is to pick one for v1, prove it, then add the others.
BRANCH 1
Route to a rep for human follow-up
The agent decides and hands off. An internal email to the right BDM with the lead, the message, and everything researched. No customer-facing output at all.
Territory + rep roster already exist
Branded email renderer already deployed
Needs the decision-log table
Needs an off-hours hold mechanism
Risk if wrongA colleague gets an email they didn't need. Trivially recoverable — nothing external happens. Recommended v1
BRANCH 2
Generate and send a reply to the lead
The agent writes the actual first response and sends it, grounded in the messaging matrix and the lead's persona and stage.
33-cell messaging matrix is authored
Message-generation function already live
Persona exists for only 8% of contacts
Made's spec currently says never contact the lead directly
Risk if wrongAn external human receives a wrong or off-brand message. Not reversible. Needs approval-before-send at minimum.
BRANCH 3
Produce collateral for them
Build something specific — a tailored one-pager, capability overview or facility brief matched to their modality and stage — for a human to send.
Branded document factory already exists
Modality + stage already classified
No mapping from modality → which asset
Depends on account enrichment being fresh
Risk if wrongWasted generation, or a rep sends something subtly mismatched. Recoverable if a human reviews before sending.
BRANCH 4
Write the verdict back to the CRM
Push the lifecycle stage, score, territory and routing decision back into HubSpot or Salesforce so the CRM reflects what the agent concluded.
HubSpot credential is working again
Field mapping already documented
No write path exists — every sync is read-only
Made's spec explicitly defers CRM write
Risk if wrongCorrupts the system of record that reporting, forecasting and comp all depend on. Highest risk — do last
The recommendation
Branch 1 for v1 — and it's not a compromise
Routing to a rep is the only branch where a wrong answer costs nothing external. It exercises the entire foundation above — capture, triage, recognition, admission, enrichment, mapping, the clean brief — while keeping the worst-case failure at "a colleague received an email they didn't need." That makes it the ideal instrument for measuring whether the foundation is actually sound, before anything irreversible is wired to it.
It also produces the one thing every other branch depends on and none of them can generate on their own: a corrections log. Every time a rep says "wrong territory," "we already own this account," or "this was junk," that's a labelled training example. A few hundred of those and the confidence thresholds stop being guesses. Branch 2 and Branch 4 both become far safer propositions after Branch 1 has run for a quarter — and considerably riskier before.
What would actually block this build — named, owned, and severity-ranked
Everything on this list was verified live on 2026-07-29. blocks the build degrades the answer worth knowing. Owners are a proposal, not an assignment.
Ref
What's wrong
Why it matters to BEACON
Owner
B-01
No form-submission record exists. 26 forms are catalogued and submissions_total is a placeholder (every row is 1 or 0). Per-contact counts are real — 719 contacts, 830 submissions — but no row anywhere stores which form, when, or what they wrote.
The free-text message is BEACON's entire input. Without it there is nothing to classify and the agent cannot exist in its specced form.
Made + BC
B-02
No real-time trigger. No webhook receiver on either database; no HubSpot-side workflow confirmed. Both syncs are batch.
Determines whether the 5-minute KPI is reachable at all. This is the single biggest scope fork in the build.
Made
B-03
Account ownership is empty.account_owner is populated on 8 of 4,595 accounts. The fallback sales_rep_email covers 2,505 (54%).
Tier 0's entire premise — "an existing relationship beats a cold territory guess." Without it, BEACON would greet known customers as strangers.
Joe / CRM
B-04
MAS scores are 83 days stale. Last full pass 2026-05-07; dynamic momentum last touched 2026-06-10. 2,342 of 4,595 accounts scored.
Fit confidence leans on the score. A stale score pushes borderline leads into the wrong tier in both directions.
BioCreative
B-05
Clay queue 12,787 deep, unpushed. Selected and priced; never funded. Contact enrichment is the gate on persona.
A new inbound contact joins the back of this queue, so their persona — and any specific message — may never arrive.
Made
B-06
Persona coverage is 8%. 8,272 of 102,529 contacts have a generated persona.
Determines whether the output is specific or generic. Doesn't block Branch 1; effectively blocks Branch 2.
BioCreative
B-07
Engagement flags are empty. Computed nightly by a live cron, but land on 5 (sales), 0 (marketing) and 4 (outbound) accounts.
"Have we spoken to them before?" is exactly what a rep needs in a routing email — and it currently can't be answered.
Joe / CRM
B-08
Location is missing on 36% of contacts. HubSpot carries country on 11,268 of 17,653 and state on 10,478.
Territory lookup is deterministic and reliable — but only when a location exists. The rest need inference, which is a guess.
Made + BC
B-09
592 unreviewed status proposals and 2,335 unreviewed resolution proposals, plus 38 pending contact-identity merges. The propose-only discipline is working; the review queue isn't being drained.
Proposals are the system asking a question. Unanswered, the graph stays less resolved than it could be — which shows up as a thinner Tier 0.
Made
B-10
Name collision unresolved.os_agents holds BEACON (inbound lead qualifier, draft) and CONCIERGE (document ingestion router, draft) — two different jobs, one of which was submitted under the other's name.
Registration and the fleet matrix. Cheap to fix, but must be fixed before anything is deployed under a name.
Made + BC
B-11
The n8n sync path still fails.hubspot-nightly-n8n has 30 consecutive errors, all 55-second axios timeouts — separate from the credential issue, which is now resolved.
Not on BEACON's path, but it's a duplicated sync route that will confuse debugging later. Worth retiring or fixing.
BioCreative
B-12
Off-hours hold has no mechanism. Tier 3 requires "hold until next business-day open." No delayed-job or queue-sweep pattern chosen.
Small, but it's a correctness requirement from Made's own spec, not an optional nicety.
BioCreative
Where this sits in Made's own build process
Made already has a five-stage gate with human approval on the last three, and a live tool that enforces it — the Skill Maker and Agent Maker inside Made OS Admin. BEACON runs through those gates, not around them.
STAGE 1
Ideation
Problem stated in a sentence; skill-or-agent decided; seed context attached.
Complete
STAGE 2
Planning
Shape, harness, skills, context, memory, evaluation and trigger all decided. This page is the planning artefact.
An eval set covering all five tiers, run before anything is trusted.
Needs approval
STAGE 5
Deployment
Promotion to live, plus registration in the fleet matrix and the skills index.
Needs approval
The three decisions that unblock Creation
Everything else can be settled while building
Trigger speed. A real-time HubSpot webhook that meets the 5-minute KPI but needs HubSpot-side automation work and possibly an Operations Hub tier — or accept the batch path's ~24–48 hour latency and rewrite the KPI honestly. This is a business decision about how fast Made wants to answer, not a technical one.
How the message reaches us. Given B-01, does HubSpot start posting submissions to an endpoint we control, do we store the payload ourselves, or does BEACON reason from contact properties alone and accept a weaker input?
Which branch is v1. Recommendation above is Branch 1 — route to a rep. Confirm or redirect, because it changes what gets built in Creation.
Two things worth stating plainly: the territory table and rep roster already existed and closed two planned open questions outright — which is the kind of thing you only find by checking the database instead of the documentation. And the HubSpot credential that had been dead since 2026-07-09 came back today, mid-verification. Both are reminders that the fastest way to be wrong about this system is to trust a document over a query.
Full reference
Every stage in detail
One card per stage, grouped by phase — what actually happens in plain language, where it lives, what it costs, the live numbers as measured on 2026-07-29, and any place a document says something different from what the database says.