FABRIC-3.md: version correction -- LITHOS_VERSION back to 2.0.0, plus a rename-gap fix
Build / build-amd64-iso (push) Waiting to run
Build / build-aarch64-iso (push) Waiting to run
Build / build-riscv64-img (push) Waiting to run

LITHOS_VERSION 2.0.1 was premature: per this project's own versioning
policy, 2.0.1 claims SER5 hardware-track progress (RDRAND backend +
thumbdrive image) that was never actually verified on real hardware --
that verification is FABRIC-3.md's own open topic. Reset to 2.0.0
(still a QEMU-only release, correctly). Verified 3-arch boot shows
"LithosAnanke v2.0.0" in each serial log directly, not assumed from the
Makefile edit alone.

Also closes a real gap found in today's earlier FABRIC-series rename:
Makefile.starkernel, Kconfig.kernel, scripts/bleach_zuse_img.sh, four
proof/*.thy files, and isr.S were never swept -- the original file list
only matched *.md/*.c/*.h/*.4th, silently skipping every other
extension. Fixed with the same safe placeholder substitution.
.claude/settings.local.json's historical permission-grant log and
ClaudeEXPORT/'s frozen export were deliberately left untouched.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019YcT3H2PQeyujrzjqS3Var
This commit is contained in:
Robert Allan James
2026-09-04 11:53:44 -04:00
co-authored by Claude Sonnet 5
parent fcba528273
commit 8717416d36
18 changed files with 27647 additions and 24 deletions
+41
View File
@@ -76,3 +76,44 @@ starting new work avoids ever having two divergent lines to reconcile later.
**Task 1 closed.** `master` genuinely is the production line again, current through today's
FABRIC-series rename and the full `FABRIC-2.md` §I closure. Bare-metal-boot work (this
document's actual topic) starts from here.
## I.2 — Task 2: version correction — the `v2.0.1` bump and `v2.0.0` tag were premature
**Direct instruction, 2026-09-04**: the `LITHOS_VERSION` bump to `2.0.1` (and the branch name
that followed it) got ahead of the real state — per `Makefile.starkernel`'s own versioning
policy (`v2.0.0` = QEMU release, even major/LTS; `v2.0.1` = the SER5 hardware-track *line*,
RDRAND backend + thumbdrive image goal), claiming `2.0.1` implies hardware-track progress that
was never actually verified on real hardware — that verification is precisely `FABRIC-3.md`'s
whole open topic (§I.6 in the closed `FABRIC-2.md`). The current `master` HEAD is, correctly,
still a `v2.0.0`-class QEMU-only release. "Nothing harmful" — a version-label correction, not a
functional rollback.
**Found and fixed while correcting this, not left half-done:**
- A real gap in the FABRIC-series rename from earlier today: `Makefile.starkernel`,
`Kconfig.kernel`, `scripts/bleach_zuse_img.sh`, four `proof/*.thy` files, and
`src/starkernel/arch/amd64/isr.S` all still had stale `FABRIC.md`/`FABRIC-2.md`/`FABRIC-3.md`
citations — the original sweep's file-list only matched `--include=*.md/*.c/*.h/*.4th`, which
silently skipped every file without one of those four extensions. Found by re-grepping with
the extensions excluded instead of included. Fixed with the same safe placeholder-substitution
technique the original rename used (each file, one pass, ordered `FABRIC-3→2→1→0` placeholders
then resolved) — verified no double-shifted or broken references remained afterward.
`.claude/settings.local.json`'s own historical Bash-permission-grant log (literal past command
strings naming the file as it was called *at the time*) was deliberately left alone — rewriting
it would falsify an audit trail, not fix a stale citation.
- `ClaudeEXPORT/memories.json`/`conversations.json` also still reference the old names — left
untouched on purpose, same reasoning as the memory note on that archive: it's a frozen export,
mining material, not live documentation to keep in sync.
**Changes:**
1. `Makefile.starkernel`: `LITHOS_VERSION ?= 2.0.1``2.0.0`.
2. The rename-gap fix above (7 files).
3. Verified 3-arch boot (`clean qemu`, amd64/aarch64/riscv64, each in the foreground): all three
show `LithosAnanke v2.0.0` in the boot banner (confirmed directly in each serial log, not
assumed from the Makefile edit alone), zero build errors, zero unexpected warnings, clean
shutdown.
4. Moved the existing `v2.0.0` git tag (previously at `2efd7fe`, the original QEMU-release
milestone commit — that commit and its own message stay fully intact in history, only the
tag pointer moves) to the current `master`/`v2.0.1`-branch HEAD, per explicit instruction —
the prior tag placement was itself part of the same "got ahead of myself" correction, not a
separate decision. No remote tag existed yet (`git ls-remote --tags origin` was empty for
`v2.0.0`), so no destructive remote operation was needed, only a local move-and-push.
+11 -11
View File
@@ -46,7 +46,7 @@ config STADIUM_VM_MEMORY_PERCENT
(kmalloc_get_stats(), taken AFTER the cell array's own allocation),
divided by VM_MEMORY_SIZE (5 MiB, include/vm.h), floored to 1 so Hera
can always boot. No upper ceiling -- birth is refused once the
computed bound is reached (FABRIC.md item 1.5's refusal behaviour is
computed bound is reached (FABRIC-0.md item 1.5's refusal behaviour is
unchanged), it just isn't a compile-time guess anymore. Default of
50% is an untuned placeholder, not a derived optimum, same DoE-later
treatment as STADIUM_MEMORY_PERCENT.
@@ -55,7 +55,7 @@ config STADIUM_CONTAINS_DEPTH_MAX
int "Patron containment chain depth cap (STADIUM_CONTAINS_DEPTH_MAX)"
default 5
help
Hard bound on how many patrons deep a `contains` chain (FABRIC.md
Hard bound on how many patrons deep a `contains` chain (FABRIC-0.md
item 1.1, the ninth cell wire) may nest. A patron with a non-none
`contains` link cannot be reaped -- reap-gating enforcement of
this bound is item 3.5's scope, not yet implemented. Distinct
@@ -71,12 +71,12 @@ config STADIUM_CAPACITY_TICK
transfer-slope estimate (vm_physics_tick() -- a passive median
recompute over recent touch samples, not a capacity/transfer
decision itself), expressed in virtual ticks -- never wall-clock.
Wired in 2026-08-15 (FABRIC-2.md F.2/§12 Q5): this counter is fed
Wired in 2026-08-15 (FABRIC-1.md F.2/§12 Q5): this counter is fed
by EVERY live VM's own vm_tick(), not one VM's, so it previously
shared HEARTBEAT_INFERENCE_FREQUENCY (1000) and fired roughly
(live VM count) times faster than a single VM's own heat-inference
gate -- backwards from the "order of magnitude apart" minimum
(FABRIC.md §22.4). Default of 4000 is a flat, untuned placeholder
(FABRIC-0.md §22.4). Default of 4000 is a flat, untuned placeholder
picked to roughly restore that separation at Tripod's known
4-VM topology (Hera + two Hermes + Artemis) -- not computed from
live VM count at runtime, deliberately: a fixed constant, same
@@ -90,11 +90,11 @@ config STADIUM_MEMORY_PERCENT
help
The Stadium's global cell array is sized at boot from
pmm_get_stats().free_bytes, taken at the point of allocation
(FABRIC.md item 3.2, §17.6 position (b): "sized at boot from the
(FABRIC-0.md item 3.2, §17.6 position (b): "sized at boot from the
memory budget", not a hardcoded cell count). This is the fraction
of that free-byte figure the array claims, rounded down to whole
64-byte cells. Default of 1% is conservative -- comfortably clears
the ~4096-cells-per-VM illustrative figure in FABRIC.md §23.3
the ~4096-cells-per-VM illustrative figure in FABRIC-0.md §23.3
against a QEMU -m 1024 test config while leaving the kernel heap
and everything else nearly all of physical memory.
@@ -102,7 +102,7 @@ config STADIUM_WORD_HEAT_QUANTUM
int "Q48.16 heat quantum moved per word touch/starter-grant (STADIUM_WORD_HEAT_QUANTUM)"
default 2048
help
FABRIC.md §17.7 (item 4.1): the fixed Q48.16 amount transferred between
FABRIC-0.md §17.7 (item 4.1): the fixed Q48.16 amount transferred between
a VM's Stadium reservoir and a word patron's cell on every touch
(already-resident) or starter-grant admission attempt (non-resident,
Option B). Q48_ONE is 65536; the default of 2048 is Q48_ONE divided by
@@ -116,7 +116,7 @@ config STADIUM_WORD_COOL_RATE_Q48
int "Q48.16 fraction of resident heat removed per tick (STADIUM_WORD_COOL_RATE_Q48)"
default 21845
help
FABRIC.md §17.7 (item 4.1): redirects Loop #3's decay shape onto
FABRIC-0.md §17.7 (item 4.1): redirects Loop #3's decay shape onto
Stadium word-patron heat instead of discarding it -- cooled heat
returns to the VM's reservoir rather than vanishing, so this must be a
fraction of the patron's OWN current heat removed per elapsed tick
@@ -132,7 +132,7 @@ config STADIUM_BLOCK_HEAT_QUANTUM
int "Q48.16 heat quantum moved per block touch/starter-grant (STADIUM_BLOCK_HEAT_QUANTUM)"
default 2048
help
FABRIC-3.md §B (MIGRATE punch-list item): same role as
FABRIC-2.md §B (MIGRATE punch-list item): same role as
STADIUM_WORD_HEAT_QUANTUM above, for block patrons touched via
BLOCK/BUFFER/UPDATE (stadium_block_dispatch(), stadium_blocks.c).
Default matches the word quantum -- no evidence yet that blocks need a
@@ -144,7 +144,7 @@ config STADIUM_BLOCK_COOL_RATE_Q48
int "Q48.16 fraction of resident block heat removed per tick (STADIUM_BLOCK_COOL_RATE_Q48)"
default 21845
help
FABRIC-3.md §B (MIGRATE punch-list item): same role as
FABRIC-2.md §B (MIGRATE punch-list item): same role as
STADIUM_WORD_COOL_RATE_Q48 above, for block patrons. Default matches
the word cool rate for the same reason the heat quantum above does --
untuned placeholder, not a derived optimum.
@@ -153,7 +153,7 @@ config STADIUM_BLOCK_TRACK_CAP_MULT
int "Multiplier on stadium_cell_count() for the block residency table's capacity"
default 2
help
FABRIC-3.md §B (MIGRATE punch-list item): stadium_blocks.c's
FABRIC-2.md §B (MIGRATE punch-list item): stadium_blocks.c's
(quota_slot, lbn) -> cell_index hash table is a fixed-capacity
open-addressing table sized at stadium_blocks_init() as
stadium_cell_count() * this value. At most stadium_cell_count() blocks
+4 -4
View File
@@ -72,7 +72,7 @@ endif
# Version
# Roadmap (per docs/lithosananke/ROADMAP.md "Release Versioning Policy" and
# FABRIC-3.md §G — X.0.0 = QEMU release, X.5.0 = hardware bare-metal release):
# FABRIC-2.md §G — X.0.0 = QEMU release, X.5.0 = hardware bare-metal release):
# v1.0.x — serial-only production (released)
# v1.5.x — framebuffer VT100 terminal/console milestone (released)
# v2.0.0 — QEMU release (even major = LTS): three-arch QEMU story complete
@@ -80,7 +80,7 @@ endif
# v2.2.0 — amd64 bare-metal (Beelink SER5) — see ROADMAP "Board-by-board rollout"
# v2.5.0 — hardware bare-metal release: real per-arch RNG + real-board boot
VERSION ?= 3.1.0
LITHOS_VERSION ?= 2.0.1
LITHOS_VERSION ?= 2.0.0
# ==============================================================================
# BUILD PATHS
@@ -133,7 +133,7 @@ MKCAPSULE_SRC = tools/mkcapsule.c tools/pkcs8_ed25519.c \
src/starkernel/crypto/sha512.c
MKCAPSULE_BIN = $(BUILD_DIR)/tools/mkcapsule
# Milestone 6 (Phase 8): the snakeoil intermediate's private key, generated
# offline outside this repo entirely (see FABRIC-3.md's Phase 8 §Milestone 6
# offline outside this repo entirely (see FABRIC-2.md's Phase 8 §Milestone 6
# writeup) -- not present in CI or a fresh checkout, so signing is skipped
# gracefully ($(wildcard ...) below) rather than failing the build. Override
# with `make SIGN_KEY=/path/to/key.pem ...` on a machine that holds it.
@@ -227,7 +227,7 @@ LOADER_LD ?= $(LD)
# has no dynamic linker to populate a GOT, so those reads silently returned
# NULL. PLATFORM_TIME_NO_INLINE (removed 2026-08-06) was a symbol-specific
# workaround for the same underlying bug, made unnecessary once amd64 got
# the real fix; see FABRIC.md for the write-up).
# the real fix; see FABRIC-0.md for the write-up).
COMMON_CFLAGS := \
-std=c99 -Wall -Werror -Wextra \
-O2 -U_FORTIFY_SOURCE \
+1 -1
View File
@@ -1,5 +1,5 @@
# Capsule Block Manifest — Auto-generated
<!-- Generated by mkcapsule --manifest 2026-09-04T15:35:20Z -->
<!-- Generated by mkcapsule --manifest 2026-09-04T15:51:18Z -->
<!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. -->
<!-- Hand-written justifications and immutability notes live -->
<!-- in MANIFEST.md alongside this auto-generated index. -->
BIN
View File
Binary file not shown.
@@ -87,7 +87,7 @@ inactive.
\section{Context}
Item 4.6 (Section H, \texttt{FABRIC-2.md}) migrated Artemis's block-heat
Item 4.6 (Section H, \texttt{FABRIC-1.md}) migrated Artemis's block-heat
tracking onto Stadium-resident cells, fixing a quota-grant-ordering bug
that had been causing her boot-time stress self-test to fail 100\% of the
time on all three architectures. With that item closed, the next open
@@ -415,7 +415,7 @@ Sum Sq of precisely zero on the one field that does vary.
\texttt{ACL.4th} is not self-activated in this repository's default
\texttt{init.4th} (\verb|\ S" ACL.4th" EXEC|, commented out); every cell in
this campaign, like every other boot recorded in \texttt{FABRIC-2.md}, ran
this campaign, like every other boot recorded in \texttt{FABRIC-1.md}, ran
with ACL inactive. This report validates the campaign mechanism and its
determinism properties; it does not produce an ACL-RWT overhead number.
Reproducing the original campaign's \texttt{+0.0054\%--+0.0088\%} overhead
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -6,7 +6,7 @@ begin
Mirrors: src/word_source/framebuffer_words.c
Registers: PLOT FB-WIDTH FB-HEIGHT
Part of the Stadium console fabric work (FABRIC.md item 4.3.3). All
Part of the Stadium console fabric work (FABRIC-0.md item 4.3.3). All
three words are registered UNCONDITIONALLY in both hosted and kernel
builds, but their bodies are `#ifdef __STARKERNEL__`-gated: the kernel
branch calls real framebuffer hardware functions (fb_put_pixel/
+1 -1
View File
@@ -6,7 +6,7 @@ begin
Mirrors: src/word_source/keyboard_words.c
Registers: KBD-SCAN KBD-DEBUG VKBD-EVENT VKBD-DEBUG KEY-EVENT ALT+TAB
Part of the Stadium console fabric work (FABRIC.md items 4.3.5/4.4v/
Part of the Stadium console fabric work (FABRIC-0.md items 4.3.5/4.4v/
4.4y). All six words are registered UNCONDITIONALLY regardless of
build/arch, but every body is gated on `__STARKERNEL__` (and, for the
amd64-specific/riscv64-aarch64-specific pairs, the target architecture
+1 -1
View File
@@ -6,7 +6,7 @@ begin
Mirrors: src/word_source/scroll_words.c
Registers (kernel-only -- see below): SCROLL-BACK SCROLL-FWD
Part of the Stadium console fabric work (FABRIC.md item 4.4q). Unlike
Part of the Stadium console fabric work (FABRIC-0.md item 4.4q). Unlike
framebuffer_words.c/keyboard_words.c, this file's word BODIES and its
`register_word` calls are BOTH inside `#ifdef __STARKERNEL__` --
`register_scroll_words` registers nothing at all on a hosted build
+1 -1
View File
@@ -6,7 +6,7 @@ begin
Mirrors: src/word_source/ttf_words.c
Registers (kernel-only -- see below): TTF-TEXT
Part of the Stadium console fabric work (FABRIC.md item 4.3.7e). Same
Part of the Stadium console fabric work (FABRIC-0.md item 4.3.7e). Same
shape as scroll_words.c: the word body AND its `register_word` call are
both inside `#ifdef __STARKERNEL__`; TTF-TEXT does not exist as a word
at all on a hosted build.
+1 -1
View File
@@ -3,7 +3,7 @@
# back to pristine/unminted state.
#
# disk/zuse.img simulates the physical Zuse superuser thumbdrive for QEMU
# testing (FABRIC-3.md, Phase 8 kickoff). "Bleaching" it means restoring the
# testing (FABRIC-2.md, Phase 8 kickoff). "Bleaching" it means restoring the
# all-zero blank state homeblocks_sig_check() reads as HOMEBLOCKS_SIG_BLANK
# -- i.e. simulating a genuine first boot, so the one-time mint-Zuse flow can
# be exercised repeatedly during development without hand-regenerating the
+1 -1
View File
@@ -157,7 +157,7 @@ isr_stub32:
jmp isr_common_entry
/* Stub for i8042 keyboard IRQ1, routed via I/O APIC to vector 0x21 = 33
* (item 4.3.5, FABRIC.md §27.5). Before this stub existed, vector 33 fell
* (item 4.3.5, FABRIC-0.md §27.5). Before this stub existed, vector 33 fell
* through to isr_stub_default below, which unconditionally reports "255"
* regardless of which IDT slot actually fired -- the CPU legitimately took
* IDT[33] (confirmed via the LAPIC's own ISR register), but isr_common_handler