configs: merged fragment stacks replace the monolithic defconfigs (DE10 provably unchanged) - #137
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
The new scripts/check-config-fragments.sh normalisation currently drops lowercase BR2_* symbols (e.g. BR2_arm), weakening golden-hash drift detection and resolved-level lockstep checks.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This PR refactors the Buildroot configuration model from monolithic defconfigs into merged fragment stacks (driven by configs/fragments/stacks.mk), updates all consumers (Makefile, CI, Renovate, scripts, docs) to use the new stacks, and adds CI linting to prove the resolved configs match expectations (including golden hashes) with the stated goal of keeping the DE10 build behavior unchanged.
Changes:
- Replace monolithic DE10/DE25 defconfigs with fragment stacks and update all references/consumers accordingly.
- Add configuration linting scripts + CI job (
lint-config) to validate fragment composition, lockstep, and golden resolved-config hashes. - Update Renovate + renovate-hash-sync to track the new fragment layout (including a new “golden” hash-sync case).
File summaries
| File | Description |
|---|---|
| TASKS.md | Update historical references to fragments |
| scripts/test-sdcard-install.sh | Read kernel pin from DE10 fragment |
| scripts/test-initramfs.sh | Read kernel pin from DE10 fragment |
| scripts/list-kernel-variants.sh | Clarify exclusions with fragments layout |
| scripts/lint-kernel-patches.sh | Point default config source at fragment |
| scripts/lib/config-stacks.sh | New: parse stacks.mk + strip fragments |
| scripts/lib/board-expectations.sh | Update references to fragment files |
| scripts/hash-sync-kernel.sh | Read stable kernel pin from fragment |
| scripts/hash-sync-golden.sh | New: record golden resolved-config hashes |
| scripts/export-kernel-tree.sh | Read kernel pin from DE10 fragment |
| scripts/ci-tests.sh | Read kernel pin from DE10 fragment |
| scripts/check-linux-img.sh | Update contract reference to fragment |
| scripts/check-kernel-defconfig-sync.sh | Compare merged stacks vs old defconfigs |
| scripts/check-config-fragments.sh | New: fragment-stack regeneration + assertions |
| renovate.json | Update managers to fragment paths |
| README.md | Document fragment stacks + new make targets |
| PLAN.md | Update tree layout docs for fragments |
| package/linux-firmware-extra/linux-firmware-extra.mk | Comment updates for new layout |
| package/azcopy/Config.in | Reference de10nano-image fragment |
| package/azcopy/azcopy.mk | Reference de10nano-image fragment |
| package/azcopy/azcopy.hash | Update example make target |
| package/azcopy/azcopy-profile.sh | Reference de10nano-image fragment |
| MISTER-KERNEL-PATCH-RECON.md | Update pin references to fragment paths |
| Makefile | Generate configs from fragment stacks |
| external.mk | Update comments to fragment-based config |
| docs/wifi-parity.md | Update defconfig references to fragments |
| docs/version-delta.md | Update kernel pin reference to fragment |
| docs/util-linux-parity.md | Update examples to new make target |
| docs/user/faq.md | Update kernel pin reference to fragment |
| docs/usb-automount-parity.md | Update examples to new make target |
| docs/uboot-mainline-port.md | Update defconfig reference to fragment |
| docs/stock-reconciliation.md | Update defconfig references to fragments |
| docs/ssh-ftp-parity.md | Update defconfig references to fragments |
| docs/size-budget.md | Update defconfig reference to fragment |
| docs/samba-parity.md | Update defconfig reference to fragment |
| docs/rtc-parity.md | Update defconfig reference to fragment |
| docs/rt-beta-kernel.md | Update RT/base description to stacks |
| docs/reproducibility.md | Update defconfig reference to fragment |
| docs/renovate.md | Document new pin locations + golden case |
| docs/python-compat.md | Update defconfig references to fragments |
| docs/package-manifest.md | Update examples to new make target |
| docs/midi-mt32-parity.md | Update defconfig references to fragments |
| docs/main-shared-libs.md | Update defconfig reference to fragment |
| docs/logitech-pairing.md | Update example make target |
| docs/kernel-recon/worker-instructions.md | Update kernel pin reference to fragment |
| docs/init-parity.md | Update examples + overlay reference |
| docs/firmware-parity.md | Update defconfig references to fragments |
| docs/decisions/0029-de25-implementation-path.md | Add fragment-split addendum |
| docs/decisions/0024-mainline-uboot-capability-artifact.md | Update defconfig reference to fragment |
| docs/debug-tooling.md | Update references + strace note |
| docs/de25-readiness-ledger.md | Add status note re: fragment split |
| docs/db-json-versioning.md | Update defconfig reference to fragment |
| docs/ci.md | Document new lint-config + stack fingerprinting |
| docs/azcopy.md | Update defconfig references to fragments |
| docs/abi-contract.md | Update defconfig reference to fragment |
| CONTRIBUTING.md | Update kernel pin reference to fragment |
| configs/mister_rt.fragment | Reduce header; reference stacks + docs |
| configs/mister_kernel_defconfig | Delete monolithic kernel-only defconfig |
| configs/mister_installer_defconfig | Header cleanup; reference docs |
| configs/mister_initramfs_defconfig | Header cleanup; reference docs |
| configs/mister_de25nano_defconfig | Delete monolithic DE25 defconfig |
| configs/fragments/stacks.mk | New: stack-to-fragment registry |
| configs/fragments/kernel-only.fragment | New: kernel-only delta fragment |
| configs/fragments/golden.sha256 | New: golden resolved-config hashes |
| configs/fragments/de25nano.fragment | New: DE25 config fragment |
| configs/fragments/de10nano.fragment | New: DE10 board/toolchain/kernel fragment |
| configs/fragments/de10nano-image.fragment | New: DE10 image fragment (packages/system) |
| configs/fragments/common.fragment | New: shared policy fragment |
| board/mister/de25nano/linux.fragment | Update doc references to fragment |
| board/mister/de10nano/rootfs-overlay/etc/wifi-hotplug.sh | Comment reference updated |
| board/mister/de10nano/rootfs-overlay/etc/udev/rules.d/70-persistent-net.rules | Comment reference updated |
| board/mister/de10nano/post-image.sh | Update defconfig references to fragments |
| board/mister/de10nano/linux.config | Update comment reference to fragment/stacks |
| board/mister/de10nano/initramfs-post-build.sh | Comment reference updated |
| .github/workflows/renovate-hash-sync.yml | Add golden case + update paths |
| .github/workflows/release.yml | Use de10nano-defconfig in azcopy job |
| .github/workflows/build.yml | Add lint-config job; adjust dependencies |
| .github/actions/buildroot-build/action.yml | Fingerprint stacks + update cache keys |
Review details
- Files reviewed: 78/80 changed files
- Comments generated: 1
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Replace configs/mister_de10nano_defconfig, configs/mister_kernel_defconfig
and configs/mister_de25nano_defconfig with configs/fragments/:
common.fragment policy shared by every board and variant (8 symbols)
de10nano.fragment DE10 arch/ABI, headers series, kernel stanza (16)
de10nano-image.fragment DE10 board hooks, ext4 contract, packages, system
configuration (257 symbols + 10 explicit not-set)
kernel-only.fragment no init/shell/BusyBox, rootfs-tar (4)
de25nano.fragment DE25 developer OS, layered on common only (18)
stacks.mk which fragments form which configuration, in order
The Makefile now generates every .config the way `rt` always did:
merge_config.sh -m over the stack, then olddefconfig. `make
de10nano-defconfig` / `make de25nano-defconfig` replace the old
`make mister_*_defconfig`; the old names print a pointer and fail.
The kernel-only base is no longer a mirrored COPY of the main defconfig's
toolchain/kernel stanzas: the de10nano and de10nano-kernel stacks share
common + de10nano by construction.
Proved config-identical before deleting the monoliths: for all four stacks
(DE10 image, kernel-only, kernel-only + rt, DE25) the resolved .config
differs from the old path only in BR2_DEFCONFIG (savedefconfig's output
path, now output/defconfig) and BR2_EXTERNAL_MISTER_VERSION (git-describe
of a dirty worktree); `savedefconfig` output is byte-identical.
Long rationale comments move to docs/buildroot-config.md in a follow-up
commit; the fragments carry one-line section pointers plus WARNING lines
next to the trap symbols.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
…den)
scripts/check-kernel-defconfig-sync.sh now compares the MERGED TEXT of the
de10nano and de10nano-kernel stacks (configs/fragments/stacks.mk) instead
of two files, keeping all three of its asserts (shared-value agreement,
sentinels, choice-family name sets) and adding a structural one: every
toolchain/kernel family symbol must live in a fragment BOTH stacks use.
No Buildroot tree needed; still runs before any cache restore.
New scripts/check-config-fragments.sh (needs the pinned Buildroot tree;
config-only, no compile; ~4 s warm) regenerates every stack -- de10nano,
de10nano-kernel, de25nano and de10nano-kernel + each configs/mister_*.fragment
kernel variant -- and asserts:
(a) no symbol is defined by two fragments of one stack (merge_config.sh's
own "redefined" warnings are captured too); the rt fragment's kernel
version + patch-dir overrides are the one allowlisted exception;
(b) every fragment symbol survives olddefconfig verbatim;
(c) the resolved de10nano and de10nano-kernel configs agree outside a
named list of designed divergences;
(d) the sha256 of each NORMALISED resolved .config equals
configs/fragments/golden.sha256 for the pinned Buildroot version.
The four recorded goldens are byte-equal to the normalised hashes of the
configs the OLD monolithic path produced (measured before the split).
Also: drop the duplicate BR2_PACKAGE_STRACE=y from the debug-tooling block
(T5 made strace permanent; the duplicate was a redefinition (a) rejects and
a kconfig "override: reassigning" warning) and keep
BR2_TARGET_GENERIC_ROOT_PASSWD per image fragment rather than in common, so
both CI toolchain-fingerprints stay byte-identical to the pre-split ones
(no cache bust). Neither changes any resolved .config.
Other scripts that read the kernel pin / patch dir / mkfs contract by
filename now read configs/fragments/de10nano.fragment or
de10nano-image.fragment; scripts/lib/config-stacks.sh is the shared
stacks.mk parser.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
.github/actions/buildroot-build: the toolchain fingerprint reads the variant's fragment stack through scripts/lib/config-stacks.sh (main = de10nano stack, kernel variants = de10nano-kernel stack) -- the concatenated, stripped, sorted residue is byte-identical to what the old single defconfig produced, so neither host-toolchain cache key moves. The dl/ cache keys hash the stack's files explicitly. The main configure step is `make de10nano-defconfig`; release.yml's azcopy configure likewise. build.yml: new `lint-config` job (needs gate; build-kernel and build need it) running lint-kernel-patches.sh, check-kernel-defconfig-sync.sh and the new check-config-fragments.sh -- so a bad fragment fails in about a minute before any kernel leg or the 3h image build starts. Config-only: it unpacks the pinned Buildroot tarball and runs kconfig, no compile. `status` reports it and treats the downstream skips as the needs-cascade. renovate.json: the 6.18 kernel manager now matches the ONE file carrying the pin, configs/fragments/de10nano.fragment (the kernel-only stack shares it, so the "bumps half the repo" hazard is gone by construction); the fileCount/depCount note is re-derived (22/22, derived not measured). renovate-hash-sync.yml's path filter follows. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
… consumers docs/buildroot-config.md (new) carries the complete rationale that used to live as inline comments in the three monolithic defconfigs, the rt fragment and the initramfs/installer defconfigs -- every fact, measurement and citation, organised by fragment and section (§1 mechanism, §2-§9 one section per file, §10 the per-symbol placement decisions, §11 the checks, golden hashes and the identity proof). The fragments and the two standalone defconfigs keep one-line section pointers plus WARNING lines next to the trap symbols. Their symbol lines are untouched: the resolved .config of each (initramfs, installer, rt) was re-diffed against the pre-change baseline -- identical. Consumer sweep: README, docs/ci.md (variants, fingerprint, lockstep, new docs/rt-beta-kernel.md, docs/debug-tooling.md, the parity docs' line-number citations (now symbol-based), CONTRIBUTING.md, PLAN.md's layout tree, external.mk, board/* and package/* comments, board-expectations.sh. docs/de25-readiness-ledger.md §3/§4 get a dated status note (the file-path axis is wired; the tables stay as the verified record) and ADR 0029's "left open" item 2 an addendum. Dated records (kernel-recon records, TASKS.md, MISTER-KERNEL-PATCH-RECON.md, earlier ADR bodies) are left as history. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
…not-set typo Adversarial-review fixes to scripts/check-config-fragments.sh: - Normalisation keeps only SET symbols (`BR2_X=`; `is not set` lines are dropped, losslessly for drift) and strips kconfig's derived BR2_LINUX_KERNEL_VERSION alongside CUSTOM_VERSION_VALUE, so a Renovate kernel bump of ANY pin (6.18.y, rt 7.2.y, DE25) no longer moves the golden. olddefconfig now runs with HOSTARCH/HOSTCC_VERSION pinned on the make command line (x86_64 / 14), and the host-derived set symbols (HOST_GCC_AT_LEAST_*, *_ARCH_SUPPORTS, HOST_GO_BIN_HOST_ARCH, PROVIDES_HOST_RUSTC, the gcc>=8-gated gobject-introspection/host-qemu/ python-gobject family) are excluded belt-and-braces. Measured: the de10nano hash is identical for the real host (gcc 15), HOSTARCH=aarch64 and HOSTCC_VERSION 9/5/4.9. - (d): a pinned Buildroot version with NO golden lines is a ::warning (the new lines are printed ready to paste) so an automated Buildroot-bump PR still builds; a mismatch against a recorded line, or a single missing stack line for a recorded version, stays a failure. - (b): a `# X is not set` fragment line must come back as exactly that line (a typo'd symbol is absent in both forms and was invisible before). - (e) path consumers: every configs/fragments/<file> named in Makefile, scripts/, .github/ and renovate.json must exist, and action.yml's two hashFiles() lists must equal the DE10NANO / DE10NANO_KERNEL stacks -- a fragment rename with stacks.mk updated now fails instead of silently staling the dl-cache keys, Renovate managers and pin-reading scripts. New renovate-hash-sync case 8 (scripts/hash-sync-golden.sh): on a Buildroot bump, run the target branch's check-config-fragments.sh --update-golden against the freshly unpacked, hash-verified tree and commit the new golden lines in the same PR; never rewrites lines that already exist. Docs: rt fragment's TOFU caution restored to its original meaning; missing WARNING lines added (GLOBAL_PATCH_DIR, DE25 LINUX_KERNEL_PATCH, rt 0047 hunk, REPRODUCIBLE); the headers-series mis-cite fixed; stale prose in rt-beta-kernel.md, TASKS.md, MISTER-KERNEL-PATCH-RECON.md; DE25-pin/linux.hash symlink follow-up recorded in docs/buildroot-config.md §4. Golden file regenerated under the new normalisation. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
ed28783 to
de65906
Compare
Copilot review on #137: the first normalisation stage matched only ^BR2_[A-Z0-9_]+=, silently dropping the arch/CPU choice symbols (BR2_arm, BR2_cortex_a9, BR2_aarch64, BR2_cortex_a76_a55) from both the golden hash and the resolved-level lockstep diff. Now [A-Za-z0-9_]. Goldens regenerated for all four stacks; still host-independent. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
board/mister/de25nano/genimage-sdcard.cfg: MBR, p1 FAT32 'DE25BOOT' (u-boot.itb, Image, dtb, extlinux/extlinux.conf), p2 = rootfs.ext4 verbatim, no 0xA2 partition (that is the Cyclone V BootROM contract). MBR chosen fail-closed: the only observed DE25 boot is from an MBR card; the factory SPL contract names no partition-table symbol. post-image.sh generates extlinux.conf, runs genimage, fails without u-boot.itb unless DE25_ALLOW_NO_UBOOT=1. scripts/check-sdcard-de25.sh asserts table type, partition types/sizes/labels, the four p1 files, extlinux directives and kernel args, ext4 label/features/fsck, and the absence of any QSPI reference; dry run passes, the DE10 card is rejected with nine failures. docs/de25-sdcard.md records the interim p2 decision (ext4 rootfs directly), write procedure and first-boot checklist. lint.yml's shipped-script lists gain post-image.sh (covers the DE10's too, which was unlisted). Defconfig/Makefile wiring lands with the U-Boot track, which owns those files. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
board/mister/common/linux-mister.fragment (409 lines): the arch-neutral MiSTer driver/feature set lifted from the DE10's resolved config — HID and gamepads, USB, Bluetooth, the Wi-Fi driver set, sound, filesystems, netfilter, loop/overlay. Proven a NO-OP on the DE10 6.18.48 tree (zero redefinitions, resolved config identical) by the new scripts/check-kernel-fragment-noop.sh, which also passes on the 7.2.2 DE25 tree. board/mister/de25nano/linux.config (51 lines): minimal arm64 + Agilex 5 base in the DE10 style. Base and fragment share no symbol; all 460 lines survive olddefconfig. Measured on a kernel-only build in a scratch output dir: =m symbols 1,481 -> 92 (DE10: 92); installed modules 90 MB -> 2.4 MiB; Image 41.9 MB -> 20.7 MB. The two boards' installed module name sets are identical. The wave-1 arm64-defconfig kernel had joydev, uinput, hidraw, HID_NINTENDO/PLAYSTATION, xpad and HZ_1000 all OFF — invisible in a green build. docs/de25-kernel-config.md: per-subsystem rationale, what is deliberately off, the symbols not shared and why (FB_MISTER, audio, CMA, cpufreq...), the per-bump re-check list, and two obligations: openssh needs BR2_PACKAGE_OPENSSH_SANDBOX off once added (SECCOMP is off as on the DE10), and the DE25 selects no linux-firmware yet. The defconfig switch (custom config + fragment, delete de25nano/linux.fragment) lands with the U-Boot track's defconfig edit. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
… wired; kernel diet switched in u-boot.itb built by binman from mainline, shape-verified with dumpimage against the factory SPL contract: uboot @0x80200000, atf (BL31) @0x80000000 = entry, fdt-0, config board-0 default, crc32 only — no rsa, no required keys, addresses disjoint from the 0x82000000 FIT staging area. Reproducible: two runs byte-identical. QSPI cannot be written from this U-Boot: ENV_IS_IN_UBI, CMD_SF, CMD_MTD, DM_SPI_FLASH, MTD_UBI, ENV_IS_IN_SPI_FLASH/NAND are absent from the resolved config (deps unmet); CADENCE_QSPI, MTD, CMD_UBI, HANDOFF off; ENV_IS_IN_FAT 0:1 is the only env location. Notably stock's BOOTENV_DEV_QSPI contains 'saveenv && ubi part root' inside the default boot command — gated on CMD_SF, which is off, so the target and the string are gone; boot_targets=mmc0 only. HANDOFF off because dram_init would otherwise require a bloblist from OUR SPL at OUR BLOBLIST_ADDR, but the factory SPL runs; /memory declared 1 GiB. Board DTS for U-Boot (uboot-dts/): socdk aliases serial0 to uart0 and the DE25 console is uart1, so a minimal board dts + -u-boot.dtsi; mmc0 alias pinned; conservative mmc (4-bit, 50 MHz, no UHS). One carried, upstreamable patch guards CFG_EXTRA_ENV_SETTINGS's mtdids/mtdparts reference for MTD-less configs. §8 Q6 closes negative: '# CONFIG_SPL is not set' removes BINMAN and the FIT; SPL is compiled but nothing of it ships. Hashes: U-Boot tarball .sig verified (Tom Rini); TF-A tag anchored TOFU on its commit from two clones. Defconfig: also switches the kernel to board/mister/de25nano/ linux.config + board/mister/common/linux-mister.fragment (c2ab0c9) and deletes de25nano/linux.fragment; wires the card image (host genimage/ mtools/dosfstools, post-image.sh). make de25 asserts Image, dtb, rootfs.ext4, bl31.bin, u-boot.itb and sdcard-de25.img; stat follows symlinks. Verified: make de25 green, check-sdcard-de25.sh all assertions passed on the real artefacts. docs/de25-uboot.md has the fragment rationale, dumpimage listing, QSPI audit table, boot flow and first-boot serial expectations. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
…k one is not Compile-verified: 0100 applied to pristine 6.18.48, ARCH=arm64 with the DE25 toolchain, init/do_mounts.o and drivers/block/loop.o build clean. It does not apply to 7.2.2 (one context hunk: load_ramdisk= removed), which is version drift, not an architecture problem. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
…ct, bloblist off Fable boot-path review: with no cdns,phy-* values, U-Boot proper drove the SD PHY with sdhci-cadence6.c's built-in defaults, which no Agilex 5 board has been validated with, at 50 MHz high-speed — the factory SPL reads u-boot.itb with vendor timing and our driver then re-inits the PHY. Now: the socdk-u-boot.dtsi sd-ds/sd-hs PHY delays (SoC-level, not the board vqmmc fact) copied verbatim, cap-sd-highspeed dropped, max-frequency 25 MHz. de25-uboot.md §5.1 gives the symptoms, the diagnosis order and the one-line lift once dd of the card is clean. CONFIG_BLOBLIST off: its fixed 0x7e000+0x1000 window overlapped TF-A's secondary-CPU handshake words at 0x7EFF0/0x7EFF8; unused with HANDOFF off; build verified, u-boot.itb still produced (728,176 B, crc32-only, addresses unchanged). Docs: linux_qspi_enable IS run by board_prep_linux() — the argument is the CADENCE_QSPI gate; card ships no uboot.env; BL31 prints on UART0, so no NOTICE: BL31 lines are expected on the header UART. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
Fable boot-path review: a FIT recompiled with sha256,rsa2048 + required keys passed the checker, as did 4 KiB of urandom named u-boot.itb, and a stray boot.scr (which distro boot executes the moment extlinux fails) or uboot.env was merely 'informational'. Now: p1's u-boot.itb must be byte-identical to images/u-boot.itb, dumpimage must show uboot @0x80200000, atf @0x80000000, fdt-0, a default config and a crc32 signature algo, and the decompiled FIT must contain no rsa/required/sha<n>; p1 may hold nothing beyond the four expected entries. dumpimage/dtc resolved from the Buildroot host dir, exit 2 if absent. Real card passes; m1 (uboot.env), m2 (rsa FIT), m3 (garbage FIT) and m5 (boot.scr with sf erase) all fail. docs/de25-sdcard.md: extlinux search path settled [V], BL31 silence on uart1 expected, uboot.env question settled: no. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
… the diet
Renovate's rt bump moved board/mister/de10nano/patches/linux/linux.hash from
7.2.2 to 7.2.3. That file is the DE25's hash registry too (the board's
patches/linux/linux.hash is a relative symlink into it), and the sync script
REPLACES the 7.2.y line rather than adding one -- so the hazard
docs/buildroot-config.md filed as a "known follow-up" stopped being
hypothetical. configs/fragments/de25nano.fragment already carries 7.2.3 from
the rebase base; this commit makes the rest of the tree say so and, more to the
point, re-runs the evidence at the new pin instead of assuming it carried over.
Re-verified on a linux-dirclean rebuild against a freshly downloaded,
hash-verified linux-7.2.3.tar.xz (make de25, green, card checker included):
- carried patch series: 34/34 applied at Buildroot's patch -F0, zero fuzz,
zero rejects. 79 hunks relocated by line OFFSET only, which -F0 permits
(-F caps context fuzz, not displacement).
- kernel diet: 460 asked-for symbols (51 base + 409 shared fragment), ZERO
dropped from the resolved config; zero merge_config redefinitions.
- 92 =m symbols / 91 installed .ko.xz / 2,565,868 B of modules -- unchanged,
and the installed module NAME SET is still exactly the DE10's (91 vs 91,
empty diff both directions against output/build/linux-6.18.48).
- check-kernel-fragment-noop.sh still PASSes on the DE10 tree.
- u-boot.itb and bl31.bin are byte-identical to the 7.2.2 build, as they must
be: nothing in the bootloader half depends on the kernel version. The board
.dtb is byte-identical too, so mainline's socfpga_agilex5.dtsi did not move
in the point release. Image differs (a stable-tree release changes code)
while coincidentally keeping the same length.
All four golden hashes are unchanged: the normalisation deliberately drops the
two kernel-version symbols, so a pin bump must not move them, and does not.
Doc changes are the pin statements only. Dated measurements keep their 7.2.2
provenance and say so; the dtbs_check warning count was NOT re-run at 7.2.3 and
is labelled accordingly. Nothing here has been on hardware at 7.2.3.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
The shared kernel fragment sets MODULE_COMPRESS_XZ but the DE25 stack did not set BR2_PACKAGE_HOST_KMOD_XZ, so build-time depmod silently produced a 0-line modules.dep and a 1-line modules.alias — the exact trap docs/buildroot-config.md §3.5 records for the DE10. Found by the rebase pass. After host-kmod-dirclean + make de25: modules.dep 91 lines, modules.alias 1,204, card checker passes. Golden refreshed for the de25nano stack only. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
… exists Copilot review on #138: the bl31.bin/u-boot.itb assertions ran unconditionally, so the documented kernel/rootfs-only escape hatch could never succeed, and the card branch reported 'no u-boot.itb' whenever the variable was set even if a FIT had been built. Now the env var only matters when u-boot.itb is absent: with a FIT present the recipe behaves exactly as without the variable. check-kernel-fragment- noop.sh: comment explaining that exported srctree is what lets conf find Kconfig from the scratch dirs (the check runs and passes). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
The previous commit's if-block began with a literal '@' inside a continued shell chain, which make passed through as a command (exit 2). Verified: make -n de25 | bash -n clean for both variants, make de25 green end to end. Adds the srctree comment the previous message described. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
echo "" \ + fi parsed as one command; now echo ""; \ then fi. Proven: make -n de25 | bash -n clean for both variants, make de25 green end to end (bl31, FIT, card all reported; checker passes). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
DE25-Nano wave 2: U-Boot/TF-A, bootable card image, kernel diet, 7.2.3 (stacked on #137)
There was a problem hiding this comment.
🟡 Changes recommended
The DE25 skip path can expose a stale bootable-card artifact, and several new script and documentation paths are currently incorrect.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
- Files reviewed: 96/98 changed files
- Comments generated: 4
- Review effort level: Balanced
- post-image.sh: the DE25_ALLOW_NO_UBOOT skip path now removes any stale sdcard-de25.img / boot-de25.vfat so the de25 recipe cannot report a card this run did not produce (tested: stale file removed). - check-kernel-fragment-noop.sh: canonicalise --fragment before the cd into the scratch dir (tested with a relative path). - buildroot-config.md §10: BR2_PACKAGE_HOST_KMOD_XZ is set by both board fragments, each for its own depmod of the shared fragment's .ko.xz; not in common for the rule-4 reason. - rt-beta-kernel.md: rt row names the 7.2.3 pin and the de10nano-kernel fragment stack instead of the deleted defconfig. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
…-goal Owner decision 2026-09-02: SMMU-off is the intended configuration, for DE10 parity (Cyclone V has no SMMU) and because it is the precondition for mainline stratix10-svc to program the fabric at all — mainline hands the SDM physical addresses. Records the iommu.passthrough=1 runtime equivalent for the hardware session, that SMMU-off is unproven not disproven (U10), and the re-open triggers. implementation-path §3.1 carries a superseded note (smmu okay; svc override); the DTS rationale §4 links the decision. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
Clean-tree rebuild is byte-identical to itself (uboot-dirclean rerun), but differs from the wave-2 tree's FIT by 8 bytes inside the uboot payload with the same resolved config; cause not identified, boot contract unaffected. Sizes/hashes updated; D2.8 should verify with two clean CI builds before publishing attested hashes. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm
Summary
The Buildroot configuration moves from three monolithic defconfigs to merged fragment stacks, generated at config time exactly the way the
rtvariant already worked, and the monoliths are deleted (owner decision: "merge at config time and delete the monolith"). ~2,000 lines of inline rationale move todocs/buildroot-config.md; the fragments keep one-line section pointers andWARNING:lines at the known traps.The bar was "provably no change to the DE10 build." Evidence:
.configfor the DE10 image, the kernel-only stack, the RT stack and the DE25, old path vs new path: identical exceptBR2_EXTERNAL_MISTER_VERSION(git describe) andBR2_DEFCONFIG(savedefconfig now writesoutput/defconfiginstead of clobbering a tracked file).savedefconfigoutputs byte-identical, all four.br-host-*cache key moves.Layout
de10nano(output/)common+de10nano+de10nano-imagede10nano-kernel(rt / CI kernel legs)common+de10nano+kernel-onlyde25nano(output-de25/)common+de25nanocommonis small on purpose: the DE25 is a bare developer OS by ADR 0027/0029, so the shared package set is not shared yet. The structure is what lets it move tocommonlater without touching the DE10 stack. The kernel-only stack now shares the board layer by construction; the mirrored copy thatcheck-kernel-defconfig-sync.shused to police is gone.New checks (
lint-configjob, gatesbuild-kernelandbuild, config-only, ~1 min)scripts/check-config-fragments.sh: (a) no symbol defined by two fragments; (b) every fragment line survivesolddefconfigverbatim, typo'dis not setlines included; (c) DE10 image vs kernel-only lockstep; (d) golden sha256 of the normalised resolved config per stack, keyed byBUILDROOT_VERSION; (e) every hard-coded fragment path in the Makefile, scripts, workflows andrenovate.jsonexists, and the action'shashFiles()lists equal the stacks. The golden is host-independent (proved atHOSTARCH=aarch64and host gcc 4.9/5/9/15) and bump-tolerant: kernel-pin bumps don't move it, and a Buildroot bump warns with the ready-to-paste lines whilerenovate-hash-synccase 8 refreshes them in the bump PR.Two adversarial review rounds ran 30+ mutations against the checks; the table and every finding's disposition are in
docs/buildroot-config.md§11 and the commit messages.Consumers updated
Makefile (
make de10nano-defconfig/de25nano-defconfig; old names are error stubs), buildroot-build action, build.yml, release.yml, renovate.json managers (validator passes), renovate-hash-sync, hash-sync scripts, lockstep check, tests, README/CONTRIBUTING/docs. ADRs and dated recon records keep their historical file names.Not done here
No full image build was run; the config-level identity proof is the deliverable and this PR's CI run is the first exercise of
lint-configon a fresh runner. Known follow-up (pre-existing): the DE25 kernel pin has no Renovate manager and shareslinux.hashby symlink.🤖 Generated with Claude Code
https://claude.ai/code/session_01FYjrnzEEu4HzJSPWNAaRvm