iso/calamares: run grub-install + update-grub after bootloader, and fix eggs' own boot-fix from silently going stale - #26
Conversation
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>
…ing list, 4 required fields)
… 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)
…log, forum, wiki, GitHub import)
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>
… 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>
|
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 You were right, and the gap was worse than the PR describes: One change to your code. You wrote: [ $RC -ne 0 ] && { echo "FAIL-BOOTFIX rc=$RC" > "$ST"; ...; exit 1; }
What we left out: the Releases have been built with eggs for a while now; 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 Would you like to take that on? Either updating 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. |
|
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 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 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. |
|
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: and that Note the #12 — btrfs. Root is btrfs with Snapshots work too, and the log shows the fallback path we wrote doing its job: with Two unrelated things your test setup surfaced, both now filed:
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. |
…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>
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>
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>
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.
What's broken
The
iso/live-build Calamares sequence stops atbootloader:Nothing re-runs
grub-install/update-grubafterwards, and nothing repairsthe kernel files
unpackfswrites. Two already-diagnosed bugs follow directlyfrom that gap:
exitboots normally; needs manual grub-install + update-grub) #20 (hits ext4 and btrfs alike) — withinstallEFIFallback: true,Calamares copies
shim/grubx64into the removable EFI path but not thegrub.cfgstub that belongs next to them. GRUB started from that path hasno working prefix and drops to
grub rescue>on first boot.unpackfswrites are missing theeofflag on their last extent (declared size isn't covered by the extentmap). GRUB reads the extent tree and stops there ("premature end of file");
Linux itself reads the same file fine, which is why it only shows at boot.
The fix for both already exists in this repo as
scripts/fix-eggs-calamares-boot.pyandsystem/usr/local/bin/skillfish-fix-boot-extents— but:
under
/etc/penguins-eggs.d/distros/*/calamares/modulesand the live/etc/calamares/moduleson the build machine). It never touchesiso/config/includes.chroot/etc/calamares/..., so an ISO built thedocumented way (
docs/BUILD.md,iso/build.sh, plain live-build) shipswith neither fix.
skillfish-fix-boot-extentslives undersystem/, whichiso/does notsync from — it was never actually shipped in a live-build ISO.
fix-eggs-calamares-boot.pyitself isn't invoked by anything — notscripts/build-iso.sh, not CI. It has to be remembered and run by handbefore every
eggs produce, and apenguins-eggspackage upgrade cansilently 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
iso/config/includes.chroot/etc/calamares/modules/shellprocess@boot_reconfigure.conf:after
bootloader, runskillfish-fix-boot-extents, thengrub-installtwice (normal NVRAM entry +
--removable), thenupdate-grub. Contentmirrors the already-verified
RECONF_BODYinfix-eggs-calamares-boot.py.skillfish-fix-boot-extentsunderiso/config/includes.chroot/usr/local/bin/(copied from
system/,755) so it actually exists on a live-build install.shellprocess@boot_reconfigureintosettings.conf'sexecsequence,right after
bootloaderand beforeumount.scripts/build-iso.sh: runfix-eggs-calamares-boot.pybefore everyeggs produceand abort the build if its ownverify()fails, insteadof 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-250hardware or VM available in this environment. What I did verify:
bash -n scripts/build-iso.sh— syntax OK.shellprocess@boot_reconfigure.confcontent is byte-for-byte thesame script body already exercised and confirmed working in a VM per the
comments in
scripts/fix-eggs-calamares-boot.py("verificato in VM il10/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-extentsis copied unmodified fromsystem/.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).