
Contact centers are handing phone calls to AI voice agents, and every one of those calls is recorded. The recordings are valuable for quality reviews, analytics and training, but they are full of names, phone numbers, emails, addresses and card numbers. So they get locked away, or copied into AI tools with the sensitive details still inside. SafeCall solves both halves. Customers talk to Sam, a live billing agent built on AssemblyAI's Voice Agent API: real-time speech in and out, natural turn-taking with interruptions, and tool calls to look up an account, check charges, issue a refund, update contact details or hand the call to a person. When the caller hangs up, SafeCall fetches the session recording and runs it through AssemblyAI Universal-3.5 Pro with speaker separation and PII redaction: personal details become labels in the transcript and silence in the audio, and a second pass looks for numbers and emails the first one missed. Uploaded recordings go through the same pipeline. Only safe artifacts are stored: redacted audio in a private bucket, a speaker-labelled redacted transcript, a PII report and a full audit trail. The original voice session and transcript are deleted from AssemblyAI. AI insights (summary, sentiment, topics, action items and a QA note) come from AssemblyAI's LLM Gateway and only ever see redacted text. Every role sees only what it needs. Customers see their own calls. Support agents work the queue of calls the AI handed over, and each handover carries only its reason, never what was said. Admins search, analyze and export a safe dataset for analytics or AI training, set PII policies and review the audit trail. Built with React, Node.js and Supabase, deployed on Vercel and Railway, and covered by 149 automated tests.
30 Sep 2026

Most trading agents hand a language model the keys. Vetoed inverts that: the LLM is its least-trusted part. It sells defined-risk credit spreads on SPY, QQQ, IWM and AAPL. Every position is two legs sent as one order, so the maximum loss is known before the order exists and a naked short is impossible. Separation of powers is the design. A deterministic screener prices each candidate twice through one lognormal model, changing only the volatility input - implied versus 20-day realised. That difference is our own model-derived edge measure, motivated by volatility risk premium research; it is deliberately not the academic variance risk premium, which is defined and measured differently. A typical cycle measures ~1,500 spreads and rejects nearly all of them - the dashboard shows every rejection by its reason, naming contracts. The LLM then picks one entry from what survives and nothing else: its contracts are validated against the shortlist so an invented one is unexecutable, its size is discarded, and a deterministic risk module can overrule it at any confidence. Eight hard gates apply, including 5% of equity per position, 25% across all, a 3% daily-loss halt and a 25-contract cap. It adapts from its own journal but only toward restriction - three straight losses ban an underlying - and never on fewer than five closed trades. Auditing my own maths, I found the edge metric was mostly artifact: one side used delta as a probability, and the payoff between strikes was approximated at its midpoint. Both changed real trade decisions. Fixed; the suite grew from 77 to 236 tests. A scheduled trigger starts one unattended session a day on GitHub Actions. Every pass reconciles against the broker, manages exits and scores the board, roughly every ten minutes; only every third may open a position. Deterministic order IDs mean a restart cannot duplicate a position. Paper trading only - it refuses to start against live money. A contest week proves nothing about profitability.
4 Sep 2026