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).
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.
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.
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.
| 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 |
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"]
| 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 |
PitchLoop requires Python 3.12 or newer.
python3.12 -m venv .venv
.venv/bin/pip install -e '.[dev]'
demo/run_demo.shThe demo writes its artifacts under runs/fake-demo.*.
Start the dashboard separately:
.venv/bin/python -m demo.uiOpen 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.
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.
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.
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 | 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 |
No license file is currently present in this repository.
