Writing

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.

finding

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.

finding

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.

finding

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.

note

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.

finding

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.

finding

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.

finding

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.

finding

The AI provider ladder — keeping automation costs near zero

A simple rule for choosing between local, free and paid models in every pipeline.

finding

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.

finding

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.

finding

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.

achievement