Extend BIRTH/CAPSULE-BIRTH to all VMs symmetrically; flag a real std79 lockdown gap (FABRIC-3.md §XXV)
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:
co-authored by
Claude Sonnet 5
parent
cd2fda4351
commit
3c2daf50d1
+78
@@ -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
|
||||
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
@@ -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 |
|
||||
|
||||
+10
-1
@@ -4,7 +4,9 @@ Block 4023
|
||||
( Excludes: BYE, COLD/WARM/REBOOT/SAVE-SYSTEM, the block )
|
||||
( editor (L S SHOW EDIT UPDATE SAVE-BUFFERS), BLK-ACL-*, )
|
||||
( 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. )
|
||||
CREATE ACL-STD79-LIST
|
||||
|
||||
@@ -129,6 +131,13 @@ Block 4043
|
||||
' EXIT , ' CASE , ' OF , ' ENDOF ,
|
||||
' 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
|
||||
( ACL-STD79-ALLOWED? ( xt -- flag ) )
|
||||
: ACL-STD79-ALLOWED? ( xt -- flag )
|
||||
|
||||
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
@@ -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_store);
|
||||
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__ */
|
||||
|
||||
Reference in New Issue
Block a user