Skip to content

Rename roost to tuna (reproducible script + compat layer) - #536

Merged
hanthor merged 4 commits into
mainfrom
chore/rename-roost-to-tuna
Oct 9, 2026
Merged

hanthor merged 4 commits into
mainfrom
chore/rename-roost-to-tuna

Conversation

@hanthor

@hanthor hanthor commented Oct 8, 2026 •

Copy link
Copy Markdown
Member

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

git fetch origin
git rebase origin/main          # conflicts: take your side (git checkout --theirs / resolve to your version), the script fixes the names
scripts/rename-to-tuna          # renames your branch's contents and files; a second run is a no-op
git add -A
git rebase --continue           # or commit, if the rebase already finished

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-tuna and git add -A before continuing. The script also renames untracked files, re-locks Cargo.lock offline and rustfmts the renamed Rust files. If you add a file named roost-* while tuna-* already exists, it reports the clash instead of overwriting. CI now runs scripts/rename-to-tuna --check, which fails until the old name is gone.

Commits

  1. 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.
  2. Compatibility layer, written by hand:
    • crates/shell-control-schema/src/legacy.rs: each binary copies ROOST_X → TUNA_X at startup. An existing TUNA_X wins, 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-shell and ~/.cache/tuna to their roost counterparts when only the old ones exist, so saved monitors, favorites, notifications, prefs and extensions carry over (rollback-safe). Unit tests cover all of this.
    • Packaging (Arch and Debian): replaces/conflicts/provides=roost, plus /usr/bin/roost-* → tuna-* symlinks for the six binaries.
    • PAM: the lock screen calls PAM by service name (pam.rs DEFAULT_SERVICE), so a compat file is needed. During an in-place upgrade a running session keeps the old lock-screen binary, which asks for roost-lock. Without that file PAM falls back to other (deny), and the session could never unlock. share/compat/pam.d/roost-lock ships as /etc/pam.d/roost-lock, and both PAM files are conffiles/backup.
    • Session entry: tuna.desktop (Name=Tuna Desktop) is the visible entry. Decision: keep roost.desktop as 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 skips NoDisplay, but the daemon still launches a remembered session unless it is Hidden. Our greeter now skips NoDisplay/Hidden entries too, with a test. The rationale is documented in packaging/README.md.
    • check-release-package verifies 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.
  3. The generated rename: the output of scripts/rename-to-tuna on main. Not hand-edited.
  4. Hand fixes: the status sentences in README.md, docs/architecture.md and ROADMAP.md that 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 Desktop or old Name=Roost packages (Marlin sed -E 's/^Name=(Tuna Desktop|Roost)$/…/' and tuna-perf-payload.py) is protected, so it survives.

Keep list (never touched)

Dated evidence (docs/perf/20*, docs/niri-parity/*, docs/marlin/*), the recorded capture tests/protocols/marlin-roost-wayland-info.txt and its digest record marlin-gnome51-source.json (renaming would break the recorded sha256), and the dated docs/test-coverage/2026-10-04-initial-baseline.md. Also third-party/ (including roost_transport_bounds and ROOST-PATCH.md references), .spektacular/, share/compat/, historical …/actions/runs/… links, and lines carrying tuna-rename: keep markers. Living docs under docs/perf/ (README, how-tos) are renamed. tests/a11y/gnome51/ is renamed, a deliberate exception: its comparison.md is 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 links hanthor/roost-desktop → tuna-os/tuna-desktop.

XDG_CURRENT_DESKTOP is now Tuna:GNOME, so DesktopNames=Tuna;GNOME;. Portal routing follows because the portals config is renamed to tuna-portals.conf, the file xdg-desktop-portal looks up for desktop Tuna. The OnlyShowIn matching code and tests use Tuna. 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)

.github/workflows/ci.yml:1                 roost_transport_bounds (third-party test name)
ROADMAP.md:1, README.md:2, docs/architecture.md:1   "previously/formerly Roost" prose; README names the roost-* compat links
packaging/arch/PKGBUILD (comment), packaging/marlin/Containerfile:2, scripts/lib/tuna-perf-payload{,-tests}.py:3   "formerly Roost" comments and #511's dual Name= acceptance
crates/greeter/src/session.rs:1            include_str! of share/compat/…/roost.desktop
crates/shell-control-schema/src/legacy.rs:33   compat layer
docs/{gnome-parity,niri-parity,parity-ledger,portal-screenshot-consent,protocols,remote-desktop,walkthrough/README-media,xwayland-on-demand}.md, docs/perf/README.md, tests/coverage-floors.json
                                           historical run links, ROOST-PATCH.md, marlin-roost-wayland-info.txt
docs/test-coverage/2026-10-04-initial-baseline.md:7   dated baseline
packaging/README.md:11                     compat documentation
packaging/arch/PKGBUILD:7, scripts/tuna-release:5, scripts/check-release-package:8, scripts/lib/installed-deb-proof.py:1   compat packaging
scripts/rename-to-tuna:40, scripts/lib/rename-to-tuna-tests.py:71   the script and its self-test
share/compat/pam.d/roost-lock:2, share/compat/wayland-sessions/roost.desktop:2   compat files
tests/protocols/marlin-roost-wayland-info.txt:4, tests/protocols/marlin-gnome51-source.json:2   recorded capture + digest

Verified locally

  • cargo check --workspace --all-targets --locked: OK. cargo fmt --all -- --check: OK.
  • cargo test -p tuna-shell-control: 49 + 29 passed, including 6 legacy:: tests for the env fallback and directory adoption. cargo test -p tuna-greeter --lib session: 7 passed, including the new hidden-entry test.
  • All scripts/lib/*-tests.py pass, including rename-to-tuna-tests.py. scripts/tuna-a11y-baseline check and scripts/tuna-settings-inventory-check pass. shellcheck passes on the CI-listed scripts.
  • Reproducibility: re-ran the script on the compat commit in a clean worktree. The output is byte-identical to commit 3. scripts/rename-to-tuna --check --no-cargo on the result: no changes, so a re-run is a no-op.
  • bash -n / py_compile on every script under scripts/, packaging/, tests/ and .github/: no failures.

CI (head 2f9ebb4)

Green: check (clippy, cargo test --workspace, the rename self-test and --check guard), 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:

What tunaOS / tunaos-packages need (separate PRs, not here)

  • Package: roost → tuna-desktop (with replaces/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.
  • Source URL: https://github.com/tuna-os/tuna-desktop. Build stamp env: TUNA_VERSION (was ROOST_VERSION; it is read at compile time, so there is no runtime fallback). Local-source env: TUNA_LOCAL_SRC.
  • Cargo packages to build: -p tuna-compositor -p tuna-shell-host -p tuna-shell-gtk -p tuna-greeter.
  • Binaries: tuna-compositor, tuna-session, tuna-shell-host, tuna-shell-gtk, tuna-ibus-bridge, tuna-greeter, plus roost-* compat symlinks for one release.
  • Session file: /usr/share/wayland-sessions/tuna.desktop (Name=Tuna Desktop, Exec=tuna-session, DesktopNames=Tuna;GNOME;), plus the hidden compat roost.desktop. GDM DefaultSession=tuna.desktop; greetd environments tuna-session.
  • PAM: /etc/pam.d/tuna-lock (+ compat /etc/pam.d/roost-lock), both backup/conffiles.
  • systemd user target: tuna-session.target (was roost-session.target; no compat alias).
  • Portals: /usr/share/xdg-desktop-portal/tuna-portals.conf (desktop Tuna).
  • Marlin flavor/image: this repo now publishes ghcr.io/tuna-os/tuna-desktop/marlin-tuna-preview (was …/marlin-roost-preview). The nested launcher is tuna-nested-preview.desktop, and the libexec helpers are tuna-image-kernels and tuna-pinned-baseline. Any tunaOS flavor roost → tuna and its manifests/install script should follow.
  • The perf workflow's input artifact is now tuna-arch. Selecting a pre-rename main run (artifact roost-arch) will not work.

Not merging: the coordinator lands this after the current wave.

🤖 Generated with Claude Code

https://claude.ai/code/session_016YpFGeYYmfpLzk2LMr8ebX

@hanthor
hanthor force-pushed the chore/rename-roost-to-tuna branch 4 times, most recently from 8a6b7f2 to 2f9ebb4 Compare October 9, 2026 00:28
@hanthor
hanthor marked this pull request as ready for review October 9, 2026 01:58
hanthor and others added 4 commits October 9, 2026 01:59
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
hanthor force-pushed the chore/rename-roost-to-tuna branch from 2f9ebb4 to c1b9d6a Compare October 9, 2026 02:01
@hanthor

hanthor commented Oct 9, 2026

Copy link
Copy Markdown
Member Author

Merging after check passed on the regenerated head (c1b9d6a). The full suite passed on the previous base except the known G-IME-CANDIDATES (#526), and compare (it fetches main's last package, which still has the old name; this clears after main's next CI run). The regenerated commit is mechanical: re-running the script reproduces it byte for byte. Main is in a merge freeze until this lands, so other PRs can rebase onto it by running scripts/rename-to-tuna.

@hanthor
hanthor merged commit d443858 into main Oct 9, 2026
12 of 14 checks passed
@hanthor
hanthor deleted the chore/rename-roost-to-tuna branch October 9, 2026 02:16
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant