Before flipping, found CAPSULE_SIG_MISSING (no signature at all) is the normal state everywhere except this machine -- CI and any other checkout have no access to the offline key, by design. Refusing on MISSING the same as INVALID would brick boot everywhere but here. Decided (on request): enforce ONLY on CAPSULE_SIG_INVALID (a signature that IS present but doesn't verify -- unambiguous tampering/corruption evidence). MISSING/NO_ROOT_KEY stay WARN-only permanently. All three capsule_birth.c call sites now return CAPSULE_RUN_ERR_INVALID on CAPSULE_SIG_INVALID, after logging the same WARN as before. Verified on all three architectures, both directions, per the original rollout commitment: positive case (real signed capsules) reboots clean with zero warnings on amd64/aarch64/riscv64. Negative case (same one-byte signature corruption used for the WARN-only proof, on Mama's own init.4th) now genuinely refuses identically on all three: "capsule sig: init.4th: INVALID" then "Init: Mama birth FAILED". The feared "no ok> at all" blast radius didn't materialize -- kernel_main.c already had graceful error handling for a failed Mama birth (log and continue, pre-existing code); the kernel reaches a degraded ok> rather than crashing, on all three architectures. Final acceptance pass (real signed capsules, tampering reverted) clean on all three. Milestone 6 is now fully closed except magic-number content-type detection (shared with Milestone 4, separate scope, not started). Documented in FABRIC-3.md. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U14ET9CWAtbQMbYqomKgXd
src/starkernel/capsule/
Kernel-side capsule system: locating, validating, and executing the
immutable, content-addressed .4th initialization payloads in
capsules/ (embedded into the kernel image via tools/mkcapsule.c).
capsule_find.c— locates a capsule by name in the generated capsule directory.capsule_validate.c— validates a capsule's content hash before use.capsule_birth.c— the birth protocol: allocate VM ID → execute IDENTITY (capsule code) → execute PERSONALITY (block 1 from ramdrive) → log parity record.capsule_run.c— capsule execution against a VM instance.capsule_loader.c— loads capsule block content into kernel ramdrive block RAM, writing eachBlock Nheader to its literal numbered block address (not reordered).capsule_vm_hooks.c— VM integration hooks for capsule execution.capsule_vm_physics.c— physics-runtime bindings for capsule-birthed VMs.mama_forth_words.c— Mama VM-specific FORTH word bindings.