<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Tony Champion: Research Log</title><description>Technical notes, articles, and series on Azure, .NET, and modern developer practices.</description><link>https://tonychampion.net/</link><language>en-US</language><item><title>Designing the Status Endpoint for a Long-Running API</title><link>https://tonychampion.net/notes/status-endpoint-design/</link><guid isPermaLink="true">https://tonychampion.net/notes/status-endpoint-design/</guid><description>The status endpoint is a contract. Publish a small, stable state vocabulary instead of your internal states, report a failed job as a successful status call, and pick one status code convention and hold it.</description><pubDate>Fri, 13 Nov 2026 00:00:00 GMT</pubDate></item><item><title>Idempotency Matters More Now That AI Is Calling Your API</title><link>https://tonychampion.net/notes/idempotency-ai-callers/</link><guid isPermaLink="true">https://tonychampion.net/notes/idempotency-ai-callers/</guid><description>AI agents decide at runtime how many times to call your API, which turns every POST into a retry risk. Make operations naturally idempotent where you can, detect and replay where you can&apos;t, and enforce it at write time.</description><pubDate>Thu, 12 Nov 2026 00:00:00 GMT</pubDate></item><item><title>Canonical Serialization: Why the Same Object Hashes Differently</title><link>https://tonychampion.net/notes/canonical-serialization-hashing/</link><guid isPermaLink="true">https://tonychampion.net/notes/canonical-serialization-hashing/</guid><description>Serialization isn&apos;t canonical, so the same object can hash differently across systems. If a payload hash drives duplicate detection, sort the token tree with an ordinal comparer and decide arrays and nulls on purpose.</description><pubDate>Wed, 11 Nov 2026 00:00:00 GMT</pubDate></item><item><title>Assigning Operation IDs When Your API Returns a 202</title><link>https://tonychampion.net/notes/assigning-operation-ids-202/</link><guid isPermaLink="true">https://tonychampion.net/notes/assigning-operation-ids-202/</guid><description>Using the client&apos;s ID as the operation ID will eventually point one customer at another customer&apos;s job. Key uniqueness on the client plus their value, and enforce authorization on every status call.</description><pubDate>Tue, 10 Nov 2026 00:00:00 GMT</pubDate></item><item><title>Service Bus Topics vs Queues: Which One Do You Actually Need?</title><link>https://tonychampion.net/notes/service-bus-topics-vs-queues/</link><guid isPermaLink="true">https://tonychampion.net/notes/service-bus-topics-vs-queues/</guid><description>Most teams reach for a Service Bus topic because it sounds more flexible. Count workflows, not services: if one workflow consumes the message, a queue is the right call.</description><pubDate>Mon, 09 Nov 2026 00:00:00 GMT</pubDate></item><item><title>What 202 Accepted Actually Means for a Long-Running API</title><link>https://tonychampion.net/notes/202-accepted-long-running-api/</link><guid isPermaLink="true">https://tonychampion.net/notes/202-accepted-long-running-api/</guid><description>A 202 is as easy to return as a 200. What it commits you to is validating before you accept, publishing a way to track the work, and having an answer ready when the work finishes and nobody is listening.</description><pubDate>Sun, 08 Nov 2026 00:00:00 GMT</pubDate></item><item><title>Webhooks Are Four Problems, Not One HTTP Call</title><link>https://tonychampion.net/notes/webhooks-are-four-problems/</link><guid isPermaLink="true">https://tonychampion.net/notes/webhooks-are-four-problems/</guid><description>Calling a customer&apos;s URL sounds trivial. It&apos;s really four problems: who may subscribe, proving the call came from you, surviving their outage, and not slowing down the request that triggered it.</description><pubDate>Thu, 05 Nov 2026 00:00:00 GMT</pubDate></item><item><title>Idempotency-Key: Same Key, Same Outcome</title><link>https://tonychampion.net/notes/idempotency-key-header/</link><guid isPermaLink="true">https://tonychampion.net/notes/idempotency-key-header/</guid><description>A POST that timed out leaves the caller with nothing safe to do. An Idempotency-Key header, backed by a key derived into the data and a database that rejects duplicates, makes the retry safe.</description><pubDate>Tue, 03 Nov 2026 00:00:00 GMT</pubDate></item><item><title>The Gap Between Saving and Announcing</title><link>https://tonychampion.net/notes/gap-between-saving-and-announcing/</link><guid isPermaLink="true">https://tonychampion.net/notes/gap-between-saving-and-announcing/</guid><description>Save the record, then publish the event, and a crash in between means nobody hears about it. The outbox pattern closes the gap, and the price is at-least-once delivery your handlers have to survive.</description><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate></item><item><title>Retries Multiply: Designing How Your API Fails</title><link>https://tonychampion.net/notes/retries-multiply/</link><guid isPermaLink="true">https://tonychampion.net/notes/retries-multiply/</guid><description>Three layers that each retry 3 times turn one click into 27 database calls during an incident. Retry at one layer, fit every budget inside its caller&apos;s, and only retry writes that are safe to repeat.</description><pubDate>Tue, 27 Oct 2026 00:00:00 GMT</pubDate></item><item><title>Readiness Checks That Don&apos;t Turn a Slowdown Into an Outage</title><link>https://tonychampion.net/notes/readiness-checks-slowdown-outage/</link><guid isPermaLink="true">https://tonychampion.net/notes/readiness-checks-slowdown-outage/</guid><description>A health check that fails on slowness is powerful and easy to overdo. If every instance reports unready at once, the load balancer has nowhere to send traffic and your probe caused the outage.</description><pubDate>Sat, 24 Oct 2026 00:00:00 GMT</pubDate></item><item><title>Paging and Caching Decisions That Bite Later</title><link>https://tonychampion.net/notes/paging-caching-decisions/</link><guid isPermaLink="true">https://tonychampion.net/notes/paging-caching-decisions/</guid><description>Making an API fast is easy. Making it fast without serving stale data or someone else&apos;s data means picking your paging shape before callers depend on it and never letting a cache key forget who asked.</description><pubDate>Thu, 22 Oct 2026 00:00:00 GMT</pubDate></item><item><title>CORS Is Not Security (and Your Rate Limiter Probably Isn&apos;t Global)</title><link>https://tonychampion.net/notes/cors-is-not-security/</link><guid isPermaLink="true">https://tonychampion.net/notes/cors-is-not-security/</guid><description>CORS only tells browsers what they may read, and the built-in rate limiter counts per instance. Both work in the demo and leak in production once you forget which assumption you were making.</description><pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate></item><item><title>403 or 404, and Other Authorization Calls to Make on Purpose</title><link>https://tonychampion.net/notes/403-or-404-authorization-decisions/</link><guid isPermaLink="true">https://tonychampion.net/notes/403-or-404-authorization-decisions/</guid><description>A 403 tells the caller the thing exists. Which status you return on a denial, where identity comes from, and whether endpoints depend on how roles are issued are all decisions most APIs make by default.</description><pubDate>Sat, 17 Oct 2026 00:00:00 GMT</pubDate></item><item><title>What Counts as a Breaking Change in Your API</title><link>https://tonychampion.net/notes/what-counts-as-breaking-change-api/</link><guid isPermaLink="true">https://tonychampion.net/notes/what-counts-as-breaking-change-api/</guid><description>Cleaning up your error handling can break callers. Know which changes are breaking, keep validation rules where they belong, and version from day one so v1 gets deprecated on a schedule instead of broken on a Tuesday.</description><pubDate>Thu, 15 Oct 2026 00:00:00 GMT</pubDate></item><item><title>Vertical Slices or Controllers: What You Actually Trade</title><link>https://tonychampion.net/notes/vertical-slices-vs-controllers/</link><guid isPermaLink="true">https://tonychampion.net/notes/vertical-slices-vs-controllers/</guid><description>Controller to service to store means a one-line change touches three folders. Vertical slices fix that, at the cost of some duplication and a conventions problem you should solve early.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate></item></channel></rss>