Extend BIRTH/CAPSULE-BIRTH to all VMs symmetrically; flag a real std79 lockdown gap (FABRIC-3.md §XXV)
Build / build-amd64-iso (push) Waiting to run
Build / build-aarch64-iso (push) Waiting to run
Build / build-riscv64-img (push) Waiting to run

Scoping the workload-into-factorial design's placement-mode factor
led to a real architectural improvement: rather than EXEC-ing a
workload capsule into an already-running, ACL-locked identity's own
persistent dictionary (filesystem-shaped, doesn't dodge the block-
collision exposure just traced in §XXIV), a workload now runs as a
fresh ephemeral child VM, BIRTH'd per trial and reaped after --
matching the project's own stated principle of automanagement over
imposed policy. CAPSULE-BIRTH already passes vm->stadium_vm_id (who
is birthing this VM) as the new child's parent, not a hardcoded Hera
constant, confirmed by reading the C -- so a workload trial genuinely
inherits the specific identity's own lineage when that identity does
the birthing.

Which surfaced a real premise: only Hera could call BIRTH/
CAPSULE-BIRTH at all (registered only in register_mama_forth_words(),
confirmed directly, not part of the earlier §XX messaging-symmetry
fix which deliberately kept this as one of her remaining privileges).
Extended symmetrically now, agreed explicitly before touching code:

- mama_forth_words.c: BIRTH and CAPSULE-BIRTH added to
  register_child_vm_words(), matching §XX's own pattern.
- acl-std79.4th: ' BIRTH , ' CAPSULE-BIRTH , added to ACL-STD79-LIST
  (new block 4048) -- a deliberate, explicit, named exception to the
  lockdown's own "standard words only" guarantee, not a silent one.
  Symmetric registration alone can't weaken any lockdown on its own:
  ACL-LOCKDOWN-STD79 is allowlist-based, deny-by-default, so a newly
  registered word is auto-denied there unless explicitly added.

Verified: clean build on all 3 architectures, zero new warnings.
Hera's own dict_hash unchanged (expected); Hermes/Artemis show the
same new dict_hash on all 3 architectures. Live-tested against a
real attached std79-locked identity: CAPSULE-BIRTH executes
correctly (returns vm_uuid_none() for a deliberately out-of-range
capsule-id, zero fault, zero ACL denial).

Found, and explicitly stopped short of fixing, a separate pre-
existing gap while verifying the above: MSG-STATUS and MSG-K
(messaging.4th words, not on the std79 allowlist) execute for a
locked identity instead of being denied. ACL-LOCKDOWN-STD79 is
confirmed to actually run; something more specific isn't reaching
messaging.4th's dictionary entries. Root cause not traced -- needs
its own investigation into vm_core.c's dictionary-link mechanics and
whichever capsule actually loads messaging for these identities.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EXieurDfDSsDFdnSyusuWo
This commit is contained in:
Robert Allan James
2026-09-12 22:31:52 -04:00
co-authored by Claude Sonnet 5
parent cd2fda4351
commit 3c2daf50d1
20 changed files with 81538 additions and 28 deletions
+28 -27
View File
@@ -1,5 +1,5 @@
# Capsule Block Manifest — Auto-generated
<!-- Generated by mkcapsule --manifest 2026-09-13T01:55:21Z -->
<!-- Generated by mkcapsule --manifest 2026-09-13T02:28:34Z -->
<!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. -->
<!-- Hand-written justifications and immutability notes live -->
<!-- in MANIFEST.md alongside this auto-generated index. -->
@@ -9,7 +9,7 @@
| Capsule | Blocks claimed | xxHash64 | Signed |
|---------|----------------|----------|--------|
| `ACL.4th` | 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4015 | `0xd781d22148ff171d` | yes |
| `acl-std79.4th` | 4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047 | `0x5a622e41d1fd0bb9` | yes |
| `acl-std79.4th` | 4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048 | `0x773bf9209df191d1` | yes |
| `artemis:init.4th` | 4110, 4111, 4112, 4113, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4177, 4178, 4179, 4180, 4181, 4182, 4851, 4852, 4853, 4854, 4856, 4857, 4858 | `0xac215ecb873c4db3` | yes |
| `block-acl.4th` | 4019, 4020 | `0xf6cc2a59e3a6734e` | yes |
| `common:messaging.4th` | 5003, 5004, 5005, 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5020, 5021, 5022, 5023, 5024, 5025, 5026, 5027, 5028, 5029, 5030, 5031, 5032, 5033, 5034, 5035, 5036, 5037, 5038, 5039, 5040, 5041, 5042 | `0xedde53f6faed7355` | yes |
@@ -114,31 +114,32 @@
| 4020 | `block-acl.4th` | `0xf6cc2a59e3a6734e` | ok |
| 4021 | `zuse-eligibility.4th` | `0x8b49c1bc1e01dc58` | ok |
| 4022 | `zuse-eligibility.4th` | `0x8b49c1bc1e01dc58` | ok |
| 4023 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4024 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4025 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4026 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4027 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4028 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4029 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4030 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4031 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4032 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4033 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4034 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4035 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4036 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4037 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4038 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4039 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4040 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4041 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4042 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4043 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4044 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4045 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4046 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4047 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok |
| 4023 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4024 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4025 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4026 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4027 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4028 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4029 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4030 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4031 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4032 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4033 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4034 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4035 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4036 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4037 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4038 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4039 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4040 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4041 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4042 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4043 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4044 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4045 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4046 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4047 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4048 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4050 | `lib.4th` | `0x4b216635c359ef73` | ok |
| 4055 | `common:msg.4th` | `0x850a0382344ea6c4` | ok |
| 4060 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |