Skip to main content

Posts

Type-safe tool definitions come to the Copilot .NET SDK

As a big fan of the GitHub Copilot SDK, I'm trying to keep up with the list of changes. The beta 6 version of the GitHub Copilot SDK now ships a typed CopilotTool.DefineTool helper that lets you configure override flags, skip-permission behavior, and other Copilot-specific metadata without sprinkling magic strings throughout your codebase. This makes working with Copilot tools in C# a lot cleaner. It brings the .NET SDK in line with typed helper APIs already available in other language SDKs and makes tool definitions easier to write, refactor, and reason about. The old way vs the new way Before this change, wiring up Copilot-specific metadata meant relying on loosely typed configuration — easy to mistype, hard to discover, and brittle to refactor. Now, the same intent is expressed through a clean, strongly typed API: Before // Metadata via magic strings options["is_override"] = "true"; options["skip_permission"] = "true"; After ...
Recent posts

EF Core 10–Smarter parameterized collections

If you've been using Entity Framework Core for a while, you've probably written a query like this: var ids = new[] { 1, 2, 3, 4, 5 }; var blogs = await context.Blogs .Where(b => ids.Contains(b.Id)) .ToListAsync(); Simple enough. But under the hood, how EF Core translates that ids collection into SQL has quietly changed(again) in EF Core 10, and this time the change is significant enough to be listed as a breaking change. Let's dig into what's happening, why the EF team made this call, and what it means for your applications. A brief history To understand EF Core 10's approach, it helps to know where things stood before. EF Core 8: The OPENJSON era In EF Core 8, when you passed a collection to a LINQ Contains or Where clause, EF encoded the entire collection as a JSON string and sent it as a single parameter. SQL Server would then unpack it using the OPENJSON function: SELECT [b].[Id], [b].[Name] FROM [Blogs] AS [b] WHERE [b].[Id] IN ( ...

Respect what came before

A colleague told me a story recently. A new architect joined his project. Experienced, credentialed, confident. And from day one, all he did was explain what was wrong with the existing system. The choices that were made, the patterns that were used, the technical debt that had accumulated. An endless inventory of flaws. I've seen this before. And it always makes me uneasy. Not because criticism is bad. Codebases do accumulate real problems. Patterns do become outdated. But there's a specific kind of criticism — reflexive, premature, delivered without curiosity — that reveals something troubling about the person offering it. The most dangerous person in a technical team isn't the one who doesn't know enough — it's the one who arrives certain they know better. Every system is a set of scars Software systems carry history inside them. A module that looks over-engineered almost certainly went through a painful incident that demanded it. A seemingly arbitra...

GitHub Copilot AI Credits switch: Here's what to do before June 1

On June 1, 2026 , GitHub Copilot drops its old premium-request model and goes fully token-based. Every interaction (chat, agent mode, code review,...) will now draw down a pool of GitHub AI Credits , where 1 credit = $0.01 USD . Code completions stay free and unlimited, but everything else is metered. The base plan prices aren't changing. Copilot Business stays $19/month and includes $19 in credits. Copilot Enterprise stays $39/month with $39 in credits. But here's the catch: once your included credits are gone, you either pay overage or you stop. No more "unlimited premium requests with a monthly cap." You get a dollar amount, and you spend it. That makes budgeting more important than ever — especially for teams and power users running agentic workflows (aren’t we all?). What you're paying for Before you can budget, you need to understand the cost drivers. GitHub AI Credits are consumed based on token usage: the number of tokens sent to and received from...

Using ExecutionLog views in SQL Server Reporting Services to monitor performance

After upgrading our SQL Server Reporting Services (SSRS) environment, we noticed some isuses: reports were slow, users were complaining, and we had no idea where to start. The good news is that SSRS has been quietly collecting detailed execution data the whole time — and a set of built-in views makes it surprisingly easy to query. This post walks through the ExecutionLog views, what they contain, and how to turn that data into actionable performance insights. What are the ExecutionLog views? SSRS logs every report execution to the ReportServer database. Three views expose this data at different levels of detail: ExecutionLog — A simple view covering the basics: report name, user, start time, and duration. Good for quick lookups. ExecutionLog2 — Adds AdditionalInfo , an XML column with richer metadata such as estimated row counts and data source connection details. ExecutionLog3 — The most complete view. Breaks execution time into three distinct phases — TimeData...

Always know where you stand: Setting up a live status line in GitHub Copilot CLI

Yesterday I introduced to you statusline command. It allows you to configure a persistent, live bar at the bottom of your CLI session that shows whatever your script prints — token usage, context percentage, current model, cost estimates, session duration, and more. I promised that we would setup something like this: █████░░░░░ 50% 64.0k/128.0k | ✱ Sonnet 4.5 | ~$0.04 | ⏱️ 00:12:34 But yesterday we only got as far as showing this: Hello from PowerShell status line! If you missed the previous post, go read it first, before continuing here. Back? Let's continue... Now we have confirmed the script runs and we've the payload, we can now focus on creating a production-ready version. It extracts context usage, model name, cost (from the payload if available, estimated otherwise), and session duration. I first created my own version but while researching this post I discovered this blog post by Madis Kõosaar: Customize GitHub Copilot CLI Status Line . He created a much...

Always know where you stand: Setting up a live status line in GitHub Copilot CLI

If you spend serious time in GitHub Copilot CLI, you've probably had that moment. You're deep in a session, things are moving fast, and suddenly you hit context compaction out of nowhere. The /context and /usage commands help, but they interrupt your flow. What if the information was just there , all the time, without you having to ask? That's exactly where the statusline command can help: a persistent, live bar at the bottom of your CLI session that shows whatever your script prints — token usage, context percentage, current model, cost estimates, session duration, and more. Once it's running, it looks something like this: █████░░░░░ 50% 64.0k/128.0k | ✱ Sonnet 4.5 | ~$0.04 | ⏱️ 00:12:34 This guide walks you through the full setup from scratch, including a "hello world" sanity check. In a follow-up post we’ll tweak the result to example above. Status: Custom status line support requires experimental features enabled in Copilot CLI. You can e...