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.
Second, quieter break: punktfunk_connection_next_hidout now surfacesHidOutput::HidRaw where it previously fell out as NoFrame. A puller that assumed every event was DualSense feedback must switch on kind.
⭐ 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_inruns 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)
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
Tag and push — docs/releases/README.md step 2. Tag message is drafted.
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.
Diff the tag build's asset name set against v0.33.0's 80, version substring normalised, before announcing.
Dispatch announce with the tag.
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.
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.
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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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:
Cargo.toml[workspace.package] version→ 0.34.0Cargo.lockcargo update --workspace; diff is 36/36 versions-onlyapi/openapi.json,docs-site/public/openapi.jsoninfo.versionstamp; the two are byte-identicalCHANGELOG.mddocs/releases/v0.34.0.mddocs/releases/whatsnew/v0.34.0.txtscripts/ci/docs-undocumented-env-baseline.txtWhy 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_VERSIONgoes 26 → 28:PunktfunkHidOutput19 → 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.punktfunk_connection_host_caps2+PUNKTFUNK_HOST_CAP2_TOUCH. Purely additive.Second, quieter break:
punktfunk_connection_next_hidoutnow surfacesHidOutput::HidRawwhere it previously fell out asNoFrame. A puller that assumed every event was DualSense feedback must switch onkind.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-hostdoes not build on macOS". #456 fixed the eleven compile holes, somgmt::tests::openapi_document_is_complete_and_checked_inruns here now and the surface is verified rather than assumed. It normalisesinfo.versionon both sides, so a bump alone cannot trip it.The spec was regenerated on main (
3db1f53d, re-synced bya5593de1). Againstv0.33.0its only non-stamp diff is thedisable_physical_monitorsdescription, 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_KEEPsat in the undocumented-env baseline while #452 had documented it.check-docs-drift.shprintedbaseline entries no longer undocumentedon 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.
DEVTYPE_TRITON, the Windowspf_tritonvirtual-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.check-install-defaults.shgate, and a tightening of the v0.33.0 changelog to house style.Worth flagging as a change of convention: every prior
## Thankssection 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.inxgainspf_triton, an eighth hardware id. An existing install carries the seven-id package, so the Windows SC2 backend does nothing untilpunktfunk-host.exe driver install --gamepad. This is in the notes'## Before you update.Gates, all run on the Mac
cargo fmt --all --checkcargo test -p punktfunk-core --lib --features quic— 511 passed, 0 failed (was 508 at v0.33.0)abi_version=28, the cheap oracle for the row that movedcheck-docs-drift.sh,check-docs-links.shcargo audit— 2 allowed warnings (audiopus_sys,paste), no yanked cratescmp-identical; Play notes 493/500 and unique vs all 17⚠️
cargo audit's first run errored withcouldn'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 yankedchacha20at v0.33.0, so it was re-run until it completed rather than accepted as a pass.Still owed after merge
docs/releases/README.mdstep 2. Tag message is drafted.announcewith the tag.