Skip to content
Hanna.
← All work

Release engineering · authorization across the product · 2025–2026

"All tests green" meant nothing, so I froze the debt by name

Inherited authorization gaps meant a passing suite proved nothing. Fixing them first would have blocked every release for months, so they were frozen by name — old debt cannot pass, new regressions show the day they land.

How it was reported

All tests are green — we should be fine to release.

What it actually was

The suite was green because it was not looking. There was no deterministic gate, and authorization carried a large set of gaps that predated me.

Both obvious options were wrong. Fixing every inherited gap first would have stopped delivery for months. Releasing while they counted as passes would hide a genuinely new regression inside the noise of old debt.

What needed building was not more tests, but a gate that could tell inherited debt from a new regression and say so on every run.

What shipped

  • A permission matrix: 130+ guarded routes evaluated against 20+ reviewed permission profiles, producing 2,000+ exact pre-handler authorization decisions per run. The inherited gaps are quarantined individually, by name — so old debt cannot be reported as green, and a new regression shows up the day it lands.
  • The wider gate around it: 1,000+ repeatable Playwright cases across 150+ specs, covering the API, the web app, mobile web, cross-surface propagation and visual regression.
  • Disposable schemas with synthetic fixtures, per-case snapshot restore and credential masking, so a release is certified without touching customer data.
  • Earlier, the breaking change that introduced permission handling across every feature, and the supervisor role that scopes record visibility by department.

Evidence

repeatable release cases
1,000+
authorization decisions per run
2,000+
code reviews on pull requests
500+

No production data is required to certify a release — the property the gate was built for, and the one that makes it usable by anyone.

  • Playwright
  • MySQL
  • TypeScript
  • NestJS
  • Next.js
  • CI