Skip to content

chore(release): bump version to 0.22.0 with its ledger rows - #770

Merged
orieg merged 4 commits into
mainfrom
chore/release-0.22.0
Oct 16, 2026
Merged

orieg merged 4 commits into
mainfrom
chore/release-0.22.0

Conversation

@orieg

@orieg orieg commented Oct 16, 2026 •

Copy link
Copy Markdown
Owner

Bumps the version to 0.22.0 and relabels the 29 unreleased ledger rows (27 Behaviour Changes, 2 Default Changes) from #768 to v0.22.0.

  • Updates Cargo.toml, discipline's entry in Cargo.lock and fuzz/Cargo.lock, CITATION.cff (version, date-released), install instructions, image and template pins, the pre-commit rev comment and the regenerated man pages.

  • RUN: discipline docs --write (up to date afterwards), scripts/release_notes_upgrade.py --test --version v0.22.0 (self-test passed) and scripts/release_notes_upgrade.py --version v0.22.0 (renders both ledger sections).

  • The repository's own hook pins (.claude/hooks/discipline-bootstrap.sh, .github/workflows/copilot-setup-steps.yml) are unchanged; they move to v0.22.0 in a follow-up once the release is published.

  • zip moves from 0.6.6 to 9.0.3: every zip release except 9.0.3 is yanked on crates.io, so cargo deny's advisories check failed (supply-chain). walk_zip now propagates an undecodable entry name instead of decoding it lossily. RUN: cargo deny check (advisories ok, bans ok, licenses ok, sources ok), cargo test --lib archive (43 passed), local dogfood PASS.

  • Consumer replay (RUN): v0.21.2 against the candidate, each with the repository's own origin/main:discipline.toml, over the last 100 merged changes of php-judy, yaml-workflow, gws-connector and expansedb and the last 200 of expanse. The first candidate newly blocked two changes with ci-integrity/exit-code-masked, both false positives of the syntax-tree masking analysis from fix: close the v0.19.0..v0.21.2 audit findings #768: php-judy feat(findings): every finding has a registered gate/code #215 (edited "$1" && echo true || echo false, a branch on a predicate function) and expanse #1411 (X=$(git merge-base a b || echo ""), a default value). Both are fixed here: an a || b whose left side only tests a condition, and an || echo / || printf default inside $(...), are not reported, while a function that runs a check (t() { cargo test; }; t || echo ok) and $(cmd || true) still are. Each fix has a test whose mutant was watched failing. With the final candidate, every replayed change has the same verdict and the same finding codes as v0.21.2 (php-judy 73/27, yaml-workflow 68/32, gws-connector 56/33, expanse 199/1, expansedb 99/1 passed/blocked).

  • RUN: full local cargo test --no-fail-fast on the final head: 141 test binaries, 4213 passed, 0 failed.

no-issue: release bump to v0.22.0

orieg added 4 commits October 15, 2026 23:31
Updates Cargo.toml, discipline's entry in Cargo.lock and fuzz/Cargo.lock, CITATION.cff version and date-released, install instructions, image and template pins, the pre-commit rev comment, the regenerated man pages, and relabels the unreleased ledger rows in docs/ROADMAP.md to v0.22.0 (RUN: discipline docs --write, scripts/release_notes_upgrade.py --test --version v0.22.0).

no-issue: release bump to v0.22.0
Signed-off-by: Nicolas Brousse <nicolas@brousse.info>
Every zip release except 9.0.3 is yanked on crates.io, so cargo deny's advisories check fails on 0.6.6. zip 9 returns entry names as a Result, which walk_zip now propagates (an undecodable name stops the archive read and is reported as could-not-check) instead of decoding it lossily, and test fixtures use SimpleFileOptions. zip 9.0.3 needs Rust 1.88; the crate's rust-version is 1.90 (RUN: cargo deny check: advisories ok, bans ok, licenses ok, sources ok; cargo test --lib archive: 43 passed).

Signed-off-by: Nicolas Brousse <nicolas@brousse.info>
… masking

The consumer replay for v0.22.0 found php-judy #215 newly blocked: `ed() { edited "$1" && echo true || echo false; }` turns a predicate function's status into a value, and the syntax-tree masking analysis read it as `|| echo` masking a check. An `a || b` whose left side only tests a condition (`[`, `[[`, `test`, `((`, `command -v`, `type`, `hash`, a `case`, a literal `return`, a negation of those, or a call to a function whose body is made of those) is now a branch, not a mask. A function that runs a check (`t() { cargo test; }; t || echo ok`) is still reported.

Mutation (RUN): dropping the condition test from the || rule fails a_branch_on_a_condition_is_not_masked_but_a_wrapped_check_is on `[ -f Cargo.lock ] || echo missing`; accepting every script function as a condition fails it on `t() { cargo test; }`. cargo test --lib guards:: 655 passed.

Signed-off-by: Nicolas Brousse <nicolas@brousse.info>
…ion as a value

The consumer replay for v0.22.0 found expanse #1411 newly blocked: `RMW_MERGE_BASE=$(git merge-base ... 2>/dev/null || echo "")` supplies a default the next line tests, and the masking analysis read it as `|| echo` masking a check. Inside a command substitution, an `|| echo` or `|| printf` right side is now a value; `$(cmd || true)` and `$(cmd || exit 0)` are still reported, as v0.21.2 reported `|| true`.

Mutation (RUN): removing the substitution rule fails a_branch_on_a_condition_is_not_masked_but_a_wrapped_check_is on the merge-base line. cargo test --lib guards:: 655 passed; clippy clean.

Signed-off-by: Nicolas Brousse <nicolas@brousse.info>
@orieg
orieg enabled auto-merge (squash) October 16, 2026 08:11
@orieg
orieg merged commit 204cdcf into main Oct 16, 2026
38 checks passed
@orieg
orieg deleted the chore/release-0.22.0 branch October 16, 2026 08:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant