diff --git a/FABRIC-3.md b/FABRIC-3.md index 7f80d14..8515e78 100644 --- a/FABRIC-3.md +++ b/FABRIC-3.md @@ -140,7 +140,12 @@ decisions get added here, not to `FABRIC-2.md`. Follow the same discipline `FABR 2026-08-27 (`FABRIC-3.md` §F.6, decision 3): a user's pool is their entire thumbdrive by default (never contested) plus any system-resident device blocks they additionally claim, first-come-first-served — this function only governs that second, system-side extension, - not the drive itself.** + not the drive itself.** **SCOPED 2026-08-27 (`FABRIC-3.md` §F.11)**: the "claim at + `g.total_user_lbn`" phrasing above is stale, predating `BMAPFMT`'s distributed-ownership + decision — claims are found by scanning Artemis's already-attached device's own `blk_meta_t` + records for unowned devblocks, not by extending a counter. Claims may be a scattered chain + (reusing `blk_meta_t`'s existing `prev_block`/`next_block`/`chain_length` fields), found via + a full linear scan each time, no cached index. - [x] **SCOPED 2026-08-27 (FABRIC-3.md §F.4).** Design the on-drive block-map format (Section U item 4). Resolved as: no separate table — repurpose the existing, fully-wired-but- @@ -1426,7 +1431,7 @@ graph TD PH8["✅ Phase 8 — Zuse identity
+ block-fence, DONE 2026-08-26"] CERTVERIFY["❌ Zuse-signed user-cert verification (M3)
SCOPED 2026-08-27 (§F.7) — X.509/DER, own trust root"] - FIRSTTOUCH["❌ First-touch identity→block-range
allocation (M3)"] + FIRSTTOUCH["❌ First-touch identity→block-range
allocation (M3) — SCOPED 2026-08-27 (§F.11)"] BMAPFMT["❌ On-drive block-map format (M3)
SCOPED 2026-08-27 (§F.4) — repurpose blk_meta_t"] BMAPWRITE["❌ Write block-map to drive (M3)"] BMAPREAD["❌ Read/validate block-map on insert (M3)"] @@ -1541,6 +1546,11 @@ finished). Dashed arrows = softer "gates/informs" relationships. today never resets `g_repl_active_vm`, so killing the VM a console is currently `USE`'d onto leaves a dangling pointer. Reported, not fixed — the new `EJECT`/hot-unplug call sites handle this correctly, but the existing `KILL` word's own call sites do not. +- **`FIRSTTOUCH`'s own punch-list wording was stale** (§F.11) — "claim at `g.total_user_lbn`" + predates `BMAPFMT`'s distributed-ownership decision and doesn't describe a workable + mechanism against the current design. A second, unrelated discovery in the same pass — + `blk_meta_t`'s existing chain fields — turned what looked like a fragmentation problem into + a non-issue for free. **Not yet done:** an ordered plan (which node to attack first, given the graph). Per Captain Bob's own framing, that's the next pass — "start asking and answering questions iteratively @@ -2003,6 +2013,52 @@ the latter, given the single-USB-device constraint confirmed in `F.8` means ther than one candidate — not committed here); the console message text distinguishing a graceful eject from an unclean one in the transcript. +### F.11 — `FIRSTTOUCH` (identity → system-device block-range allocation) + +Traced `g.total_user_lbn` (`block_subsystem.c:634,650,655,677,688,753`) and `blk_meta_t`'s +existing chain fields before assuming the M3 wording was still accurate. **Finding: it isn't, +fully.** "Claim a new range at `g.total_user_lbn`" predates `BMAPFMT`'s decision (§F.4) to drop +the centralized block-map in favor of distributed per-block ownership. `total_user_lbn` is a +global high-water mark that only grows when an entirely new *device* attaches (RAM, Artemis's +disk, a USB drive) — it says nothing about claiming space *within* an already-attached, +fixed-size device. `FIRSTTOUCH`'s real job is scanning Artemis's own system-resident device's +existing `blk_meta_t` records for unowned devblocks, not extending any counter. + +Also confirmed live and unrelated to `BMAPFMT`'s repurposing: `blk_meta_t`'s "Link/chain +support" fields (`prev_block`/`next_block`/`parent_block`/`chain_length`, +`block_subsystem.h:232-236`) are real, general-purpose, block-number-granularity linkage — not +device-chain-specific — and completely untouched by `F.4`'s field redesign. + +**Decisions made 2026-08-27:** + +1. **A claim is a scattered chain, not a required contiguous run.** Reuses the existing + `prev_block`/`next_block`/`chain_length` fields directly — immune to fragmentation, and + this mechanism already exists, unused, waiting for exactly this. The claim's identity to + the caller is its chain-head devblock number; `owner_fp` is written to *every* devblock in + the chain (not just the head), so ownership is directly readable from any member block + without first walking the chain — consistent with `BMAPFMT`'s whole point of making + ownership locally readable per-block. +2. **Discovery: full linear scan, every time, no cached index.** Matches `BMAPFMT`'s own + explicit "no centralized table, nothing extra to keep in sync" philosophy exactly. One scan + pass serves both questions this node needs answered — "does this identity already own a + claim" (`owner_fp` match) and "which devblocks are free" (`owner_fp` all-zero) — collected + together in the same walk, not two separate scans. +3. **Failure mode: fail outright, no partial claim.** If the device doesn't have enough free + devblocks (scattered or not) to satisfy the request, return an error and let the caller + decide — matches this codebase's existing return-code convention throughout (`capsule_birth_baby()` + and friends), no new partial-allocation semantics invented. +4. **Allocation unit: whole devblocks**, already decided in `BMAPFMT` (§F.4, decision 4) — + `FIRSTTOUCH` doesn't revisit this, just inherits it. + +**Not yet scoped (deferred within this node):** the actual function signature/call site (this +pass decided the algorithm, not its C interface); who calls `FIRSTTOUCH` and when — most +likely `MIGSM` (the migration state machine, M3, still 🟡 partial) deciding "this identity +needs N more devblocks," but that call site doesn't exist yet either; whether a first-touch +scan should skip/short-circuit once the caller's own already-attached thumbdrive still has +room (matching the pool-scope clarification in §F.6: the thumb is the default pool, this +node is specifically the *overflow* case) — implied yes by that clarification, not explicitly +re-confirmed here. + ### D.5 — Scope expansion (2026-08-27): identity is common to every VM, not just users Surfaced while scoping `ACLKEY`, stated directly: *"the whole object is to deliver a