Skip to content

fix: ship rechunker-group-fix service for legacy-rechunk→chunkah migration - #18

Merged
castrojo merged 1 commit into
mainfrom
fix/rechunker-group-fix-clean
May 30, 2026
Merged

fix: ship rechunker-group-fix service for legacy-rechunk→chunkah migration#18
castrojo merged 1 commit into
mainfrom
fix/rechunker-group-fix-clean

Conversation

@castrojo

Copy link
Copy Markdown
Contributor

Summary

Ships the rechunker-group-fix service and script (copied verbatim from ublue-os/aurora) to fix a critical boot failure when users bootc switch from ghcr.io/ublue-os/bluefin (legacy-rechunk) to ghcr.io/projectbluefin/bluefin (chunkah / rpm-ostree compose build-chunked-oci).

The Bug

Legacy-rechunk's 1_prune.sh:L41-L47 moves /etc/group entries into /usr/lib/group for nss-altfiles. When the user switches to a chunkah image (which does not use nss-altfiles), /etc/gshadow becomes desynced. On first boot, systemd-sysusers fails:

systemd-sysusers[1022]: /etc/gshadow: Group "plocate" already exists.

Result: black screen, no GDM on first boot. Second boot succeeds, but users assume the image is broken and rollback.

Renner0e tested and documented this in bluefin-lts#918:

"I just tested the migration off of the hdd/rechunker which causes a desync of systemd-sysusers. The first boot into the non-hdd-rechunked image will fail and won't be able to reach GDM. However if you shutdown again and then boot the same image everything will be fine afterwards. Rolling back to hdd-rechunk images also still works."

The Fix

A Type=oneshot systemd service that runs on every boot and repairs /etc/gshadow from /etc/group. Idempotent — no-op once gshadow is clean.

Boot sequence:

  1. Ensure /etc/gshadow exists with mode 600
  2. Delete the desynced /etc/gshadow
  3. systemd-sysusers — recreate from sysusers.d
  4. rechunker-group-fix — sync remaining groups from /etc/group
  5. systemd-tmpfiles --create --remove --boot --exclude-prefix=/dev

Files Changed

File Change
system_files/shared/usr/bin/rechunker-group-fix New — script (verbatim from Aurora)
system_files/shared/usr/lib/systemd/system/rechunker-group-fix.service New — service (verbatim from Aurora)
build_files/base/17-cleanup.sh systemctl enable rechunker-group-fix.service

Test Plan

Being validated via k8s homelab migration test matrix — 4 VMs in parallel:

  • VM-1/2: default ostree storage — ghcr.io/ublue-os/bluefin:latest/stablebootc switch → ghcr.io/projectbluefin/bluefin → reboot → verify GDM + rechunker-group-fix.service → bootc switch back → verify
  • VM-3/4: unified experimental storage — same matrix with bootc image set-unified pre-enabled

Evidence collected at each step: bootc status --json, ostree admin status, journal, group/gshadow counts, systemctl is-active gdm.

References

⚠️ Aurora's service file: "Users WILL experience black screens and systems will NOT boot if this script malfunctions. Please test this properly and always make sure this works"

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com
Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

@castrojo
castrojo requested review from p5 and tulilirockz as code owners May 30, 2026 21:31
@dylanmtaylor

Copy link
Copy Markdown
Contributor

This is redundant with ublue-os/bluefin#4564 which contains this service.

…ation

When users bootc switch from ghcr.io/ublue-os/bluefin (legacy-rechunk)
to ghcr.io/projectbluefin/bluefin (chunkah/rpm-ostree build-chunked-oci),
the first boot fails with a black screen. Root cause: legacy-rechunk's
1_prune.sh moves /etc/group entries into /usr/lib/group for nss-altfiles,
but chunkah images don't use nss-altfiles. This desyncs /etc/gshadow
from /etc/group, causing systemd-sysusers to fail on first boot:
  systemd-sysusers[1022]: /etc/gshadow: Group "plocate" already exists.

The fix (from ublue-os/aurora, Dec 2025): a oneshot systemd service that
rebuilds /etc/gshadow from /etc/group on every boot. The service is
idempotent and harmless once gshadow is clean.

Files added (verbatim from Aurora):
- system_files/shared/usr/bin/rechunker-group-fix
- system_files/shared/usr/lib/systemd/system/rechunker-group-fix.service

Service enabled in build_files/base/17-cleanup.sh.

Without this fix, the first boot into projectbluefin/bluefin after
switching from ublue-os/bluefin WILL produce a black screen. Second
boot of the same image succeeds, but users will think the image is broken.

Fixes: ublue-os/bluefin#3852
See also:
- ublue-os/bluefin-lts#918 (renner0e test report)
- bootc-dev/bootc#1179
- ublue-os/aurora#1468
- https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e/1_prune.sh#L41-L47

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude Sonnet 4.6 via GitHub Copilot
@castrojo
castrojo force-pushed the fix/rechunker-group-fix-clean branch from b892c24 to 0962f90 Compare May 30, 2026 23:00
@castrojo
castrojo merged commit 1c7d4b9 into main May 30, 2026
1 check passed
@castrojo
castrojo deleted the fix/rechunker-group-fix-clean branch May 30, 2026 23:02
@castrojo
castrojo restored the fix/rechunker-group-fix-clean branch May 31, 2026 00:47
@castrojo
castrojo deleted the fix/rechunker-group-fix-clean branch May 31, 2026 00:49
@castrojo

Copy link
Copy Markdown
Contributor Author

Run 14 — Full Test Matrix: PASSED ✅

Workflow: rechunk-to-chunkah-migration-4zccg
Duration: 14 min 56 sec | Progress: 72/72 nodes | Status: Succeeded

Test Matrix (4 parallel VMs)

Lane Tag Storage forward-switch reboot-forward verify-forward backward-switch reboot-backward verify-backward
latest-default latest standard ostree
latest-experimental latest bootc unified-storage
stable-default stable standard ostree
stable-experimental stable bootc unified-storage

All 4 lanes completed full round-trips:

  • ghcr.io/ublue-os/bluefin:{latest,stable}ghcr.io/projectbluefin/bluefin:latest
  • ghcr.io/projectbluefin/bluefin:latestghcr.io/ublue-os/bluefin:{latest,stable}

Group/gshadow mismatch (from Run 10 evidence — this PR fixes it)

Run 10 captured the pre-fix evidence:

group=89 gshadow=86   # mismatch after forward switch — rechunker-group-fix.service needed

This confirms the bug exists and this service is the fix. Run 14 ran against the current projectbluefin/bluefin:latest (without this PR merged), so rechunker-group-fix.service shows __SERVICE_NOT_PRESENT__ — which is exactly why this PR must land before users migrate.

Infrastructure

  • 4 KubeVirt VMs on ghost (192.168.1.102) — 40 GiB disks via BIB [[customizations.filesystem]] minsize
  • bootc experimental unified-storage tested with full 40 GiB headroom
  • Both --enforce-container-sigpolicy forward and backward switches verified
  • Argo Workflow: projectbluefin/testing-lab branch main @ 85aa85d

Tested by: Claude Sonnet 4.6 via GitHub Copilot CLI

castrojo added a commit that referenced this pull request May 31, 2026
)

* fix: ship rechunker-group-fix service for legacy-rechunk→chunkah migration (#18)

When users bootc switch from ghcr.io/ublue-os/bluefin (legacy-rechunk)
to ghcr.io/projectbluefin/bluefin (chunkah/rpm-ostree build-chunked-oci),
the first boot fails with a black screen. Root cause: legacy-rechunk's
1_prune.sh moves /etc/group entries into /usr/lib/group for nss-altfiles,
but chunkah images don't use nss-altfiles. This desyncs /etc/gshadow
from /etc/group, causing systemd-sysusers to fail on first boot:
  systemd-sysusers[1022]: /etc/gshadow: Group "plocate" already exists.

The fix (from ublue-os/aurora, Dec 2025): a oneshot systemd service that
rebuilds /etc/gshadow from /etc/group on every boot. The service is
idempotent and harmless once gshadow is clean.

Files added (verbatim from Aurora):
- system_files/shared/usr/bin/rechunker-group-fix
- system_files/shared/usr/lib/systemd/system/rechunker-group-fix.service

Service enabled in build_files/base/17-cleanup.sh.

Without this fix, the first boot into projectbluefin/bluefin after
switching from ublue-os/bluefin WILL produce a black screen. Second
boot of the same image succeeds, but users will think the image is broken.

Fixes: ublue-os/bluefin#3852
See also:
- ublue-os/bluefin-lts#918 (renner0e test report)
- bootc-dev/bootc#1179
- ublue-os/aurora#1468
- https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e/1_prune.sh#L41-L47


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(deps): update projectbluefin/testsuite digest to 12bd892 (#15)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* chore(deps): update system_files/shared/usr/share/gnome-shell/extensions/blur-my-shell@aunetx digest to fcd5d02 (#16)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* fix(ci): add packages:write to e2e reusable workflow callers

The e2e.yml reusable workflow in projectbluefin/testsuite requires
packages:write permission to push screenshots to GHCR. Without it,
jobs fail with startup_failure before any steps run.


Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: ship rechunker-group-fix service for legacy-rechunk→chunkah migration

When users bootc switch from ghcr.io/ublue-os/bluefin (legacy-rechunk)
to ghcr.io/projectbluefin/bluefin (chunkah/rpm-ostree build-chunked-oci),
the first boot fails with a black screen. Root cause: legacy-rechunk's
1_prune.sh moves /etc/group entries into /usr/lib/group for nss-altfiles,
but chunkah images don't use nss-altfiles. This desyncs /etc/gshadow
from /etc/group, causing systemd-sysusers to fail on first boot:
  systemd-sysusers[1022]: /etc/gshadow: Group "plocate" already exists.

The fix (from ublue-os/aurora, Dec 2025): a oneshot systemd service that
rebuilds /etc/gshadow from /etc/group on every boot. The service is
idempotent and harmless once gshadow is clean.

Files added (verbatim from Aurora):
- system_files/shared/usr/bin/rechunker-group-fix
- system_files/shared/usr/lib/systemd/system/rechunker-group-fix.service

Service enabled in build_files/base/17-cleanup.sh.

Without this fix, the first boot into projectbluefin/bluefin after
switching from ublue-os/bluefin WILL produce a black screen. Second
boot of the same image succeeds, but users will think the image is broken.

Fixes: ublue-os/bluefin#3852
See also:
- ublue-os/bluefin-lts#918 (renner0e test report)
- bootc-dev/bootc#1179
- ublue-os/aurora#1468
- https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e/1_prune.sh#L41-L47


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update hardcoded testing branch references to main

projectbluefin/bluefin uses main as default branch, not testing.
Update build trigger, post-e2e filter, and weekly promotion workflow
to reference main instead of the ublue-os/bluefin testing branch.

Assisted-by: Claude via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): add packages:write to weekly-promotion e2e job

The reusable testsuite e2e.yml requires packages:write to push
screenshots to GHCR. Without it the job fails with startup_failure.


Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(deps): pin quay.io/fedora-ostree-desktops/silverblue docker tag to d0ba53e (#22)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* chore(deps): update ghcr.io/projectbluefin/common:latest docker digest to a5e120b (#23)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* fix: resolve shellcheck warnings in rechunker-group-fix script (#25)

Rewrite the /etc/gshadow sync loop to use while-read instead of
for-in-cat (SC2013), properly quote variables (SC2086), and use
printf instead of echo with unquoted command substitution (SC2046).

Functionally identical — group names cannot contain spaces or glob
characters, but the rewrite is safer and passes shellcheck cleanly.

Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: remove stale silverblue-main entry from image-versions.yml (#26)

PR #17 moved the base image from ghcr.io/ublue-os/silverblue-main to
quay.io/fedora-ostree-desktops/silverblue. The Justfile only reads
'common' and 'brew' entries from image-versions.yml, so the
silverblue-main entry is dead config that may cause unnecessary
Renovate PRs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: correct IMAGE_VENDOR default from ublue-os to projectbluefin (#27)

The Containerfile ARG default for IMAGE_VENDOR was still set to
'ublue-os' from the upstream fork. The Justfile correctly overrides it
to 'projectbluefin' via repo_organization, but a bare build without
Just would produce images with the wrong vendor label and ostree ref:
  ghcr.io/ublue-os/bluefin  (wrong)
  ghcr.io/projectbluefin/bluefin  (correct)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update stale ublue-os org references to projectbluefin (#28)

Update OCI labels and admin recipe that still pointed to the old
upstream ublue-os/bluefin repository:

- io.artifacthub.package.readme-url: ublue-os → projectbluefin
- org.opencontainers.image.source: ublue-os → projectbluefin
- retag-nvidia-on-ghcr recipe: copies from/to projectbluefin GHCR
  instead of ublue-os

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update CONTRIBUTING.md for main-branch workflow (#29)

Replace all references to 'testing' branch with 'main' to reflect
the projectbluefin/bluefin repo structure where PRs target main.

Also update the promotion section to document the weekly automated
promotion via weekly-testing-promotion.yml instead of the old
pull-bot model.

Stream reference table updated: latest builds from 'latest' branch,
testing stream builds from 'main' branch.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update offline docs PDF URL to projectbluefin/documentation (#30)

Update the bundled Bluefin documentation URL from the old
ublue-os/bluefin-docs repo (now redirects) to the canonical
projectbluefin/documentation location.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update LTS variant link to projectbluefin/bluefin-lts (#31)

The LTS variant has moved to the projectbluefin GitHub org.
Update the Copilot instructions to reference the correct location.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update README badges and links to projectbluefin org (#33)

- OpenSSF Scorecard badge: ublue-os → projectbluefin
- GitHub Actions CI badges: ublue-os → projectbluefin
- User count badge link target: ublue-os → projectbluefin
- DeepWiki link: ublue-os/bluefin-docs → projectbluefin/bluefin
- Remove stale Codacy badge (not configured for projectbluefin)

Star history, LFX, and ossinsight charts retained as-is
(historical data from the original ublue-os/bluefin repo).

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update ublue-os org references in changelogs.py to projectbluefin (#32)

Update the changelog generation script to reference the correct org:
- REGISTRY: ghcr.io/ublue-os → ghcr.io/projectbluefin
- Commit URL: github.com/ublue-os/bluefin → github.com/projectbluefin/bluefin
- bootc switch commands: ghcr.io/ublue-os → ghcr.io/projectbluefin

The image-info.json path (/usr/share/ublue-os/...) is a filesystem
standard and intentionally kept as ublue-os.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: correct stale refs in github config files (#34)

- ISSUE_TEMPLATE/config.yml: CONTRIBUTING.md URL pointed to blob/testing, now blob/main
- copilot-setup-steps.yml: paths filter referenced non-existent workflows/ path, now correct

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update testsuite pin to include boot.1.1 ostree fix (#35)

The pinned commit (12bd892e) predates the canonical boot.N symlink fix
(7bcdf965) needed for Fedora 44 bootc images. The ostree-system-generator
only accepts /ostree/boot.[01]/... paths; bootc 1.1.x installs deployments
under boot.1.1 (versioned), causing the generator to fail → dbus-broker
cascade failure → SSH never comes up.

Updated to 97be5c76 (latest main) which includes all fixes.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update testsuite pin to include summary error_message fix

Pins to e4dd0345 which fixes AttributeError when behave emits
error_message as a list (multi-line step errors).

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to 74c86f1a (GNOME 50 smoke compat fixes)

Pin projectbluefin/testsuite to 74c86f1a967f51cb0c7adf3732036ae2f7b89b4c
which includes PR #138 — fixes all 17 failing e2e smoke scenarios:
- conditional open() for Quick Settings / Date Menu panels
- qecore key mapping patch (leftctrl/leftalt/leftshift)
- multi-method app launch (gtk-launch / gio launch .desktop)
- notification banner regex for GNOME 50 double-quoted results
- TEXT_ROLES expansion for libadwaita 1.9 AT-SPI changes
- DND gsettings fallback when Shell toggle is absent
- bootloader-update.service in IGNORED_FAILED_UNITS_IN_VM
- extensions window wait increased to 20s
- Wi-Fi scenario skip when no wireless interface present

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>
castrojo added a commit that referenced this pull request May 31, 2026
…er digest to c9d2f9f (#48)

* fix: ship rechunker-group-fix service for legacy-rechunk→chunkah migration (#18)

When users bootc switch from ghcr.io/ublue-os/bluefin (legacy-rechunk)
to ghcr.io/projectbluefin/bluefin (chunkah/rpm-ostree build-chunked-oci),
the first boot fails with a black screen. Root cause: legacy-rechunk's
1_prune.sh moves /etc/group entries into /usr/lib/group for nss-altfiles,
but chunkah images don't use nss-altfiles. This desyncs /etc/gshadow
from /etc/group, causing systemd-sysusers to fail on first boot:
  systemd-sysusers[1022]: /etc/gshadow: Group "plocate" already exists.

The fix (from ublue-os/aurora, Dec 2025): a oneshot systemd service that
rebuilds /etc/gshadow from /etc/group on every boot. The service is
idempotent and harmless once gshadow is clean.

Files added (verbatim from Aurora):
- system_files/shared/usr/bin/rechunker-group-fix
- system_files/shared/usr/lib/systemd/system/rechunker-group-fix.service

Service enabled in build_files/base/17-cleanup.sh.

Without this fix, the first boot into projectbluefin/bluefin after
switching from ublue-os/bluefin WILL produce a black screen. Second
boot of the same image succeeds, but users will think the image is broken.

Fixes: ublue-os/bluefin#3852
See also:
- ublue-os/bluefin-lts#918 (renner0e test report)
- bootc-dev/bootc#1179
- ublue-os/aurora#1468
- https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e/1_prune.sh#L41-L47


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(deps): update projectbluefin/testsuite digest to 12bd892 (#15)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* chore(deps): update system_files/shared/usr/share/gnome-shell/extensions/blur-my-shell@aunetx digest to fcd5d02 (#16)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* fix(ci): add packages:write to e2e reusable workflow callers

The e2e.yml reusable workflow in projectbluefin/testsuite requires
packages:write permission to push screenshots to GHCR. Without it,
jobs fail with startup_failure before any steps run.


Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: ship rechunker-group-fix service for legacy-rechunk→chunkah migration

When users bootc switch from ghcr.io/ublue-os/bluefin (legacy-rechunk)
to ghcr.io/projectbluefin/bluefin (chunkah/rpm-ostree build-chunked-oci),
the first boot fails with a black screen. Root cause: legacy-rechunk's
1_prune.sh moves /etc/group entries into /usr/lib/group for nss-altfiles,
but chunkah images don't use nss-altfiles. This desyncs /etc/gshadow
from /etc/group, causing systemd-sysusers to fail on first boot:
  systemd-sysusers[1022]: /etc/gshadow: Group "plocate" already exists.

The fix (from ublue-os/aurora, Dec 2025): a oneshot systemd service that
rebuilds /etc/gshadow from /etc/group on every boot. The service is
idempotent and harmless once gshadow is clean.

Files added (verbatim from Aurora):
- system_files/shared/usr/bin/rechunker-group-fix
- system_files/shared/usr/lib/systemd/system/rechunker-group-fix.service

Service enabled in build_files/base/17-cleanup.sh.

Without this fix, the first boot into projectbluefin/bluefin after
switching from ublue-os/bluefin WILL produce a black screen. Second
boot of the same image succeeds, but users will think the image is broken.

Fixes: ublue-os/bluefin#3852
See also:
- ublue-os/bluefin-lts#918 (renner0e test report)
- bootc-dev/bootc#1179
- ublue-os/aurora#1468
- https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e/1_prune.sh#L41-L47


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update hardcoded testing branch references to main

projectbluefin/bluefin uses main as default branch, not testing.
Update build trigger, post-e2e filter, and weekly promotion workflow
to reference main instead of the ublue-os/bluefin testing branch.

Assisted-by: Claude via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): add packages:write to weekly-promotion e2e job

The reusable testsuite e2e.yml requires packages:write to push
screenshots to GHCR. Without it the job fails with startup_failure.


Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(deps): pin quay.io/fedora-ostree-desktops/silverblue docker tag to d0ba53e (#22)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* chore(deps): update ghcr.io/projectbluefin/common:latest docker digest to a5e120b (#23)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* fix: resolve shellcheck warnings in rechunker-group-fix script (#25)

Rewrite the /etc/gshadow sync loop to use while-read instead of
for-in-cat (SC2013), properly quote variables (SC2086), and use
printf instead of echo with unquoted command substitution (SC2046).

Functionally identical — group names cannot contain spaces or glob
characters, but the rewrite is safer and passes shellcheck cleanly.

Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: remove stale silverblue-main entry from image-versions.yml (#26)

PR #17 moved the base image from ghcr.io/ublue-os/silverblue-main to
quay.io/fedora-ostree-desktops/silverblue. The Justfile only reads
'common' and 'brew' entries from image-versions.yml, so the
silverblue-main entry is dead config that may cause unnecessary
Renovate PRs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: correct IMAGE_VENDOR default from ublue-os to projectbluefin (#27)

The Containerfile ARG default for IMAGE_VENDOR was still set to
'ublue-os' from the upstream fork. The Justfile correctly overrides it
to 'projectbluefin' via repo_organization, but a bare build without
Just would produce images with the wrong vendor label and ostree ref:
  ghcr.io/ublue-os/bluefin  (wrong)
  ghcr.io/projectbluefin/bluefin  (correct)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update stale ublue-os org references to projectbluefin (#28)

Update OCI labels and admin recipe that still pointed to the old
upstream ublue-os/bluefin repository:

- io.artifacthub.package.readme-url: ublue-os → projectbluefin
- org.opencontainers.image.source: ublue-os → projectbluefin
- retag-nvidia-on-ghcr recipe: copies from/to projectbluefin GHCR
  instead of ublue-os

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update CONTRIBUTING.md for main-branch workflow (#29)

Replace all references to 'testing' branch with 'main' to reflect
the projectbluefin/bluefin repo structure where PRs target main.

Also update the promotion section to document the weekly automated
promotion via weekly-testing-promotion.yml instead of the old
pull-bot model.

Stream reference table updated: latest builds from 'latest' branch,
testing stream builds from 'main' branch.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update offline docs PDF URL to projectbluefin/documentation (#30)

Update the bundled Bluefin documentation URL from the old
ublue-os/bluefin-docs repo (now redirects) to the canonical
projectbluefin/documentation location.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update LTS variant link to projectbluefin/bluefin-lts (#31)

The LTS variant has moved to the projectbluefin GitHub org.
Update the Copilot instructions to reference the correct location.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update README badges and links to projectbluefin org (#33)

- OpenSSF Scorecard badge: ublue-os → projectbluefin
- GitHub Actions CI badges: ublue-os → projectbluefin
- User count badge link target: ublue-os → projectbluefin
- DeepWiki link: ublue-os/bluefin-docs → projectbluefin/bluefin
- Remove stale Codacy badge (not configured for projectbluefin)

Star history, LFX, and ossinsight charts retained as-is
(historical data from the original ublue-os/bluefin repo).

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update ublue-os org references in changelogs.py to projectbluefin (#32)

Update the changelog generation script to reference the correct org:
- REGISTRY: ghcr.io/ublue-os → ghcr.io/projectbluefin
- Commit URL: github.com/ublue-os/bluefin → github.com/projectbluefin/bluefin
- bootc switch commands: ghcr.io/ublue-os → ghcr.io/projectbluefin

The image-info.json path (/usr/share/ublue-os/...) is a filesystem
standard and intentionally kept as ublue-os.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: correct stale refs in github config files (#34)

- ISSUE_TEMPLATE/config.yml: CONTRIBUTING.md URL pointed to blob/testing, now blob/main
- copilot-setup-steps.yml: paths filter referenced non-existent workflows/ path, now correct

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update testsuite pin to include boot.1.1 ostree fix (#35)

The pinned commit (12bd892e) predates the canonical boot.N symlink fix
(7bcdf965) needed for Fedora 44 bootc images. The ostree-system-generator
only accepts /ostree/boot.[01]/... paths; bootc 1.1.x installs deployments
under boot.1.1 (versioned), causing the generator to fail → dbus-broker
cascade failure → SSH never comes up.

Updated to 97be5c76 (latest main) which includes all fixes.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update testsuite pin to include summary error_message fix (#36)

Pins to e4dd0345 which fixes AttributeError when behave emits
error_message as a list (multi-line step errors).

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to 6721f614 (GNOME 50 smoke fixes) (#40)

Pin projectbluefin/testsuite to 6721f614cf98bc3949578c51cb9a08a2d6e3a8b9
which includes PR #138 + PR #139 — comprehensive GNOME 50 smoke fixes:
- conditional open() for Quick Settings / Date Menu panels
- qecore key mapping patch (leftctrl/leftalt/leftshift evdev names)
- multi-method app launch (gtk-launch / gio launch .desktop)
- Ptyxis window title 'Terminal' accepted (GNOME 50 renamed it)
- nautilus --quit after Alt+F4 to close background daemon
- Notification banner JS for GNOME 50 _bannerBin API; 10s timeout
- Extensions app with GTK_A11Y=atk-bridge for AT-SPI registration
- About page falls back to all-roles scan for system info text
- DND gsettings fallback when Shell toggle is absent
- bootloader-update.service in IGNORED_FAILED_UNITS_IN_VM
- Wi-Fi scenario skip when no wireless interface present

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: bump testsuite pin to 7329430 (GNOME 50 round-3 smoke fixes) (#43)

Picks up PR #141 from projectbluefin/testsuite:
- nautilus AT-SPI alias (GNOME 50 name change fix)
- Shell.Eval force-close for daemon apps (Ptyxis, Files, Settings)
- notification banner explicit dismiss fallback
- GNOME Extensions AT-SPI soft-pass for headless GNOME 50
- ujust --list tolerates just version parse errors


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to b542be5 (round-4 GNOME 50 fixes) (#45)

Updates testsuite SHA from 7329430 to b542be5:
- Sidebar navigation roles: list item → button (GNOME 50 Nautilus)
- New custom step for breadcrumb location checks
- Extensions: multi-pattern pgrep fallback
- Notification banner: demote to warning in headless GNOME 50 QEMU

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to 051e8cc (round-5 GNOME 50 fixes) (#46)

Updates testsuite SHA from b542be5 to 051e8cc:
- Downloads sidebar: revert to list item role (GNOME 50 still list item)
- Extensions: remove pgrep fallback, AT-SPI app presence is enough
- New folder / search bar: soft warnings in headless GNOME 50 QEMU

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(deps): update quay.io/fedora-ostree-desktops/silverblue:43 docker digest to c9d2f9f

---------

Co-authored-by: Jorge O. Castro <jorge.castro@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>
castrojo added a commit that referenced this pull request May 31, 2026
…ons/custom-command-list@storageb.github.com digest to 20a5f24 (#53)

* fix: ship rechunker-group-fix service for legacy-rechunk→chunkah migration (#18)

When users bootc switch from ghcr.io/ublue-os/bluefin (legacy-rechunk)
to ghcr.io/projectbluefin/bluefin (chunkah/rpm-ostree build-chunked-oci),
the first boot fails with a black screen. Root cause: legacy-rechunk's
1_prune.sh moves /etc/group entries into /usr/lib/group for nss-altfiles,
but chunkah images don't use nss-altfiles. This desyncs /etc/gshadow
from /etc/group, causing systemd-sysusers to fail on first boot:
  systemd-sysusers[1022]: /etc/gshadow: Group "plocate" already exists.

The fix (from ublue-os/aurora, Dec 2025): a oneshot systemd service that
rebuilds /etc/gshadow from /etc/group on every boot. The service is
idempotent and harmless once gshadow is clean.

Files added (verbatim from Aurora):
- system_files/shared/usr/bin/rechunker-group-fix
- system_files/shared/usr/lib/systemd/system/rechunker-group-fix.service

Service enabled in build_files/base/17-cleanup.sh.

Without this fix, the first boot into projectbluefin/bluefin after
switching from ublue-os/bluefin WILL produce a black screen. Second
boot of the same image succeeds, but users will think the image is broken.

Fixes: ublue-os/bluefin#3852
See also:
- ublue-os/bluefin-lts#918 (renner0e test report)
- bootc-dev/bootc#1179
- ublue-os/aurora#1468
- https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e/1_prune.sh#L41-L47


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(deps): update projectbluefin/testsuite digest to 12bd892 (#15)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* chore(deps): update system_files/shared/usr/share/gnome-shell/extensions/blur-my-shell@aunetx digest to fcd5d02 (#16)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* fix(ci): add packages:write to e2e reusable workflow callers

The e2e.yml reusable workflow in projectbluefin/testsuite requires
packages:write permission to push screenshots to GHCR. Without it,
jobs fail with startup_failure before any steps run.


Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: ship rechunker-group-fix service for legacy-rechunk→chunkah migration

When users bootc switch from ghcr.io/ublue-os/bluefin (legacy-rechunk)
to ghcr.io/projectbluefin/bluefin (chunkah/rpm-ostree build-chunked-oci),
the first boot fails with a black screen. Root cause: legacy-rechunk's
1_prune.sh moves /etc/group entries into /usr/lib/group for nss-altfiles,
but chunkah images don't use nss-altfiles. This desyncs /etc/gshadow
from /etc/group, causing systemd-sysusers to fail on first boot:
  systemd-sysusers[1022]: /etc/gshadow: Group "plocate" already exists.

The fix (from ublue-os/aurora, Dec 2025): a oneshot systemd service that
rebuilds /etc/gshadow from /etc/group on every boot. The service is
idempotent and harmless once gshadow is clean.

Files added (verbatim from Aurora):
- system_files/shared/usr/bin/rechunker-group-fix
- system_files/shared/usr/lib/systemd/system/rechunker-group-fix.service

Service enabled in build_files/base/17-cleanup.sh.

Without this fix, the first boot into projectbluefin/bluefin after
switching from ublue-os/bluefin WILL produce a black screen. Second
boot of the same image succeeds, but users will think the image is broken.

Fixes: ublue-os/bluefin#3852
See also:
- ublue-os/bluefin-lts#918 (renner0e test report)
- bootc-dev/bootc#1179
- ublue-os/aurora#1468
- https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e/1_prune.sh#L41-L47


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update hardcoded testing branch references to main

projectbluefin/bluefin uses main as default branch, not testing.
Update build trigger, post-e2e filter, and weekly promotion workflow
to reference main instead of the ublue-os/bluefin testing branch.

Assisted-by: Claude via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): add packages:write to weekly-promotion e2e job

The reusable testsuite e2e.yml requires packages:write to push
screenshots to GHCR. Without it the job fails with startup_failure.


Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(deps): pin quay.io/fedora-ostree-desktops/silverblue docker tag to d0ba53e (#22)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* chore(deps): update ghcr.io/projectbluefin/common:latest docker digest to a5e120b (#23)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* fix: resolve shellcheck warnings in rechunker-group-fix script (#25)

Rewrite the /etc/gshadow sync loop to use while-read instead of
for-in-cat (SC2013), properly quote variables (SC2086), and use
printf instead of echo with unquoted command substitution (SC2046).

Functionally identical — group names cannot contain spaces or glob
characters, but the rewrite is safer and passes shellcheck cleanly.

Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: remove stale silverblue-main entry from image-versions.yml (#26)

PR #17 moved the base image from ghcr.io/ublue-os/silverblue-main to
quay.io/fedora-ostree-desktops/silverblue. The Justfile only reads
'common' and 'brew' entries from image-versions.yml, so the
silverblue-main entry is dead config that may cause unnecessary
Renovate PRs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: correct IMAGE_VENDOR default from ublue-os to projectbluefin (#27)

The Containerfile ARG default for IMAGE_VENDOR was still set to
'ublue-os' from the upstream fork. The Justfile correctly overrides it
to 'projectbluefin' via repo_organization, but a bare build without
Just would produce images with the wrong vendor label and ostree ref:
  ghcr.io/ublue-os/bluefin  (wrong)
  ghcr.io/projectbluefin/bluefin  (correct)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update stale ublue-os org references to projectbluefin (#28)

Update OCI labels and admin recipe that still pointed to the old
upstream ublue-os/bluefin repository:

- io.artifacthub.package.readme-url: ublue-os → projectbluefin
- org.opencontainers.image.source: ublue-os → projectbluefin
- retag-nvidia-on-ghcr recipe: copies from/to projectbluefin GHCR
  instead of ublue-os

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update CONTRIBUTING.md for main-branch workflow (#29)

Replace all references to 'testing' branch with 'main' to reflect
the projectbluefin/bluefin repo structure where PRs target main.

Also update the promotion section to document the weekly automated
promotion via weekly-testing-promotion.yml instead of the old
pull-bot model.

Stream reference table updated: latest builds from 'latest' branch,
testing stream builds from 'main' branch.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update offline docs PDF URL to projectbluefin/documentation (#30)

Update the bundled Bluefin documentation URL from the old
ublue-os/bluefin-docs repo (now redirects) to the canonical
projectbluefin/documentation location.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update LTS variant link to projectbluefin/bluefin-lts (#31)

The LTS variant has moved to the projectbluefin GitHub org.
Update the Copilot instructions to reference the correct location.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update README badges and links to projectbluefin org (#33)

- OpenSSF Scorecard badge: ublue-os → projectbluefin
- GitHub Actions CI badges: ublue-os → projectbluefin
- User count badge link target: ublue-os → projectbluefin
- DeepWiki link: ublue-os/bluefin-docs → projectbluefin/bluefin
- Remove stale Codacy badge (not configured for projectbluefin)

Star history, LFX, and ossinsight charts retained as-is
(historical data from the original ublue-os/bluefin repo).

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update ublue-os org references in changelogs.py to projectbluefin (#32)

Update the changelog generation script to reference the correct org:
- REGISTRY: ghcr.io/ublue-os → ghcr.io/projectbluefin
- Commit URL: github.com/ublue-os/bluefin → github.com/projectbluefin/bluefin
- bootc switch commands: ghcr.io/ublue-os → ghcr.io/projectbluefin

The image-info.json path (/usr/share/ublue-os/...) is a filesystem
standard and intentionally kept as ublue-os.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: correct stale refs in github config files (#34)

- ISSUE_TEMPLATE/config.yml: CONTRIBUTING.md URL pointed to blob/testing, now blob/main
- copilot-setup-steps.yml: paths filter referenced non-existent workflows/ path, now correct

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update testsuite pin to include boot.1.1 ostree fix (#35)

The pinned commit (12bd892e) predates the canonical boot.N symlink fix
(7bcdf965) needed for Fedora 44 bootc images. The ostree-system-generator
only accepts /ostree/boot.[01]/... paths; bootc 1.1.x installs deployments
under boot.1.1 (versioned), causing the generator to fail → dbus-broker
cascade failure → SSH never comes up.

Updated to 97be5c76 (latest main) which includes all fixes.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update testsuite pin to include summary error_message fix (#36)

Pins to e4dd0345 which fixes AttributeError when behave emits
error_message as a list (multi-line step errors).

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to 6721f614 (GNOME 50 smoke fixes) (#40)

Pin projectbluefin/testsuite to 6721f614cf98bc3949578c51cb9a08a2d6e3a8b9
which includes PR #138 + PR #139 — comprehensive GNOME 50 smoke fixes:
- conditional open() for Quick Settings / Date Menu panels
- qecore key mapping patch (leftctrl/leftalt/leftshift evdev names)
- multi-method app launch (gtk-launch / gio launch .desktop)
- Ptyxis window title 'Terminal' accepted (GNOME 50 renamed it)
- nautilus --quit after Alt+F4 to close background daemon
- Notification banner JS for GNOME 50 _bannerBin API; 10s timeout
- Extensions app with GTK_A11Y=atk-bridge for AT-SPI registration
- About page falls back to all-roles scan for system info text
- DND gsettings fallback when Shell toggle is absent
- bootloader-update.service in IGNORED_FAILED_UNITS_IN_VM
- Wi-Fi scenario skip when no wireless interface present

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: bump testsuite pin to 7329430 (GNOME 50 round-3 smoke fixes) (#43)

Picks up PR #141 from projectbluefin/testsuite:
- nautilus AT-SPI alias (GNOME 50 name change fix)
- Shell.Eval force-close for daemon apps (Ptyxis, Files, Settings)
- notification banner explicit dismiss fallback
- GNOME Extensions AT-SPI soft-pass for headless GNOME 50
- ujust --list tolerates just version parse errors


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to b542be5 (round-4 GNOME 50 fixes) (#45)

Updates testsuite SHA from 7329430 to b542be5:
- Sidebar navigation roles: list item → button (GNOME 50 Nautilus)
- New custom step for breadcrumb location checks
- Extensions: multi-pattern pgrep fallback
- Notification banner: demote to warning in headless GNOME 50 QEMU

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to 051e8cc (round-5 GNOME 50 fixes) (#46)

Updates testsuite SHA from b542be5 to 051e8cc:
- Downloads sidebar: revert to list item role (GNOME 50 still list item)
- Extensions: remove pgrep fallback, AT-SPI app presence is enough
- New folder / search bar: soft warnings in headless GNOME 50 QEMU

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): extend automerge to cover app/mergeraptor PRs (#51)

The renovate-automerge workflow only matched author.login == "renovate[bot]"
but mergeraptor PRs use "app/mergeraptor". This meant all mergeraptor
dependency-update PRs were silently skipped even when CI passed.

Update the jq filter to accept both bot logins.


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(deps): update system_files/shared/usr/share/gnome-shell/extensions/custom-command-list@storageb.github.com digest to 20a5f24

---------

Co-authored-by: Jorge O. Castro <jorge.castro@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>
castrojo added a commit that referenced this pull request May 31, 2026
* fix: ship rechunker-group-fix service for legacy-rechunk→chunkah migration (#18)

When users bootc switch from ghcr.io/ublue-os/bluefin (legacy-rechunk)
to ghcr.io/projectbluefin/bluefin (chunkah/rpm-ostree build-chunked-oci),
the first boot fails with a black screen. Root cause: legacy-rechunk's
1_prune.sh moves /etc/group entries into /usr/lib/group for nss-altfiles,
but chunkah images don't use nss-altfiles. This desyncs /etc/gshadow
from /etc/group, causing systemd-sysusers to fail on first boot:
  systemd-sysusers[1022]: /etc/gshadow: Group "plocate" already exists.

The fix (from ublue-os/aurora, Dec 2025): a oneshot systemd service that
rebuilds /etc/gshadow from /etc/group on every boot. The service is
idempotent and harmless once gshadow is clean.

Files added (verbatim from Aurora):
- system_files/shared/usr/bin/rechunker-group-fix
- system_files/shared/usr/lib/systemd/system/rechunker-group-fix.service

Service enabled in build_files/base/17-cleanup.sh.

Without this fix, the first boot into projectbluefin/bluefin after
switching from ublue-os/bluefin WILL produce a black screen. Second
boot of the same image succeeds, but users will think the image is broken.

Fixes: ublue-os/bluefin#3852
See also:
- ublue-os/bluefin-lts#918 (renner0e test report)
- bootc-dev/bootc#1179
- ublue-os/aurora#1468
- https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e/1_prune.sh#L41-L47


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(deps): update projectbluefin/testsuite digest to 12bd892 (#15)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* chore(deps): update system_files/shared/usr/share/gnome-shell/extensions/blur-my-shell@aunetx digest to fcd5d02 (#16)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* fix(ci): add packages:write to e2e reusable workflow callers

The e2e.yml reusable workflow in projectbluefin/testsuite requires
packages:write permission to push screenshots to GHCR. Without it,
jobs fail with startup_failure before any steps run.


Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: ship rechunker-group-fix service for legacy-rechunk→chunkah migration

When users bootc switch from ghcr.io/ublue-os/bluefin (legacy-rechunk)
to ghcr.io/projectbluefin/bluefin (chunkah/rpm-ostree build-chunked-oci),
the first boot fails with a black screen. Root cause: legacy-rechunk's
1_prune.sh moves /etc/group entries into /usr/lib/group for nss-altfiles,
but chunkah images don't use nss-altfiles. This desyncs /etc/gshadow
from /etc/group, causing systemd-sysusers to fail on first boot:
  systemd-sysusers[1022]: /etc/gshadow: Group "plocate" already exists.

The fix (from ublue-os/aurora, Dec 2025): a oneshot systemd service that
rebuilds /etc/gshadow from /etc/group on every boot. The service is
idempotent and harmless once gshadow is clean.

Files added (verbatim from Aurora):
- system_files/shared/usr/bin/rechunker-group-fix
- system_files/shared/usr/lib/systemd/system/rechunker-group-fix.service

Service enabled in build_files/base/17-cleanup.sh.

Without this fix, the first boot into projectbluefin/bluefin after
switching from ublue-os/bluefin WILL produce a black screen. Second
boot of the same image succeeds, but users will think the image is broken.

Fixes: ublue-os/bluefin#3852
See also:
- ublue-os/bluefin-lts#918 (renner0e test report)
- bootc-dev/bootc#1179
- ublue-os/aurora#1468
- https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e/1_prune.sh#L41-L47


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update hardcoded testing branch references to main

projectbluefin/bluefin uses main as default branch, not testing.
Update build trigger, post-e2e filter, and weekly promotion workflow
to reference main instead of the ublue-os/bluefin testing branch.

Assisted-by: Claude via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): add packages:write to weekly-promotion e2e job

The reusable testsuite e2e.yml requires packages:write to push
screenshots to GHCR. Without it the job fails with startup_failure.


Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(deps): pin quay.io/fedora-ostree-desktops/silverblue docker tag to d0ba53e (#22)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* chore(deps): update ghcr.io/projectbluefin/common:latest docker digest to a5e120b (#23)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* fix: resolve shellcheck warnings in rechunker-group-fix script (#25)

Rewrite the /etc/gshadow sync loop to use while-read instead of
for-in-cat (SC2013), properly quote variables (SC2086), and use
printf instead of echo with unquoted command substitution (SC2046).

Functionally identical — group names cannot contain spaces or glob
characters, but the rewrite is safer and passes shellcheck cleanly.

Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: remove stale silverblue-main entry from image-versions.yml (#26)

PR #17 moved the base image from ghcr.io/ublue-os/silverblue-main to
quay.io/fedora-ostree-desktops/silverblue. The Justfile only reads
'common' and 'brew' entries from image-versions.yml, so the
silverblue-main entry is dead config that may cause unnecessary
Renovate PRs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: correct IMAGE_VENDOR default from ublue-os to projectbluefin (#27)

The Containerfile ARG default for IMAGE_VENDOR was still set to
'ublue-os' from the upstream fork. The Justfile correctly overrides it
to 'projectbluefin' via repo_organization, but a bare build without
Just would produce images with the wrong vendor label and ostree ref:
  ghcr.io/ublue-os/bluefin  (wrong)
  ghcr.io/projectbluefin/bluefin  (correct)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update stale ublue-os org references to projectbluefin (#28)

Update OCI labels and admin recipe that still pointed to the old
upstream ublue-os/bluefin repository:

- io.artifacthub.package.readme-url: ublue-os → projectbluefin
- org.opencontainers.image.source: ublue-os → projectbluefin
- retag-nvidia-on-ghcr recipe: copies from/to projectbluefin GHCR
  instead of ublue-os

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update CONTRIBUTING.md for main-branch workflow (#29)

Replace all references to 'testing' branch with 'main' to reflect
the projectbluefin/bluefin repo structure where PRs target main.

Also update the promotion section to document the weekly automated
promotion via weekly-testing-promotion.yml instead of the old
pull-bot model.

Stream reference table updated: latest builds from 'latest' branch,
testing stream builds from 'main' branch.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update offline docs PDF URL to projectbluefin/documentation (#30)

Update the bundled Bluefin documentation URL from the old
ublue-os/bluefin-docs repo (now redirects) to the canonical
projectbluefin/documentation location.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update LTS variant link to projectbluefin/bluefin-lts (#31)

The LTS variant has moved to the projectbluefin GitHub org.
Update the Copilot instructions to reference the correct location.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update README badges and links to projectbluefin org (#33)

- OpenSSF Scorecard badge: ublue-os → projectbluefin
- GitHub Actions CI badges: ublue-os → projectbluefin
- User count badge link target: ublue-os → projectbluefin
- DeepWiki link: ublue-os/bluefin-docs → projectbluefin/bluefin
- Remove stale Codacy badge (not configured for projectbluefin)

Star history, LFX, and ossinsight charts retained as-is
(historical data from the original ublue-os/bluefin repo).

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update ublue-os org references in changelogs.py to projectbluefin (#32)

Update the changelog generation script to reference the correct org:
- REGISTRY: ghcr.io/ublue-os → ghcr.io/projectbluefin
- Commit URL: github.com/ublue-os/bluefin → github.com/projectbluefin/bluefin
- bootc switch commands: ghcr.io/ublue-os → ghcr.io/projectbluefin

The image-info.json path (/usr/share/ublue-os/...) is a filesystem
standard and intentionally kept as ublue-os.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: correct stale refs in github config files (#34)

- ISSUE_TEMPLATE/config.yml: CONTRIBUTING.md URL pointed to blob/testing, now blob/main
- copilot-setup-steps.yml: paths filter referenced non-existent workflows/ path, now correct

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update testsuite pin to include boot.1.1 ostree fix (#35)

The pinned commit (12bd892e) predates the canonical boot.N symlink fix
(7bcdf965) needed for Fedora 44 bootc images. The ostree-system-generator
only accepts /ostree/boot.[01]/... paths; bootc 1.1.x installs deployments
under boot.1.1 (versioned), causing the generator to fail → dbus-broker
cascade failure → SSH never comes up.

Updated to 97be5c76 (latest main) which includes all fixes.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update testsuite pin to include summary error_message fix (#36)

Pins to e4dd0345 which fixes AttributeError when behave emits
error_message as a list (multi-line step errors).

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to 6721f614 (GNOME 50 smoke fixes) (#40)

Pin projectbluefin/testsuite to 6721f614cf98bc3949578c51cb9a08a2d6e3a8b9
which includes PR #138 + PR #139 — comprehensive GNOME 50 smoke fixes:
- conditional open() for Quick Settings / Date Menu panels
- qecore key mapping patch (leftctrl/leftalt/leftshift evdev names)
- multi-method app launch (gtk-launch / gio launch .desktop)
- Ptyxis window title 'Terminal' accepted (GNOME 50 renamed it)
- nautilus --quit after Alt+F4 to close background daemon
- Notification banner JS for GNOME 50 _bannerBin API; 10s timeout
- Extensions app with GTK_A11Y=atk-bridge for AT-SPI registration
- About page falls back to all-roles scan for system info text
- DND gsettings fallback when Shell toggle is absent
- bootloader-update.service in IGNORED_FAILED_UNITS_IN_VM
- Wi-Fi scenario skip when no wireless interface present

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: bump testsuite pin to 7329430 (GNOME 50 round-3 smoke fixes) (#43)

Picks up PR #141 from projectbluefin/testsuite:
- nautilus AT-SPI alias (GNOME 50 name change fix)
- Shell.Eval force-close for daemon apps (Ptyxis, Files, Settings)
- notification banner explicit dismiss fallback
- GNOME Extensions AT-SPI soft-pass for headless GNOME 50
- ujust --list tolerates just version parse errors


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to b542be5 (round-4 GNOME 50 fixes) (#45)

Updates testsuite SHA from 7329430 to b542be5:
- Sidebar navigation roles: list item → button (GNOME 50 Nautilus)
- New custom step for breadcrumb location checks
- Extensions: multi-pattern pgrep fallback
- Notification banner: demote to warning in headless GNOME 50 QEMU

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to 051e8cc (round-5 GNOME 50 fixes) (#46)

Updates testsuite SHA from b542be5 to 051e8cc:
- Downloads sidebar: revert to list item role (GNOME 50 still list item)
- Extensions: remove pgrep fallback, AT-SPI app presence is enough
- New folder / search bar: soft warnings in headless GNOME 50 QEMU

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): extend automerge to cover app/mergeraptor PRs (#51)

The renovate-automerge workflow only matched author.login == "renovate[bot]"
but mergeraptor PRs use "app/mergeraptor". This meant all mergeraptor
dependency-update PRs were silently skipped even when CI passed.

Update the jq filter to accept both bot logins.


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(deps): update taiki-e/install-action digest to 35e522e

---------

Co-authored-by: Jorge O. Castro <jorge.castro@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>
castrojo added a commit that referenced this pull request May 31, 2026
…d storage (#56)

* fix: ship rechunker-group-fix service for legacy-rechunk→chunkah migration (#18)

When users bootc switch from ghcr.io/ublue-os/bluefin (legacy-rechunk)
to ghcr.io/projectbluefin/bluefin (chunkah/rpm-ostree build-chunked-oci),
the first boot fails with a black screen. Root cause: legacy-rechunk's
1_prune.sh moves /etc/group entries into /usr/lib/group for nss-altfiles,
but chunkah images don't use nss-altfiles. This desyncs /etc/gshadow
from /etc/group, causing systemd-sysusers to fail on first boot:
  systemd-sysusers[1022]: /etc/gshadow: Group "plocate" already exists.

The fix (from ublue-os/aurora, Dec 2025): a oneshot systemd service that
rebuilds /etc/gshadow from /etc/group on every boot. The service is
idempotent and harmless once gshadow is clean.

Files added (verbatim from Aurora):
- system_files/shared/usr/bin/rechunker-group-fix
- system_files/shared/usr/lib/systemd/system/rechunker-group-fix.service

Service enabled in build_files/base/17-cleanup.sh.

Without this fix, the first boot into projectbluefin/bluefin after
switching from ublue-os/bluefin WILL produce a black screen. Second
boot of the same image succeeds, but users will think the image is broken.

Fixes: ublue-os/bluefin#3852
See also:
- ublue-os/bluefin-lts#918 (renner0e test report)
- bootc-dev/bootc#1179
- ublue-os/aurora#1468
- https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e/1_prune.sh#L41-L47


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(deps): update projectbluefin/testsuite digest to 12bd892 (#15)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* chore(deps): update system_files/shared/usr/share/gnome-shell/extensions/blur-my-shell@aunetx digest to fcd5d02 (#16)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* fix(ci): add packages:write to e2e reusable workflow callers

The e2e.yml reusable workflow in projectbluefin/testsuite requires
packages:write permission to push screenshots to GHCR. Without it,
jobs fail with startup_failure before any steps run.


Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: ship rechunker-group-fix service for legacy-rechunk→chunkah migration

When users bootc switch from ghcr.io/ublue-os/bluefin (legacy-rechunk)
to ghcr.io/projectbluefin/bluefin (chunkah/rpm-ostree build-chunked-oci),
the first boot fails with a black screen. Root cause: legacy-rechunk's
1_prune.sh moves /etc/group entries into /usr/lib/group for nss-altfiles,
but chunkah images don't use nss-altfiles. This desyncs /etc/gshadow
from /etc/group, causing systemd-sysusers to fail on first boot:
  systemd-sysusers[1022]: /etc/gshadow: Group "plocate" already exists.

The fix (from ublue-os/aurora, Dec 2025): a oneshot systemd service that
rebuilds /etc/gshadow from /etc/group on every boot. The service is
idempotent and harmless once gshadow is clean.

Files added (verbatim from Aurora):
- system_files/shared/usr/bin/rechunker-group-fix
- system_files/shared/usr/lib/systemd/system/rechunker-group-fix.service

Service enabled in build_files/base/17-cleanup.sh.

Without this fix, the first boot into projectbluefin/bluefin after
switching from ublue-os/bluefin WILL produce a black screen. Second
boot of the same image succeeds, but users will think the image is broken.

Fixes: ublue-os/bluefin#3852
See also:
- ublue-os/bluefin-lts#918 (renner0e test report)
- bootc-dev/bootc#1179
- ublue-os/aurora#1468
- https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e/1_prune.sh#L41-L47


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update hardcoded testing branch references to main

projectbluefin/bluefin uses main as default branch, not testing.
Update build trigger, post-e2e filter, and weekly promotion workflow
to reference main instead of the ublue-os/bluefin testing branch.

Assisted-by: Claude via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): add packages:write to weekly-promotion e2e job

The reusable testsuite e2e.yml requires packages:write to push
screenshots to GHCR. Without it the job fails with startup_failure.


Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(deps): pin quay.io/fedora-ostree-desktops/silverblue docker tag to d0ba53e (#22)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* chore(deps): update ghcr.io/projectbluefin/common:latest docker digest to a5e120b (#23)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* fix: resolve shellcheck warnings in rechunker-group-fix script (#25)

Rewrite the /etc/gshadow sync loop to use while-read instead of
for-in-cat (SC2013), properly quote variables (SC2086), and use
printf instead of echo with unquoted command substitution (SC2046).

Functionally identical — group names cannot contain spaces or glob
characters, but the rewrite is safer and passes shellcheck cleanly.

Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: remove stale silverblue-main entry from image-versions.yml (#26)

PR #17 moved the base image from ghcr.io/ublue-os/silverblue-main to
quay.io/fedora-ostree-desktops/silverblue. The Justfile only reads
'common' and 'brew' entries from image-versions.yml, so the
silverblue-main entry is dead config that may cause unnecessary
Renovate PRs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: correct IMAGE_VENDOR default from ublue-os to projectbluefin (#27)

The Containerfile ARG default for IMAGE_VENDOR was still set to
'ublue-os' from the upstream fork. The Justfile correctly overrides it
to 'projectbluefin' via repo_organization, but a bare build without
Just would produce images with the wrong vendor label and ostree ref:
  ghcr.io/ublue-os/bluefin  (wrong)
  ghcr.io/projectbluefin/bluefin  (correct)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update stale ublue-os org references to projectbluefin (#28)

Update OCI labels and admin recipe that still pointed to the old
upstream ublue-os/bluefin repository:

- io.artifacthub.package.readme-url: ublue-os → projectbluefin
- org.opencontainers.image.source: ublue-os → projectbluefin
- retag-nvidia-on-ghcr recipe: copies from/to projectbluefin GHCR
  instead of ublue-os

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update CONTRIBUTING.md for main-branch workflow (#29)

Replace all references to 'testing' branch with 'main' to reflect
the projectbluefin/bluefin repo structure where PRs target main.

Also update the promotion section to document the weekly automated
promotion via weekly-testing-promotion.yml instead of the old
pull-bot model.

Stream reference table updated: latest builds from 'latest' branch,
testing stream builds from 'main' branch.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update offline docs PDF URL to projectbluefin/documentation (#30)

Update the bundled Bluefin documentation URL from the old
ublue-os/bluefin-docs repo (now redirects) to the canonical
projectbluefin/documentation location.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update LTS variant link to projectbluefin/bluefin-lts (#31)

The LTS variant has moved to the projectbluefin GitHub org.
Update the Copilot instructions to reference the correct location.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update README badges and links to projectbluefin org (#33)

- OpenSSF Scorecard badge: ublue-os → projectbluefin
- GitHub Actions CI badges: ublue-os → projectbluefin
- User count badge link target: ublue-os → projectbluefin
- DeepWiki link: ublue-os/bluefin-docs → projectbluefin/bluefin
- Remove stale Codacy badge (not configured for projectbluefin)

Star history, LFX, and ossinsight charts retained as-is
(historical data from the original ublue-os/bluefin repo).

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update ublue-os org references in changelogs.py to projectbluefin (#32)

Update the changelog generation script to reference the correct org:
- REGISTRY: ghcr.io/ublue-os → ghcr.io/projectbluefin
- Commit URL: github.com/ublue-os/bluefin → github.com/projectbluefin/bluefin
- bootc switch commands: ghcr.io/ublue-os → ghcr.io/projectbluefin

The image-info.json path (/usr/share/ublue-os/...) is a filesystem
standard and intentionally kept as ublue-os.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: correct stale refs in github config files (#34)

- ISSUE_TEMPLATE/config.yml: CONTRIBUTING.md URL pointed to blob/testing, now blob/main
- copilot-setup-steps.yml: paths filter referenced non-existent workflows/ path, now correct

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update testsuite pin to include boot.1.1 ostree fix (#35)

The pinned commit (12bd892e) predates the canonical boot.N symlink fix
(7bcdf965) needed for Fedora 44 bootc images. The ostree-system-generator
only accepts /ostree/boot.[01]/... paths; bootc 1.1.x installs deployments
under boot.1.1 (versioned), causing the generator to fail → dbus-broker
cascade failure → SSH never comes up.

Updated to 97be5c76 (latest main) which includes all fixes.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update testsuite pin to include summary error_message fix (#36)

Pins to e4dd0345 which fixes AttributeError when behave emits
error_message as a list (multi-line step errors).

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to 6721f614 (GNOME 50 smoke fixes) (#40)

Pin projectbluefin/testsuite to 6721f614cf98bc3949578c51cb9a08a2d6e3a8b9
which includes PR #138 + PR #139 — comprehensive GNOME 50 smoke fixes:
- conditional open() for Quick Settings / Date Menu panels
- qecore key mapping patch (leftctrl/leftalt/leftshift evdev names)
- multi-method app launch (gtk-launch / gio launch .desktop)
- Ptyxis window title 'Terminal' accepted (GNOME 50 renamed it)
- nautilus --quit after Alt+F4 to close background daemon
- Notification banner JS for GNOME 50 _bannerBin API; 10s timeout
- Extensions app with GTK_A11Y=atk-bridge for AT-SPI registration
- About page falls back to all-roles scan for system info text
- DND gsettings fallback when Shell toggle is absent
- bootloader-update.service in IGNORED_FAILED_UNITS_IN_VM
- Wi-Fi scenario skip when no wireless interface present

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: bump testsuite pin to 7329430 (GNOME 50 round-3 smoke fixes) (#43)

Picks up PR #141 from projectbluefin/testsuite:
- nautilus AT-SPI alias (GNOME 50 name change fix)
- Shell.Eval force-close for daemon apps (Ptyxis, Files, Settings)
- notification banner explicit dismiss fallback
- GNOME Extensions AT-SPI soft-pass for headless GNOME 50
- ujust --list tolerates just version parse errors


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to b542be5 (round-4 GNOME 50 fixes) (#45)

Updates testsuite SHA from 7329430 to b542be5:
- Sidebar navigation roles: list item → button (GNOME 50 Nautilus)
- New custom step for breadcrumb location checks
- Extensions: multi-pattern pgrep fallback
- Notification banner: demote to warning in headless GNOME 50 QEMU

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to 051e8cc (round-5 GNOME 50 fixes) (#46)

Updates testsuite SHA from b542be5 to 051e8cc:
- Downloads sidebar: revert to list item role (GNOME 50 still list item)
- Extensions: remove pgrep fallback, AT-SPI app presence is enough
- New folder / search bar: soft warnings in headless GNOME 50 QEMU

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): extend automerge to cover app/mergeraptor PRs (#51)

The renovate-automerge workflow only matched author.login == "renovate[bot]"
but mergeraptor PRs use "app/mergeraptor". This meant all mergeraptor
dependency-update PRs were silently skipped even when CI passed.

Update the jq filter to accept both bot logins.


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat(ci): push images with zstd:chunked compression

Switch podman push from default gzip to zstd:chunked compression format.
This enables seekable/chunked pulls where clients only download the file
content that actually changed between updates.

Changes:
- Add 'Update Podman' step: upgrades podman/buildah/crun/skopeo from
  Ubuntu resolute (25.04) repo because old Ubuntu 24.04 podman does not
  correctly push ostree.components layer annotations required by the
  rpm-ostree rechunker
- Add --compression-format zstd:chunked --compression-level 3 to all
  podman push commands
- Push each tag twice to ensure stable manifest digest and annotations
  (workaround for podman-container-tools/podman#27796)
- Add --retry 5 --retry-delay 30s for per-layer network resilience

Mirrored from Aurora's approach in ublue-os/aurora reusable-build.yml.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat(ci): add --force-compression and bootc unified storage

- Add --force-compression to all zstd:chunked push calls so that unchanged
  layers are re-compressed from gzip to zstd:chunked (without this flag
  podman reuses existing gzip blobs, breaking partial pull annotations)
- Add bootc-unified-storage.service: runs once on first boot to migrate
  the system to bootc-owned containers-storage via `bootc image set-unified`
  enabling zstd:chunked partial chunk pulls on future upgrades
- Enable the service in build_files/base/17-cleanup.sh

The service uses ConditionPathExists=!/var/lib/.bootc-unified-storage as a
one-shot sentinel and Restart=on-failure to retry if bootc isn't ready yet.
Feature is experimental in bootc upstream (tracking issue #20).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

* ci: trigger PR validation

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>
castrojo added a commit that referenced this pull request May 31, 2026
…52)

* fix: ship rechunker-group-fix service for legacy-rechunk→chunkah migration (#18)

When users bootc switch from ghcr.io/ublue-os/bluefin (legacy-rechunk)
to ghcr.io/projectbluefin/bluefin (chunkah/rpm-ostree build-chunked-oci),
the first boot fails with a black screen. Root cause: legacy-rechunk's
1_prune.sh moves /etc/group entries into /usr/lib/group for nss-altfiles,
but chunkah images don't use nss-altfiles. This desyncs /etc/gshadow
from /etc/group, causing systemd-sysusers to fail on first boot:
  systemd-sysusers[1022]: /etc/gshadow: Group "plocate" already exists.

The fix (from ublue-os/aurora, Dec 2025): a oneshot systemd service that
rebuilds /etc/gshadow from /etc/group on every boot. The service is
idempotent and harmless once gshadow is clean.

Files added (verbatim from Aurora):
- system_files/shared/usr/bin/rechunker-group-fix
- system_files/shared/usr/lib/systemd/system/rechunker-group-fix.service

Service enabled in build_files/base/17-cleanup.sh.

Without this fix, the first boot into projectbluefin/bluefin after
switching from ublue-os/bluefin WILL produce a black screen. Second
boot of the same image succeeds, but users will think the image is broken.

Fixes: ublue-os/bluefin#3852
See also:
- ublue-os/bluefin-lts#918 (renner0e test report)
- bootc-dev/bootc#1179
- ublue-os/aurora#1468
- https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e/1_prune.sh#L41-L47


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(deps): update projectbluefin/testsuite digest to 12bd892 (#15)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* chore(deps): update system_files/shared/usr/share/gnome-shell/extensions/blur-my-shell@aunetx digest to fcd5d02 (#16)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* fix(ci): add packages:write to e2e reusable workflow callers

The e2e.yml reusable workflow in projectbluefin/testsuite requires
packages:write permission to push screenshots to GHCR. Without it,
jobs fail with startup_failure before any steps run.


Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: ship rechunker-group-fix service for legacy-rechunk→chunkah migration

When users bootc switch from ghcr.io/ublue-os/bluefin (legacy-rechunk)
to ghcr.io/projectbluefin/bluefin (chunkah/rpm-ostree build-chunked-oci),
the first boot fails with a black screen. Root cause: legacy-rechunk's
1_prune.sh moves /etc/group entries into /usr/lib/group for nss-altfiles,
but chunkah images don't use nss-altfiles. This desyncs /etc/gshadow
from /etc/group, causing systemd-sysusers to fail on first boot:
  systemd-sysusers[1022]: /etc/gshadow: Group "plocate" already exists.

The fix (from ublue-os/aurora, Dec 2025): a oneshot systemd service that
rebuilds /etc/gshadow from /etc/group on every boot. The service is
idempotent and harmless once gshadow is clean.

Files added (verbatim from Aurora):
- system_files/shared/usr/bin/rechunker-group-fix
- system_files/shared/usr/lib/systemd/system/rechunker-group-fix.service

Service enabled in build_files/base/17-cleanup.sh.

Without this fix, the first boot into projectbluefin/bluefin after
switching from ublue-os/bluefin WILL produce a black screen. Second
boot of the same image succeeds, but users will think the image is broken.

Fixes: ublue-os/bluefin#3852
See also:
- ublue-os/bluefin-lts#918 (renner0e test report)
- bootc-dev/bootc#1179
- ublue-os/aurora#1468
- https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e/1_prune.sh#L41-L47


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update hardcoded testing branch references to main

projectbluefin/bluefin uses main as default branch, not testing.
Update build trigger, post-e2e filter, and weekly promotion workflow
to reference main instead of the ublue-os/bluefin testing branch.

Assisted-by: Claude via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): add packages:write to weekly-promotion e2e job

The reusable testsuite e2e.yml requires packages:write to push
screenshots to GHCR. Without it the job fails with startup_failure.


Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(deps): pin quay.io/fedora-ostree-desktops/silverblue docker tag to d0ba53e (#22)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* chore(deps): update ghcr.io/projectbluefin/common:latest docker digest to a5e120b (#23)

Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>

* fix: resolve shellcheck warnings in rechunker-group-fix script (#25)

Rewrite the /etc/gshadow sync loop to use while-read instead of
for-in-cat (SC2013), properly quote variables (SC2086), and use
printf instead of echo with unquoted command substitution (SC2046).

Functionally identical — group names cannot contain spaces or glob
characters, but the rewrite is safer and passes shellcheck cleanly.

Assisted-by: Claude Sonnet 4.5 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: remove stale silverblue-main entry from image-versions.yml (#26)

PR #17 moved the base image from ghcr.io/ublue-os/silverblue-main to
quay.io/fedora-ostree-desktops/silverblue. The Justfile only reads
'common' and 'brew' entries from image-versions.yml, so the
silverblue-main entry is dead config that may cause unnecessary
Renovate PRs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: correct IMAGE_VENDOR default from ublue-os to projectbluefin (#27)

The Containerfile ARG default for IMAGE_VENDOR was still set to
'ublue-os' from the upstream fork. The Justfile correctly overrides it
to 'projectbluefin' via repo_organization, but a bare build without
Just would produce images with the wrong vendor label and ostree ref:
  ghcr.io/ublue-os/bluefin  (wrong)
  ghcr.io/projectbluefin/bluefin  (correct)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update stale ublue-os org references to projectbluefin (#28)

Update OCI labels and admin recipe that still pointed to the old
upstream ublue-os/bluefin repository:

- io.artifacthub.package.readme-url: ublue-os → projectbluefin
- org.opencontainers.image.source: ublue-os → projectbluefin
- retag-nvidia-on-ghcr recipe: copies from/to projectbluefin GHCR
  instead of ublue-os

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update CONTRIBUTING.md for main-branch workflow (#29)

Replace all references to 'testing' branch with 'main' to reflect
the projectbluefin/bluefin repo structure where PRs target main.

Also update the promotion section to document the weekly automated
promotion via weekly-testing-promotion.yml instead of the old
pull-bot model.

Stream reference table updated: latest builds from 'latest' branch,
testing stream builds from 'main' branch.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update offline docs PDF URL to projectbluefin/documentation (#30)

Update the bundled Bluefin documentation URL from the old
ublue-os/bluefin-docs repo (now redirects) to the canonical
projectbluefin/documentation location.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update LTS variant link to projectbluefin/bluefin-lts (#31)

The LTS variant has moved to the projectbluefin GitHub org.
Update the Copilot instructions to reference the correct location.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update README badges and links to projectbluefin org (#33)

- OpenSSF Scorecard badge: ublue-os → projectbluefin
- GitHub Actions CI badges: ublue-os → projectbluefin
- User count badge link target: ublue-os → projectbluefin
- DeepWiki link: ublue-os/bluefin-docs → projectbluefin/bluefin
- Remove stale Codacy badge (not configured for projectbluefin)

Star history, LFX, and ossinsight charts retained as-is
(historical data from the original ublue-os/bluefin repo).

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: update ublue-os org references in changelogs.py to projectbluefin (#32)

Update the changelog generation script to reference the correct org:
- REGISTRY: ghcr.io/ublue-os → ghcr.io/projectbluefin
- Commit URL: github.com/ublue-os/bluefin → github.com/projectbluefin/bluefin
- bootc switch commands: ghcr.io/ublue-os → ghcr.io/projectbluefin

The image-info.json path (/usr/share/ublue-os/...) is a filesystem
standard and intentionally kept as ublue-os.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: correct stale refs in github config files (#34)

- ISSUE_TEMPLATE/config.yml: CONTRIBUTING.md URL pointed to blob/testing, now blob/main
- copilot-setup-steps.yml: paths filter referenced non-existent workflows/ path, now correct

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update testsuite pin to include boot.1.1 ostree fix (#35)

The pinned commit (12bd892e) predates the canonical boot.N symlink fix
(7bcdf965) needed for Fedora 44 bootc images. The ostree-system-generator
only accepts /ostree/boot.[01]/... paths; bootc 1.1.x installs deployments
under boot.1.1 (versioned), causing the generator to fail → dbus-broker
cascade failure → SSH never comes up.

Updated to 97be5c76 (latest main) which includes all fixes.

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): update testsuite pin to include summary error_message fix (#36)

Pins to e4dd0345 which fixes AttributeError when behave emits
error_message as a list (multi-line step errors).

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to 6721f614 (GNOME 50 smoke fixes) (#40)

Pin projectbluefin/testsuite to 6721f614cf98bc3949578c51cb9a08a2d6e3a8b9
which includes PR #138 + PR #139 — comprehensive GNOME 50 smoke fixes:
- conditional open() for Quick Settings / Date Menu panels
- qecore key mapping patch (leftctrl/leftalt/leftshift evdev names)
- multi-method app launch (gtk-launch / gio launch .desktop)
- Ptyxis window title 'Terminal' accepted (GNOME 50 renamed it)
- nautilus --quit after Alt+F4 to close background daemon
- Notification banner JS for GNOME 50 _bannerBin API; 10s timeout
- Extensions app with GTK_A11Y=atk-bridge for AT-SPI registration
- About page falls back to all-roles scan for system info text
- DND gsettings fallback when Shell toggle is absent
- bootloader-update.service in IGNORED_FAILED_UNITS_IN_VM
- Wi-Fi scenario skip when no wireless interface present

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: bump testsuite pin to 7329430 (GNOME 50 round-3 smoke fixes) (#43)

Picks up PR #141 from projectbluefin/testsuite:
- nautilus AT-SPI alias (GNOME 50 name change fix)
- Shell.Eval force-close for daemon apps (Ptyxis, Files, Settings)
- notification banner explicit dismiss fallback
- GNOME Extensions AT-SPI soft-pass for headless GNOME 50
- ujust --list tolerates just version parse errors


Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to b542be5 (round-4 GNOME 50 fixes) (#45)

Updates testsuite SHA from 7329430 to b542be5:
- Sidebar navigation roles: list item → button (GNOME 50 Nautilus)
- New custom step for breadcrumb location checks
- Extensions: multi-pattern pgrep fallback
- Notification banner: demote to warning in headless GNOME 50 QEMU

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(ci): update testsuite pin to 051e8cc (round-5 GNOME 50 fixes) (#46)

Updates testsuite SHA from b542be5 to 051e8cc:
- Downloads sidebar: revert to list item role (GNOME 50 still list item)
- Extensions: remove pgrep fallback, AT-SPI app presence is enough
- New folder / search bar: soft warnings in headless GNOME 50 QEMU

Assisted-by: Claude Sonnet 4.6 via GitHub Copilot CLI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(ci): extend automerge to cover app/mergeraptor PRs

The renovate-automerge workflow only matched author.login == "renovate[bot]"
but mergeraptor PRs use "app/mergeraptor". This meant all mergeraptor
dependency-update PRs were silently skipped even when CI passed.

Update the jq filter to accept both bot logins.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

* feat(ci): add self-hosted Renovate workflow with workflow_dispatch

Adds renovate.yml with:
- workflow_dispatch for manual runs (with optional dry-run flag)
- schedule every 6 hours
- concurrency group to prevent parallel runs

Also adds e2e smoke gate to pr-validation.yml so automerge only
triggers after tests pass, not just lint.

Requires RENOVATE_TOKEN secret (GitHub PAT with repo scope).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Assisted-by: Claude Sonnet 4.6 via GitHub Copilot

* revert: remove renovate.yml (handled by projectbluefin/renovate-config)

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: mergeraptor[bot] <267480593+mergeraptor[bot]@users.noreply.github.com>
@cgwalters

Copy link
Copy Markdown

This also got fixed in bootc-dev/bootc#2207 - I think the two services won't conflict, but we probably do need to proactively ensure ordering.

One thing is that the bootc one is careful to lock the files, but this doesn't seem to.

# This got created on Tue, 16 Dec 2025 00:44:58 -0300
[Unit]
Description=Fix groups for Legacy rechunker
ConditionPathExists=/run/ostree-booted

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it'd be cleaner to do ConditionPathExists=/usr/lib/passwd

Type=oneshot
ExecStart=bash -c 'touch /etc/gshadow && chmod 600 /etc/gshadow'
ExecStart=bash -c 'rm /etc/gshadow'
ExecStart=systemd-sysusers

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, running sysusers twice seems suboptimal

Wants=local-fs.target
After=local-fs.target
Before=systemd-user-sessions.service
# Before=systemd-sysusers.service

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See below

[Service]
Type=oneshot
ExecStart=bash -c 'touch /etc/gshadow && chmod 600 /etc/gshadow'
ExecStart=bash -c 'rm /etc/gshadow'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well...that's a heavy hammer. In the version added to bootc we're careful to only remove shadow entries for users/groups that are orphaned.

(I think users are relevant in this problem domain too, not just groups right?)

Now in practice...it is probably exceedingly unlikely that anyone has a group with a password locally - it's really legacy cruft, the use cases for it are better handled via e.g. ACLs or other tools.

@castrojo

castrojo commented Jun 7, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the review colin, we'll put a stripped down compatible one in the common repo and all the images will pick it up. It'll be a bit until we recommend more people to rebase to these so waiting for the next bootc release is easy!

@hecknt

hecknt commented Jun 7, 2026

Copy link
Copy Markdown

Just chipping in briefly for a moment here, I'd like to give some context to the creation of this rechunker-group-fix script. @tulilirockz created the initial prototype "rechunker-group-fix" script, and I wrote the final version that you merged with this PR.

I would like to see at least a mention of both of our github names as credit, as I did a lot of testing to make this script work without breaking any systems. A comment within the script/systemd service would be nice, or you could take Aurora's approach and put our names in a blog.

from the bottom of https://docs.getaurora.dev/blog/aurora44-beta/:
image

@castrojo castrojo added the 4-review A pull request is awaiting review. label Jul 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

4-review A pull request is awaiting review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants