0.30.0 #285

Merged
enricobuehler merged 1 commits from worktree-release-0-30-0-prep into main 2026-08-17 12:49:58 +00:00
Owner

Version bump, release notes, CHANGELOG and Play notes for v0.30.0. Cut from a17a8917.

175 commits since v0.29.0 (131 non-merge).

The number is forced, not chosen

  • C ABI 20 → 24 in four steps: 21 connect_ex10 (#244), 22 the per-client access accessors (#245), 23 connection_audio_plc, 24 connect_ex11 + the resolved-format accessors (#263). All additive — no existing function changed signature or behaviour, no repr(C) struct grew a field.
  • gamescope +pfhdr7 → +pfhdr8 (patch 0010, the seat keymap the keyboard-layout fix depends on).
  • Two defaults flipped, either of which alone rules out a patch: the host now serves the lossless audio plane unless refused (#280), and trust::Settings::library_enabled is deleted along with the "Show game library" row (#273).

WIRE_VERSION stays 2 — the new Hello/Welcome fields ride the trailing-field append, and the one new control message (PipelineGap, type byte 0x0A) took a free byte in the block it belongs to.

Files

File What
Cargo.toml + Cargo.lock 0.29.0 → 0.30.0; lock diff is versions-only (36/36 lines)
CHANGELOG.md the technical half — version table, six breaking/operator-visible entries, and the per-area detail
docs/releases/v0.30.0.md user-facing notes; becomes the release body verbatim
docs/releases/whatsnew/v0.30.0.txt Play "What's new", 475/500 chars
docs-site/public/openapi.json re-sync, see below

⚠ One thing this PR fixes beyond the bump

docs-site/public/openapi.json had drifted from api/openapi.json. #276's game-lifetime work regenerated the api/ copy alone — adding GameOnNewLaunch, game_on_new_launch and the untracked game state — and nothing catches it: the mgmt drift test compares the live route table against the generated document, not the two on-disk files. So CI stayed green while the published API reference still described 0.29. Re-synced byte-identical here and documented in the CHANGELOG.

Operator-visible, called out in Before you update

  • Windows host.env keys are now allow-listed into the SYSTEM service environment, and a non-admin-owned host.env / web-password is distrusted (renamed aside / rotated). Both from the 2026-08-15 security sweep.
  • The "Show game library" setting is gone; anyone who had it off now has a library. Migration is by construction — Settings is #[serde(default)] with a #[serde(flatten)] extra map, so the stored key round-trips untouched and a downgraded binary still finds it.
  • gamescope must be rebuilt at +pfhdr8 for the keyboard-layout fix to take effect (packager-visible).

Version table (measured on a17a8917, not carried forward)

ABI 24 · wire 2 · driver protocol 6 / min 3 (pf-driver-proto diff-free vs the v0.29.0 tag) · gamepad channel 3 · plugin index schema 1 · edition 2024 · MSRV 1.85 · 27 crate dirs · SDK 0.1.4 · plugin-kit 0.4.2 · gamescope +pfhdr8 · api/openapi.json stamped 0.29.0.

Gates run on this tree

  • cargo fmt --all --check clean
  • cargo metadata --locked ok
  • Cargo.lock diff versions-only against the new main
  • cargo test -p punktfunk-core green — 261 + the c_abi harness (the ABI-24 header compiles and round-trips) + 8 loopback
  • the android.yml Play notes gate run verbatim — 475/500 chars, not byte-identical to any prior release's
  • notes voice scan: no internal names outside ## For developers
  • both openapi copies diff clean

Not run here: clippy and the per-platform builds. This commit is version metadata and docs only; the code underneath is main's.

Named as unverified in the CHANGELOG rather than left to be discovered

96 kHz lossless on Apple/Android hardware · the on-glass guest rehearsal for per-client access and a real-Moonlight run · a BLE-paired Steam Controller 2 · the diagnostics page against .181 in all three vhci states · PUNKTFUNK_DUALSENSE_USBIP (opt-in precisely because pad-usbip-test has not been run against real hardware) · the WinUI half of the library-toggle removal and the Apple library-browse pin gate, both read-verified only since they compile nowhere available to the cutting host.

Version bump, release notes, CHANGELOG and Play notes for **v0.30.0**. Cut from `a17a8917`. 175 commits since v0.29.0 (131 non-merge). ## The number is forced, not chosen - **C ABI 20 → 24** in four steps: 21 `connect_ex10` (#244), 22 the per-client access accessors (#245), 23 `connection_audio_plc`, 24 `connect_ex11` + the resolved-format accessors (#263). All additive — no existing function changed signature or behaviour, no `repr(C)` struct grew a field. - **gamescope +pfhdr7 → +pfhdr8** (patch 0010, the seat keymap the keyboard-layout fix depends on). - **Two defaults flipped**, either of which alone rules out a patch: the host now serves the lossless audio plane unless refused (#280), and `trust::Settings::library_enabled` is deleted along with the "Show game library" row (#273). `WIRE_VERSION` stays **2** — the new `Hello`/`Welcome` fields ride the trailing-field append, and the one new control message (`PipelineGap`, type byte `0x0A`) took a free byte in the block it belongs to. ## Files | File | What | |---|---| | `Cargo.toml` + `Cargo.lock` | 0.29.0 → 0.30.0; lock diff is versions-only (36/36 lines) | | `CHANGELOG.md` | the technical half — version table, six breaking/operator-visible entries, and the per-area detail | | `docs/releases/v0.30.0.md` | user-facing notes; becomes the release body verbatim | | `docs/releases/whatsnew/v0.30.0.txt` | Play "What's new", 475/500 chars | | `docs-site/public/openapi.json` | ⚠ **re-sync, see below** | ## ⚠ One thing this PR fixes beyond the bump `docs-site/public/openapi.json` had **drifted** from `api/openapi.json`. #276's game-lifetime work regenerated the `api/` copy alone — adding `GameOnNewLaunch`, `game_on_new_launch` and the `untracked` game state — and nothing catches it: the mgmt drift test compares the *live route table* against the generated document, not the two on-disk files. So CI stayed green while the published API reference still described 0.29. Re-synced byte-identical here and documented in the CHANGELOG. ## Operator-visible, called out in *Before you update* - Windows `host.env` keys are now allow-listed into the SYSTEM service environment, and a non-admin-owned `host.env` / `web-password` is distrusted (renamed aside / rotated). Both from the 2026-08-15 security sweep. - The "Show game library" setting is gone; anyone who had it off now has a library. Migration is by construction — `Settings` is `#[serde(default)]` with a `#[serde(flatten)] extra` map, so the stored key round-trips untouched and a downgraded binary still finds it. - gamescope must be rebuilt at `+pfhdr8` for the keyboard-layout fix to take effect (packager-visible). ## Version table (measured on `a17a8917`, not carried forward) ABI 24 · wire 2 · driver protocol 6 / min 3 (`pf-driver-proto` diff-free vs the v0.29.0 tag) · gamepad channel 3 · plugin index schema 1 · edition 2024 · MSRV 1.85 · 27 crate dirs · SDK 0.1.4 · plugin-kit 0.4.2 · gamescope +pfhdr8 · `api/openapi.json` stamped 0.29.0. ## Gates run on this tree - `cargo fmt --all --check` clean - `cargo metadata --locked` ok - `Cargo.lock` diff versions-only against the new main - `cargo test -p punktfunk-core` green — 261 + the `c_abi` harness (the ABI-24 header compiles and round-trips) + 8 loopback - the `android.yml` Play notes gate run verbatim — 475/500 chars, not byte-identical to any prior release's - notes voice scan: no internal names outside `## For developers` - both openapi copies diff clean Not run here: clippy and the per-platform builds. This commit is version metadata and docs only; the code underneath is main's. ## Named as unverified in the CHANGELOG rather than left to be discovered 96 kHz lossless on Apple/Android hardware · the on-glass guest rehearsal for per-client access and a real-Moonlight run · a BLE-paired Steam Controller 2 · the diagnostics page against `.181` in all three vhci states · `PUNKTFUNK_DUALSENSE_USBIP` (opt-in precisely because `pad-usbip-test` has not been run against real hardware) · the WinUI half of the library-toggle removal and the Apple library-browse pin gate, both read-verified only since they compile nowhere available to the cutting host.
enricobuehler added 1 commit 2026-08-17 12:49:05 +00:00
release: 0.30.0 — version bump, notes, CHANGELOG, Play notes
ci / bun-nix (pull_request) Successful in 29s
ci / docs-site (pull_request) Successful in 1m18s
apple / swift (pull_request) Successful in 2m6s
apple / distribute (pull_request) Skipped
apple / screenshots (pull_request) Skipped
ci / web (pull_request) Successful in 9m11s
ci / rust-arm64 (pull_request) Successful in 15m47s
android / android (pull_request) Successful in 22m53s
ci / rust (pull_request) Successful in 49m22s
b65e787fca
175 commits since v0.29.0 (131 non-merge). Cut from origin/main a17a8917.
Re-cut from d92266a4 (129/99) as main moved through PRs #270-#282.

THE NUMBER: 0.30.0 is forced, not chosen. The C ABI moved 20 -> 24 in
four steps this cycle — 21 connect_ex10 (the device_name an unpaired
client knocks with, #244), 22 the per-client access accessors (#245),
23 connection_audio_plc (Apple's drought concealment), 24 connect_ex11
plus the resolved-format accessors (the lossless plane, #263) — and
gamescope moved +pfhdr7 -> +pfhdr8 (patch 0010, the seat keymap the
keyboard-layout fix depends on). Two DEFAULTS also flipped, either of
which alone rules out a patch: the host now serves the lossless audio
plane unless refused (#280, marked breaking by its author), and
trust::Settings::library_enabled is deleted along with the "Show game
library" row (#273, likewise). scripts/ci/pf-version.sh derives the
canary base as latest stable + one minor, so canaries move 0.30.x ->
0.31.x after the tag.

Every C addition is additive and WIRE_VERSION stays 2: the new Hello
and Welcome fields ride the trailing-field append discipline, and the
one new control message (PipelineGap, type byte 0x0A) took a free byte
in the block it belongs to. No existing C function changed signature or
behaviour, and no repr(C) struct grew a field — the lossless format is
read through accessors precisely because PunktfunkAudioPcm and
PunktfunkStats have no struct_size guard and are allocated by value by
every C embedder.

Version table re-measured on a17a8917, not carried forward from the
first cut: ABI 24, wire 2, driver protocol 6 / min 3 (pf-driver-proto
has no diff against the v0.29.0 tag), gamepad channel 3, plugin index
schema 1, edition 2024, MSRV 1.85, 27 crate dirs, SDK 0.1.4,
plugin-kit 0.4.2, gamescope 8, api/openapi.json stamped 0.29.0.

⚠ RE-SYNC OWED AND DONE: docs-site/public/openapi.json had drifted from
api/openapi.json. #276's game-lifetime work regenerated the api/ copy
alone (adding GameOnNewLaunch, game_on_new_launch and the `untracked`
game state) and nothing catches it — the mgmt drift test compares the
LIVE ROUTE TABLE against the generated document, not the two files —
so CI stayed green while the published API reference described 0.29.
Re-synced byte-identical here and called out in the CHANGELOG.

Three claims were corrected against the code rather than shipped as
drafted, all three in the first cut's favour of being too narrow or too
broad:
  * lossless rungs are NOT uniform across clients. Apple and Android
    list the full ladder (441/48/882/96/1764); pf_client_core lists
    only 48/96, and pf-client-core still filters a surround request out
    before the wire, so the desktop and console clients stay on Opus
    under 5.1. The notes say exactly that instead of "stereo only".
  * "send logs to host" ships on the Gaming Mode console alone — the
    Apple, Android and webOS legs are follow-ups.
  * the masked-color I-beam fix arrived via a fork branch but is
    authored by the repo owner, so it is NOT credited as an outside
    contribution.

Gates run on this tree: cargo fmt --all --check clean; cargo metadata
--locked ok; Cargo.lock diff versions-only (36/36 lines) against the
new main; cargo test -p punktfunk-core green including the c_abi
harness (261 + 1 + 8, the ABI-24 header compiles and round-trips;
macOS needs LIBRARY_PATH=/opt/homebrew/opt/opus/lib); the android.yml
Play notes gate run verbatim — 475/500 characters and not byte-
identical to any prior release's; notes voice scan finds no internal
names outside the For developers section; both openapi copies diff
clean.
enricobuehler merged commit 223647b58f into main 2026-08-17 12:49:58 +00:00
enricobuehler deleted branch worktree-release-0-30-0-prep 2026-08-17 12:50:04 +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#285