~/shahin-kiassat

// software engineer · london

I build systems that don't take your word for it.

An orchestrator that re-runs the tests because the agent said “done” and was lying. A code map that has to cite file and line before I'll believe it. A trading engine that can replay its worst day in slow motion. Fifteen years of systems where being wrong costs money — mostly written in C#, though the language was never the hard part.

01 Now building

02 Operating principles

Evidence over narration

A claim about work isn't the work. The systems I build re-run the tests, read the real exit codes, and diff the artefacts — whether the thing under scrutiny is an AI agent or me, six months ago, swearing I tested it.

Determinism is a feature

If you can't replay it, you can't debug it. Append-only event logs as the source of truth, state as a projection, side effects pushed to the edges — the same discipline works for a trading engine and an agent orchestrator.

Slices over layers

Code organised by feature, not by kind. Changing one behaviour should mean opening one folder — not a controller, two interfaces, two implementations, and a mapper across four projects.

Small, typed surfaces

Whether it's an API for a team or a tool handed to an LLM: narrow contracts, validated inputs, refuse everything else. Maximal capability with no guardrails is how demos betray you in production.

03 Latest writing

all →
10 min

Gated delivery for a team of agents

Coding agents will work unattended for hours — if you stop believing anything they say. The full anatomy of an autonomous delivery loop: agent CLIs as processes, a ten-outcome vocabulary, independent gate batteries, fix sessions armed with evidence, and state that survives a power cut.

9 min

A live TUI in the AI era

The best AI tools ship terminal UIs, and suddenly everyone wants one. What .NET offers (Spectre.Console, praised and then audited), what Ink and Bubble Tea do differently, why Go keeps winning this niche — and the pattern I actually ship: a Go TUI attached to a .NET backend over SSE, with a working example.

4 min

An agent session is not pass/fail

The first version of my orchestrator judged agent sessions as success or failure. Reality needed eight outcomes — and the distinction that matters most is whose fault the failure was.

4 min

Call graphs lie about modern .NET

In a mediator-and-DI codebase, nothing calls anything — everything is connected by convention. Honest tracing means building edges from joins, and making every edge cite the file and line it came from.