feat: QEMU headless boot test in CI, updated skills + references
CI now runs a headless QEMU boot test after the smoke test: - Boots ISO with -nographic, captures serial output - Watches for "Press Enter to start installation" (pass) - Detects kernel panic or initramfs shell (fail) - 120 second timeout, runs as continue-on-error Also: updated iso-debug reference with embedded vs appended EFI findings from real hardware testing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
107
.claude/skills/design-pixel-retro/SKILL.md
Normal file
107
.claude/skills/design-pixel-retro/SKILL.md
Normal file
@@ -0,0 +1,107 @@
|
||||
---
|
||||
name: design-pixel-retro
|
||||
description: >
|
||||
Pixel Art Retro design system — ChonkyPixels font, neon glow CTAs, pixel
|
||||
dot animations, and dark foundation theme. Use when building retro/pixel art
|
||||
UIs, foundation sites, when user says "pixel art", "retro design", "8-bit
|
||||
aesthetic", "neon glow buttons", "pixel font", or "retro foundation style".
|
||||
metadata:
|
||||
author: dorian
|
||||
version: 1.0.0
|
||||
category: design-system
|
||||
tags: [pixel-art, retro, 8-bit, neon, dark-theme, foundation]
|
||||
---
|
||||
|
||||
# Pixel Art Retro Design System
|
||||
|
||||
Extracted from Archipelago Foundation. Pixel-perfect aesthetics with modern
|
||||
web technology, neon glow accents, and playful retro energy.
|
||||
|
||||
## Design Identity
|
||||
|
||||
**Name:** Pixel Art Retro
|
||||
**Mood:** Playful retro, 8-bit nostalgia with modern polish
|
||||
**Background:** Dark (#0A0A0A) with pixel texture overlays
|
||||
**Accent:** Bitcoin orange (#F7931A) with radial neon glow
|
||||
|
||||
## Typography
|
||||
|
||||
```css
|
||||
--font-pixel: 'ChonkyPixels', monospace; /* Display/headings — CRITICAL */
|
||||
--font-body: 'Avenir Next', system-ui, sans-serif;
|
||||
--font-mono: 'Courier New', monospace;
|
||||
```
|
||||
|
||||
**Rule:** ChonkyPixels must be loaded with `font-synthesis: none` and
|
||||
`!important` on headings to prevent browser synthesis of bold/italic.
|
||||
|
||||
## Color Palette
|
||||
|
||||
Same dark base as Glassmorphism, but with neon glow effects:
|
||||
```css
|
||||
--bg-primary: #0A0A0A;
|
||||
--accent: #F7931A;
|
||||
--accent-glow: radial-gradient(circle, rgba(247,147,26,0.4) 0%, transparent 70%);
|
||||
--neon-green: #39ff14;
|
||||
--neon-pink: #ff6ec7;
|
||||
--neon-blue: #04d9ff;
|
||||
```
|
||||
|
||||
## Key Components
|
||||
|
||||
### Neon Glow CTA
|
||||
```css
|
||||
.neon-cta {
|
||||
background: linear-gradient(135deg, #f7931a, #e68a00);
|
||||
border: 2px solid rgba(247, 147, 26, 0.5);
|
||||
border-radius: 4px; /* Sharp corners — pixel aesthetic */
|
||||
padding: 12px 32px;
|
||||
font-family: var(--font-pixel);
|
||||
text-transform: uppercase;
|
||||
position: relative;
|
||||
}
|
||||
.neon-cta::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: -8px;
|
||||
background: var(--accent-glow);
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s;
|
||||
z-index: -1;
|
||||
}
|
||||
.neon-cta:hover::after { opacity: 1; }
|
||||
```
|
||||
|
||||
### Pixel Dot Animation
|
||||
```css
|
||||
@keyframes pixel-dot-bounce {
|
||||
0%, 100% { transform: translateY(0); }
|
||||
50% { transform: translateY(-4px); }
|
||||
}
|
||||
.pixel-dot { animation: pixel-dot-bounce 0.6s steps(2) infinite; }
|
||||
```
|
||||
|
||||
### Intro Sequence
|
||||
```css
|
||||
.intro-container { animation: intro-container 0.6s ease-out; transform-origin: center; }
|
||||
.intro-corners { animation: intro-corners 0.5s ease-out 0.35s both; }
|
||||
.intro-logo { animation: fadeIn 0.5s ease-out 0.7s both; }
|
||||
|
||||
@keyframes intro-container { from { transform: scale(0.97); opacity: 0; } }
|
||||
@keyframes intro-corners { from { transform: scale(0.8); opacity: 0; } }
|
||||
```
|
||||
|
||||
## UI Approach
|
||||
|
||||
- Sharp corners (2-4px radius) — pixel aesthetic, not rounded
|
||||
- Stepped animations (`steps(N)`) where possible for pixel feel
|
||||
- Monospace alignment for data displays
|
||||
- Donation modal: max-width 480px, QR code on white background
|
||||
- Theme toggle: smooth dark/light with inverted logo filter
|
||||
|
||||
## Modular Architecture
|
||||
|
||||
- Pixel font loaded via `@font-face` with subset for performance
|
||||
- Glow effects via CSS pseudo-elements (no extra DOM)
|
||||
- Animation keyframes in global stylesheet
|
||||
- Component-scoped overrides only
|
||||
@@ -18,6 +18,22 @@ The first 432 bytes of a hybrid-bootable ISO. Contains the Master Boot Record co
|
||||
|
||||
**Rule**: Always extract MBR from a known-working ISO. Never rely on the generic ISOLINUX one.
|
||||
|
||||
### CRITICAL: Embedded vs Appended EFI — Real Hardware Impact
|
||||
|
||||
Two approaches for EFI boot in xorriso. They produce DIFFERENT hybrid structures:
|
||||
|
||||
| Approach | xorriso flag | cyl-align | CHS geometry | Real hardware |
|
||||
|----------|-------------|-----------|--------------|---------------|
|
||||
| **Embedded** | `-e boot/grub/efi.img` | `cyl-align-on` | Non-zero (e.g. 244/32) | **WORKS** |
|
||||
| **Appended** | `-append_partition 2 ... -e --interval:appended_partition_2:all::` | `cyl-align-off` | `0/0` | **FAILS** |
|
||||
|
||||
The Will Haley guide recommends appended, but on our Dell hardware only embedded works.
|
||||
Use `xorriso -indev image.iso -report_system_area plain` to check which mode an ISO uses.
|
||||
|
||||
### Common gotcha: installer minbase missing sudo
|
||||
debootstrap --variant=minbase does NOT include sudo. If the installer runs as root
|
||||
(via auto-login), do NOT use sudo in scripts. `bash: sudo: command not found` is the symptom.
|
||||
|
||||
### xorriso flags for hybrid boot
|
||||
```bash
|
||||
xorriso -as mkisofs -o output.iso \
|
||||
|
||||
@@ -109,6 +109,18 @@ jobs:
|
||||
fi
|
||||
echo "SMOKE TEST PASSED"
|
||||
|
||||
- name: QEMU boot test
|
||||
timeout-minutes: 5
|
||||
continue-on-error: true
|
||||
run: |
|
||||
ISO=$(ls image-recipe/results/archipelago-installer-unbundled-*.iso 2>/dev/null | head -1)
|
||||
if [ -n "$ISO" ] && command -v qemu-system-x86_64 >/dev/null 2>&1; then
|
||||
echo "Running headless QEMU boot test..."
|
||||
bash image-recipe/test-iso-headless.sh "$ISO" 120
|
||||
else
|
||||
echo "Skipping QEMU test (no ISO or QEMU not available)"
|
||||
fi
|
||||
|
||||
- name: Copy to Builds
|
||||
run: |
|
||||
ISO=$(ls image-recipe/results/archipelago-installer-unbundled-*.iso 2>/dev/null | head -1)
|
||||
|
||||
Reference in New Issue
Block a user