batch 5 (GUI 9): loupe zathura mpv pavucontrol keepassxc telegram-desktop #17

Closed
glen wants to merge 9 commits from batch9/gui-b into main
Collaborator

Campaign batch 5 (DESIGN GUI batch 9) — six GUI-B packages on the repo fedora:44 pin, one commit each, all with the ghostty GUI sandbox surface (writable_home + writable_run, TMPDIR=/tmp, /dev dev-bind, bind_try /sys + fonts + icons ro) and per-tool WHY-comments; Wayland/compositor access needs no explicit sandbox config (host env passes through bwrap, sandbox /run IS the host's). Every commit carries the needs-human-verify marker with its per-tool compositor checklist in the body — this PR merges only after that checklist run (DESIGN §5.2). Highlights: zathura ships WITH its mupdf backend (zathura-pdf-mupdf — zathura renders nothing without a plugin), and its --version smoke doubles as plugin-load proof (the banner prints a (plugin) … line per loaded backend, so expect "mupdf" headlessly proves libpdf-mupdf landed AND dlopen'd); loupe has no --version flag at all (verified from the 50.0 sources — zero CLI parsing) so its smoke is gio's local --help with a Usage anchor and the reasoning documented; keepassxc's plain --version aborts headless because main.cpp constructs the QApplication before parsing — the smoke uses Qt's own -platform offscreen prefix so the real GUI binary reaches the parser (camel-case KeePassXC anchor, since setApplicationName runs first); pavucontrol's --version is not headless-safe either — settled from four sources (pavuapplication/gapplication/gtkapplication/gtkmain: GtkApplication's ::startup runs gtk_init before ::command-line, gtk_init exits 1 displayless) — deliberately EMPTY check list, scp/sftp precedent, with the full evidence trail in smoke.toml; telegram-desktop is not in Fedora at all — it's RPM Fusion Free (f44 spec on their git), same pinned-release-RPM bootstrap as ffmpeg, binary /usr/bin/Telegram, and tdesktop has NO version flag and no exit-0 headless path (even -quit short-circuits only after QApplication) → empty check list, source-verified. Licenses verbatim from spec tags, with the interesting ones argued: keepassxc has NO OpenSSL exception on f44 (built against botan3 — the folklore doesn't apply), the zathura/mupdf Zlib-plugin-over-AGPL-library combination is documented, and mpv's binary is the GPL variant (cdda/dvdnav/dvbin hard-require -Dgpl=true in meson). Version-free smoke anchors everywhere a banner carries a name. Authored via the 3-agent fan-out (batch9/{a,b,c} merged here); CI runs the headless slice, the compositor is the other half of the gate.

Campaign batch 5 (DESIGN GUI batch 9) — six GUI-B packages on the repo `fedora:44` pin, one commit each, all with the ghostty GUI sandbox surface (writable_home + writable_run, `TMPDIR=/tmp`, `/dev` dev-bind, `bind_try` /sys + fonts + icons ro) and per-tool WHY-comments; Wayland/compositor access needs no explicit sandbox config (host env passes through bwrap, sandbox `/run` IS the host's). Every commit carries the `needs-human-verify` marker with its per-tool compositor checklist in the body — **this PR merges only after that checklist run** (DESIGN §5.2). Highlights: **zathura ships WITH its mupdf backend** (`zathura-pdf-mupdf` — zathura renders nothing without a plugin), and its `--version` smoke doubles as plugin-load proof (the banner prints a `(plugin) …` line per loaded backend, so `expect "mupdf"` headlessly proves libpdf-mupdf landed AND dlopen'd); **loupe has no `--version` flag at all** (verified from the 50.0 sources — zero CLI parsing) so its smoke is gio's local `--help` with a `Usage` anchor and the reasoning documented; **keepassxc**'s plain `--version` aborts headless because main.cpp constructs the QApplication before parsing — the smoke uses Qt's own `-platform offscreen` prefix so the real GUI binary reaches the parser (camel-case `KeePassXC` anchor, since setApplicationName runs first); **pavucontrol's `--version` is not headless-safe either** — settled from four sources (pavuapplication/gapplication/gtkapplication/gtkmain: GtkApplication's `::startup` runs gtk_init before `::command-line`, gtk_init exits 1 displayless) — deliberately EMPTY check list, scp/sftp precedent, with the full evidence trail in smoke.toml; **telegram-desktop is not in Fedora at all** — it's RPM Fusion Free (f44 spec on their git), same pinned-release-RPM bootstrap as ffmpeg, binary `/usr/bin/Telegram`, and tdesktop has NO version flag and no exit-0 headless path (even `-quit` short-circuits only after QApplication) → empty check list, source-verified. Licenses verbatim from spec tags, with the interesting ones argued: keepassxc has NO OpenSSL exception on f44 (built against botan3 — the folklore doesn't apply), the zathura/mupdf Zlib-plugin-over-AGPL-library combination is documented, and mpv's binary is the GPL variant (cdda/dvdnav/dvbin hard-require `-Dgpl=true` in meson). Version-free smoke anchors everywhere a banner carries a name. Authored via the 3-agent fan-out (`batch9/{a,b,c}` merged here); CI runs the headless slice, the compositor is the other half of the gate.
Fedora f44 package 'loupe' 50.0 (%autorelease), self-contained dnf image
(plus rpm-pulled glycin-loaders decoders); no compose.

Version/license source:
https://src.fedoraproject.org/rpms/loupe/raw/f44/f/loupe.spec
License: GPL-3.0-or-later (upstream SPDX; the spec tag ANDs the bundled
Rust-crate licenses — metadata card carries the app's own id, like git).
Redistribution ok: GPL-3.0, dnf-built from Fedora's public repos.

Entrypoint: the ghostty/wezterm GUI sandbox surface (writable_home +
writable_run, TMPDIR=/tmp, /dev dev-bind, /sys + /usr/share/fonts +
/usr/share/icons bind_try). Wayland/D-Bus resolve through the host /run
bind + passed-through env; documented in the entrypoint comment.

Smoke (headless): 'loupe --help' exit 0, expect 'Usage'. Verified from
the 50.0 sources that loupe has NO --version flag (no clap, no main-option
handling; config::VERSION feeds only the About dialog and GApplication
exits 1 on the unknown option), so the --help anchor replaces the usual
version banner. CI run of tools/verify.sh is the build+smoke evidence.

needs-human-verify: GUI compositor checklist (AGENTS.md §5, DESIGN §5.1
row 9) before publish — window maps under Wayland (niri), opens a PNG
from /home/crussell/cwd, thumbnails/zoom render on the GL renderer, themed icons
and host fonts resolve, rotate/crop save-as writes back through
writable_home.
Fedora f44 packages 'zathura' + 'zathura-pdf-mupdf', both 2026.07.18
(date-based upstream versioning, released in lockstep) — one image with
the mupdf PDF backend because zathura renders nothing without a backend
plugin. Other backends (ps/djvu/cb/poppler) deliberately not vendored;
install_weak_deps=False keeps zathura's Suggests from dragging them in.

Version/license sources:
https://src.fedoraproject.org/rpms/zathura/raw/f44/f/zathura.spec
https://src.fedoraproject.org/rpms/zathura-pdf-mupdf/raw/f44/f/zathura-pdf-mupdf.spec
License: both spec tags say Zlib (pwmt upstreams license their own code
under Zlib). Combination note in the Containerfile: the plugin dynamically
links Fedora's mupdf (spec tag AGPL-3.0-or-later) — Fedora tags the plugin
by its own code since it links the system mupdf rather than embedding it;
redistribution ok either way (Zlib is permissive; AGPL permits
redistribution and its source condition is satisfied by Fedora's mupdf
SRPM — image ships Fedora's unmodified binaries).

Entrypoint: the ghostty/wezterm GUI sandbox surface (writable_home +
writable_run, TMPDIR=/tmp, /dev dev-bind, /sys + fonts + icons bind_try);
Wayland/D-Bus resolve through the host /run bind + passed-through env.
writable_home covers zathurarc + the sqlite bookmarks/jumplist db + the
thumbnail cache — no /persist (dotfile-class state, the tmux contrast).

Smoke (headless): 'zathura --version' exit 0 twice — expect 'zathura'
(core banner) and 'mupdf' (the banner enumerates loaded plugins, so this
proves libpdf-mupdf.so landed in-image AND dlopen'd). Banner shape
verified from upstream main.c/version.c (prints before any display
contact). CI run of tools/verify.sh is the build+smoke evidence.

needs-human-verify: GUI compositor checklist (AGENTS.md §5, DESIGN §5.1
row 9) before publish — window maps under Wayland (niri), opens a PDF via
the mupdf plugin (rendered pages, not a plugin-error dialog), vi-keys
responsive (j/k paging, / search, :q quits), statusbar fonts + hicolor
icons resolve, zathurarc from writable_home honored.
Version/license source: https://src.fedoraproject.org/rpms/keepassxc/raw/f44/f/keepassxc.spec
(Version 2.7.12-1; License tag carried verbatim in metadata.toml — the app's
own code is GPL-3.0-only, the rest is bundled-library compound. No OpenSSL
exception applies: Fedora builds against botan3, not OpenSSL.)

needs-human-verify — GUI package, compositor checklist to run before publish
(AGENTS.md §5 / DESIGN-ecosystem.md §5.4):
  1. window maps under Wayland (sandbox /run is host /run, WAYLAND_DISPLAY
     passes through; no explicit config needed)
  2. opens and unlocks a test .kdbx (writable $HOME carries the database +
     ~/.config/keepassxc state)
  3. auto-type performs a fill into another window
  4. browser integration: enable it, confirm the kpxc_server socket appears
     under $XDG_RUNTIME_DIR, and connect the HOST browser's extension once —
     the association prompt must appear in the in-sandbox keepassxc window
Headless smoke: keepassxc -platform offscreen --version exits 0 printing
"KeePassXC 2.7.12" (bare --version aborts headless: main.cpp builds the
QApplication before parsing; -platform offscreen is Qt's own flag, source-
verified against the 2.7.12 tag).
Version/license source: RPM Fusion Free f44 spec (Fedora proper does not
package Telegram Desktop — src.fedoraproject.org/rpms/telegram-desktop
does not exist; the distro channel is RPM Fusion Free):
  https://github.com/rpmfusion/telegram-desktop/blob/f44/telegram-desktop.spec
Version 7.2.5-1; License tag carried verbatim in metadata.toml — the app is
GPL-3.0-or-later WITH OpenSSL exception, the rest of the compound is static
deps (tg_owt, rlottie, cld3) + bundled fonts. Redistribution ok.
Binary is /usr/bin/Telegram (no telegram-desktop binary exists).
Repo bootstrap: pinned rpmfusion-free-release-44 URL; app NEVRA floats
(RPM Fusion updates drop old builds within weeks — perishable-pin logic).

needs-human-verify — GUI package, compositor checklist to run before publish
(AGENTS.md §5 / DESIGN-ecosystem.md §5.4):
  1. window maps under Wayland (sandbox /run is host /run, WAYLAND_DISPLAY
     passes through; no explicit config needed)
  2. login QR / phone-code screen renders (first run, no session)
  3. media loads: open a chat, images/stickers render (fonts+icons binds,
     host network carries UDP/HTTPS to the Telegram DCs)
Headless smoke: none — DELIBERATELY EMPTY check list (scp/sftp precedent,
legal §3.1 shape). Source-verified against v7.2.5: tdesktop has no
--version flag (launcher.cpp processArguments parses only -debug -testagent
-key -autostart -fixprevious -cleanup -noupdate -tosettings -startintray
-quit -workdir -scale --); every launch constructs the QApplication, so
headless runs abort and displayed runs launch the real client; -quit only
checks cQuit() after QApplication construction and would kill a running
instance. No exit-0 headless path exists.
Version/license source: https://src.fedoraproject.org/rpms/mpv/raw/f44/f/mpv.spec
License: GPL-2.0-or-later AND LGPL-2.1-or-later AND BSD-2-Clause AND
BSD-3-Clause AND ISC AND MIT (the f44 spec tag, verbatim). Built as the GPL
variant: the spec enables cdda/dvdnav/dvbin, whose meson options require
-Dgpl=true ('the build is not GPL!') — verified against the v0.41.0 tree.

GUI package: needs-human-verify. Headless smoke is 'mpv --version' only
(source evidence, v0.41.0: OPT_PRINT fires at command-line parse, signals
M_OPT_EXIT before any vo/ao/display/audio init; mpv_main maps it to rc 0;
banner 'mpv v0.41.0 ...' multi-line). Human compositor checklist before
publish:
- 'bubblebox run mpv -- <video-file>' maps a video window under Wayland
- plays with AUDIO via the host pipewire session (sockets under
  /run/user/<uid> carried by the writable /run bind)
- status line/log shows hardware decoding active (e.g. 'Using hardware
  decoding') when the host grants VA-API; falls back to software otherwise
Version/license source: https://src.fedoraproject.org/rpms/pavucontrol/raw/f44/f/pavucontrol.spec
License: GPL-2.0-or-later (the f44 spec tag, verbatim).

GUI package: needs-human-verify. smoke.toml carries NO headless checks, on
source evidence (v6.2): --version prints in the ::command-line handler
(pavuapplication.cc), which GLib reaches only after g_application_register()
emits ::startup (gapplication.c), and GtkApplication's startup calls
gtk_init() — GTK4's gtk_init exits 1 with 'Failed to open display' when no
Wayland/X11 display exists, before the version print; with no session bus,
registration fails first. Human compositor checklist before publish:
- 'bubblebox run pavucontrol' maps the window under Wayland
- Output Devices tab lists the HOST session's sinks (pipewire-pulse socket
  at /run/user/<uid>/pulse via the /run bind)
- Playback/Recording tabs show live level meters moving while a stream plays
merge batch9/c
Some checks failed
verify / verify (pull_request) Failing after 2m51s
896b742ecd
glen closed this pull request 2026-09-24 16:46:53 -04:00
Author
Collaborator

Closing unmerged per the maintainer's scope decision: GUI apps are out of initial scope for bubblebox-pkgs in favor of flatpak (which already solves the GUI sandbox/theme/portal layer). The headless-smoke patterns from this batch (keepassxc's -platform offscreen, the pavucontrol/glib evidence chain, loupe's --help anchor) are banked in the campaign notes if GUI ever returns with a flatpak-gap justification.

Closing unmerged per the maintainer's scope decision: GUI apps are out of initial scope for bubblebox-pkgs in favor of flatpak (which already solves the GUI sandbox/theme/portal layer). The headless-smoke patterns from this batch (keepassxc's -platform offscreen, the pavucontrol/glib evidence chain, loupe's --help anchor) are banked in the campaign notes if GUI ever returns with a flatpak-gap justification.
All checks were successful
verify / verify (pull_request) Successful in 23s
Required
Details

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
chad/bubblebox-pkgs!17
No description provided.