Findings & wins.
Short write-ups of what I tried, what worked, and what I'd do differently — plus the occasional milestone.
Teams calling in the browser: test before you trust the capability table
Findings from building Teams Phone calling into a web app, where the documentation and the real behaviour didn't always agree.
Getting AI call context onto a Teams agent's screen
Findings and wins from handing AI voice calls to people in Teams with the conversation context attached.
Teams Personal Attendant silently breaks for compliance-recorded users
Calls redirected to Personal Attendant drop when either party has a compliance recording policy — here's the signature and the fix.
Graph call records: abandonment is something you infer, not a field you read
Lessons from building Teams call reporting on the Microsoft Graph callRecords API.
Green CI, zero functions: don't trust your Azure Functions deploy status
A deploy action reported success four times in a row while the app served nothing.
Caller ID in Copilot Studio voice agents is messier than the docs suggest
Where the caller's number actually lives, and the ways it gets corrupted on the way to your lookup.
Your Copilot Studio solution export may be missing its flows
Why "add required components" doesn't catch everything, and the checks I now run before every export.
You can't remove a real-time voice agent's "please hold" line — but you can steer it
The spoken preamble before a tool call comes from the platform, not your prompt.
The AI provider ladder — keeping automation costs near zero
A simple rule for choosing between local, free and paid models in every pipeline.
The timezone bug that only bites customers outside your time zone
Casting an ISO timestamp to [datetime] in PowerShell quietly shifts it — and your "peak hour" report with it.
One qualifier per sentence — how a run-on instruction broke a voice agent
A "don't ask X" clause leaked into an unrelated "ask for Y" step and silently skipped a required data capture.
One DID per port: fixing analogue gateway SIP registration without an SBC
A five-port analogue gateway kept sending every call to port 1. The cause was one field.