Skip to main content

Posts

Cutting tool output tokens in Microsoft Agent Framework with TOON

If you've built anything with the Microsoft Agent Framework (MAF), you'll notice that your tool calls can fill up the context window quite fast. A function that returns a list of 50 orders as JSON easily costs you a few hundred tokens on braces, quotes and repeated field names alone. That cost hits you twice: once on the way into the model as tool output, and again on every subsequent turn where that history gets replayed. That's where TOON (Token-Oriented Object Notation) comes in. Let's explore this. What TOON actually is TOON is a line-oriented, indentation-based encoding of the same data model JSON uses. It borrows YAML's indentation for nested objects and CSV's tabular layout for arrays of uniform objects. The trick is in that last part: if you have a list of objects that all share the same fields, TOON declares the field list once and then just streams the values, row by row, instead of repeating every key for every item. Take a small object like t...
Recent posts

Firelighting vs. firefighting

There's a version of leadership that looks busy, looks needed, and looks like it's working but turns out to be the least effective version there is. This summer I read Bob Chapman's Everybody Matters , and one distinction from the book kept coming back to me weeks after I'd finished it: firefighting versus firelighting, as two fundamentally different modes of leadership.   Chapman's point is simple to state and harder to live by. A firefighting leader spends their energy reacting: jumping from one problem to the next, stepping in to rescue a team the moment something goes wrong. A firelighting leader does the opposite. They don't chase problems. They ignite something in people, so the problems get solved without the leader showing up with the extinguisher every time. In the book, the differences are listed like this: Firefighting: Reactive by nature . You wait for the smoke before you act. The leader becomes the bottleneck. Nothing moves unti...

Monitoring Claude Code usage with the Aspire Dashboard

Note: this is a follow-up to my post on monitoring GitHub Copilot Chat with the Aspire Dashboard. Same idea, different agent. Some developers on the team have switched (part-time) from Copilot Chat to Claude Code for their agentic work. Same question came up again: how much are we actually using it, what does it cost, and where does the time go in a session? Claude Code has its own OTel support, separate from Copilot's, so it needs its own setup — but it plugs into the exact same Aspire Dashboard we already had running. What Claude Code exports Claude Code emits three kinds of OTel signals: Metrics — session counts, token usage, cost, lines of code changed, active time Events — one event per prompt, per API call, per tool result, per permission decision Traces (beta) — a claude_code.interaction span per prompt, with claude_code.llm_request and claude_code.tool spans nested underneath Remark: traces are still beta. Metrics and events are the stable path ...

Monitoring GitHub Copilot usage with the Aspire Dashboard

When talking to developers I get wildly different opinions about how "good" GitHub Copilot actually was for them. Some love it, some find it slow, some weren't sure it was doing anything useful at all(just kidding). The problem: nobody had any data. We were talking about token usage, latency and tool calls purely from gut feeling. GitHub Copilot can export all of that as OpenTelemetry traces, metrics and events. And the easiest way to look at it locally, without spinning up a cloud backend, is the Aspire Dashboard. Let's set that up. Why do we need this? Copilot isn't just autocomplete anymore. Every agent turn is a small orchestration: it calls a model, the model asks for tools, the tools run, the model answers. If you want to know where the time and the tokens go, you need to see that orchestration, not just the end result. That's exactly what the Open Telemetry integration gives you. Every agent interaction produces a span tree: invoke_agent copil...

Setting up GitHub Copilot budget policies without GitHub Enterprise Cloud

If you search for "GitHub Copilot budget policy", most posts point you to cost centers: assign a budget to a cost center, map the cost center to a team or business unit, done. Clean story, except for one detail nobody mentions upfront — cost centers require a GitHub Enterprise Cloud account. That's not the same thing as being on the Copilot Enterprise plan; user-level budgets already work fine on Copilot Business. It's about the account type; a standalone Organization account doesn't have cost centers, and neither does GitHub Enterprise Server if you're self-hosted. If you're not on Enterprise Cloud, cost centers are off the table. We ran into exactly this. No Enterprise Cloud account, no cost centers, but still a real need to keep Copilot spend under control across a growing user base. Remark: if you do have GitHub Enterprise Cloud, cost centers are probably still the better fit. This post is for the rest of us. The starting point We have two...

Renovate hostRules silently ignored? Check your config level

Recently I got lost setting up Renovate against an internal NuGet feed. Dependency updates kept coming back with a 401, even though I had hostRules configured with credentials right there in renovate.json . No error, no obvious warning in the log that jumped out at me. Just an anonymous request going out where an authenticated one should have. Turns out the config was fine. The location wasn't. The problem The error itself didn't point anywhere near the config file: { "message": "Request failed with status code 401 (Unauthorized): GET https://tfs.vlm.be/tfs/DefaultCollection/_packaging/VLMFeed/nuget/v3/index.json", "response": { "statusCode": 401, "statusMessage": "Unauthorized", "body": "{\"$id\":\"1\",\"innerException\":null,\"message\":\"TF400813: Resource not available for anonymous access. Client authentication required.\",\...

Turning a single work session into a reusable Skill with Microsoft's Skill Recorder

In my effort to adopt an 'AI first' philosophy, I spend a lot of time automating my day-to-day activities and transforming them to skills. It's not the most exciting activity: I know exactly how to do a task, I've done it a dozen times by hand, but writing it down as a clean SKILL.md for an agent takes almost as long as just doing the task again. Microsoft created an open-source a tool that skips that step entirely: Skill Recorder . The idea is simple: you record yourself doing the task once, and it generates the skill for you. Sounds good? Let’s give it a try… What it actually does Skill Recorder is a desktop app (Electron, macOS-first with Windows 11 support) that captures a real work session on your screen: clicks, app and window switches, the pages you visit, clipboard snippets, and optionally your spoken narration. Nothing leaves your machine while you're recording. Capture, storage, frame extraction, and narration transcription all happen locally. T...