Posts

Year
Topic

What the API Returns vs What the Docs Claim

Evaluating whether one sports-data provider could replace another. The published capability matrix and the trial API disagreed, so the analysis was rebuilt on probes against the live endpoint. On deriving your consumption from code rather than memory, citing evidence per verdict, and labelling one appendix explicitly unproven.

Idempotency Belongs in the Database

A replayed store notification must not duplicate a purchase. Application-level checks are necessary and insufficient — under concurrent delivery the only thing that reliably holds is a constraint. On choosing the key, the correction we had to make to it mid-run, and why the criterion names the enforcement mechanism rather than the outcome.

The Best Test Fixtures Were Already in Production

The monolith had been storing every raw store notification for years — 720,183 of them. That turned a rewrite from a fixtures exercise into a replay exercise. On recognising an accidental corpus, seeding an ephemeral database so the harness can never touch live data, and why storing the raw payload is the cheapest thing you will ever do.

A Store Never Waits on Our Database

App Store and Google Play retry aggressively when you're slow, so a handler that writes to Postgres before acknowledging turns a slow query into a retry storm. On separating durability from processing, the decision record we had to supersede once we worked out what "durable" needed to mean, and why nothing may be acknowledged that isn't recorded.

Coverage, Not Just Agreement

A parity harness reporting 100% agreement tells you nothing until you know what it asked. On making coverage a gate rather than a statistic, declaring the gaps out loud, and scoping a replay to the deterministic core so the claim you publish is one you can defend.

Proving a Rewrite Against 243,325 Real Purchases

Before the new service answered a single user, it computed entitlement for every purchase we had and its answers were compared offline against the monolith's. Zero disagreements. The engineering is entirely in what "zero" required: pinning the clock, writing the logic twice on purpose, and making every disagreement diagnosable without a rerun.

Tracing: Wired but Silent

We instrumented a new Go service with OpenTelemetry on day one and configured it to emit nothing, because no collector had been chosen. On separating a code decision from an operational one, why that beats both "add it later" and "pick a backend now", and the small print that makes it honest.

A Database Connection That Cannot Hurt the Monolith

The new service reads the old service's database during the shadow phase, which makes it a liability unless the connection is constrained by construction. On acceptance criteria phrased as capabilities a service must lack, why readiness and liveness must not agree about the database, and configuration that fails loudly at startup.

A Cutover That Can Be Reversed

Reversibility as an acceptance criterion rather than a rollback plan written the night before. On phasing an extraction so each step can be undone, why "we can revert the deploy" stops being true the moment data moves, and the criterion that what stays behind must be as explicit as what moves.

An Architecture Specified in Numbers, Not Adjectives

"Scalable and reliable" is not a specification — it's a wish with good PR. On writing a target architecture as mechanisms and budgets, requiring every design to name its tradeoffs alongside its boundaries, and giving every known failure mode a queryable signal before any of it is built.