FABRIC-3.md: scope MINT, drop GPT permanently, confirm single-USB-device is sufficient

Traced two hidden dependencies before scoping: (1) no GPT parser/writer exists anywhere in kernel code, and per direct instruction GPT is dropped entirely rather than deferred -- the raw homeblocks_sig_t-at-devblock-0 layout every other node (CERTVERIFY/WIREBIND/RUNCAP/HOTPLUG) already treated as interim becomes the permanent format. (2) xhci_dev_t's BOT/MSC state is singular, not per-slot, raising a concern about the vision's "mint a second thumb while Zuse is active" implying two simultaneous USB devices -- resolved: Zuse's identity is system-resident (loaded from Artemis's own block-fence at boot), never thumbdrive-based, so MINT only ever needs one attached target drive. Decisions: minted identities get a real keypair (virtio_rng + ed25519_keygen), stored via a new user_identity_seed_t record occupying RUNCAP's identity_src region's first devblock; drive_uuid is a separate random draw; cert construction reuses CERTVERIFY's exact format, signed with Zuse's own seed -- first confirmed need for DER encoding, not just decoding.
This commit is contained in:
Robert Allan James
2026-08-27 14:22:37 -04:00
parent 691c04289b
commit a45ea881c9
+72 -2
View File
@@ -1431,7 +1431,7 @@ graph TD
EXPIRE["✅ EXPIRE reframed: session end<br/>= VM detach via COOL (§B + D.2)"] EXPIRE["✅ EXPIRE reframed: session end<br/>= VM detach via COOL (§B + D.2)"]
RUNCAP["❌ Runtime capsule construction<br/>from thumbdrive content — SCOPED 2026-08-27 (§F.6)"] RUNCAP["❌ Runtime capsule construction<br/>from thumbdrive content — SCOPED 2026-08-27 (§F.6)"]
MINT["❌ Ongoing MINT word (Phase 8 + D.3)"] MINT["❌ Ongoing MINT word (Phase 8 + D.3)<br/>SCOPED 2026-08-27 (§F.8) — GPT dropped, single-device confirmed OK"]
PENTAGON["📍 Pentagon: Hera/Hermes/Artemis/<br/>User-VM/Console, K5 (D.2b)"] PENTAGON["📍 Pentagon: Hera/Hermes/Artemis/<br/>User-VM/Console, K5 (D.2b)"]
MSGSHAPE["✅ Hermes message shape known<br/>(MSG-CELLS, MSG-ALLOC/DELIVER)"] MSGSHAPE["✅ Hermes message shape known<br/>(MSG-CELLS, MSG-ALLOC/DELIVER)"]
MSGMIGRATE["❓ Message-bus migration of<br/>attach/verify/bind (D.4)"] MSGMIGRATE["❓ Message-bus migration of<br/>attach/verify/bind (D.4)"]
@@ -1514,6 +1514,11 @@ finished). Dashed arrows = softer "gates/informs" relationships.
on-device key while capsules are signed by the offline root CA's snakeoil intermediate. on-device key while capsules are signed by the offline root CA's snakeoil intermediate.
Neither chain validates the other; a future audit pass should keep this distinction explicit Neither chain validates the other; a future audit pass should keep this distinction explicit
rather than let "PKI" get treated as one undifferentiated mechanism. rather than let "PKI" get treated as one undifferentiated mechanism.
- **`MINT` closed out the GPT question for the whole arc, not just itself** (§F.8) — GPT was
never actually load-bearing anywhere in this design; every node that referenced it
(`CERTVERIFY`, `WIREBIND`, `RUNCAP`, `HOTPLUG`) was already treating raw devblock-0 as the
working format. Dropping GPT converts all of those from "interim, revisit later" to simply
"the design," retroactively.
**Not yet done:** an ordered plan (which node to attack first, given the graph). Per Captain **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 Bob's own framing, that's the next pass — "start asking and answering questions iteratively
@@ -1757,7 +1762,10 @@ Two things, read directly from the code, changed the shape of this node:
the metadata partition, how `identity_src_devblocks` bounds a variable-length FORTH source); the metadata partition, how `identity_src_devblocks` bounds a variable-length FORTH source);
whether the source is plain FORTH text authored once at mint time or something a user can edit whether the source is plain FORTH text authored once at mint time or something a user can edit
and have re-read on next attach; the interaction with `CERTVERIFY` (does verification gate and have re-read on next attach; the interaction with `CERTVERIFY` (does verification gate
reading this content, or only gate the resulting birth). reading this content, or only gate the resulting birth). **Partially settled by `MINT`'s own
scoping pass (§F.8, decision 2):** this region's first devblock holds a new
`user_identity_seed_t` record, and the FORTH source itself occupies the remaining devblocks —
narrows "the exact read path" question above, though the read-side code is still unwritten.
### F.7 — `CERTVERIFY` (Zuse-signed user-cert verification) ### F.7 — `CERTVERIFY` (Zuse-signed user-cert verification)
@@ -1806,6 +1814,68 @@ function's design (this pass decided *what* it must extract, not its implementat
shares this exact cert format on the signing side) constructs the DER bytes in the first place shares this exact cert format on the signing side) constructs the DER bytes in the first place
— DER *encoding* has never been needed in this kernel before, only decoding. — DER *encoding* has never been needed in this kernel before, only decoding.
### F.8 — `MINT` (the last piece of the original Tripod vision)
Two real dependencies surfaced while scoping this node that weren't in the §E graph, both
resolved before any design decision was needed:
1. **GPT.** The earlier-decided drive layout (`project_usb_thumbdrive_gpt_layout`:
~1GB GPT metadata partition + remainder) has no parser or writer anywhere in kernel code.
**Dropped entirely, per direct instruction (2026-08-27) — not deferred, decided against.**
The raw `homeblocks_sig_t`-at-devblock-0 layout every other node in this arc (`CERTVERIFY`,
`WIREBIND`, `RUNCAP`, `HOTPLUG`'s own `sig_start_fblock=0`) already treats as an interim
stand-in is now the **permanent** format. The "small metadata region + remainder is user
storage" *proportion* from the old GPT design still holds — it's just a plain devblock-count
convention within one raw device now (metadata = devblocks `0..N` covering the sig header +
cert + identity-source regions; everything past that is the user's own general block-storage
pool directly, consistent with `FIRSTTOUCH`'s pool clarification in §F.6). No GPT-parser
node needed in the graph at all — this closes that thread rather than deferring it.
2. **Single-device USB driver.** `xhci_dev_t`'s BOT/MSC state (`device_ctx`, `bulk_in_ring`,
`bulk_out_ring`, `bot_data_buf`) are singular fields, not per-slot arrays — only one USB MSC
device is usable at a time today. This looked like it might conflict with the vision's
"while Zuse is active, mint a second blank thumb" (implying two drives attached at once).
**Confirmed no conflict**: Zuse's own identity is system-resident, loaded from Artemis's own
top-of-device block-fence at boot (`kernel_main.c:634-687`), never from a removable thumb.
`MINT` only ever needs the one target blank drive attached — today's single-device path is
sufficient, no driver work needed for this node.
**Decisions made 2026-08-27:**
1. **The minted identity gets a real keypair**, not just a pubkey badge. `virtio_rng` +
`ed25519_keygen()` generate a fresh seed/pubkey pair for the new identity, stored on *their*
thumbdrive (never system-resident — matches `SSDSCOPE`'s "regular users stay
thumbdrive-resident" read). Keeps the door open for a user VM to sign something itself
later, per `D.5`'s "identity is common to every VM" direction, without redesigning the cert
format again.
2. **Storage layout** (direct extension of `RUNCAP`'s already-decided `identity_src_offset`/
`identity_src_devblocks` region, §F.6 — no further header growth needed): that region's
*first* devblock holds a new `user_identity_seed_t` record (`magic`/`version`/`seed[32]`/
`pubkey[32]`/`crc` — same shape as `zuse_cert_devblock_t`, a new type rather than reusing
that Zuse-specific one, per this project's own "dedicated header per real-shaped feature"
convention); the *remaining* devblocks in that region hold the raw FORTH personality/init
source `RUNCAP` reads at birth.
3. **`drive_uuid`**: a fresh, independent 16 random bytes from `virtio_rng` at mint time (not
derived from the identity seed — two separate random draws, matching `homeblocks_sig_t`'s
own field being logically "which physical drive," not "whose identity").
4. **Cert construction**: builds the exact `CERTVERIFY` (§F.7) format — `SubjectPublicKeyInfo`
= the new pubkey, `serialNumber` = `drive_uuid`, signed with **Zuse's own seed** via
`ed25519_sign()` (real signing capability already exists, Phase 8). This is the first
confirmed caller that needs DER *encoding*, not just the decoding `x509_ed25519.c` already
has — flagged in `F.7` already, restated here since `MINT` is where it's actually needed.
5. **Header assembly**: `hdr_crc` via the existing `homeblocks_sig_compute_crc()` — no new
checksum logic, this function already does exactly what's needed.
**Not yet scoped (deferred within this node):** the default personality/init FORTH content a
freshly minted identity starts with (shared open question with `RUNCAP`, §F.6: mint-time-fixed
vs. user-editable); a monotonic-ns source for `minted_time_ns` — checked, and there is no
working precedent anywhere in this codebase today (`CapsuleDesc.created_ns` is hardcoded to `0`
at generation time, not a real example to follow); the `S" name" MINT` FORTH word's own
stack/argument shape; whether `MINT` refuses to overwrite a drive that already reads as a
recognized home-blocks drive (`HOMEBLOCKS_SIG_OK`), mirroring `WRITE(10)`'s
refuse-on-non-blank-media posture — reasonable by analogy, not decided here. The hard blocker
is unchanged and already modeled in the graph: `WRITE(10)` still doesn't exist, so `MINT`
cannot write anything to real or QEMU-emulated USB media yet regardless of the above.
### D.5 — Scope expansion (2026-08-27): identity is common to every VM, not just users ### 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 Surfaced while scoping `ACLKEY`, stated directly: *"the whole object is to deliver a