I build software end to end.
I'm Scott Mallinson, a software engineer at Travelport in Barcelona, fifteen years in. I write about API design, type systems, guardrails for AI features, and the maintenance that keeps a codebase navigable.
Guardrails belong at every boundary, not just the front door
Validating user input is the most familiar guardrail and the smallest part of the problem. The model's own output, what it hands to tools, and what gets rendered afterwards all need the same fail-closed treatment.
What a promotion actually asserts
For an AI feature with guardrails, releasing it carefully requires two disciplines: coordinating multi-service promotions with evidence at each step, and keeping the validation environment faithful enough that human feedback can be trusted.
What AI features force you to specify
When you add an AI layer to a retrieval feature, data decisions that developers used to make by instinct become explicit contract requirements. Live demos are often the first place you find out which ones are missing.
The guardrail is the feature
An agent that plans feature flag removals is useful. The rule about which flags it may never touch is what makes it safe to leave running, and what let the job move to the person who actually wants it done.
Bad acceptance criteria ship as bugs
Ambiguity in acceptance criteria doesn't disappear when implementation starts. It becomes a decision made without full context. The lineage problem, staleness semantics, product positioning: caught before a sprint begins, they're conversations. Caught after, they're migrations.
The demo is the test
A feature that passes every test can still be broken in ways the test suite is structurally unable to see. Four kinds of blindness that only surfaced once real stakeholders started using an AI booking assistant in a room.