chore(release): cut 0.34.0 #467

Merged
enricobuehler merged 2 commits from release/v0.34.0 into main 2026-08-31 00:25:05 +00:00
Owner

Version bump, CHANGELOG section, user notes and Play notes for v0.34.0. 140 commits since v0.33.0.

The eight files

The same bump surface as v0.33.0, plus one drift fix:

File Why
Cargo.toml [workspace.package] version → 0.34.0
Cargo.lock cargo update --workspace; diff is 36/36 versions-only
api/openapi.json, docs-site/public/openapi.json info.version stamp; the two are byte-identical
CHANGELOG.md the v0.34.0 section, 199 lines
docs/releases/v0.34.0.md the release body, seeded verbatim by CI
docs/releases/whatsnew/v0.34.0.txt Play notes, 493/500 chars, unique
scripts/ci/docs-undocumented-env-baseline.txt prunes one stale entry, below

Why minor, not patch

Not a renumber — what the tree gained. The quick-action ring and its editors on every shell, the on-screen virtual controller on Android and Apple touch devices, and the Steam Controller 2 passthrough leaving Linux for Apple, Android and Windows hosts.

⚠️ The embedder trap: the ABI moves twice, and one step widens a struct

Every recent release has been able to say "nothing versioned moves". This one cannot.

ABI_VERSION goes 26 → 28:

  • v27 — raw HID passthrough over the C surface. This widens PunktfunkHidOutput 19 → 85 bytes, the first deliberate widening this surface has made. The pre-v27 prefix layout is byte-identical and the tail is appended, so a binary built against a v26 header passes a 19-byte out-slot that a v28 core overruns. punktfunk_abi_version() equality is the guard, as it has always been: recompile, not relink.
  • v28punktfunk_connection_host_caps2 + PUNKTFUNK_HOST_CAP2_TOUCH. Purely additive.

Second, quieter break: punktfunk_connection_next_hidout now surfaces HidOutput::HidRaw where it previously fell out as NoFrame. A puller that assumed every event was DualSense feedback must switch on kind.

Everything else versioned stands still — wire 2, driver 6, gamepad channel 3, plugin index 1, host event schema 1, gamescope pfhdr8, SDK 0.1.6, plugin-kit 0.4.4, 27 crate dirs / 39 members.

The OpenAPI caveat is gone, because the host builds on macOS again

Every release since v0.31.1 carried some version of "re-stamped, not regenerated — punktfunk-host does not build on macOS". #456 fixed the eleven compile holes, so mgmt::tests::openapi_document_is_complete_and_checked_in runs here now and the surface is verified rather than assumed. It normalises info.version on both sides, so a bump alone cannot trip it.

The spec was regenerated on main (3db1f53d, re-synced by a5593de1). Against v0.33.0 its only non-stamp diff is the disable_physical_monitors description, rewritten because the second selector it documented now runs by default. No path, operation or schema moved.

Fixed en route: a drift-gate warning nobody could see

PUNKTFUNK_STANDBY_SINK_KEEP sat in the undocumented-env baseline while #452 had documented it. check-docs-drift.sh printed baseline entries no longer undocumented on every run and still exited 0, so it was invisible in CI. Pruned here.

Generalisable: read that gate's stdout, not only its exit code.

Crediting the contributors

Two people outside the team wrote code in this cut, and the notes name both.

  • Keith Porcaro (#425, 5 commits) — the whole Steam Controller 2 push beyond Linux: the shared wire tables and DEVTYPE_TRITON, the Windows pf_triton virtual-pad backend, raw HID over the client ABI (this is what moves the ABI to 27), Apple CoreBluetooth capture, and the Android frozen-timestamp IMU gate. Five pieces, four platforms.
  • luxus (#439, #441, 2 commits) — the install script's intent-based defaults with its new check-install-defaults.sh gate, and a tightening of the v0.33.0 changelog to house style.

Worth flagging as a change of convention: every prior ## Thanks section credited reporters only — v0.31.3 even refers to "a contributor's diagnosis" without a name. This one names code authors first, then keeps the reporter list.

⚠️ Packager- and operator-visible

pf_gamepad.inx gains pf_triton, an eighth hardware id. An existing install carries the seven-id package, so the Windows SC2 backend does nothing until punktfunk-host.exe driver install --gamepad. This is in the notes' ## Before you update.

Gates, all run on the Mac

  • cargo fmt --all --check
  • cargo test -p punktfunk-core --lib --features quic511 passed, 0 failed (was 508 at v0.33.0)
  • C ABI harness — PASS, abi_version=28, the cheap oracle for the row that moved
  • the OpenAPI staleness test — PASS (new here; see above)
  • check-docs-drift.sh, check-docs-links.sh
  • cargo audit — 2 allowed warnings (audiopus_sys, paste), no yanked crates
  • both openapi copies cmp-identical; Play notes 493/500 and unique vs all 17

⚠️ cargo audit's first run errored with couldn't check if the package is yanked: request could not be completed in the allotted timeframe. That is a registry network timeout, not a finding — but it is the check that caught yanked chacha20 at v0.33.0, so it was re-run until it completed rather than accepted as a pass.

Still owed after merge

  1. Tag and push — docs/releases/README.md step 2. Tag message is drafted.
  2. Wait for every platform green. Merge-sha green does not predict tag green; the tag fires runs whose publish steps never execute on a PR.
  3. Diff the tag build's asset name set against v0.33.0's 80, version substring normalised, before announcing.
  4. Dispatch announce with the tag.
  5. Not run here: the ISO 24495 auditor on the notes (that skill never self-invokes), and the punktfunk-website / CMS pass that step 1 also asks for.
Version bump, CHANGELOG section, user notes and Play notes for **v0.34.0**. 140 commits since `v0.33.0`. ## The eight files The same bump surface as v0.33.0, plus one drift fix: | File | Why | |---|---| | `Cargo.toml` | `[workspace.package] version` → 0.34.0 | | `Cargo.lock` | `cargo update --workspace`; diff is **36/36 versions-only** | | `api/openapi.json`, `docs-site/public/openapi.json` | `info.version` stamp; the two are byte-identical | | `CHANGELOG.md` | the v0.34.0 section, 199 lines | | `docs/releases/v0.34.0.md` | the release body, seeded verbatim by CI | | `docs/releases/whatsnew/v0.34.0.txt` | Play notes, **493/500 chars**, unique | | `scripts/ci/docs-undocumented-env-baseline.txt` | prunes one stale entry, below | ## Why minor, not patch Not a renumber — what the tree gained. The quick-action ring and its editors on every shell, the on-screen virtual controller on Android and Apple touch devices, and the Steam Controller 2 passthrough leaving Linux for Apple, Android and Windows hosts. ## ⚠️ The embedder trap: the ABI moves **twice**, and one step widens a struct Every recent release has been able to say "nothing versioned moves". This one cannot. `ABI_VERSION` goes **26 → 28**: * **v27** — raw HID passthrough over the C surface. This **widens `PunktfunkHidOutput` 19 → 85 bytes**, the first deliberate widening this surface has made. The pre-v27 prefix layout is byte-identical and the tail is appended, so a binary built against a v26 header passes a 19-byte out-slot that a v28 core overruns. `punktfunk_abi_version()` equality is the guard, as it has always been: **recompile, not relink.** * **v28** — `punktfunk_connection_host_caps2` + `PUNKTFUNK_HOST_CAP2_TOUCH`. Purely additive. Second, quieter break: `punktfunk_connection_next_hidout` now *surfaces* `HidOutput::HidRaw` where it previously fell out as `NoFrame`. A puller that assumed every event was DualSense feedback must switch on `kind`. Everything else versioned stands still — wire 2, driver 6, gamepad channel 3, plugin index 1, host event schema 1, gamescope `pfhdr8`, SDK 0.1.6, plugin-kit 0.4.4, 27 crate dirs / 39 members. ## ⭐ The OpenAPI caveat is gone, because the host builds on macOS again Every release since v0.31.1 carried some version of *"re-stamped, not regenerated — `punktfunk-host` does not build on macOS"*. #456 fixed the eleven compile holes, so `mgmt::tests::openapi_document_is_complete_and_checked_in` **runs here now** and the surface is verified rather than assumed. It normalises `info.version` on both sides, so a bump alone cannot trip it. The spec was regenerated on main (`3db1f53d`, re-synced by `a5593de1`). Against `v0.33.0` its only non-stamp diff is the `disable_physical_monitors` description, rewritten because the second selector it documented now runs by default. No path, operation or schema moved. ## Fixed en route: a drift-gate warning nobody could see `PUNKTFUNK_STANDBY_SINK_KEEP` sat in the undocumented-env baseline while #452 had documented it. `check-docs-drift.sh` printed `baseline entries no longer undocumented` on every run **and still exited 0**, so it was invisible in CI. Pruned here. Generalisable: read that gate's stdout, not only its exit code. ## Crediting the contributors Two people outside the team wrote code in this cut, and the notes name both. * **Keith Porcaro** (#425, 5 commits) — the whole Steam Controller 2 push beyond Linux: the shared wire tables and `DEVTYPE_TRITON`, the Windows `pf_triton` virtual-pad backend, raw HID over the client ABI (**this is what moves the ABI to 27**), Apple CoreBluetooth capture, and the Android frozen-timestamp IMU gate. Five pieces, four platforms. * **luxus** (#439, #441, 2 commits) — the install script's intent-based defaults with its new `check-install-defaults.sh` gate, and a tightening of the v0.33.0 changelog to house style. Worth flagging as a change of convention: every prior `## Thanks` section credited **reporters** only — v0.31.3 even refers to "a contributor's diagnosis" without a name. This one names code authors first, then keeps the reporter list. ## ⚠️ Packager- and operator-visible `pf_gamepad.inx` gains **`pf_triton`, an eighth hardware id**. An existing install carries the seven-id package, so the Windows SC2 backend does nothing until `punktfunk-host.exe driver install --gamepad`. This is in the notes' `## Before you update`. ## Gates, all run on the Mac * `cargo fmt --all --check` * `cargo test -p punktfunk-core --lib --features quic` — **511 passed, 0 failed** (was 508 at v0.33.0) * C ABI harness — **PASS, `abi_version=28`**, the cheap oracle for the row that moved * the OpenAPI staleness test — **PASS** (new here; see above) * `check-docs-drift.sh`, `check-docs-links.sh` * `cargo audit` — 2 allowed warnings (`audiopus_sys`, `paste`), no yanked crates * both openapi copies `cmp`-identical; Play notes 493/500 and unique vs all 17 ⚠️ `cargo audit`'s **first** run errored with `couldn't check if the package is yanked: request could not be completed in the allotted timeframe`. That is a registry network timeout, not a finding — but it is the check that caught yanked `chacha20` at v0.33.0, so it was re-run until it completed rather than accepted as a pass. ## Still owed after merge 1. Tag and push — `docs/releases/README.md` step 2. Tag message is drafted. 2. Wait for **every** platform green. Merge-sha green does not predict tag green; the tag fires runs whose publish steps never execute on a PR. 3. Diff the tag build's asset name set against v0.33.0's 80, version substring normalised, **before** announcing. 4. Dispatch `announce` with the tag. 5. Not run here: the ISO 24495 auditor on the notes (that skill never self-invokes), and the punktfunk-website / CMS pass that step 1 also asks for.
enricobuehler added 1 commit 2026-08-30 23:47:01 +00:00
chore(release): cut 0.34.0
ci / web (pull_request) Successful in 59s
windows-client / client (x64, , x86_64-pc-windows-msvc, C:\t) (pull_request) Failing after 5m14s
ci / docs-site (pull_request) Successful in 57s
ci / bun-nix (pull_request) Successful in 21s
ci / docs-drift (pull_request) Successful in 26s
android / android (pull_request) Canceled after 2m26s
apple / swift (pull_request) Canceled after 0s
apple / distribute (pull_request) Canceled after 0s
apple / screenshots (pull_request) Canceled after 0s
ci / rust (pull_request) Canceled after 55s
ci / rust-arm64 (pull_request) Canceled after 6m35s
macos-host / check (pull_request) Canceled after 0s
nix / flake (pull_request) Canceled after 3m33s
windows-client / client (arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (pull_request) Canceled after 0s
2531207f04
140 commits since v0.33.0. The release is a control surface for everyone
who streams to a screen they hold: a six-button ring opened by a
two-finger twist, editable by using it rather than by reading a list,
plus an on-screen controller on phones and tablets.

The Steam Controller 2 passthrough leaves Linux. It now captures from
Apple and Android devices and reaches a Windows host, still presented as
itself rather than flattened into a generic pad.

This is not a drop-in for embedders. The C ABI moves 26 to 28, and v27
widens PunktfunkHidOutput from 19 to 85 bytes -- a recompile, not a
relink, with the version equality check as the guard. Every other
version number stands still: wire 2, driver 6, gamepad channel 3.
Windows packagers additionally need the pf_gamepad package rebuilt, for
its eighth hardware id.

api/openapi.json is regenerated rather than re-stamped this time, and
the surface is verified rather than assumed: punktfunk-host compiles on
macOS again, so the staleness test runs here. Every prior release
carried a caveat for exactly that reason.

Also prunes PUNKTFUNK_STANDBY_SINK_KEEP from the undocumented-env
baseline, which the drift gate has warned about since #452 documented
it while still exiting 0.

Gates on the Mac: cargo fmt --all --check, cargo test -p punktfunk-core
--lib --features quic (511 passed, 0 failed), the C ABI harness
(abi_version=28), the openapi staleness test, check-docs-drift.sh,
check-docs-links.sh, cargo audit (2 allowed warnings, no yanked
crates), both openapi copies byte-identical, and Play notes at 493/500
chars and unique.
enricobuehler added 1 commit 2026-08-30 23:59:57 +00:00
fix(client/windows): allow the host tile's eighth argument
ci / web (pull_request) Successful in 1m28s
ci / bun-nix (pull_request) Successful in 22s
ci / rust-arm64 (pull_request) Successful in 2m46s
ci / docs-drift (pull_request) Successful in 30s
ci / docs-site (pull_request) Successful in 2m39s
apple / swift (pull_request) Successful in 2m12s
apple / distribute (pull_request) Skipped
apple / screenshots (pull_request) Skipped
macos-host / check (pull_request) Successful in 1m13s
android / android (pull_request) Successful in 6m30s
windows-client / client (arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (pull_request) Successful in 2m56s
nix / flake (pull_request) Successful in 7m45s
windows-client / client (x64, , x86_64-pc-windows-msvc, C:\t) (pull_request) Successful in 6m53s
ci / rust (pull_request) Successful in 18m40s
7f69100d39
The Windows clippy job has failed on main since a04c8cee: giving the
avatar its OS mark added `os` to `host_tile`, taking it to eight
arguments against clippy's threshold of seven, and `-D warnings` makes
that an error. The job never runs on a Mac or a Linux runner, so the
break reached main green.

Take the allow, as the two neighbours at this limit already do. All
three call sites pass a different mix of the optional tail, so a props
struct would only move the argument list into each of them.

`edit_profile_modal` and `described_overridable` sit at exactly seven
and are untouched.
enricobuehler merged commit b7c29329e5 into main 2026-08-31 00:25:05 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: unom/punktfunk#467