wip(build): acceptance boots a fresh data stick -- every run is a first boot (#92, Task 3) [skip ci]

Not yet accepted (plan 2026-10-29-stick-5, Task 3).
- kernel/Makefile: a v4 `qemu` boot attaches a fresh data stick
  (DATASTICK=1) and nothing else; ARTDISK/ZUSEDISK keep the minted pair only
  for system=v3 (QEMU_V3_BOOT, from KERNEL_ARGS).
- qemu_session.py: the Makefile's defaults for every mode but those that ask
  for the pair by name (stick_artemis, two_sticks, artemis_unsigned,
  raw_ident, v3_keys) or for no drive; `zuse` now expects the genesis line.
- nightly.sh: accept stick-high runs stick_genesis (the stick as built).
- .claude/CLAUDE.md "The disks", the stick-high line; disk/README.md (the
  pair: tests and v3 only); STICK.md 11, increments 3 and 5 done.

Before the change: zuse on amd64 FAIL -- the pair's "identity confirmed",
no genesis line (logs/20261108-130732).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
This commit is contained in:
Claude
2026-11-08 13:13:25 +00:00
parent ec9eb5f225
commit 9d6410c06f
8 changed files with 227 additions and 30 deletions
+15 -11
View File
@@ -291,8 +291,9 @@ The vendored hosted `make` build (above) is NEVER used to validate kernel change
make -f kernel/Makefile ARCH=amd64 clean qemu
make -f kernel/Makefile ARCH=aarch64 clean qemu
make -f kernel/Makefile ARCH=riscv64 clean qemu
# ...the PC stick loaded above 2 GiB, as a PC's firmware loads it (pc machine, 3 GiB; with
# Zuse's pair in the stick: scripts/qemu_session.py stick_zuse amd64 --target qemu-stick-high):
# ...the PC stick loaded above 2 GiB, as a PC's firmware loads it (pc machine, 3 GiB; the stick as
# built, its first boot minting its own Zuse: scripts/qemu_session.py stick_genesis amd64
# --target qemu-stick-high):
make -f kernel/Makefile ARCH=amd64 clean qemu-stick-high
# ...and the 32-bit build -- v4 with 32-bit cells, the F18/Zynq (FPGA) case: its nucleus
# image and every v4 test at that width (no QEMU; not a substitute for the boots above):
@@ -326,14 +327,17 @@ audit artifacts — they are committed to the repo. Do not delete them. There is
timestamped convention (self-documented via its own README); not a contradiction, just a
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`). 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. v3 reads identity drives raw, never through a GPT, so a `system=v3`
boot needs `ZUSEDISK=disk/zuse-scratch/zuse-thumb-ident.img` (a copy) to log Zuse in. Put both back as committed (`git checkout -- disk/zuse-scratch`)
**The disks (plan 2026-10-29-stick-5, Task 3, 2026-11-08):** with no identity the system is
headless -- no prompt -- so every boot needs Zuse. A v4 `qemu` boot attaches a **fresh data stick**
(`DATASTICK`, `make ... datastick`, `build/<arch>/kernel/datastick.img`: identity and Artemis
partitions, made fresh for every boot) and nothing else: its first boot mints the stick's proxy
Zuse (STICK.md §6), so **every acceptance run is a first boot** -- plug and play. `DATASTICK=`
boots v4 with no drive (headless). The minted Zuse pair (`disk/zuse-scratch/`, `disk/README.md`)
is for the tests that ask for it by name (`scripts/qemu_session.py`: `stick_zuse`, `two_sticks`,
`stick_artemis`, `raw_ident`, `v3_keys`, the hot-plug and GPT modes) and for `system=v3`, whose
defaults are unchanged: `ARTDISK` the pair's Artemis, `ZUSEDISK` the pair as a stick (v3 reads
identity drives raw, so a `system=v3` boot needs `ZUSEDISK=disk/zuse-scratch/zuse-thumb-ident.img`,
a copy, to log Zuse in). Put the pair 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
@@ -343,7 +347,7 @@ present in `logs/`:
the three;
- **the PC stick loaded high** (Captain Bob, 2026-10-29, after the SER5 page-faulted in the
loader -- q35 always loads the image below 2 GiB, a PC's firmware does not; `FABRIC-3.md`
§XLIV): `qemu-stick-high` to `[zuse@Hera] ok> ` with the same `PARITY:V4_POST ... fail=0` and
§XLIV): `qemu-stick-high` -- the stick as built, a first boot -- to `[zuse@Hera] ok> ` with the same `PARITY:V4_POST ... fail=0` and
`POST: PASSED`. The amd64 link also refuses any 32-bit absolute or GOT relocation in the image;
don't work around that check, fix the code it names;
- **the 32-bit build** (Captain Bob, 2026-10-14: "the 32 bit build needs to go into the
+8 -1
View File
@@ -168,7 +168,14 @@ carrying timestamp noise in git history.
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 files here are unchanged.
**For tests and v3 only (2026-11-08, plan 2026-10-29-stick-5, Task 3):** a
v4 `qemu` boot no longer attaches the pair; it attaches a fresh data stick,
whose first boot mints its own Zuse. The pair stays for the tests that ask
for a known Zuse by name (`scripts/qemu_session.py`'s `stick_zuse`,
`two_sticks`, `stick_artemis`, `raw_ident`, `v3_keys`, the hot-plug and GPT
modes) and as the defaults of a `system=v3` boot.
- **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
+5
View File
@@ -352,6 +352,9 @@ first and seen to fail:
`qemu` targets behind `DATASTICK=1`, off by default -- until increments 4 and 5 the kernel cannot
take Artemis from it or mint Zuse onto it, so as the default it would leave every acceptance boot
headless. Increment 5 turns it on and retires the scratch pair and the virtio disk.
**Done 2026-11-08** (plan `2026-10-29-stick-5`, Task 3): a v4 `qemu` boot attaches a fresh data
stick and nothing else; the scratch pair stays only for the tests that ask for it and for
`system=v3`.
4. **Artemis and Zuse from one disk:** the boot device from the loader, the partitions found and
attached, virtio Artemis off the v4 path; recognition of a minted stick; entropy on the v4 path;
`system=v3` refused on a stick (§4, §5).
@@ -361,6 +364,8 @@ first and seen to fail:
recorded) and a 4 GB one (below the minimum: not grown, said so).
**Amended 2026-10-29:** the genesis is the proxy's, with the version 2 marker (§6); the fresh
stick's first boot reaching `[zuse@Hera] ok>` with nothing set up is the test of plug and play.
**Done 2026-11-08** (plan `2026-10-29-stick-5`, Tasks 1-3; `FABRIC-3.md` XLVIII.8-9): growth is
capped at 256 GiB (R1); every acceptance run is now a first boot.
5a. **The real Zuse stick (2026-10-29)** (§6a): `MINT-ZUSE` and its confirmation, the GPT and
identity written to the second stick, the marker's real key; recognition of the real Zuse
stick; the fixed screen and its R; the old stick refused after a replacement.
+14 -9
View File
@@ -134,12 +134,17 @@ DOE_RUNS_DIR := experiments/bare_metal/runs
DOE_LATEST_DIR := experiments/bare_metal/latest
CAPSULES_DIR ?= capsules
# ARTDISK and ZUSEDISK default to the minted Zuse pair (disk/zuse-scratch/,
# The disks a `qemu` boot attaches (plan 2026-10-29-stick-5, Task 3; STICK.md 9). A v4 boot -- every
# boot but `system=v3` -- attaches a fresh data stick (DATASTICK, below) and nothing else: every
# acceptance run is a first boot, the proxy Zuse minted on it, the prompt with nothing set up. A
# `system=v3` boot (KERNEL_ARGS) keeps the defaults it has always had: the minted pair below.
QEMU_V3_BOOT := $(findstring system=v3,$(KERNEL_ARGS))
# For system=v3: ARTDISK and ZUSEDISK default to the minted Zuse pair (disk/zuse-scratch/,
# disk/README.md; Captain Bob, 2026-10-26, the identity gate's D4): with no
# identity drive the system is headless, so a boot with the blank
# disk/artemis.img and thumbdrives/zuse-thumb-ident.img never reaches a
# prompt. The two are a pair: Zuse's genesis marker is on that Artemis disk.
ARTDISK ?= disk/zuse-scratch/artemis.img
ARTDISK ?= $(if $(QEMU_V3_BOOT),disk/zuse-scratch/artemis.img)
# ARTDISK= (empty) attaches no virtio disk. Since 2026-10-28 the v4 boot takes Artemis only from the
# stick (docs/v4.0.0/plans/2026-10-27-stick-4-one-disk.md, Task 4); ARTDISK stays for system=v3.
# Precomputed for the same comma reason as ZUSEDISK_QEMU_ARGS below.
@@ -190,7 +195,7 @@ XHCI_ARGS_SLOT4 := $(if $(strip $(XHCI_QEMU_ARGS)),$(XHCI_QEMU_ARGS),$(XHCI_D
# 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)
ZUSEDISK ?= $(if $(QEMU_V3_BOOT),$(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
@@ -203,12 +208,12 @@ ZUSEDISK_QEMU_ARGS := -drive if=none,id=zusedrv,file=$(ZUSEDISK),format=raw -dev
else
ZUSEDISK_QEMU_ARGS :=
endif
# DATASTICK -- set to 1 to attach the data stick (`make ... datastick`: StarshipOS identity
# and Artemis partitions, no ESP, made fresh before the boot) over USB on port 2, beside the
# disks above (docs/v4.0.0/STICK.md 9). Off by default until the first boot of a fresh data
# stick can mint Zuse (increment 5, which turns it on and retires ARTDISK/ZUSEDISK;
# docs/v4.0.0/plans/2026-10-27-stick-3-images.md, ruled 2026-10-27).
DATASTICK ?=
# DATASTICK -- 1 attaches the data stick (`make ... datastick`: StarshipOS identity and Artemis
# partitions, no ESP, made fresh before the boot) over USB on port 2 (docs/v4.0.0/STICK.md 9).
# On by default for a v4 boot since a fresh data stick's first boot mints Zuse (plan
# 2026-10-29-stick-5, Task 3, as stick-3's ruling of 2026-10-27 set out); off for system=v3.
# DATASTICK= boots v4 with no drive at all (headless).
DATASTICK ?= $(if $(QEMU_V3_BOOT),,1)
ifneq ($(strip $(DATASTICK)),)
DATASTICK_QEMU_ARGS = -drive if=none,id=datadrv,file=$(DATASTICK_IMG),format=raw -device usb-storage,bus=xhci0.0,port=2,drive=datadrv
DATASTICK_DEP := datastick
@@ -0,0 +1,161 @@
[=3h[=3h[=3hBdsDxe: loading Boot0001 "UEFI QEMU DVD-ROM QM00005 " from PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x2,0xFFFF,0x0)
BdsDxe: starting Boot0001 "UEFI QEMU DVD-ROM QM00005 " from PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x2,0xFFFF,0x0)
[=3hStarKernel UEFI Loader
Loading kernel from ESP...
[CKPT 001] Entered efi_main - ConOut live
RAW SERIAL UP
[CKPT 002] Serial (COM1) initialized
Monolithic build - kernel linked directly
Collecting boot information...
CmdLine: parsed OK
[CKPT 004] Command line parsed
[CKPT 005] Kernel stack allocation decided
[CKPT 006] Boot info collected (ACPI table located)
GOP: linear framebuffer found
[CKPT 007] GOP: linear framebuffer found
[CKPT 008] About to enter ExitBootServices retry loop
EBS...
EBS OK
Calling kernel_main (monolithic)...
_____ _ _ __ _
/ ____| | | |/ / | |
| (___ | |_ __ _ _ __| ' / ___ _ __ _ __ ___| |
\___ \| __/ _` | '__| < / _ \ '__| '_ \ / _ \ |
____) | || (_| | | | . \ __/ | | | | | __/ |
|_____/ \__\__,_|_| |_|\_\___|_| |_| |_|\___|_|
LithosAnanke v4.0.0-alpha.3 amd64
Architecture: amd64
Build: Nov 8 2026 13:06:58
UEFI BootServices: EXITED
Console: serial line is a 16550 at port 0x00000000000003f8 (COM1, probed)
=== StarKernel Boot Information ===
Memory map entries: 126
Total memory: 1023 MB
Usable memory: 967 MB
===================================
PMM initialized.
PMM statistics:
Total pages: 248946
Free pages : 247419
Used pages : 1527
Total MB : 972
Free MB : 966
Used MB : 5
VMM initialized (mapped RAM, CR3 switched)
VMM initialized (mapped RAM, CR3 switched)
VMM self-test: mapped OK at 0xffff800000000000
VMM self-test complete.
IDT installed.
APIC: init...
APIC: IA32_APIC_BASE MSR=0x00000000fee00900
APIC: stale-ISR drain: 0 EOI(s) issued
APIC: initialized (xAPIC MMIO, TPR=0, SIVR=0x1FF, EOI-clear)
APIC: init done
I/O APIC: init...
I/O APIC: base=0xfec00000, gsi_base=0, overrides=5
override: source=00 gsi=2 flags=0x0000
override: source=05 gsi=5 flags=0x000d
override: source=09 gsi=9 flags=0x000d
override: source=0a gsi=10 flags=0x000d
override: source=0b gsi=11 flags=0x000d
i8042: keyboard ACKed enable-scanning
i8042: IRQ1 enabled in controller config byte
I/O APIC: keyboard IRQ1 routed (masked)
Timer: init...
Timer: init start
Timer: PM_TMR_BLK discovered from FADT at port 1544
Timer: VM mode detected (hypervisor present).
Timer: HPET calibration disabled (VM-exit MMIO would poison timing).
Timer: WARNING: invariant TSC not present under hypervisor.
Timer: continuing in RELATIVE mode (no determinism guarantees).
Timer: RDTSCP not present; using RDTSC (less serialized).
Timer: CPUID frequency unavailable; trying PM Timer...
Timer: trust=1 (0=NONE,1=REL,2=ABS), TSC=2090276162 Hz
Timer: init done
Kernel heap initialized.
Heap statistics:
Total bytes: 536870872
Free bytes: 536870872
Used bytes: 0
Peak bytes: 0
Heap base addr: 24641536
Heap end addr: 561512448
Heartbeat: init...
APIC Timer: calibrating...
APIC Timer: apic_hz=1005501029, tick_hz=100, initial_count=10055010
APIC Timer: configured (masked, ready to start)
Heartbeat: init done
Kernel initialization complete.
Boot successful!
Boot disk: not a StarshipOS stick
System: StarForth v4 (this build's default)
StarForth v4: one host node, the F18-derived engine
V4: capsule v4:sys:map-64.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:map-64.f18 capsule_hash=0x949eb6a1e9260e49
V4: capsule v4:sys:core.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:core.f18 capsule_hash=0xb8f167892ec18c28
V4: capsule v4:sys:input.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:input.f18 capsule_hash=0x85d3ec486d929a79
V4: capsule v4:sys:dict.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:dict.f18 capsule_hash=0x1379bd3b5de811dc
V4: capsule v4:sys:codegen.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:codegen.f18 capsule_hash=0x36d2ae84d2911b90
V4: capsule v4:sys:compile.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:compile.f18 capsule_hash=0x11145c4c2ab819d8
V4: capsule v4:sys:quit.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:quit.f18 capsule_hash=0x43cadf3b21ddbf3e
V4: capsule v4:sys:forth.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:forth.f18 capsule_hash=0x16cab4a1268b85da
V4: capsule v4:sys:numout.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:numout.f18 capsule_hash=0x85a240ad3fb2b299
V4: capsule v4:sys:words.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:words.f18 capsule_hash=0xb1d381f927d9f14e
V4: capsule v4:sys:system.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:system.f18 capsule_hash=0xd92203664c2915bd
V4: capsule v4:sys:qmath.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:qmath.f18 capsule_hash=0xdb4140713dd857f3
V4: capsule v4:sys:blocks.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:blocks.f18 capsule_hash=0x76307ef48678dc2a
V4: capsule v4:sys:log.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:log.f18 capsule_hash=0xfc6540e6b824a52b
V4: capsule v4:sys:acl.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:acl.f18 capsule_hash=0x6845aa048db7eb22
V4: capsule v4:sys:end.f18 signature: missing (unsigned)
PARITY:V4_F18 name=v4:sys:end.f18 capsule_hash=0x5ef01312c07b79cc
PARITY:V4_ROM words=2372 rom_hash=0x87b23d3ae2643c8d instructions=59145258
V4: capsule v4:forth79.4th signature: missing (unsigned)
PARITY:V4_CAPSULE name=v4:forth79.4th capsule_id=0x4055641ee17d176b capsule_hash=0x4055641ee17d176b dict_hash=0x033e1c05c09a1df8
PARITY:V4_POST tests=538 pass=538 fail=0
PARITY:V4_SYSTEM word_count=317 dict_hash=0xfec8c47cfc6f437f
PARITY:OK
POST: PASSED
PCI: init...
PCI: ECAM mapped (amd64)
virtio-rng: no device on PCI bus 0
rng: backend = rdrand
entropy: ready
virtio-input: no device on PCI bus 0
Starting heartbeat...
APIC Timer: started (LVT=0x00020020 ICR=10055010)
I/O APIC: keyboard IRQ1 unmasked
Heartbeat running.
blkio_usb: MSC device ready
Artemis: the stick's partition attached
[Hera] Zuse: identity confirmed from attached thumbdrive
[zuse@Hera] ok> 3 4 + .
[zuse@Hera] 7 ok
[zuse@Hera] ok> 
+3 -1
View File
@@ -94,7 +94,9 @@ accept)
amd64) rm -rf "$OUT"; mkdir -p "$OUT"; touch "$OUT/.started" # the first stage
mode=zuse; arch=amd64; extra= ;;
aarch64|riscv64) mode=zuse; arch=$what; extra= ;;
stick-high) mode=stick_zuse; arch=amd64; extra="--target qemu-stick-high" ;;
# the PC stick as built, loaded high: its first boot mints its own Zuse (plan
# 2026-10-29-stick-5, Task 3 -- it was the stick with the minted pair, stick_zuse)
stick-high) mode=stick_genesis; arch=amd64; extra="--target qemu-stick-high" ;;
*) usage ;;
esac
need "$OUT/.started"
+21 -8
View File
@@ -4,9 +4,12 @@
scripts/qemu_session.py MODE ARCH [--label L] [--make "VAR=val ..."] [--no-zuse]
Builds and boots `make ARCH=<arch> clean qemu` (one QEMU, in the foreground of
this script), with copies of the minted Zuse pair (disk/zuse-scratch/) made
under build/qemu-session/<label>/ so the committed images are never booted;
Zuse's drive is that pair laid out as a stick (zusestick.img).
this script). Its disks are the Makefile's defaults -- on v4, a fresh data stick
and nothing else, so every boot is a first boot (plan 2026-10-29-stick-5,
Task 3) -- except for the modes that ask for the minted Zuse pair
(disk/zuse-scratch/) by name: copies of it, made under
build/qemu-session/<label>/ so the committed images are never booted, laid out
as a stick (zusestick.img), or her raw identity image for v3.
It reads the serial socket continuously, drives the boot over the serial and
QMP sockets the `qemu` goal opens, prints PASS:/FAIL: lines and
RESULT: PASS|FAIL, and quits QEMU over QMP. The serial log is the usual
@@ -15,7 +18,8 @@ logs/<TS>/<arch>/qemu-<arch>-<TS>.log.
Modes (the identity gate's, plan 2026-10-26-engine-step4-identity-gate.md, and
the stick's, plan 2026-10-26-stick-1-screen-and-keyboard.md):
headless no Zuse drive: POST: PASSED, then no `ok> ` for 60 s
zuse the minted pair: identity confirmed, [zuse@Hera] ok>, `3 4 + .` -> 7 ok
zuse the default disks, a fresh data stick: the genesis line, [zuse@Hera] ok>,
`3 4 + .` -> 7 ok (plan 2026-10-29-stick-5, Task 3: it was the minted pair)
hotplug no drive; Zuse added over QMP -> prompt; pulled -> session ended,
headless; added again -> prompt
midpull pulled while a line is in hand: what is typed after does not run
@@ -127,15 +131,23 @@ if a.mode == "artemis_unsigned":
with open(unsigned, "r+b") as f:
f.seek(sig_at)
f.write(bytes(4096))
attach_zuse = not (a.no_zuse or a.mode in NO_ZUSE_MODES)
# the modes that ask for the minted pair by name (plan 2026-10-29-stick-5, Task 3); the others
# boot the Makefile's defaults, or no drive at all
PAIR_MODES = {"stick_artemis", "two_sticks", "artemis_unsigned", "raw_ident", "v3_keys"}
# v3 reads identity drives raw, never through a GPT (only the v4 path reads one: sk_v4_identity.c),
# so a system=v3 boot gets Zuse's raw identity image, not her stick (plan 2026-10-27-stick-4, R2)
zdrive = {"v3_keys": ident, "raw_ident": ident}.get(a.mode, zimg)
if a.mode == "artemis_unsigned":
zdrive = unsigned
make_args = ["make", "-f", "kernel/Makefile", f"ARCH={a.arch}", "clean", a.target, f"ARTDISK={art}",
f"ZUSEDISK={zdrive if attach_zuse else ''}"] + shlex.split(a.make)
make_args = ["make", "-f", "kernel/Makefile", f"ARCH={a.arch}", "clean", a.target]
if a.mode in PAIR_MODES:
make_args += [f"ZUSEDISK={zdrive}", "DATASTICK="]
elif a.no_zuse or a.mode in NO_ZUSE_MODES:
make_args += ["ZUSEDISK=", "DATASTICK="] # no drive at boot
if a.mode == "v3_keys":
make_args.append(f"ARTDISK={art}") # v3's Artemis is the virtio disk
make_args += shlex.split(a.make)
if a.mode in ("v3_keys", "stick_v3"):
make_args.append("KERNEL_ARGS=system=v3")
if a.mode == "screen_boot":
@@ -384,7 +396,8 @@ if m == "headless":
elif m == "zuse":
check("Boot disk: not a StarshipOS stick (an ISO or ESP boot)",
re.search(r"Boot disk: not a StarshipOS stick", text()) is not None, near=r"Boot successful!")
check("Zuse: identity confirmed", wait_for(r"Zuse: identity confirmed from attached thumbdrive", 120))
check("Zuse: genesis minted onto attached thumbdrive (a fresh data stick)",
wait_for(r"Zuse: genesis minted onto attached thumbdrive", 180), near=r"Artemis: |Zuse: |USB: ")
check("[zuse@Hera] ok>", wait_for(PROMPT, 60))
n = count(PROMPT)
type_line("3 4 + .")