Release 0.3.0: six new verbs, and eleven goldens re-captured for the stamp - #72
Merged
Conversation
…stamp Seventeen commits since `v0.2.0`, six of them verbs a reader can run -- `export`, `check`, `history`, `calendar`, `load` and `reconcile`. The theme under them is the one this project keeps finding: a state for what the tool could not decide, kept apart from a clean result. `PARSER_VERSION` is held equal to the project version by `test_release_metadata.py`, so the bump moved the stamp on every emitted document and eleven committed parses went stale at once -- four goldens under `tests/golden/` and seven watch baselines under `data/parsed/`, each with its own regeneration entry point (`make golden` and `make watch-baseline`). The first `make verify` after the bump was red on eleven tests, which is those two corpora doing their job. The recapture is recorded in the changelog because a golden re-captured without a stated reason stops being evidence. It ran from the seven source PDFs already on disk -- each first confirmed against its `sources.toml` sha256 by `make verify-source`, all seven matching -- so nothing was re-fetched and no upstream document could have moved underneath it. The whole diff across all eleven files is eleven lines: `parser_version` 0.2.0 -> 0.3.0, one per file. No price, no date, no coverage figure, no line count. That is the check that makes the recapture safe, and it is why it is quoted in the changelog rather than asserted. Version statements moved: `pyproject.toml`, `PARSER_VERSION`, `CITATION.cff` (with `date-released`), the README's install pin and `verify-tag` example, and a dated `## [0.3.0]` changelog heading. `uv.lock` records the project's own version, so the bump invalidated it and it is regenerated here (`uv lock` reported `ca-tariff-parse v0.2.0 -> v0.3.0`). Verified: `make verify` green -- ruff, mypy over 30 source files, 677 passed, 2 skipped. Both skips are pre-existing and documented (a construction-time refusal checked a layer earlier; a fixture that emits no charges). Neither is a release check that skipped itself into silence.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this is
v0.2.0was released on 2026-09-01. Seventeen commits have landed since, sixof them verbs a reader can run —
export,check,history,calendar,loadand
reconcile. The theme underneath them is the one this project keeps finding:a state for what the tool could not decide, kept apart from a clean result.
The part worth reviewing: eleven goldens moved
PARSER_VERSIONis held equal to the project version bytest_release_metadata.py, so bumping the release version moves the stamp onevery emitted document. Eleven committed parses went stale at once, across
two separate corpora with two separate regeneration entry points:
tests/golden/make goldendata/parsed/(watch baselines)make watch-baselineThe first
make verifyafter the bump was red on eleven tests. That is bothcorpora doing their job, and it is the reason this is worth a careful read rather
than a rubber stamp: a version bump that silently rewrote committed parse output
would be republishing evidence.
So the recapture is constrained and the constraint is checked:
It ran from the seven source PDFs already on disk. Nothing was re-fetched,
so no upstream utility document could have moved underneath it.
Each was first confirmed against its
sources.tomlsha256 bymake verify-source— all seven matched, so the bytes parsed now are thebytes the existing goldens came from.
The whole diff across all eleven files is eleven lines, one per file:
No price. No date. No coverage figure. No line count. That is quoted in
CHANGELOG.mdrather than merely asserted, because a golden re-capturedwithout a stated reason stops being evidence.
A consumer holding a
0.2.0parse and comparing it against a0.3.0one nowgets
PARSER_DIFFERENTrather than a silent comparison, which is what that fieldis for.
diff.pyalready documents the other half: equal stamps arePARSER_INDETERMINATE, never proof that the same build read both.Version statements moved
pyproject.toml,PARSER_VERSION,CITATION.cff(withdate-released), theREADME's install pin and its
verify-tagexample, a dated## [0.3.0]heading,and
uv.lock— which records the project's own version, so the bump invalidatedit and
uv sync --lockedwould have failed.uv lockreportedca-tariff-parse v0.2.0 -> v0.3.0.How it was verified
make verifygreen: ruff, mypy over 30 source files, 677 passed, 2 skipped.Both skips are pre-existing and documented — a construction-time refusal checked
one layer earlier, and a fixture that emits no charges. Neither is a release
check that skipped itself into silence, which is the failure mode a green
release gate hides.
release.yml's own two checks simulated against this tree: tag-vs-pyprojectparity matches, and the changelog carries a
## [0.3.0] - 2026-09-07heading inthe stricter dated form
test_release_metadata.pyrequires, not just thesubstring
grepthe workflow uses.What this does not do
No tag, no release, no PyPI. Nothing in this repository triggers on a tag —
release.ymlandpublish-pypi.ymlare bothworkflow_dispatch-only, and theyare separate dispatches, so a GitHub Release does not reach PyPI. PyPI remains
blocked on the owner registering the trusted publisher;
docs/ROADMAP.mdcarriesthe five fields verbatim.
Prepared with AI assistance; reviewed before submission.