Skip to content

Releases: Verdenroz/soothfast

v0.3.4

Choose a tag to compare

@soothfast-bot soothfast-bot released this 27 Sep 20:05
facad89

Overview

A measure that reuses a stored callgrind run now keeps every counter that run recorded, not only ir, allocs and bytes. In 0.3.3 a reuse hit dropped the perfcnt and asyncexec counters from the saved baseline, so any soothfast:claim on perfcnt.instructions failed docs check with no measurement. report changelog without --against-ref now refuses to run when CHANGELOG.md already records a release, instead of silently replacing a populated Unreleased section with an empty initial-surface one.

Upgrade notes

Nothing is required. A job that caches a baseline saved by 0.3.3's measure should drop that cache entry once, since the saved file is missing counters and a restored copy keeps failing claims until it is measured again. A report changelog call that omitted --against-ref on a repository with a released section now exits nonzero and names the ref to pass.

🐛 Fixes

  • Refuse to empty a populated changelog without --against-ref (#223)
  • Carry every counter on a reused callgrind baseline (#221)

v0.3.3

Choose a tag to compare

@soothfast-bot soothfast-bot released this 26 Sep 22:31
888ff57

Overview

A pull request's gate no longer measures its merge-base from scratch when the default branch already has. With gate: true, the action now gates every push to the default branch against its parent, which stores that commit's run for the next pull request to reuse. Stored runs are keyed on the backend that actually measured and, for callgrind, on the CPU valgrind presents to the program, the libc it loads and the valgrind version, rather than the host's model name, so hosted runners of different CPU models share them. measure reuses a stored callgrind run of the same bench binary and measures only timing again. A perfcnt run is stored only when a second reading of its counters agrees with the first, so one bad reading can no longer fail every later gate that reuses it.

Upgrade notes

A workflow that already calls the action on pushes to its default branch starts recording with no change; that is one extra gate per push. For pull requests to benefit, cache .soothfast/runs in the same job on pushes and pull requests alike, and add .soothfast/ to .gitignore, since a run is stored under its commit only from a clean tree (see docs/gating.md, "Reusing a measured reference"). Runs stored by 0.3.2 and earlier are not reused: their keys named neither the backend nor the callgrind guest, so the first gate after upgrading measures in full. A bench binary built with an older harness than the CLI cannot answer the new --env probe, and the gate then runs without its cache and says so; bump soothfast in Cargo.lock along with the CLI. measure --no-reuse measures in full when a stored run should not be trusted.

✨ Features

  • Measure reuses a stored callgrind run of its binary (#212)
  • Record a reference run on default-branch pushes (#208)

🐛 Fixes

  • Store perfcnt runs only when readings agree (#213)
  • Key stored runs on the backend and guest that measured (#211)

📦 Dependencies

  • Bump syn from 3.0.4 to 3.0.5 in the all-dependencies group (#203)

🔍 API surface

# soothfast-measure
ADDED    soothfast_measure::callgrind::Guest
ADDED    soothfast_measure::callgrind::guest
ADDED    soothfast_measure::callgrind::print_guest_view
CHANGED  soothfast_measure::main (body)
CHANGED  soothfast_measure::runner::main (body)

v0.3.2

Choose a tag to compare

@soothfast-bot soothfast-bot released this 12 Sep 01:00
69e2e92

Overview

Settings that had to be repeated on every command line move into soothfast.toml: the Cargo features a gate, a measurement or spec generation builds under, and the features and packages the changelog reads its API surface from. The gate stops letting a reference it could not pin decide a verdict quietly. When a pull request moves soothfast across a requirement the merge-base excludes, the gate rewrites that requirement in its throwaway worktree and retries, and when the pin still cannot land it says so in the banner, the verdict line and the triage artifact rather than reporting the harness delta as the code's. The changelog draft now drops the bot's own regeneration commits by author, so a release stops listing the paperwork that produced it.

Upgrade notes

Nothing changes for a repository running 0.3.1 today. Every key and flag here is opt-in, and an absent or unchanged soothfast.toml behaves exactly as before. Three things are worth knowing. A repository that renamed the action's bot-slug sets [changelog] bot-author to match, or its bot's commits keep appearing in its changelog. A gate run whose reference harness could not be pinned now fails a regression instead of reporting it as the measured code's; read the deltas first, and pass --allow-harness-change only once they are the shape of a harness bump rather than a change. And an unknown key under [gate] or [changelog] is an error, where a [changelog] table was previously skipped whole.

✨ Features

  • Read gate and changelog features from soothfast.toml (#195)

🐛 Fixes

  • Drop the soothfast bot's own commits from the changelog (#199)
  • Pin the gate harness across an incompatible requirement (#196)

v0.3.1

Choose a tag to compare

@soothfast-bot soothfast-bot released this 06 Sep 14:16
80b18d8

Overview

A follow-up to 0.3.0 for repositories whose layout the one-step action could not yet run as declared. The action now passes Cargo features through to the gate, the baseline measurement, and spec generation, with a separate feature set for the changelog's API surface; it can diff the changelog over crates that have no bench target; and regen-run lands any other derived file (an SDK, a rendered report) through the same bot pull request. The broker now judges an annotated tag by the commit under it, so a release from such a tag cannot fail on the tag object.

Upgrade notes

Nothing changes for a job that already runs 0.3.0. A bench target that declares required-features needs features: on the step; a crate with an API but no bench needs changelog-packages:; a repository whose derived files come from sdk gen or a custom command moves that command into regen-run: with its output paths in regen-paths:, both required together. See docs/ci.md for the input table.

✨ Features

  • Feature, package, and custom regeneration inputs (#187)

🐛 Fixes

  • Peel annotated tags in the broker's tag rule (#188)

v0.3.0

Choose a tag to compare

@soothfast-bot soothfast-bot released this 06 Sep 13:39
2a9090f

Overview

soothfast now installs into another repository in one step: one uses: Verdenroz/soothfast@v0.3.0 step in an existing workflow, the Soothfast Bot GitHub App installed once, and no secrets. On pull requests the step gates every bench-carrying package against the base branch and posts the result as soothfast-bot; on pushes to the default branch it regenerates CHANGELOG.md and any generate-mode specs and lands them as a pull request that soothfast-bot opens and merges itself. The credential behind that is a one-hour installation token minted by a small broker from the job's own GitHub Actions OIDC identity, only for a job in a soothfast-bot environment on the repository's default branch; a pull request job never holds a token at all, the broker posts the comment for it. Release notes now keep scoped and breaking conventional-commit subjects, and the API surface block reports a public field or variant change as a signature change.

Upgrade notes

The action now gates pull requests and regenerates on default-branch pushes by default. A job that only bumps the tag on the 0.2 Setup cargo-soothfast step gets a second gate run on pull requests and, on its default branch, a regeneration that fails at the token step. To keep the install-only behaviour, pass gate: false and changelog: false. To use the bot, install the App, create an environment called soothfast-bot with no branch policy, give the job contents: read, pull-requests: write, and id-token: write, and turn on auto-merge if the default branch has required checks. Callers of the reusable soothfast-gate.yml no longer need to pass any secret; the CHANGELOG_APP_PRIVATE_KEY secret is still declared, optional and ignored, for this release. soothfast_report::changelog::Change gained the public fields scope and breaking; a struct literal built outside the crate needs both. See docs/ci.md.

✨ Features

  • Soothfast-bot identity for comments, pages, releases (#165)
  • One-step soothfast action with bot landing (#164)
  • Soothfast-bot OIDC token broker (#160)

🐛 Fixes

  • Count struct and enum members as signature (#178)
  • Keep scoped and breaking subjects in the changelog (#176)

⚡ Performance

  • Reuse the gate's worktree, binaries, and rustdoc output (#156)

📦 Dependencies

  • Bump github/codeql-action/upload-sarif from 4.37.8 to 4.37.9 (#170)
  • Bump zizmorcore/zizmor-action from 0.6.2 to 0.6.3 (#168)
  • Bump taiki-e/install-action from 2.86.7 to 2.87.2 (#171)
  • Bump step-security/harden-runner from 2.21.0 to 2.21.1 (#169)
  • Bump dtolnay/rust-toolchain to current stable (#166)
  • Bump taiki-e/install-action from 2.86.6 to 2.86.7 (#152)
  • Bump astral-sh/setup-uv from 6.4.3 to 10.0.1 (#151)
  • Bump step-security/harden-runner from 2.20.0 to 2.21.0 (#153)
  • Bump syn from 3.0.3 to 3.0.4 in the all-dependencies group (#150)

🔧 Internal

  • Check release binaries against the target list (#177)
  • Author the gh-pages commit as soothfast-bot (#174)
  • Move every workflow off the App private key (#163)
  • Land the changelog as soothfast-bot via the broker (#161)

🔍 API surface

# soothfast-docs
CHANGED  soothfast_docs::diff::SurfaceDiff (body)
CHANGED  soothfast_docs::surface::ItemInfo (body)
CHANGED  soothfast_docs::surface::from_rustdoc (body)

# soothfast-report
ADDED    soothfast_report::changelog::unparsed_subjects
CHANGED  soothfast_report::changelog::Change (signature)
CHANGED  soothfast_report::changelog::changes_from_subjects (body)

v0.2.0

Choose a tag to compare

@soothfast-bot soothfast-bot released this 30 Aug 19:47
ead9d50

Overview

Four gaps a consumer hit in practice, closed. Bind fingerprints no longer go stale when someone edits a comment, spec probe can reach a POST route and lock what passed when an upstream flakes, and release notes lead with what merged, grouped by type and carrying their pull requests, with section icons a repo can override in its own soothfast.toml.

Intel macOS gets a prebuilt binary again. v0.1.19 shipped four of five: that job was pinned to a retired runner image, so it was never scheduled and timed out a day later as cancelled, failing nothing and uploading nothing. It now cross-compiles on the arm64 runner, and a check counts what actually attached.

The minor bump is deliberate: two public items changed incompatibly, and under 0.x cargo treats a patch bump as compatible, so shipping this as 0.1.20 would have handed a direct dependent a compile error on a routine cargo update.

Upgrade notes

If you commit a soothfast.lock, it needs a one-time re-accept. A bind fingerprint used to hash every byte of an item's source span, comments included, so rewording a // inside a bound function reported the prose as STALE saying "code changed under this prose" when no code had. Ordinary comments are now stripped before hashing. /// and //! still count, because a doc comment on a field is part of the contract the prose is bound to.

Changing the hash input invalidates every existing lock. You do not have to work out which pages are affected: run docs check and it names the command for each one. First it reports the format itself, once per invocation, until your first accept rewrites the lock at v2:

FAIL  soothfast.lock is format v1, this build derives v2: fingerprints
      are not comparable across formats, so re-verify each bind, then
      `docs accept`

After that first accept the format line is gone for good, and each page you have not reached yet reports not locked and names the package that owns it. Re-verify the prose, then accept once per package, with explicit paths. A full-scope accept (no paths) errors on the first bind outside the named package, so a repo whose binds span several crates cannot migrate in one command. This repo's nine binds took five invocations; yours will differ:

$ cargo soothfast docs accept -p soothfast         README.md docs/index.md
$ cargo soothfast docs accept -p soothfast-measure docs/measuring.md docs/gating.md
$ cargo soothfast docs accept -p soothfast-docs    docs/living-docs.md
$ cargo soothfast docs accept -p soothfast-spec    docs/spec.md
$ cargo soothfast docs accept -p soothfast-sdk     docs/sdk.md

Order does not matter. Only fingerprints move: no prose is rewritten. A lock written by a newer build is refused rather than overwritten, so an older CLI cannot silently delete a teammate's accepted binds.

Library API. Two items changed incompatibly. Neither affects the CLI or soothfast itself, only code depending on the engine crates directly:

  • soothfast_docs::lockfile::read now returns Lock (the binds plus the format version they were written under) instead of Binds. Reach for .binds where you had the map, and lockfile::comparable where you want entries a fresh accept may merge over.
  • soothfast_report::changelog::DraftInputs gains two required fields. Pass changes: &[] and icons: &Icons::default() to keep the previous behavior; both work inline in the struct literal.

Nothing else needs action. Measurement baselines and soothfast-gate.lock are unaffected: they key on the macro-side fingerprint, which never saw comments in the first place, so soothfast.lock is the only file that moved.

✨ Features

  • Give dependency updates their own section (#135)
  • Let a repo configure its changelog section icons (#132)
  • Lead release notes with what merged (#128)
  • Probe non-GET routes and lock what passed (#125)
  • Gate accept headroom, partial --only, walltime downgrade (#116)

🐛 Fixes

  • Build the Intel macOS binary on a live runner (#134)
  • Stop hashing comments in bind fingerprints (#124)
  • Resume changelog regen on bracketed headings (#121)
  • Gate accept cache reuse and swallowed cargo stderr (#114)
  • Sync untracked .cargo/config.toml into gate worktrees (#113)

📝 Documentation

  • Size --headroom to real jitter, not one run (#117)

📦 Dependencies

  • Bump step-security/harden-runner from 2.20.0 to 2.21.0 (#138)
  • Bump github/codeql-action/upload-sarif from 4.37.0 to 4.37.8 (#140)
  • Bump Swatinem/rust-cache from 2.9.1 to 2.9.2 (#141)
  • Bump ossf/scorecard-action from 2.4.3 to 2.4.4 (#139)
  • Bump taiki-e/install-action from 2.85.13 to 2.86.6 (#137)

🔍 API surface

# soothfast-docs
ADDED    soothfast_docs::lockfile::Lock
ADDED    soothfast_docs::lockfile::VERSION
ADDED    soothfast_docs::lockfile::comparable
CHANGED  soothfast_docs::lockfile::read (signature)
CHANGED  soothfast_docs::lockfile::write (body)
CHANGED  soothfast_docs::surface::ItemInfo (body)

# soothfast-spec
ADDED    soothfast_spec::probe::shape::template_matches

# soothfast-report
ADDED    soothfast_report::changelog::Change
ADDED    soothfast_report::changelog::Icons
ADDED    soothfast_report::changelog::changes_from_subjects
CHANGED  soothfast_report::changelog::DraftInputs (body)
CHANGED  soothfast_report::changelog::draft (body)

v0.1.19

Choose a tag to compare

@soothfast-bot soothfast-bot released this 27 Aug 23:58
bd5c260

Overview

A feature release adding cargo soothfast gate accept, a docs accept-style mechanism for a benchmark whose cost genuinely changed as the reviewed result of a bug fix.

Notes

Currently-failing metrics are recorded into a committed soothfast-gate.lock with a required justification. gate reports a covered metric as ACPT instead of FAIL as long as the reference side hasn't moved past the reviewed commit, treating the accepted value as a one-sided ceiling rather than widening the bench's tolerance permanently. The entry is pruned automatically once a real baseline captures the accepted cost as the new normal.

API surface

No public API changes.

Performance

item metric was now delta
no movement past gate thresholds

v0.1.18

Choose a tag to compare

@soothfast-bot soothfast-bot released this 25 Aug 23:11
8ee6d6c

Overview

A patch release making registry dumps build under the dev profile: route discovery in spec check, spec gen, and sdk gen, and the item listing in coverage measure. No public API changes to the library crates; measure/gate numbers are unaffected.

Notes

A registry dump only executes the bench binary to print its linkme registrations, but it was built exactly like a measurement: bench profile at opt-level 3 with codegen-units pinned to 1. For downstream workspaces that pinned, optimized compile dominated spec check wall clock in CI. Discovery runs now pass --profile dev and skip the pin; measurement commands (measure, gate, trend, report) still build the bench profile pinned to codegen-units = 1.

Discovery artifacts also land in target/debug instead of sharing the bench profile's directory, so jobs that mix discovery and measurement no longer invalidate each other's build caches.

API surface

No public API changes.

Performance

item metric was now delta
no movement past gate thresholds

v0.1.17

Choose a tag to compare

@soothfast-bot soothfast-bot released this 24 Aug 15:42
1b87d6d

CI-only release, no runtime behavior change. cargo-soothfast's own CI now builds itself once per run and shares that binary across the docs, gate, and deploy jobs instead of rebuilding from source in each; release binaries are now published for five platforms instead of just x86_64-unknown-linux-gnu.

A new composite action (action.yml at the repo root) installs the CLI in a consumer's own CI with the version pinned from its Cargo.lock, cached across workflow runs.

SOOTHFAST_BENCH_TOOLCHAIN lets a job pin cargo bench's toolchain independently of the active one, set alongside SOOTHFAST_RUSTDOC_TOOLCHAIN so a job running both spec/docs and rustdoc-JSON commands compiles its dependency graph once instead of twice. measure/gate are unaffected unless a caller sets it.

API surface

No public API changes.

Performance

item metric was now delta
no movement past gate thresholds

v0.1.16

Choose a tag to compare

@soothfast-bot soothfast-bot released this 22 Aug 16:10
7750e0c

Overview

A patch release fixing a gate false positive on short, allocator/dynamic-linker-heavy benchmarks, and unifying the workspace onto one syn major version after a dependency update pulled in a second. No public API changes.

Issues fixed

  • walltime gate false-fails on short benchmarks whose instruction-counter jitter lands just past the flat 0.5% cutoff, even with an unchanged fingerprint and identical allocs/bytes (#93, #94)

Notes

Short benchmarks whose instruction count is dominated by allocator or dynamic-linker overhead could fail the walltime gate on ordinary counting jitter: a roughly 20K-instruction bench moving by 106 instructions is a larger share of its own count than the same jitter is for a benchmark with millions, so the flat 0.5% cutoff that corroborates a genuine regression missed it by a fraction of a percentage point even with fingerprint, allocs, and bytes unchanged. counters_flat_on_unchanged_code() now also accepts a fixed 150-instruction floor alongside that percentage, wide enough to absorb the jitter on small benchmarks while staying negligible above roughly 30K instructions, where the percentage still governs.

linkme 0.3.37 moved its proc-macro implementation onto syn 3. soothfast-macros now targets syn 3 as well, so the workspace's two proc-macro crates share one major version instead of leaving cargo-deny's duplicate-version check to reject the split.

Dependencies

  • linkme 0.3.36 to 0.3.37 (#85)
  • syn 2 to 3 for soothfast-macros, to keep cargo-deny's duplicate-version check passing after that bump (#96)

API surface

No public API changes.

Performance

item metric was now delta
no movement past gate thresholds