0.31.1 — the video data port, the pad games could not see, and the buttons Android guessed wrong #363

Merged
enricobuehler merged 1 commits from worktree-release-0311-prep into main 2026-08-20 20:00:16 +00:00
Owner

Version bump, release notes, CHANGELOG and Play notes for v0.31.1, cut from 2be444b3 (#361 merged). 27 commits since v0.31.0 (17 non-merge).

The number

A patch. Nothing versioned moved: WIRE_VERSION 2, C ABI 25 with include/punktfunk_core.h differing from the v0.31.0 tag by one #define, driver protocol 6/min 3, gamepad channel 3, plugin index schema 1, host event schema 1, gamescope +pfhdr8 with no new patch files, SDK 0.1.5 untouched. No ! commit and no breaking change of any kind.

Two surfaces grow by pure addition, neither forcing a minor: the management API gains PUT /library/provider/{provider}/running (#361 — already regenerated into both openapi copies there, so this PR moves only the stamp), and plugin-kit went 0.4.3 → 0.4.4, which is tagged and published as the registry's latest. A plugin adopting neither is unaffected; a 404 from an older host means "this host tracks games by scanning".

Two behaviour changes, called out rather than left to be found

  • Windows service install provisions a program-scoped inbound UDP rule for the host executable. That is the black-picture fix: the firewall rules are localport=-scoped and the data plane binds an ephemeral port per session, so no such rule could ever cover it — punched=false on every session of two field logs. Program-scoped rather than pinned because 47998-48010 would collide with Sunshine/Apollo. service uninstall removes it.
  • The GameStream plane's default virtual-Xbox backend flips XUSB → UMDF HID, matching what the native plane has done since bd5735b8. It had inherited the XUSB companion by module-name coincidence, and that backend exposes no HID collection, so Steam, SDL, RawInput, DirectInput and joy.cpl cannot see it at all. PUNKTFUNK_XBOX_BACKEND=xusb now reverts both planes together.

One fix that is not from this cycle

packaging/gamescope/PKGBUILD moves pfhdr7pfhdr8. The banner has said +pfhdr8 since patch 0010 and the host probes it for >= 8, but pacman compares pkgver-pkgrel, read 3.16.25.pfhdr7-1 on both v0.30.0 and v0.31.0, and offered Arch/SteamOS hosts no upgrade at all — so the keyboard-layout fix never reached them. deb and rpm derive their version from the binary banner and moved by themselves; Arch is the only channel that hardcodes it. The v0.31.0 table flagged this as pre-existing; a release cut is when it bites.

Gates run on this tree (macOS)

  • cargo fmt --all --check clean
  • cargo metadata --offline ok, Cargo.lock diff versions-only (36/36)
  • cargo test -p punktfunk-core --lib273 passed
  • C ABI harness (tests/c_abi.rs) — passed, abi_version=25, four frames byte-exact through lossy loopback. It did not run on the v0.31.0 cut, so this is the first cut since ABI 25 where a C compiler has actually built the generated header
  • scripts/ci/check-docs-drift.sh clean
  • android.yml Play-notes gate run verbatim — 442/500 characters, not byte-identical to any prior release
  • both openapi copies cmp-identical, both stamped 0.31.1
  • notes voice scan clean (no internal vocabulary anywhere in docs/releases/v0.31.1.md)

Not verified here

api/openapi.json is re-stamped, not regeneratedpunktfunk-host does not build on macOS, so openapi_document_is_complete_and_checked_in could not run. #361 regenerated the document itself on a runner where that test executes; this commit moves one line (info.version, filled from CARGO_PKG_VERSION), and 0.31.0 appears nowhere else in either copy.

Everything under crates/punktfunk-host, packaging/nix/gamescope.nix and the Android/Kotlin half is verified by reading only. Not on glass: the Android scancode remap (the reporter's Fire TV Stick 4K Max is the test that settles it), the Windows firewall rule in a field session, and the Moonlight-compatible HID pad.

Version bump, release notes, CHANGELOG and Play notes for **v0.31.1**, cut from `2be444b3` (#361 merged). 27 commits since v0.31.0 (17 non-merge). ## The number A patch. Nothing versioned moved: `WIRE_VERSION` 2, C ABI **25** with `include/punktfunk_core.h` differing from the v0.31.0 tag by one `#define`, driver protocol 6/min 3, gamepad channel 3, plugin index schema 1, host event schema 1, gamescope `+pfhdr8` with no new patch files, SDK 0.1.5 untouched. No `!` commit and no breaking change of any kind. Two surfaces grow by **pure addition**, neither forcing a minor: the management API gains `PUT /library/provider/{provider}/running` (#361 — already regenerated into both openapi copies there, so this PR moves only the stamp), and plugin-kit went 0.4.3 → **0.4.4**, which is tagged *and* published as the registry's `latest`. A plugin adopting neither is unaffected; a 404 from an older host means "this host tracks games by scanning". ## Two behaviour changes, called out rather than left to be found - **Windows `service install` provisions a program-scoped inbound UDP rule** for the host executable. That is the black-picture fix: the firewall rules are `localport=`-scoped and the data plane binds an ephemeral port per session, so no such rule could ever cover it — `punched=false` on every session of two field logs. Program-scoped rather than pinned because 47998-48010 would collide with Sunshine/Apollo. `service uninstall` removes it. - **The GameStream plane's default virtual-Xbox backend flips XUSB → UMDF HID**, matching what the native plane has done since `bd5735b8`. It had inherited the XUSB companion by module-name coincidence, and that backend exposes no HID collection, so Steam, SDL, RawInput, DirectInput and `joy.cpl` cannot see it at all. `PUNKTFUNK_XBOX_BACKEND=xusb` now reverts both planes together. ## One fix that is not from this cycle `packaging/gamescope/PKGBUILD` moves `pfhdr7` → **`pfhdr8`**. The banner has said `+pfhdr8` since patch 0010 and the host probes it for `>= 8`, but pacman compares `pkgver-pkgrel`, read `3.16.25.pfhdr7-1` on both v0.30.0 and v0.31.0, and **offered Arch/SteamOS hosts no upgrade at all** — so the keyboard-layout fix never reached them. deb and rpm derive their version from the binary banner and moved by themselves; Arch is the only channel that hardcodes it. The v0.31.0 table flagged this as pre-existing; a release cut is when it bites. ## Gates run on this tree (macOS) - `cargo fmt --all --check` clean - `cargo metadata --offline` ok, `Cargo.lock` diff versions-only (36/36) - `cargo test -p punktfunk-core --lib` — **273 passed** - C ABI harness (`tests/c_abi.rs`) — **passed**, `abi_version=25`, four frames byte-exact through lossy loopback. It did *not* run on the v0.31.0 cut, so this is the first cut since ABI 25 where a C compiler has actually built the generated header - `scripts/ci/check-docs-drift.sh` clean - android.yml Play-notes gate run verbatim — 442/500 characters, not byte-identical to any prior release - both openapi copies `cmp`-identical, both stamped 0.31.1 - notes voice scan clean (no internal vocabulary anywhere in `docs/releases/v0.31.1.md`) ## Not verified here `api/openapi.json` is **re-stamped, not regenerated** — `punktfunk-host` does not build on macOS, so `openapi_document_is_complete_and_checked_in` could not run. #361 regenerated the document itself on a runner where that test executes; this commit moves one line (`info.version`, filled from `CARGO_PKG_VERSION`), and `0.31.0` appears nowhere else in either copy. Everything under `crates/punktfunk-host`, `packaging/nix/gamescope.nix` and the Android/Kotlin half is verified by reading only. Not on glass: the Android scancode remap (the reporter's Fire TV Stick 4K Max is the test that settles it), the Windows firewall rule in a field session, and the Moonlight-compatible HID pad.
enricobuehler added 1 commit 2026-08-20 19:59:23 +00:00
release: 0.31.1 — version bump, notes, CHANGELOG, Play notes
ci / bun-nix (pull_request) Successful in 30s
ci / docs-drift (pull_request) Successful in 27s
apple / swift (pull_request) Failing after 1m40s
apple / distribute (pull_request) Skipped
apple / screenshots (pull_request) Skipped
ci / web (pull_request) Successful in 1m39s
ci / docs-site (pull_request) Successful in 1m39s
ci / rust-arm64 (pull_request) Successful in 5m33s
android / android (pull_request) Successful in 7m19s
nix / flake (pull_request) Successful in 8m20s
windows-client / client (arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (pull_request) Successful in 3m6s
ci / rust (pull_request) Successful in 25m12s
windows-client / client (x64, , x86_64-pc-windows-msvc, C:\t) (pull_request) Successful in 6m47s
730ac43169
27 commits since v0.31.0 (17 non-merge). Cut from origin/main 2be444b3
(#361 merged).

THE NUMBER: a patch, on the user's call, and the version table does not
argue with it. Nothing versioned moved — WIRE_VERSION 2, C ABI 25 with
include/punktfunk_core.h differing from the v0.31.0 tag by one `#define`,
driver protocol 6 / min 3 (pf-driver-proto has no diff against the tag),
gamepad channel 3, plugin index schema 1, host event schema 1, gamescope
+pfhdr8 with no new patch files, SDK 0.1.5 untouched. No `!` commit and
no breaking change of any kind.

Two surfaces grow, both by pure addition, and neither forces the minor:
the management API gains PUT /library/provider/{provider}/running (#361,
already regenerated into both openapi copies there — this commit moves
only the stamp), and plugin-kit goes 0.4.3 -> 0.4.4 to export
ProviderClient.reportRunning from the package root. plugin-kit-v0.4.4 is
tagged AND published — it is the registry's `latest`; 0.4.2 is still
skipped there. A plugin that adopts neither is unaffected, and a 404 from
an older host means "this host tracks games by scanning".

The cycle is otherwise fix-shaped: fifteen fixes and two small features
— the console's own switch for turning itself off (which exists because
0.31.0 made the console the only interface Android shows with a pad
attached) and the provider running-report above.

The new control message (DeliveryReport, type byte 0x0B) is a `#define`,
not an ABI step — the same shape PipelineGap (0x0A) had at v0.30.0, and
it takes a free byte in its block rather than lengthening LossReport,
which is length-checked exactly.

Two behaviour changes are called out in the CHANGELOG rather than left
to be discovered: Windows `service install` now provisions a
program-scoped inbound UDP rule for the host exe (the black-picture
fix — no `localport=` rule can ever cover an ephemeral data port), and
the GameStream plane's default virtual-Xbox backend flips from the XUSB
companion to the UMDF HID pad, which is the correction of a default that
was only ever a module-name coincidence. Both revert with
PUNKTFUNK_XBOX_BACKEND=xusb / by removing the rule.

Also in this commit, because a cut is when it bites:
packaging/gamescope/PKGBUILD moves pfhdr7 -> pfhdr8. The banner has said
+pfhdr8 since patch 0010 and the host probes it for >= 8, but pacman
compares pkgver-pkgrel, read 3.16.25.pfhdr7-1 on both v0.30.0 and
v0.31.0, and offered Arch/SteamOS hosts no upgrade at all — so the
keyboard-layout fix never reached them. deb and rpm derive the version
from the binary banner and moved by themselves; Arch is the only channel
that hardcodes it. The v0.31.0 table flagged this as pre-existing.

api/openapi.json is RE-STAMPED here, not regenerated: punktfunk-host
does not build on macOS. #361 regenerated the document itself, with the
new route and its three schemas, on a runner where
openapi_document_is_complete_and_checked_in actually executes. This
commit moves one line (info.version, which utoipa fills from
CARGO_PKG_VERSION), and "0.31.0" appears nowhere else in either copy.

Gates: cargo fmt --all --check clean; cargo metadata --offline ok with
the Cargo.lock diff versions-only (36/36); cargo test -p punktfunk-core
--lib 273 passed; the C ABI harness passed reporting abi_version=25 —
it did NOT run on the v0.31.0 cut, so this is the first cut since ABI 25
where a C compiler has built the generated header;
scripts/ci/check-docs-drift.sh clean; the android.yml Play notes gate
run verbatim, 442/500 characters and unique; both openapi copies cmp
identical and stamped 0.31.1; notes voice scan clean.
enricobuehler merged commit eda4b7ebd2 into main 2026-08-20 20:00:16 +00:00
enricobuehler deleted branch worktree-release-0311-prep 2026-08-20 20:00:27 +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#363