3.7 KiB
Artemis Free-Map Doesn't Reserve Capsule-Claimed Blocks
Date: 2026-07-10
Branch: lithosananke
Status: Finding only. Not fixed. Reported per standing instruction
(.claude/CLAUDE.md: "If you identify a bug, report it. Do not fix it
unless the user says to."). Confirmed correct shape by Captain Bob.
Author: Captain Bob / Claude Code
Surfaced while cross-checking HERMES-MESSAGE-BLOCK-STORAGE-DESIGN- 20260708.md against the retraction of
CAPSULE-LOADER-DEFINITIONS-ONLY-DESIGN-20260709.md — not what either
doc set out to find.
Confirmed context, not in question
Capsule loading writing every Block N header's content to the literal
block N, unconditionally, every boot, is correct — confirmed directly by
Captain Bob (see CAPSULE-BLOCK-PERSISTENCE-BOUNDARY-FINDING- 20260709.md, now closed as not-a-bug). The global block-number namespace
across all capsules is deliberately coordinated, not accidental —
artemis/init.4th Block 4122's own comment says so plainly: "NOTE:
Hermes owns 4100-9,4114-21,4142+. Artemis resumes 4122." mkcapsule
enforces this as a hard build gate (check_block_conflicts(),
tools/mkcapsule.c:694-740) — a real collision fails the build. No
duplicate LBN currently exists across the live capsule corpus (verified:
grep over capsules/BLOCK_MAP.md for repeated LBNs found none).
The gap
Artemis's own free-map allocator has no knowledge that a sub-range of her own data pool is permanently owned by the kernel's capsule loader across every boot.
ART-HDR-WRITE(artemis/init.4thBlock 4125) formats a blank disk by recordingfree = ART-DATA-BLKS— the full 22,998-block data region, no exclusions.FM-FIND-FREE(Block 4122) does a linear scan from index 0 (LBN 3076) upward, returning the first bit that's unset.- Nowhere in
ART-FORMAT/ART-INIT/ART-HDR-WRITEisFM-SETever called to pre-mark the capsule-claimed sub-ranges (ACL.4th4000–4007/4015,zuse.4th4016–4018,lib.4th4050,common:msg.4th4055,doe-campaign.4th4060–4065,hermes:init.4th4100–4153,artemis:init.4th's own 4110–4141/4851–4852, and theinit-1.4ththroughinit-9.4th/L8-variant capsules) as allocated.
Consequence
Today this is silently harmless: LBN 3076–3999 (924 blocks) are unclaimed
by any capsule, and FM-FIND-FREE's linear-from-zero scan exhausts that
range first. But once real allocation — Artemis's own future data, or
Hermes's eventual tier-3 message-overflow requests once
HERMES-MESSAGE-BLOCK-STORAGE-DESIGN-20260708.md is implemented — pushes
past roughly 924 live blocks, BLK-ALLOC will hand out an LBN inside the
capsule-claimed range. The next boot's capsule-loading pass writes that
LBN's capsule content unconditionally (per the confirmed-correct
mechanism), silently overwriting whatever real data BLK-ALLOC had just
placed there. No error, no warning — the real data is just gone on the
next boot.
Scope
Applies to Artemis's live, already-implemented free-map (artemis/ init.4th, committed ed05db25 per ARTEMIS-BAM-ACCEPTANCE-20260703.md)
— not the Future Material zone/BAM system, which is separately not
build-authorized. This gap exists in code that already ships and already
runs ART-SELF-TEST/ART-WRITE-TEST against the live disk image today.
Not fixed
No code changed. Awaiting direction. Candidate fix shape, not yet
confirmed: reserve the capsule-claimed LBN range(s) in the free-map at
ART-FORMAT time (FM-SET for each capsule-owned index before the
"free" count is recorded in the header), so FM-FIND-FREE never
considers them. Exact mechanism — whether the reservation is a fixed
compile-time range, derived from capsules/BLOCK_MAP.md at build time,
or something else — not designed here.