Skip to content

iso/calamares: run grub-install + update-grub after bootloader, and fix eggs' own boot-fix from silently going stale - #26

Closed
cyryllo wants to merge 300 commits into
MTSistemi:mainfrom
cyryllo:fix/calamares-grub-boot-reconfigure
Closed

iso/calamares: run grub-install + update-grub after bootloader, and fix eggs' own boot-fix from silently going stale#26
cyryllo wants to merge 300 commits into
MTSistemi:mainfrom
cyryllo:fix/calamares-grub-boot-reconfigure

Conversation

@cyryllo

@cyryllo cyryllo commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

What's broken

The iso/ live-build Calamares sequence stops at bootloader:

- grubcfg
- bootloader
- shellprocess@post-install   # snapper only
- umount

Nothing re-runs grub-install/update-grub afterwards, and nothing repairs
the kernel files unpackfs writes. Two already-diagnosed bugs follow directly
from that gap:

The fix for both already exists in this repo as
scripts/fix-eggs-calamares-boot.py and system/usr/local/bin/skillfish-fix-boot-extents
— but:

  1. That fix only patches the eggs/penguins-eggs build pipeline (templates
    under /etc/penguins-eggs.d/distros/*/calamares/modules and the live
    /etc/calamares/modules on the build machine). It never touches
    iso/config/includes.chroot/etc/calamares/..., so an ISO built the
    documented way (docs/BUILD.md, iso/build.sh, plain live-build) ships
    with neither fix.
  2. skillfish-fix-boot-extents lives under system/, which iso/ does not
    sync from — it was never actually shipped in a live-build ISO.
  3. fix-eggs-calamares-boot.py itself isn't invoked by anything — not
    scripts/build-iso.sh, not CI. It has to be remembered and run by hand
    before every eggs produce, and a penguins-eggs package upgrade can
    silently overwrite the very templates it patches (as already happened once
    to customize-partitions.js/show.qml, per the comments in that file).

What this PR does

  • Add iso/config/includes.chroot/etc/calamares/modules/shellprocess@boot_reconfigure.conf:
    after bootloader, run skillfish-fix-boot-extents, then grub-install
    twice (normal NVRAM entry + --removable), then update-grub. Content
    mirrors the already-verified RECONF_BODY in fix-eggs-calamares-boot.py.
  • Ship skillfish-fix-boot-extents under iso/config/includes.chroot/usr/local/bin/
    (copied from system/, 755) so it actually exists on a live-build install.
  • Wire shellprocess@boot_reconfigure into settings.conf's exec sequence,
    right after bootloader and before umount.
  • scripts/build-iso.sh: run fix-eggs-calamares-boot.py before every
    eggs produce and abort the build if its own verify() fails, instead
    of relying on someone remembering to run it by hand. This closes gap deps(website): bump astro from 5.18.2 to 6.4.4 in /website in the astro group across 1 directory #3
    above for the eggs pipeline without touching the pipeline's logic itself.

How I tested this

I have not built or booted an ISO from iso/ with this change — no BC-250
hardware or VM available in this environment. What I did verify:

  • bash -n scripts/build-iso.sh — syntax OK.
  • The new shellprocess@boot_reconfigure.conf content is byte-for-byte the
    same script body already exercised and confirmed working in a VM per the
    comments in scripts/fix-eggs-calamares-boot.py ("verificato in VM il
    10/08/2026") — I only relocated it to the module Calamares actually loads
    for the iso/ pipeline, plus adjusted the sequence/settings wiring.
  • skillfish-fix-boot-extents is copied unmodified from system/.

This needs a real install test before merging — both an ext4 install and
a btrfs install, checking that the system boots both from the NVRAM entry and
from the removable EFI fallback path. I'm not in a position to do that BC-250
hardware test myself; flagging it explicitly rather than claiming it's
verified.

Fixes #12, Fixes #20 (pending the hardware test above).

MTSistemi and others added 30 commits June 5, 2026 02:32
Azahar mandala icon (azahar + org.azahar_emu.Azahar). DuckStation/PCSX2 EmuDeck
launchers were using Icon=steamdeck-gaming-return; repointed to the brass
duckstation/pcsx2 theme icons.
website/: new Astro SSG site replacing the single-file landing.
- Bilingual IT/EN with SSG i18n (IT at /, EN at /en/).
- Pages: Home, Download, Gallery, Hardware, and a full Documentation
  section (13 pages IT + 13 EN) with sidebar, in-page TOC and prev/next.
- Steampunk design ported from the legacy landing.
- Build output/cache redirected to %TEMP% + build.ps1 wrapper to work
  around Dropbox file-locking on Windows (EBUSY on .astro cleanup).

repo-server/: artifacts for the self-hosted update server (LXC 192.168.5.22)
- Portainer + Watchtower bootstrap compose, nginx repo stack, nginx.conf,
  reprepro distributions config, publish.sh, public archive keyring, README.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Download page: active button to a masked URL (/dl/skillfishos-preview.iso),
  worded as a fully-functional preview; add a "report bugs on GitHub" section
  (email to follow). IT + EN.
- public/.htaccess: 302 redirect /dl/skillfishos-preview.iso -> Dropbox (dl=1),
  so the public-facing download URL stays on skillfishos.com.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- New bilingual /contact page with a styled form (name, email, request type,
  message). Linked from nav and footer.
- public/contact.php: server-side handler, recipient (info@skillfishos.com)
  lives only here — never in the public HTML/JS. Header-injection hardening,
  Reply-To set to sender, honeypot + server-side math captcha validation.
- public/captcha.php: session-based math challenge (answer kept server-side).
- Anti-spam: honeypot field + session captcha; no third-party service/keys.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Drop the ES-DE Neo Geo gallery card and its image, and reword the remaining
ES-DE card generically. Avoids showing copyrighted game content.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Hardware page: new "Measured performance" section with a native CSS bar chart
  of vkpeak FP32-scalar (GFLOPS) before/after SkillFishOs (baseline 6141 →
  tkg+governor 6868 → 40 CU 11329, 1.84x), stat cards (FP16/int8 peaks) and a
  methodology note citing vkpeak + links to the GPU/kernel docs. IT + EN.
- build.ps1: build from a copy OUTSIDE Dropbox (robocopy + node_modules
  junction). Astro stages in <root>/.astro which Dropbox locks, corrupting the
  dist (HTML-only, no CSS/img). Building outside Dropbox fixes it; the wrapper
  now also fails if assets are missing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Aggregated from ~4 min of in-game telemetry (1080p): GPU 2000 MHz / edge ~78°C,
~130 W (peak 182), CPU 3.7 GHz, VRAM 4.4 GB, fan ~2700 RPM — all within the
85°C cap. Honest framing: telemetry (stability under load), not FPS, since
Wukong is CPU/draw-call bound. IT + EN.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Inline L(it, en) i18n helper, language picked from LC_ALL > LC_MESSAGES >
  LANG with correct locale precedence (default EN, IT on it_* locales).
- Tuner: all UI, HELP tooltips, toasts, dialogs and preset names/descs.
- AI Panel: full UI, status lines, buttons, warnings.
- tuner-presets.json now carries name_it/name_en + desc_it/desc_en.

Verified on the BC-250: EN renders correctly for both apps.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Measured on the reference BC-250 via SMU VID readout + native stress, with a
safety margin below each crash wall:
- Performance: CPU 3700 @ scale -16 (~1106 mV), GPU 2000
- Turbo:       CPU 3900 @ scale -24 (~1199 mV), GPU 2230, fan 75%
- Crazy:       CPU 4.0 GHz @ scale -36 (~1224 mV), GPU 2230, fan 100% (120s validated, ~83C)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gpu_busy_percent is non-functional on gfx1013, so a lightweight systemd
service samples radeontop (GRBM) into /run/skillfish-gpu-util at ~1 Hz and the
conky HUD reads that cache instantly (no per-refresh radeontop spawn).
Added a GPU usage percentage on the GPU line plus a usage bar matching the
CPU bars.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The SMU max_temperature caps both CPU and GPU; set it to 85C on all presets so
the APU die never exceeds 85C (verified under FurMark: GPU holds 85C, modulating
~2000-2230 MHz). thermal_guard aligned to 85C too.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The 85C SMU cap already guarantees thermal safety by modulating clocks, so the
fan stays on its automatic curve in every preset (quieter). Descriptions updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…outh -> desktop)

New BootIntro.astro plays a faux boot sequence using the real OS theme assets
(GRUB skillfish background, Plymouth skillfish-brass splash) and the real snapper
snapshot list, then reveals the site. Skippable, plays once per session, honours
prefers-reduced-motion, and ?boot force-replays it. Added to the IT/EN home.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Corrected 144 SkillFishOs -> SkillFishOS (text + logo spans), IT/EN.
- Hardware page: new game-benchmark cards (Wukong 112 FPS, Heaven 2865,
  Superposition 12938/5513) and two comparison charts:
  - same hardware +34% vs Bazzite (Superposition Extreme)
  - head-to-head vs Radeon RX 6600/6600 XT and RX 6700/6750 XT (High)
- Refreshed Wukong telemetry chips to the 2230/3900 run.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…urce

- Reworded the GPU note to a console-class semi-custom RDNA 2 die (Oberon)
  instead of naming any console brand, for legal safety.
- Download and home CTA now state this release targets the AMD BC-250, with a
  generic x86-64 PC version to follow, and that the project is open-source.
- Footer now says Open-source.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Hardware page now showcases the hand-characterized tuning with real data:
4.0 GHz all-core CPU (~1206 mV, 120s-validated), -194 mV undervolt at 3.7 GHz,
2230 MHz GPU on 40 CU, and the 85 C thermal cap. Specs updated 3.7 -> 4.0 GHz.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- skillfish-hud-val: locale detection (LC_ALL/LC_MESSAGES/LANG/LANGUAGE),
  new lbl_use (uso/use) and lbl_disk (DISCO/DISK) labels
- skillfish-hud-bt: bilingual device categories (Tastiera->Keyboard,
  Telefono->Phone, Altro->Other) and (nessuno collegato)/(none connected)
- conky skillfish.conf: uso x2 and DISCO now via locale-aware execi labels
- verified on BC-250: IT shows uso/DISCO, EN shows use/DISK; baked in /etc/skel

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- gpu-overclock: rewrite with measured numbers (Stock/Performance/Turbo
  presets 3500-3900 CPU / 1500-2230 GPU), CPU undervolt floors (3700@1.23V,
  3900 scale-24, 4.0GHz@1206mV/83C), 1.325V Vid cap, CPU<->GPU thermal
  coupling, 85C cap (SMU + thermal-guard), silicon-lottery -> ISO ships Stock
- hardware-bc250: add Cooling/3D-case/fans section with verified STL links
  (Arthrimus, onemorecap, ViRazY, ZMASLO, CatSiewDai, marccyberwiz VRAM kit)
  + cooling guides; CPU spec 3.7->3.9 GHz Turbo
- fonti: add cooling & 3D-case sources section

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- download: show '26.06 Aetherium' version, BC-250 release, EN-default/
  language-at-install note (dl.ver)
- gallery: add 2 Unigine leaderboard comparison cards (vs Bazzite same-hardware
  +34%, vs Radeon RX 6600 match) — cropped clean, usernames blurred
- i18n: gal.b1/b2 strings (IT/EN)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
skillfish-tuner-helper + thermal-guard now reference /opt/bc250_smu_oc,
/opt/bc250_memcfg, /opt/bench (relocated out of /root, which eggs excludes
from the ISO). Tuner OC/mem/vkpeak now work on installed systems.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- apt/: reprepro conf (suite aetherium), build-repo.sh (keygen/add/kernel/export),
  user install docs, .gitignore (never commit private key / pool blobs)
- sourceforge/: project metadata, ISO upload checklist (5.6 GB, sha256), release notes
- distrowatch/: new-distribution submission draft
- README: order of operations + release facts (single source of truth)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- gpu-overclock (IT/EN): 4-preset table from tuner-presets.json
  (Stock/Performance/Turbo/Crazy) with real per-preset voltages
  (1106/1199/1224 mV); 'three'->'four presets'
- i18n: s5.d lists all four presets; isoSizeGb 5.78 -> 5.6
- README: release 26.06 Aetherium banner; CPU 3.7->4.0 GHz; Tuner PyQt6 +
  4 presets + bilingual; ISO section (eggs/Calamares, boots EN); add
  distribution/ to layout; fix bc250-docs link
- release notes: mention Performance/Turbo/Crazy

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…shot

- i18n: hero badge -> 'Release 26.06 Aetherium'; CTA -> 'Download SkillFishOS';
  remove '(username oscurato)/(username blurred)' from gallery captions
- about.jpg (README + gallery): new 'About this System' shot showing the correct
  'SkillFishOS 26.06 Aetherium' branding (was old 'SkillFishOs' casing, no version)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- APT repo published to gh-pages branch -> https://mtsistemi.github.io/SkillFishOS/
  (suite aetherium, GPG-signed, verified end-to-end: apt update OK, no GPG errors)
- kernel delivered via tiny 'skillfishos-kernel' wrapper (postinst pulls the
  152MB image from the GitHub Release -> sidesteps the 100MB/file limit)
- docs/aggiornamenti (IT/EN): real repo URL + apt setup commands
- distribution/apt + README: document GitHub Pages hosting + wrapper approach
- site SITE.repoUrl -> the github.io repo

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…view' framing

- .htaccess: masked direct download skillfishos.com/dl/SkillFishOS-26.06-Aetherium-
  BC250-amd64.iso -> Dropbox (dl=1) + stable /dl/skillfishos-latest.iso alias
- i18n: SITE.isoUrl -> the Aetherium ISO; download badge/button/notice now say
  'release' not 'preview'
- re-applies the apt-repo doc wiring (i18n/aggiornamenti) lost to a Dropbox
  sync conflict during the previous commit

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… for DistroWatch

- Discussions enabled (community forum infra DistroWatch expects)
- DistroWatch draft: forum=Discussions, ISO URL=SourceForge direct-download
- SourceForge UPLOAD.md: step-by-step (create project -> upload -> default download
  -> the rule-compliant URL to hand DistroWatch)
MTSistemi and others added 18 commits August 11, 2026 10:29
STAVO MODIFICANDO GLI SCRIPT VECCHI. apps/build-debs.sh e apps/build-new-apps.sh
prendono i file dal disco della board; quello VERO e' scripts/build-debs-ci.sh,
lo lancia la CI di GitHub e prende i file dal REPO. Tutte le aggiunte di oggi
erano finite nel posto sbagliato. Spostate:
  skillfish-tuner     + skillfish-hud
  skillfish-hub       + le icone in hicolor
  skillfish-theme     + la variante steampunk dell'icona (sta nel tema, cosi'
                        due pacchetti non scrivono nella stessa cartella)
  skillfish-base      + skillfish-info, il suo .desktop e l'autostart del HUD
  skillfish-emulators nuovo, con i due script e le due voci di menu

TRE FILE NON APPARTENEVANO A NESSUN PACCHETTO: skillfish-info, il suo .desktop e
l'autostart del HUD. Arrivavano solo a chi installava dalla ISO, e un apt
upgrade non li avrebbe mai aggiornati.

skillfish-info.desktop era pure INVALIDO: desktop-file-validate lo rifiutava
perche' "%s" nel campo Exec e' un codice di sostituzione riservato (validi solo
%f %F %u %U %i %c %k) e il "$" andava raddoppiato. Stesso errore del HUD:
quoting di shell dentro un .desktop. Il comando sta ora in
/usr/local/bin/skillfish-info, con la frase "premi Invio" nelle quattro lingue
invece che via gettext, di cui non abbiamo cataloghi.

scripts/verifica-pre-iso.sh: 40 controlli sugli artefatti VERI — app che
compilano e sono tradotte, .desktop validi con base in inglese, icone caricate
con il tema ATTIVO, HUD, barra, emulatori, contenuto dei .deb, versione,
presentazione di Calamares. Ha trovato subito tre cose che sarebbero finite
nella ISO: tre .desktop ancora in italiano sulla board (corretti nel repo e mai
copiati, come era successo a tuner-presets.json), skillfish-info invalido, e il
branding di Calamares che NON e' skillfishos ma eggs — la presentazione
multilingua era gia' al posto giusto, ero io a guardare nella cartella
sbagliata.

Aggiunte 7 guardie sul contenuto dei .deb. Una di queste ha trovato un difetto
del mio script di sincronizzazione: confrontavo i file per DIMENSIONE, e
"applications:org.kde.discover.desktop" e "applications:os.skillfish.hub.desktop"
sono lunghi esattamente uguali. Il file della barra risultava gia' aggiornato e
non veniva mai copiato: senza quella guardia, la ISO sarebbe uscita con Discover
nella barra.

Dieci pacchetti costruiti, tutte le verifiche superate.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…pacchetto

SDDM diceva "Accedi" a un polacco e a un ucraino. E' la primissima cosa che si
vede del sistema, e parlava la lingua sbagliata a chiunque non fosse italiano.
Tradotte le due scritte visibili con lo stesso meccanismo gia' in opera nella
presentazione di Calamares — si legge Qt.locale(), che nel greeter viene dal
locale di sistema — invece di introdurre lupdate/lrelease per due stringhe.

Aggiunti anche i suggerimenti ai due pulsanti in basso, che sono solo simboli
(⏻ e ⟳): senza etichetta non si capisce quale spegne e quale riavvia, e qui un
clic sbagliato spegne la macchina.

IL TEMA SDDM NON APPARTENEVA A NESSUN PACCHETTO: viveva solo nel filesystem
della ISO, quindi questa correzione non avrebbe mai raggiunto via apt chi ha
gia' installato. Ora lo spedisce skillfish-theme. E' lo stesso buco gia' trovato
oggi per skillfish-info e per l'autostart del HUD.

Diacritici polacchi rimessi nei preset del Tuner: "Wydajnosc" non esiste, si
scrive "Wydajnosc" con la n accentata; cosi' "Zloty srodek" -> "Zloty srodek",
"podkrecenie" -> "podkrecenie" (con le lettere giuste nel file). Sostituite
stringhe intere e non applicata una regola automatica, perche' "Wydajny",
"Fabryczny", "Turbo" e "Szalony" sono gia' corretti: non tutte le parole
polacche hanno diacritici, e un controllo ingenuo li segnalava come errori.

VERIFICATO col greeter VERO di SDDM (sddm-greeter-qt6 --test-mode) sul tema
vero, iniettando la diagnostica in una copia:
  en -> Log in | Password | Shut down | Restart
  it -> Accedi | Password | Spegni | Riavvia
  pl -> Zaloguj sie | Haslo | Wylacz | Uruchom ponownie
  uk -> Uvijty | Parol | Vymknuty | Perezavantazhyty   (in cirillico nel file)
  de -> ricade sull'INGLESE, non sull'italiano
(qui senza diacritici perche' il messaggio di commit resta ASCII; nei file ci
sono quelli giusti, e la guardia sul .deb lo verifica.)

Aggiunte 3 guardie: il testo del login deve passare dalla funzione di
traduzione, il tema SDDM deve essere nel .deb, i diacritici devono esserci.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…n sed

Il postinst di skillfish-base deve aggiungere ExecCondition=skillfish-is-bc250
ai servizi specifici della scheda, perche' su un PC normale ripartono ogni 5
secondi all'infinito. Non lo faceva:

  sed: -e expression MTSistemi#1, char 65: unterminated `s' command

La sostituzione conteneva un ritorno a capo VERO dentro le virgolette singole.
sed vuole \n, e davanti a un a capo nudo considera il comando incompleto: non
inseriva niente e proseguiva senza fallire, perche' la riga finisce con "|| true".
L'errore si vedeva solo scorrendo l'output di dpkg, dove passa inosservato.

E' esattamente il guasto che quel codice doveva impedire, rimasto scoperto
chissa' da quanto.

Verificato dopo l'installazione: tutti e sette i servizi (governor, core-unlock,
cu, gpu-freq, gpu-util, thermal-guard, dp-hotswap) hanno ora la guardia, con
ExecCondition prima di ExecStart, e systemd-analyze verify non trova errori.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Il postinst di skillfish-theme faceva:

  gtk-update-icon-cache -f "/usr/share/icons/$t" || rm -f ".../icon-theme.cache"

Intenzione: costruisci la cache, e se non ci riesci togli quella vecchia. Ma il
comando RIESCE, e la cache che produce Qt non la sa usare: tutti i lanciatori
della barra diventano fogli bianchi. E successo davvero sulla scheda l 11/08 e
sarebbe ricapitato su OGNI macchina a ogni aggiornamento del pacchetto — una
ISO nuova con le icone rotte al primo apt upgrade.

Ora il postinst la TOGLIE e basta: senza cache Qt legge direttamente le cartelle
del tema, che funziona sempre. La cache di hicolor invece va aggiornata, e la fa
gia ctrl().

Trovato da scripts/verifica-pre-iso.sh, che ha bloccato la generazione delle ISO
prima che il difetto ci finisse dentro. Ora 40 controlli su 40.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Erano gli unici due pacchetti fermi a 26.06 mentre tutto il resto era a 26.08.13.
Il motivo: skillfish-iso-mount stava solo nel vecchio apps/build-debs.sh, che
prende i file dal disco della scheda; skillfish-menu non stava in NESSUNO
script — esisteva come .deb costruito a mano chissa' quando. Fuori dalla catena
automatica una correzione non sarebbe mai arrivata a nessuno.

Aggiunti a scripts/build-debs-ci.sh, che prende tutto dal repo. I file c'erano
gia' sotto system/ ed erano identici a quelli installati, quindi il pacchetto
non cambia contenuto: cambia che ora ha una provenienza.

skillfish-menu definisce la categoria "SkillFishOS" nel menu delle applicazioni.
La sua descrizione era solo in italiano e inglese, come tutto il resto prima di
oggi: aggiunte pl e uk. Il Name resta uguale ovunque, e' il nome del prodotto.

La guardia che ho scritto per verificarlo era sbagliata: cercava "Comment[pl]"
con grep, dove [pl] e' una classe di caratteri e vale "una p oppure una l" —
non poteva combaciare mai, e infatti dava FAIL su un file corretto. Ora cerca il
testo polacco vero, che verifica anche di piu'.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…gine

Installazione in polacco: interfaccia in polacco, diapositive in ITALIANO.

install_slideshow() copiava la presentazione multilingua solo in
/etc/calamares/branding/*/show.qml. Quella e' la cartella GENERATA: eggs la
riscrive da capo a ogni `produce` prendendo il file dai propri addon, in
/usr/lib/penguins-eggs/addons/*/theme/calamares/branding/show.qml. Nella ISO
finiva quindi la sua versione italiana da 4127 byte al posto della nostra da
9617.

Il commento nel codice diceva "va copiato DOPO che eggs ha generato il branding,
perche' quella cartella la rigenera lui": giusta la diagnosi, sbagliata la
conclusione. Se la rigenera lui, va cambiato quello DA CUI la rigenera.

Ora si scrive in entrambi i posti, e se non trova nessun addon lo dice invece di
proseguire in silenzio.

IL CONTROLLO CHE MANCAVA. Verificavo la show.qml sulla board, non dentro
l'immagine: il difetto e' passato attraverso 40 controlli pre-ISO e 17 controlli
sul contenuto perche' nessuno guardava quel file nel squashfs. Aggiunto a
scripts/ispeziona-iso.sh, che ora e' nel repo invece che nella cartella
temporanea: apre la ISO, legge quale branding usa da settings.conf e verifica
che la presentazione sia multilingua nelle quattro lingue.

Le due ISO 26.06.4 vanno rifatte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
skillfish-iso-mount e skillfish-menu erano fermi a 26.06 mentre tutti gli altri
erano a 26.08.13. Me ne sono accorto guardando l elenco a occhio, che non e un
modo di lavorare: ora lo script confronta ogni versione con quella piu diffusa
nell immagine e segnala chi non combacia.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Mattia: "l'installazione dal nostro hub non va". Riprodotto il comando esatto:

  flatpak install -y --noninteractive flathub org.vinegarhq.Sober
  error: Remote 'flathub' found in multiple installations,
         unable to proceed in non-interactive mode

flathub e' configurato SIA a sistema SIA per utente (6 app nell'uno, 9
nell'altro). Senza --system ne' --user flatpak non sa quale scegliere, e
--noninteractive gli vieta di chiederlo. Nessuna installazione dall'Hub poteva
riuscire. L'errore non aiuta: parla di "installations" intendendo gli ambiti di
flatpak, non i programmi installati.

Lo stesso difetto colpiva anche remote-info, quindi la scheda dell'app restava
senza l'elenco dei permessi:
  error: No remote chosen to resolve 'flathub' which exists in multiple installations

CORREZIONE
- install: --system, con pkexec come gia' si fa per apt e snap. E' un centro
  software di macchina, non del singolo utente: l'app la vedono tutti.
- remove: si rileva PRIMA dove l'app e' installata davvero. Sulla scheda ci sono
  9 flatpak installati per utente (li ha messi EmuDeck): disinstallarli con
  --system fallirebbe dicendo che non sono installati, il che per chi guarda e'
  semplicemente falso. Per l'ambito utente non si chiede nemmeno la password,
  che non serve.
- remote-info: --system.

Provato davvero sulla scheda: installazione, lettura dei permessi, rilevamento
dell'ambito (riconosce Sober e Calculator come --system e RetroArch come --user)
e disinstallazione, tutti con uscita 0.

Sober org.vinegarhq.Sober 1.7.1 reinstallato a sistema, voce di menu presente.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Mattia: "gli aggiornamenti che pubblichiamo hanno le release note e i changelog?"
No. I nostri .deb non avevano nemmeno la cartella /usr/share/doc/<pkg>/.

Per la Debian Policy changelog.Debian.gz e copyright sono OBBLIGATORI. Senza,
chi installa non ha modo di sapere cosa e' cambiato ne' con quale licenza sta
usando il software: su un sistema che si scarica da mezzo mondo e' una mancanza
seria, non un dettaglio.

Il changelog NON e' un testo di comodo: si genera dai commit git che toccano i
file di QUEL pacchetto. Ogni put/opt/putdir annota la sorgente in .sources, e
docs() ci fa sopra un git log. Se un pacchetto non e' cambiato, la sua voce lo
dice invece di inventare una riga. Il copyright dichiara GPL-3+ e rimanda a
/usr/share/common-licenses/GPL-3 come vuole la policy.

skillfish-dashboard scrive il proprio control a mano invece di usare ctrl(), ed
era l'unico rimasto senza: docs() ora si chiama esplicitamente anche li'.

.sources sta nella radice del pacchetto e finirebbe dentro il .deb come file
spurio: viene tolto prima della costruzione, e una guardia lo verifica.

LA GUARDIA STESSA ERA SBAGLIATA, e vale la pena scriverlo: usava
`dpkg-deb -c | grep -q`, dove grep esce al primo riscontro, chiude la pipe e
dpkg-deb muore di SIGPIPE. Con pipefail attivo il risultato era un FAIL su
skillfish-theme, che i file ce li aveva eccome (839 file, il piu' grosso).
Ora l'elenco si scrive su file prima di cercarci dentro.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Guardava in /tmp/debs/out e /tmp/newdebs/out, cartelle dei VECCHI script di
build. Dopo un riavvio /tmp e' vuoto: il ciclo non trovava nessun file, saltava
tutto e il riepilogo diceva comunque "nessun errore". Undici controlli spariti
in silenzio, e me ne sono accorto solo perche' il totale era sceso da 40 a 29.

E' la stessa forma di guasto che inseguo da stamattina: un controllo verde che
non controlla niente. Ora le cartelle si cercano in ordine, e se non c'e'
NESSUN pacchetto quello E' un errore, non un motivo per tacere.

Aggiunti tre controlli che prima mancavano, tutti su cose rotte davvero oggi:
- i diacritici polacchi nei preset del Tuner
- l'ambito --system nelle installazioni flatpak dell'Hub (senza, nessuna
  installazione funzionava)
- changelog e copyright in ogni pacchetto

E gli elenchi si scrivono su file prima di cercarci dentro: `dpkg-deb -c | grep -q`
fa chiudere la pipe a grep al primo riscontro e dpkg-deb muore di SIGPIPE, che
con pipefail diventa un falso negativo.

Sezione 7: da 0 controlli a 18.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Mattia: "la parte web del remote manager non e' in polacco". Vero, e non era
l'unico problema: avevo controllato le sei app native e chiamato "tutte le app"
quello che era solo una parte.

Tre difetti diversi, non uno:

1. il dizionario STR aveva solo it/en — 109 voci
2. QUATTORDICI ternari  LANG === "it" ? "..." : "..."  fuori dal dizionario
3. TRENTOTTO stringhe in un secondo schema che la prima ricerca non vedeva:
     const it = LANG === "it";
     ... it ? "Testo" : "Text" ...

I punti 2 e 3 non sono "manca il polacco": sono testo che NON PUO' essere
tradotto. Un utente polacco vedeva l'inglese comunque, qualunque lingua avesse
scelto. E' la stessa forma del difetto delle stringhe formattate prima di L()
nelle app native, in un altro linguaggio.

Tutto spostato dentro STR: da 109 a 160 voci, tutte in quattro lingue, con i
segnaposto {x} verificati coerenti fra le lingue.

Il rilevamento della lingua riconosceva SOLO l'italiano e mandava tutti gli
altri sull'inglese: ora guarda il prefisso del browser per it/pl/uk. Il
selettore nell'interfaccia aveva due pulsanti, ora quattro.

Corretto anche un riferimento rimasto indietro: il messaggio della KV cache
parlava di "contenitore Ollama", e Ollama e' stato sostituito da Unsloth mesi
fa. Chi lo leggeva oggi non capiva di cosa si parlasse.

Verificato con node: sintassi valida, 160/160 voci in tutte e quattro le lingue,
zero stringhe rimaste fuori dal dizionario.

RESTA DA FARE: una cinquantina di stringhe CABLATE negli HTML (tuner.html ne ha
49), che non sono nemmeno it/en ma italiano fisso — le vede in italiano anche
chi usa l'inglese. E i nomi dei moduli, che arrivano dal catalogo con solo
name/name_en.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le pagine tuner.html, hub.html e aichat.html non caricano app.js: hanno script
propri e non vedevano il dizionario. Il loro testo era scritto direttamente
nell'HTML, in ITALIANO — tuner.html da solo ne aveva 49. Non era "manca il
polacco": lo vedeva in italiano anche chi usava l'inglese.

Aggiunto apps/dashboard/web/i18n.js, dizionario condiviso caricato dalle tre
pagine, con lo stesso rilevamento della lingua e la stessa chiave in
localStorage di app.js, cosi' il selettore di index.html vale ovunque. Ogni
elemento con data-i18n riceve il testo dalla lingua scelta; se una chiave manca
si ricade sull'inglese, mai sull'italiano.

REGOLA DI MATTIA, applicata: il ripiego dev'essere sempre l'inglese, per tutto.
Il testo STATICO negli HTML era italiano, quindi se il JavaScript non parte —
errore, rete lenta, browser strano — un polacco si trovava l'italiano. Ora il
testo scritto nei file e' inglese e le traduzioni ci vanno sopra. E' la stessa
regola gia' applicata ai .desktop: campo base in inglese, traduzioni accanto.
Ribaltati 51 testi, index.html compreso.

L'aggancio e' un attributo data-i18n sull'elemento che gia' c'era: nessun <span>
in piu' che potrebbe rompere CSS o selettori JavaScript.

Verificato con node sugli HTML VERI, simulando il browser: 59 voci condivise
tutte in quattro lingue, 60 agganci, nessuna chiave inesistente. Restano
scoperti solo i nomi propri (SkillFishOS Tuner/Hub/AI), che non si traducono.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Il dizionario condiviso e' un file NUOVO e non era nell'elenco del pacchetto.
Le tre pagine che non caricano app.js lo chiedono a /static/i18n.js: senza,
avrebbero preso un 404 e sarebbero rimaste senza traduzioni. Difetto silenzioso,
perche' il testo statico resta comunque leggibile — nessuno se ne accorge
guardando la pagina di sfuggita.

Tre guardie sul contenuto del .deb: i18n.js deve contenere l'ucraino, tuner.html
deve avere gli agganci data-i18n, app.js deve avere il polacco.

Regola generale: ogni file web nuovo va aggiunto al pacchetto nello stesso
momento in cui lo si crea.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Segnalato da Mattia con due screenshot affiancati: in inglese "☕ Support us"
sta su una riga, in italiano l'icona finiva sopra e "Sostienici" sotto, con la
pillola che diventava un ovale alto. Anche "GitHub ↗" perdeva la freccia su una
seconda riga.

CAUSA
.navlinks e' un flex con gap fisso a 28px. Le etichette italiane sono piu'
lunghe (Funzioni, Documentazione, Contatti): la barra non ci stava in larghezza,
gli elementi flex si comprimevano e il testo andava a capo. In inglese non si
vedeva perche' "Support us" e' piu' corto e ci stava per un soffio.

CORREZIONE
- lo spazio fra le voci si adatta: clamp(14px,1.7vw,28px) invece di 28px fissi
- nessuna voce di menu va mai a capo: white-space:nowrap
- il pulsante non si comprime mai: flex-shrink:0
Quando lo spazio manca, a stringersi sono i distanziamenti, non il testo.

Vale per tutte e quattro le lingue: il polacco ha etichette ancora piu' lunghe
dell'italiano, quindi il difetto ci sarebbe stato anche li'.

Verificato guardandolo, non leggendo il CSS: reso con Chrome sulla board a 1280
px, italiano e inglese affiancati, stessa altezza di barra. Due tentativi a
vuoto prima — da file:// il CSS non si carica (percorsi assoluti) e la prima
resa era nera per l'animazione di avvio, che si salta con
--force-prefers-reduced-motion.

Aggiunto anche a verifica-pre-iso.sh il controllo della presentazione Calamares
NELLA SORGENTE degli addon di eggs, non solo nel branding generato: e' la
sorgente che finisce nella ISO. 50 controlli su 50.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
La correzione precedente aveva spostato il problema invece di risolverlo: con
nowrap ovunque la barra non andava piu' a capo, ma il contenuto superava i
1180px di .wrap e il selettore lingua sfondava a destra. Avendo overflow:hidden,
comprimendosi non andava a capo — TAGLIAVA: la "UK" spariva a meta'. E il logo,
schiacciandosi, finiva attaccato alla prima voce ("SkillFishOSFunzioni").

- .lang e .logo non si comprimono piu' (flex-shrink:0)
- le quattro sigle sono piu' strette: padding 6px 9px, font .78rem

VERIFICATO IN TUTTE E QUATTRO LE LINGUE, ed e' servito: il caso peggiore non e'
l'italiano ma l'UCRAINO — "Можливості", "Обладнання", "Завантажити" sono le
etichette piu' lunghe di tutte. Correggendo guardando solo l'italiano, l'ucraino
sarebbe rimasto rotto senza che nessuno se ne accorgesse.

Reso con Chrome a 1280px sulle quattro home, barre affiancate: sigle tutte
visibili, pillola su una riga, logo staccato dal menu.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Mattia: "è sparito tutto". La dashboard remota mostrava solo l'intestazione,
su board e VM: corpo completamente vuoto.

Gli script che hanno spostato le stringhe nel dizionario hanno emesso
S("chiave") 52 volte. La funzione di traduzione si chiama T(). Risultato:
ReferenceError alla prima scheda disegnata, il render si ferma li', e resta solo
l'intestazione perche' quella e' HTML statico.

PERCHE' NON L'HO VISTO, che e' la parte che conta
Avevo lanciato `node --check`, letto "valido" e dichiarato il lavoro fatto.
--check verifica SOLO la sintassi: S("x") e' sintatticamente perfetto ed esplode
solo quando gira. Non ho mai aperto la pagina.

E' la stessa lezione di tutta la giornata in una forma nuova: avevo gia'
verificato l'utente sbagliato (root invece di skillfish), il tema sbagliato
(breeze invece di quello attivo), il posto sbagliato (il repository invece
dell'immagine) e adesso il LIVELLO sbagliato — la sintassi invece
dell'esecuzione.

scripts/prova-dashboard.sh: serve le pagine, le carica con Chrome e legge la
console. index.html esce con ZERO errori JavaScript. Gli errori su tuner e hub
sono "Unexpected token '<' ... is not valid JSON", cioe' le chiamate API che
senza backend ricevono la pagina 404 — non difetti del codice, e lo script lo
dice per non far scambiare gli uni per gli altri.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le note dicono anche quello che NON funziona: le diapositive di Calamares in
inglese per polacco e ucraino, l'ucraino mai rivisto da un madrelingua, il game
streaming ancora senza pannello. Una release si giudica anche da cosa ammette.

Due guardie nuove, per il difetto che ha lasciato la dashboard vuota:
- nel build, un controllo che FALLISCE se app.js contiene S(" — e' il contrario
  di tutti gli altri, che verificano la presenza di qualcosa
- nell'ispezione della ISO, la dashboard dentro l'immagine: niente S(),
  i18n.js presente, tuner.html agganciato al dizionario

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…Sistemi#12, MTSistemi#20)

The live-build (iso/) Calamares config stopped at the bootloader module, so
neither the removable EFI fallback grub.cfg stub (MTSistemi#20, hits ext4 and btrfs
alike) nor the btrfs kernel-extent corruption (MTSistemi#12) ever got fixed on an
install produced from iso/ — the fix only existed as a standalone helper
(scripts/fix-eggs-calamares-boot.py) targeting the separate eggs/penguins-eggs
build pipeline, and that script itself was never invoked by any build or CI.

- Add shellprocess@boot_reconfigure.conf: re-runs grub-install for both the
  normal NVRAM entry and --removable, then update-grub, and calls
  skillfish-fix-boot-extents first.
- Ship skillfish-fix-boot-extents in iso/config/includes.chroot (previously
  only present under system/, which iso/ does not sync from).
- Wire shellprocess@boot_reconfigure into settings.conf, right after
  bootloader.
- scripts/build-iso.sh: run fix-eggs-calamares-boot.py before every
  eggs produce and abort the build if its own verify() step fails, so the
  eggs pipeline can't silently ship the same broken GRUB config again.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
MTSistemi added a commit that referenced this pull request Aug 14, 2026
… non regge

eggs rigenera /etc/calamares dai propri modelli a ogni produce, quindi la
correzione per le issue #12 e #20 (secondo grub-install piu' update-grub dopo
il modulo bootloader, e riparazione degli extent del kernel scritto da
unpackfs) va riapplicata ogni volta. Finora andava ricordata a mano: lo script
esisteva ma non lo chiamava nessuno. Chi se lo fosse dimenticato avrebbe
pubblicato una ISO con GRUB rotto senza accorgersene, perche' il problema si
vede solo quando qualcuno prova a installarla.

Ora build-iso.sh la applica da solo prima di ogni produce e interrompe la
build se la verifica dello script fallisce, invece di proseguire e sfornare
un'immagine che non parte.

Il buco l'ha trovato Cyryl Sochacki nella PR #26. Dalla sua proposta prendo
solo questa parte: il resto aggiungeva la correzione anche sotto iso/, cioe'
alla vecchia strada live-build, che non e' piu' quella con cui rilasciamo.

Rispetto al suo codice ho cambiato una cosa: la sua riga usava
"[ $RC -ne 0 ] && { ...; exit 1; }", che sotto set -e farebbe fallire la build
proprio quando tutto va bene, perche' con RC=0 il test e' falso e l'espressione
restituisce 1. Riscritta con if/fi. Lo stile veniva da una riga gia' nostra,
quindi il difetto era in casa.

Co-authored-by: Cyryl Sochacki <cyrylsochacki@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@MTSistemi

Copy link
Copy Markdown
Owner

Thank you for this — and for being straight about what you did and did not test. That matters more than the patch itself.

What we took: the build-iso.sh part, merged in f983814.

You were right, and the gap was worse than the PR describes: scripts/build-iso.sh went straight to eggs produce and nothing invoked fix-eggs-calamares-boot.py. The fix existed as 411 lines of code that someone had to remember to run. On a one-person project that is not a process, it is a coin flip — and when it lands wrong the ISO ships with a broken GRUB and nobody finds out until a user tries to install it. Which is exactly what happened, publicly, in a review.

One change to your code. You wrote:

[ $RC -ne 0 ] && { echo "FAIL-BOOTFIX rc=$RC" > "$ST"; ...; exit 1; }

build-iso.sh currently has set -u and not set -e, so it works today. But if anyone ever adds set -e, that line aborts the build when everything is fine: with RC=0 the test is false, the AND-list returns 1, and the script dies. Rewritten as if ... fi. In fairness the style was copied from a line that was already ours, so the trap was ours to begin with.

What we left out: the iso/ parts (1–3), and why.

Releases have been built with eggs for a while now; iso/ is the older live-build path and has not been touched since 11 July. Adding the fix there would create a second copy that we never exercise and that quietly rots.

But your underlying point stands and we had missed it: the documentation still describes a pipeline we no longer release from. That is the actual bug in parts 1–3 — not the missing config, but docs/BUILD.md sending people down a road we abandoned. Fixing the docs is worth more than duplicating the patch.

Would you like to take that on? Either updating docs/BUILD.md to describe the eggs pipeline, or — if you think the live-build path should stay supported — making the case for it, in which case parts 1–3 belong in that discussion. Your call; we are happy either way.

Leaving this PR open so you can repurpose the branch if you want it. The install test you asked for (ext4 and btrfs, NVRAM entry and removable EFI fallback) we can run ourselves in a VM, as we did for 26.06.3.

Also: you are now in the README under Contributors, along with the Polish translation work. Overdue.

@MTSistemi

Copy link
Copy Markdown
Owner

Correction to my previous comment — I was imprecise about the test, and the distinction matters for how you read your own patch.

26.06.3 was already installed and booted in a VM, on btrfs, before release. That is how #12 and #20 were closed. The install landed on a btrfs root with the @ subvolume, and the snapshot tooling we built on top of it (snapper, and a rollback command that has to tell @ on a Calamares install apart from @rootfs on the board) could not have been developed on anything else. So in the published media GRUB installs correctly and btrfs boots.

I should have said that outright instead of writing that we "can" run the test. Sorry — your PR is premised on the bug still being live in the release, and it is not.

That does not reduce the value of what you found, it changes what it protects. The published ISO is fine. What was not fine is that it stayed fine by luck: the fix had to be remembered and run by hand before every eggs produce, and eggs regenerates /etc/calamares from its own templates every single time. One forgotten step and the next ISO ships broken, silently, exactly as before. Your patch closes that. It protects future builds, not the current one.

Full disclosure on the limits of what I just told you: the VM that install ran in has since been deleted, so the above is reconstructed from the work we did on it rather than something I can show you a screen of right now. We are rebuilding it — a clean install from the published ISO, one on btrfs and one on ext4, checking boot from the NVRAM entry and from the removable EFI fallback path, which is the test you asked for. I will post the result here, whichever way it goes.

@MTSistemi

Copy link
Copy Markdown
Owner

Test done, as promised. Fresh install from the published 26.06.3 ISO, UEFI, btrfs, in a clean VM. Result: both bugs are gone from the released media.

Rather than trusting the running system, I shut the VM down and read the disk from the hypervisor — for these two bugs what matters is what Calamares actually wrote.

#20 — removable EFI fallback. The ESP now contains, in the removable path:

/EFI/boot/bootx64.efi   /EFI/boot/grubx64.efi   /EFI/boot/mmx64.efi
/EFI/boot/BOOTX64.CSV   /EFI/boot/grub.cfg      <-- the file whose absence caused grub rescue>

and that grub.cfg is btrfs-aware, which is the part a careless fix gets wrong:

search.fs_uuid fea54d7d-… root hd0,gpt2
set prefix=($root)'/@/boot/grub'
configfile $prefix/grub.cfg

Note the /@/ prefix. /EFI/SkillFishOS/ has the full set too, so both the NVRAM entry and the removable path work.

#12 — btrfs. Root is btrfs with @ @home @cache @log @swap, mounted compress=zstd:1; grub.cfg regenerated (10 KB) with rootflags=subvol=@; kernel and initrd intact. The installed system boots from disk on its own — no rescue prompt. /var/lib/systemd/random-seed was rewritten after install, which only happens on a real boot.

Snapshots work too, and the log shows the fallback path we wrote doing its job:

creating snapper 'root' config + .snapshots subvolume
create-config failed, creating subvolume manually
done

with @/.snapshots, @/.snapshots/1/snapshot, @/.snapshots/2/snapshot present afterwards.

Two unrelated things your test setup surfaced, both now filed:

  • sddm-helper: pam_unix(sddm-autologin): could not identify user (from getpwnam(live)) — the installed system still looks for the live user.
  • grub-btrfsd: Error during grub menu creation (grub/ grub-btrfs error) — the snapshot boot menu is not generated by the daemon.

So: your patch protects future builds, which is exactly what it should do, and it is merged. Thanks again for pushing on this — the test only got run because you asked for it.

MTSistemi added a commit that referenced this pull request Aug 15, 2026
…ti di build

Cyryl Sochacki ha fatto notare che il codice menziona ancora Hyprland. Aveva
ragione, e il problema era piu' grosso: iso/ non "citava" Hyprland, ce l'aveva
come desktop. La lista pacchetti installava hyprland, wofi, mako e swaylock, e
i due hook impostavano SDDM sulla sessione hyprland. Di KDE non c'era niente,
mentre il sistema che pubblichiamo gira su Plasma da mesi.

- 10-desktop-hyprland.list.chroot -> 10-desktop-kde.list.chroot. I nomi non
  sono scelti a tavolino: sono i pacchetti che risultano installati
  esplicitamente sulla BC-250 di sviluppo, cioe' quelli che compongono davvero
  il sistema che diamo agli utenti.
- I due hook SDDM ora impostano plasmax11. X11 e non Wayland perche' e' quello
  che usiamo davvero sulla scheda.
- Il banner di build.sh diceva "Debian forky | Hyprland+DMS | kernel 7.0.10":
  sbagliato su tutti e tre i punti, ora dice sid, Plasma 6, 7.1.7.
- La diapositiva di Calamares annunciava Hyprland e il kernel 7.0.10.

Aggiunti i moduli Calamares della PR #26 di Cyryl (shellprocess@boot_reconfigure
piu' skillfish-fix-boot-extents, innestati nella sequenza dopo bootloader):
erano la parte che avevo lasciato fuori quando iso/ sembrava un ramo morto.
Ora che la teniamo viva, ci vanno.

Tolti 231.000 righe di artefatti di build finiti nel repository per sbaglio:
chroot.files da solo ne faceva 225.390, l'elenco di ogni file dentro il chroot
di una build di maggio. Aggiunto iso/.gitignore perche' non ci tornino.

Tolta legacy/ (gli script di installazione a Cinnamon delle origini) e i file
Docker di repo-server/, che descrivevano il repository apt di prima che si
spostasse sul container. Il README di repo-server/ ora racconta com'e' fatto
davvero oggi. Tutto resta nella storia di git.

Corretto anche un commento in skillfish-dp-hotswap.sh, che parlava di Hyprland
in un file che finisce installato sulle macchine degli utenti.

Co-authored-by: Cyryl Sochacki <cyrylsochacki@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@MTSistemi MTSistemi closed this Aug 16, 2026
MTSistemi added a commit that referenced this pull request Aug 16, 2026
eggs regenerates /etc/calamares from its own templates on every produce,
so the fix for issues #12 and #20 (a second grub-install plus update-grub
after the bootloader module, and repair of the extents of the kernel
written by unpackfs) has to be reapplied every time. Until now it had to
be remembered by hand: the script existed but nobody called it. Anyone
who forgot would have published an ISO with a broken GRUB without
noticing, because the problem only shows up when someone tries to install
it.

Now build-iso.sh applies it by itself before every produce and aborts the
build if the script's check fails, instead of carrying on and turning out
an image that does not boot.

Cyryl Sochacki found the hole in PR #26. From his proposal I take only
this part: the rest added the fix under iso/ as well, that is, to the old
live-build path, which is no longer the one we release with.

Compared to his code I changed one thing: his line used
"[ $RC -ne 0 ] && { ...; exit 1; }", which under set -e would fail the
build precisely when everything goes well, because with RC=0 the test is
false and the expression returns 1. Rewritten with if/fi. The style came
from a line that was already ours, so the defect was homegrown.

Co-authored-by: Cyryl Sochacki <cyrylsochacki@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
MTSistemi added a commit that referenced this pull request Aug 16, 2026
Cyryl Sochacki pointed out that the code still mentions Hyprland. He was
right, and the problem was bigger: iso/ did not "mention" Hyprland, it
had it as its desktop. The package list installed hyprland, wofi, mako
and swaylock, and the two hooks set SDDM to the hyprland session. There
was nothing of KDE, while the system we publish has been running on
Plasma for months.

- 10-desktop-hyprland.list.chroot -> 10-desktop-kde.list.chroot. The
  names were not chosen in the abstract: they are the packages that
  turn out to be explicitly installed on the development BC-250, that
  is, the ones that really make up the system we give to users.
- The two SDDM hooks now set plasmax11. X11 and not Wayland because that
  is what we actually use on the board.
- The build.sh banner said "Debian forky | Hyprland+DMS | kernel 7.0.10":
  wrong on all three counts, it now says sid, Plasma 6, 7.1.7.
- The Calamares slide announced Hyprland and kernel 7.0.10.

Added the Calamares modules from Cyryl's PR #26 (shellprocess@boot_reconfigure
plus skillfish-fix-boot-extents, grafted into the sequence after bootloader):
they were the part I had left out when iso/ looked like a dead branch.
Now that we keep it alive, they belong in.

Removed 231,000 lines of build artifacts that ended up in the repository
by mistake: chroot.files alone accounted for 225,390 of them, the list of
every file inside the chroot of a May build. Added iso/.gitignore so they
do not come back.

Removed legacy/ (the original Cinnamon installation scripts) and the
Docker files of repo-server/, which described the apt repository from
before it moved onto the container. The repo-server/ README now describes
how it is really built today. Everything stays in the git history.

Also fixed a comment in skillfish-dp-hotswap.sh, which talked about
Hyprland in a file that ends up installed on users' machines.

Co-authored-by: Cyryl Sochacki <cyrylsochacki@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
MTSistemi added a commit that referenced this pull request Aug 17, 2026
Nine references pointed at 26.06.3 — the header, the ISO table, the download
links. Anyone arriving from GitHub was sent to the superseded image.

The thanks section said all four bugs Bartek reported were fixed in 26.06.3.
Three were. The btrfs/GRUB install failure was not: the repair we shipped ran,
logged that it had rewritten the files and left the defect byte for byte
identical, and the real cause — rsync -aHAXS, where that S is --sparse — only
surfaced for 26.06.4. Leaving "all fixed" in the README repeats in writing the
mistake we already made to his face.

Cyryl Sochacki's entry now names him properly and includes PR #26, which said
our own boot fix had gone stale without anyone noticing. He was right, we told
him otherwise, and the pull request was then closed by a force-push of ours
rather than by a decision.

The repository map listed a legacy/ directory that no longer exists and left
out repo-server/, website/ and tests/, which do.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants