Autonomous UART observer: physical READY boundary
Evidence class: physical board UART runtime, with a separate limited private
camera observation. Source revision 11d49eb0f72d28c0f9cdc070fea4662410451c10;
integration branch integrate/mainline-probe-path, bounded base 65578ff2.
The coordinator held the build slot, then the board/serial reservation.
The matching observer bundle is /nix/store/16cpjjiifxgwyb6bndhi39vfmlvcdw6h-k230-mainline-uart-observer-boot-files; system
/nix/store/k1zjqdn4ks7b5dd7b3py6cavhf85g6j6-nixos-system-nixos-26.11.20260919.20b1ddd. Kernel remains the tested 9vdk79… / Linux
7.3.0-rc5. Exact public artifact/source digests and immutable paths are in
result.json. The original five-clock SD1 support is retained;
no clk_ignore_unused, kernel patch, persistent boot selection or normal
profile change was introduced by this diagnostic.
Preparation and command
The first wrapper build failed because cp -a retained a read-only output
directory. The corrected wrapper built, but controller preparation rejected
its missing helper in the system-derived closure inventory. Both were caught
before UART. The optional system now retains the same helper through
system.extraDependencies; the final rebuilt bundle passed standard matching
Image/DTB/ramdisk/hash/CRC checks and the controller’s full actual archive and
closure checks. These preparation limits and fixes are recorded in
the host note.
The native helper’s 18 tests and controller’s 26 tests passed on the integrated
source. No tests were repeated to claim a physical result. Under the build
lock, nix build .#kernelMainlineUartObserverBootFiles --no-link --print-out-paths --max-jobs 1 --cores 16 passed. Actual initrd inspection
verified the ELF64 little-endian RISC-V helper, exact version marker/drop-in
and unchanged original debug unit. Both the kernel Image and normalized DT
hardware remained equal to the proven base. Four new closure paths (634 total
bundle closure, 630 system inventory) were exported and staged; transfer SHA,
store import, separate observer GC root and staging script returned RC=0.
From the integration worktree, with Python3.14 and dtc tools:
nix shell --inputs-from . nixpkgs#dtc --command \
python3 tools/mainline-drm-uart-observer-trial.py \
--bundle /nix/store/16cpjjiifxgwyb6bndhi39vfmlvcdw6h-k230-mainline-uart-observer-boot-files \
--manifest "$HOME/tmp/k230-mainline-uart-observer-board/candidate-manifest.json" \
--normal-report "$HOME/tmp/k230-mainline-uart-observer-board/normal-report.json" \
--blkid-result "$HOME/tmp/k230-mainline-blkid-board/trial-result.json" \
--log "$HOME/tmp/k230-mainline-uart-observer-board/observer-uart.log" \
--result "$HOME/tmp/k230-mainline-uart-observer-board/observer-result.json"
Observation and limits
Protected normal preflight passed before the volatile boot; each U-Boot load
and CRC and printed volatile bootargs passed the controller’s checks. Fresh
mainline and systemd 261.2 banners were observed. One complete, fresh, CRC-checked
sequence 0 READY frame (83 payload bytes) was observed. It reports the guard
marker, main shell PID and 12-second window. The matched helper emits this only after
its initial guard and getter operation finish; this narrows the observed stop
but does not publish any counter values or identify a kernel cause.
No before/after/return frame or primary shell prompt followed. The host
reception gate therefore sent zero receipt commands. Return acknowledgement
was unknown after 60 seconds; passive recovery continued to the 180-second bound after READY.
No new SPL/normal boot was observed. The controller exited 2 with
recovery-required-unknown; no candidate input or reboot retry followed.
Final UART write timestamp: 2026-10-03T06:15:42.034494+00:00. Controller result written: 2026-10-03T06:18:42.042507+00:00.
Private raw UART: 53,905 bytes, SHA256
7fefbf17759b9ea8accd808a3e6cb9fcdf92ad811cb730eba62118450ddd8427. Its final printed kernel timestamp is 8.103408.
The raw log, volatile nonce/boot IDs and transfer URL remain private.
A separately reserved C920 camera capture showed boot text with glare; it does
not establish readable candidate identity, a usable root, or deliberate touch.
That private frame is not published.
The user pressed reset. Protected normal postflight passed with a fresh boot ID, the exact system/profile/kernel/init, three active shell services, all eight unchanged protected boot hashes and registration-marker absence. Qualified normal Home IPC returned RC=0, and a separately reserved private camera frame visually showed Home icons, clock and background. Glare limits detail; it is not published and is not a mainline/touch proof. This proves operator-reset recovery; automatic return from the observer remains UNVERIFIED. Task 5b.5 remains open: ordinary usable mainline root, panel photograph, deliberate glass touch and protected return are not satisfied by READY or host checks. Further source review must distinguish helper early exit, kernel progress/console output and RX delivery; none is claimed as the cause here.