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
+5 -2
View File
@@ -344,8 +344,11 @@ second, less-structured log location.
**The disks (Captain Bob, 2026-10-26, the identity gate):** with no identity thumbdrive the system
is headless -- no prompt -- so every boot needs Zuse. `kernel/Makefile`'s `ARTDISK` and `ZUSEDISK`
default to the minted Zuse pair, `disk/zuse-scratch/artemis.img` and `zuse-thumb-ident.img` (a
pair: her genesis marker is on that Artemis disk; `disk/README.md`). Put both back as committed
(`git checkout -- disk/zuse-scratch`) before each architecture. The prompt is `[zuse@Hera] ok> `.
pair: her genesis marker is on that Artemis disk; `disk/README.md`). Since 2026-10-28 `ZUSEDISK`
is that pair laid out as a stick (`make ... zusestick`, `build/<arch>/kernel/zusestick.img`, made
fresh for every boot: identity and Artemis partitions on one USB disk, STICK.md §4); `ARTDISK`
stays the pair's Artemis file. Put both back as committed (`git checkout -- disk/zuse-scratch`)
before each architecture. The prompt is `[zuse@Hera] ok> `.
Do not claim a change is accepted until all three architectures have booted, and their logs are
present in `logs/`:
+10
View File
@@ -160,6 +160,16 @@ carrying timestamp noise in git history.
`thumbdrives/zuse-thumb-ident.img`, which stay blank (that call is Captain
Bob's).
**As a stick (2026-10-28, `docs/v4.0.0/plans/2026-10-27-stick-4-one-disk.md`,
R1):** the QEMU boots no longer attach `zuse-thumb-ident.img` raw. `make -f
kernel/Makefile ARCH=<arch> zusestick` lays the pair out as a StarshipOS
stick (`build/<arch>/kernel/zusestick.img`: an identity partition holding
this identity image's bytes, an Artemis partition holding this Artemis
image's bytes, each exactly its file's size), fresh before every boot, and
that is `ZUSEDISK`'s default; `make boot_image TARGET=PC
STICK_PAIR=disk/zuse-scratch` puts the pair in the PC stick the same way.
The files here are unchanged. Increment 5 retires the pair.
- **The StarshipOS stick and data stick are not here** (2026-10-27,
`docs/v4.0.0/STICK.md` §4, §9): they are build output, made fresh by
`make boot_image TARGET=PC` (`build/boards/pc/lithos-pc.img`: ESP, StarshipOS
@@ -310,3 +310,38 @@ drives), §5 items 1, 2 and 5, §9 (entropy, parity), §11 increment 4.
- the seven GPT modes.
- [ ] **Step 5:** Suite; full acceptance; commit `feat(kernel): Artemis and Zuse from one disk --
the stick; virtio Artemis leaves v4` with the logs.
### Task 5: `screen=boot` -- the console on the screen until login (added 2026-10-28)
Captain Bob, 2026-10-28: "yes, add screen=boot at the end of increment 4" -- for the SER5 smoke
test after Task 4, which has no serial port: today the v4 boot turns the screen's console mirror off
after POST (`sk_v4_block_chain`, `console_fb_mirror(0)`), so a failure after POST shows a black
screen.
**Files:**
- Modify: `kernel/include/starkernel/kernel_args.h` (`int screen_boot;` in `KernelArgs`, before
`raw`; check `boot_info_offsets.h` -- `args` is the last field it may name, `BootDisk` comes after)
- Modify: `kernel/src/boot/cmdline.c` (`screen=boot`, with or without `--`, as `system=` is parsed;
the last one wins; any other `screen=` value is ignored)
- Modify: `kernel/src/kernel_main.c` (`sk_v4_block_chain`: with `screen_boot`, the mirror stays on
and the line `Screen: the console stays on until login (screen=boot)`; without it, as today)
- Modify: `scripts/qemu_session.py` (mode `screen_boot`)
- Modify: `boards/BRINGUP.md` (the PC section: the smoke test's `starforth.cfg` is
`system=v4 screen=boot`, Secure Boot off)
**Behaviour:**
- Before the first login only. Login draws the console as today; a logout darkens the screen as
today (`screen=boot` is for watching a boot, not a way round the identity gate: the screen shows
what serial shows, and nothing can be typed without Zuse).
- Default (no argument): unchanged -- `screen_dark_until_login` still passes.
- v3 (`system=v3`): unchanged.
- [ ] **Step 1: Failing test.** Mode `screen_boot` (amd64, `KERNEL_ARGS=screen=boot`, no drive):
the `Screen:` line; 30 s after POST the screen is not black (at least 500 lit pixels, as
`screen_console_after_login` counts); no `ok> `. Today: FAIL.
- [ ] **Step 2:** Run: FAIL.
- [ ] **Step 3:** Implement.
- [ ] **Step 4:** `screen_boot` passes on amd64 and aarch64 (riscv64's ramfb too, if the mode's
screendump works there); `screen_dark_until_login`, `screen_dark_after_logout`, `zuse` pass.
- [ ] **Step 5:** Suite; full acceptance; commit `feat(kernel): screen=boot keeps the console on the
screen until login -- for watching a PC boot` with the logs.
+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 \

Some files were not shown because too many files have changed in this diff Show More