test(build): Zuse's minted pair as a stick -- the acceptance boots and the sessions use it

mkdiskimage.sh --starship-from IDENT ART lays a minted pair out as a StarshipOS stick: an identity
partition holding IDENT's bytes and an Artemis partition holding ART's, each exactly its file's
size (Artemis's signature and fence are placed from the volume's size). kernel/Makefile: a
zusestick target, made fresh for every boot, is ZUSEDISK's default (ZUSE_PAIR names the pair);
STICK_PAIR puts the pair in the PC stick. qemu_session.py's Zuse drive is the pair as a stick.
check_images.sh checks both forms byte for byte against the pair (60 PASS).

On today's kernel all 23 sessions pass on the Zuse stick, and acceptance: amd64, aarch64,
riscv64 to [zuse@Hera] ok>, POST 538/538, dict_hash 0xfec8c47cfc6f437f; v4 suite and test-32
0 failures. The plan gains Task 5, screen=boot (ruled 2026-10-28).

Plan: docs/v4.0.0/plans/2026-10-27-stick-4-one-disk.md, Task 1 (R1 as recommended).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
rajames
2026-10-28 08:41:51 -04:00
co-authored by Claude Opus 5.5
parent b2278b6204
commit 38b2b9693a
59 changed files with 4350 additions and 14 deletions
+22 -5
View File
@@ -162,7 +162,13 @@ XHCI_ARGS_SLOT4 := $(if $(strip $(XHCI_QEMU_ARGS)),$(XHCI_QEMU_ARGS),$(XHCI_D
# xhci_poll_events() alone is purely hotplug-event-driven and would never
# see a device present before controller reset. Override to "" (empty) to
# boot without Zuse attached, e.g. `make -f kernel/Makefile qemu ZUSEDISK=`.
ZUSEDISK ?= disk/zuse-scratch/zuse-thumb-ident.img
# Since 2026-10-27 (docs/v4.0.0/plans/2026-10-27-stick-4-one-disk.md, R1) the default is the
# Zuse stick: the minted pair in ZUSE_PAIR laid out as a StarshipOS stick (`zusestick`, made
# fresh for every boot), identity and Artemis partitions on one disk, as STICK.md 4 has them.
ZUSE_PAIR ?= disk/zuse-scratch
ZUSESTICK_IMG = $(BUILD_DIR)/zusestick.img
ZUSEDISK ?= $(ZUSESTICK_IMG)
ZUSESTICK_DEP = $(if $(filter $(ZUSESTICK_IMG),$(ZUSEDISK)),zusestick)
# Precomputed (not inlined as $(if ...,...)) because the drive/device specs
# below are comma-heavy and GNU make's $(if) function splits its own
# arguments on every top-level comma -- inlining it silently truncated the
@@ -242,6 +248,9 @@ STICK_ESP_MIB := 64
STICK_IDENT_MIB := 500
DATASTICK_MIB := 1536
DATASTICK_IMG = $(BUILD_DIR)/datastick.img
# STICK_PAIR -- a minted pair (e.g. disk/zuse-scratch) whose identity and Artemis images become
# the PC stick's partitions, byte for byte, instead of a blank identity and a fresh Artemis.
STICK_PAIR ?=
# ==============================================================================
# TOOLCHAIN
@@ -781,6 +790,12 @@ datastick: $(MKARTEMIS_BIN)
@bash scripts/mkdiskimage.sh --out $(DATASTICK_IMG) --table gpt --size-mib $(DATASTICK_MIB) \
--label DATASTICK --starship $(STICK_IDENT_MIB) --mkartemis $(MKARTEMIS_BIN) --esp-mib 0
# zusestick -- Zuse's minted pair as a stick, fresh every time it is made (the ZUSEDISK default).
.PHONY: zusestick
zusestick:
@bash scripts/mkdiskimage.sh --out $(ZUSESTICK_IMG) --table gpt --label ZUSESTICK --esp-mib 0 \
--starship-from $(ZUSE_PAIR)/zuse-thumb-ident.img $(ZUSE_PAIR)/artemis.img
# Generate capsule_generated.c from capsules/
CAPSULE_SRCS := $(shell find $(CAPSULES_DIR) -type f ! -name '.*' 2>/dev/null)
$(CAPSULE_GENERATED): $(MKCAPSULE_BIN) $(CAPSULE_SRCS)
@@ -1005,7 +1020,7 @@ QEMU_DISPLAY ?= gtk
# above) to give real ports to Zuse plus every identity drive attached this way.
QEMU_EXTRA ?=
qemu: all $(DATASTICK_DEP)
qemu: all $(DATASTICK_DEP) $(ZUSESTICK_DEP)
ifeq ($(ARCH),amd64)
@echo "=== Building ISO (amd64) ==="
@mkdir -p $(BUILD_DIR)/iso
@@ -1370,7 +1385,7 @@ $(RPI5_NATIVE_IMG): $(RPI5_NATIVE_ELF)
# everything else is the Pi 5 image. One QEMU, foreground, serial to
# logs/<TS>/aarch64-rpi5/ (2026-10-14, FABRIC-3.md SXXXIX).
.PHONY: rpi5-rehearsal
rpi5-rehearsal:
rpi5-rehearsal: $(ZUSESTICK_DEP)
@if [ "$(ARCH)" != "aarch64" ] || [ "$(RPI5_NATIVE_BASE)" != "0x40080000" ]; then \
echo "rpi5-rehearsal: ARCH=aarch64 RPI5_NATIVE_BASE=0x40080000"; exit 1; fi
@rm -f $(RPI5_NATIVE_ELF) $(RPI5_NATIVE_IMG)
@@ -1421,8 +1436,10 @@ boot_image: all $(if $(BOARD_STICK),$(MKARTEMIS_BIN))
@# stick (A6); KERNEL_ARGS after it, and a later system= wins.
@printf '%s\n' 'system=v4 $(KERNEL_ARGS)' > $(BOARD_OUT)/starforth.cfg
@bash scripts/mkdiskimage.sh --out $(BOARD_OUT)/$(BOARD_IMAGE) --table gpt \
$(if $(BOARD_STICK),--size-mib $(STICK_IMAGE_MIB) --starship $(STICK_IDENT_MIB) \
--mkartemis $(MKARTEMIS_BIN) --esp-mib $(STICK_ESP_MIB),--size-mib $(BOOT_IMAGE_SIZE_MIB)) \
$(if $(BOARD_STICK),$(if $(STICK_PAIR),--esp-mib $(STICK_ESP_MIB) --starship-from \
$(STICK_PAIR)/zuse-thumb-ident.img $(STICK_PAIR)/artemis.img,--size-mib $(STICK_IMAGE_MIB) \
--starship $(STICK_IDENT_MIB) --mkartemis $(MKARTEMIS_BIN) --esp-mib $(STICK_ESP_MIB)), \
--size-mib $(BOOT_IMAGE_SIZE_MIB)) \
--label LITHOS \
$(LOADER_EFI):/EFI/BOOT/$(EFI_BOOTNAME) \
$(BOARD_OUT)/startup.nsh:/startup.nsh \