2
Phase 2 · Weeks 3–9
Build.
One design principle governs everything in this phase:
the repo is the source, the warehouse is the runtime. Definitions are authored, reviewed and versioned in Git,
then compiled into the semantic layer by CI. Nobody edits a metric in a BI tool ever again.
The GTM Brain
What we hand them. One clone and their Claude has the whole model.
# the contract — human-agreed, machine-readable
definitions/ one file per metric; owner in the frontmatter
questions/ the 20 questions, each linked to the definitions it needs
motions/ motion map + the roll-up legality matrix
# the model — what CI compiles and deploys
models/ transforms (dbt or equivalent)
semantic/ the semantic layer spec — the compiler's input
graph/ node + edge schema, identity ladder, survivorship rules
retrieval/ chunking, anchoring and embedding config (optional, last)
# the surface — how humans and agents reach it
agents/ the shipped agents, read-only by default
CLAUDE.md how to reason about this business
.mcp.json the endpoints an agent may call
docs/ workshop outputs, decisions, the arbitration log
The compiler
Tool-agnostic. Pick for what they already run, not for what's fashionable.
Semantic layer engines
- Cube — best when agents are the primary consumer; REST/SQL/GraphQL APIs, open-source core
- dbt Semantic Layer — best when they already run dbt; definitions sit beside the transforms
- Looker / LookML — already a semantic layer if they own it; awkward to expose to agents
- Vasco — the layer and the graph together, on Path A
The non-negotiable
- Never let a model author business logic.
- Text-to-SQL is the anti-pattern — the model silently guesses joins, grain and definitions, and is wrong in a way nobody can see
- Text-to-semantic-query is the pattern — the agent picks from an approved menu, the semantic layer compiles it correctly
- Policy lives at the definition, so access control can't be bypassed by asking differently
Identity resolution — the hard part
Not the metrics. Deciding when two records are the same thing. Build it as a ladder, never as a guess.
Person ladder
- 1 · Verified email, exact auto-merge
- 2 · Normalized email — strip +tags, gmail dots auto-merge
- 3 · LinkedIn URL / provider person ID auto-merge
- 4 · Phone, E.164 review queue
- 5 · Normalized name + resolved account review queue
Account ladder
- 1 · Root registrable domain auto-merge
- 2 · Provider IDs — SFDC 18-char, HubSpot company ID auto-merge
- 3 · Registry ID — DUNS, PDL, Clearbit auto-merge
- 4 · Normalized name + country review queue
- + Explicit parent/child edges for subsidiaries and acquisitions
Do this or lose the database
Block the free-mail and shared domains before you turn resolution on.
Without a blocklist, every @gmail.com lead merges into one enormous fake account, and you will find out in front of the CRO.
Rule 1
A permanent surrogate key
Every resolved entity gets a ULID that is stable forever, never reused, and never derived from a business
attribute. Emails change. Domains change. Companies rebrand. The key must not.
Rule 2
Every merge is reversible
The resolved entity is a new node with edges back to each source record — never a destructive overwrite.
Get this wrong and a bad merge rule corrupts a customer's data with no path back. This is the one that ends engagements.
Rule 3
Every edge carries time
Valid-from and valid-to, not just created-at. Without it, "who owned this deal last quarter" returns
today's owner, confidently. This is the number one reason a graph gives the wrong answer.
Rule 4
Provenance on everything
Source system, source record ID, confidence, as-of — on every node and every edge. No provenance means no
citation, which means no trust, which means no adoption.
Where the graph lives
It must be multiplayer — hosted, authenticated through their IdP, with one governed write path. Never a local file.
Default · ~80% of customers
Graph-in-the-warehouse
Resolved entity tables plus an edge table — from_id, to_id, edge_type, valid_from, valid_to, source, confidence —
in the same warehouse as the semantic layer. Traverse with recursive CTEs or BigQuery's native graph syntax.
Multiplayer by default, same auth, same governance, one less system. GTM graphs are small: hundreds of thousands
of nodes, not billions.
Only if
A dedicated graph database
Neo4j AuraDB or Neptune — justified when routine queries are three or more hops: org-chart traversal,
multithreading path-finding, partner referral chains. Costs you another system, another sync and another access model.
Running Neo4j for 200k accounts is maintenance with no benefit.
Anchored retrieval
✕
You never vectorize the database
Structured records are answered by the semantic layer, exactly and correctly. Embedding a table of ARR values so you
can ask "what's our ARR" is the signature AI-project mistake.
✓
You vectorize unstructured artifacts only
Transcripts, emails, tickets, notes, docs. Every chunk carries its metadata and is anchored to a graph node.
✓
Retrieval is graph-scoped first, vector-ranked second
Filter to this account's last ninety days, then rank by similarity inside that set. Pure vector search across the
corpus is what returns a beautifully relevant paragraph about the wrong customer.
✕
Vectorization is not an agent
Chunk, embed, upsert, index — on a schedule. That's ETL. The one place an agent belongs is typed entity
extraction: pulling pain, risk, next step, champion and economic buyer out of a transcript, each with a verbatim quote as
evidence. Deterministic work doesn't get an agent; judgment does.
Vector store — pick the boring one
- Whatever is native to their warehouse — Snowflake Cortex Search, BigQuery vector search, or pgvector on Postgres
- One less system, and the graph-scope filter is a plain SQL
WHERE — which is exactly what anchoring needs - Pinecone / Weaviate / Qdrant only when scale or latency genuinely demands a dedicated store
Write-back governance
Default posture
- Every agent ships read-only
- Writes go through a scoped action layer, never direct CRM API access
- One named human owns each write scope
- Every write is logged with the agent, the prompt and the resulting diff
Proof dashboards
- Definition coverage — how many of the 20 questions are answerable
- Resolution match rate, by ladder rung
- Review-queue depth and age
- Model integrity score — unowned definitions, orphaned fields, stale sources
Week six · steal this
Ask the executive sponsor for
one number out of the semantic layer that contradicts their current board deck. If nothing contradicts, nothing has
actually been defined — you've rebuilt their old reporting with better tooling. Something always contradicts. Find it early and the
whole engagement earns its trust in a single meeting.