Build progress

SmartBound Platform · 9 of 20 sessions done across 3 phases

What Kevin can do right now

  • ✓Open https://smartbound-platform.onrender.com from any device, anywhere. The platform no longer needs Kevin's laptop to be on
  • ✓Open https://smartbound-platform.onrender.com/status and see the live build progress dashboard
  • ✓Sign in at https://smartbound-platform.onrender.com with kevin@smartbound.ai (admin account)
  • ✓Open a workspace's Data Engine in production: Prospeo is first for new provider work, supplied-contact and ICP flows share exact-count repair controls, and paid enrichment/verification remains explicitly approval-gated
  • ✓Click into the Demo Workspace and see contact and campaign counts
  • ✓Import a real CSV of leads: upload, confirm the column mapping (it guesses for you), and get a results screen with created / conflicts / skipped counts
  • ✓Review possible duplicates in the Conflict queue side by side and resolve each one: merge, keep both, or discard
  • ✓See past imports with their results on the Import page
  • ✓Open Queue preview in the workspace admin tools and see the exact ordered call list a rep would get right now, with excluded contacts and reasons
  • ✓Click Start calling, pick a campaign, hit Go, and work the queue: log no-answers with one key (A), log conversations with a disposition and a note, and watch the queue advance automatically
  • ✓Log a Warm Follow-Up and pick the exact day and time the contact should come back
  • ✓Mark someone Remove Per Request and watch them exit everything, permanently
  • ✓Add a referral mid-call with context on who vouched for them
  • ✓Open Dispositions in admin tools and create a custom disposition with its own automation, no engineering
  • ✓Sign in as rep@smartbound.ai and see the rep's view: only their campaigns, no admin tools
  • ✓Sign out and confirm the app locks itself
  • ✓On a connected call, upload the call recording and hit Analyze: the AI transcribes it, suggests the right disposition (pre-selected, one press to accept), drafts the call notes, and tags the conversation
  • ✓If the prospect referred someone on the recording, the referral form comes pre-filled with their name and title; one click adds them through the duplicate check
  • ✓Open Campaigns in admin tools and define listening tags per campaign: concepts like competitor mentions or budget talk the AI listens for on every analyzed call
  • ✓Add a manual tag to any contact right from the rep screen
  • ✓When a warm follow-up connects, the last conversation's notes pop up automatically on the contact card
  • ✓Open Contacts and views, filter every contact by campaign, status, step, disposition, tag, or date added, and save any filter as a named view (contacts never move; a view is just a saved filter)
  • ✓Open Reports and see dials, connects, connect rate, meetings, follow-ups set and held, bad-data volume, and nurture adds per campaign and per rep, with a date range picker
  • ✓Open the Nurture list, see who is callable now vs cooling down, and download the client-ready CSV in one click
  • ✓Reassign a campaign to another rep from the Campaigns screen: one change, follow-ups travel with it, and the handoff is logged
  • ✓Open Numbers and dialing in admin tools: connect Telnyx, see the account balance, search numbers by area code, and (once the $50 is loaded) buy a caller ID and run the answer-timing test
  • ✓Open https://smartbound-platform-staging.onrender.com: a full second copy of the platform where UI changes appear first. Nothing on the real app changes until Kevin approves what he sees on staging
  • ✓See the new Smartbound look on staging: dark navy top bar with gold underline on the active section, brand fonts and colors matched to www.smartbound.ai, and one navigation bar shared across every workspace page
  • ✓See UI redesign stage 2 on staging: the calling screen's Up next rail now shows live status chips (gold 'Up now' pulse on the current contact), all primary buttons are brand gold, and the Contacts table has status chips, a sticky header, and hover rows
  • ✓Share any recorded call with a link (staging): after logging a call that had a recording, the confirmation banner shows 'View recording' and 'Copy share link'. The link opens a clean public page - prospect name, title, company, time, phone, audio player, disposition, and the AI summary - that anyone can open without logging in. Recordings now live in permanent cloud storage, so links never break
  • ✓See UI redesign stage 3 on staging: the calling screen is now three panels - the queue on the left, a full prospect detail card in the middle (Details and History tabs, all CRM fields laid out cleanly), and a dedicated Log call panel on the right that stays put while you scroll. Cmd+Enter logs a call straight from the note box, and the disposition list is focused the moment you press Connected
  • ✓Import large CSVs much faster (staging): the importer now checks duplicates with a few bulk queries and writes contacts in batches instead of row by row - a 2,000-row file that took ~2.4 seconds of database work now takes ~1 second locally, and the gap grows with file size and network distance. Duplicate detection behavior is unchanged and verified identical
  • ✓See click-to-call on the calling screen (staging): a gold Call button on the prospect card that dials through the headset, with live Dialing / Ringing / On the call states, a talk timer, Mute, and Hang up. On staging it shows why calling is unavailable there (staging deliberately has no Telnyx key); real dialing goes live on production once the $50 is loaded and a caller ID is bought
  • ✓Set each campaign's Call recording policy on the Campaigns screen (staging): Off, One-party states only, or Every call. The one-party rule reads the contact's area code and never records contested states, unknown area codes, or non-US numbers. Every change is logged permanently. Recording stays Off everywhere until the attorney consent review clears it for real prospects
  • ✓Start a power dialing session on the calling screen (staging): live dials / connects / talk time / session clock, a cancellable 3-second countdown between calls, Pause, Resume, and End session with the final tally. Without a working phone it pauses itself and says why; the auto-dial itself goes live with the Telnyx funding
  • ✓Open Number health on the Numbers page (staging): per-number dials, connects, connect rate, editable daily caps with a health chip, and the caller ID reputation checklist (Free Caller Registry registration, spam-label spotting, when branded caller ID is worth it). Dialing rotates across numbers automatically and refuses politely when every number is capped
  • ✓Record your call screener openers on the calling screen (staging): open the Call screeners panel, record your name in your own voice, preview it, and star your default. On a live call (once Telnyx is funded), one press of O plays it to the screener so you never have to answer 'who may I say is calling?' yourself
  • ✓Session 8 dialer polish (staging): a keypad on live calls for phone menus, Redial after a call ends, a Callbacks forwarding number on the Numbers page so prospects who call back reach you, Audio settings with mic and speaker tests on the calling screen, per-campaign phone priority (which number type gets dialed first) on the Campaigns screen, and your custom CSV columns on the contact card
  • ✓See the reputation watchdog on the Number health table (staging): a Reputation chip per number (clear / watch / flagged / benched), a Run check now button, and Bench / Un-bench controls. A number whose connect rate craters against your other numbers gets benched from dialing automatically - the practical tell of a carrier spam label - and every action is logged with its reason
  • ✓See exactly one gold underline in the top nav on every page (the double-highlight on Reports is fixed)
  • ✓Press Connected and see the reworked disposition panel (staging): Right Number Wrong Time sits right under Keep in Queue, and Remove Per Request (DNC) is a red two-step confirm button under the note instead of one click in the list
  • ✓Log Right Number Wrong Time and see it boost the contact to the top of the next session WITHOUT counting as a connect anywhere: reports, the session counter, and follow-ups-held all stay honest
  • ✓See company numbers excluded from dialing by default, with a Company numbers on/off toggle on the dial screen for one session at a time, and a plain-English reason in Queue preview for contacts with only company lines
  • ✓Log Good No / Nurture and pick Standard (90 days) or a Custom later date; too-soon dates are rejected with a pointer to Warm Follow-Up, and the contact rests until their exact date
  • ✓See and control the outbound caller ID on the dial screen: pin one number or rotate automatically every 1/5/10/20 calls, with benched and capped numbers visibly unavailable
  • ✓Focus a dial session on chosen US time zones with the ET/CT/MT/PT pills in the dial screen header; contacts without a stored timezone get one from their phone's area code
  • ✓Click any contact name (Contacts list or Follow-up queue) and see their full card: every campaign, dials, connects, dispositions, notes, tags, recordings, and a DNC banner when they asked out
  • ✓See Tags across campaigns on the Reports page: contacts, connects, and meetings per tag, lifetime, with one-click drill-down to the tagged contacts
  • ✓See the Overview grouped into Daily work and Setup, with follow-ups no longer buried at the bottom
  • ✓Get the Quick audio check popup (mic + speaker pickers with real tests) every time a power dialing session starts
  • ✓Open the Follow-up queue (was Nurture list): Active now vs Waiting with counts, both warm follow-ups and nurture holds in one list, each with the exact date it goes live
  • ✓Open /all as the admin: every campaign and every rep across all your workspaces on one screen, with totals and a date filter (reps cannot open it)
  • ✓After staging deploy: every Orum and Apollo call lands in the CRM automatically (once env vars + mappings are set)
  • ✓Give any client a personal Claude connector URL (mint-api-key.ts) so they can ask questions about their own call data — hard-walled to their workspace
  • ✓On staging, a browser call stays tied to the exact prospect and phone number dialed even if the rep changes queue filters before the call ends
  • ✓Point a CSV import at a campaign: one dropdown on the Map columns step ('Add everyone in this file to a campaign'), and every contact the import creates starts that campaign at step 1. Rows that land in the conflict queue join the campaign automatically when you resolve them with merge or keep both. Do-not-call contacts are never added
  • ✓Pick individual contacts on the Contacts page (checkboxes plus a Select page box), choose a campaign, and click Add to campaign. The result reads back exactly what happened: how many were added, how many were already in it, and how many were skipped because they are on the do-not-call list
  • ✓Click Add prospect on the Contacts page and type one person in by hand: name, title, company, email, phone, and the campaign to start them in, all in one window. Duplicates are caught as you go: if the email or number already belongs to someone, you get their name and a one-click link to their card instead of a duplicate contact. The prospect's timezone is set automatically from their phone's area code
  • ✓Reps get the same Add prospect button on their Start calling screen: they type the person in and pick which of their own active campaigns to start them in (the campaign is required there, so the prospect always lands in a queue the rep can dial). Sign in as rep@smartbound.ai to see it
  • ✓Dial the contacts you import or add by hand: campaigns with the default settings now serve unverified numbers in the queue, refusing only numbers actually known to be bad (wrong number, disconnected, DNC, identity mismatch, or compliance block). Campaigns switched to verified-numbers-only keep the strict verification gate from the pilot
  • ✓Trust the campaign card on Start calling: the 'due right now' number is now the real queue count, with 'in play' shown separately, so the card and the dial screen always agree
  • ✓When the queue is clear, see exactly where everyone is: the Queue clear screen now lists counts by reason (waiting for their scheduled time, outside their calling window, no callable number, and so on) instead of a dead end
  • ✓When Add prospect catches a duplicate, fix it in one click: the error now offers 'Add [name] to the campaign instead', which puts the existing contact into your chosen campaign without creating a duplicate
  • ✓Disposition check was removed from the app on 2026-08-04: the dialer's built-in post-call AI analysis covers the same job. The code stays in the repo if it is ever wanted back
  • ✓Place a real recorded call on production and get the instant AI analysis (verified live 2026-08-04): the Telnyx account is funded ($102), the caller ID +1 619-853-8376 is active, and the production restart fixed the missing Deepgram key that blocked the AI panel during Kevin's first live-fire QA
  • ✓Recording now defaults to Every call (both sides) on every campaign, new and existing (Kevin's decision 2026-08-04, aware of two-party state law). Turning it down is a per-campaign choice on that campaign's Settings tab, and every change still lands in the permanent audit log (staging)
  • ✓Click Campaigns and see an actual list: name, status, owner, active contacts, and the recording policy per campaign. Click any campaign to open its own page (staging)
  • ✓Each campaign now has its own page with an Overview tab (contact counts by stage, owner) and a Settings tab holding everything that configures it: call recording, phone priority, listening tags, and reassign owner (staging)
  • ✓Open the new Settings tab in the top nav (admins only): calling defaults, plus one-click paths to Dispositions, Numbers and dialing, and Queue preview (staging)
  • ✓Share any recorded call the moment the AI finishes listening (staging): a 'Share this recording' box appears right under the disposition list with two buttons, Open recording (new tab, Orum-style public page with the audio player) and Copy share link. The link works before the call is even logged and stays the same link after logging, so it can be pasted to anyone immediately
  • ✓See the redesigned app shell on staging: a navy identity bar with the client switcher, search and your account menu, and a separate white tab strip below it carrying the nine sections. Settings and Clients moved into the avatar menu.
  • ✓Switch between clients from any page on staging using the switcher in the top bar, instead of going back to the workspace list.
  • ✓Read Campaigns as cards on staging, each showing how many contacts a rep could actually dial this minute next to how many are active, both from the same queue engine the dial screen uses, plus a sentence explaining the gap.
  • ✓See one consistent look across Overview, Campaigns, Contacts, Follow-ups, Phone numbers and Import on staging: one page header, one card, one table, one empty state. The old bg-white and raw colour screens are gone from those six.
  • ✓Set a campaign's calling window yourself: open Campaigns, click a campaign, open the Settings tab, and pick the days plus the start and end time. It saves the moment you change it, it tells you in plain English what the setting means in the contact's own local time, and it refuses a window with no days or an end before the start instead of quietly emptying the queue. The panel above it says how many contacts are callable this minute, and when nobody is, it says why and roughly when the window opens again. No more database change to call an east coast list or run an evening session.

Phase 2: Power Dialer (Telnyx)

1 of 9 sessions · 11%
✓

Session 1: Deploy to Render + public dashboard

Done
  • The platform is live on the internet at smartbound-platform.onrender.com: web service + its own Postgres database on Render, in the same Oregon region as every other SmartBound service
  • All secrets (Telnyx, Deepgram, Claude, Render, session key) stored in Doppler and wired into the service environment - no dashboards needed
  • Database migrated and seeded; every future deploy runs migrations automatically before going live, so the app and database can never drift apart
  • The live login uses a strong generated password (in Doppler as PLATFORM_ADMIN_PASSWORD), not the guessable local demo one
  • Pushing to GitHub deploys automatically; the /status health check keeps Render honest about whether the app is actually up
  • Verified in a real browser: live status page, login with the new password, workspace with seeded demo data
2

Session 2: Telnyx wiring + answer-timing experiment

Blocked
  • Telnyx connected with one click: calling profile, the call application, and webhook security keys all set up automatically. The button reports the live account balance
  • Every call event Telnyx sends is checked for a forged signature and logged permanently. Fake or unsigned events are rejected and never touch the data (verified with real forged requests)
  • New Numbers and dialing admin screen: see the Telnyx connection, search available numbers by area code, and buy an outbound caller ID with one click (about $1 a month)
  • The answer-timing experiment is a button: paste in phone numbers the team controls, the system calls each one, measures how fast the carrier reports ringing and answer, and shows per-call results plus averages. This is the roadmap's Oliver experiment, automated
  • Answered test calls hang up by themselves the moment the measurement lands, so a test barely interrupts anyone
  • 7 new automated tests including real forged-signature attacks; 88 total pass
  • Found and fixed during verification: the login wall was blocking Telnyx's events (they now pass through with their own signature security), and two Telnyx account quirks that only show up against the real API

Blocked: Built and verified except the live-fire step. Waiting on the Telnyx $50 top-up, then: open Numbers and dialing, buy a number (about $1), and run the answer-timing test.

3

Session 3: Click-to-call, browser audio

Blocked
  • A gold Call button now sits right on the prospect card in the calling screen. One click dials the contact through the rep's headset - the browser is the phone, no desk phone, no cell
  • Live call controls while on the line: a status pill (Dialing, Ringing, then On the call with a running timer), a Mute toggle, and a red Hang up button
  • Each rep's browser gets its own private phone line credential behind the scenes, created automatically the first time they open the calling screen. Verified against the real Telnyx account
  • The real call duration now drives the logging rules: a call that never gets answered logs itself as No Answer with zero clicks, a pickup under the campaign threshold logs itself the same way, and a real conversation opens the disposition bar with the true duration locked in
  • The manual duration buttons (Under 10 sec / About a minute / 5+ minutes) disappear when a real call happened - the system knows exactly how long it was
  • Every real call's Telnyx call ID is stored on the dial record, so Phase 2's recording and AI sessions can find the call later
  • If browser calling is not available - Telnyx not connected, no caller ID bought yet, microphone blocked, connection dropped - the screen says exactly why in plain English and the manual logging flow keeps working untouched
  • 12 new automated tests on the call-outcome rules; 100 total pass. Both dialer states verified in a real browser: the browser phone registered with Telnyx for real, and the no-caller-ID message shows when the workspace owns no number

Blocked: Built and verified except live dialing, which is gated on the same Telnyx $50 top-up as session 2. Once the $50 is loaded and a caller ID is bought on the Numbers page, click Call on the rep screen and we verify a real conversation end to end.

4

Session 4: Recording + instant AI

Blocked
  • Every campaign now has a Call recording setting on the Campaigns screen: Off (the default), One-party states only, or Every call. One click, saved instantly, and every change is written to the permanent activity log with who flipped it and when
  • The one-party rule is enforced by the contact's actual phone number: the system maps the area code to a US state and only records where one person's consent is enough. Contested states, unknown area codes, and non-US numbers are never recorded - the system always errs on the side of not recording
  • When a dialer call is answered, the compliance decision happens in that instant and the rep sees it on screen either way: a red Recording dot with the reason, or Not recorded with the reason
  • Recorded calls are captured in dual-channel (rep on one side, prospect on the other), which is exactly what the transcription engine reads best
  • The moment a recorded call ends, the recording flows through the same AI pipeline as a manual upload with zero clicks: the suggested disposition pre-selects itself, the notes draft themselves, listening tags land on the contact, and any referral heard pre-fills the referral form
  • The rep screen says what the AI is doing: a gold panel while it listens (about half a minute), and a plain-English message if the analysis was skipped or failed - never a silent nothing
  • Recordings of calls under the conversation threshold are not analyzed, so the AI spend only happens on real conversations
  • 11 new automated tests on the consent rules and area-code mapping; 111 total pass. The recording toggle verified end to end in a real browser including the audit trail in the database

Blocked: Built and verified except the live recorded call, which needs the same Telnyx funding chain as sessions 2 and 3: load the $50, buy a caller ID, place a real call with recording turned on for a test campaign. Recording real prospects additionally waits on the attorney's consent review - that gate is Kevin's, not the platform's.

5

Session 5: Power dialing (auto-advance)

Blocked
  • A Power dialing panel now sits above the queue on the calling screen: one button starts a dial session, and the queue works itself in order from there
  • Live session stats on screen the whole time: dials, connects, talk time, and a running session clock. The counters update in the same database transaction as each call log, so the numbers can never drift from the truth
  • Auto-advance: after each logged call, a visible 3-second countdown fires the next dial. No-answers and short calls advance with zero clicks; picking a disposition on a real conversation fires the next dial
  • The countdown is always cancellable, Pause and Resume work mid-session, and End session closes it with the final numbers. A session survives a page reload with its stats intact
  • When the queue runs dry the session ends itself and shows the final tally on the Queue is clear screen
  • The session is deliberately dumb: WHO gets called stays the queue's decision, WHAT happens after a call stays the trigger engine's. The dialer is just the arm - the design rule that keeps Phase 3 parallel dialing a swap, not a rewrite
  • If the browser phone is unavailable (no caller ID yet, mic blocked, connection down), the session pauses itself and says exactly why - manual logging keeps counting into the same session stats
  • Every session start and end lands in the permanent activity log with its stats, ready for the Reports screen
  • 13 new automated tests on the session engine; 124 total pass. The whole lifecycle verified in a real browser: start, auto-pause with the honest reason, manual log incrementing the live counters, reload survival, resume, end, and the database audit trail

Blocked: The engine, controls, and stats are built and verified; the one thing that cannot fire yet is the actual auto-dial, which is gated on the same Telnyx funding chain as sessions 2-4 (load the $50, buy a caller ID). The moment a real call works, power dialing works.

6

Session 6: Number health + hardening

Blocked
  • The Numbers page now has a Number health dashboard: per caller ID, dials in the last 24 hours against its cap, dials and connects over 7 days, connect rate, and a health chip (healthy / near cap / capped)
  • Per-number daily dial caps are enforced: dialing always rotates to the least-used number in the last 24 hours, numbers at their cap sit out, and when every number is capped the dialer refuses with a plain-English explanation instead of burning a number's reputation
  • The cap is editable inline on the dashboard (10 to 1,000 a day) and every change lands in the permanent activity log
  • All usage numbers are derived from the permanent Telnyx event log rather than a second set of counters, so the dashboard can never disagree with what actually happened on the wire
  • STIR/SHAKEN spelled out on the dashboard: numbers bought through the platform are Telnyx-owned, so every call is signed at level A (full attestation) automatically - nothing to configure
  • A Caller ID reputation checklist for Kevin: register each number at the Free Caller Registry (free, ~10 minutes, covers the three big carrier analytics firms), what to put on the registration, how to spot a labeled number by its sliding connect rate, and when branded caller ID becomes worth paying for
  • 12 new automated tests on rotation, caps, and health grading; 136 total pass. Dashboard, cap editing, the audit trail, and the capped-dialer refusal all verified in a real browser against seeded data

Blocked: The full end-to-end verification pass of every Phase 2 flow - a real call, recorded, analyzed, auto-advanced, counted against a real number's cap - is the last piece, and it needs the funded Telnyx account. One $50 top-up unblocks the live verification of sessions 2 through 6 in a single sitting.

7

Session 7: Screener openers (manual v1)

Blocked
  • A Call screeners panel on the calling screen, modeled on Orum: record openers in your own voice right in the browser, preview them, name them, star one as the default, and remove them (with an are-you-sure step)
  • The recorder is built into the page: press Record, say your name, press Stop, listen back, save. No files, no uploads, no other apps. Recordings are stored in the same permanent cloud storage as call recordings
  • During a live call, one press of the O key (or the Play opener button) plays your default opener into the call - the screener hears your recorded name and you never have to speak
  • The first opener you record becomes your default automatically; openers belong to the rep and follow them across workspaces
  • Every miss is said out loud: microphone blocked, nothing recorded, no opener saved yet, opener too long - each shows a plain-English message
  • Daily dial caps tightened to Kevin's 20-40 band (2026-07-07): new numbers default to 30 a day, the cap editor allows 10 to 100, and rotation keeps spreading the load automatically
  • 6 new automated tests on the audio encoding; 142 total pass. Panel, recorder states, and the blocked-microphone path verified in a real browser

Blocked: Recording and managing openers works today, including on staging. The one step that needs the funded Telnyx account is the live playback: pressing O on a real call. Same $50 gate as everything else; Kevin should also record his real opener with his own headset once staging deploys.

8

Session 8: Dialer polish (DTMF, redial, callbacks, devices, phone priority, custom fields)

Blocked
  • Keypad on the live call: a dial pad appears next to Mute during a call, so phone menus (press 1 for sales) are one tap instead of a dead end
  • Redial: after a call to a contact ends, the Call button relabels itself Redial for that number
  • Callback forwarding: a Callbacks setting on the Numbers page. When a prospect calls back one of your caller IDs, the call forwards straight to that number - your cell, most likely. Empty means callbacks ring out, exactly as before
  • Audio settings on the calling screen: pick your microphone and speaker, test the mic with a live level bar, test the speaker with a tone through the chosen output. The choice is remembered on that computer
  • Phone priority per campaign on the Campaigns screen: choose which of a contact's numbers gets dialed first (mobile, direct, or company, in any order). Verified numbers always beat unverified ones regardless of the order
  • The contact's custom CSV columns now show on the calling screen's Details tab, up to 12 fields, exactly as imported
  • 2 new automated tests on the phone priority rules; 144 total pass. Verified live in a real browser: flipping a campaign to direct-first changed which number the queue dialed for a contact with both types, flipping back changed it back; the callback number saves and normalizes; custom fields render on the card

Blocked: The keypad, redial, and callback forwarding involve live calls, so their on-call behavior verifies with the same Telnyx funding chain as everything else. Everything screen-side is verified and live on staging.

9

Session 9: Number reputation watchdog (spam-flag detection)

Blocked
  • The watchdog: every number's connect rate is compared against the rest of its workspace's fleet. A number that falls below half the fleet's rate over enough dials gets flagged - that pattern is the reliable symptom of a carrier spam label - and is benched from rotation automatically before it burns more dials
  • Benching is automatic, un-benching is deliberately human: an Un-bench button on the Number health table puts a number back in rotation, and admins can also bench a number by hand (with an are-you-sure step). Every bench and un-bench lands in the permanent activity log with its reason
  • A Reputation column on the Number health table: clear, watch, flagged, benched, or no data yet - hover any chip for the full explanation with the actual numbers
  • The watchdog refuses to guess: numbers with too few dials, fleets too small for a baseline, and lists where nobody connects all read 'no data yet' instead of a false alarm
  • Run check now button on the dashboard, plus a locked scheduler endpoint so checks can run automatically 1-3 times a day once the secret is set on Render
  • External paid checkers (like Icehook Scout) have a ready plug-in slot: when Kevin buys API access, results flow through the same pipeline - same chips, same auto-bench, same audit trail
  • 10 new automated tests on the detection rules and bench-aware rotation; 154 total pass. Verified end to end in a real browser with seeded data: a sick number (2% connect vs the fleet's 15%) was flagged and benched by one click of Run check now, dialing then refused with the plain-English watchdog reason when everything was benched, and Un-bench put the healthy number straight back to work

Blocked: The detector needs real dial volume to have anything to judge, which starts when the Telnyx account is funded and QA begins. Setting up the scheduled 1-3x daily run on Render (one env var + one cron job) happens then too, along with Kevin's decision on buying an external check API (research delivered: ArmorHQ-style ground truth cannot be self-served; Icehook Scout is the recommended paid proxy).

Phase 3: Parallel Dialing (the bridge)

0 of 3 sessions · 0%
1

Session 1: The bridge (rep parks, calls come to your ear)

Blocked
  • Bridge mode on the calling screen: check 'Bridge mode (experimental)', start, and your browser phone parks into a conference - the panel shows 'Parked - your ear is live'. From there the system places the calls server-side; you never dial
  • One-second live status: Dialing, Ringing, then On the call with a running timer, straight from the carrier's own events
  • A human answers: joined to your ear near-instantly, recording compliance decided in the same moment. A machine answers: hung up and logged with zero clicks - voicemail auto-advance is born here. A call that ends without a conversation logs itself
  • When a conversation ends, the disposition panel opens with the carrier-true duration locked in, pinned to the contact who was actually on the call - a queue reshuffle mid-call can never log against the wrong person (a real bug the browser walkthrough caught before launch)
  • The Numbers page gained a Bridge parking number card: one click, about $1 a month, never shown to prospects, invisible to rotation and the watchdog
  • A bridge session survives page reloads and resumes exactly where it was
  • 13 new automated tests on the leg state machine; the whole lifecycle walked in a real browser against simulated carrier events

Blocked: One step left: a live call through the bridge to prove voice quality equals the direct path. First item on QA day, right after the caller IDs and parking number are bought.

2

Session 2: The fan-out (2-3 lines race, first answer wins)

Blocked
  • A Lines picker (1, 2, or 3) next to the bridge checkbox: 1 is single-line with voicemail auto-advance, 2-3 makes the calls race - first human to answer wins your ear, the other lines cancel the same moment
  • The race has a referee: exactly one answered call can ever claim the rep, enforced atomically. A human who answers a losing line by a photo finish is hung up fast, counted loudly as an abandonment on screen ('keep this number tiny'), and logged honestly
  • Cancelled lines that were already ringing count as dials (the prospect saw a missed call); lines the carrier never rang vanish without a trace
  • The server fills the lines from the top of the queue itself - the queue stays the only brain deciding who gets called
  • Per-line status rows on the session panel, Orum-style: each racing call with its contact name, state, and live talk timer
  • When a whole round ends with nobody answering, one banner summarizes it and the queue advances - no click spam
  • 6 new automated tests on the race rules (cancellation, abandonment, line fill); 173 total pass. The guard chain verified in a real browser: parked session, fan-out fired, refused with the plain-English reason when no caller ID exists, session paused itself with Resume waiting

Blocked: The race itself needs real carrier timing to verify - that is session 3's whole job, and it starts the moment QA day produces live calls through the bridge.

3

Session 3: Hardening + launch pass

Not started

Phase 1: Campaign/CRM EngineComplete

8 of 8 sessions · 100%
All 8 sessions shipped — click to see what each one delivered
✓

Session 1: Scaffold + schema + status page

Done
  • Next.js app scaffolded with the full project structure
  • PostgreSQL database created locally with all 7 core objects (Workspace, Contact, PhoneNumber, Campaign, CampaignMembership, Activity, Trigger) plus users, workspace access, dispositions, and the phone number audit log
  • Login with email and password, admin and rep roles, all pages locked behind login except /status
  • The 9 default SmartBound dispositions seeded with their trigger actions
  • Demo Workspace seeded: 2 logins, 12 fake contacts with phone numbers, Demo Outbound campaign with an 8-step cadence, and the Nurture campaign
  • The /status build progress dashboard, no login required
  • Verified in a real browser: status page, login, wrong-password error, home page, sign out
✓

Session 2: Import + dedupe

Done
  • CSV upload with a column mapping step that auto-guesses what each column means
  • Normalization of emails, phone numbers (to E.164), and LinkedIn URLs so formatting differences never hide a duplicate, with unit tests
  • Dedupe on import: email or LinkedIn match blocks the row, phone match flags it for review, all collisions go to the Conflict Queue
  • Conflict Queue screen: side-by-side comparison with the matching value highlighted, resolve with merge / keep both / discard
  • Merge fills gaps and adds new numbers but never overwrites existing data; every resolution is logged and the incoming data is kept forever
  • Import history with per-row notes for skipped rows and invalid values
  • Verified end to end in a browser with a messy test file covering every path
✓

Session 3: Membership state machine

Done
  • Every rule for what happens to a contact after a call, written as pure logic with no shortcuts: step advancement, exhaustion, keep in queue, warm follow-ups, missed follow-up return, priority boost set and clear, exits, DNC block, waterfall re-entry
  • 25 automated tests covering all six spec-required behaviors plus edge cases; 33 tests total now pass in the project
  • DNC is enforced as truly permanent: the machine refuses every operation on a DNC'd contact, including waterfall reactivation
  • Broken campaign setups fail loudly instead of corrupting state silently
  • Engine only this session: nothing new is clickable yet. The rep screen (session 5) is where this machine becomes visible
✓

Session 4: Queue generation

Done
  • The computed call queue: follow-ups due first (in time order), then priority boosts, then warm contacts by step, then cold contacts by step and wait time
  • Calling windows enforced against each contact's own timezone; contacts with no timezone are only callable when the window is open on both US coasts at once, so nobody gets a 6am call
  • Filters: workspace DNC list always, Not a Phone Lead suppression, dead numbers, verified-only campaign setting, nurture cooldown
  • Every excluded contact is listed with the exact reason, nothing disappears silently
  • 19 new automated tests with fixture contacts across New York, LA, London, and missing timezones; 52 tests total pass
  • New Queue preview screen in admin tools: pick a campaign and see exactly who a rep would call right now, in order, plus the exclusion list
✓

Session 5: Rep screen shell

Done
  • The rep screen: pick a campaign, hit Go, and the system serves contacts one at a time in queue order. No list building anywhere
  • Contact card with phone number, title, company, tags, timezone, prior-conversation context for warm contacts, and the full activity history
  • Manual call logging: No answer is one press (A key); Connected opens the disposition bar (C key)
  • The 10-second rule enforced: any call logged under the campaign threshold is auto-dispositioned as No Answer / Not Connected, no questions asked
  • All 9 dispositions as buttons with single-key shortcuts, Keep in Queue pre-selected, optional call notes
  • Every log writes the full paper trail: dial, disposition, state changes, and notes in the activity log; phone dial/connect counters update
  • Interim until session 6: every conversation outcome advances the cadence; the disposition-specific automations (exit, schedule follow-up, DNC) come with the trigger engine. The screen says this on an amber banner
  • Verified in a real browser: missed warm follow-up, keyboard-selected disposition with note, under-threshold auto-disposition, and the rep-role view (own campaigns only, no admin tools)
✓

Session 6: Triggers + disposition admin

Done
  • The trigger engine: every disposition now fires its real automation from the fixed 13-action menu. The session 5 interim behavior and its amber banner are gone
  • Warm Follow-Up opens a day/time picker; the contact parks until that moment, then surfaces at the top of the queue
  • Meeting Scheduled exits the campaign and asks for the meeting date; Good No moves the contact to the Nurture campaign automatically
  • Remove Per Request flags the contact do-not-call workspace-wide, permanently, and exits them from every campaign at once
  • Wrong Number marks the number bad, files a verification request, and drops the contact from the queue until better data arrives
  • Right Number Wrong Time resurfaces the contact at the top of the queue after a delay (2 hours by default, configurable)
  • Referral widget on the rep screen: name, number, context, pick a campaign; goes through the duplicate check and lands as a warm contact with who vouched for them
  • Dispositions admin screen: create or edit dispositions with plain-language definitions and actions from the fixed menu, zero engineering. Keep in Queue is protected from deletion
  • 10 new automated tests on the trigger engine; 63 total pass. Every path also verified in a real browser and the database
✓

Session 7: Transcription pipeline

Done
  • The full AI call pipeline: upload a recording on the rep screen, Deepgram Nova-3 transcribes it, Claude reads it against the campaign's disposition definitions and listening tags
  • The AI suggests a disposition and pre-selects the button; one press to accept, or pick another. Unknown suggestions never guess, the rep just picks
  • Call notes drafted automatically from the recording, fully editable before logging
  • Listening tags: admins define per-campaign concepts (competitor mentions, budget talk) on the new Campaigns admin screen; the AI tags matching conversations and the tags land on the contact automatically
  • Referral extraction: if the prospect names someone on the call, the referral form comes pre-filled with their name and title, one click to add them through the duplicate check
  • Manual tags: reps can tag any contact anytime from the rep screen
  • Follow-up context surfacing: when a warm contact connects, the prior conversation's notes show automatically
  • Recording uploads up to 25 MB; failures are stored with the reason and shown to the rep, never silent
  • 9 new unit tests on the AI response interpretation; 72 total pass. Full path verified in a real browser with a real recording: suggestion, notes, tags, referral, and the database trail
✓

Session 8: Admin + reporting

Done
  • Contacts and views: one screen with every contact, filterable by campaign, status, step, disposition ever logged, tag, and date added
  • Saved views: name any filter and it sticks as a one-click chip. Contacts never move anywhere; a view is a saved filter, so there is nothing to maintain and no folders to clean up
  • Campaign reassignment: hand a campaign to another rep in one change from the Campaigns screen. Follow-ups and the whole queue travel with it, contact history stays intact, and every handoff is logged
  • Reports: dials, connects, connect rate, meetings, follow-ups set and held, bad-data volume, and nurture adds, per campaign and per rep, over any date range, all derived from the append-only activity log
  • Dispositions report keeps automatic no-answers separate from rep-chosen dispositions so the numbers read honestly
  • Nurture list: right-fit accounts wrong timing, with callable-now vs cooling-down status per the workspace's 45-day rule, and a one-click client-ready CSV download
  • Import history was already live from session 2 and stays as is
  • 9 new unit tests on the reporting math; 81 total pass. Every screen verified in a real browser against the demo workspace's real activity