Coherent-shell physical boot verification, 2026-10-01
The matching current vendor-kernel candidate reaches serial/root and starts shell, seatd, Rust UI, PipeWire and WirePlumber, but initial camera output appears dark after compositor startup. It was not selected persistently. The original boot files and system profile are unchanged, normal boot restored visible Home, and the latest runtime system was reactivated on the working booted kernel. Visible navigation acceptance remains unresolved, with successful recovery; this is not a shipped persistent update.
Identities and procedure
Source master: 02c4a99850e6cc8a262480d21a17cb7f6dc2b019 (documentation differences since source build only). Runtime/candidate system: /nix/store/xphf8zb00gz9hiyqkkh399rldr2ljykb-nixos-system-nixos-26.11.20260919.20b1ddd. Matching candidate kernel: /nix/store/03zyl0mjsxbjyisb3lhjaxswpxm71ap6-linux-riscv64-unknown-linux-gnu-6.6.36-xuantie/Image. Matching initrd: /nix/store/vrkzpx829rh8wqi0jpqzbw88smn9k8gl-initrd-linux-riscv64-unknown-linux-gnu-6.6.36-xuantie/initrd.
The DTB is built with nix build .#deviceTree --no-link --print-out-paths --max-jobs 1 --cores 2, yielding /nix/store/yfda1lasmlgyappdgf6f49g7yj7m8mjd-k230-tdisplay.dtb; native fdtput puts the candidate system’s exact init= into /chosen/bootargs, and bootargs.txt matches it. stage-candidate.py copies the installed immutable Image/initrd and wraps that initrd in a CRC-checked legacy U-Boot ramdisk header. The old DTB, captured over serial and decompiled with native dtc, differs from the candidate only in the explicit init path; this does not isolate a kernel root cause.
Staging used a curated temporary local HTTP transfer, with SHA256 verification before running the committed staging source. Private transfer endpoint is omitted. Staging requires the installed candidate system, matching kernel, expected ext4/root label and boot source, free space and an absent /nix-path-registration; it saves original profile and all normal boot/selector files under /var/lib/k230-normal-boot-20261001/backup without modifying them. result.json retains exact candidate/backup sizes, SHA256 and CRC32.
Physical controller invocation: python3 ~/tmp/k230-coordination/boot-trial.py candidate. serial-trial-controller.py is the source artifact; it imports the repository’s tools/ums-session.py, owns /tmp/k230-board.lock, and uses CR-only U-Boot commands. After reboot/autoboot interruption it checks mmc/normal environment, then each load’s exact count and memory CRC. Root-partition candidate args, Image, DTB and initrd use 0x7000000, 0x200000, 0x8400000 and 0x9000000; the unchanged boot-partition OpenSBI wrapper uses 0x8000000. The exact 211-byte args import precedes bootm 0x8000000 0x9000000 0x8400000. No saveenv, boot selector, persistent system profile or normal boot file was changed. This manual path omits the normal bootcmd’s DT selector step. The agent read the pinned U-Boot k230_board_common.c:495–552: with force_dtb present it loads selector text and saves the environment, without panel/DSI initialization. k230_logo.c initializes display in last_stage_init before autoboot or an explicit logo command; bootm fixup uses the same logo-ready state for a manual boot. This source does not support attributing the black display to omission of the selector. A controlled working-kernel manual baseline is still useful before diagnosing a kernel regression.
The serial transcript captures Linux 6.6.36, the new exact init/system, a new boot ID and active services. Camera output shows boot text initially and then a dark screen after startup. Subsequent native capture found a Foot terminal, not proof of a hung display. Latest userspace on the old working kernel showed photographed Home after explicit card_shell home; a repeat matching-current-kernel trial still showed Foot in the native capture despite an initial Home request. This is not sufficient to isolate a display-driver root cause. Candidate DSI reads time out, but the DMA-BUF/scan-out debug messages also occur on the successfully restored normal system, so those messages alone are not causal proof. An extended diagnostic command stopped at systemctl’s pager and hit its command deadline; the subsequent serial operator escaped it and rebooted successfully. No hard kernel lockup is claimed from that command timeout.
Restore invocation: python3 ~/tmp/k230-coordination/boot-trial.py restore, which resets from U-Boot into unchanged normal files. normal-boot-restore.txt proves old explicit boot init /nix/store/x1xbs5qdb5gn91j6s7gsi8mg18qra5ah-nixos-system-nixos-26.11.20260919.20b1ddd/init and original persistent profile /nix/store/r0knnb72k3p3mpmbsnfgrk66yg8gl144-nixos-system-nixos-26.11.20260919.20b1ddd. restore-verify.txt records the original five protected boot hashes and booted /nix/store/p6z5nsr2dyb1kfjk1hkzh9vb2nha0ka6-linux-riscv64-unknown-linux-gnu-6.6.36-xuantie/Image; restored Home is photographed. Finally /nix/store/xphf8zb00gz9hiyqkkh399rldr2ljykb-nixos-system-nixos-26.11.20260919.20b1ddd/bin/switch-to-configuration test restores the latest UI/backend fixes, without a persistent boot claim.
Physical photographs and limits
Photographs use host V4L2 /dev/video0, MJPEG 1280x720 and FFmpeg -vf 'crop=900:600:380:120,transpose=2,transpose=2' -frames:v 1 -q:v 2. normal-candidate-panel.jpg shows the black candidate; normal-restored-panel.jpg shows original Home; runtime-restored-panel.jpg records the initially dark terminal after runtime activation; runtime-home-panel.jpg shows actual Home after explicit navigation, and normal-baseline-panel.jpg shows the successful old-kernel manual baseline. normal-candidate2-late-panel.jpg records the repeat current-kernel trial, whose visible navigation remains unresolved. Files retain capture timestamps. These are camera observations, distinct from native screenshots, injected contacts or a human finger test. No deliberate touch, audible output, cold unplug/replug, mainline boot or new theme trial is claimed here. Sanitized serial transcripts remove terminal controls, network addresses and network/secret-bearing lines; private originals remain outside the repository.
Remaining gate
the-coherent-shell-boots-the-selected-system preserves the matching normal boot deployment work: resolve the ambiguous dark initial route and qualify visible navigation, prove a coherent normal boot with visible usable shell, then select it persistently with backup/rollback and prove an ordinary reboot selects the same system/kernel/initrd. The separate mainline DRM trial is still unperformed at this checkpoint.