Camellia's voice agents: how they drifted from the repo

Full audit for the two #alerts this morning: which original piece of work caused each drift, why it happened, why it's not fixed in code yet, and what's still missing so it can't quietly happen again.

Written 2026-08-28 · read-only investigation, four research passes plus two independent verification passes · nothing in this doc has been applied to production

Alert 1 duplicate tools — 156 tools, 37 duplicated names, 92 to remove Alert 2 stale renewal call script — one live agent, one week+ behind Customer impact found none confirmed Fixes ready to run 2, both waiting on a person Pipeline-wide 2 agents with zero update path, phone-numbers is the one lane that fixes itself

1 — What happened, the 60-second version

Both alerts trace back to the same root cause: nobody is currently pushing every kind of update from the code to Camellia's live phone agents. One bug caused a pile of duplicate tools; a separate, deliberate pause caused a real wording fix to never reach one call script. Both fixes already exist and are tested — they're just sitting there.

Camellia is the one property with real paying tenants on the phone with Clara. On Aug 23, by Fede's explicit order ("no voice changes in Camellia production until I test everything"), the automatic pipeline that pushes code changes onto Camellia's live agents was deliberately switched off — documented in the code and the drift checks adjusted to match — while the Willows test fleet was built out. Since then, updates to Willows ship automatically on every merge. Updates to Camellia wait for the hand-run job. What was never scheduled is the "un-freeze once tested" step — so approved fixes have accumulated for five weeks. The freeze worked as designed; it just has no expiry.

That gap produced two different symptoms this week:

2 — How the sync pipeline is supposed to work — and where it's broken

The path from a code change to a caller's ear, and back to the nightly checks. Solid black = happens automatically today. Dashed orange = only happens if a person remembers to run it by hand. Dashed red ending in a mark = the path used to exist and was cut.

cut off since Aug 23 — Camellia gets nothing from this path manual only — last run Aug 15 Repo config files (the approved source of truth) Automatic push on every merge tools, wording, transfers, turn-taking, language, voice delivery (the tool-counting bug lived here, fixed Aug 27) Phone-number routing automatic, double-checked the one surface done fully right Renewal call-script push a one-off button, not a pipeline this morning's alert #2 Willows (test fleet) gets every change, automatically, same day no real tenants on it Camellia (live fleet) real tenants on it — frozen since Aug 23 only phone-number routing keeps landing automatically Never tracked in code at all • which voice/model callers hear • whether a transfer requires the receiving person to accept first • the webhooks that fetch a caller's name/unit before Clara answers (true for every agent, both fleets) Nightly + per-PR drift checks compares live agents to the repo This morning's two #alerts both fixes below are ready and waiting
automatic today manual button only cut off / severed path

One correction the checks themselves needed: because Camellia is frozen, two of its drift checks (wording and turn-taking) were changed to compare the live agent against a snapshot taken at freeze time, instead of against the current repo. That stopped them from permanently crying wolf — but it also means they can no longer catch "a real approved fix never shipped," only a rogue dashboard edit. That's part of why alert #2 wasn't caught earlier by that particular check; it was caught by the separate wording-specific check instead.

3 — The pipeline's track record: who gets updates, and how often the safety nets themselves trip

Who actually gets updates when code changes

Property / agentHow it gets updatedLast time it actually happened
Willows (test property, no real tenants)Automatically, every time code mergesSame day as every merge
Camellia (real tenants) — everything except phone routingSomeone has to run a manual job and type an exact confirmation phrase to prove they mean itNot run once in the last 30 days
Camellia — which agent answers which phone numberAutomatic, and the only lane that also fixes itself overnight if it driftsChecked, and repaired if needed, every night
Renewal call script (all properties)Manual button only — see incident 2 belowAug 15
Vendor-outreach agent and the after-hours emergency-relay agentNo update path exists at all. Merging a wording change does nothing to these two live agents — the only automatic thing running against them is a check every 6 hours that notices they're out of date and complains. Nothing then fixes it.N/A — has never auto-updated

Phone-number routing is the one lane built the way every other lane should be: it pushes automatically and repairs itself overnight if it ever drifts, with nobody having to notice or act. Every other lane either needs a person to remember a manual step, or has no path to production at all. That's the single clearest thing to copy elsewhere.

How often the safety nets themselves have been tripping

Over the last 30 days: the nightly check that compares every live agent against the repo failed on 7 separate nights. The 6-hourly wording-mismatch check failed 6 times (3 of those were today, for incident 2 below). The automatic push-to-Willows job itself failed 3 times on Aug 26 — one broken tool wiring sat live and wrong for roughly 19 hours before the next nightly check caught it, because nothing else was watching in the gap between checks.

This isn't the first time — two earlier incidents left their own write-ups in the code

Both write-ups live as comments in the code itself, next to the fixes that came out of them — the same place this week's two incidents will end up once they're closed.

4 — Timeline of how the drift built up

WhenWhat happened
2026-07-10A code change adding two new call-handling agents at once exposes an older bug: the tool-setup script doesn't remember what it already created earlier in the same run, so it mints one duplicate tool per agent. Cleaned up at the time.
2026-07-19A throwaway test copy of the leasing agent is built the wrong way, creating 15 stray tools. The next full-fleet sync then grabs the newest copy of each tool and re-points 7 live agents onto the stray copies. Caught and fixed same day.
2026-08-22, 6:16amSomeone runs the cleanup tool for real. Result: 64 tools, 1 duplicate name — the last confirmed-clean state.
2026-08-22 – 08-23Three unrelated code changes merge (none touch the tool list on purpose). Each one automatically triggers the fleet-sync job, which is still writing to Camellia at this point. Each run's "does this tool already exist?" check quietly starts missing real tools once the list passes 100 — and creates a new copy instead of reusing them. More duplicates push more real tools past the same limit, so the next run misses even more. It snowballs.
2026-08-23, ~6:20amA change meant to protect Camellia while a second test property (Willows) is being built out splits the pipeline by property. From this point on, the automatic push-on-merge only targets Willows. Camellia is frozen for every surface except phone-number routing. The same change is where the renewal call-script push gets left out of the automatic path — logged in the code, in plain words, as "paused, not silent."
2026-08-24, 6:15amThe nightly health check catches the tool pile-up for the first time: a false "missing tool" alarm on the call-transfer handler (the tool was there, just hidden past the 100 mark) plus 20 groups of duplicate names.
2026-08-24 – 08-27Tool counts keep climbing as the underlying counting bug keeps running its course; the nightly check flips red and green as the numbers shift.
2026-08-27, 9:41amThe root cause is fixed everywhere it appears in the code (8 different spots were all only reading the first page of the tool list; all 8 now read the whole thing). The fix explicitly does not clean up the duplicates already created — mutating live customer-facing config unattended is called out, in writing, as something that needs a person to approve.
2026-08-28, 3:23amA wording fix to the shared call script — making sure Clara never promises to text something without the text actually going out — merges and reaches every Clara voice agent automatically, except the renewal-outbound one, because that path is still paused.
2026-08-28, 3:25amTwo minutes later, the automatic check built for exactly this catches the mismatch and turns red. It has stayed red on every run since.
2026-08-28, 9:12amSomeone runs the duplicate-tool cleanup tool again — in preview mode only. It prints the exact fix (37 duplicate groups, 92 tools to remove, precise before/after counts per agent) but doesn't apply it. These numbers match this morning's alert exactly.
2026-08-28, todayThis report is written. Both fixes are ready. Neither has been applied.

5 — Incident 1: the duplicate tools

The mechanism, in plain terms

Before creating a tool, the sync script is supposed to check "do I already have one of these?" by pulling the full list of tools from ElevenLabs. The bug: it only ever asked for the first page of that list — the first 100 results — and ElevenLabs hands results back a page at a time. Once the workspace had more than 100 tools in it, any real tool sitting on page two became invisible to that check. The script saw a tool that already existed, concluded it was missing, and created a brand-new copy. Each new copy pushed one more real tool past the 100-item cutoff — so the very next run missed one more tool, and created one more duplicate. It fed on itself.

In plain terms

Imagine a filing clerk who only ever checks the front of the cabinet before making a new folder. Once the cabinet has more than a drawer's worth of folders, everything behind that point looks "missing" to him — so he keeps making duplicates, which push more folders further back, which makes him miss even more next time.

Who ran it, and when

Three routine code merges between the evening of Aug 22 and the morning of Aug 23 — a booking-consent fix and two sound-quality tweaks for the test property — each automatically triggered the fleet-sync job as a side effect of merging to the main branch. None of the three changes touched the tool list on purpose; running the already-broken reuse-check three times in a row was enough on its own. No person ran this by hand, and the separate manual-only Camellia sync tool has never been run at all.

Why it wasn't caught sooner

The same page-one-only bug also lived inside the nightly health check that's supposed to catch exactly this kind of drift. So for the whole window this was happening, the safety net watching for it was reading the same truncated list as the tool that was breaking things — it just hadn't crossed the 100-item line yet either. Both were fixed together on Aug 27.

Was anyone's call ever actually affected?

We found no evidence of it. The scariest single alert — a tool that looked completely missing from the call-transfer handler — turned out to be the exact same page-one blind spot: the tool was there, just past the cutoff. Every real, non-false-alarm duplicate we found is agents ending up bound to the same tool twice under one name, which the team has hit before (mid-2026) and every writeup of it says the same thing: this makes a nightly check go red, it does not stop Clara from doing her job on a call. We're stating that as "nothing found," not as a guarantee — nobody has written a detailed after-action report on this exact shape of duplicate before, so it's worth someone's eyes before it's closed out as fully harmless.

Separately: a real chunk of the 92 tools flagged for deletion today aren't from this bug at all — they're leftovers from an earlier internal experiment (comparing two different AI voice models against each other) that was flagged back on Aug 24 as "safe to delete, waiting for a go-ahead," and simply never got deleted.

6 — Incident 2: the stale renewal call script

Why the push is paused

The renewal call script is pushed by its own dedicated piece of code, separate from the general wording-push used by every other agent, because the general one would accidentally delete the renewal agent's voicemail-message setup. That dedicated pusher was written to talk to one specific building's agent — it doesn't yet know how to say "push this to building A, not building B." When the team split the automatic pipeline by property on Aug 23 so Willows could be worked on safely, this pusher couldn't be safely folded into that automatic path, so it was deliberately left as something a person runs by hand. The team wrote this down, in the code itself, as "paused, not silent" — the intent was never to hide it, just that nobody has come back to finish the fix that would let it run safely on its own again.

What's been missed since the last manual push (Aug 15)

What's kept it from being worse

The 6-hourly automatic check that watches for exactly this kind of mismatch worked perfectly — it caught this morning's gap within two minutes of the merge and has stayed loudly red ever since. The gap is real, but it hasn't gone unnoticed; it's gone un-fixed, because fixing it currently means someone manually running the one-off push button, and nobody has since Aug 15.

7 — Every surface of a live voice agent: is it in code, does it get pushed, does anything watch it?

We went through every setting a live ElevenLabs phone agent has and checked three things: is the setting written down in the repo at all, does anything automatically push repo changes onto the live agent, and does anything automatically notice if the live agent drifts from the repo. Ranked by how much it would matter if it silently went wrong on a real call.

Setting (what it controls)Written in code?Auto-pushed?Auto-watched?Risk if it silently drifts
Every setting, for Camellia specifically, since Aug 23YesNo (frozen)Partial (vs. a frozen snapshot, not the live repo)Highest — a real, reviewed fix can sit unshipped for weeks with only the wording-specific check able to catch it
The literal voice/model callers hearNo (one narrow exception)NoNoHigh — a wrong voice, accent, or model swap on the dashboard would go completely unnoticed
Whether a transfer requires the receiving person to accept the call before connectingNoNoNoHigh — affects every transfer-capable agent, dashboard-only, zero record of the current setting
How an existing transfer behaves (e.g. conference-in vs. blind transfer) once it existsYesYesOnly partly — the check confirms the transfer exists, not that its behavior matchesMedium — a live-only edit to how a transfer works would pass the check silently
Webhooks that fetch a caller's name/unit before Clara answersNoNo (set once, by hand, long ago)NoMedium-high — if one breaks after a domain/credential rotation, calls could quietly lose tenant context with no alarm
Which tools an agent can callYesYes (the pagination bug lived here — fixed Aug 27)YesMedium — mechanism is fixed now; the cleanup from this week is what's still pending
Voicemail message text, for 3 specific agents (emergency relay, escalation callback, vendor outbound)Yes, but frozen at creation timeNo — no ongoing pushNoMedium — set once and never revisited; the config for one of these literally says "not auto-synced" in its own file
Voicemail message, renewal pair specificallyYesYes (manual button)YesLow-medium — same pause as the wording issue above
Spanish / language-detection settingsYes, for 5 of 10 agentsYes, for those 5Yes, for those 5Low today, but unmonitored if it's ever turned on for one of the other 5 via the dashboard
Which phone number rings which agentYesYesYes, on every pull requestLowest — the one surface with complete, working coverage; worth copying the pattern from

8 — What's missing in code, concretely

  1. A building-aware version of the renewal call-script pusher. Today it's hardcoded to one property. Until it can safely target one building at a time, it can't safely rejoin the automatic pipeline.
  2. A real live-vs-repo comparison for Camellia, not live-vs-frozen-snapshot. The current version can only catch a rogue dashboard edit — it can't catch "a real, approved fix never got pushed," which is exactly what happened this week.
  3. Code representation + a watcher for "does the receiving person have to accept the call before it connects" (ElevenLabs calls this setting require_acceptance), for every transfer-capable agent. Currently invisible everywhere — no check anywhere would notice if this got flipped on the dashboard. It's also, separately, a setting ElevenLabs won't currently let us turn on for our account at all (see section 9) — but that's a platform gate, not a reason to skip building the watcher.
  4. Code representation + a watcher for the literal voice and voice model each agent uses. Currently invisible everywhere except a narrow Spanish-voice exception for two agents.
  5. Code representation + a watcher for the webhooks that fetch a caller's context before Clara answers. Currently set once by hand and never checked again.
  6. A deeper check on transfers that also compares how an existing transfer behaves, not just whether it exists.
  7. An ongoing sync/watch for the 3 orphaned voicemail-message agents, matching what the renewal pair already has.
  8. A decision on the 5-agent language scope limit — is it permanent, or does it need to grow before someone flips a switch on the dashboard nobody's watching.
  9. Actually running the two fixes already sitting ready — see the decisions below. This is the fastest, lowest-risk item on this whole list.
  10. A tripwire between "here's the fix, waiting for a go-ahead" and "actually applied." Today's duplicate-tool alert would read exactly the same on day one as on day seven of being ignored — nothing escalates the longer a ready fix sits untouched. Should get louder the older it gets.
  11. Faster-than-polling detection. Every check today works by periodically re-asking ElevenLabs "what does this look like now" — nothing tells us the instant someone changes something on the dashboard. Worst case, a live edit can sit unnoticed for up to 24 hours on most settings, 6 hours for wording specifically. Worth asking ElevenLabs whether they offer a push notification instead of us polling.
  12. Two more spots still only read the first page of a list — the exact same bug class as incident 1, just not tripped yet because neither list has passed 100 items. One lists phone numbers, the other lists agents. Not causing visible harm today, but the identical time bomb until it's fixed everywhere (evidence: sync-phone-numbers.ts:85, elevenlabs-config.ts:879, create-robo-agent.ts:126, robo-vendor/el-agent.ts:174).
  13. No reliable "which twin is the real one" rule in the cleanup tool. When it finds two tools bound to the same name, it doesn't consistently keep the older, original one — it's picked the wrong twin before. Should always keep the one created first.
  14. Two automatic jobs can run at the exact same moment and step on each other (the fleet push and the duplicate-tool cleanup) — today the only thing stopping that is a comment in the code telling a person to check the Actions tab by hand before running either. Needs a real lock between them, not a reminder.

9 — Live tests on the transfer path (Aug 27–28)

Separate track, same fleet: over the last two days we ran controlled test calls — Willows only, our own numbers, nothing near Camellia or a real tenant — to find out what actually happens when Clara transfers a caller to the office and nobody human picks up.

Evidence: conversation conv_2301m12hjsa5fm1sa6wpkgfnyk71 (current "Conference" behavior) and conv_0901m14p5amneepr7xph05hdsvyj (new "Blind" test, Aug 28); full write-up in data/elevenlabs-snapshots/noanswer-experiments-2026-08-27.md.

10 — Agent-workspace cleanup inventory

A separate pass went through every voice agent and phone number in the ElevenLabs workspace — not to find drift, but to find leftover clutter nobody's cleaned up. Read-only; nothing below has been changed or deleted. Full per-agent table (evidence appendix).

Agents found 40 Keep 24 Safe to delete 11 Needs a look first 5 Numbers with nobody answering 8

The three piles

Keep (24): agents holding a real phone line, wired by name into the live call-routing code, or an active bench the team is using right now — the real property phone tree, the outbound renewal and vendor-calling agents (both named directly in production settings), the owner-utilities line, the automated eval caller, and the full 8-agent Willows test fleet built for this month's transfer experiments.

Safe to delete (11): no phone number, nothing in the code or its history pointing at them, several literally named by whoever made them as temporary. Every one of these was either never called at all or hasn't been touched in a month or more.

AgentWhy it's safe
Leasing A/B DIET (temp)Named "safe to delete" by its own creator; zero code references, zero calls ever.
Verified-caller-ID proof-of-concept ("delete me")One-off test; no code references remain.
SIP/DTMF touch-tone proof-of-conceptCompanion test to the one above; no code references remain.
Vendor-QA bench — invoice scenarioOne scripted test scenario; no code hook remains.
Vendor-QA bench — approval scenarioSame bench session, different scenario; no code hook remains.
Model-migration test — Leasing (temp)Dated one-time test in its own name; never called, never referenced.
Model-migration test — Triage (temp)Paired with the one above; same story.
Prompt-config trial, version c (temp)Dated, versioned trial; never called, never referenced.
Prompt-config trial, version d (temp)Next version of the same trial; same story.
"Pretend tenant" test callerOld test script; three months quiet, no code hook remains.
"test agent" (explicitly marked deprecated)The only code mention left is a historical comment, not a live link.

Needs a look first (5): two agents were created today, apparently for an in-progress comparison test — flagging these so nobody deletes another session's live work by mistake. A 5-day-old scratch clone may still be in active use. Two older agents were the precursor experiment to the Willows fleet before it shipped Aug 23 — one had a call as recently as 6 days ago, so worth confirming that comparison is actually finished before retiring them.

Two more things this pass turned up

8 phone numbers have no agent answering them — each still costs money every month regardless. Two of those aren't even in our Twilio account anymore, though ElevenLabs still lists them as ours. Separately, 2 Twilio numbers aren't wired to ElevenLabs at all — one plays Twilio's generic demo greeting and looks abandoned, the other is a texting-only line working as intended.

11 — Decisions

Decision 1 of 6

Apply the duplicate-tool cleanup now?

RecommendedApply it today. The plan has been dry-run tested twice, its numbers match this morning's alert exactly, and we found no evidence any live call was ever affected by this class of duplicate.
Run one more dry-run pass before applying, as an extra sanity check.
Hold off applying for now.
In plain terms

This is deleting extra copies of things Clara already has working versions of — like clearing out duplicate contacts from a phone. The fix has already been tested twice and printed the exact same answer both times.

Decision 2 of 6

How should Camellia's renewal call script get updates going forward?

RecommendedBuild the fix that lets the push tool safely target one building at a time, then let it rejoin the automatic pipeline. Removes the recurring "someone has to remember" step for good.
Keep it fully manual, but add an automatic reminder so it can't go two weeks unnoticed again.
Leave today's setup (manual button + 6-hourly check) exactly as it is.
Decision 3 of 6

Should the "is Camellia in sync" check go back to comparing against the real, current script instead of a frozen snapshot?

RecommendedYes — once decision 2's fix exists, restore a live check against the current repo, so an approved fix can never again sit unshipped with nothing loudly flagging it.
Keep comparing against the frozen snapshot; accept that a real approved change can go unnoticed until someone checks by hand.
Decision 4 of 6

Should the currently invisible settings — voice/model, transfer accept-first, tenant-context webhooks — get written into code with an automatic watcher?

RecommendedYes, build coverage for all three, in this order: webhooks first (highest silent-failure risk), then the transfer accept-first setting, then voice/model identity.
Start with just the webhooks for now; revisit the other two later.
Leave all three as dashboard-only settings for now.
Decision 5 of 6

Switch Camellia's transfers to "Blind" as the interim default?

RecommendedYes — switch to Blind. The office sees the resident's real phone number, so their own phone's call-back button works if they miss it. When nobody answers, the caller gets a clean, quick end to the call instead of a long stretch of dead air. The missed-call email stays the safety net either way. What we give up: the short spoken heads-up ("connecting you to a call about...") that plays before the office picks up today.
Keep the current setup ("Conference") until ElevenLabs support confirms whether the wait-for-someone-to-accept feature can be turned on for our account.
In plain terms

Right now, when Clara transfers someone and nobody answers, the caller sits in silence for about two minutes before the phone company itself cuts them off with an error message — and whoever eventually looks at the office phone can't call the resident back, because the caller ID coming in is Clara's number, not theirs. Blind transfer fixes both: real caller ID, and a clean hang-up in under a minute instead of two minutes of dead air.

Decision 6 of 6

Clean up the voice workspace?

RecommendedDelete the 11 named leftover agents and release the orphaned phone numbers, after a 48-hour heads-up in #alerts so anyone with a stake can object first. Snapshot every agent before deleting it (deleting an agent is only reversible via that snapshot). Releasing a phone number is permanent and needs its own separate go-ahead — don't bundle it into the same approval as the agent cleanup.
Delete the leftover agents only; leave every phone number as-is for now.
Hold off on any cleanup for now.
In plain terms

Of the 40 voice agents in the workspace, 11 are test leftovers nobody's using — some are even named "temp" or "delete me" by whoever made them. Cleaning those up is like clearing dead phone numbers out of a shared contacts list. The phone numbers are a separate question because releasing one is permanent and it costs money every month to keep an unused one around.

12 — Provenance: what's verified, what's inferred

Everything below was checked twice — once by the original research pass, once by an independent verification pass reading the same source material fresh. One claim came back corrected; it's marked below. Anything not independently re-verified is labeled as such rather than presented as settled fact.

ClaimStatusNote
Duplicate tools were caused by 3 automatic merge-triggered runs against Camellia, Aug 22–23, not by any manual runVerifiedConfirmed against the actual run history and the exact commit hashes involved, independently, twice.
The mechanism: an unpaginated tool list caused the reuse-check to miss tools past the 100th and mint duplicatesVerifiedConfirmed by reading the pre-fix and post-fix code directly, both times.
The nightly checker had the identical pagination bug, so it was unreliable for the same window it was supposed to be watchingVerifiedConfirmed by direct code inspection.
No live call was ever actually broken by this week's duplicate toolsInferredStrong supporting evidence (a documented false alarm, and past incidents of the same class always logged as "hygiene, not outage") but this is an absence of evidence, not a positive proof. Flagged, not settled.
Voice identity fields (voice, model, delivery) have zero code coverage anywhere in the fleetCorrectedFalse as originally stated. A narrow exception exists: a Spanish-voice swap for two agents (Triage, Leasing) is tracked and checked. The base/English voice identity for every agent, and the Spanish voice for every other agent, is genuinely untracked.
92 tools are safe to delete; 37 duplicate name-groups; the specific per-agent before/after countsVerifiedPulled directly from the actual dry-run output this morning; matches the alert numbers exactly, character for character.
The renewal push was deliberately paused on Aug 23, documented in the code as "paused, not silent," with a real fix from this morning going undelivered as a resultVerifiedConfirmed against the actual code comment, the actual merge and check timestamps (2 minutes apart), and the manual-run history (last run Aug 15, none since).
The renewal-specific manual re-enable path has literally never been runVerifiedChecked directly against the run history: zero runs, ever.
A meaningful share of the 92 flagged tools are leftovers from an unrelated internal AI-model comparison, already flagged and held pending approval since Aug 24VerifiedCross-checked the earlier internal note against this morning's dry-run output line by line — the same named leftover agents show zero change, confirming they're still just sitting there untouched.
The gap matrix in section 7 (webhooks, transfer accept-first, transfer-behavior fields) — coverage state of eachVerifiedEach row confirmed by direct inspection of the relevant code, independently, twice.
Willows auto-updates on every merge; Camellia only via a manual, magic-word-confirmed job not run in 30 days; vendor-outreach and emergency-relay agents have no update path at all; phone-number routing is the only lane that also self-heals overnightVerifiedConfirmed directly against the workflow files and 30 days of run history.
The wait-for-someone-to-accept transfer feature (require_acceptance) is blocked for our ElevenLabs account with an explicit "feature access" errorVerifiedReproduced twice via isolated API calls, identical error both times; config confirmed unchanged after each attempt.
"Blind" transfer passes through the caller's real phone number and ends a no-answer call in roughly 55 seconds, versus ~2 minutes of dead air then a carrier error on the current setupVerifiedConfirmed from Twilio's own call records and ElevenLabs' conversation transcript/timing data for both transfer types, on a test call.
Workspace inventory — 40 agents total, split 24 keep / 11 safe-to-delete / 5 needs-a-look, plus 8 unassigned phone numbersVerifiedCross-checked against phone-line assignments, each agent's actual call history, and a full codebase search for every agent ID.

Agent-workspace cleanup inventory: folded into section 10 above — full per-agent detail lives in the linked evidence appendix.

Built from four research passes over the repo's history, GitHub's run logs, and prior team write-ups, plus two independent fact-checking passes over the same material — corrected findings above override the original claim where they disagree. Nothing in this document was applied to any live system; both pending fixes described in section 8, the transfer-type change in decision 5, and the workspace cleanup in decision 6 are all still waiting on a decision.
PropFlow Docs