Skip to content

Repository files navigation

PitchLoop — a consent-gated sales agent that learns across calls

License: not specified Python 3.12+

PitchLoop researches an ordered prospect queue, calls each eligible owner once, learns from every outcome, and extends its research toolset when a capability is missing.

Runner-up, Best Use of Zero.xyz — Loop Engineering Hackathon, San Francisco, July 2026 (65 submissions).

What is demonstrated, and what isn't

Local proof only. The integrated demo runs end to end and reaches MEETING_BOOKED, but Nexla lineage, paid receipts, Pomerium responses, live calls, and the generated-tool PR are live-run artifacts that have not been captured.

PitchLoop dashboard mid-campaign

The local dashboard mid-campaign, showing one policy denial, one call placed, and recorded demo spend.

The local demo authors a website-opportunity audit against the frozen internal fact_b contract. The generated tool must pass conformance before the repository adapter can open its pull request, and the registry reloads it only after merge. That live PR and merge remain pending.

How the loop works

goal → prospect discovery → ordered queue → policy check → tool assessment
     → business research → one call → normalized diagnosis → reflection
     → strategy or tool improvement → next uncalled owner → qualified meeting

Branching decisions use recorded policy decisions, service matches, normalized evidence, conformance results, and call outcomes inside an explicit state machine.

The deterministic local scenario sells a website-building service to a fictional cohort of businesses. One contact is denied by policy and is never called. Each eligible owner is called at most once. The first call exposes a missing website-audit capability; later calls surface objections around value, proof, friction, and timing; the accumulated strategy eventually books a meeting.

Integrations

Integration What it does Why it is on the critical path
Zero.xyz Discovers services for prospect research, retrieves Fact A, and places calls The agent searches Zero before authoring the missing fact_b capability; the demo's no-match result triggers tool generation
Pomerium Evaluates place_sales_call and records allow or deny decisions A denied candidate is skipped, and no call path runs without an allow decision
Nexla Normalizes live evidence and exposes it through the configured REST sink In live mode, diagnosis reads the sink rather than raw or locally normalized evidence
GitHub Opens and merges the constrained generated-tool change after conformance passes The tool registry reloads the new capability only after the merge artifact exists

Architecture

flowchart LR
    A["Agent"] --> P["Pomerium policy"]
    A --> Z["Zero.xyz services"]
    P --> N["Nexla webhook"]
    Z --> N
    C["Call adapter"] --> N
    N --> T["Canonical Evidence transform"]
    T --> S["REST evidence sink"]
    S --> A
    A --> G["GitHub generated-tool PR"]
Loading

Generated-tool gate

Stage Enforced behavior
Diagnose The first call records that fact_b is missing
Search Zero is queried for an existing fact_b capability
Author The generator may write only its allowlisted files
Conformance tools/conformance_result.json must record a passing result before a PR can open
Merge and reload The repository adapter records the merge before the registry reloads the tool for a later, uncalled candidate

Run locally

PitchLoop requires Python 3.12 or newer.

python3.12 -m venv .venv
.venv/bin/pip install -e '.[dev]'
demo/run_demo.sh

The demo writes its artifacts under runs/fake-demo.*.

Start the dashboard separately:

.venv/bin/python -m demo.ui

Open http://127.0.0.1:8000, enter a campaign objective, and launch a local run. The dashboard refreshes while the agent works and exposes the queue, calls, reflections, strategy versions, tools, evidence, receipts, transcripts, and append-only action history.

Live configuration

Export the variables listed in .env.example; never commit their values.

Path Environment variables
Zero and calls ZERO_MODE, CALL_MODE, ZERO_CALL_SERVICE_ID, ZERO_FACT_A_CAPABILITY, ZERO_FACT_B_CAPABILITY, CALLEE_PHONE_E164
Pomerium POLICY_MODE, POMERIUM_ALLOWED_URL, POMERIUM_DENIED_URL, POMERIUM_SERVICE_ACCOUNT_TOKEN, POMERIUM_ZERO_TOKEN
Nexla EVIDENCE_MODE, NEXLA_SERVICE_KEY, NEXLA_INGRESS_URL, NEXLA_FLOW_ID, NEXLA_SINK_URL
GitHub and generation REPO_MODE, AUTHOR_MODE, GITHUB_REPO, GH_TOKEN, CODE_AGENT_COMMAND

In live-call mode, every queue entry is routed by Zero.xyz to one configured, consented teammate number (CALLEE_PHONE_E164). Candidate IDs select only the demo persona and its evidence; the repository contains no real prospect phone list.

For Nexla, expose the local sink, configure one webhook-to-transform-to-REST-destination flow, and set the four Nexla variables above.

Scope and limits

PitchLoop is a one-day hackathon build with a fictional cohort, a deterministic campaign, and one generated capability. Live calling is restricted to one configured, consented number even though the queue displays several personas. It has no arbitrary outreach, calendar integration, or policy bypass. Phone numbers, credentials, and unredacted receipts are excluded from version control.

The budget ledger checks known or estimated prices before paid actions and records actual receipt totals afterward. It is not a hard pre-authorization ceiling for services whose price is unknown.

Team

Four people share this repository, with work divided by module boundary.

Workstream Modules
Agent core Contracts, agent loop, and Zero adapter
Scenario and calls Scenario, pitch, call adapter, fixtures, and conformance
Policy and repository Pomerium and GitHub adapters
Evidence and release Nexla evidence path, integration, and release

Requirement matrix

Requirement Proof
Read specification and plan runs/<run-id>/spec.json, runs/<run-id>/plan.json
Real policy denial and allow Local artifacts at runs/<run-id>/policy/deny.json and runs/<run-id>/policy/allow.json; live Pomerium responses pending
Runtime discovery and paid action runs/<run-id>/zero/search_fact_a.json; live paid receipts under runs/<run-id>/zero/ pending
Diagnose missing capability Local normalized evidence at runs/<run-id>/evidence/normalized.jsonl and runs/<run-id>/evidence/diagnosis.json; live Nexla lineage pending
Author, test, and merge tool runs/<run-id>/tools/conformance_result.json; live runs/<run-id>/repo/pr.json and runs/<run-id>/repo/merge.json pending
Reload and improve later calls runs/<run-id>/tools/reload.json, runs/<run-id>/strategy/, runs/<run-id>/reflections/, runs/<run-id>/final/meeting.json

License

No license file is currently present in this repository.

About

A consent-gated AI sales agent that researches a prospect queue, calls each owner once, and learns from every outcome to book meetings

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages