โ† Back to Features

Four implementations

Python, Go, C# and TypeScript implementations of the same protocol, held together by a live interop matrix where every client talks to every server over a real socket.

The same control channel is implemented four times: Python (the reference), Go, C#, and TypeScript. Python remains the behavioral oracle โ€” where a wire format or an observable string is in question, what the Python server does is the answer. Two exceptions run the other way: C# is canonical for the graphical-target registry and for multi-tenancy, and the others are held to it.

Four implementations are only worth having if they actually agree, so the agreement is a thing that runs.

Layer A โ€” the offline corpora

Each port carries differential corpora beside it: recorded inputs, recorded decisions. They prove that each language decides the same things.

They prove nothing about wiring. A port can pass ten thousand corpus tests without ever having started a server and had a client talk to it.

Layer B โ€” the live matrix

Every client language against every server language, over real sockets on ephemeral ports: sixteen cells, across ten scenarios covering health, session authorization, error shapes, step references, the hijack lifecycle and its refusals, rate limits, open-while-held, and strict fan-out admission.

A cell passes only when both of these hold:

  1. Every expectation the scenario wrote down. Expectations are evaluated by the harness, never by a driver โ€” so four languages cannot end up disagreeing about what an expectation means, only about what their server did.
  2. Agreement with the reference cell, field for field, against what the Python-client-on-Python-server cell observed.

The second is what earns the matrix its keep. A scenario can only assert what somebody thought to assert; agreement catches the fields nobody thought about, and that is exactly where parity drifts. Fields that legitimately differ between runs โ€” a clock, a generated id โ€” are named in a step’s volatile list, so what is tolerated is written down rather than guessed at.

Nothing skips silently

A scenario may require capabilities. The harness checks the client’s registered capabilities and the server’s announced capabilities before launching, then validates what the client reports back. A missing capability produces an explicit unsupported cell โ€” never a silent skip. A driver that was not built is printed too, with the reason.

The rationale is in the harness’s own README: four green cells and sixteen green cells produce the same summary line. So the count, and every gap, is always printed.

Held to their own gates

Each port carries its own quality gate rather than borrowing Python’s: mutmut for Python, a Go mutation gate, Stryker.NET for C#, StrykerJS for TypeScript, each with its own documented-equivalent allowlist. The ports key those allowlists on mutation content โ€” file, mutator, source line, replacement โ€” so an unrelated edit above an entry no longer silently invalidates it.

What actually serves traffic

The served server backends are Python (FastAPI), Go, C#, and Cloudflare Workers. The TypeScript package is a high-coverage partial runtime port whose completed libraries hold 100% line, branch, and function coverage; its integrated Node server exists for the matrix, not as a deployment target.

Go and C# live outside the uv and npm workspaces with their own toolchains and CI โ€” they are ports of the platform, not packages of it.