skill
revops-3-contracts
Drop-in RevOps engine for Claude Code teams: three discipline-imposing contracts (single front door, numbered-CSV agent chain, one-contract dispatcher) that make a RevOps stack transferable.
Set up
Skills are installed by placing their folder where your agent loads skills.
The download comes from github.com/tga-cheetung/revops-3-contracts itself, not from our server, so what you get is exactly what its author published.
Install instructions come from the README
README
synced Oct 23, 2026The 3-Contract RevOps Stack
A complete, drop-in RevOps engine for Claude Code teams running multi-million-dollar ARR pipelines.
Built on three discipline-imposing contracts that make it impossible to add a fourth parallel system. Tools change. Vendors get bought. Workflows mutate. Contracts survive — because a contract is a fixed shape that every tool, agent, and workflow must agree to, not a tool that gets ripped and replaced.
If you've ever inherited a RevOps stack and thought "I cannot transfer this — there's no canonical shape," this repo is the canonical shape.
What a contract is (and why it beats tools)
A tool is a thing you bought (HubSpot, Apollo, Clay, n8n, Smartlead). It does work for you. It gets ripped out the moment a cheaper, faster, or better one shows up.
A contract is a fixed shape that every tool, agent, and workflow in your stack must agree to. The shape never changes. The tools behind it can.
Three examples to make this concrete:
- The contract "every campaign starts from a brief YAML with a locked status." Doesn't matter if your sequencer is Instantly, Smartlead, Apollo, or something that doesn't exist yet — they all read the same brief. Swap sequencers without touching strategy. Swap strategists without touching sequencers.
- The contract "every agent step writes a numbered CSV." Doesn't matter if step 02 is enrichment by Apollo, Clay, or a custom script — the output is
02-enriched.csv. Step 03 reads it. Step 03 doesn't know or care who wrote step 02. - The contract "every external action goes through one dispatcher with
stdin JSON + <service> <action>." Doesn't matter if your Slack today is Slack tomorrow — the dispatcher swaps the handler, every agent above it stays the same.
Why this matters: RevOps teams die from accretion. Every tool added is a new shape, a new auth flow, a new error path, a new thing to break the day someone leaves. Contracts are the only thing that survive the next vendor swap, the next team change, the next "we just bought X, can you wire it in." Tools come and go. Contracts compound.
This repo gives you three contracts. Everything else is replaceable.
Repo structure
.
├── os/ ← shared frameworks (ICP, TOV, brief schema)
├── engine/ ← shared code (dispatcher, handlers)
│ ├── dispatch.py
│ └── handlers/
│ ├── slack.py
│ ├── notion.py
│ └── http.py
├── tenants/ ← per-revenue-motion (one folder per ICP / product / segment)
│ └── _templates/
│ ├── CLAUDE.md
│ ├── briefs/
│ │ └── _blank.yaml
│ └── RUNBOOK.md
├── .claude/
│ ├── agents/
│ │ ├── revops-conductor.md
│ │ ├── list-builder.md
│ │ ├── enricher.md
│ │ ├── scorer.md
│ │ └── copy-writer.md
│ └── commands/
│ ├── strategy-loop.md
│ ├── pipeline.md
│ └── dispatch.md
└── docs/
└── REPO-RULES.md
Five folders. That's the cap. Anything outside this set requires a written argument committed to docs/plans/.
The three contracts
Contract 1 — Single Front Door
There is exactly ONE operator-facing agent. Call it revops-conductor. The human operator talks to the conductor. The conductor talks to everything else.
operator → revops-conductor → (engine binary | sub-agents | dispatcher)
See .claude/agents/revops-conductor.md.
Contract 2 — Numbered-CSV Agent Chain
Every agent step writes a numbered CSV. 01-sourced.csv, 02-enriched.csv, 03-scored.csv, 04-personalized.csv. The number prefix forces ordering. Step N+1 reads step N — nothing else.
tenants/<name>/runs/<run-id>/
01-sourced.csv ← list builder writes
02-enriched.csv ← enrichment agent writes
03-scored.csv ← scoring agent writes
04-personalized.csv ← copy agent writes
meta.json ← run metadata
See the four sub-agent files under .claude/agents/.
Contract 3 — One-Contract Dispatcher
Every external action goes through one Python dispatcher with a single contract: stdin JSON + CLI <service> <action>.
echo '{"channel":"#revops","text":"campaign launched"}' \
| python engine/dispatch.py slack send
See engine/dispatch.py and the example handlers under engine/handlers/.
Install (5 minutes)
# 1. Clone this repo at the root of your RevOps workspace
git clone https://github.com/tga-cheetung/revops-3-contracts.git .
# 2. Spin up your first tenant
cp -r tenants/_templates tenants/my-first-revenue-motion
# 3. Edit tenants/my-first-revenue-motion/CLAUDE.md with your ICP overrides
# Then open Claude Code in your workspace and run:
/strategy-loop 2026-q3-pilot
The conductor takes it from there.
Configuration
Set in tenants/<name>/.env:
| Variable | Used by | Purpose |
|---|---|---|
INSTANTLY_API_KEY (or your sequencer of choice) | sequencer handler | Sending |
APOLLO_API_KEY (or your sourcing tool of choice) | list-builder | Sourcing |
SLACK_WEBHOOK_URL | engine/handlers/slack.py | Notifications |
NOTION_API_KEY | engine/handlers/notion.py | Archive strategic decisions |
DRY_RUN (1 or unset) | every handler | Safety |
Tuning the repo for your stack
The repo is opinionated about shape, not tools. Edit these to fit your environment:
- Want a different sequencer? Replace the sequencer handler. Conductor doesn't change.
- Want a different CRM? Replace the relevant handler. Conductor doesn't change.
- Want different scoring criteria? Edit
tenants/<name>/briefs/<brief>.yamlicpblock. Scorer reads it. Scorer doesn't change. - Want different agent boundaries? Add a
verifier.mdagent between scorer and copy-writer; have it write03b-verified.csv. The chain extends without breaking the contract.
The contracts hold. Everything below the contracts is yours to bend.
Deploy when
- You're inheriting (or rebuilding) a RevOps stack and want a canonical shape before adding tools
- You're scaling from one revenue motion to multiple and need each motion to look the same
- You're handing a RevOps engine off to a colleague, an acquirer, or a buyer and need it to be transferable
- You've felt the "we have 12 agents and 6 trigger.dev workflows and nobody can find anything" pain
- You're using Claude Code (or any operator-agent pattern) and want to stop the proliferation of parallel skill files
What this is NOT
- Not a sequencer (use Instantly / Smartlead / Apollo / etc. as your handler)
- Not a CRM (use HubSpot / Salesforce / Attio / etc. as your handler)
- Not a workflow engine (use n8n / trigger.dev / Vercel cron / launchd as your scheduler)
- Not opinionated about which tools you use — opinionated about the shape every tool plugs into
This is the discipline layer that sits on top of whatever stack you already have.
License
MIT — see LICENSE.
Created by The GTM Architects, 2026. Built for B2B software and services teams running multi-million-dollar ARR pipelines who want their RevOps engine to be transferable, inspectable, and free of accretion.