Skip to content
Conduit

skill

gtm

Agent-native prospecting for Claude Code, Codex, and Claude Desktop: interview -> ICP-matched discovery -> spreadsheet work area -> DM queue. You send every message.

Galois-Labs/gtmcommunitylistedunreviewed

Set up

Skills are installed by placing their folder where your agent loads skills.

The download comes from github.com/Galois-Labs/gtm itself, not from our server, so what you get is exactly what its author published.

Install instructions come from the README

Skills do not use an MCP config. Follow the steps in the README below.

README

synced Oct 26, 2026

Galois GTM

This is the internal prospecting tooling we built at Galois Labs to find our own customers, cleaned up and shared with our Founders Inc cohort. It runs inside your own agent session (Claude Code, Codex, or Claude Desktop) — nothing hosted, nothing phoning home, your keys, your machine.

How it works: a clarifying interview (point it at a doc, answer in chat, or drop your URL) becomes a versioned profile — ICP rubric, personas, voice rules, a claims policy with a Caution Dial, channels, budgets. Everything else happens in one spreadsheet — ~/GaloisGTM/<campaign>/gtm.xlsx — where your agent saves companies, people, drafts, and the send queue, then filters, ranks, fact-checks, and improves them wave by wave off free public sources matched to your ICP and public LinkedIn search. Targeting asks two questions, not one — are they in your market and will they move this quarter — so accounts rank on a dated event that started a clock, not on how long they have quietly had the problem, and never on when you happened to find them. It also reads who is already in the seat: paying a competitor proves the budget and makes them a better target, being wired into one costs a tier, owning one is unwinnable. The workbook is the state, the work area, and your interface: open it in Excel or Sheets any time, edit anything, and the next wave reads whatever is there. Drafts come out in your voice with every claim traced. You send every message yourself. The workbook compounds on your machine, so re-runs get cheaper.

License: MIT

Install — 30 seconds

Open Claude Code (or Codex) and paste this. The agent does the rest.

Install galois-gtm: run git clone --single-branch --depth 1 https://github.com/Galois-Labs/gtm.git ~/.claude/skills/galois-gtm && cd ~/.claude/skills/galois-gtm && ./setup then add a "galois-gtm" section to CLAUDE.md that says: prospecting, lead lists, and outreach route through the galois-gtm skills — /galois-setup (interview -> profile + workbook), /galois-targets (discover + tier), /galois-enrich (contacts + a keyless buying map + verified-email reveal), /galois-messages (draft + fact-check, caution dial 0-3), /galois-queue (build the DM queue), /galois-daily (morning digest) — each wave works one spreadsheet at ~/GaloisGTM/<campaign>/gtm.xlsx, and the human sends every message.

./setup auto-detects your hosts and wires each one with symlinks: Claude Code and Codex get the skills, Claude Desktop gets a ZIP of each skill to upload under Settings → Customize → Skills. No hosted service, no MCP server, no background process — just the skills and the workbook. Idempotent; --host claude|codex|desktop to target one. The only runtime dependency is python3 + openpyxl for .xlsx waves (CSV mode needs nothing).

Quickstart

Each command is a wave. It reads the workbook, works, writes it back, and tells you what changed in one line. No CLI, no flags — just the skill.

/galois-setup      # the interview -> ~/GaloisGTM/<campaign>/gtm.xlsx + galois.profile.yaml beside it
/galois-targets    # zero-key discovery -> tier on fit AND acuteness -> Companies tab
/galois-enrich     # contacts (cold or warm) + a keyless buying map + verified-only email -> People tab
/galois-messages   # draft + fact-check (caution dial 0-3) -> Messages tab
/galois-queue      # build today's DM-first queue -> Queue tab
/galois-daily      # a short morning digest — funnel + which segment is converting

Between any two waves, open gtm.xlsx in Excel or Sheets and edit anything — UPPERCASE columns (TIER, SELECT, STATUS) are yours and the agent never overwrites them. The next wave reads whatever is there. When the queue is built you open each profile, click Connect or Message, paste the drafted note, and mark it sent on the sheet. Nothing is sent for you. See Working in waves.

Working in waves

Every command works one workbook: ~/GaloisGTM/<campaign>/gtm.xlsx, with galois.profile.yaml beside it. A wave reads it, works, writes it back, and tells you what changed in one line — "Wave done: +12 companies, 8 auto-tiered A, 2 lost A (no dated trigger), 1 killed, 3 need your TIER call." Edit anything in Excel or Sheets whenever you like; the next wave reads whatever is there. An existing workbook is upgraded in place the first time a wave touches it — new columns are appended at the end of row 1 and nothing already in the sheet moves or changes. The workbook is the state and the interface — there is no separate database, no export step, nothing hosted. One plain folder in your home directory, visible in Finder, never inside a git repo.

The workbook has six tabs, and their column headers are the contract:

TabWhat it holds
Companiesdiscovered targets, their classed signals/sources, segment and track, any incumbent already in the seat, and tier
Peoplethe LinkedIn-reachable contacts, how you came by each one, their buying-map role and approach order, where the relationship stands, and a verified email only when there is one
Messagesdrafts with a claims lane, fact-check verdict, and gate STATUS
Queuetoday's rendered DM-first slice — the STATUS marks are the ledger
Suppresseddo-not-contact keys the agent checks before adding any row
Budgetyour spend caps up top, one appended log row per wave below

UPPERCASE columns are yours. TIER, SELECT, KILLED, STATUS, STATUS_NOTE, STAGE, STAGE_NOTE — the agent reads them and never overwrites a value you put there. TIER overrides the machine's tier; SELECT is Y to force-include, N to skip, blank to let rank decide; KILLED on Companies retires a dead account with a reason and blanking it reopens the account; STATUS on the Queue tab is where you mark sent / accepted / replied / skip; STAGE on People says where a relationship actually stands, and anything past blank keeps that person out of cold outreach so a live conversation is never re-pitched. lowercase columns are the agent's proposals — a wave fills blanks and refreshes cells with new evidence, and treats whatever it finds in a cell at wave start as current truth, so a hand edit is simply what the next wave believes.

One shared file has one risk worth naming: if you leave gtm.xlsx open in Excel while a wave writes, Excel's next ⌘S can silently overwrite the wave's work. So a wave warns you to close the file before its first write, saves atomically (tmp then replace), and keeps gtm.prev.xlsx as a one-generation undo. Working in daily waves, one person at a time, this stays a non-issue.

If openpyxl is not installable on your machine, the flow falls back to CSV tabs — <campaign>/sheets/Companies.csv and friends, same headers, same conventions — and needs nothing installed at all.

The Caution Dial

One control governs how far a draft may go past what is proven. Set once in the interview (default 1), override per run, stamped on every exported row.

DialDrafts fromGate
0 LockedVerified facts onlyBlocked until every claim confirms
1 Careful (default)Verified + whitelisted safe inferencesBlocked until clean or softened
2 ConfidentHedged confident inferencesFlags, does not block
3 AdventurousBold inference, misses acceptedSpot-flags fabrication classes

At every dial: never fabricate proper nouns; certification claims are verified-only; FALSE is always corrected.

What it costs to run

The list — and the LinkedIn route to every person on it — costs nothing beyond the agent subscription you already have. The only paid column is the optional verified email.

What you getCostHow
Company lists from free public sources matched to your ICP — directories, "top N" lists, job boards, and registries (e.g. FDA 510(k) only if you sell to medtech), plus your CSVs$0, no keysEvery discovery lane is keyless and charges_when: never
People + LinkedIn URLs$0 in API creditsPublic LinkedIn search by your own agent (your existing Claude/Codex subscription does the work). The harvest's default backend is a free ddgs lane run straight from the terminal — your agent's own search tool is held back as a reserved quality budget for the steps where result ranking actually changes the answer. Same trust rules either way, still $0. Registry filings, when your ICP uses them, include contact names; your Connections.csv ingests free
A buying map per company — who signs, who champions, who to approach first$0, no keysBuilt from keyless public sources (company team pages, the "reports to" line in job-post JSON, registry contact names, press quotes) — never a paid call, and an inferred reporting link only ever routes who you contact first, never a word of the message
Verified emails~1 Apollo credit or 1 Hunter search, only on a hitBoth paid connectors are charges_when: on_verified_email — a miss debits nothing, enforced in the budget ledger, not by policy. The free lanes above always run to completion first: no paid call fires while any contact still has an unsearched public-search lane
PhonesNot offeredOut of scope by design
Anything to usNeverNothing hosted, nothing metered

Add keys only when you want the email column — set them as environment variables (never written to the workbook); the skill reads them, or asks once:

export APOLLO_API_KEY=<key>     # ~1 credit per verified email, on a hit only
export HUNTER_API_KEY=<key>     # fallback finder; free tier ~25/mo — resolved 6 of 44 in our runs

No key ever produces a guessed email: the waterfall returns a verified address or nothing, and a no-hit routes DM-only. Before any paid call the skill reads your caps from the Budget tab, asks you first, and logs every credit there — a miss debits nothing. No key at all is the default motion: every contact routes DM-only, at $0.

Finding people, and who to approach first

Contact discovery is the free lane, and it runs to completion before anything paid. It harvests LinkedIn-reachable buyers and champions by public search — reading result link titles only, never loading a LinkedIn page (loading pages is what gets accounts banned). The default backend is a free ddgs lane run from the terminal; your agent's own search tool is the fallback and the reserved quality budget, because it is capped per session and this is by far the highest-volume step. Same trust rules on either backend, $0 on both. Then, still keyless, /galois-enrich builds a buying map for each company: who signs, who champions, and who to approach first — assembled from company team pages, the "reports to" sentence in public job-post JSON, registry contact names, and press quotes. Every reporting link is flagged stated (a public source says it) or inferred (deduced from titles); an inferred link only ever decides who you reach out to first, and the drafting step is barred from putting it in a message at any dial. Only then, on the head of the queue, does the optional verified-email reveal spend a credit.

People you already know enter the same way and are marked as such — a referral, someone you met at an event, or your own Connections.csv — so a warm introduction is queued as one message to an existing connection instead of a stranger's connect request, and never gets counted as cold outreach.

Evidence

Every number below comes from our own GTM runs and the audit that followed, not a benchmark deck.

  • 53% vs 11%. The multi-signal gate (require 2+ independent free sources before auto-promoting a company to Tier A) tested at 53% precision against 11% for single-signal tiering. It is enforced deterministically, and multi-signal hits skip adversarial verification entirely. Tier A now also requires one dated trigger, because two directories agreeing that a company exists is not a reason to write to them today.
  • 8-12 concurrency. Subagent fan-out is capped at 8-12 on Claude Code (<=6 on Codex). We watched a 33-agent run stall above that band; the cap is the fix, shipped as the default.
  • 823 contacts, 0 credits. Our Bay Area run harvested 823 contacts across 403 companies through public LinkedIn search without spending a single API credit. Revealing emails for 262 of them is what cost credits.
  • ~32% reveal ceiling. Verified-email coverage caps around 32% of contacts while public LinkedIn coverage was near 100%. Reveal, not discovery, is the throttle. That is why the motion is DM-first and email is the verified-only second channel.
  • Post-accept DM replies benchmark 25-35% for technical personas against a ~8% planned cold-email reply rate, which is why every contact ships a two-message pack.
  • The pipeline scale: 1,955 companies discovered, 523 tiered A/B, 439 send-ready contacts across two metros.

These numbers come from running this same tooling on our own outbound — the campaign data lives in our workspace, the machinery is what you are cloning.

The rules

The same skills, profile, and workbook conventions on every host — only fan-out throughput differs. There is no send code path anywhere: no LinkedIn automation, no email sender, no scheduler; you send every message yourself. Everything runs inside your live session; subagents research and return rows but never write the workbook, and nothing ever spawns a headless agent (that pattern gets accounts banned). Full rails and the reasoning behind them: docs/SAFETY.md.

MIT. See LICENSE.

↑↓ navigate openesc close