From 7edccd2c35e18215f51a4a71380fce0d2e887648 Mon Sep 17 00:00:00 2001 From: Robert Allan James Date: Sat, 12 Sep 2026 16:05:11 -0400 Subject: [PATCH] =?UTF-8?q?Hera=20can't=20message:=20root-caused=20and=20f?= =?UTF-8?q?ixed=20by=20symmetry=20(FABRIC-3.md=20=C2=A7XX)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hera never loaded common:messaging.4th, unlike every other VM in the fleet. The standing belief was this was deliberate, to avoid moving her dict_hash off baseline. Checked live instead of assumed: loading messaging.4th into her dictionary silently dropped every colon- definition referencing one of 8 STADIUM-* primitives that register_child_vm_words() gives every other VM but register_mama_forth_words() never gave her -- a missing-primitive gap, not a designed privilege boundary. Confirmed mama_word_birth is genuinely VM-agnostic and SPAWN-EVENT is an unwired placeholder before proposing the fix. Fix: register the same 8 STADIUM-* primitives for Hera, load messaging.4th from init.4th the same way Hermes/Artemis/console/mint already do, and give her own idle-loop context a direct MSG-TICK call (not VM-EXEC, which would hit the same reentrancy class the existing per-other-VM pump loop already guards against) so her own queued messages actually drain. Her dictionary is now a proper superset of every child VM's, plus her remaining extra privileges -- not structurally different from any other VM, just additionally privileged. Verified: dict_hash identical across amd64/aarch64/riscv64 (0xc8f4b09e36f4fc4a), Hermes/Artemis dict_hashes unchanged and still cross-arch identical, all three boot clean to zuse)ok> with zero UNKNOWN WORD faults, mkcapsule --lint clean. Unblocks rewriting the turn-attractor (FABRIC-3.md §XIX) to coordinate via real MSG-SEND/MSG-TICK instead of blocking VM-EXEC. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01EXieurDfDSsDFdnSyusuWo --- FABRIC-3.md | 98 ++++++++++++++++++++++ capsules/BLOCK_MAP.md | 91 ++++++++++---------- capsules/common/messaging.4th | 20 ++++- capsules/init.4th | 3 + disk/artemis.img | Bin 31457280 -> 31457280 bytes src/starkernel/capsule/mama_forth_words.c | 52 ++++++++++++ src/starkernel/kernel_main.c | 37 +++++--- src/starkernel/repl.c | 16 ++++ 8 files changed, 255 insertions(+), 62 deletions(-) diff --git a/FABRIC-3.md b/FABRIC-3.md index 9bcedcd4..a9b6cb72 100644 --- a/FABRIC-3.md +++ b/FABRIC-3.md @@ -2754,3 +2754,101 @@ from §XV. The actual heat-driven "coolest live identity goes next" turn loop, a the whole campaign (including whether K still holds under genuinely interleaved multi-VM contention, which is the actual point of building this) is the next step, not done here. +## XX. Hera can't message -- root-caused and fixed by symmetry, not special-cased (2026-09-12) + +**Why this had to happen before the turn-attractor.** Building the §XIX turn-attractor around +`MSG-SEND`/`MSG-TICK` (the project's real async coordination layer, rather than blocking +`VM-EXEC`) requires Hera to be a genuine participant in that layer. She wasn't: Hera never +loaded `common:messaging.4th`, unlike Hermes, Artemis, and every identity VM. Before designing +around that gap, Captain Bob's framing was checked directly: "I don't want us to begin thinking +of Hera as being different than any other VM... the only real difference in Hera should be +access to the kernel capsule repository." That's a testable claim about the code, not just a +preference, so it was tested rather than assumed. + +**Root cause, not a design boundary.** The standing belief (recorded in the old comment this +section replaces, `kernel_main.c`) was that Hera's messaging exclusion was deliberate -- +"to avoid moving Hera's dict_hash off item 4.1's baseline." Checked live instead of trusted: +loading `common:messaging.4th` into Hera's own dictionary silently dropped every colon-definition +that referenced one of eight `STADIUM-*` primitives (`STADIUM-ADMIT`, `STADIUM-EVICT`, +`STADIUM-RES@`, `STADIUM-RES-PULL`, `STADIUM-RES-PUSH`, `STADIUM-HEAT@`, `STADIUM-HEAT!`, +`STADIUM-WORD-HEAT`) -- `register_child_vm_words()` gives every child VM these eight, but +`register_mama_forth_words()` never did. Referencing an undefined word during FORTH compilation +doesn't raise a hard error, it silently drops the definition being compiled -- so `MSG-HEAT@/!`, +`CH-HEAT@/!`, `MSG-COOL-ALL`, `MSG-TICK`, and everything else in `messaging.4th` that touches +Stadium came out missing after boot, with no error printed. Not a messaging bug and not a +designed privilege boundary -- a plain missing-primitive gap in Hera's own dictionary +specifically, that happened to surface as silently-vanished word definitions. + +**Two things independently checked before proposing a fix, not guessed at:** +- `mama_word_birth` (`mama_forth_words.c:229`, `BIRTH`'s C implementation) was read in full. + It is genuinely VM-agnostic -- it operates on whichever `vm` calls it, with no check that the + caller is Hera specifically. The only Hera-specific logic anywhere in it is the reverse guard + preventing Hera from re-birthing *herself*. `capsule_birth_baby()` treats `vm->stadium_vm_id` + generically as "whoever is birthing this VM." So "any VM could theoretically birth another" is + already true in the code, independent of this fix -- Hera's practical monopoly on `BIRTH` is + a registration-time fact (only `register_mama_forth_words()` registers it), not a check inside + `BIRTH` itself. +- `SPAWN-EVENT` (defined as the constant `1` in both `messaging.4th` and `process.4th`) was + grepped for every consumer across the tree. There are none -- it is never dispatched or + matched on anywhere. An unwired placeholder, not working infrastructure that this fix needed + to route through. + +**The fix, scoped and approved before being built ("scope it, plan it and after approval do +it"):** register the same eight `STADIUM-*` primitives for Hera that `register_child_vm_words()` +already gives every other VM -- in both of Hera's own registration sites +(`register_mama_forth_words()`'s root vocabulary and her MAMA vocabulary), matching +`register_child_vm_words()`'s list exactly. Then load `common:messaging.4th` from +`capsules/init.4th` (block 2049) the same way Hermes/Artemis/console/mint already do, and call +`MSG-CD-INIT`. This makes Hera's dictionary a proper *superset* of every child VM's, plus her +own remaining extra privileges (`BIRTH`, the capsule-repository words, `MINT`) -- not +structurally different from any other VM, just additionally privileged on top of an otherwise +identical base. Fixed by symmetry, exactly as scoped, no special-casing introduced. + +**A necessary follow-on, caught while updating the stale comment rather than just rewriting the +text.** `repl.c`'s idle-loop pump already walked the VM registry every idle beat, `VM-EXEC`ing +`"MSG-TICK"` into every *other* live VM to drain their queues -- explicitly skipping Hera's own +registry entry. Re-reading why (not assumed): the skip exists because Hera *is* the pump, and +self-targeting `VM-EXEC` would hit the same reentrancy class the loop's own dispatch guard +exists for (the same class documented elsewhere for `input_buffer`/`input_pos` not being saved +by `vm_state_push`/`pop`) -- not because she lacked `MSG-TICK`. With messaging now loaded for +her, that skip would silently leave her own queued messages undrained forever if left alone. Not +requested explicitly, but a necessary completion of "Hera is a genuine peer" -- if her own +messages never get pumped, she isn't actually participating in the layer, just able to compile +against it. Fixed by calling `MSG-TICK` directly in her own context (a plain word dispatch in +her own dictionary, not a `VM-EXEC` into anyone else's input buffer -- no reentrancy risk), +guarded the same defensive way as the loop above it (`vm_find_word` + `acl_allow` checked fresh +every tick, not a cached flag). + +**Verification: dict_hash parity held across all three architectures**, the property that +actually matters (identical value across amd64/aarch64/riscv64, not an unchanging absolute +value) -- confirmed identical post-fix on all three: `dict_hash=0xc8f4b09e36f4fc4a`, +`capsule_hash=0x1ef4939ed32ec1e6`. Hermes' and Artemis' own dict_hashes +(`0x0046d7d93aa33935`, `0x0e9e13b9c3a08542`) also matched across all three architectures, +confirming the larger, now-symmetric dictionary didn't perturb child-VM parity either. All +three booted clean to `zuse)ok>` with zero `UNKNOWN WORD` faults. `mkcapsule --lint capsules/` +passes clean (0 violations) after the `messaging.4th`/`init.4th` block-namespace edits this +required. + +**Files touched:** `src/starkernel/capsule/mama_forth_words.c` (8 `STADIUM-*` registrations + +forward declarations, in both Hera registration sites), `capsules/init.4th` (block 2049, load +`common:messaging.4th` + `MSG-CD-INIT`), `capsules/common/messaging.4th` (VM routing table +widened 8→16 slots for the identity VMs, block 5006/5042, `mkcapsule --lint` clean), +`src/starkernel/repl.c` (direct `MSG-TICK` call for Hera's own context after the existing +per-other-VM pump loop), `src/starkernel/kernel_main.c` (stale Phase C comment corrected to +describe the fix instead of the old, now-disproven constraint). + +**Explicitly captured for later, not in scope here:** Captain Bob's self-healing idea -- +"all VMs participating in a wellness check at their nearest participating wellness center" -- +a distributed liveness/failure-detection concept floated during this discussion, deliberately +not built as part of this fix. + +**Next step, now unblocked:** rewrite `EXEC-STD79-DOE-CD` (the draft turn-attractor sketched in +§XIX, written *before* this pivot and not yet reworked) to coordinate via `MSG-SEND`/`MSG-TICK` +rather than direct blocking `VM-EXEC`, add a `TIE-BREAK ( idx1 idx2 -- idx )` word (seeded coin +toss via `RANDOM` to start, swappable for inference later), change turn priority from raw +`VM-HEAT` to `VM-HEAT / tests-remaining`, confirm the natural "sender pays" reservoir economy +(`STADIUM-RES-PULL`/`STADIUM-RES-PUSH` operate on the *calling* VM's own reservoir, confirmed +via `mama_forth_words.c` -- turn cost falls on whichever VM sends, not a "winner pays" model), +then rerun the full 3×9×3 DoE campaign from the top per the standing rule that any defect +repair requires a clean re-run before a result counts as closed. + diff --git a/capsules/BLOCK_MAP.md b/capsules/BLOCK_MAP.md index 8968322d..3d4b4726 100644 --- a/capsules/BLOCK_MAP.md +++ b/capsules/BLOCK_MAP.md @@ -1,5 +1,5 @@ # Capsule Block Manifest — Auto-generated - + @@ -12,7 +12,7 @@ | `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 | | `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 | `0x5cfb02a42f4a8323` | 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:msg.4th` | 4055 | `0x850a0382344ea6c4` | yes | | `doe-campaign.4th` | 4060, 4061, 4062, 4063, 4064, 4065 | `0x3d4549142d91ec20` | yes | | `doe.4th` | 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107 | `0xf154616d248e861f` | yes | @@ -35,7 +35,7 @@ | `init-l8-temporal.4th` | 4830, 4831 | `0x51abd4c138246651` | yes | | `init-l8-transition.4th` | 4840, 4841, 4842 | `0xbcc1a81976f0a4c9` | yes | | `init-l8-volatile.4th` | 4810, 4811, 4812, 4813 | `0x98caabbbd92abac4` | yes | -| `init.4th` | 2049, 2050, 2057 | `0x5d35c5c6a6eafe04` | yes | +| `init.4th` | 2049, 2050, 2057 | `0x1ef4939ed32ec1e6` | yes | | `lib.4th` | 4050 | `0x4b216635c359ef73` | yes | | `process.4th` | 4300, 4301 | `0x781afc1dbd0294f7` | yes | | `sdk.4th` | 5109, 5110, 5111, 5112, 5113, 5114, 5115 | `0x008fdbbb62c94a3a` | yes | @@ -48,9 +48,9 @@ | LBN | Capsule | xxHash64 | Status | |-----|---------|----------|--------| -| 2049 | `init.4th` | `0x5d35c5c6a6eafe04` | ok | -| 2050 | `init.4th` | `0x5d35c5c6a6eafe04` | ok | -| 2057 | `init.4th` | `0x5d35c5c6a6eafe04` | ok | +| 2049 | `init.4th` | `0x1ef4939ed32ec1e6` | ok | +| 2050 | `init.4th` | `0x1ef4939ed32ec1e6` | ok | +| 2057 | `init.4th` | `0x1ef4939ed32ec1e6` | ok | | 2064 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok | | 2065 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok | | 2066 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok | @@ -329,45 +329,46 @@ | 5000 | `fabric.4th` | `0x9d9489cbeca4099b` | ok | | 5001 | `fabric.4th` | `0x9d9489cbeca4099b` | ok | | 5002 | `fabric.4th` | `0x9d9489cbeca4099b` | ok | -| 5003 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5004 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5005 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5006 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5007 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5008 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5009 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5010 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5011 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5012 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5013 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5014 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5015 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5016 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5017 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5018 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5019 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5020 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5021 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5022 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5023 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5024 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5025 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5026 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5027 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5028 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5029 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5030 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5031 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5032 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5033 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5034 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5035 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5036 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5037 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5038 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5039 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5040 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | -| 5041 | `common:messaging.4th` | `0x5cfb02a42f4a8323` | ok | +| 5003 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5004 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5005 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5006 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5007 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5008 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5009 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5010 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5011 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5012 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5013 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5014 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5015 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5016 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5017 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5018 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5019 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5020 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5021 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5022 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5023 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5024 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5025 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5026 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5027 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5028 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5029 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5030 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5031 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5032 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5033 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5034 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5035 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5036 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5037 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5038 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5039 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5040 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5041 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | +| 5042 | `common:messaging.4th` | `0xedde53f6faed7355` | ok | | 5100 | `turtle.4th` | `0x4d470418ca543365` | ok | | 5101 | `turtle.4th` | `0x4d470418ca543365` | ok | | 5102 | `turtle.4th` | `0x4d470418ca543365` | ok | diff --git a/capsules/common/messaging.4th b/capsules/common/messaging.4th index fd15aa36..99161b5a 100644 --- a/capsules/common/messaging.4th +++ b/capsules/common/messaging.4th @@ -59,19 +59,31 @@ VARIABLE CH-ACTIVE VARIABLE COMMON-CH VARIABLE MY-CH-ID Block 5006 -( VM name routing table -- same fixed table every VM loads, ) -( so IDX>NAME resolves identically everywhere. ) -8 CONSTANT VM-MAX +( VM routing table. SXIX: 16 slots, not 8 -- see FABRIC-3.md. ) +( Hera/Hermes/Artemis stay 0/1/2 (artemis:init.4th depends on ) +( it); identities get NEW slots 3-10, never renumbered. ) +16 CONSTANT VM-MAX CREATE VM-NAME-ADDRS VM-MAX CELLS ALLOT CREATE VM-NAME-LENS VM-MAX CELLS ALLOT : VM-NAME-REG ( addr u idx -- ) DUP VM-MAX >= IF DROP 2DROP EXIT THEN >R R@ CELLS VM-NAME-LENS + ! R> CELLS VM-NAME-ADDRS + ! ; +Block 5042 +( doe-idx (std79-doe.fth ID-NAME) -> msg-idx: 1..8 -> 3..10. ) +: DOE-IDX>MSG-IDX ( doe-idx -- msg-idx ) 2 + ; : VM-NAMES-INIT ( -- ) S" Hera" 0 VM-NAME-REG S" Hermes" 1 VM-NAME-REG - S" Artemis" 2 VM-NAME-REG ; + S" Artemis" 2 VM-NAME-REG + S" rajames" 1 DOE-IDX>MSG-IDX VM-NAME-REG + S" 00" 2 DOE-IDX>MSG-IDX VM-NAME-REG + S" 01" 3 DOE-IDX>MSG-IDX VM-NAME-REG + S" 02" 4 DOE-IDX>MSG-IDX VM-NAME-REG + S" 03" 5 DOE-IDX>MSG-IDX VM-NAME-REG + S" 04" 6 DOE-IDX>MSG-IDX VM-NAME-REG + S" 05" 7 DOE-IDX>MSG-IDX VM-NAME-REG + S" 06" 8 DOE-IDX>MSG-IDX VM-NAME-REG ; Block 5007 ( INIT-FREE. stamps STADIUM-NONE into each slot's stadium- ) ( cell field (msg off 5, ch off 3). Raw offsets: accessors ) diff --git a/capsules/init.4th b/capsules/init.4th index e984b078..29ca3418 100644 --- a/capsules/init.4th +++ b/capsules/init.4th @@ -19,6 +19,9 @@ S" zuse-eligibility.4th" EXEC S" lib.4th" EXEC S" fabric.4th" EXEC S" font.4th" EXEC +( SXX: same pattern Hermes/Artemis/console/mint already use. ) +S" common:messaging.4th" EXEC +MSG-CD-INIT Block 2050 ( Hera boot — banner ) BOOT-BANNER diff --git a/disk/artemis.img b/disk/artemis.img index aeff4ce147538bffc2082b042abb0f98d02dbff8..55ee6e14997bd65b96023445e7522fd712b37c1f 100644 GIT binary patch delta 6519 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 N0h-v((TfVre*moLS`z>O delta 5856 zcmeH~>sM1(8i$RXKnNj3Oh}drMq5aZ2qJY9SObDq#S7>tQQH})T7p#rs9?n#rRq|r z9TXQBtV#qgRgX&Pz)GB@P`qmuh<6uk_!S_kUMWN#>s~81zE+43y%8P=4k1Q(BD@e1gf~Kp@IlBBz6d$O4?*ht zAp8-1ZLbx|z)dv& znkfpKfzNKW(gBOefSu7_-xzb<8U0BJTr!5?X67M0U zC{!vn;>17raRXdwYZb;9YYVr!I0_xtBERX&62?Lu_*k=<`sOprKwDtF^0kk+YV|Kn zGBiLsqJPa;XasAXbkicMolJ7DE=5cxC6lxu-yJiHvCs;x`SwE>M~kd&#NTdPE@6HL z@)F4^#zH69(XiUZ(IRt~(%0teQ2NNk`xZ7c$n^vakRHJN_EPU+wyAGj&&!Uwv$d#OtdvG06zuyIpDzk zixHXg0yrC25TKNC=I75I({(Nkz*f6tc;ZH3GjMHFF2NYydW;OP<6BLaYXEC~0CrW$ zu@eNzHf@01(i8cN);0o_<5CIY0k9K!RZ<4c8d{K5Bp+gOD{!kZ(KQj4j>yky`!Kl! z+4cKEncNA?IFLsWBRhz^<%Z}vZKDU-YvZ#i3QpkhH8O%Rq8c^aADflT^;K)Quk?Y; zl>=9vwbL#XL@qD}J*5K&A}jCS#JUIq&TZXEyU-H(%Axts$wO-HU7gxt5LMfqFNb~Y z2P7B(gv}7!qfQaTGAUJ9rXn?#DZ%S=6K$mo zN@&P#ih>1L+tN)C6$jOFo4i~tm2uzQnVv~2jzYY$XAerwhquANogSyih@$Bq%0;fw831UO*;HnGPGS^p!J9gj;=E{K?@+!A$mgsPh zD0Dd4KMHoTia;p;80>X{HW>u$ZwMraCbeYviPl9IY)gDqF{09$VLCOJSh0fH;jkl~ z=DTgPUgvG|j?nqZILX$_R58RtS)YBKRm1^3e`s@8SmVj~VMY8!_w0rwWQWg=q$nf< z_Z*r)5bHl%C$@>F>H5mJ{bww!A{ELc^C4D|23$7vjJv`*hYTOy9`HRKJ`>rUi-uDa zvVaL);|Stf7ZW+pWMT3eWQSB*F1c%keBg$oy9uI~Je|ZQDbOioTyxw*su&8PXbwDK z6`O&Nzv=#MMG>h`7EZcM8!978@pOuU1?YG%iy#^*Ck=IWR51A{vY(t6m|O{bRZ&gl zDk6J^b~Cva*$TU~fp%X9)PJTXh>`1w98x%sW(^IVNd@hykMBdbRfyph% zX2joQaw~9Rf=)0w9Jun`vs8{Ca_b(2osJxf?3A>D6ooioZa_Fej2utowGsJD zPC~XRaubu2ffpwhQh6GYM;5m-IThK!w00(^0l$xUOyxO5_OQiVp>1R$>wkDOMIj65 zxHy3z+E`5F@Pe&OUW2SKc{`Kyf%|rrQ@Mc1muotiT!?Io_yvN>5cCF6|`zD`ceEs=Psa@H=r2WJcWMc?dE+}1jzI<+MUA0j<^jkx~AkGuP$E=m+= zIv9LTV{NXRJUwN`N0XYsP{+V>cP z`qY@CU65|f%3bjBT$5>q)>X9p6XQ~2I0~Y)W2Yw1NJ&Ue!8l<_3A3eRr;jVOzsp}Q z&AQJov_(DO<9b{5XpzhD{QWLh%LDR9Rg}lJ-)>@eW!HocpQ&+I1}x3nMNj*~;k=p~ z+;1nTz?!_z zViJ_}S!oo7WZ=C^CR&j~=9q?i?XjVj6{Nx#ntiFvwj`FkgAS*mtL5)qqZMa(tj-*= zI>+_77CJ{JO6FB;qbOtnyIyt>B+mnnjhJGYvYX0lkk#z@n4*vm>LbzLIJsi zS(XM?Q3z#W`wy&QGtj5JlUAhjQk%4hm&>^6H=@hw9A!}U^D`(47T}4wMuKdPaxzDs zTYqB}N1;shKgB94fiK$c&i8K}(FnYq-0ZHf+R1GisaZ+(G+DP6WVg+qy2p(|D=_tH9>EyV*KNG} zBlle9xM*U=Rxi1(XIb&Y=nX6jqpHl2r3UMaU6;2nC`K!XGpBjTnw80dEIacl_allow) { + vm_interpret(mama, "MSG-TICK"); + } + } g_idle_pump_active = 0; if (console_tx_count() == tx_before_idle) {