Coding
Customizing an AI agent that speaks in a shared room
Notes on the problem I lead at Microsoft: making Teams Facilitator configurable when everything it says is visible to every participant. About the shape of the problem, not the unreleased implementation.
- Role
- Lead engineer, Customization, Microsoft Teams Facilitator
- During
- Microsoft
- Built with
- TypeScript, React, Prompt engineering, LLM orchestration, Evaluation-driven development, Agentic development workflows
What this page is
This is the product I currently lead, and it is unreleased. So this page contains no features, no roadmap, no metrics, and no internal detail. Everything factual on it comes from Microsoft's public documentation, linked at the bottom, and everything else is reasoning about a problem I find genuinely interesting.
I would rather publish the reasoning honestly than publish a page that implies more than I am able to say. If you want to evaluate how I think about AI product problems, the reasoning is the useful part anyway.
Customization is a governance problem wearing a settings UI
Most AI configuration design assumes a private loop. You set a preference, you see the result, you adjust. Being slightly wrong is cheap because you are the only one who experiences it, and the correction is immediate.
Remove the privacy and that loop breaks in both directions. The person who set the preference is not necessarily the person reading the output, the reader has no way to tell which behaviour was configured and which is default, and there is no quiet correction — the artifact is already in the conversation and, per the documentation, retained as meeting transcript data under the same governance as a transcript.
That reframes what a good customization is. It is not the one that gives organizers the most control. It is the one whose effect stays legible to people who did not choose it, and whose failure mode a room can recognise as a setting.
The product's existing behaviour already reflects this posture. It declines to read the organizer's copy of an invite until a non-organizer has joined, for privacy reasons, and it will not extract an agenda from sensitivity-labelled content. Those are refusals, published as documented behaviour. They are the right precedent: in a shared room, the constraints are part of the product, not gaps in it.
How I actually build it
I run this work close to fully agent-driven, and my job has mostly become deciding what agents are not allowed to decide.
What agents are good at is not surprising: the wide, shallow work — reading unfamiliar code, proposing implementations, keeping changes consistent across layers of a system that spans several. What they are bad at is knowing when a plausible answer is the wrong one, and on a shared-output AI surface that is precisely the expensive failure.
So the standards live in the repository. Instructions, skills, and agent definitions are checked in, which means the rules apply to every change instead of to whichever ones I happened to look at closely. Behaviour changes are judged against rubrics. A demo that went well is not evidence. And the gates are non-negotiable in a way that is deliberately annoying, because the entire value of moving fast this way is that the speed does not come out of the review.
This site is the second place I have applied that method, and you can read the whole of it, since none of it is confidential.
What came before it
I did not start here. The four years before this were spent on the scheduling and meeting-configuration surfaces underneath it — Virtual Appointments, then Meeting Options and Meeting Templates, then porting both into the unified Teams calendar. That history is on the Microsoft record.
What carries over is narrower. I spent those four years on the question of what happens when meeting settings are wrong, usually finding out because someone paged me about it. Arriving at an AI agent whose configuration is visible to a whole room, it turns out to be the same question with higher stakes.