Repository navigation
No code changed from v0.2.0. What changed is the commitment: Authority, JurisdictionAssignment, BoundaryData, Geometry and Resolver are stable surface now, and breaking any of them needs a v2.
That is worth committing to because the shape has been used rather than merely published. cboxdk/laravel-tax resolves US addresses through this package, and the register's own conformance deck — addresses in, expected authority set out, cut from the artifacts a release actually ships — passes through it.
Two readers of one format drifting apart is the failure this package exists to prevent, and it is the failure v0.1.0 shipped: it read a formatVersion 3 artifact as a v2 one, dropped every authority, and answered "no local authority levies here" for every address in all twenty-four Streamlined states. Its own suite stayed green the whole time, because every fixture had been hand-built to match the parser rather than the publisher. A deck that both sides run is the only thing that proves they agree.
What you are committing to as a consumer
- An authority is level AND code. A county and a special district can file under the same number and levy separately, so matching on the bare code merges two bodies that each want their own share.
nullis not[]. Null means no layer answered — fall back to the state rate. An empty list means a row answered "no local authority levies here", which is an answer. Useresolved()rather than checking emptiness.- An unknown
formatVersionthrows. A version this code cannot read has to stop: the alternative is a confident answer that is wrong in the direction nobody audits.
Upgrading from v0.1.0
$assignment->authorities is list<Authority>|null, not list<string>|null. Read $authority->key() ('county:209') or join on {stateFips, $authority->level, $authority->code}.