Status is the outcome

A run’s exit status is a pure function of its outcome, computed once and nowhere stored: status(Ok _) = 0; an error’s status is its exit_code(); exit n is n; a stop by signal s is 128 + s. Shell::last_status ($?) is deleted, with every write to it, its wire mirror in WireShell, and its slot in the run door’s panic checkpoint — nothing is recorded, nothing folds back, nothing resets on lambda entry.

design/failure.md’s “a Bool is data, not a verdict” now holds at the process boundary too: a run that returns exits 0 whatever it returned, so a script whose last statement is false exits 0. A successful command’s audit observation carries status 0 alongside its value. try and ? write nothing to reach this rule; they already only ever handled failure, not Bool.

Rejected: a clause status(Ok(Bool false)) = 1, keeping the old exit codes. It would have kept the one place where a Bool is again a verdict — the asymmetry this decision exists to remove.

See also failure, shell-state, evaluator.