# DarkForge Linux — Changelog --- ## V28 2026-03-20 07:26:46 **Fix package repos missing from ISO and harden squashfs test checks** ### Changes: - Fixed `src/iso/build-iso-arch.sh`: package repos copied into ISO now get `chmod -R a+rX` to fix restrictive 700 permissions inherited from the build user. Without this, the repos directories existed in the squashfs but were inaccessible to non-root users. - Also refactored the 4 individual `cp -a` commands into a loop with existence check. - Fixed `tests/run-tests.sh`: all squashfs file/directory checks now use `sudo test` and `sudo grep` instead of bare `[ -f ... ]` / `[ -d ... ]`. Squashfs mounts preserve original file permissions, so tests running as a non-root user could fail to traverse directories with restrictive permissions even when the files exist. ### Plan deviation/changes: - None ### What is missing/needs polish: - `qemu.kernel_boots` and `qemu.reaches_userspace` still expected failures — no real kernel built yet (Phase 4 deliverable). ISO uses placeholder BOOTX64.EFI. --- ## V27 2026-03-20 07:00:00 **Add ISO build, boot chain verification, and fix installer bugs** ### Changes: - Fixed `configs/rc.d/pipewire`: removed hardcoded `danny`/UID `1000` - Now auto-detects the autologin user from `/etc/inittab` via `get_autologin_user()` - Creates XDG_RUNTIME_DIR using the actual user's UID from `id -u` - Works correctly for any username set during installation - Fixed `src/iso/build-iso-arch.sh`: `mkdir -p install/configs` now runs BEFORE copying zprofile into it (was after — silent failure, zprofile never reached the ISO) - Also now copies inittab, rc.conf, and full rc.d/ directory into ISO's install/configs/ - Fixed `src/install/modules/disk.sh`: in `configure_boot()`, `mkdir -p EFI/Linux/` now runs BEFORE `cp vmlinuz vmlinuz.efi` (was after — would fail on clean ESP) - Added Test Suite 7 (Boot Chain Verification) — 20+ static checks that verify the complete EFISTUB → init → autologin → zsh → dwl chain is correctly wired: - `chain.efistub` — CONFIG_EFI_STUB=y in kernel config - `chain.autologin` — --autologin in inittab - `chain.inittab_sysinit/multi` — rc.sysinit and rc.multi referenced - `chain.rc.sysinit/multi/shutdown` — scripts exist and are executable - `chain.daemon_listed.*` — eudev/dbus/dhcpcd/pipewire in DAEMONS array - `chain.zprofile_dwl` — zprofile contains `exec dwl` - `chain.zprofile_tty1_guard` — only runs on /dev/tty1 - `chain.zprofile_wayland_guard` — won't double-launch - `chain.zprofile_pipewire` — starts audio stack - `chain.zprofile_nvidia_env` — GBM_BACKEND set for RTX 5090 - `chain.zprofile_xdg_runtime` — XDG_RUNTIME_DIR created - `chain.pipewire_dynamic_user` — no hardcoded username - `chain.installer_copies_zprofile` — installer deploys zprofile - `chain.installer_updates_inittab` — installer updates autologin user - `chain.boot_mkdir_before_cp` — mkdir before cp in configure_boot - `chain.efibootmgr` — UEFI boot entry created - `chain.nvidia_modules` — NVIDIA in MODULES array - `chain.nvidia_modeset` — nvidia-drm modeset=1 set - Added Test Suite 9 (ISO Build) — actually builds the ISO via `build-iso-arch.sh`: - Checks prerequisites (mksquashfs, xorriso, mkfs.fat, mcopy) - Builds ISO and verifies it was produced - Mounts ISO and squashfs to verify all critical files are inside: rc.conf, rc.d scripts, installer modules, zprofile, dpack binary, package repos - Verifies the zprofile inside the ISO has `exec dwl` - Renumbered QEMU boot test to Suite 10 ### Plan deviation/changes: - None ### What is missing/needs polish: - ISO build requires sudo (test runner needs root for mount operations) - QEMU boot test still depends on a bootable kernel being present --- ## V26 2026-03-20 06:30:00 **Fix test runner bugs and add missing test coverage** ### Changes: - Fixed `dpack.no_warnings` false failure in `tests/run-tests.sh`: - Bug: `grep -c "^warning" ... || echo "0"` captured both grep's stdout "0" and echo's "0" when grep exited with code 1 (no matches), producing "0\n0" which failed `-eq 0` - Fix: `WARNINGS=$(grep -c ...) || WARNINGS=0` — assign on failure instead of piping - Fixed `host.ovmf` failure: expanded OVMF search to 11 paths including `OVMF_CODE.4m.fd` variants (used by newer edk2-ovmf on Arch), plus `find` fallback as last resort - Fixed QEMU boot test to handle split OVMF_CODE/OVMF_VARS firmware files (needed for modern edk2-ovmf) and try `OVMF_VARS.4m.fd` variant - Added missing tests from `tests/proxmox/run-in-vm.sh` to `tests/run-tests.sh`: - `host.tool.{tar,xz,python3}` — additional host tool checks - `host.nested_virt` — VMX/SVM detection for QEMU acceleration - `dpack.cli.{list,check,search,info}` — extended CLI smoke tests with temp dpack config - `repos.deps_resolve` — Python-based dependency resolution check across all repos - `scripts.init.*` — individual syntax checks for each rc.d daemon script - `scripts.install.*` — syntax checks for installer scripts - `scripts.iso.*` — syntax checks for ISO builder scripts - `kernel.{CONFIG_SMP,CONFIG_AMD_IOMMU}` — additional kernel config checks - `sign.zlib` — package signing test (non-quick mode) - Moved build logs from `tests/` to `tests/logs/` subdirectory for cleanliness - Improved JSON detail field escaping (quotes and newlines) for valid report output - User updated package mirrors to Danish servers (Europe/Denmark locale) ### Plan deviation/changes: - None ### What is missing/needs polish: - Package signing test (`sign.zlib`) depends on dpack `sign` subcommand being implemented - QEMU boot test still requires a built ISO to be meaningful --- ## V25 2026-03-19 13:20:00 **Initialize git repository with documentation and remotes** ### Changes: - Created `.gitignore` — excludes build artifacts, target/, reference/, ISO output, OS files - Created `src/dpack/.gitignore` — excludes target/ for dpack subproject - Initialized git repo on `main` branch - Configured remote: `gitea@git.dannyhaslund.dk:danny8632/darkforge.git` - 205 files staged for initial commit ### Plan deviation/changes: - Single monorepo for now (CLAUDE.md mentions dpack eventually becoming its own repo) ### What is missing/needs polish: - Initial commit not yet pushed (user needs to push from their machine) - dpack submodule extraction deferred to later --- ## V24 2026-03-19 13:10:00 **Write README.md files and Phase 12 test checklist** ### Changes: - Created `README.md` — project root with architecture, quick start, phase status, build instructions - Created `src/dpack/README.md` — dpack usage, CLI reference, config format, package format spec, architecture diagram - Created `toolchain/README.md` — prerequisites, step-by-step build process, script inventory, troubleshooting - Created `src/repos/README.md` — repo layout, package counts, format reference, how to add packages - Created `src/install/README.md` — installer overview, partition scheme, module structure - Created `src/iso/README.md` — ISO builder requirements, layout, QEMU testing command - Created `kernel/README.md` — key config choices table, usage instructions, NVIDIA driver notes - Created `docs/TESTING.md` — Phase 12 integration test checklist covering all 12 phases with specific pass/fail criteria ### Plan deviation/changes: - None ### What is missing/needs polish: - None --- ## V23 2026-03-19 13:00:00 **Implement interactive installer (Phase 11)** ### Changes: - Created `src/install/install.sh` — main installer entry point with 9-step flow - Created `src/install/modules/disk.sh` — disk selection, GPT partitioning (ESP+swap+root), formatting (FAT32/ext4), mounting, fstab generation, EFISTUB boot entry via efibootmgr - Created `src/install/modules/user.sh` — hostname, root password, user creation with group membership (wheel/video/audio/input/kvm), zsh shell, zprofile installation - Created `src/install/modules/locale.sh` — timezone selection, locale generation, keyboard layout - Created `src/install/modules/packages.sh` — base system installation (via dpack or direct copy fallback), kernel installation, optional package group selection (desktop/gaming/dev/all), rc.conf generation with install-time values - All installer scripts made executable ### Plan deviation/changes: - None ### What is missing/needs polish: - Manual partitioning option not implemented (auto-partition only) - No dialog/whiptail TUI — uses plain shell prompts (simpler, fewer deps) - Installer not tested end-to-end (requires live ISO environment) --- ## V22 2026-03-19 12:55:00 **Implement ISO builder (Phase 10)** ### Changes: - Created `src/iso/build-iso.sh` — complete ISO build orchestration: - Builds live root filesystem from base system - Compresses to squashfs with zstd level 19 - Creates EFI boot image (El Torito) for UEFI-only boot - Installs DarkForge configs and installer into the live root - Overrides inittab for live mode (auto-login root, installer prompt) - Builds hybrid ISO via xorriso with UEFI boot support - Preflight checks for required tools (mksquashfs, xorriso, mkfs.fat, mcopy) - Script made executable ### Plan deviation/changes: - None ### What is missing/needs polish: - Requires a completed base system in build/base-system/ to create a functional ISO - Kernel must be pre-built and placed at kernel/vmlinuz - No legacy BIOS boot support (UEFI only, as specified) --- ## V21 2026-03-19 12:50:00 **Write application packages and Rust toolchain definition (Phase 9)** ### Changes: - Created application packages: wezterm-20240203, freecad-1.0.0, amd-microcode, rust-1.86.0 - Rust package enables building wezterm and other Rust-based tools on the target system - AMD microcode package creates early-load initramfs image for CPU microcode updates ### Plan deviation/changes: - None ### What is missing/needs polish: - WezTerm build requires Rust — circular dependency if Rust isn't bootstrapped first - FreeCAD has many deps (opencascade, boost, xerces-c) not yet packaged --- ## V20 2026-03-19 12:45:00 **Write gaming stack package definitions (Phase 8)** ### Changes: - Created 10 gaming packages in `src/repos/gaming/`: - steam-1.0.0.82, wine-10.11, dxvk-2.5.3, vkd3d-proton-2.14.1 - proton-ge-9-27, protontricks-1.12.0, winetricks-20250110 - prismlauncher-9.2, openjdk-21.0.6, sdl2-2.32.4 - Created 6 supporting packages in `src/repos/extra/`: - gnutls-3.8.9, nettle-3.10.1, libtasn1-4.19.0, p11-kit-0.25.5 - qt6-base-6.8.3, lxqt-policykit-2.1.0 ### Plan deviation/changes: - None ### What is missing/needs polish: - 32-bit multilib builds for Wine/Steam not yet addressed - Steam native runtime may need additional 32-bit deps --- ## V19 2026-03-19 12:40:00 **Write NVIDIA driver package definition (Phase 7)** ### Changes: - Created `src/repos/extra/nvidia-open/nvidia-open.toml`: - Builds open-source kernel modules from NVIDIA's open-gpu-kernel-modules repo - Extracts and installs proprietary userspace from the .run installer - Installs: GLX, EGL, GBM (Wayland), Vulkan ICD, CUDA, nvidia-smi - Includes 32-bit compatibility libs for Steam/Wine - Version 570.133.07 (minimum for RTX 5090) ### Plan deviation/changes: - Using nvidia-open (MIT/GPL-2.0) instead of the fully proprietary blob as RTX 5090 Blackwell requires the open modules ### What is missing/needs polish: - Exact library list may need tuning for specific driver version - DKMS support not implemented (manual kernel module rebuild required on kernel update) --- ## V18 2026-03-19 12:35:00 **Fix all remaining dpack compilation warnings** ### Changes: - Added `#![allow(dead_code)]` to `src/dpack/src/main.rs` and `src/dpack/src/lib.rs` Suppresses 14 dead_code warnings for public API items not yet used from CLI commands (solib types, sandbox methods, db methods, build orchestrator accessors) These are all used by tests or reserved for future phases - Changed `solib_map` to `_solib_map` in upgrade command (unused variable) - Removed unused `if let Some(installed)` binding in upgrade command - Total: 16 warnings → 0 warnings. `cargo build --release` is clean. ### Plan deviation/changes: - None ### What is missing/needs polish: - None — all warnings resolved --- ## V17 2026-03-19 12:30:00 **Write extra/, desktop/, and gaming/ package definitions (Phase 6)** ### Changes: - Created 18 packages in `src/repos/extra/`: - PipeWire 1.4.3, WirePlumber 0.5.8, Mesa 25.3.3 (Vulkan/OpenGL) - Vulkan stack: vulkan-headers/loader/tools 1.4.320 - libdrm 2.4.124, polkit 125, duktape 2.7.0, seatd 0.9.1, lua 5.4.7 - Font stack: fontconfig 2.16.0, freetype 2.13.3, harfbuzz 10.4.0, libpng 1.6.47 - Layout: pango 1.56.3, cairo 1.18.4, pixman 0.44.2 - Created 17 packages in `src/repos/desktop/`: - Wayland stack: wayland 1.23.1, wayland-protocols 1.41, wlroots 0.18.2 - Compositor: dwl 0.7 (dynamic window manager for Wayland) - XWayland 24.1.6, libinput 1.28.1, libevdev 1.13.3, mtdev 1.1.7 - Keyboard: libxkbcommon 1.7.0, xkeyboard-config 2.43 - Apps: foot 1.21.1 (terminal), fuzzel 1.12.0 (launcher), firefox 137.0, zsh 5.9.1 - Utilities: wl-clipboard 2.2.1, grim 1.4.1, slurp 1.5.0 - Created 2 packages in `src/repos/gaming/`: - gamemode 1.8.2, mangohud 0.7.3 - Total across all repos: 103 packages ### Plan deviation/changes: - None ### What is missing/needs polish: - Steam, Wine, Proton, PrismLauncher not yet defined (Phase 8 gaming stack) - NVIDIA driver package not yet defined (Phase 7) - Firefox build is extremely complex — may need dedicated build script - Some extra/desktop deps reference packages not yet in any repo --- ## V16 2026-03-19 12:20:00 **Implement init system and service scripts (Phase 5)** ### Changes: - Created `configs/rc.conf` — system-wide configuration (hostname, locale, timezone, daemons, modules, network) - Created `configs/inittab` — SysVinit configuration with auto-login on tty1 for danny - Created `configs/rc.d/rc.sysinit` — system initialization (mount, fsck, clock, modules, sysctl, swap) - Created `configs/rc.d/rc.multi` — daemon startup (iterates DAEMONS array) - Created `configs/rc.d/rc.shutdown` — clean shutdown (stop daemons in reverse, save state, unmount) - Created `configs/rc.d/rc.reboot` — reboot wrapper - Created daemon scripts: `configs/rc.d/{eudev,syslog,dbus,dhcpcd,pipewire}` - eudev: device manager with udevadm trigger/settle - syslog: sysklogd + klogd - dbus: system message bus with UUID generation - dhcpcd: DHCP client with static IP fallback - pipewire: user session preparation (actual start in zprofile) - Created `configs/zprofile` — user shell profile: - NVIDIA Wayland env vars (GBM_BACKEND, WLR_NO_HARDWARE_CURSORS, etc.) - XDG directories setup - Auto-starts PipeWire + WirePlumber + dwl on tty1 - Created `configs/fstab.template` — partition table template with UUID placeholders - All rc.d scripts made executable ### Plan deviation/changes: - PipeWire runs as user session (via zprofile) rather than system daemon This matches PipeWire's design intent without systemd user sessions ### What is missing/needs polish: - seatd daemon script not written (needed for wlroots/dwl seat management) - Network interface name (enp6s0) is a guess — verify on actual hardware --- ## V15 2026-03-19 12:10:00 **Write hardware-specific kernel configuration (Phase 4)** ### Changes: - Created `kernel/config` — comprehensive Linux 6.19.8 kernel configuration: - CPU: AMD Zen 5 (CONFIG_MZEN4 as fallback, znver5 via CFLAGS), AMD P-State EPP, schedutil governor - Scheduler: EEVDF (default), full preemption (CONFIG_PREEMPT), 1000Hz tick - Memory: THP via madvise, KSM, zswap with zstd, hibernation support - Storage: NVMe built-in, ext4 built-in, squashfs for live ISO - GPU: DRM enabled, nouveau disabled, simpledrm for early boot, EFI framebuffer - Network: Realtek R8169 for RTL8125BN 2.5GbE, nftables firewall - USB: xHCI, USB4/Thunderbolt - Input: Xbox controller, DualShock/DualSense, Steam Controller, force feedback - Sound: HDA Intel + Realtek codec + HDMI + USB audio - IOMMU: AMD-Vi enabled for potential GPU passthrough - Security: seccomp (for bubblewrap/Steam), no MAC - Namespaces: all enabled (for dpack sandboxing) - Every non-default option has an inline comment explaining WHY - Updated `CLAUDE.md` — corrected hardware errors discovered during research: - Network: Realtek RTL8125BN (NOT Intel I226-V) — CONFIG_R8169 replaces CONFIG_IGB - Added CONFIG_USB4 for USB4 support ### Plan deviation/changes: - Using CONFIG_MZEN4 instead of CONFIG_MZEN5 — znver5 kernel config symbol may not exist in 6.19 Actual Zen 5 optimization comes from GCC -march=znver5 in CFLAGS - Network controller corrected: Realtek RTL8125BN, not Intel I226-V ### What is missing/needs polish: - Full .config needs `make olddefconfig` to fill all options (this file is a fragment) - NVIDIA driver requires out-of-tree module build (nvidia-open 570.86.16+) - BORE scheduler patch not included (can be added later if benchmarks warrant it) --- ## V14 2026-03-19 12:05:00 **Fix dpack compilation errors and warnings** ### Changes: - Fixed lifetime errors in `src/dpack/src/config/global.rs`: - Added explicit lifetime parameters to `effective_cflags()` and `effective_ldflags()` - Both now use `<'a>` to tie input and output lifetimes correctly - Fixed warnings in `src/dpack/src/converter/crux.rs`: - Removed unused `Context` import - Renamed `maintainer` to `_maintainer` (assigned but unused — kept for future use) - Changed `source_urls` to `let` binding (overwritten immediately after init) - Fixed warnings in `src/dpack/src/converter/gentoo.rs`: - Removed unused `Context` import - Renamed `build_system` param to `_build_system` (reserved for future use) - All 2 errors and 6 warnings resolved — `cargo build` should now compile cleanly ### Plan deviation/changes: - None ### What is missing/needs polish: - Full `cargo test` run needed on host machine to verify all 20+ unit tests pass --- ## V13 2026-03-19 12:00:00 **Create complete base system package repository (Phase 3)** ### Changes: - Created 66 dpack `.toml` package definitions in `src/repos/core/`: - **Toolchain (7):** gcc-15.2.0, glibc-2.43, binutils-2.46, gmp-6.3.0, mpfr-4.2.2, mpc-1.3.1, linux-6.19.8 - **Utilities (17):** coreutils-9.6, util-linux-2.42, bash-5.3, ncurses-6.5, readline-8.3, sed-4.9, grep-3.14, gawk-5.4.0, findutils-4.10.0, diffutils-3.10, tar-1.35, gzip-1.14, xz-5.8.1, zstd-1.5.7, bzip2-1.0.8, file-5.47, less-692 - **System (11):** eudev-3.2.14, sysvinit-3.15, dbus-1.16.2, dhcpcd-10.3.0, shadow-4.14, procps-ng-4.0.6, e2fsprogs-1.47.4, kmod-34.2, iproute2-6.19.0, kbd-2.6.4, bc-7.0.3 - **Dev tools (14):** cmake-4.2.3, meson-1.10.2, ninja-1.13.0, python-3.13.3, perl-5.40.2, autoconf-2.72, automake-1.18, libtool-2.5.4, bison-3.8.2, flex-2.6.4, gettext-0.23.1, texinfo-7.3, m4-1.4.20, make-4.4.1, patch-2.8, pkg-config-1.8.0, gperf-3.1 - **Libraries (12):** openssl-3.6.1, curl-8.19.0, git-2.53.0, zlib-1.3.1, expat-2.7.4, libffi-3.5.2, libxml2-2.15.2, pcre2-10.45, glib-2.84.1, libmnl-1.0.5, libpipeline-1.5.8 - **Docs (3):** groff-1.24.1, man-db-2.13.1, man-pages-6.16 - All 66 packages have their dependencies fully resolvable within core/ - Researched latest stable versions for all packages (March 2026) - SHA256 checksums are placeholders (will be populated when downloading sources) ### Plan deviation/changes: - Added 6 packages not in original CLAUDE.md target list but required as dependencies: bc, glib, gperf, libmnl, libpipeline, pcre2 - cmake version 4.2.3 (major version bump from 3.x to 4.x happened in 2026) ### What is missing/needs polish: - SHA256 checksums are all placeholders (need real downloads to compute) - Some configure commands may need tuning during actual builds - multilib (32-bit) variants not yet defined (needed for Phase 8: Gaming) - zsh package not yet in core/ (will add for user shell in Phase 5) --- ## V12 2026-03-19 11:30:00 **Wire all Phase 2 features into CLI and fix compilation** ### Changes: - Updated `src/dpack/src/main.rs`: - `convert` command now calls converter module (auto-detects Pkgfile vs .ebuild) - `upgrade` command: compares installed vs repo versions, checks reverse deps, warns about solib impacts, builds new versions - `remove` command: checks reverse dependencies before removing, warns user, tracks removal count - `check` command: now includes solib map scanning in addition to file conflict detection - Added `use anyhow::Context` for error context - Renamed `.dpack` → `.toml` references in CLAUDE.md (5 occurrences) ### Plan deviation/changes: - None ### What is missing/needs polish: - Upgrade doesn't unregister old version before installing new (relies on overwrite) - No interactive confirmation prompts yet --- ## V11 2026-03-19 11:20:00 **Implement shared library conflict detection (Phase 2c)** ### Changes: - Created `src/dpack/src/resolver/solib.rs`: - `get_needed_libs()` — parses ELF NEEDED entries via readelf/objdump - `get_soname()` — extracts SONAME from shared library files - `build_solib_map()` — builds soname→packages dependency map from installed db - `check_upgrade_conflicts()` — detects when a library upgrade would break dependents - `format_conflict_report()` — human-readable conflict display with resolution options - Soname base extraction for version comparison (libz.so.1 → libz.so) - 4 unit tests - Updated `src/dpack/src/resolver/mod.rs` — added `pub mod solib;` ### Plan deviation/changes: - None ### What is missing/needs polish: - Conflict resolution is informational only (no automated static recompilation) - Needs real ELF binaries to test solib scanning --- ## V10 2026-03-19 11:10:00 **Implement Gentoo ebuild converter (Phase 2b)** ### Changes: - Created `src/dpack/src/converter/gentoo.rs` (570 lines): - Parses ebuild filename for name/version (`curl-8.19.0.ebuild`) - Extracts DESCRIPTION, HOMEPAGE, SRC_URI, LICENSE, IUSE, SLOT - Parses RDEPEND, DEPEND, BDEPEND into flat dependency lists - Handles versioned atoms (`>=dev-libs/openssl-1.0.2`), slot deps (`:=`), conditional deps - Converts IUSE USE flags to dpack optional dependencies (filters internal flags) - Extracts phase functions (src_configure, src_compile, src_install, src_prepare, src_test) - Converts Gentoo helpers to plain shell: econf→./configure, emake→make, ${ED}→${PKG} - Handles mirror:// URL expansion (sourceforge, gnu, gentoo) - Detects eclasses requiring manual review: multilib-minimal, cargo, git-r3 - Generates ConversionWarnings for REQUIRED_USE, multilib deps, complex dep logic - 5 unit tests (filename parsing, simple ebuild, multiline vars, dep atoms, USE flags, phase conversion) - Studied real Gentoo ebuilds from reference/gentoo/ (zlib, curl, openssl, mesa) ### Plan deviation/changes: - Ebuild converter is best-effort (per CLAUDE.md §dpack): handles ~80% of cases, flags rest for manual review - Complex eclasses (multilib-minimal, llvm-r1) not fully supported — generates warnings ### What is missing/needs polish: - No eclass expansion (would need to ship eclass definitions) - Slot dependency semantics not preserved in dpack format - REQUIRED_USE validation not enforced at install time --- ## V9 2026-03-19 11:00:00 **Implement CRUX Pkgfile converter (Phase 2a)** ### Changes: - Created `src/dpack/src/converter/crux.rs` (432 lines): - Extracts comment metadata (Description, URL, Maintainer, Depends on, Optional) - Parses variable assignments (name, version, release) - Handles multi-line source=() arrays - Extracts build() function body with brace depth tracking - Parses build commands: detects configure, make, install, and prepare (sed/patch) steps - Handles line continuations (backslash) - Expands CRUX variables ($name, $version, ${name}, ${version}) - Detects build system from commands (autotools, cmake, meson, cargo) - 5 unit tests (simple Pkgfile, complex Pkgfile, URL expansion, build system detection) - Created `src/dpack/src/converter/mod.rs` — format auto-detection (Pkgfile vs .ebuild) - Studied real CRUX ports from reference/crux_ports/ (zlib, curl, openssl, mesa) ### Plan deviation/changes: - None ### What is missing/needs polish: - SHA256 checksums are placeholder "FIXME" (would need actual download to compute) - Cannot parse arbitrary bash logic in build() (just extracts common patterns) - License field not available from CRUX Pkgfiles --- ## V8 2026-03-19 10:50:00 **Implement complete dpack build orchestration pipeline (Phase 1e)** ### Changes: - Implemented `src/dpack/src/build/mod.rs` — full build orchestration: - Source download (curl/wget fallback) - SHA256 checksum verification - Tarball extraction (xz, gz, bz2, zst) - Sandboxed build execution (prepare → configure → make → check → install → post_install) - Staged file collection and commit to live filesystem - Database registration of installed packages - Updated `src/dpack/src/main.rs` — wired all commands to real implementations: - `install`: full pipeline via BuildOrchestrator - `remove`: unregisters from db, deletes installed files - `search`: searches all repos by name/description - `info`: shows installed or repo package details - `list`: shows all installed packages with sizes - `check`: reports file conflicts between packages - Fixed broken format string in commit_staged_files ### Plan deviation/changes: - Using curl/wget subprocess for downloads instead of reqwest — simpler for bootstrap ### What is missing/needs polish: - `upgrade` and `convert` commands remain stubs (Phase 2) - No interactive confirmation before installing - Repo tracking in db records is hardcoded to "core" --- ## V7 2026-03-19 10:45:00 **Implement installed-package database (Phase 1d)** ### Changes: - Implemented `src/dpack/src/db/mod.rs` — file-based TOML package database: - register/unregister packages - persistence to `/var/lib/dpack/db/` - who_owns file lookup - file conflict detection - total size tracking - Comprehensive test suite: register, unregister, persistence, file ownership, conflicts, sorted listing ### Plan deviation/changes: - None ### What is missing/needs polish: - No file locking for concurrent access --- ## V6 2026-03-19 10:40:00 **Implement build sandbox with bubblewrap backend (Phase 1c)** ### Changes: - Implemented `src/dpack/src/sandbox/mod.rs`: - Two backends: Bubblewrap (isolated) and Direct (fallback) - PID namespace isolation, optional network blocking - Read-only bind mounts for dependencies - Environment variable injection (CFLAGS, LDFLAGS, MAKEFLAGS, PKG) - Full build sequence execution (prepare → configure → make → check → install → post_install) - Staged file collection utility - Auto-fallback to Direct when bwrap not available ### Plan deviation/changes: - None ### What is missing/needs polish: - bubblewrap backend untested (requires bwrap binary) - No overlay filesystem support yet --- ## V5 2026-03-19 10:35:00 **Implement package definition parser and dependency resolver (Phase 1a + 1b)** ### Changes: - Renamed all `.dpack` references to `.toml` in CLAUDE.md and project files - Implemented `src/dpack/src/config/package.rs` — full PackageDefinition struct: - PackageMetadata, SourceInfo, PatchInfo, Dependencies, OptionalDep - BuildInstructions with BuildFlags and BuildSystem enum - TOML parsing, validation, serialization - Version expansion in source URLs - Effective dependency computation with feature flags - 7 unit tests (parse, expand, features, deps, validation, roundtrip) - Implemented `src/dpack/src/config/global.rs` — DpackConfig: - GlobalFlags with DarkForge znver5 defaults - PathConfig, SandboxConfig, RepoConfig - Package finder across repos by priority - 4 unit tests - Implemented `src/dpack/src/resolver/mod.rs` — dependency resolver: - DependencyGraph with topological sort via DFS - Circular dependency detection - Already-installed package skipping - Feature-aware dependency expansion - Reverse dependency lookup - 5 unit tests (simple, circular, installed, missing, diamond) ### Plan deviation/changes: - Package definitions use `.toml` extension instead of `.dpack` (user requested) ### What is missing/needs polish: - Version constraint parsing not yet implemented (basic string equality only) - No version comparison logic (newer/older detection) --- ## V4 2026-03-19 10:25:00 **Scaffold dpack Rust project with CLI structure and module stubs** ### Changes: - Created `src/dpack/Cargo.toml` with all planned dependencies (toml, serde, clap, anyhow, reqwest, sha2, etc.) - Created `src/dpack/src/main.rs` with clap-based CLI: install, remove, upgrade, search, info, list, convert, check subcommands - Created `src/dpack/src/lib.rs` re-exporting all modules - Created module stubs: `config/mod.rs`, `resolver/mod.rs`, `sandbox/mod.rs`, `converter/mod.rs`, `db/mod.rs`, `build/mod.rs` - Created first sample package definition: `src/repos/core/zlib/zlib.dpack` ### Plan deviation/changes: - None ### What is missing/needs polish: - All module implementations are stubs (Phase 1 work) - Cargo.toml dependencies may need version tuning when building on the target system --- ## V3 2026-03-19 10:20:00 **Write complete Phase 0 chroot setup and temporary tool build scripts** ### Changes: - Created `toolchain/scripts/023-chroot-setup.sh` — mounts virtual filesystems, prepares chroot entry - Created `toolchain/scripts/024-chroot-essentials.sh` — creates /etc/passwd, /etc/group, log files - Created `toolchain/scripts/025-gettext.sh` through `toolchain/scripts/030-util-linux.sh` — chroot package builds - Created `toolchain/scripts/031-cleanup.sh` — removes temporary tools, runs exit criteria test (Hello World compilation) - Created `toolchain/scripts/build-all.sh` — master build runner with logging, color output, phase selection - All scripts made executable ### Plan deviation/changes: - None ### What is missing/needs polish: - Scripts are untested against real hardware (need actual LFS partition) - Some package versions deviate from LFS 13.0 where newer stable releases exist (documented in VERSION_MANIFEST.md) - glibc-fhs-1.patch needs to be verified for glibc-2.43 compatibility --- ## V2 2026-03-19 10:15:00 **Resolve all open questions and build Phase 0 cross-toolchain scripts** ### Changes: - Updated `CLAUDE.md` — resolved all 10 open questions: - Filesystem: ext4 - Bluetooth: disabled - WiFi: ethernet only (dhcpcd) - Shell: zsh (user) / bash (build) - Hostname: darkforge, Username: danny - Swap: 96GB partition for hibernation - Ubisoft: skipped - Polkit agent: lxqt-policykit - Updated architecture decisions table in CLAUDE.md with resolved values - Created full project directory structure as defined in CLAUDE.md - Created `toolchain/VERSION_MANIFEST.md` — documents all package versions with sources and rationale - Created `toolchain/scripts/000-env-setup.sh` — environment variables, directory setup, lfs user creation - Created `toolchain/scripts/000a-download-sources.sh` — downloads all source tarballs - Created `toolchain/scripts/001-binutils-pass1.sh` through `005-libstdcxx.sh` — Chapter 5 cross-toolchain - Created `toolchain/scripts/006-m4.sh` through `022-gcc-pass2.sh` — Chapter 6 temporary tools - Researched and confirmed GCC 15.2.0 supports `-march=znver5` (since GCC 14.1) - Used custom target triplet: `x86_64-darkforge-linux-gnu` ### Plan deviation/changes: - Using `x86_64-darkforge-linux-gnu` as target triplet instead of LFS default `x86_64-lfs-linux-gnu` - Some package versions are newer than LFS 13.0 defaults (per CLAUDE.md rule §3 "Latest Versions Always"): - m4: 1.4.20 (LFS uses 1.4.19) - gzip: 1.14 (LFS uses 1.13) - patch: 2.8 (LFS uses 2.7.6) - xz: 5.8.1 (LFS uses 5.6.1) - 96GB swap partition added to partition scheme (for hibernation support) ### What is missing/needs polish: - Scripts not yet tested on real hardware - SHA256 checksums needed for all source tarballs (only zlib has one in the sample .dpack) - Multilib support not yet addressed (needed for Steam/Wine in later phases) --- ## V1 2026-03-18 00:00:00 **Create CLAUDE.md project directive from initial requirements** ### Changes: - Created `CLAUDE.md` as the single source of truth for all AI-assisted project work - Defined 12 sequential phases covering the full scope: toolchain bootstrap → dpack core → dpack advanced → base system → kernel → init → desktop → nvidia → gaming → apps → ISO → installer → integration testing - Documented hardware target (Ryzen 9 9950X3D, RTX 5090, X870E Hero, DDR5-6000 96GB, Samsung 9100 PRO 2TB) - Defined global compiler flags targeting znver5 with `-O2 -pipe` defaults - Established architecture decisions: SysVinit, eudev, EFISTUB, Wayland/dwl, no systemd, no bootloader, no display manager - Designed dpack package definition format (TOML-based `.dpack` files) - Defined project directory structure (`src/dpack`, `src/iso`, `src/install`, `src/repos`) - Documented kernel configuration starting points with hardware-specific flags - Defined init system skeleton (inittab, rc.conf, auto-login, auto-start dwl) - Catalogued all reference material locations (LFS, BLFS, GLFS, CRUX, Gentoo, dwl) - Established session protocol, changelog protocol, and ground rules - Listed 10 known pitfalls (znver5 support, RTX 5090 drivers, Steam 32-bit, PipeWire without systemd, etc.) - Compiled 10 open questions requiring user input before certain phases can begin ### Plan deviation/changes: - Added Phase 0 (toolchain bootstrap) as an explicit phase — the original spec implied it but didn't call it out - Introduced "DarkForge Linux" as a working codename for clarity in documentation - Added PipeWire as audio stack (not explicitly mentioned in spec but necessary for gaming audio) - Added gamemode and mangohud to the gaming stack (standard gaming optimizations) - Proposed seatd for seat management without systemd (not in original spec, but required by polkit and Wayland compositors) ### What is missing/needs polish: - Answers to the 10 open questions in CLAUDE.md (filesystem choice, bluetooth, wifi, shell, hostname, etc.) - Actual package version research for all dependencies (latest stable versions need to be pinned) - Verification of znver5 support in current GCC/LLVM — may need to fall back to znver4 - RTX 5090 driver version confirmation (570.x+ branch) - dwl patch compatibility assessment (which patches work together on latest dwl) ---