release: v0.19.0 - #159
Merged
Merged
release: v0.19.0#159
Conversation
Minor, not patch: `websec init --claimspec` is new public CLI surface, and the README's release section states that in the 0.x series a feature addition increments the minor version. Contents, all already on main since v0.18.0: - feat(claimspec): the `ignore` kind writer (#157) - fix(detectors): the substance of #142 and #143, with controls (#155) - fix(detectors): #128 and #143 with the controls they were missing (#154) - the calibration table's prose contradicted its own counts - docs: technical brief + GitHub Pages (#153, #156), spec 002 public evidence and three README corrections (#158) The migration note calls out the one thing a CI author should expect: FEWER findings, because four false-positive sources are fixed. Each ships with the paired true-positive control, so it is a precision gain rather than a coverage loss. tests/test_explained_brief.py: the brief's release-count assertion counted every changelog heading and compared it to a literal 28 -- the running total. The brief is a snapshot of STATED_VERSION and says so on its own last page, so that pin failed on every release while proving nothing extra: a brief cannot overstate a release that shipped after it was written. It now counts releases at-or-before STATED_VERSION. The equality and the prose check both remain, so a brief that overstates what existed at its own version still fails. The original loose regex is kept as the counting basis -- a three-component regex drops the grouped `## [0.2.x]` heading and yields 27. Logged as bug-339. Deliberately NOT done here: the brief still reads v0.18.0. Bumping its masthead means re-stating the release count, moving the cadence figure's last point and regenerating the PDF -- a design pass on a published artifact, not release mechanics. Verified: 1579 tests OK (skipped=2); docguard guard exit unchanged from baseline; docguard specs --check clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.
Cuts the release that has been sitting on
mainsince v0.18.0 — 90 lines of[Unreleased]acrossseven sections, including a feature and four false-positive fixes.
Why 0.19.0 and not 0.18.1
websec init --claimspec PATH|-is new public CLI surface, and the README's release sectionstates the rule: "In the 0.x series, feature additions or incompatible contracts increment the
minor version."
Stating the counter-evidence honestly: this rule has been broken before — 0.15.3, a patch,
shipped two entirely new commands (
websec demo,websec explain). That reads as a lapse ratherthan a policy, so this follows the written rule.
Contents
feat(claimspec)— theignorekind writerfix(detectors)— the substance of #142 and #143, with controlsfix(detectors)— #128 and #143 with the controls they were missingMigration: none required, but the note calls out the one thing a CI author should expect —
fewer findings. Four false-positive sources are fixed, so a
--fail-ongate or baseline diffthat tripped on a
timing-unsafe-compareagainst a length, aweak-password-hashover anidentifier, an extension handler whose sender check sat behind an alias, or a PII projection that
actually removed the field now comes back clean. Each fix ships with the paired true-positive
control, so it is a precision gain, not a coverage loss.
One test assertion changed — please read this bit
tests/test_explained_brief.pycounted every## [x.y]heading in the changelog and comparedit to a literal
28— the running total. The brief is a snapshot ofSTATED_VERSIONand says so onits own last page ("asserted by the test suite against the source tree at the version in the
masthead"), so that pin failed on every release while proving nothing extra: a brief cannot
overstate a release that shipped after it was written. Its sibling pins were already relaxed for
exactly this reason (test count is a floor; the masthead only has to be a shipped version), so
this looks like an oversight rather than policy.
It now counts releases at-or-before
STATED_VERSION. The equality and the prose assertion bothremain, so a brief that overstates what existed at its own version still fails:
The original loose regex is kept as the counting basis — a stricter three-component regex silently
drops the grouped
## [0.2.x]heading and yields 27. Logged asbug-339.Per AGENTS.md this rewrites an existing assertion, so it wants a human read. Happy to revert it and
instead do a full brief refresh if you'd rather keep the strict pin.
Deliberately not done
The brief still reads v0.18.0. Bumping its masthead means re-stating the release count, moving
the cadence figure's last point and regenerating the PDF — a design pass on a published artifact,
not release mechanics. Worth its own PR.
Verification
python3 -m unittest discover -s tests→ 1579 tests OK (skipped=2)docguard guard→ exit 2, unchanged from baseline;docguard specs --checkcleanpython .github/scripts/release.py tag-version→version=0.19.0 should_tag=truerelease: v0.19.0.release-tag.ymlmatchesthe head commit subject; a merge commit would retitle it and the train would silently skip, as it
did for v0.17.0.
🤖 Generated with Claude Code