A user keeps a Dock shortcut that opens their host's game library (punktfunk://browse/… — the shape the "Open Game Library" intent and the library widget emit). Opening it while a stream to that same host is running popped the "Can't open: Already streaming X. End that session first." alert — on the very host that's on glass. They just wanted to come back to the app.
Root cause
The deep-link spec (client-deep-links.md, invariant 2) already settles this: streaming the same host → no-op focus; a different host → "End that session first" notice. The connect route has implemented that exception since M0, and the Android client ships it in both its onCreate and onNewIntent paths. The browse route (1fc18451, shipped in 0.29.0) is the one surface that refused on any live session — its own doc comment claimed "a live session is never preempted" while missing the half of that rule that makes the claim true.
Fix
openLibrary now mirrors the connect route's guard verbatim: non-idle with model.activeHost?.id == host.id → silent return. The URL open already foregrounded the app, which is all "focus it" can mean mid-stream; the stream screen owns the glass, so there is no library to present. A link to a different host keeps the refusal notice, and nothing about pin conflicts, profile resolution, or the unsaved-host path changes.
Verification
Full PunktfunkClient macOS target typechecks ("Build complete!"). Note for anyone re-verifying: the checked-in PunktfunkCore.xcframework is stale against main's own Swift again (its header predates punktfunk_connection_end_reject), so a plain swift build fails on main before reaching this change — rebuild the core slice and hand-assemble the bundle first.
## Field report
A user keeps a Dock shortcut that opens their host's game library (`punktfunk://browse/…` — the shape the "Open Game Library" intent and the library widget emit). Opening it while a stream to that same host is running popped the **"Can't open: Already streaming X. End that session first."** alert — on the very host that's on glass. They just wanted to come back to the app.
## Root cause
The deep-link spec (`client-deep-links.md`, invariant 2) already settles this: *streaming the same host → no-op focus; a different host → "End that session first" notice.* The connect route has implemented that exception since M0, and the Android client ships it in both its `onCreate` and `onNewIntent` paths. The browse route (`1fc18451`, shipped in 0.29.0) is the one surface that refused on **any** live session — its own doc comment claimed "a live session is never preempted" while missing the half of that rule that makes the claim true.
## Fix
`openLibrary` now mirrors the connect route's guard verbatim: non-idle with `model.activeHost?.id == host.id` → silent return. The URL open already foregrounded the app, which is all "focus it" can mean mid-stream; the stream screen owns the glass, so there is no library to present. A link to a **different** host keeps the refusal notice, and nothing about pin conflicts, profile resolution, or the unsaved-host path changes.
## Verification
Full `PunktfunkClient` macOS target typechecks ("Build complete!"). Note for anyone re-verifying: the checked-in `PunktfunkCore.xcframework` is stale against main's own Swift again (its header predates `punktfunk_connection_end_reject`), so a plain `swift build` fails on main before reaching this change — rebuild the core slice and hand-assemble the bundle first.
The connect route has always made the same-host exception the deep-link
spec demands (rule 2: streaming the same host -> no-op focus), but the
browse route refused on ANY live session -- so tapping a Dock library
shortcut to come back to a running stream popped "Can't open: Already
streaming X. End that session first." for the very host on glass.
Mirror the connect guard: same host -> the open already foregrounded the
app, which is all focus can mean mid-stream; a different host keeps the
notice. Android shipped this posture from day one; this is Apple parity.
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.
Field report
A user keeps a Dock shortcut that opens their host's game library (
punktfunk://browse/…— the shape the "Open Game Library" intent and the library widget emit). Opening it while a stream to that same host is running popped the "Can't open: Already streaming X. End that session first." alert — on the very host that's on glass. They just wanted to come back to the app.Root cause
The deep-link spec (
client-deep-links.md, invariant 2) already settles this: streaming the same host → no-op focus; a different host → "End that session first" notice. The connect route has implemented that exception since M0, and the Android client ships it in both itsonCreateandonNewIntentpaths. The browse route (1fc18451, shipped in 0.29.0) is the one surface that refused on any live session — its own doc comment claimed "a live session is never preempted" while missing the half of that rule that makes the claim true.Fix
openLibrarynow mirrors the connect route's guard verbatim: non-idle withmodel.activeHost?.id == host.id→ silent return. The URL open already foregrounded the app, which is all "focus it" can mean mid-stream; the stream screen owns the glass, so there is no library to present. A link to a different host keeps the refusal notice, and nothing about pin conflicts, profile resolution, or the unsaved-host path changes.Verification
Full
PunktfunkClientmacOS target typechecks ("Build complete!"). Note for anyone re-verifying: the checked-inPunktfunkCore.xcframeworkis stale against main's own Swift again (its header predatespunktfunk_connection_end_reject), so a plainswift buildfails on main before reaching this change — rebuild the core slice and hand-assemble the bundle first.