This release includes 1 security fix for security teams reviewing exposed deployments.
Topics
ReleasePort's take
Moderate signalVersion v0.4.0 adds several new flags and behaviors while removing the `--preserve`/`-p` flag; byte‑preserving becomes default for reads and writes.
Why it matters: The removal of `--preserve` (severity 70) changes existing workflows, and bumping `crossbeam-epoch` to 0.9.20 clears RUSTSEC‑2026‑0204 (severity 90), directly affecting security posture.
Summary
AI summaryUpdates Breaking, a.b, and spec.template across a mixed release.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Security | Critical |
Bumps transitive `crossbeam-epoch` from 0.9.18 to 0.9.20 to clear RUSTSEC-2026‑0204. Bumps transitive `crossbeam-epoch` from 0.9.18 to 0.9.20 to clear RUSTSEC-2026‑0204. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Breaking | High |
Removes `--preserve` / `-p` flag; byte preservation is now default. Removes `--preserve` / `-p` flag; byte preservation is now default. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Medium |
Adds surgical write tier for byte‑preserving edits. Adds surgical write tier for byte‑preserving edits. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Medium |
Introduces `-i` / `--in-place` flag for atomic in‑place mutation. Introduces `-i` / `--in-place` flag for atomic in‑place mutation. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Medium |
Supports structural delete of multi‑line and nested block entries (e.g., `del(.spec.template)`). Supports structural delete of multi‑line and nested block entries (e.g., `del(.spec.template)`). Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Medium |
Adds `--normalize` / `-N` flag to drop comments and canonicalize scalars. Adds `--normalize` / `-N` flag to drop comments and canonicalize scalars. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Medium |
Makes byte‑preserving reads the default behavior without flags. Makes byte‑preserving reads the default behavior without flags. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Medium |
Changes `--engine` to select backend only for default byte‑preserving read. Changes `--engine` to select backend only for default byte‑preserving read. Source: llm_adapter@2026-07-15 Confidence: high |
— |
Full changelog
The fidelity write tier arrives: surgical, byte-preserving edits that change only the bytes a filter targets and leave every other byte -- comments, indentation, quoting, key order -- untouched, or refuse. In the same release, byte-preserving reads become the default and the re-serializing pipeline moves behind --normalize.
Added
- Write tier: surgical value edits. yqr can now mutate a document through the fidelity engine, changing only the targeted bytes: assignment
.a.b = <rhs>(scalar literal or a.-rooted path), append.xs += <item>, new-key assign.a.new = <rhs>, anddel(.a.b). Each edit passes through the engine's re-parse guard -- an edit that would restructure the document is refused (exit 5) rather than emitted, and scalar writes are quoted to match the neighbouring style. A filter is either a read-only query or a single mutation; mixing them is a parse error. -i/--in-placeflag writes the mutated document back to the input file atomically (temp file + rename,fsyncbefore rename, symlinks followed, owner-only temp permissions). Using-iwith stdin or with a read-only filter is an error, diagnosed before any input is read. Without-i, the mutated document is printed to stdout (byte-exact except the edit).- Structural delete of multi-line and nested block entries (e.g.
del(.spec.template)), which the single-line delete path rejects. Flow-style and sole-entry deletes remain refused with a clear message. --normalize/-Nflag for the re-serializing pipeline: it drops comments and canonicalizes scalars (e.g.007becomes7).
Changed
- Byte-preserving reads are now the default.
yqr '.' file.yamlreproduces the input byte-for-byte -- comments, quoting, indentation, scalar spellings, and line endings survive -- with no flag. Untouched nodes are emitted as their original source bytes; computed, absent, and unaddressable nodes fall back to typed rendering per node. --enginenow selects the backend for the default (byte-preserving) read. Under--normalizethe re-serializing pipeline runs and the engine choice has no observable effect beyond the up-front name validation.
Breaking
--preserve/-premoved. Byte preservation is now the default, so the flag is gone. Replaceyqr -p '.' fwithyqr '.' f; useyqr --normalize '.' ffor the re-serializing behaviour.
Security
- Bumped the transitive
crossbeam-epochpin0.9.18 -> 0.9.20to clear RUSTSEC-2026-0204. It reaches the build only through thecriteriondev-dependency (benchmarks), so released binaries were never affected; the change is lockfile-only.
Full changelog: https://github.com/zoosky/yqr/blob/v0.4.0/CHANGELOG.md
Breaking Changes
- --preserve / -p removed. Byte preservation is now default; replace `yqr -p '.' f` with `yqr '.' f`.
Security Fixes
- dep: crossbeam-epoch bumped from 0.9.18 to 0.9.20 to clear RUSTSEC-2026-0204 (dev‑dependency only).
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About Yqr
All releases →Beta — feedback welcome: [email protected]