Most cold-outreach tooling treats a sent message as an opaque output of a model call: fast to produce, expensive to audit, and impossible to explain after the fact. This paper examines SS Leader, a multi-tenant outreach platform whose drafting path is instead a fixed, eight-step, contract-governed pipeline in which every terminal state, including refusal states, is persisted as a structured trace. Drawing exclusively on the project's own evidence dossier, it separates what is strongly documented (a mechanical, auditable send pipeline with hard volume caps and compliance gates) from what is only partially documented (human control, which shows up at the tenant and operator level, not as a per-message approval click). The paper's honest finding: this is a real evidence pipeline with real gates, but "human approval" describes governance of the system, not review of each email it sends.
A sent email that cannot explain itself.
Outreach tooling optimizes for one number: how many messages went out. That number says nothing about how any individual message was produced, what it was checked against, or what would have stopped it from sending. When a recipient, a regulator, or the sender's own compliance function asks "why did this land in my inbox, and what did the system know when it decided to send it," the honest answer for most tools is a log line, if that.
SS Leader's own history documents this failure mode concretely before it documents the fix. Prior to a refactor the codebase calls "Prompt J," the entire outreach pipeline lived inline in one file, roughly 1,100 lines, that built the prompt, called the model, validated the output, critiqued it, refined it, gated the send, and rendered the email, all in one place, with no record of how a given draft was reached (docs/architecture/outreach-as-logic.md:11-16). That is the generic problem this paper is about, stated in the specific terms of one repository's own commit history: a working system that could send email, but could not account for any single send after the fact.
The fix the repository chose was not better prompting. It was structural: split the monolith into named, independently testable steps; write down what each step is contractually allowed to do; and make the contract fail loudly, at build time, if the code stops matching it. What follows is a mechanism-level account of that structure, and then an honest accounting of where the resulting system's evidence is strong and where it is thin.
One paragraph per email, produced by a fixed eight-step DAG.
A cold email in this system is not a model's free composition. It is a tenant's own, owner-written voice template with exactly two resolved slots: a deterministic greeting and one LLM-written trigger paragraph. Every other line is fixed by construction (README.md:13).
The runtime entry point, runOutreachLogic in src/lib/outreach/logic-runtime.ts:64-71, walks the same eight named steps on every send:
pre_check_suppression
→ resolve_greeting
→ draft_v1
→ critique_v1
→ refine_loop
→ send_invariant
→ render_email
→ deliver
Each step delegates to one of eleven covenanted skills under skills/<name>/. A covenanted skill is not just a function; it is a pairing of a human-readable contract (SKILL.md), a machine-checkable contract (COVENANT.md), an implementation (impl.ts), and fixtures. That pairing is what lets the pipeline's shape be described twice, once for humans and once for a checker, and cross-verified.
Refusal is a first-class outcome, not an exception
Every run of the DAG terminates in one of six recorded statuses. Four of those six are refusals:
A pipeline that only ever reports success is not evidence of anything; it is a black box that happens to be fast. A pipeline whose most common non-happy-path outcome is "I do not have enough signal to write this paragraph, so I am stopping" is a different kind of system. pre_check_suppression runs before any drafting happens at all, so a suppressed contact is caught at the door, not after a paragraph has already been written about them.
A prose contract that cannot silently drift from the code
The DAG's shape is mirrored in a human-readable LOGIC.md contract, logic/outreach.logic.md. A drift-detection test, tests/drift-detection.test.ts, parses that contract and compares its step names, dependencies, and branch conditions verbatim against the TypeScript runtime; the build fails if the two diverge. This is the mechanism, not a policy promise, that keeps the documented pipeline and the executing pipeline the same pipeline. A second, independently governed LOGIC.md contract, logic/voice-qualify.logic.md, applies the same pattern to a separate voice-agent qualify, decide, book flow that shares a Google Calendar client with the email and booking path.
Two validators, deliberately not merged
A tenant's validator_config (banned phrases and patterns, required phrases) is checked twice on the way to a send: once as the drafter's non-throwing advisory check (validateDraft), and again as a hard, throwing gate at send time (banned-phrase-validator). The project's own documentation describes this as "two validators, not merged" (CLAUDE.md:50), which is a small but telling design choice: an advisory check that can be overridden upstream is not treated as sufficient protection at the point where the email actually leaves the system.
Volume is capped by contract, not by discipline
The platform enforces one live send per business and a per-tenant daily send cap on live sends, implemented as two skills, outreach-live-lock and outreach-daily-cap (README.md:68-69). This is the paper's clearest evidence against the "spray tool" framing: nothing in the system depends on an operator remembering to throttle sends. The ceiling is mechanical.
Channel-scoped consent, not one blanket policy
Above the email pipeline, a separate specification, HARNESS.md, defines a cross-channel funnel: a per-lead journey state machine, per-channel consent gates, an inbound-signal routing table, and a callback-queue lifecycle, implemented in src/lib/orchestration/ and held in lockstep with that spec by tests/harness-drift.test.ts. The routing table treats channels differently rather than uniformly: email is the only channel with a cold path, run on a POPIA legitimate-interest basis with opt-out; WhatsApp (via Zernio) and voice calls require warm opt-in, with no cold path available in the routing table at all (CLAUDE.md:57-58). South Africa's POPIA framework does not ban legitimate-interest cold email outreach outright, but it does require an opt-out and a defensible basis; encoding that distinction into the routing table, rather than leaving it to a sender's judgment call per campaign, is itself a piece of evidence, not a marketing claim about compliance.
Where leads come from before any of this runs
The businesses table that feeds outreach is populated from two paths: a vendored, read-only Python stack under sa-lead-pipeline/ (Google Places discovery, then Playwright enrichment, then scoring), and a CSV importer, scripts/import-leads.mjs, with three-layer deduplication and a confidence-tiered name-write gate. A separate standalone Python worker (Python 3.12, asyncio, deployed independently to Render) runs its own claim-and-execute scrape loop against pipeline_jobs rows, independent of the vendored pipelines. The sa-lead-pipeline/ directory name is the dossier's only textual signal of the intended market; it is a South African small-business discovery stack, not a general-purpose scraper, though the dossier does not name a specific city or province for the data it holds.
Where humans actually enter the loop
Two documented decision points, and only two, put a human directly in control of what the pipeline does, as opposed to checking what it produced. First, tenant onboarding: a 2026-07-19 project decision states tenants are hand-provisioned rather than self-served, "for now" (STATUS.md:11-12). Second, scoring: mid-to-late July 2026 commits record an "operator-triggered backfill" of lead scores (score_v3, all seven axes), meaning a person, not a schedule, decided when that recompute ran. Both are real, evidenced human control points. Neither is a per-message approval step, a distinction this paper returns to directly in the Limitations section below.
What the dossier actually measures, in the dossier's own numbers.
Every figure below is drawn from a single source, the project's own evidence dossier (docs/dossiers/ss-leader.md), compiled from the repository's git history, file tree, and documentation on 2026-08-03. Cited inline as (ss-leader, metric).
The system is four months old by commit history: 325 commits total (ss-leader, total commits), running from a first commit on 2026-04-25 (5101508, "chore: initial commit — docs and reference materials", verbatim commit message) to a last commit on 2026-07-24 (a9e2a4a). Commit volume by month tells its own story of where the effort went: 14 in April, 122 in May, 159 in June, the largest month, and 30 in July (ss-leader, commits by month). Two authors appear in the history: Rainier Potgieter with 323 commits and an "Operator" account with 2 (ss-leader, commit authors). No git tags have been cut (ss-leader, git tags: 0); this is a system under continuous development, not one with dated releases.
By language, the tracked codebase (587 files total, ss-leader, tracked files) breaks down as 25,737 TypeScript lines across 207 files excluding type declarations (ss-leader, TypeScript LOC), 7,427 TSX lines across 55 files (ss-leader, TSX LOC), 7,316 Python lines across 48 files spanning the worker, voice, and legacy webscrape packages (ss-leader, Python LOC), 4,381 SQL lines across 53 migration files (ss-leader, SQL LOC), 20,803 Markdown lines across 154 files (ss-leader, Markdown LOC), and 3,491 JavaScript and MJS lines, including 16 build and operations scripts and one server entry point (ss-leader, JS/MJS LOC).
Test evidence comes from two independent counting methods that roughly agree: the project's own status file claims 593 Vitest tests as of 2026-07-24 (ss-leader, Vitest count, self-reported, latest), while an independent grep across every .test.ts and .spec.ts file in the tree counts 528 it( calls, 8 test( calls, and 2 it.each() groups across 61 files (ss-leader, Vitest call sites, grep-counted). The two Python packages add their own suites: 50 pytest functions in the worker package and 51 in the voice package (ss-leader, worker and voice pytest functions).
| Metric | Value | Evidence |
|---|---|---|
| Covenanted skills | 11 (11 SKILL.md + 11 COVENANT.md) | git ls-files | skills/*/{SKILL,COVENANT}.md |
| LOGIC.md contracts | 2: outreach.logic.md, voice-qualify.logic.md | ls logic/ |
| Supabase migrations | 53, spanning 001_leads_table.sql to 20260724000000_046_onboarding_selfserve.sql | ls supabase/migrations | wc -l |
| API routes | 8: /api/book, /api/checkout/status, /api/contact, /api/health, /api/webhooks/payfast, /api/webhooks/resend/[tenant], /api/webhooks/resend/inbound, /api/webhooks/zernio | find src/app/api -name route.ts |
| Contract package deps | @covenant-md/cli & core ^1.0.0; @logic-md/cli & core ^1.5.0 (devDependencies) | package.json:36-39 |
| sa-lead-pipeline local SQLite data | pipeline.db: businesses 2074, pipeline_runs 38, reviews 0. admin_leads.db: leads 1253 | sqlite3 -readonly ... SELECT COUNT(*) |
| Live tenant lead-row counts (self-reported) | ss-leader 11,874; kamel-potteries 1,305; ccs-pos 3,614 | STATUS.md:8-9, cross-referenced by CHANGELOG.md |
| Deploy target, Next.js app | cPanel + Phusion Passenger, lead.singlesource.co.za, booted by server.js | DEPLOY.md:1-3 |
| Deploy target, scrape worker | Render, two services (background worker + weekly cron) | render.yaml:12-31, DEPLOY.md:74-97 |
The live tenant lead-row counts above (11,874 for ss-leader itself, 1,305 for kamel-potteries, 3,614 for ccs-pos) are explicitly self-reported inside the project's own status documentation, not pulled from an independently queried production database (ss-leader, live tenant lead-row counts). This paper repeats that caveat rather than smoothing it into a plain fact, because the distinction between "the team says" and "we checked" is exactly the kind of thing an evidence pipeline is supposed to preserve.
Where this paper's own thesis is thinner than it sounds.
Honesty about a system's gates requires being equally precise about what is not gated. The following are stated without softening, because a whitepaper that hides its subject's rough edges is not evidence, it is marketing.
The dossier documents no per-message, human-in-the-loop review step before a cold email sends. Every gate in the drafting pipeline, suppression check, dual banned-phrase validators, the send-invariant step, the live-send lock, the daily cap, is mechanical: config-driven or contract-checked, evaluated by code, not by a person clicking approve on an individual draft. The two genuinely human control points evidenced are at the tenant level (hand-provisioning, per STATUS.md:11-12) and the operator level (a triggered scoring backfill). This paper's own thesis phrase, "human approval gates," should be read as governance of the system by a human, not moderation of each message it sends. Conflating the two would misrepresent what is actually built.
The project's own status file reports two different Vitest totals in the same document: 593 at line 23 and 549 in its own gates section at lines 100 to 101, a figure that is stale relative to line 23 and never reconciled in the document itself. This paper uses the later, higher figure and separately checks scale through the grep-counted call-site total, which is independent of either self-reported number, but the discrepancy is the project's own, not resolved by citing around it.
README.md and CLAUDE.md both state the Next.js application deploys to Render, served at lead.singlesource.co.za. DEPLOY.md gives an explicit cPanel plus Phusion Passenger target for that same URL and is the more detailed, more recently structured account. Only the separate Python scrape worker is confirmed on Render. A dossier with a live-fact contradiction between its own docs is not disqualifying, but it means "check the docs" is not a substitute for checking the live deploy.
The POPIA legitimate-interest-plus-opt-out basis documented for this platform applies specifically to the cold email channel. WhatsApp and voice require warm opt-in with no cold path in the routing table at all. That is a defensible split, but it means the platform's compliance story cannot be quoted as a single blanket claim; it is three separate rules for three separate channels, and any evaluation of this system for a regulated sector needs to check each channel's rule independently rather than trusting one summary sentence.
A 2026-07-19 decision explicitly rejected self-serve SaaS "for now," committing instead to hand-provisioned tenants. Five days later, on 2026-07-24, a full self-serve onboarding arc, one-command tenant provisioning plus a nine-step wizard with AI document pre-fill, shipped anyway, but as of the last recorded commit it was held locally and not yet pushed. Read plainly: the project's most recent strategic commitment reversed its prior one inside a working week, and the reversal itself has not left the developer's machine. Anyone relying on this system's stated roadmap should treat it as provisional until commits land and stay pushed.
The vendored sa-lead-pipeline/ and lead-pipeline/ Python subtrees that discover and score businesses before they ever reach SS Leader's own businesses table are each their own separate, read-only git repository, and the ss-leader dossier explicitly excludes them from its own lines-of-code and test metrics. Their two local SQLite databases are reported in this paper because the dossier reports them, but no production Supabase database was queried for either dossier or paper, and neither the discovery logic nor the scoring logic upstream of ingestion has been independently audited here. The evidence pipeline described in this paper starts at ingestion; it does not yet extend upstream into discovery.
Every figure and claim in this paper traces to one document, docs/dossiers/ss-leader.md, itself compiled from one repository's git history and file tree on one date. No live application was queried while writing this paper, and no other project's dossier was consulted for corroboration, even where SS Leader references shared contract tooling (LOGIC.md, COVENANT.md) that has its own separately audited evidence elsewhere on this site. That narrower scope is a deliberate constraint of this paper, not an oversight, but it means the claims here should be read as an audit of one system's own documentation, not an independently verified production audit.
What a mechanically capped pipeline is actually good for.
The defensible claim in this paper is narrower than "AI-safe outreach" and stronger for being narrow: a pipeline where volume is capped by contract (one live send per business, a per-tenant daily ceiling) and where the model's freedom is reduced to one paragraph inside an owner-written template is measurably different from a system that lets a model compose freely and hopes a reviewer catches problems downstream. The four refusal states in the DAG's terminal outcomes are the clearest evidence of this: a system that can say "I do not have enough signal, I am not sending" by design, rather than by exception handling bolted on afterward, has made refusal a normal outcome rather than a bug.
For a South African small-business outreach context specifically, where POPIA's legitimate-interest basis for cold email carries a real opt-out obligation and where WhatsApp and voice sit under a stricter opt-in-only rule, encoding that split into a routing table that a drift test keeps honest against its own specification is a more durable compliance posture than a policy document nobody re-reads before a campaign ships. The gate is checked every time, not audited quarterly.
The drift-detection pattern itself, a human-readable contract and a machine-checked runtime, verified against each other, with a failing build as the enforcement mechanism, generalizes past this one project. It is already validated here in production use, which is a stronger claim than validating it in a demo: the same "Prompt J" monolith that used to hide how a draft was produced is the thing this pattern replaced.
The honest caution: treating this system's gates as "human approval" in the sense a compliance officer would expect, someone reviewing each outgoing message before it sends, would be a misreading. What is evidenced is governance at the tenant and operator layer, plus mechanical, contract-checked limits at the message layer. That is a real and useful shape for an evidence pipeline. It is not the same shape as a human moderation queue, and a buyer or auditor evaluating this platform, or one like it, should ask the specific question this dossier answers precisely: which gates are checked by code, and which decisions are still made by a person, because the two are not interchangeable and this paper's own thesis phrase risks blurring them if read too quickly.
Evidence: this whitepaper's claims are compiled solely from docs/dossiers/ss-leader.md, itself compiled from the ss-leader repository on 2026-08-03. Every number above traces to a file path, git command output, or line citation recorded in that dossier's own evidence table; none were re-derived from the target repository's README or independently queried against a live database. Last updated: 2026-08-03.