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.
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.
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.
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.
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, 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_VERSION2, C ABI 25 withinclude/punktfunk_core.hdiffering 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+pfhdr8with 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'slatest. 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
service installprovisions a program-scoped inbound UDP rule for the host executable. That is the black-picture fix: the firewall rules arelocalport=-scoped and the data plane binds an ephemeral port per session, so no such rule could ever cover it —punched=falseon every session of two field logs. Program-scoped rather than pinned because 47998-48010 would collide with Sunshine/Apollo.service uninstallremoves it.bd5735b8. It had inherited the XUSB companion by module-name coincidence, and that backend exposes no HID collection, so Steam, SDL, RawInput, DirectInput andjoy.cplcannot see it at all.PUNKTFUNK_XBOX_BACKEND=xusbnow reverts both planes together.One fix that is not from this cycle
packaging/gamescope/PKGBUILDmovespfhdr7→pfhdr8. The banner has said+pfhdr8since patch 0010 and the host probes it for>= 8, but pacman comparespkgver-pkgrel, read3.16.25.pfhdr7-1on 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 --checkcleancargo metadata --offlineok,Cargo.lockdiff versions-only (36/36)cargo test -p punktfunk-core --lib— 273 passedtests/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 headerscripts/ci/check-docs-drift.shcleancmp-identical, both stamped 0.31.1docs/releases/v0.31.1.md)Not verified here
api/openapi.jsonis re-stamped, not regenerated —punktfunk-hostdoes not build on macOS, soopenapi_document_is_complete_and_checked_incould not run. #361 regenerated the document itself on a runner where that test executes; this commit moves one line (info.version, filled fromCARGO_PKG_VERSION), and0.31.0appears nowhere else in either copy.Everything under
crates/punktfunk-host,packaging/nix/gamescope.nixand 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.