CHANGELOG.md: new 2026-08-18 entry for today's work, plus a post-split note explaining the branch-tag convention no longer applies (this repo is now LithosAnanke-only, master as sole production line). docs/lithosananke/ROADMAP.md: M7.1 section predates all the real Tripod/Stadium/ACL work and was silently stale -- added a dated redirect to FABRIC.md/FABRIC-2.md (matching the doc's own existing pattern for the M8 section) rather than rewriting the whole section. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
12 KiB
Changelog
Milestone-level achievements only — not a commit log. For full history see
git log on the relevant branch. Two products share this file:
StarForth (hosted FORTH-79 VM, master) and LithosAnanke (bare-metal
UEFI kernel, lithosananke). Entries are tagged by which branch(es) they
landed on. Post-split note (2026-08-18): the combined monorepo this
convention describes has been split into two separate repositories;
LithosAnanke now lives here with master as its sole production line (no
lithosananke branch in this repo). Entries below this note carry no
branch tag for that reason.
2026-08-18 — Item 4.6 (Artemis Stadium migration) quota-ordering bug fixed; aarch64 BYE crash fixed; full 3-arch DoE campaign clean
Artemis's 30-rep surface stress campaign (item 4.6, migrating her block-heat
arena to Stadium admission-on-allocate) was failing 100% of trials on all
three architectures. Root-caused to capsule_birth.c: stadium_grant_quota()
ran after IDENTITY exec, but Artemis's init.4th auto-runs the stress
campaign as part of that same IDENTITY exec, so every STADIUM-ADMIT call
hit a nonexistent quota slot and refused unconditionally. Moved the grant
before IDENTITY exec. Verified 30/30 reps PASS on amd64, aarch64, and
riscv64 (was 30/30 FAIL on all three).
Separately fixed a long-standing aarch64-only crash on BYE (present since
at least 2026-08-08): arch_cold_reset() issued PSCI SYSTEM_RESET via
smc #0, but this QEMU/AAVMF boot configuration has no genuine EL3/TrustZone
secure monitor to answer an SMC — PSCI here is served via HVC instead. The
instruction was trapping into the kernel's own exception handler on every
boot, not corrupting memory or racing anything, despite investigation
initially suspecting both. Root-caused via live gdb single-stepping, which
also surfaced and fixed a real debugging-environment gotcha along the way:
starkernel_kernel.elf is not the binary that actually runs under
MONOLITHIC_BUILD (starkernel_loader.efi is, a completely separately-linked
artifact) — every earlier breakpoint attempt had been aimed at the wrong
file. Fixed: smc #0 → hvc #0. First clean aarch64 BYE exit recorded.
Also fixed, found incidentally during the aarch64 investigation: PSCI
SYSTEM_RESET's function ID used the SMC64 calling convention (0xC4000009),
which isn't a real PSCI function ID (SYSTEM_RESET has no SMC64 variant) —
corrected to the valid SMC32 encoding (0x84000009).
Full three-arch DoE campaign (L8-DOE, 48 trials each) re-run clean on all
three architectures post-fix: stress campaigns 30/30 PASS, clean BYE exit,
no exceptions. Full investigation trail, evidence, and dead ends in
FABRIC-2.md Sections H and I.
2026-07-24 — Kernel 3-arch acceptance test re-run; amd64 dict_hash non-determinism root-caused (lithosananke)
Re-ran the standing kernel acceptance test (ARCH={amd64,aarch64,riscv64} clean qemu) after this session's changes. All three booted cleanly to ok>
with PARITY:OK and Hera/Hermes/Artemis E2E PASS, but amd64's dict_hash
didn't match aarch64/riscv64 (which matched each other and the established
reference exactly). Root-caused rather than dismissed: capsule_dict_hash_hook()
(src/starkernel/capsule/capsule_vm_hooks.c) folds each word's
execution_heat into the hash, and amd64's own boot log says its timer
falls back to "RELATIVE mode (no determinism guarantees)" under this
QEMU/hypervisor setup (no invariant TSC) — aarch64/riscv64 get proper
deterministic hardware timers. Heartbeat tick count during boot, and
therefore dict_hash, can legitimately vary run-to-run on amd64 from host
scheduling jitter alone. Pre-existing, self-documented in the boot log,
consistent with already-recorded ACL-RWT campaign data (amd64's baseline
tick count was already distinct from aarch64/riscv64's). Not a regression
from any change this session. Logs and DoE run data committed as usual.
2026-07-24 — amd64 ISR .hidden fix extended to aarch64/riscv64; hosted blk_ram sizing bug fixed (lithosananke)
Surveyed both branches for ASM files and C99 fallback layers on request;
confirmed via SHA-256 that all six ASM-optimization headers plus
arch_detect.h are byte-identical between master and lithosananke, but
found amd64/isr.S had genuinely diverged — lithosananke carries a real
fix (.hidden directives preventing GOT-indirection corruption of the
runtime ASLR-relocation-delta computation) that master never received.
Ported it there (see master's entry below). Investigated whether the same
GOT-indirection bug class applies to aarch64/riscv64: it doesn't structurally
(interrupts.c on those architectures only calls the vector-install
function via PC-relative branches; nothing reads an asm-defined symbol's
address from C) — added .hidden anyway as defensive hardening on request,
working around a real ELF-vs-PE/COFF assembler incompatibility for the
aarch64 loader (.hidden guarded with #ifndef _WIN32, since that loader
is assembled via clang-18 --target=aarch64-pc-windows-msvc). Verified with
full three-arch QEMU acceptance.
Separately, discovered and fixed (with explicit sign-off) a severe
pre-existing bug: the hosted StarForth VM could not start at all on
lithosananke, on any architecture. src/main.c's block-I/O RAM buffer was
hardcoded to the old 1024*1024-byte size, stale relative to a deliberate
BLK_RAM_BLOCKS=2080 block-subsystem redesign (moving the RAM/ramdrive
boundary to user-visible LBN 2048) that the kernel-side bootstrap already
correctly followed. Fixed to derive the buffer size from the same shared
constants; verified across all three hosted architectures via QEMU
(native amd64, qemu-aarch64-static, qemu-riscv64-static).
2026-07-24 — pgo build option removed; hosted 3-arch acceptance test documented (both)
Removed the TARGET=pgo profile and its associated pgo/pgo-build/
pgo-perf/pgo-valgrind/bench-compare targets from the hosted Makefile
on both branches, plus the now-orphaned scripts/pgo-workload.sh. Verified
make TARGET=pgo now errors cleanly on each branch.
Also proved out and documented, for the first time, that the hosted VM
starts cleanly not just on amd64 but on aarch64 and riscv64 too (cross-built,
run under qemu-{aarch64,riscv64}-static user-mode emulation) —
docs/lithosananke/hosted-acceptance-test/README.md. This is what surfaced
the blk_ram sizing bug above.
2026-07-07 – 2026-07-08 — Kconfig build-configuration system (both, committed on lithosananke)
A Linux-kernel-style Kconfig system replaces the two Makefiles' scattered,
drifting ?= knobs with one discoverable, optional configuration tree.
Vendored the real scripts/kconfig tooling (conf/mconf/qconf —
headless, ncurses, and Qt frontends) into tools/kconfig/, wrote a ~40-symbol
tree (Kconfig.arch/variant/physics/heartbeat/kernel), and bridged it
into both Makefiles via mk/Kconfig.mk. Entirely opt-in: nothing changes for
a plain make until a developer generates a per-architecture
build/$(ARCH)/.config, and command-line overrides always win regardless.
Found and reported two real, previously-invisible drift bugs along the way
(TRANSITION_WINDOW_SIZE diverging live in kernel builds, MINIMUM_PREFETCH_ROI
off by an order of magnitude in its Q48.16 encoding); the latter was fixed on
request. Documented in docs/working/architecture/getting-started/DEVELOPER.md.
2026-07-07 — Artemis/riscv64 determinism gap closed (lithosananke)
Root-caused a dict_hash divergence on riscv64 that had been mis-attributed
to an architecture quirk: Loop #3 heat decay was reading real wall-clock
nanoseconds instead of the heartbeat's execution-driven tick counter, making
it sensitive to a riscv64-specific I/O busy-wait. Converted decay to be
purely tick-based across all six call sites touching it. All four VM
identities (Hera, Artemis, Hermes ×2, Mama) now byte-identical across
amd64/aarch64/riscv64.
2026-07-05 – 2026-07-07 — VM Fleet Attractor experiment concluded (lithosananke)
Multi-week investigation into giving the L8 Jacquard mode selector a real
per-VM physics channel (dynamic fleet heat replacing hardcoded
compudynamics.4th/fleet-k.4th constants) reached a validated end state:
a 180-run, three-architecture DoE campaign found the self-tuning inference
loop was starved by a shared-counter bug, replaced a log-linear regression
estimator with direct rate recovery once fixed, and closed with L8 wired
into a real causal channel into fleet tuning — the pathway earlier iterations
had found architecturally missing. Three-arch acceptance confirmed throughout.
2026-07-04 — K-PUSH dictionary-shadowing corruption fixed (lithosananke)
Multi-day trap-and-debug campaign closed: FORTH-79 word shadowing broke
under the dictionary's heat-based reorganization, corrupting K-PUSH.
Root-caused and fixed; three-arch confirmed.
2026-07-03 — Artemis BAM storage subsystem, Phase 1 (lithosananke)
Block Allocation Map storage for the Artemis VM accepted: Q48.16 block heat
tracking, ART-COOL/ART-REAP reclamation words.
2026-06-27 – 2026-06-30 — Hermes inter-VM messaging complete (lithosananke)
17-block message/channel layer between VMs finished and verified: 16/16
inter-VM smoke tests passing, three-arch. Follow-on "completion steps" batch
(async delivery, channel negotiation, K-FLEET integration) landed the same
week. INPUT_BUFFER_SIZE restored to 1025 on this branch with the correct
line-vs-block-buffer rationale (see note below on master's divergence).
2026-06-23 – 2026-06-25 — Tripod (Hermes/Artemis) scaffold stood up (lithosananke)
Named multi-VM roles (Hermes, Artemis) with dedicated prompts and
CONNECT-HERMES/CONNECT-ARTEMIS wiring; verified booting live,
pre-REPL, on all three architectures. Compudynamics — the physics-runtime
tuning discipline — ported into FORTH itself via VM-EXEC/VM-STEP
primitives, the first self-hosted physics orchestration. K≡1.0 conservation
wired end-to-end (Phase 6+7) with Artemis block storage passing
PHASE6-TEST green.
2026-06-17 — LaTeX publication system completed (master)
Three-volume formal documentation system finished: 11 publications, 209 source scraps at 100% coverage, clean build. StarForth version bumped to v3.1.0 / LithosAnanke to v1.5.3 in the same window.
2026-06-16 — LithosAnanke v1.5.1-FINAL — framebuffer/VT100 console milestone (lithosananke)
Closed the framebuffer terminal milestone; three-arch re-acceptance. ACL-RWT DoE campaign confirmed the same day as the first genuinely ACL-active campaign (an interpreter-hook bug that had silently bypassed ACL checks in every prior run was fixed just before this one) — all nine cells of a 3×3 Latin square (seeds × architectures), +0.0054%–+0.0088% overhead, CV = 0.000%. Report finalized for patent support material.
2026-06-13 – 2026-06-14 — Word-level ACL system, Phases 1–7 complete (both)
C infrastructure (acl_ttl/acl_allow/acl_mode/acl_pinned fields on
every dictionary entry), the ACL.4th FORTH policy layer, the zuse
bootstrap superuser, Isabelle/HOL proof stubs, and LithosAnanke kernel
parity all landed — all three kernel architectures boot to zuse)ok>.
Phase 8 (Ed25519 PKI / thumbdrive challenge-response) is the only remaining
item on the ACL roadmap.
2026-06-11 – 2026-06-12 — Bare-metal ACL baseline DoE campaign (lithosananke)
3×3 Latin-square baseline campaign (seeds × architectures, 30 replicates each) completed across all nine cells. Analysis report drafted, revised through a peer-review pass, and prepared for SSRN submission.
Known issue surfaced while compiling this changelog, not yet resolved:
master's include/vm.h currently defines INPUT_BUFFER_SIZE as 256,
violating the project's own documented invariant (it must be 1025 — LOAD
copies up to 1024 bytes of block content through the same vm_interpret()
path interactive REPL lines use, so anything past byte 255 is silently
dropped under the 256 cap). lithosananke has the correct value. Not fixed
as part of this changelog/README pass; flagged for a future session.