~/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. Ten 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 →
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.

9 min

Designing a deterministic kernel

Event-driven systems rot into callback soup where no two runs behave alike. Here's the cure I used in a trading engine: one queue, one pure reducer, one journal, one effect executor — and the discipline that makes two replays byte-identical.

9 min

Fast event-driven IPC in .NET, with ZeroMQ and NetMQ

Two processes, one firehose of events, no broker. What ZeroMQ actually is, which socket pattern fits which job, real throughput numbers, the foot-guns that eat your messages silently — and the lock-step protocol that buys determinism over a socket.

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.