0.34.0
A board is a shape and a terminal prints lines, so triage was the thing this CLI
was worst at. protocol serve answers a browser with the same facts
artifact board, show and explain print, and takes a status move back
through the same decision artifact move makes — graph re-validation included,
so the browser refuses exactly what the terminal refuses.
A rung an artifact has not earned is drawn with its price on it rather than
waiting to refuse you. A refusal comes back with every status the ladder would
have permitted, each one a button, so the answer to the question a refusal
creates is one click away.
No new dependency: about five hundred lines of HTTP over std::net::TcpListener.
A framework would have meant the first async runtime in a workspace that wrote a
busy-polling block_on to avoid one, and an MSRV that moves through the lockfile
without a commit of ours touching a line of Rust.
It binds 127.0.0.1 and no flag widens it. The URL carries a token for the run,
because loopback is not a credential — any page in the same browser can reach the
port. That is not authentication, and the module doc says so.
Underneath it, move's decision became a function that returns a value:
MoveRefusal now serialises, carrying every legal target, so a caller that is
not a terminal can render a refusal instead of parsing a sentence.