With --exclude-weakdeps, two packages that nothing else hard-requires were
being silently dropped from the installed system:
- dbus-daemon (provides /usr/bin/dbus-run-session): gdm-wayland-session
needs it to spawn the per-session D-Bus bus. Only anaconda-core requires
it, and that is not installed into the target system.
- systemd-pam (provides pam_systemd.so): 'systemd' merely recommends it.
Without pam_systemd, PAM 'optional' session rules fail silently, login
sessions never register with logind, user@.service never starts, and the
session bus lacks org.freedesktop.systemd1.
Result of either gap: gdm logs 'Session never registered, failing' five
times, then 'maximum number of display failures reached. Giving up.' and
the screen stays black — on VMs and bare metal alike (laptop bug).
Both packages validated live on a Fedora 44 guest; dnf5 check passes.
generic-release conflicts with fedora-release and generic-logos conflicts
with fedora-logos, so dishes shipping the remix packages cannot coexist
with @core pulling Fedora branding — the RPM transaction fails at prepare
time. Replace @core with the explicit core package list (mandatory +
default, plus basesystem/kernel/dhcp-client), add fedora-repos explicitly,
and deselect fedora-release/fedora-logos; the remix packages provide
system-release, system-release(44) and system-logos instead.
Verified on nuc6i7kyb: a Fedora 44 GNOME hypervisor desktop VM installed
cleanly from this configuration (982-package resolution scratch-tested
before the install).
- uncomment the hypervisor recipe, targeting Fedora 44 with
systemd-boot, hardware-support and the intelcpu variant
- make intelcpu.ks bootloader-aware: with systemd-boot kernel
arguments must go to /etc/kernel/cmdline, not /etc/default/grub
- add fedora-44-mirrors ingredient and register it in the repository choices
- expand the desktop variant matrix to [43, 44, rawhide] (48 dishes)
- bump CI workflows and deploy fallback URL to Fedora 44
- cover both release repositories in tests
Replace the hardcoded TEMPLATES dict and the ksflatten-relative wrapper
with a single data-driven pipeline:
- recipe_templates.yaml becomes the single source of truth with three
sections: base (always included), choices (exactly-one per category,
the invariant pykickstart cannot check) and features (additive flags
or one-of values)
- generate_recipe.py is a pure YAML consumer: it resolves ingredients,
renders dishes via pykickstart in-process (no ksflatten binary, no
%include path munging), lints the invariants pykickstart cannot check
(exactly-one per choice category, known keys, existing fragments,
unique filenames) and validates every generated dish
- dish names are derived by a generic rule with canonical category order
from the templates, independent of YAML key order; no committed
generated files means no name burn-in
- recipes/ and dishes/ become gitignored build products; the 68 tracked
generated files (already out of sync with the manifest) are removed
- delete dead ingredients (section-data/, validation/, initial-setup/
desktop/, live/hypervisor.ks, rpmfusion-nonfree.ks), the stale
all-ingredients.cfg (replaced by 'make inventory') and the
bin/generate-recipe and bin/ksflatten-relative wrappers
- Makefile: single 'make all' step plus lint, validate, inventory, test
- add 16 pytest tests covering expansion, selection, naming, lint and
flatten/validate round-trips
- create generate_recipe.py for universal template recipe generation
- support cartesian product expansion from recipes_manifest.yaml
- generate 72 unique recipes with proper filename disambiguation
- update Makefile with simplified validation using ksflatten
- keep ksflatten-relative script as-is for dish flattening
The generator reads recipe_templates.yaml and recipes_manifest.yaml to
produce recipe files that ksflatten then flattens into final dishes.
- Move storage options from 'modifiers' to 'required' in recipe_templates.yaml
- Changed required.storage from {'ext4': storage/standard.ks} to {'standard': ..., 'encrypted': ...}
- Removed storage from modifiers section
- This ensures storage: encrypted recipes include only storage/encrypted.ks
- Updated generated recipes and dishes to reflect the fix
- Transition from multi-template (install/live recipe types) to single universal template (proteus)
- Remove recipe_type parameter from RecipeGenerator
- Update manifest format (remove recipe_type field)
- Simplify CLI (remove --type argument, use --output for single generation)
- Filename generation now uses primary modifier as first component
- Move recipe-generator/ to cook/ for cleaner structure
- Fix ksflatten-relative path conversion to handle all %include paths
- Fix validation exit code to only fail on actual errors
- All recipes now generate and flatten successfully via make all