SIGN IN SIGN UP

feat(rustd): the money gates decide — and say which kind of no they mean

§2's money half. The gate pass answers a four-arm `Admission` instead of the
Zig's `?Billed`, where whether an event was terminally killed is decided by
whether the function happened to call `blockEvent` before returning null — six
of `runBilling`'s ten exits do, four do not, and the type carries none of it.
Admit / Refuse / Retry are now distinguishable without reading each exit, and
the terminal write is applied once by the caller as a function of the value.

Fault posture stops being a `catch`. `balanceCoversEstimate` fails open at three
separate `catch return true`; here each gate carries a `Gate` naming what its
own failure means and `Gate::absorb` applies it, so fail-open is a fact beside
the gate's name. `budget.zig` reached this on its own — its `BudgetRead` union
exists so `refusalFor` can be pure — and Rust needs no union for it: a fault is
`Err`, a verdict is `Ok`.

Two crate decisions, both against the download numbers and both recorded:
jiff over chrono/time (161.8M vs 56.6M recent) because a civil date is a type
distinct from an instant, which is what the UTC-month window turns on — the Zig
walks epoch-day → year-day → month-day by hand and carries a leap-February test
to prove it. And NO rate cache: `model_rate_cache.zig` is 300 lines of
fixed-capacity table and collision proof, but `LOAD_RATE_WITH_REVISION` already
returns the rate and its generation in one snapshot, so reading fresh costs one
round trip — fewer than the Zig's cached path — with no generation to compare.

Deliberately not rust_decimal. The authored ceiling is f64, the ledger is i64
nanos, and the daemon this must stay row-equivalent with rounds `dollars * 1e9`.
A decimal between them is more correct in the abstract and a divergence in the
only thing Invariant 5 grades.

The logging gate is clean for the first time: orly 0.7.1 fixed four of the six
known false positives, and banner/fatal — where writing to a stream IS the
design — now carry the sanctioned `// logging:` reason. PROMPT_ORLY_LOGGING_
GATE_RUST.md retires with them.

Spec amendments: §5 split along its call sites (every non-test caller traced —
the stored parser is the lease and mint verbs', the markdown parser is M178's
and M179's, none of it this milestone's), so Dimension 5.1 is the stored corpus
and M178 gains 3.4. M181 §5 gains the metrics PIPELINE it was written as if
M176 had shipped — M176 shipped spans; there is no metric instrument in the
tree — with opentelemetry_sdk's `metrics` feature replacing ~1,450 ported
lines, and 6.4 re-scoped to the overflow BOUND since the SDK spells overflow
`otel.metric.overflow` where the Zig uses `_other`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
K
Kishore Kumar committed
63d7565536ee84dba20d7d54fb634df4b33834a5
Parent: 843b6fb