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

Merged
rajames merged 26 commits from StarForth-v4.0.0 into master 2026-11-10 11:16:56 +00:00
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
Runner image / Build and publish the runner image (push) Failing after 5m37s
Release / Release ${{ github.ref_name }} (push) Canceled after 0s
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
rajames merged commit 836b4423e1 into master 2026-11-10 11:16:56 +00:00
Sign in to join this conversation.