Repository navigation
Rename roost to tuna (reproducible script + compat layer) - #536
Merged
Merged
Conversation
hanthor
force-pushed
the
chore/rename-roost-to-tuna
branch
4 times, most recently
from
October 9, 2026 00:28
8a6b7f2 to
2f9ebb4
Compare
hanthor
marked this pull request as ready for review
October 9, 2026 01:58
The rename to Tuna Desktop (#505) touches most files that about a dozen in-flight branches also touch. Instead of one hand-made rename commit that every branch would have to conflict-resolve, the rename is a script: any branch rebases onto the renamed main, runs scripts/rename-to-tuna, and stages the result. The script rewrites contents (crates, Rust paths, binaries, ROOST_* variables, identifiers, D-Bus and app IDs, package names, desktop names, and prose to "Tuna Desktop"), git-mvs roost-named paths, and re-locks Cargo.lock offline (and rustfmts renamed Rust files). It never touches historical evidence (docs/perf, docs/niri-parity, docs/marlin, the recorded Marlin wayland-info capture), third-party/, .spektacular/, share/compat/, historical run links, or anything carrying a tuna-rename keep marker. A second run is a no-op. The self-test covers each rule, the keep list, markers, check mode, untracked files and idempotence. CI runs it, plus `--check` as a guard against the old name coming back. Refs #505 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016YpFGeYYmfpLzk2LMr8ebX
Hand-written compatibility layer for the rename (#505), ahead of the mechanical rename itself: - legacy.rs in the shared control crate: every binary copies ROOST_* variables to TUNA_* at start-up (an existing TUNA_* wins), drops the old names so children do not repeat it, and logs one deprecation line. The compositor also links new per-user directories (tuna, tuna-shell under the XDG bases) to the old ones when only those exist, so monitors, favorites, notifications, prefs and extensions carry over and a rollback still sees them. Unit tests cover the fallback, precedence, the warning and directory adoption. - Packaging (Arch and Debian): replaces/conflicts/provides=roost, roost-* symlinks to the six tuna-* binaries, and two compat files under share/compat/ that the rename script never touches: - pam.d/roost-lock: the lock screen calls PAM by service name, and a session started before an in-place upgrade still runs the old binary asking for roost-lock; without it PAM falls back to "other" and that session cannot be unlocked. Both services are conffiles. - wayland-sessions/roost.desktop: NoDisplay=true entry running tuna-session, so users whose display manager remembers the "roost" session (GDM stores it by file name) still get Tuna Desktop. GDM's picker and the Tuna greeter skip NoDisplay entries; GDM still launches a remembered one (only Hidden stops it). - The greeter now skips NoDisplay/Hidden session entries. - check-release-package verifies the compat links, entry, PAM file and package relations; the installed-package proof also refuses the legacy shell-override variables. - packaging/README.md documents the choices. Lines that must keep the old name carry tuna-rename keep markers. Refs #505 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016YpFGeYYmfpLzk2LMr8ebX
Mechanical result of running scripts/rename-to-tuna on main; nothing
in this commit is hand-edited. Reproduce with:
scripts/rename-to-tuna && git add -A
Crates roost-* -> tuna-*, binaries, ROOST_* -> TUNA_*, scripts and
share files, the session entry tuna.desktop, PAM service tuna-lock,
tuna-session.target, XDG_CURRENT_DESKTOP Tuna:GNOME (and
tuna-portals.conf to match), app IDs, layer namespaces, the Arch and
Debian package tuna-desktop, and prose "Tuna Desktop". Cargo.lock and
fuzz/Cargo.lock re-locked offline; renamed Rust files rustfmt-ed.
Refs #505
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016YpFGeYYmfpLzk2LMr8ebX
The hand fixes the script cannot make: README.md, docs/architecture.md and ROADMAP.md said code and packages would keep the old name "until the rename lands"; the script mechanically turned that into "still use the `tuna` name", which reads wrong. The script deliberately leaves "formerly/previously named Roost" alone; only the rest of each sentence changes. Refs #505 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016YpFGeYYmfpLzk2LMr8ebX
hanthor
force-pushed
the
chore/rename-roost-to-tuna
branch
from
October 9, 2026 02:01
2f9ebb4 to
c1b9d6a
Compare
Member
Author
|
Merging after |
This was referenced Oct 9, 2026
hanthor
added a commit
that referenced
this pull request
Oct 9, 2026
… lane The published TunaOS Marlin flavor (ghcr.io/tuna-os/marlin:roost) still ships the roost package until tuna-desktop and the tuna flavor land, so the published-image nightly must keep qualifying a guest that uses the old names. Following #536's pattern, the fixture, guest probes, test-user profile and host-side process checks now follow whichever identity the guest ships: - Containerfile.published hashes and records tuna-desktop or roost binaries and checks the matching greetd session entry. - The lifecycle helper derives the compositor/shell names, nested display, wallpaper drop and PAM service from the shipped prefix. This also fixes the 15-byte comm match, which the rename left as tuna-composito. - The profile exports ROOST_ variables only for a pre-rename guest. - tuna-vm-lane compares guest process roles, not prefixes. - The workflow keeps pulling marlin:roost and records both compositor journal markers. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016YpFGeYYmfpLzk2LMr8ebX
hanthor
added a commit
to tuna-os/tunaos-packages
that referenced
this pull request
Oct 9, 2026
tuna-os/tuna-desktop#536 renamed Roost to Tuna Desktop. This adds packages/tuna-desktop, built from the rename merge d4438581 with its crates.io closure vendored offline from the new immutable tuna-desktop-vendor-d443858 release asset. The recipe mirrors upstream's packaging/arch/PKGBUILD: the six tuna-* binaries stamped with TUNA_VERSION (ROOST_VERSION is no longer read), tuna.desktop, tuna-session.target and the tuna-lock PAM service, plus one release of compatibility with the old name: roost-* symlinks, the hidden roost.desktop session entry and the roost-lock PAM service. It provides roost. The schema cannot express replaces/conflicts yet. The smoke test checks each binary's version under both names, both session entries, both PAM services and the session target. The roost recipe stays until Marlin moves over. Claude-Session: https://claude.ai/code/session_016YpFGeYYmfpLzk2LMr8ebX Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
hanthor
added a commit
to tuna-os/tunaOS
that referenced
this pull request
Oct 11, 2026
tuna-os/tuna-desktop#536 renamed Roost to Tuna Desktop. The Marlin flavor follows it. The flavor, Containerfile stage, desktop manifest, experience directory, install-desktop branch, greetd session choice (tuna-session), portal config (tuna-portals.conf) and tests move to `tuna`, and the image installs tunaos/tuna-desktop. The desktop contract now also checks the upgrade path. It requires tuna-desktop by its exact name and refuses an installed roost package; pacman -Q would match the old name through provides. It also checks the roost-* compat links, the hidden roost.desktop entry and the roost-lock PAM service. ghcr.io/tuna-os/marlin:roost is published, and bootc installs track that exact tag. A new flavor-level `tag_aliases` keeps it written at promote time as the same digest as :tuna, so those installs keep updating. How long to keep it is an owner decision. Depends on tunaos-packages#810 publishing tuna-desktop. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016YpFGeYYmfpLzk2LMr8ebX
hanthor
added a commit
that referenced
this pull request
Oct 16, 2026
…273) * Qualify published Marlin Roost through real greeter login nightly * Verify all six shipped Roost binary hashes * Use complete Python package comparison on minimal flavor * Deliver username hyphen and enforce matching KVM runner * Settle KVM permissions and record safe PAM refusal milestones * fix(tests): include greeter-login and require-kvm flags in repeat-boot fixtures repeat_boots gained --greeter-login/--require-kvm forwarding in 188e906 but RepeatedCoverage.run_boots still builds a namespace without them, so all four repeat-gate tests die with AttributeError. Pass both flags as False to match the pristine-boot default. * fix(tests): detect published greeter sessions without newer snapshot keys Run 37696030597 proved the PAM login healthy (pam_unix session opened for roost-test, logind session 3, compositor DRM output plus shell all persist for the full poll window) while every inventory() probe died on KeyError: 'pointer_position': the published roost 0.1.0-2 snapshot predates the Oct-7 instrumentation keys. Session detection now requires only the original four keys and observes newer ones as None, so a missing instrumentation key can no longer masquerade as a missing session (V-GREETD-LOGIN, V-DISPLAY-MANAGER, V-PANEL). Adds a regression test that replays a shipped-era snapshot against inventory(). * fix(tests): qualify newer-behavior gates on predating published guests Run 37700332957 fails published-flavor at V-LIFECYCLE (lifecycle state did not arrive within its deadline) and V-MEDIA-VOLUME ([(0.4, False)] vs five expected samples). The published roost 0.1.0-2 guest predates the Oct-4 media-key volume behavior and the Oct-6/7 snapshot instrumentation: its snapshot reports mouse_left_handed, pointer_position, native_relative_motion_count and hot_corners all as None while the session itself stays healthy, and the tour media keys move no PipeWire volume. The lane now probes predation once per lifecycle and qualifies the gates that need the newer keys or behavior (handedness live delivery, Orca management, key-driven overamplification, hot-corner pressure, pointer constraints, logout Orca lifecycle, tour media-key volume), verifying what the older guest can still prove (preference persistence, direct HDA sink control, HDA presence plus baseline level). Everything else stays strict, the current-build marlin-vm lane keeps proving the full gates, and they re-engage here as soon as a refreshed published image reports the keys. Adds PredatingGuestQualification replay tests covering the failed run's snapshot shape and serial excerpt. * fix(tests): match predating-guest off volume band to its pinned 0.98 level The published 0.1.0-2 guest sets wpctl 0.98 for both off and on; only the amplified flag differs. The 30-50 off band could never match its 98% sink readback. Share the 90-106 band for both. * fix(tests): qualify resume-upload gate on predating published guests The published 0.1.0-2 guest resumes fail-closed without fresh host-visible GPU uploads while the current build keeps proving them strictly. Qualify the upload gate with the predating rationale used elsewhere; fail-closed session assertions stay strict. * fix(tests): hold Super+L until the lock owns input on predating guests Run 37727015469 fails published-flavor at V-LOCK (['false', 'true']), then V-LIFECYCLE and V-MEDIA-VOLUME downstream of it: the session stays locked, so the GTK input probe never activates and no lifecycle before.json exists for the media-volume qualification. The tour video shows the curtain lifting and the password entry staying empty, and the journal has no PAM attempt at all. The published roost 0.1.0-2 guest predates a3647b5, which made the compositor account for key releases it consumes while a lock is pending. With the 80 ms chord the Super release arrives before the lock surface maps and is dropped, so Super stays latched: GTK ignores Super+r/o/s/t and Super+Return. On guests that predate the newer snapshot keys (the same probe the other qualified gates use, taken from the pre-tour session-owner inventory), the tour now holds the chord for 1.5 s so the release reaches the mapped lock surface, as a slower real press would. The unlock still goes through the real PAM stack and V-LOCK stays strict. Current guests keep the quick release, which is the regression a3647b5 fixed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016YpFGeYYmfpLzk2LMr8ebX * fix(tests): accept the pre-rename roost guest in the published Marlin lane The published TunaOS Marlin flavor (ghcr.io/tuna-os/marlin:roost) still ships the roost package until tuna-desktop and the tuna flavor land, so the published-image nightly must keep qualifying a guest that uses the old names. Following #536's pattern, the fixture, guest probes, test-user profile and host-side process checks now follow whichever identity the guest ships: - Containerfile.published hashes and records tuna-desktop or roost binaries and checks the matching greetd session entry. - The lifecycle helper derives the compositor/shell names, nested display, wallpaper drop and PAM service from the shipped prefix. This also fixes the 15-byte comm match, which the rename left as tuna-composito. - The profile exports ROOST_ variables only for a pre-rename guest. - tuna-vm-lane compares guest process roles, not prefixes. - The workflow keeps pulling marlin:roost and records both compositor journal markers. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016YpFGeYYmfpLzk2LMr8ebX * fix(tests): read pre-rename guest log prefixes in the VM lane Run 37881145336's published guest logged roost-compositor/roost-shell-gtk lines, so V-DRM/V-SHELL never matched and the session gates were skipped. The lane now normalizes the shipped binaries' pre-rename log prefixes when it reads the serial journal and compares the resumed shell by role. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016YpFGeYYmfpLzk2LMr8ebX * fix(vm-lane): retry transient Orca read failures (#560) Signed-off-by: James Reilly <jreilly1821@gmail.com> * Report every lifecycle check on the published image Run 38836004042 on d09b5fb1 stopped the whole lifecycle at orca-off because the image ships no orca package, so lock-after-sleep and logout never ran. Report a missing Orca package as V-ORCA-ACTIVATION's failure and continue, and compare the repainted greeter after logout with the frame before login: the published flavor's stylesheet paints the wallpaper, not the CI #222226. Stop exporting XDG_SESSION_TYPE from the fixture profile so the session runs with the environment the image gives it. * test(vm-lane): Orca observations carry the package; missing package fails at once * Build the hot-corner constraint client into the published fixture Run 38837664602 on d09b5fb1 stopped at constraint-start: the published fixture never had /usr/libexec/tuna-vm-constraints. Build it in a separate stage as the current-build lane does, and export TUNA_POINTER_TRACE like that lane's /etc/environment. --------- Signed-off-by: James Reilly <jreilly1821@gmail.com> Co-authored-by: hanthor <hanthor@users.noreply.github.com> Co-authored-by: Muse Code <muse-code@localhost> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This was referenced Oct 16, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs #505 (the tunaOS image and tunaos-packages changes come in separate PRs; see below).
Renames Roost to Tuna Desktop everywhere, following the naming table in #505. The rename is a reproducible, idempotent script, so the ~12 in-flight PRs can rename themselves instead of hand-resolving conflicts.
For other PR authors: how to rebase after this lands
If the rebase stops on a conflict, the easiest route is to resolve each file to your branch's version (old names and all), then run
scripts/rename-to-tunaandgit add -Abefore continuing. The script also renames untracked files, re-locksCargo.lockoffline and rustfmts the renamed Rust files. If you add a file namedroost-*whiletuna-*already exists, it reports the clash instead of overwriting. CI now runsscripts/rename-to-tuna --check, which fails until the old name is gone.Commits
scripts/rename-to-tuna+ self-test (scripts/lib/rename-to-tuna-tests.py, run in CI). It covers every rule, the keep list, keep markers,--check, untracked files, git-mv, and the run-twice-is-a-no-op property.crates/shell-control-schema/src/legacy.rs: each binary copiesROOST_X→TUNA_Xat startup. An existingTUNA_Xwins, the old names are dropped so children stay quiet, and it logs one deprecation line. The compositor also links~/.config/tuna,~/.local/share/tuna{,-shell},~/.local/state/tuna-shelland~/.cache/tunato theirroostcounterparts when only the old ones exist, so saved monitors, favorites, notifications, prefs and extensions carry over (rollback-safe). Unit tests cover all of this.replaces/conflicts/provides=roost, plus/usr/bin/roost-*→tuna-*symlinks for the six binaries.pam.rsDEFAULT_SERVICE), so a compat file is needed. During an in-place upgrade a running session keeps the old lock-screen binary, which asks forroost-lock. Without that file PAM falls back toother(deny), and the session could never unlock.share/compat/pam.d/roost-lockships as/etc/pam.d/roost-lock, and both PAM files are conffiles/backup.tuna.desktop(Name=Tuna Desktop) is the visible entry. Decision: keeproost.desktopas a hidden compat entry (share/compat/wayland-sessions/roost.desktop,NoDisplay=true,Exec=tuna-session). GDM remembers each user's session by file name, so without it upgraded users would silently land in GNOME. I checked GDM's source: libgdm's picker skipsNoDisplay, but the daemon still launches a remembered session unless it isHidden. Our greeter now skipsNoDisplay/Hiddenentries too, with a test. The rationale is documented inpackaging/README.md.check-release-packageverifies the compat links, entry, PAM file and package relations. Its fixture tests (installed-deb-proof-tests.py) build the compat layout and include a negative test.scripts/rename-to-tunaon main. Not hand-edited.README.md,docs/architecture.mdandROADMAP.mdthat said the rename had not landed yet.Rebased onto main after #511 and #537. Commit 3 was regenerated by the script, not hand-merged. Re-running the script on commit 2 in a clean worktree reproduces commit 3 byte for byte. The script is idempotent over #511's text: there is no "Tuna Desktop Desktop", and "formerly/previously Roost" prose is kept. #511's dual acceptance of
Name=Tuna Desktopor oldName=Roostpackages (Marlinsed -E 's/^Name=(Tuna Desktop|Roost)$/…/'andtuna-perf-payload.py) is protected, so it survives.Keep list (never touched)
Dated evidence (
docs/perf/20*,docs/niri-parity/*,docs/marlin/*), the recorded capturetests/protocols/marlin-roost-wayland-info.txtand its digest recordmarlin-gnome51-source.json(renaming would break the recorded sha256), and the dateddocs/test-coverage/2026-10-04-initial-baseline.md. Alsothird-party/(includingroost_transport_boundsandROOST-PATCH.mdreferences),.spektacular/,share/compat/, historical…/actions/runs/…links, and lines carryingtuna-rename: keepmarkers. Living docs underdocs/perf/(README, how-tos) are renamed.tests/a11y/gnome51/is renamed, a deliberate exception: itscomparison.mdis generated from those trees plus our goldens and CI checks it (tuna-a11y-baseline check), the GNOME trees only name our*-test-*fixture windows, and nothing records their hashes. Keeping it would fail CI, and a fresh capture would produce the new names anyway. Current repo linkshanthor/roost-desktop→tuna-os/tuna-desktop.XDG_CURRENT_DESKTOPis nowTuna:GNOME, soDesktopNames=Tuna;GNOME;. Portal routing follows because the portals config is renamed totuna-portals.conf, the file xdg-desktop-portal looks up for desktopTuna. TheOnlyShowInmatching code and tests useTuna. Trace mark names (Roost::…→Tuna::…) change in the mutter-profiler patches and their parser together; no committed fixture contains them.Residual
git grep -ic roost(outside the keep-list trees)Verified locally
cargo check --workspace --all-targets --locked: OK.cargo fmt --all -- --check: OK.cargo test -p tuna-shell-control: 49 + 29 passed, including 6legacy::tests for the env fallback and directory adoption.cargo test -p tuna-greeter --lib session: 7 passed, including the new hidden-entry test.scripts/lib/*-tests.pypass, includingrename-to-tuna-tests.py.scripts/tuna-a11y-baseline checkandscripts/tuna-settings-inventory-checkpass. shellcheck passes on the CI-listed scripts.scripts/rename-to-tuna --check --no-cargoon the result: no changes, so a re-run is a no-op.bash -n/py_compileon every script underscripts/,packaging/,tests/and.github/: no failures.CI (head 2f9ebb4)
Green: check (clippy,
cargo test --workspace, the rename self-test and--checkguard), app-content, arch-package, capture, coverage, drm-smoke, gtk-shell, marlin-image, marlin-vm (real greetd/GDM boot of the renamed session, PAM and portals), niri-parity, portal-security, remote-security, scroll-proof, the fuzz decoders, validate, churn.Two expected failures:
journey: the known G-IME-CANDIDATES gate (G-IME-CANDIDATES fails on ubuntu-26.04 journey: typing 'ni' shows no candidate window #526, fixed in fix(proof): return focus to the IME field after GTK 4.16+ popdown #527). Before reaching it, the renamedtuna-desktop_0.1.0_amd64.debpassedcheck-release-package, compat checks included.compare(Marlin performance samples): a bootstrap failure. The job downloads the*-archpackage from the latest trusted main CI run. Main still publishes the pre-renameroost-arch/roostpackage, which the renamed validator correctly refuses. It passes once main has run CI with this PR merged. I did not weaken the validator to accept both.What tunaOS / tunaos-packages need (separate PRs, not here)
roost→tuna-desktop(withreplaces/conflicts/provides=roost; the PKGBUILD here already declares them). Built package file:tuna-desktop-<ver>-<rel>-x86_64.pkg.tar.zst. Debian:tuna-desktop_<ver>_amd64.deb.https://github.com/tuna-os/tuna-desktop. Build stamp env:TUNA_VERSION(wasROOST_VERSION; it is read at compile time, so there is no runtime fallback). Local-source env:TUNA_LOCAL_SRC.-p tuna-compositor -p tuna-shell-host -p tuna-shell-gtk -p tuna-greeter.tuna-compositor,tuna-session,tuna-shell-host,tuna-shell-gtk,tuna-ibus-bridge,tuna-greeter, plusroost-*compat symlinks for one release./usr/share/wayland-sessions/tuna.desktop(Name=Tuna Desktop,Exec=tuna-session,DesktopNames=Tuna;GNOME;), plus the hidden compatroost.desktop. GDMDefaultSession=tuna.desktop; greetd environmentstuna-session./etc/pam.d/tuna-lock(+ compat/etc/pam.d/roost-lock), bothbackup/conffiles.tuna-session.target(wasroost-session.target; no compat alias)./usr/share/xdg-desktop-portal/tuna-portals.conf(desktopTuna).ghcr.io/tuna-os/tuna-desktop/marlin-tuna-preview(was…/marlin-roost-preview). The nested launcher istuna-nested-preview.desktop, and the libexec helpers aretuna-image-kernelsandtuna-pinned-baseline. Any tunaOS flavorroost→tunaand its manifests/install script should follow.tuna-arch. Selecting a pre-rename main run (artifactroost-arch) will not work.Not merging: the coordinator lands this after the current wave.
🤖 Generated with Claude Code
https://claude.ai/code/session_016YpFGeYYmfpLzk2LMr8ebX