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
+78
View File
@@ -3201,3 +3201,81 @@ files; transform: lint/manifest/conflict-resolve; load: C-source generation) was
idea, to be done as its own clean pass once the workload-into-factorial design (the actual idea, to be done as its own clean pass once the workload-into-factorial design (the actual
reason this was scoped) resumes. reason this was scoped) resumes.
## XXV. Ephemeral-birth workload design pivot; BIRTH/CAPSULE-BIRTH extended symmetrically; a
real, pre-existing ACL lockdown gap found live and flagged, not fixed (2026-09-12)
**The workload-into-factorial design got a real architectural improvement from stepping back
and naming the project's own governing principle out loud.** Bob's own framing: "the trick is to
make system calls, schedulers and filesystems more or less go away and at the same time
introduce more automanagement and make that shit obsolete." Applied directly: the original two
workload-placement options (`EXEC` a workload capsule into an already-running identity as an
extra task, or in place of its std79 tests) both mutate a long-lived, ACL-locked identity's own
persistent dictionary -- exactly the filesystem-shaped, policy-heavy mechanism the principle
argues against, and it doesn't even dodge the block-collision exposure just traced in §XXIV, it
just relocates it. The better fit, and Bob's reaction once it was named: "oh that's brilliant. i
love it. heck, yes!" -- **a workload runs as a fresh, ephemeral child VM, `BIRTH`'d per trial and
reaped after**, living its whole heat/reservoir/residency lifecycle in Stadium the same way any
other VM does. No dictionary mutation, no permanent addition to an identity's own word set.
Placement mode becomes a genuine third factor value alongside the original two, not a
replacement for them.
**Identity, decided explicitly rather than left ambiguous:** a workload trial run this way is
still born under the specific identity's own name/lineage -- confirmed technically sound, not
just conceptually: `CAPSULE-BIRTH ( capsule-id -- vm-id-hi vm-id-lo )` already passes
`vm->stadium_vm_id` -- "who is birthing this VM" -- as the new child's parent, not a hardcoded
Hera constant (`mama_word_capsule_birth`, checked directly, not assumed). Whichever VM actually
calls it becomes the real, structural parent.
**Which surfaced a real premise check: only Hera could call `BIRTH`/`CAPSULE-BIRTH` at all.**
Both words were registered only inside `register_mama_forth_words()` -- confirmed directly in
`mama_forth_words.c` (lines ~1620/1678 for `BIRTH`, ~1632/1690 for `CAPSULE-BIRTH`, both strictly
before `register_child_vm_words()`'s own start) -- not part of the §XX messaging-symmetry fix,
which deliberately *kept* `BIRTH` as one of Hera's remaining real privileges. Extending it now is
its own deliberate step, agreed explicitly before touching code, not assumed to already be done.
**Symmetric registration alone can't weaken any personality's own lockdown, confirmed by reading
the mechanism rather than assumed:** `acl-std79.4th`'s `ACL-LOCKDOWN-STD79` is allowlist-based,
deny-by-default -- it walks the *entire* dictionary and denies+pins anything not on
`ACL-STD79-LIST`, so a newly-registered word is auto-denied there unless a human deliberately
adds it. Fixed in two pieces:
- **`mama_forth_words.c`**: `BIRTH` and `CAPSULE-BIRTH` added to `register_child_vm_words()`,
matching the exact §XX symmetric-registration pattern.
- **`acl-std79.4th`**: `' BIRTH , ' CAPSULE-BIRTH ,` added to `ACL-STD79-LIST` (new block 4048),
with the header comment updated to name this as the one deliberate non-FORTH-79/83 exception
it now is -- a real, conscious tradeoff against the lockdown's own "standard words only"
guarantee, not a free lunch, made explicitly rather than slipped in silently.
**Verified end to end:** clean build on all 3 architectures, zero new warnings. Hera's own
dict_hash is unchanged (expected -- only `register_child_vm_words()` changed); Hermes/Artemis
both show the new dict_hash `0xf53a0baccd073321`/`0x859932264267b042`, identical across all 3
architectures -- confirmed by booting each, not assumed from one. Live-tested against a real
attached identity (`rajames`, std79-locked): `S" 99999 CAPSULE-BIRTH . ." S" rajames" VM-EXEC`
correctly executed and returned `vm_uuid_none()`'s sentinel (`-1 -1`) for the deliberately
out-of-range capsule-id, with zero fault and zero ACL denial -- the carve-out works.
**A genuine, separate, pre-existing gap found live while verifying the ACL carve-out, not caused
by it:** `MSG-STATUS` and `MSG-K` -- `common:messaging.4th` words, not on `ACL-STD79-LIST` --
both executed successfully for `rajames` rather than being denied. `ACL-LOCKDOWN-STD79` is
confirmed to actually run (`capsule_mint.c`'s `MINT_RESTRICTED_PERSONALITY`, block 4998, calls it
as the VM's own last bootstrap step), so this isn't "the lockdown never engages" -- something
more specific isn't reaching messaging.4th's dictionary entries. One promising lead, not yet
confirmed: `capsule_mint.c`'s `MINT_RESTRICTED_PERSONALITY` (block 4998) itself never loads
`common:messaging.4th` at all -- only `MINT_DEFAULT_PERSONALITY` (block 4999) does -- so
messaging must be reaching a std79-locked identity via some other, not-yet-traced per-identity
init path, and the boot-order relationship between that load and `ACL-LOCKDOWN-STD79`'s own walk
is exactly the open question. `REBOOT` (explicitly named excluded in the lockdown's own header
comment) produced an error rather than clean success when tested the same way, though the
console's generic `VM-EXEC: ERROR in rajames` message doesn't cleanly distinguish "ACL denied"
from "some unrelated failure" -- inconclusive on its own, not contradicting the messaging-gap
finding. **Explicitly stopped here at Bob's call, documented rather than chased to full root
cause** -- this needs real tracing of `vm_core.c`'s dictionary-link mechanics and finding
whichever capsule actually loads messaging for these identities, which is its own investigation,
separate from the `BIRTH` work it was found while verifying.
**Next step:** root-cause the messaging/lockdown gap as its own piece of work, then resume the
workload-into-factorial design itself (sine/fib/square-wave as the three chosen workloads,
workload-identity × placement-mode as two real factors, ephemeral-birth now the leading
placement-mode candidate) once BIRTH's own verification (done here) and the ACL gap (flagged,
not yet fixed) are both accounted for.
+28 -27
View File
@@ -1,5 +1,5 @@
# Capsule Block Manifest — Auto-generated # 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. --> <!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. -->
<!-- Hand-written justifications and immutability notes live --> <!-- Hand-written justifications and immutability notes live -->
<!-- in MANIFEST.md alongside this auto-generated index. --> <!-- in MANIFEST.md alongside this auto-generated index. -->
@@ -9,7 +9,7 @@
| Capsule | Blocks claimed | xxHash64 | Signed | | Capsule | Blocks claimed | xxHash64 | Signed |
|---------|----------------|----------|--------| |---------|----------------|----------|--------|
| `ACL.4th` | 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4015 | `0xd781d22148ff171d` | yes | | `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 | | `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 | | `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 | | `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 | | 4020 | `block-acl.4th` | `0xf6cc2a59e3a6734e` | ok |
| 4021 | `zuse-eligibility.4th` | `0x8b49c1bc1e01dc58` | ok | | 4021 | `zuse-eligibility.4th` | `0x8b49c1bc1e01dc58` | ok |
| 4022 | `zuse-eligibility.4th` | `0x8b49c1bc1e01dc58` | ok | | 4022 | `zuse-eligibility.4th` | `0x8b49c1bc1e01dc58` | ok |
| 4023 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4023 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4024 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4024 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4025 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4025 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4026 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4026 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4027 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4027 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4028 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4028 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4029 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4029 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4030 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4030 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4031 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4031 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4032 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4032 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4033 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4033 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4034 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4034 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4035 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4035 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4036 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4036 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4037 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4037 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4038 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4038 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4039 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4039 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4040 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4040 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4041 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4041 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4042 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4042 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4043 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4043 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4044 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4044 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4045 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4045 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4046 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4046 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4047 | `acl-std79.4th` | `0x5a622e41d1fd0bb9` | ok | | 4047 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4048 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
| 4050 | `lib.4th` | `0x4b216635c359ef73` | ok | | 4050 | `lib.4th` | `0x4b216635c359ef73` | ok |
| 4055 | `common:msg.4th` | `0x850a0382344ea6c4` | ok | | 4055 | `common:msg.4th` | `0x850a0382344ea6c4` | ok |
| 4060 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok | | 4060 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
+10 -1
View File
@@ -4,7 +4,9 @@ Block 4023
( Excludes: BYE, COLD/WARM/REBOOT/SAVE-SYSTEM, the block ) ( Excludes: BYE, COLD/WARM/REBOOT/SAVE-SYSTEM, the block )
( editor (L S SHOW EDIT UPDATE SAVE-BUFFERS), BLK-ACL-*, ) ( editor (L S SHOW EDIT UPDATE SAVE-BUFFERS), BLK-ACL-*, )
( FORGET/FENCE. Kept: (BRANCH) etc -- IF/DO/LOOP compile ) ( FORGET/FENCE. Kept: (BRANCH) etc -- IF/DO/LOOP compile )
( calls to these; denying them breaks control flow. ) ( calls to these; denying them breaks control flow. One )
( deliberate non-standard exception: BIRTH/CAPSULE-BIRTH, )
( block 4048 -- FABRIC-3.md SXXV, 2026-09-12. )
( Full rationale: FABRIC-3.md, 2026-09-07. ) ( Full rationale: FABRIC-3.md, 2026-09-07. )
CREATE ACL-STD79-LIST CREATE ACL-STD79-LIST
@@ -129,6 +131,13 @@ Block 4043
' EXIT , ' CASE , ' OF , ' ENDOF , ' EXIT , ' CASE , ' OF , ' ENDOF ,
' ENDCASE , ' ENDCASE ,
Block 4048
( Deliberate non-standard exception, not part of )
( FORTH-79/83 -- lets a std79-locked identity own )
( BIRTH an ephemeral workload-trial child VM under )
( its own lineage. FABRIC-3.md SXXV, 2026-09-12. )
' BIRTH , ' CAPSULE-BIRTH ,
Block 4044 Block 4044
( ACL-STD79-ALLOWED? ( xt -- flag ) ) ( ACL-STD79-ALLOWED? ( xt -- flag ) )
: ACL-STD79-ALLOWED? ( xt -- flag ) : ACL-STD79-ALLOWED? ( xt -- flag )
BIN
View File
Binary file not shown.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+14
View File
@@ -1955,6 +1955,20 @@ void register_child_vm_words(VM *vm)
register_word(vm, "STADIUM-HEAT@", mama_word_stadium_heat_fetch); register_word(vm, "STADIUM-HEAT@", mama_word_stadium_heat_fetch);
register_word(vm, "STADIUM-HEAT!", mama_word_stadium_heat_store); register_word(vm, "STADIUM-HEAT!", mama_word_stadium_heat_store);
register_word(vm, "STADIUM-WORD-HEAT", mama_word_stadium_word_heat); register_word(vm, "STADIUM-WORD-HEAT", mama_word_stadium_word_heat);
/* FABRIC-3.md SXXV (2026-09-12): BIRTH/CAPSULE-BIRTH were Hera-only by
* registration alone -- both mama_word_birth() and mama_word_capsule_
* birth() were already genuinely VM-agnostic underneath (the latter
* explicitly passes vm->stadium_vm_id, "who is birthing this VM," not
* a hardcoded Hera constant -- confirmed by reading the C before
* assuming it). Symmetric registration alone can't weaken any
* personality's own ACL lockdown: acl-std79.4th's ACL-LOCKDOWN-STD79
* is allowlist-based, deny-by-default -- it walks the WHOLE
* dictionary and denies+pins anything not on ACL-STD79-LIST, so a
* newly-registered word is auto-denied there unless a human
* deliberately adds it (which acl-std79.4th now does, explicitly,
* for exactly these two -- see its own updated comment). */
register_word(vm, "BIRTH", mama_word_birth);
register_word(vm, "CAPSULE-BIRTH", mama_word_capsule_birth);
} }
#endif /* __STARKERNEL__ */ #endif /* __STARKERNEL__ */