The plug-and-play stick, done: MINT-ZUSE and the fixed screen (#92 Tasks 4-5); licence headers #160

Open
rajames wants to merge 26 commits from StarForth-v4.0.0 into master
Owner

What and why

The rest of the plug-and-play stick, #92 Tasks 4-5 (plan docs/v4.0.0/plans/2026-10-29-stick-5-proxy-zuse-and-real-zuse.md; docs/v4.0.0/STICK.md 6a) -- with which #92 is done -- and the licence headers:

  • Task 4 -- MINT-ZUSE: at the prompt, it asks for a second stick, shows its size, writes nothing until YES, then a GPT with one identity partition (gpt_write_one), a fresh Zuse minted and read back, and only then the real key in the genesis marker. Her stick is then recognised against that key and her session moves to it. A new word of the lone node: word_count 317 -> 318, dict_hash 0x8c92508f748f99cf on the three ISAs.
  • Task 5 -- the fixed screen: with a real Zuse, the system stick alone gives no prompt but four lines; R mints a replacement, every other key is dropped; the old stick is then refused for good. Pulling her stick brings the screen back; pulling the system stick while hers is in lets hers go first.
  • Licence: the source headers name the Starship License 1.0 (SL-1.0), as LICENSE does (349 files); an SPDX header (LicenseRef-Starship-1.0) on the 253 source files that had none. Capsules, proofs, tools/kconfig/ (GPL-2.0), docs/working/ and the patent/formal files left as ruled.
  • The SER5 bench steps for the stick and the real Zuse: boards/BRINGUP.md 4.2.

Worked in small increments, each committed with the plan's Progress section up to date. Records: FABRIC-3 XLVIII.15-17.

Closes #92

Acceptance

The Acceptance check runs on this pull request by itself. Note here anything it does not cover:

  • Logs from runs made by hand are committed in logs/: every test seen to fail first, then pass; the regressions; full acceptance (verdicts in logs/20261110-051726/verdicts/ for Task 4, logs/20261110-075036/verdicts/ for Task 5)
  • Hardware this was tried on, if any: none yet -- the bench steps are written (boards/BRINGUP.md 4.2)
  • Not covered by Acceptance: the MINT-ZUSE and fixed-screen sessions (mint_zuse on three ISAs; mint_zuse_refuse, mint_small, mint_zuse_used, mint_pull_system, zuse_stick_first, fallback, replace, mint_fail, system_pull_real) -- run by hand, all PASS, logs committed. gpt_write_one was also checked on the host against blank and used images.

The record

  • docs/fabric/FABRIC-3.md has the ruling and what was built, if this is design work
  • CHANGELOG.md, if it is a milestone -- at alpha.4
  • Nothing in this PR is a fix nobody asked for (.claude/CLAUDE.md, Hard Rules): the plan's tasks; the licence work ruled ("Yes", "Yes, SPDX form, leave capsules and proofs")

🤖 Generated with Claude Code

https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2

## What and why The rest of the plug-and-play stick, #92 Tasks 4-5 (plan `docs/v4.0.0/plans/2026-10-29-stick-5-proxy-zuse-and-real-zuse.md`; `docs/v4.0.0/STICK.md` 6a) -- with which #92 is done -- and the licence headers: - **Task 4 -- `MINT-ZUSE`:** at the prompt, it asks for a second stick, shows its size, writes nothing until `YES`, then a GPT with one identity partition (`gpt_write_one`), a fresh Zuse minted and read back, and only then the real key in the genesis marker. Her stick is then recognised against that key and her session moves to it. A new word of the lone node: `word_count` 317 -> 318, `dict_hash 0x8c92508f748f99cf` on the three ISAs. - **Task 5 -- the fixed screen:** with a real Zuse, the system stick alone gives no prompt but four lines; `R` mints a replacement, every other key is dropped; the old stick is then refused for good. Pulling her stick brings the screen back; pulling the system stick while hers is in lets hers go first. - **Licence:** the source headers name the Starship License 1.0 (SL-1.0), as `LICENSE` does (349 files); an SPDX header (`LicenseRef-Starship-1.0`) on the 253 source files that had none. Capsules, proofs, `tools/kconfig/` (GPL-2.0), `docs/working/` and the patent/formal files left as ruled. - **The SER5 bench steps** for the stick and the real Zuse: `boards/BRINGUP.md` 4.2. Worked in small increments, each committed with the plan's Progress section up to date. Records: FABRIC-3 XLVIII.15-17. Closes #92 ## Acceptance The **Acceptance** check runs on this pull request by itself. Note here anything it does not cover: - [x] Logs from runs made by hand are committed in `logs/`: every test seen to fail first, then pass; the regressions; full acceptance (verdicts in `logs/20261110-051726/verdicts/` for Task 4, `logs/20261110-075036/verdicts/` for Task 5) - [ ] Hardware this was tried on, if any: none yet -- the bench steps are written (`boards/BRINGUP.md` 4.2) - Not covered by Acceptance: the `MINT-ZUSE` and fixed-screen sessions (`mint_zuse` on three ISAs; `mint_zuse_refuse`, `mint_small`, `mint_zuse_used`, `mint_pull_system`, `zuse_stick_first`, `fallback`, `replace`, `mint_fail`, `system_pull_real`) -- run by hand, all PASS, logs committed. `gpt_write_one` was also checked on the host against blank and used images. ## The record - [x] `docs/fabric/FABRIC-3.md` has the ruling and what was built, if this is design work - [ ] `CHANGELOG.md`, if it is a milestone -- at alpha.4 - [x] Nothing in this PR is a fix nobody asked for (`.claude/CLAUDE.md`, Hard Rules): the plan's tasks; the licence work ruled ("Yes", "Yes, SPDX form, leave capsules and proofs") 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
rajames added 26 commits 2026-11-10 08:00:25 +00:00
347 headers said "Licensed under the StarForth License, Version 1.0" -- a
shortening (Captain Bob, 2026-11-08: "License file SL I think I shortened
accidently"); LICENSE is, and has been since the first commit, the
Starship License 1.0 (SL-1.0, SPDX LicenseRef-Starship-1.0). 349 files,
566 occurrences, now "Starship License, Version 1.0 (SL-1.0)".

Left as they are, pending a ruling: docs/patent/ (the patent figures),
docs/formal/ (the citable volumes) and the generated reports under
docs/working/experiments/ (32 files). Comments and license text only:
the amd64 kernel builds, every changed script parses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
The old MBR zeroed first, the backup header and entries, the primary, the protective MBR last: a write torn anywhere leaves no table. Builds clean on amd64, aarch64, riscv64; checked on the host against blank 600 MiB and 32 MiB images and a used Zuse stick (sfdisk --verify clean, gpt_read reads it back). Not yet called.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
sk_v4_identity_offer_wait() beats until a stick that is not this system's arrives (offered), a key is pressed, or the system stick leaves; sk_v4_identity_recheck_offered() runs the arrival check again once the mint has written it. Builds on three ISAs; not yet called.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Asks for a stick, shows its size, writes nothing until YES; then gpt_write_one, the partition's first devblocks zeroed, a fresh Zuse minted, read back, and only then the marker's real key. Any failure before the marker: 'failed -- nothing changed'. The gate remembers the last stick it turned away as a spare, offered first by the next mint. Builds on three ISAs; not yet called.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
word_count 317 -> 318; no POST case (it waits for a stick and YES, as BYE has none).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
The header scan (Captain Bob, 2026-11-10): 788 source files -- 351 with the
SL-1.0 header, 12 with the old name (docs/working/experiments, kept by
ruling), 31 under someone else's licence (tools/kconfig, Linux's, GPL-2.0:
kept), and 394 with none. Ruled: the SPDX form; capsules (.4th, .f18) and
proofs (.thy) left for a ruling of their own (mkcapsule's 64x16 block format,
content-addressed capsules).

253 files now begin
    SPDX-License-Identifier: LicenseRef-Starship-1.0
    Copyright (c) 2023-2026 Robert A. James
as a /* */ block (C, headers, assembly, linker scripts) or # lines (scripts,
Makefiles, Kconfig; below a shebang or a coding line); tools/mkcapsule.c,
which had the copyright line, gets the SPDX line only.

Not touched: docs/working/ (archive and old campaign material, as the
ruling kept the experiments); v4/system/post_cases.c (generated by
v4/tools/mkpost.py, "do not edit" -- the generator has the header).

Comments only: the kernel builds on amd64, aarch64, riscv64; make -C v4
test-32: 39 programs, 0 failures; every changed script parses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
A GPT stick with an identity partition and no Artemis, the system stick in and its marker naming a real Zuse: checked against the real key; a match attached and logged in (a running session moves to her); no match: 'not this system's Zuse stick -- not used'. Arriving first, it is remembered and checked when the marker is read. Builds on three ISAs; mint_zuse running.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
feat(kernel): MINT-ZUSE -- the real Zuse minted onto a second stick, read back before the marker names her (#92, Task 4)
Build / Image RASPI (push) Successful in 2m42s
Build / Image PC (push) Successful in 3m17s
Build / Image MILKV (push) Successful in 2m43s
Build / v4 tests (32- and 64-bit cells) (push) Successful in 9m28s
7fee88eb49
Task 4 of plan 2026-10-29-stick-5, accepted in full:
- amd64, aarch64, riscv64: PARITY:V4_POST tests=538 pass=538 fail=0,
  POST: PASSED; PARITY:V4_SYSTEM word_count=318 dict_hash=0x8c92508f748f99cf
  on the three (MINT-ZUSE, the lone node's second word)
- the PC stick as built, loaded high: 538/538, the prompt
- make -C v4 test-32: 39 programs, 0 failures

Sessions: mint_zuse on the three; mint_zuse_refuse, mint_small,
mint_zuse_used, mint_pull_system, zuse_stick_first; regressions genesis,
two_sticks, hotplug, midpull, typeahead. Verdicts in
logs/20261110-051726/verdicts/. The plan's Task 4 ticked; FABRIC-3 XLVIII.16.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
The four lines on the screen and serial while the proxy is recognised and her stick is not here; R runs sk_v4_mint_zuse(), every other key is dropped. Her stick pulled: the screen again. The system stick pulled while hers is in: hers let go first (the block chain's tail), remembered for the system stick's return. Builds on three ISAs; fallback running.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
mint_fail's own checks passed (failed -- nothing changed, the screen again, the old stick logs in); the check now expects none in this boot's log.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
First boot (genesis, growth, the time to the prompt), the second boot, MINT-ZUSE onto a second stick, the system stick alone (the fixed screen), both sticks at power-on -- each rehearsed first in QEMU by the qemu_session.py mode named. 3.2's 'boots headless' corrected: the stick's first boot now mints its Zuse.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
feat(kernel): the fixed screen -- with a real Zuse, the system stick alone can only mint a replacement; the old stick dies (#92, Task 5)
Build / Image RASPI (push) Successful in 4m21s
Build / Image PC (push) Successful in 5m1s
Build / Image MILKV (push) Successful in 7m22s
Build / v4 tests (32- and 64-bit cells) (push) Successful in 12m17s
Acceptance / Acceptance (pull_request) Successful in 19m56s
836b4423e1
Task 5 of plan 2026-10-29-stick-5, accepted in full, and with it #92:
- amd64, aarch64, riscv64: PARITY:V4_POST tests=538 pass=538 fail=0,
  POST: PASSED; word_count=318 dict_hash=0x8c92508f748f99cf on the three
- the PC stick as built, loaded high: 538/538, the prompt
- make -C v4 test-32: 39 programs, 0 failures

Sessions: fallback, replace, mint_fail, system_pull_real; regressions:
every Task 4 session, genesis, stick_genesis, screen_dark_until_login,
screen_dark_after_logout, kbd_typeahead, emergency. Verdicts in
logs/20261110-075036/verdicts/. The plan's Task 5 ticked; STICK.md 11
increment 5a done; FABRIC-3 XLVIII.17; the SER5 bench steps in
boards/BRINGUP.md 4.2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
All checks were successful
Build / Image RASPI (push) Successful in 4m21s
Build / Image PC (push) Successful in 5m1s
Build / Image MILKV (push) Successful in 7m22s
Build / v4 tests (32- and 64-bit cells) (push) Successful in 12m17s
Acceptance / Acceptance (pull_request) Successful in 19m56s
Required
Details
You are not authorized to merge this pull request.
This pull request can be merged automatically.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin StarForth-v4.0.0:StarForth-v4.0.0
git checkout StarForth-v4.0.0
Sign in to join this conversation.