Stage E: Category B strip -- remove Hermes, messaging.4th, old routing (FABRIC-3.6.md task 4.1-4.4)
All FORTH-owned message types were cut over to kernel-Hermes in Phase 3 (tasks 3.8-3.10). This removes the now-dead FORTH messaging layer and the Hermes VM itself: capsules/common/messaging.4th, capsules/hermes/init.4th, the slot-3 VM-NAME-REG pairing convention, and every load-site/birth-site reference across capsules/init.4th, artemis/init.4th, hestia/init.4th, doe-campaign.4th (Artemis-only now), capsule_console.c, capsule_mint.c, capsule_wirebind.c, capsule_birth.c, and kernel_main.c. Verified on all three architectures: clean boot, mkcapsule --lint clean (36 files, 0 violations), zero UNKNOWN WORD, identical dict_hash across amd64/aarch64/riscv64 for every VM, and a full mint -> WIREBIND-attach -> USE -> relay round-trip exercising the two highest-risk edits (capsule_console.c/capsule_mint.c). Found, not fixed: deleting messaging.4th removes SEND-ELEVATE-REQUEST, which was the only caller of KH-ELEVATE-SEND and the only path to ELEVATE-GRANT (zuse-eligibility.4th, still loaded at boot) -- Phase 8 PKI's own elevation entrypoint. Needs a decision before Phase 5 close-out. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
cab9b5a31f
commit
3e201c82a5
+71
-6
@@ -1265,15 +1265,80 @@ ruling]** cannot be written precisely until Captain Bob settles the named sub-it
|
||||
through every one of tasks 3.8/3.9/3.10's acceptance logs, cited in their own entries above.
|
||||
**Phase 4 may begin.**
|
||||
|
||||
## Phase 4 — Category B strip
|
||||
## Phase 4 — Category B strip — **COMPLETE 2026-09-22**
|
||||
|
||||
Only after every live type is cut over. **Hermes leaves `is_fleet_foundation` and
|
||||
`kernel_main.c` here, not earlier** (§XXXIV.4).
|
||||
`kernel_main.c` here, not earlier** (§XXXIV.4). Per FABRIC-3.5.md §XXXIV.3, Stage E is one
|
||||
atomic change set — 4.1–4.4 are checked off together, not independently bootable
|
||||
intermediate states.
|
||||
|
||||
- [ ] **4.1** — Strip `capsules/hermes/init.4th`.
|
||||
- [ ] **4.2** — Strip the FORTH routing table and slot-3 pairing convention.
|
||||
- [ ] **4.3** — Strip `capsules/common/messaging.4th`.
|
||||
- [ ] **4.4** — Remove Hermes from `is_fleet_foundation` and its birth from `kernel_main.c`.
|
||||
- [x] **4.1** — Strip `capsules/hermes/init.4th`. Deleted. `is_fleet_foundation` no longer
|
||||
needs it — nothing else referenced this file.
|
||||
- [x] **4.2** — Strip the FORTH routing table and slot-3 pairing convention.
|
||||
`capsule_wirebind.c`'s slot-3 `VM-NAME-REG` registration call removed (already dead
|
||||
since task 3.9's cutover moved name resolution to `sk_console_user_prefix()`).
|
||||
- [x] **4.3** — Strip `capsules/common/messaging.4th`. Deleted. Two C-side dependents found
|
||||
by full-repo grep (not just `capsules/`) and fixed as part of this same commit:
|
||||
`capsule_console.c`'s `CONSOLE_IDENTITY_SRC` (dropped its `S" common:messaging.4th"
|
||||
EXEC` / `MSG-CD-INIT` lines, kept `Block 4997`) and `capsule_mint.c`'s
|
||||
`MINT_DEFAULT_PERSONALITY` (same two lines dropped, kept `WELCOME`). Every capsule that
|
||||
loaded the file (`capsules/init.4th` block 2049, `capsules/artemis/init.4th` block 4854,
|
||||
`capsules/hestia/init.4th` block 4987) had its load line + `MSG-CD-INIT` +
|
||||
`MY-CH-ID`/`CH-ADD-MBR` setup removed; Artemis and Hestia kept their own
|
||||
`STARTUP-BANNER`/`WELCOME` tails. `capsules/doe-campaign.4th` (`SETUP-HERMES`/
|
||||
`SETUP-VMS`/`PHASE1-DOE`/`CD-TICK`/`SMOKE-CAMPAIGN`, blocks 4060–4064) reduced to
|
||||
Artemis-only per explicit instruction (fold `SETUP-HERMES` strip into this same commit).
|
||||
`capsules/zuse-eligibility.4th`'s header comment updated to point at the kernel-Hermes
|
||||
drain checkpoint instead of the removed `MSG-DELIVER` path.
|
||||
- [x] **4.4** — Remove Hermes from `is_fleet_foundation` and its birth from `kernel_main.c`.
|
||||
`capsule_birth.c`'s `is_fleet_foundation` OR-chain drops the `"Hermes"` prefix check.
|
||||
`kernel_main.c`: Hermes's own birth block removed, the Artemis-birth comment referencing
|
||||
it fixed, `sk_vm_switch_signal_register(hermes_entry.vm_id)` + its guard removed, and the
|
||||
"Kernel-Hermes common-channel fleet self-test" fixed to drop its unconditional
|
||||
Hermes-liveness requirement (was about to false-FAIL post-strip). The drain and
|
||||
channel-open-policy self-tests already had graceful `SKIPPED (Hermes not live)` /
|
||||
`SKIPPED (Hera/Hermes not available)` fallbacks and needed no change — confirmed live
|
||||
below, not just by inspection.
|
||||
|
||||
2026-09-22 · **Closed.** `mkcapsule --lint capsules/` clean: 36 files (was 38 — the two
|
||||
Category B deletions), 0 violations. Full three-architecture acceptance, each run the
|
||||
same sequence: clean boot → self-test block → hot-attach bob's blank identity thumbdrive
|
||||
via QMP → `MINT` → detach/reattach to trigger `WIREBIND` → `USE rajames` → `1 2 + .`
|
||||
relay round-trip.
|
||||
- amd64: `logs/20260922-181141/amd64/qemu-amd64-20260922-181141.log`
|
||||
- aarch64: `logs/20260922-181753/aarch64/qemu-aarch64-20260922-181753.log`
|
||||
- riscv64: `logs/20260922-182136/riscv64/qemu-riscv64-20260922-182136.log`
|
||||
|
||||
Zero `UNKNOWN WORD` on all three. `PARITY:` lines carry only Hera/Hestia/Artemis — Hermes
|
||||
genuinely absent, not just silent. **`dict_hash` identical across all three
|
||||
architectures for every VM**: `0x0a0ad2497d33c3c0` (Hera, `MAMA_INIT`), `0xb1256603
|
||||
f848e2b9` (Hestia), `0xc791409ac1715690` (Artemis) — matching §XXXIV.6's rule (a
|
||||
*changing* hash is expected; cross-architecture *divergence* is the stop condition; none
|
||||
occurred). Self-tests on all three: "Kernel-Hermes common-channel fleet self-test: PASS"
|
||||
(confirming the 4.4 fix), "Kernel-Hermes drain self-test: SKIPPED (Hermes not live)" and
|
||||
"Kernel-Hermes channel-open policy self-test: SKIPPED (Hera/Hermes not available)" both
|
||||
graceful as predicted, every other self-test PASS. `mint → attach → USE → relay` verified
|
||||
live and byte-identical across all three architectures: prompt correctly shows
|
||||
`[rajames@rajames]` (task-3.9-era prompt fix holding), single `ok`/`ok>` cycle (CRLF fix
|
||||
holding), `1 2 + .` → `3` delivered via `Kernel-Hermes CONSOLE-CMD-EVENT (real, Stage D)`
|
||||
with `stadium_conserved(self)=true` on every run.
|
||||
|
||||
**Found, not fixed (Captain Bob's Law): `capsules/zuse-eligibility.4th`'s only policy
|
||||
word, `ELEVATE-GRANT`, is now unreachable — and this file is still loaded at boot
|
||||
(`capsules/init.4th:18`, `S" zuse-eligibility.4th" EXEC`), not dead/orphaned code.** Task
|
||||
3.10 made `SEND-ELEVATE-REQUEST` (which called `KH-ELEVATE-SEND`, `repl.c`) live in
|
||||
`messaging.4th`; this task deletes that entire file. `grep -rn "SEND-ELEVATE-REQUEST"
|
||||
capsules/ src/ include/` after the strip: zero hits outside comments — the word no longer
|
||||
exists anywhere, so nothing can reach `KH-ELEVATE-SEND` or `ELEVATE-GRANT` any more. This
|
||||
is not stray dead code left over from a cutover; it is **Phase 8 PKI's own named-open-item
|
||||
elevation entrypoint** (see this document's own ACL section / `docs/03-architecture/
|
||||
word-acl/DESIGN.md` Phase 8) deleted as collateral of the Category B strip. A live capsule
|
||||
is now shipping with a policy word nothing can call. Left as-is per this task's own scope
|
||||
— **this needs a decision from Captain Bob before Phase 5 close-out, not just a cleanup
|
||||
note**: either give `SEND-ELEVATE-REQUEST` a new home now (e.g. inline in
|
||||
`zuse-eligibility.4th` itself, which already depends on nothing from the deleted file), or
|
||||
explicitly accept that Phase 8 PKI work will need to build its own entrypoint from
|
||||
scratch rather than resuming this one.
|
||||
|
||||
## Phase 5 — Close-out
|
||||
|
||||
|
||||
+74
-118
@@ -1,5 +1,5 @@
|
||||
# Capsule Block Manifest — Auto-generated
|
||||
<!-- Generated by mkcapsule --manifest 2026-09-22T15:02:28Z -->
|
||||
<!-- Generated by mkcapsule --manifest 2026-09-22T22:29:26Z -->
|
||||
<!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. -->
|
||||
<!-- Hand-written justifications and immutability notes live -->
|
||||
<!-- in MANIFEST.md alongside this auto-generated index. -->
|
||||
@@ -10,22 +10,20 @@
|
||||
|---------|----------------|----------|--------|
|
||||
| `ACL.4th` | 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4015 | `0xf8890c05c0d8f921` | 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, 4860 | `0x419d50262e5ecfbe` | 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, 4860 | `0xe6fba9ae56e1c916` | 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, 5031, 5032, 5033, 5034, 5035, 5036, 5037, 5038, 5039, 5040, 5041, 5042 | `0x863f77893ef8f353` | yes |
|
||||
| `doe-campaign.4th` | 4060, 4061, 4062, 4063, 4064, 4065 | `0x3d4549142d91ec20` | yes |
|
||||
| `doe-campaign.4th` | 4060, 4061, 4062, 4063, 4064, 4065 | `0x26fb485e5c9dc6ff` | yes |
|
||||
| `doe.4th` | 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107 | `0xf154616d248e861f` | yes |
|
||||
| `fabric.4th` | 4900, 4901, 4902, 4903, 4904, 4905, 4906, 4907, 4908, 4909, 4910, 4911, 4912, 4913, 4914, 4915, 4916, 4917, 4918, 4919, 4920, 4921, 4922, 4923, 4924, 5000, 5001, 5002 | `0x9d9489cbeca4099b` | yes |
|
||||
| `font.4th` | 4925, 4926, 4927, 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, 4936, 4937, 4938, 4939, 4940, 4941, 4942, 4943, 4944, 4945, 4946, 4947, 4948, 4949, 4950, 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, 4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, 4967, 4968, 4969, 4970, 4971, 4972, 4973, 4974, 4975, 4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983, 4984, 4985 | `0x3f305911500c78f6` | yes |
|
||||
| `hermes:init.4th` | 4153, 4855, 5116 | `0x2df61924448a6812` | yes |
|
||||
| `hestia:init.4th` | 4986, 4987, 4988 | `0x6aa0a1b5daf9d2ec` | yes |
|
||||
| `hestia:init.4th` | 4986, 4987, 4988 | `0x64e111990fbc45ff` | yes |
|
||||
| `init-l8-diverse.4th` | 4820, 4821, 4822 | `0xaa293201a6c91838` | yes |
|
||||
| `init-l8-omni.4th` | 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079 | `0x5979e314d6452045` | yes |
|
||||
| `init-l8-stable.4th` | 4806 | `0xdc3830f189063a9a` | yes |
|
||||
| `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 | `0x97e74b7abd3d3366` | yes |
|
||||
| `init.4th` | 2049, 2050, 2057 | `0xea038ba684c53443` | yes |
|
||||
| `lib.4th` | 4050 | `0x4b216635c359ef73` | yes |
|
||||
| `multiuser-doe.4th` | 5044, 5045, 5046, 5047, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 5055 | `0x22140588ee7c39e6` | yes |
|
||||
| `sdk.4th` | 5109, 5110, 5111, 5112, 5113, 5114, 5115 | `0x008fdbbb62c94a3a` | yes |
|
||||
@@ -44,16 +42,16 @@
|
||||
| `workload-8.4th` | 2160 | `0x56b7f2f0efa000df` | yes |
|
||||
| `workload-9.4th` | 4706, 4715, 4725, 4735, 4745 | `0x3f2bec73142aa424` | yes |
|
||||
| `workload-calib1.4th` | 5043 | `0x3b9f2d17b554fabc` | yes |
|
||||
| `zuse-eligibility.4th` | 4021, 4022 | `0x8b49c1bc1e01dc58` | yes |
|
||||
| `zuse-eligibility.4th` | 4021, 4022 | `0x7b28f4776a32e0b7` | yes |
|
||||
| `zuse.4th` | 4016, 4017, 4018 | `0x490ded9be257a90b` | yes |
|
||||
|
||||
## Block Map (sorted by LBN)
|
||||
|
||||
| LBN | Capsule | xxHash64 | Status |
|
||||
|-----|---------|----------|--------|
|
||||
| 2049 | `init.4th` | `0x97e74b7abd3d3366` | ok |
|
||||
| 2050 | `init.4th` | `0x97e74b7abd3d3366` | ok |
|
||||
| 2057 | `init.4th` | `0x97e74b7abd3d3366` | ok |
|
||||
| 2049 | `init.4th` | `0xea038ba684c53443` | ok |
|
||||
| 2050 | `init.4th` | `0xea038ba684c53443` | ok |
|
||||
| 2057 | `init.4th` | `0xea038ba684c53443` | ok |
|
||||
| 2064 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
|
||||
| 2065 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
|
||||
| 2066 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
|
||||
@@ -116,8 +114,8 @@
|
||||
| 4018 | `zuse.4th` | `0x490ded9be257a90b` | ok |
|
||||
| 4019 | `block-acl.4th` | `0xf6cc2a59e3a6734e` | ok |
|
||||
| 4020 | `block-acl.4th` | `0xf6cc2a59e3a6734e` | ok |
|
||||
| 4021 | `zuse-eligibility.4th` | `0x8b49c1bc1e01dc58` | ok |
|
||||
| 4022 | `zuse-eligibility.4th` | `0x8b49c1bc1e01dc58` | ok |
|
||||
| 4021 | `zuse-eligibility.4th` | `0x7b28f4776a32e0b7` | ok |
|
||||
| 4022 | `zuse-eligibility.4th` | `0x7b28f4776a32e0b7` | ok |
|
||||
| 4023 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
|
||||
| 4024 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
|
||||
| 4025 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
|
||||
@@ -145,58 +143,57 @@
|
||||
| 4047 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
|
||||
| 4048 | `acl-std79.4th` | `0x773bf9209df191d1` | ok |
|
||||
| 4050 | `lib.4th` | `0x4b216635c359ef73` | ok |
|
||||
| 4060 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
|
||||
| 4061 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
|
||||
| 4062 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
|
||||
| 4063 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
|
||||
| 4064 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
|
||||
| 4065 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
|
||||
| 4110 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4111 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4112 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4113 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4122 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4123 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4124 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4125 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4126 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4127 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4128 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4129 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4130 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4131 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4132 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4133 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4134 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4135 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4136 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4137 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4138 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4139 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4140 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4141 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4153 | `hermes:init.4th` | `0x2df61924448a6812` | ok |
|
||||
| 4160 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4161 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4162 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4163 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4164 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4165 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4166 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4167 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4168 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4169 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4170 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4171 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4172 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4173 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4174 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4177 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4178 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4179 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4180 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4181 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4182 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4060 | `doe-campaign.4th` | `0x26fb485e5c9dc6ff` | ok |
|
||||
| 4061 | `doe-campaign.4th` | `0x26fb485e5c9dc6ff` | ok |
|
||||
| 4062 | `doe-campaign.4th` | `0x26fb485e5c9dc6ff` | ok |
|
||||
| 4063 | `doe-campaign.4th` | `0x26fb485e5c9dc6ff` | ok |
|
||||
| 4064 | `doe-campaign.4th` | `0x26fb485e5c9dc6ff` | ok |
|
||||
| 4065 | `doe-campaign.4th` | `0x26fb485e5c9dc6ff` | ok |
|
||||
| 4110 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4111 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4112 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4113 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4122 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4123 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4124 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4125 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4126 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4127 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4128 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4129 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4130 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4131 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4132 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4133 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4134 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4135 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4136 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4137 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4138 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4139 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4140 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4141 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4160 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4161 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4162 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4163 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4164 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4165 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4166 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4167 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4168 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4169 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4170 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4171 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4172 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4173 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4174 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4177 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4178 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4179 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4180 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4181 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4182 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4200 | `user-font-demo.4th` | `0xce1fd7d1b581a56d` | ok |
|
||||
| 4201 | `user-font-demo.4th` | `0xce1fd7d1b581a56d` | ok |
|
||||
| 4202 | `user-font-demo.4th` | `0xce1fd7d1b581a56d` | ok |
|
||||
@@ -234,15 +231,14 @@
|
||||
| 4840 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok |
|
||||
| 4841 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok |
|
||||
| 4842 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok |
|
||||
| 4851 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4852 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4853 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4854 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4855 | `hermes:init.4th` | `0x2df61924448a6812` | ok |
|
||||
| 4856 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4857 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4858 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4860 | `artemis:init.4th` | `0x419d50262e5ecfbe` | ok |
|
||||
| 4851 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4852 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4853 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4854 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4856 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4857 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4858 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4860 | `artemis:init.4th` | `0xe6fba9ae56e1c916` | ok |
|
||||
| 4900 | `fabric.4th` | `0x9d9489cbeca4099b` | ok |
|
||||
| 4901 | `fabric.4th` | `0x9d9489cbeca4099b` | ok |
|
||||
| 4902 | `fabric.4th` | `0x9d9489cbeca4099b` | ok |
|
||||
@@ -329,51 +325,12 @@
|
||||
| 4983 | `font.4th` | `0x3f305911500c78f6` | ok |
|
||||
| 4984 | `font.4th` | `0x3f305911500c78f6` | ok |
|
||||
| 4985 | `font.4th` | `0x3f305911500c78f6` | ok |
|
||||
| 4986 | `hestia:init.4th` | `0x6aa0a1b5daf9d2ec` | ok |
|
||||
| 4987 | `hestia:init.4th` | `0x6aa0a1b5daf9d2ec` | ok |
|
||||
| 4988 | `hestia:init.4th` | `0x6aa0a1b5daf9d2ec` | ok |
|
||||
| 4986 | `hestia:init.4th` | `0x64e111990fbc45ff` | ok |
|
||||
| 4987 | `hestia:init.4th` | `0x64e111990fbc45ff` | ok |
|
||||
| 4988 | `hestia:init.4th` | `0x64e111990fbc45ff` | ok |
|
||||
| 5000 | `fabric.4th` | `0x9d9489cbeca4099b` | ok |
|
||||
| 5001 | `fabric.4th` | `0x9d9489cbeca4099b` | ok |
|
||||
| 5002 | `fabric.4th` | `0x9d9489cbeca4099b` | ok |
|
||||
| 5003 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5004 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5005 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5006 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5007 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5008 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5009 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5010 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5011 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5012 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5013 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5014 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5015 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5016 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5017 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5018 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5019 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5020 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5021 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5022 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5023 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5024 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5025 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5026 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5027 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5028 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5029 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5031 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5032 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5033 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5034 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5035 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5036 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5037 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5038 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5039 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5040 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5041 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5042 | `common:messaging.4th` | `0x863f77893ef8f353` | ok |
|
||||
| 5043 | `workload-calib1.4th` | `0x3b9f2d17b554fabc` | ok |
|
||||
| 5044 | `multiuser-doe.4th` | `0x22140588ee7c39e6` | ok |
|
||||
| 5045 | `multiuser-doe.4th` | `0x22140588ee7c39e6` | ok |
|
||||
@@ -407,11 +364,10 @@
|
||||
| 5113 | `sdk.4th` | `0x008fdbbb62c94a3a` | ok |
|
||||
| 5114 | `sdk.4th` | `0x008fdbbb62c94a3a` | ok |
|
||||
| 5115 | `sdk.4th` | `0x008fdbbb62c94a3a` | ok |
|
||||
| 5116 | `hermes:init.4th` | `0x2df61924448a6812` | ok |
|
||||
|
||||
## Conflicts
|
||||
|
||||
None.
|
||||
|
||||
---
|
||||
*38 capsule(s) scanned. Re-run `mkcapsule --manifest <dir>` to refresh.*
|
||||
*36 capsule(s) scanned. Re-run `mkcapsule --manifest <dir>` to refresh.*
|
||||
|
||||
@@ -492,13 +492,9 @@ Block 4853
|
||||
CD-INIT
|
||||
S" lib.4th" EXEC
|
||||
Block 4854
|
||||
( Phase C 2026-08-28: own messaging vocab + subscribe into )
|
||||
( Hermes's canonical COMMON-CH (idx 2 = Artemis, VM-NAMES- )
|
||||
( INIT). Hermes always exists by Artemis's birth. )
|
||||
S" common:messaging.4th" EXEC
|
||||
MSG-CD-INIT
|
||||
2 MY-CH-ID !
|
||||
S" 2 COMMON-CH @ CH-ADD-MBR" S" Hermes" VM-EXEC
|
||||
( FABRIC-3.6.md Phase 4, Stage E: common:messaging.4th/ )
|
||||
( MSG-CD-INIT/MY-CH-ID/COMMON-CH subscription all removed )
|
||||
( -- Hermes, the channel, and the words are all gone. )
|
||||
STARTUP-BANNER
|
||||
|
||||
Block 4856
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,20 +1,17 @@
|
||||
Block 4060
|
||||
( doe-campaign.4th: Compudynamics DoE campaign orchestrator )
|
||||
( Requires: doe.4th (word-level) + real VM fleet touches. )
|
||||
( Child VMs must define LOAD-DOE. )
|
||||
: SETUP-HERMES ( -- )
|
||||
S" Hermes" BIRTH
|
||||
S" LOAD-DOE" S" Hermes" VM-EXEC ;
|
||||
( Child VMs must define LOAD-DOE. FABRIC-3.6.md Phase 4, )
|
||||
( Stage E: SETUP-HERMES removed -- Hermes no longer exists. )
|
||||
: SETUP-ARTEMIS ( -- )
|
||||
S" Artemis" BIRTH
|
||||
S" LOAD-DOE" S" Artemis" VM-EXEC ;
|
||||
: SETUP-VMS ( -- )
|
||||
SETUP-HERMES SETUP-ARTEMIS ;
|
||||
SETUP-ARTEMIS ;
|
||||
Block 4061
|
||||
( Phase 1: each VM runs DOE-WORK once for baseline. )
|
||||
( FABRIC-3.6.md Phase 4, Stage E: Hermes's own line removed. )
|
||||
: PHASE1-DOE ( -- )
|
||||
." Phase 1: Hermes" CR
|
||||
S" DOE-WORK" S" Hermes" VM-EXEC
|
||||
." Phase 1: Artemis" CR
|
||||
S" DOE-WORK" S" Artemis" VM-EXEC ;
|
||||
( HISTORICAL: CD-WORK removed 2026-07-08 -- dead code, )
|
||||
@@ -24,8 +21,9 @@ Block 4062
|
||||
( CD-TICK: one real fleet touch pass -- not a fake pump. )
|
||||
( Heat only moves via real VM-EXEC/VM-CALL/VM-STEP now; )
|
||||
( there is nothing left to artificially bump per VM. )
|
||||
( FABRIC-3.6.md Phase 4, Stage E: Hermes's own line )
|
||||
( removed -- one touch per tick now, not two. )
|
||||
: CD-TICK ( -- )
|
||||
S" DOE-WORK" S" Hermes" VM-EXEC
|
||||
S" DOE-WORK" S" Artemis" VM-EXEC ;
|
||||
: CD-DOE ( n -- ) 0 DO CD-TICK LOOP ;
|
||||
: CAMPAIGN-STATUS ( -- )
|
||||
@@ -47,11 +45,10 @@ Block 4064
|
||||
( Smoke test: 1 rep seed 1959 + 16 real fleet touches )
|
||||
( HISTORICAL: VM-HEAT! artificial seeding removed -- new )
|
||||
( VMs start at zero heat by construction, no seed needed. )
|
||||
( FABRIC-3.6.md Phase 4, Stage E: Hermes's own rep removed. )
|
||||
: SMOKE-CAMPAIGN ( -- )
|
||||
." === Smoke: 1 rep seed 1959 ===" CR
|
||||
SETUP-VMS
|
||||
." Hermes 1 rep..." CR
|
||||
S" 1959 1 EXEC-DOE" S" Hermes" VM-EXEC
|
||||
." Artemis 1 rep..." CR
|
||||
S" 1959 1 EXEC-DOE" S" Artemis" VM-EXEC
|
||||
." 16 real fleet touches..." CR
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
Block 4855
|
||||
( Hermes v1 -- WELCOME. Generic messaging vocab moved to )
|
||||
( common:messaging.4th, FABRIC-2.md Phase C 2026-08-28. )
|
||||
: WELCOME ( -- ) LOG-INFO" Hermes: loaded" ;
|
||||
WELCOME
|
||||
Block 4153
|
||||
( LOAD-DOE: pulls in doe.4th's word-level DOE-WORK )
|
||||
( workload, for doe-campaign.4th's remote VM-EXEC. )
|
||||
: LOAD-DOE ( -- ) S" doe.4th" EXEC ;
|
||||
Block 5116
|
||||
( Hermes owns the one real, canonical COMMON-CH. Every )
|
||||
( other VM subscribes into it via VM-EXEC (see Artemis's )
|
||||
( and Hera's own init.4th); Hera always exists first, so )
|
||||
( Hermes adds her here rather than Hera subscribing to a )
|
||||
( VM that doesn't exist yet at Hera's own birth. )
|
||||
S" common:messaging.4th" EXEC
|
||||
MSG-CD-INIT
|
||||
1 MY-CH-ID !
|
||||
S" lib.4th" EXEC
|
||||
1 COMMON-CH @ CH-ADD-MBR
|
||||
0 COMMON-CH @ CH-ADD-MBR
|
||||
LOG-INFO" Hermes: ready"
|
||||
STARTUP-BANNER
|
||||
@@ -14,19 +14,9 @@ Block 4988
|
||||
S" fabric.4th" EXEC
|
||||
S" font.4th" EXEC
|
||||
Block 4987
|
||||
( Hestia joins COMMON-CH as a full messaging participant, )
|
||||
( same pattern Hermes/Artemis already use. Fresh slot 11: )
|
||||
( Hera/Hermes/Artemis hold 0/1/2, identities hold 3-10 )
|
||||
( (messaging.4th:78-85), and Phase 1's gate is "messaging )
|
||||
( untouched" -- so VM-NAME-REG for "Hestia" is NOT added )
|
||||
( here; that needs editing messaging.4th's VM-NAMES-INIT, )
|
||||
( out of this task's scope. Hestia is CH-reachable by slot )
|
||||
( today, not yet VM-EXEC-addressable by name. )
|
||||
S" common:messaging.4th" EXEC
|
||||
MSG-CD-INIT
|
||||
11 MY-CH-ID !
|
||||
( FABRIC-3.6.md Phase 4, Stage E: common:messaging.4th/ )
|
||||
( MSG-CD-INIT/MY-CH-ID/COMMON-CH subscription all removed )
|
||||
( -- the whole COMMON-CH concept is gone with the file. )
|
||||
S" lib.4th" EXEC
|
||||
11 COMMON-CH @ CH-ADD-MBR
|
||||
0 COMMON-CH @ CH-ADD-MBR
|
||||
LOG-INFO" Hestia: ready"
|
||||
STARTUP-BANNER
|
||||
|
||||
+2
-3
@@ -17,9 +17,8 @@ S" ACL.4th" EXEC
|
||||
S" block-acl.4th" EXEC
|
||||
S" zuse-eligibility.4th" EXEC
|
||||
S" lib.4th" EXEC
|
||||
( SXX: same pattern Hermes/Artemis/console/mint already use. )
|
||||
S" common:messaging.4th" EXEC
|
||||
MSG-CD-INIT
|
||||
( FABRIC-3.6.md Phase 4, Stage E: common:messaging.4th/ )
|
||||
( MSG-CD-INIT removed -- no longer exists, no longer needed. )
|
||||
Block 2050
|
||||
( Hera boot — banner )
|
||||
BOOT-BANNER
|
||||
|
||||
@@ -3,9 +3,9 @@ Block 4021
|
||||
( C prims: ZUSE-ELIGIBILITY-ADD ZUSE-ELIGIBLE? )
|
||||
( NAME>XT ELEVATE-PUBKEY-UNPACK )
|
||||
( Policy word this file: ELEVATE-GRANT. Runs in )
|
||||
( Hera's own dict -- delivered here by messaging.4th's )
|
||||
( MSG-DELIVER via VM-EXEC when a session calls the )
|
||||
( common:messaging.4th SEND-ELEVATE-REQUEST entrypoint. )
|
||||
( Hera's own dict -- delivered here by kernel-Hermes's own )
|
||||
( drain checkpoint (FABRIC-3.6.md task 3.10), not FORTH )
|
||||
( MSG-DELIVER (messaging.4th, removed Phase 4 Stage E). )
|
||||
( FABRIC-2.md H.12 step 21, 2026-09-03. )
|
||||
CREATE ELEVATE-PK-BUF 32 ALLOT
|
||||
|
||||
|
||||
@@ -735,16 +735,17 @@ int sk_hermes_reassemble(SkHermesMessage **chunks, int n_chunks,
|
||||
#define SK_HERMES_MSG_TYPE_CONSOLE_CMD 7
|
||||
|
||||
/* SK_HERMES_MSG_TYPE_ELEVATE_REQUEST (FABRIC-3.6.md task 3.10, Stage D)
|
||||
* -- same reasoning again: reuses messaging.4th's own ELEVATE-REQUEST
|
||||
* value (8). Reachability was verified live before this cutover, not
|
||||
* assumed from a stale claim elsewhere in this project's own docs
|
||||
* (task 3.8's write-up said Hera "cannot load common:messaging.4th" --
|
||||
* false: SEND-ELEVATE-REQUEST, ELEVATE-GRANT, and CH-REQUEST all FIND
|
||||
* live in Hera's own dictionary). No existing capsule calls
|
||||
* SEND-ELEVATE-REQUEST -- it is a real, complete, directly-callable
|
||||
* entrypoint (H.5/H.8's own design: any VM wanting word-ACL elevation
|
||||
* calls it with its own pubkey and the target word name) with no
|
||||
* current automatic trigger, not dead/unreachable code. */
|
||||
* -- reuses messaging.4th's own now-historical ELEVATE-REQUEST value (8).
|
||||
* At task 3.10, SEND-ELEVATE-REQUEST/ELEVATE-GRANT/CH-REQUEST all FIND
|
||||
* live in Hera's own dictionary and SEND-ELEVATE-REQUEST was a real,
|
||||
* complete, directly-callable entrypoint (H.5/H.8's own design: any VM
|
||||
* wanting word-ACL elevation calls it with its own pubkey and the target
|
||||
* word name). FABRIC-3.6.md Phase 4, Stage E deleted messaging.4th
|
||||
* (SEND-ELEVATE-REQUEST's only definition) -- KH-ELEVATE-SEND below has
|
||||
* had no FORTH caller since, and ELEVATE-GRANT (zuse-eligibility.4th,
|
||||
* still loaded at boot) is unreachable. Found, not fixed -- Phase 8 PKI
|
||||
* decision needed before Phase 5 close-out, see FABRIC-3.6.md's own
|
||||
* Phase 4 entry. */
|
||||
#define SK_HERMES_MSG_TYPE_ELEVATE_REQUEST 8
|
||||
|
||||
/* The five negotiation types above (20-24) were chosen clear of
|
||||
|
||||
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
@@ -792,9 +792,14 @@ CapsuleRunResult capsule_birth_baby(
|
||||
StadiumPatronHeader vm_patron;
|
||||
uint8_t *raw = (uint8_t *)&vm_patron;
|
||||
size_t i;
|
||||
/* FABRIC-3.6.md Phase 4 (Stage E), 2026-09-22: "Hermes" retired
|
||||
* from this OR-chain -- FABRIC-3.5.md SXXXIV.4's own ruling
|
||||
* named this exact moment ("removed in Stage E, with the strip,
|
||||
* not with the Tripod change"). The chain temporarily held four
|
||||
* names (Hera, Hermes, Artemis, Hestia) through Phases 1-3,
|
||||
* deliberately, per that same ruling; three names now. */
|
||||
int is_fleet_foundation =
|
||||
vm_name_prefix_eq_nocase(capsule_name, "Hera") ||
|
||||
vm_name_prefix_eq_nocase(capsule_name, "Hermes") ||
|
||||
vm_name_prefix_eq_nocase(capsule_name, "Artemis") ||
|
||||
vm_name_prefix_eq_nocase(capsule_name, "Hestia");
|
||||
|
||||
|
||||
@@ -18,17 +18,21 @@
|
||||
#include "starkernel/kmalloc.h"
|
||||
#include <string.h>
|
||||
|
||||
/* Real, minimal, working content -- just enough vocabulary to send/
|
||||
* receive messages (common:messaging.4th, same as every other VM).
|
||||
* No COMMON-CH subscription: a console's own traffic is direct 1:1
|
||||
* with its paired user VM (CONSOLE-CMD-EVENT), not broadcast, so
|
||||
* there's no need to resolve an index in Hermes's own routing table
|
||||
* for it. Needs the "Block NNNN" header capsule_exec_payload()
|
||||
* requires (§F.18) -- not optional. 4997 is an unused block number. */
|
||||
/* FABRIC-3.6.md Phase 4 (Stage E), 2026-09-22: used to load
|
||||
* common:messaging.4th + MSG-CD-INIT here -- "just enough vocabulary
|
||||
* to send/receive messages" -- but a console-proxy VM's own traffic
|
||||
* (CONSOLE-CMD-EVENT) has gone through kernel-Hermes directly
|
||||
* (sk_hermes_send_one(), repl.c) since task 3.9, with no dependency on
|
||||
* this VM's own dictionary containing any messaging vocabulary at all.
|
||||
* common:messaging.4th no longer exists as of this strip, so this
|
||||
* needed to come out regardless. Genuinely empty now, past the
|
||||
* mandatory "Block NNNN" header capsule_exec_payload() requires
|
||||
* (§F.18) -- confirmed live that an empty body is a safe no-op when
|
||||
* interpreted (task 3.8's own finding: vm_interpret() on an empty
|
||||
* string is a no-op, no error, no UNKNOWN WORD). 4997 is an unused
|
||||
* block number. */
|
||||
static const char CONSOLE_IDENTITY_SRC[] =
|
||||
"Block 4997\n"
|
||||
"S\" common:messaging.4th\" EXEC\n"
|
||||
"MSG-CD-INIT\n";
|
||||
"Block 4997\n";
|
||||
|
||||
CapsuleRunResult capsule_console_birth(const char *console_name, VMUuid parent,
|
||||
VMUuid *out_vm_id, void **out_vm_ctx)
|
||||
|
||||
@@ -53,17 +53,19 @@ extern int blkio_ram_init_state(void *state_mem, size_t state_len,
|
||||
* capsule_exec_payload() requires (§F.18) -- discovered live, not
|
||||
* optional. 4999 is an unused block number (see capsules/ block-map).
|
||||
*
|
||||
* Loads common:messaging.4th + MSG-CD-INIT exactly like capsule_console.c's
|
||||
* own CONSOLE_IDENTITY_SRC -- every live VM except Hera owns a MSG-TICK
|
||||
* word for her per-idle-tick pump to VM-EXEC into (repl.c's Phase C loop).
|
||||
* A minted identity's RUNCAP-born VM is not exempt from that pump, so
|
||||
* omitting this left it spamming "UNKNOWN WORD: 'MSG-TICK'" every idle
|
||||
* tick forever from the moment WIREBIND made the VM live -- found live
|
||||
* minting a real second identity (FABRIC-2.md §F.26 follow-up). */
|
||||
* FABRIC-3.6.md Phase 4 (Stage E), 2026-09-22: used to load
|
||||
* common:messaging.4th + MSG-CD-INIT here too, for the same reason
|
||||
* capsule_console.c's own CONSOLE_IDENTITY_SRC did -- the old MSG-TICK
|
||||
* idle-pump gate (repl.c's Phase C loop) spammed "UNKNOWN WORD:
|
||||
* 'MSG-TICK'" on any VM missing the word, found live minting a real
|
||||
* second identity (FABRIC-2.md §F.26 follow-up). That entire pump
|
||||
* mechanism is gone as of this same strip (sk_repl_idle() now calls
|
||||
* sk_hermes_drain_checkpoint() directly, no FORTH word of any kind
|
||||
* required on the target VM), so the failure mode this once worked
|
||||
* around no longer exists either -- this can come out clean, not just
|
||||
* because common:messaging.4th itself no longer exists to load. */
|
||||
static const char MINT_DEFAULT_PERSONALITY[] =
|
||||
"Block 4999\n"
|
||||
"S\" common:messaging.4th\" EXEC\n"
|
||||
"MSG-CD-INIT\n"
|
||||
": WELCOME ( -- ) .\" Minted identity -- default personality\" CR ;\n"
|
||||
"WELCOME\n";
|
||||
|
||||
|
||||
@@ -247,6 +247,11 @@ void capsule_wirebind_try_attach(struct blkio_dev *dev,
|
||||
console_println("WIREBIND: console VM birth FAILED");
|
||||
return;
|
||||
}
|
||||
/* FABRIC-3.6.md Phase 4 (Stage E): console_ctx's only use (the
|
||||
* routing-table VM-NAME-REG call above) is gone -- still populated
|
||||
* because capsule_console_birth()'s own signature requires an
|
||||
* out-param regardless, just no longer read here. */
|
||||
(void)console_ctx;
|
||||
if (capsule_runcap_birth(dev, sig, user_vm_name, mama_vm->stadium_vm_id, &user_id,
|
||||
&user_ctx) != CAPSULE_RUN_OK) {
|
||||
console_println("WIREBIND: user VM birth FAILED");
|
||||
@@ -326,15 +331,14 @@ void capsule_wirebind_try_attach(struct blkio_dev *dev,
|
||||
* continuously by sk_repl_run()'s own main loop rather than a one-shot
|
||||
* signal at login time. Nothing to call here anymore. */
|
||||
|
||||
/* Register the pairing in the console's own routing table, index 3
|
||||
* -- the fixed convention sk_repl_dispatch_line() (repl.c) uses. */
|
||||
{
|
||||
char reg_cmd[sizeof(user_vm_name) + 32];
|
||||
int n = snprintf(reg_cmd, sizeof(reg_cmd), "S\" %s\" 3 VM-NAME-REG", user_vm_name);
|
||||
if (n > 0 && (size_t)n < sizeof(reg_cmd)) {
|
||||
vm_interpret((VM *)console_ctx, reg_cmd);
|
||||
}
|
||||
}
|
||||
/* FABRIC-3.6.md Phase 4 (Stage E, Category B strip): the messaging.4th
|
||||
* routing-table registration that used to happen here (`S" %s" 3
|
||||
* VM-NAME-REG`) is gone -- sk_repl_dispatch_line() (repl.c) has not
|
||||
* read that table since task 3.9's own cutover (it resolves the
|
||||
* paired identity directly via capsule_vm_find_by_name(), not an
|
||||
* index), and messaging.4th (which defined VM-NAME-REG) no longer
|
||||
* exists at all as of this strip. This was already dead, just not
|
||||
* yet removed -- confirmed by reading, not assumed. */
|
||||
|
||||
console_puts("WIREBIND: ");
|
||||
console_puts(username);
|
||||
|
||||
@@ -1450,7 +1450,8 @@ static void mama_word_name_to_xt(VM *vm)
|
||||
* buffer at buf-addr, matching ZUSE-PUBKEY@'s own convention exactly:
|
||||
* chunk i (0..3) is the 8-byte little-endian encoding of pubkey bytes
|
||||
* [i*8 .. i*8+7] -- this is that packing's inverse, so a pubkey sent as
|
||||
* 4 cells (see common:messaging.4th's SEND-ELEVATE-REQUEST) round-trips
|
||||
* 4 cells (the convention SEND-ELEVATE-REQUEST used before it was
|
||||
* deleted with messaging.4th, FABRIC-3.6.md Phase 4 Stage E) round-trips
|
||||
* byte-exact regardless of any individual chunk's sign bit.
|
||||
*/
|
||||
static void mama_word_elevate_pubkey_unpack(VM *vm)
|
||||
|
||||
@@ -1101,31 +1101,16 @@ static void kernel_main_deep(BootInfo *boot_info) {
|
||||
* guard exists for), not because she lacks MSG-TICK now -- and calls
|
||||
* it directly in her own context instead, right after that loop. */
|
||||
|
||||
/* Hermes is now a permanent fleet-foundation VM, not self-test
|
||||
* scaffolding -- FABRIC-2.md D.7 (birth-by-message-only, 2026-08-28):
|
||||
* the Tripod legs (Hera/Hermes/Artemis) must be alive session-less so
|
||||
* a later thumbdrive-attach flow has a running Hermes/Artemis to
|
||||
* message. Previously born, exercised, and KILLed by item 4.2's own
|
||||
* self-test every boot; that diagnostic exercising is gone, only the
|
||||
* birth remains. */
|
||||
console_println("Startup: birthing Hermes (fleet foundation)...");
|
||||
vm_interpret(mama, "S\" Hermes\" BIRTH");
|
||||
{
|
||||
VMRegistryEntry entry;
|
||||
if (capsule_vm_find_by_name_nocase("Hermes", &entry) == 0 &&
|
||||
entry.state == VM_STATE_LIVE) {
|
||||
console_println("Startup: Hermes live");
|
||||
} else {
|
||||
console_println("Startup: Hermes birth registry lookup FAILED");
|
||||
}
|
||||
}
|
||||
/* FABRIC-3.6.md Phase 4 (Stage E), 2026-09-22: Hermes's own birth,
|
||||
* born here as a permanent fleet-foundation VM since FABRIC-2.md
|
||||
* D.7, is retired -- SXXXIV.4's own ruling named this exact moment
|
||||
* ("Hermes's birth and its is_fleet_foundation entry are removed in
|
||||
* Stage E, with the strip, not with the Tripod change") and this is
|
||||
* that strip. */
|
||||
|
||||
/* Hestia is the third reconstituted Tripod leg (Hera/Artemis/Hestia,
|
||||
* FABRIC-3.5.md SII/SIV) -- born here, alongside Hermes, per
|
||||
* FABRIC-3.6.md task 1.4. Hermes stays live too (SXXXIV.4): the
|
||||
* fleet is Hera/Hermes/Artemis/Hestia through Phase 1-3, four VMs,
|
||||
* not three, until Phase 4's Category B strip retires Hermes. Same
|
||||
* birth-by-name-then-registry-check shape as Hermes/Artemis above.
|
||||
* FABRIC-3.5.md SII/SIV) -- born here per FABRIC-3.6.md task 1.4.
|
||||
* Same birth-by-name-then-registry-check shape as Artemis below.
|
||||
*
|
||||
* HEADLESS INVARIANT (FABRIC-3.5.md SXVIII.6, FABRIC-3.6.md task 1.9):
|
||||
* this birth must not set g_wirebind_attached_username, must not
|
||||
@@ -1149,8 +1134,7 @@ static void kernel_main_deep(BootInfo *boot_info) {
|
||||
}
|
||||
|
||||
/* Artemis is now a permanent fleet-foundation VM, not self-test
|
||||
* scaffolding -- same reasoning as Hermes's own birth just above
|
||||
* (FABRIC-2.md D.7). Previously born, exercised, and KILLed by item
|
||||
* scaffolding -- FABRIC-2.md D.7. Previously born, exercised, and KILLed by item
|
||||
* 4.6's own self-test every boot; that diagnostic exercising is gone,
|
||||
* only the birth remains. Artemis's own capsule still runs its own
|
||||
* self-test plus a 30-rep stress campaign at load
|
||||
@@ -1268,9 +1252,11 @@ static void kernel_main_deep(BootInfo *boot_info) {
|
||||
* are confirmed fully born above -- never earlier. This stage has no
|
||||
* critical-section protection against being switched away mid-setup,
|
||||
* so registering any earlier would risk the signal firing during
|
||||
* Hermes/Artemis's own birth sequencing. */
|
||||
* Artemis's own birth sequencing. FABRIC-3.6.md Phase 4 (Stage E),
|
||||
* 2026-09-22: Hermes's own registration here is retired along with
|
||||
* her birth above. */
|
||||
{
|
||||
VMRegistryEntry hera_entry, hermes_entry, artemis_entry;
|
||||
VMRegistryEntry hera_entry, artemis_entry;
|
||||
if (capsule_vm_registry_get(vm_uuid_hera(), &hera_entry) == 0) {
|
||||
sk_vm_switch_signal_register(hera_entry.vm_id);
|
||||
/* Seed the switch mechanism's own "who is running" tracker
|
||||
@@ -1279,17 +1265,13 @@ static void kernel_main_deep(BootInfo *boot_info) {
|
||||
* ever happened. */
|
||||
sk_vm_switch_set_current(mama);
|
||||
}
|
||||
if (capsule_vm_find_by_name_nocase("Hermes", &hermes_entry) == 0 &&
|
||||
hermes_entry.state == VM_STATE_LIVE) {
|
||||
sk_vm_switch_signal_register(hermes_entry.vm_id);
|
||||
}
|
||||
if (capsule_vm_find_by_name_nocase("Artemis", &artemis_entry) == 0 &&
|
||||
artemis_entry.state == VM_STATE_LIVE) {
|
||||
sk_vm_switch_signal_register(artemis_entry.vm_id);
|
||||
}
|
||||
/* Hestia is the fourth fleet member through Phase 1-3 (FABRIC-3.5.md
|
||||
/* Hestia is the third fleet member through Phase 4 (FABRIC-3.5.md
|
||||
* SXXXIV.4) -- FABRIC-3.6.md task 1.5, same registration shape as
|
||||
* Hermes/Artemis above, added here rather than earlier for the
|
||||
* Artemis above, added here rather than earlier for the
|
||||
* identical reason the comment above this block already gives. */
|
||||
{
|
||||
VMRegistryEntry hestia_entry;
|
||||
@@ -1302,22 +1284,23 @@ static void kernel_main_deep(BootInfo *boot_info) {
|
||||
|
||||
/* FABRIC-3.6.md task 3.2 (B1) self-test: confirm every live fleet
|
||||
* member is a common-channel member (the birth-time subscription just
|
||||
* exercised for real, above -- Hera explicitly, Hermes/Hestia/Artemis
|
||||
* exercised for real, above -- Hera explicitly, Hestia/Artemis
|
||||
* through capsule_birth_baby()'s own task 3.2 hook), then create and
|
||||
* destroy a synthetic private topic against a synthetic VM id (lo=5,
|
||||
* distinct from every other synthetic id this file already uses --
|
||||
* lo=1 Stadium quota grant, lo=3 kernel-Hermes alloc/release). Diagnostic
|
||||
* only, same posture as every other self-test block in this function:
|
||||
* never used for anything else, never perturbs the real fleet. */
|
||||
* never used for anything else, never perturbs the real fleet.
|
||||
* FABRIC-3.6.md Phase 4 (Stage E), 2026-09-22: Hermes's own check
|
||||
* removed -- she is no longer a fleet member, so requiring her here
|
||||
* would report a false FAIL, not a graceful skip like the drain and
|
||||
* channel-open-policy self-tests further down already do for her. */
|
||||
{
|
||||
VMRegistryEntry hera_ck, hermes_ck, hestia_ck, artemis_ck;
|
||||
VMRegistryEntry hera_ck, hestia_ck, artemis_ck;
|
||||
int fleet_ok = 1;
|
||||
|
||||
if (capsule_vm_find_by_name_nocase("Hera", &hera_ck) != 0 ||
|
||||
!sk_hermes_channel_is_member(SK_HERMES_CHANNEL_COMMON, hera_ck.vm_id)) fleet_ok = 0;
|
||||
if (capsule_vm_find_by_name_nocase("Hermes", &hermes_ck) != 0 ||
|
||||
hermes_ck.state != VM_STATE_LIVE ||
|
||||
!sk_hermes_channel_is_member(SK_HERMES_CHANNEL_COMMON, hermes_ck.vm_id)) fleet_ok = 0;
|
||||
if (capsule_vm_find_by_name_nocase("Hestia", &hestia_ck) != 0 ||
|
||||
hestia_ck.state != VM_STATE_LIVE ||
|
||||
!sk_hermes_channel_is_member(SK_HERMES_CHANNEL_COMMON, hestia_ck.vm_id)) fleet_ok = 0;
|
||||
|
||||
+86
-134
@@ -444,19 +444,22 @@ static void sk_word_kh_blk_attach_send(VM *vm) {
|
||||
#define SK_KH_ELEVATE_BUF_SIZE 256
|
||||
static char g_kh_elevate_buf[SK_KH_ELEVATE_BUF_SIZE];
|
||||
|
||||
/* KH-ELEVATE-SEND ( paddr plen -- ok? ): messaging.4th's own
|
||||
* SEND-ELEVATE-REQUEST builds its payload (a FORTH command string
|
||||
* calling ELEVATE-GRANT, block 5040) and hands it here instead of
|
||||
* CH-REQUEST's old COMMON-CH/MSG-SEND path. `from`/`to` are derived the
|
||||
* same way KH-BLK-ATTACH-SEND's own already does (the calling VM and
|
||||
* sk_get_mama_vm() -- ELEVATE-GRANT always runs on Hera, per
|
||||
* zuse-eligibility.4th's own header comment) -- the caller never
|
||||
/* KH-ELEVATE-SEND ( paddr plen -- ok? ): built for messaging.4th's own
|
||||
* SEND-ELEVATE-REQUEST (a FORTH command string calling ELEVATE-GRANT,
|
||||
* zuse-eligibility.4th block 4022), which handed its payload here
|
||||
* instead of CH-REQUEST's old COMMON-CH/MSG-SEND path. `from`/`to` are
|
||||
* derived the same way KH-BLK-ATTACH-SEND's own already does (the
|
||||
* calling VM and sk_get_mama_vm() -- ELEVATE-GRANT always runs on Hera,
|
||||
* per zuse-eligibility.4th's own header comment) -- the caller never
|
||||
* supplies either, which is a real correctness improvement over the
|
||||
* FORTH path it replaces: CH-REQUEST's own "initiator-only gate...
|
||||
* FORTH path it replaced: CH-REQUEST's own "initiator-only gate...
|
||||
* refuses if from doesn't match MY-CH-ID" existed only because a caller
|
||||
* COULD claim to be a different VM by passing the wrong stack value;
|
||||
* deriving `from` from the C-level calling VM's own identity makes that
|
||||
* spoof structurally impossible rather than merely gated. */
|
||||
* spoof structurally impossible rather than merely gated. FABRIC-3.6.md
|
||||
* Phase 4, Stage E deleted messaging.4th -- SEND-ELEVATE-REQUEST no
|
||||
* longer exists anywhere, so this word currently has no FORTH caller.
|
||||
* Found, not fixed; see FABRIC-3.6.md's own Phase 4 entry. */
|
||||
static void sk_word_kh_elevate_send(VM *vm) {
|
||||
if (vm->dsp < 1) {
|
||||
log_message(LOG_ERROR, "KH-ELEVATE-SEND: stack underflow");
|
||||
@@ -527,49 +530,42 @@ static void sk_cursor_show(void)
|
||||
console_fb_draw_cursor();
|
||||
}
|
||||
|
||||
/* Reentrancy guards for the MSG-TICK pump inside sk_repl_idle().
|
||||
/* Reentrancy guards for the kernel-Hermes drain pump inside sk_repl_idle().
|
||||
*
|
||||
* sk_repl_idle() runs vm_interpret(mama, ...) (below) to VM-EXEC MSG-TICK
|
||||
* into every live child VM (FABRIC-2.md Phase C). But sk_repl_idle() is
|
||||
* itself called from the blocking KEY/EXPECT/QUERY reads (sk_console_getkey()
|
||||
* / sk_console_readline(), which run *from inside* the executing VM's own
|
||||
* vm_interpret once a FORTH word reads input mid-line). vm_interpret() is
|
||||
* not reentrant -- it resets the VM's single input_buffer/input_pos/
|
||||
* input_length (vm_core.c) on entry. Calling vm_interpret(mama, ...) at that
|
||||
* point would re-enter mama's interpreter mid-parse and silently truncate
|
||||
* the rest of the line; if the pump's own MSG-TICK work then triggers another
|
||||
* blocking read, it would also recurse unboundedly. Two flags keep the pump
|
||||
* off every path that could re-enter an interpreter:
|
||||
* FABRIC-3.6.md Phase 4 (Stage E), 2026-09-22: this used to guard a
|
||||
* VM-EXEC "MSG-TICK" dispatch into every live child VM (FABRIC-2.md
|
||||
* Phase C, common:messaging.4th, now removed). The mechanism changed --
|
||||
* sk_repl_idle() now calls sk_hermes_drain_checkpoint() directly per VM,
|
||||
* not VM-EXEC -- but the reentrancy hazard these two flags exist for is
|
||||
* unchanged: drain_checkpoint() still calls vm_interpret() internally
|
||||
* (on the drained message's own payload), and sk_repl_idle() is itself
|
||||
* called from the blocking KEY/EXPECT/QUERY reads (sk_console_getkey()/
|
||||
* sk_console_readline(), which run *from inside* the executing VM's own
|
||||
* vm_interpret once a FORTH word reads input mid-line). vm_interpret()
|
||||
* is not reentrant -- it resets the VM's single input_buffer/input_pos/
|
||||
* input_length (vm_core.c) on entry. Calling it on mama at that point
|
||||
* would re-enter her interpreter mid-parse and silently truncate the
|
||||
* rest of the line. Two flags keep the pump off every path that could
|
||||
* re-enter an interpreter:
|
||||
* - g_mama_interpreting: set while Hera is executing a dispatched line, so
|
||||
* the pump defers to the next safe (prompt) boundary.
|
||||
* - g_idle_pump_active: belt-and-suspenders; stops recursive re-entry
|
||||
* from inside the pump's own vm_interpret call.
|
||||
* from inside the pump's own drain call.
|
||||
*/
|
||||
static int g_mama_interpreting; /* zero-initialized (BSS) */
|
||||
static int g_idle_pump_active; /* zero-initialized (BSS) */
|
||||
|
||||
/* FABRIC-3.md SXXII (2026-09-12): the messaging pump below used to walk
|
||||
* the ENTIRE live-VM registry every idle beat and dispatch a full
|
||||
* VM-EXEC "MSG-TICK" into every one of them -- O(N) per tick, forever,
|
||||
* with no cap. Fine at Tripod's original 3-VM scale; live-caught as a
|
||||
* real bottleneck at just 9 VMs on riscv64 (a std79 turn-attractor
|
||||
* campaign that completed in ~200-340s on amd64/aarch64 never finished
|
||||
* on riscv64 at the same VM count, while 8 VMs was fine there too --
|
||||
* the qemu-instance progress check (utime climbing steadily, ~66-75%
|
||||
* CPU) ruled out a hang; it was genuinely just this loop, at riscv64's
|
||||
* slower per-dispatch cost, dominating wall time). The real fleet is
|
||||
* headed toward hundreds of VMs, at which point this isn't a riscv64
|
||||
* quirk -- unconditional O(N) per second is a wall on every
|
||||
* architecture. Fixed by round-robin batching: SK_MSG_PUMP_BATCH live
|
||||
* VMs get dispatched per beat, not all of them, with a persistent
|
||||
* cursor picking up where the previous beat left off (wrapping around
|
||||
* the registry). Bounds both the scan and the dispatch cost to O(K)
|
||||
* regardless of total VM count -- the tradeoff is that any single VM's
|
||||
* own queue now drains roughly every ceil(N/K) beats instead of every
|
||||
* beat, which is still bounded and still matches the pump's own
|
||||
* existing "best-effort, resumes next beat" contract. */
|
||||
#define SK_MSG_PUMP_BATCH 4u /* max VM-EXEC MSG-TICK dispatches per idle beat */
|
||||
static uint32_t g_msg_pump_cursor; /* zero-initialized (BSS) */
|
||||
/* FABRIC-3.md SXXII (2026-09-12) recorded a real O(N) bottleneck here --
|
||||
* the messaging pump below used to walk the entire live-VM registry
|
||||
* every idle beat and dispatch a full VM-EXEC "MSG-TICK" into every one
|
||||
* of them, live-caught as a wall-time-dominating cost at just 9 VMs on
|
||||
* riscv64 -- and fixed it with round-robin batching (a persistent
|
||||
* cursor, a fixed number of dispatches per beat). FABRIC-3.6.md Phase 4
|
||||
* (Stage E), 2026-09-22: that whole mechanism (MSG-TICK, the batching
|
||||
* cap, and this comment's own prior form) is gone along with
|
||||
* common:messaging.4th itself -- see sk_repl_idle()'s own current
|
||||
* comment, just below, for why the replacement (kernel-Hermes drain)
|
||||
* does not carry the same O(N) cost and needs no cap. */
|
||||
|
||||
static void sk_repl_idle(VM *active_vm)
|
||||
{
|
||||
@@ -857,18 +853,25 @@ static void sk_repl_idle(VM *active_vm)
|
||||
* comment. */
|
||||
capsule_wirebind_reap_idle_check();
|
||||
|
||||
/* FABRIC-2.md Phase C (2026-08-28): distributed messaging pump. Every
|
||||
* live VM except Hera herself now owns its own MSG-ARENA/CH-ARENA and
|
||||
* MSG-TICK word (see capsules/common/messaging.4th) instead of only
|
||||
* Hermes having one -- "fully distributed, Hera pumps each VM's
|
||||
* drain" was the confirmed design. Hera is excluded: she never loads
|
||||
* common:messaging.4th (kernel_main.c's own comment at the Hermes-
|
||||
* birth call site explains why -- the STADIUM-* primitives it needs
|
||||
* are deliberately never registered in her own dictionary, to keep
|
||||
* her dict_hash off item 4.1's baseline), so MSG-TICK is genuinely
|
||||
* absent there, not just untried. She is the only VM with a
|
||||
* persistent idle tick, so she walks the registry once per idle beat
|
||||
* and VM-EXECs MSG-TICK into every OTHER live VM's own dictionary. */
|
||||
/* FABRIC-3.6.md Phase 4 (Stage E, Category B strip), 2026-09-22:
|
||||
* this used to be a distributed FORTH messaging pump -- FABRIC-2.md
|
||||
* Phase C's own design, VM-EXEC'ing MSG-TICK into every live VM's
|
||||
* own dictionary once per idle beat (common:messaging.4th, now
|
||||
* removed entirely). That mechanism, and the comment that used to
|
||||
* sit here explaining it, are both gone: kernel-Hermes's own drain
|
||||
* (below) has needed no FORTH word since task 3.9, and every
|
||||
* messaging.4th-owned message type had a real cutover by task 3.10
|
||||
* (FABRIC-3.6.md task 3.11, Phase 3 gate). The prior version of this
|
||||
* comment also claimed "Hera never loads common:messaging.4th" --
|
||||
* that was already wrong before this strip (capsules/init.4th line
|
||||
* 21 EXECs it directly; task 3.10's own live FIND-based check
|
||||
* confirmed it), not just made moot by removing the file. She still
|
||||
* has the only persistent idle tick, so she is still the one that
|
||||
* walks the registry once per idle beat -- now purely to give every
|
||||
* live VM's own kernel-Hermes queue a chance to drain, batched the
|
||||
* same round-robin way the old MSG-TICK dispatch was (SK_MSG_PUMP_
|
||||
* BATCH below), kept for the same reason: bounding this to O(K)
|
||||
* regardless of total VM count, not O(N) every beat. */
|
||||
VM *mama = (VM *)sk_get_mama_vm();
|
||||
|
||||
/* Reentrancy guard: never run the pump while mama is mid-interpret
|
||||
@@ -887,93 +890,42 @@ static void sk_repl_idle(VM *active_vm)
|
||||
|
||||
g_idle_pump_active = 1;
|
||||
{
|
||||
uint32_t count = capsule_vm_registry_count();
|
||||
uint32_t dispatched = 0;
|
||||
uint32_t scanned = 0;
|
||||
uint32_t i = (count > 0) ? (g_msg_pump_cursor % count) : 0;
|
||||
/* FABRIC-3.6.md Phase 4 (Stage E), 2026-09-22: the SK_MSG_PUMP_
|
||||
* BATCH cap this loop used to enforce existed to bound the cost
|
||||
* of the old MSG-TICK VM-EXEC dispatch -- a genuinely expensive
|
||||
* per-VM vm_interpret() call, confirmed live as a real O(N)
|
||||
* bottleneck at just 9 VMs on riscv64 (see this section's own
|
||||
* history above). sk_hermes_drain_checkpoint() (task 3.4) is not
|
||||
* that: its own fast path is a single global-counter read
|
||||
* (sk_hermes_pending_total == 0 -> return immediately,
|
||||
* kernel_hermes.c's own doc comment), so walking every live VM
|
||||
* every beat costs one cheap integer read per VM in the common
|
||||
* case (nothing in flight), not an O(N) wall -- the cap this
|
||||
* loop's own comment history worried about does not apply to
|
||||
* this call. Removed: every live VM (except mama, handled
|
||||
* separately below) is now visited every idle beat, matching
|
||||
* what task 3.9's own testing already exercised, without the
|
||||
* ceil(N/SK_MSG_PUMP_BATCH)-beat delivery latency the cap was
|
||||
* accidentally imposing on kernel-Hermes drain specifically. */
|
||||
uint32_t count = capsule_vm_registry_count();
|
||||
uint32_t i;
|
||||
|
||||
while (count > 0 && dispatched < SK_MSG_PUMP_BATCH && scanned < count) {
|
||||
for (i = 0; i < count; i++) {
|
||||
VMRegistryEntry ent;
|
||||
scanned++;
|
||||
|
||||
if (capsule_vm_registry_get_by_index(i, &ent) == 0 &&
|
||||
ent.state == VM_STATE_LIVE &&
|
||||
ent.vm_ptr != (void *)mama) {
|
||||
/* FABRIC-3.6.md task 3.9, found live 2026-09-22: kernel-
|
||||
* Hermes's own drain (sk_hermes_drain_checkpoint(), task
|
||||
* 3.4) only ever runs as a side effect of vm_interpret()
|
||||
* being called ON the target VM (vm_core.c's own outermost-
|
||||
* interpret checkpoint hook) -- it has nothing to do with
|
||||
* the old FORTH MSG-TICK word this loop was built around.
|
||||
* A WIREBIND identity minted with the STD79-lockdown
|
||||
* personality (MINT_PERSONALITY_STD79_LOCKDOWN) never loads
|
||||
* common:messaging.4th, so the MSG-TICK gate just below
|
||||
* always skips it -- meaning it never got an interpret
|
||||
* tick at all, meaning a CONSOLE-CMD-EVENT queued for it
|
||||
* sat in its pending queue forever, silently. Confirmed
|
||||
* live: sk_hermes_send_one() returned 0 (queued OK) but no
|
||||
* drain ever ran. Called unconditionally here, independent
|
||||
* of the MSG-TICK check below -- kernel-Hermes doesn't need
|
||||
* a FORTH word to exist, it just needs its target VM to get
|
||||
* an outermost interpret call periodically. Direct C call,
|
||||
* not routed through VM-EXEC/vm_interpret: drain_checkpoint
|
||||
* already saves/restores the target's own interpret state
|
||||
* internally (kernel_main.c's own self-test calls it the
|
||||
* same standalone way), so no vm_interpret() wrapper is
|
||||
* needed to reach it from here. */
|
||||
(void)sk_hermes_drain_checkpoint((VM *)ent.vm_ptr);
|
||||
|
||||
/* FABRIC-3.md, 2026-09-09: a per-VM flag (e.g. "this one is
|
||||
* std79-locked") doesn't generalize -- any VM whose own
|
||||
* dictionary lacks MSG-TICK, for whatever reason (never
|
||||
* loaded common:messaging.4th, a future personality that
|
||||
* drops it, ACL denial), hits the identical failure. So
|
||||
* check the actual target VM's own dictionary fresh every
|
||||
* tick, the same source of truth the interpreter's own ACL
|
||||
* enforcement uses (vm_core.c), rather than pre-flag specific
|
||||
* personalities. Skip silently rather than spam "VM-EXEC:
|
||||
* ERROR in <name>" every idle tick forever for a VM that
|
||||
* plain doesn't have -- or isn't allowed -- MSG-TICK
|
||||
* (live-caught 2026-09-07/09). */
|
||||
DictEntry *msgtick = vm_find_word((VM *)ent.vm_ptr, "MSG-TICK", 8);
|
||||
if (msgtick && msgtick->acl_allow) {
|
||||
static const char PFX[] = "S\" MSG-TICK\" S\" ";
|
||||
static const char SFX[] = "\" VM-EXEC";
|
||||
char cmd[128];
|
||||
size_t p = 0;
|
||||
size_t name_len = strlen(ent.name);
|
||||
if (name_len > VM_NAME_MAX - 1u) name_len = VM_NAME_MAX - 1u;
|
||||
|
||||
memcpy(cmd + p, PFX, sizeof(PFX) - 1u); p += sizeof(PFX) - 1u;
|
||||
memcpy(cmd + p, ent.name, name_len); p += name_len;
|
||||
memcpy(cmd + p, SFX, sizeof(SFX) - 1u); p += sizeof(SFX) - 1u;
|
||||
cmd[p] = '\0';
|
||||
|
||||
vm_interpret(mama, cmd);
|
||||
dispatched++;
|
||||
}
|
||||
}
|
||||
|
||||
i = (i + 1u) % count;
|
||||
}
|
||||
g_msg_pump_cursor = i;
|
||||
}
|
||||
/* FABRIC-3.md SXX: Hera now genuinely has her own MSG-ARENA/CH-ARENA
|
||||
* (the messaging-load root cause above is fixed -- see kernel_main.c's
|
||||
* own updated comment at the Hermes-birth call site), so her own
|
||||
* queued messages need draining too, same as every other VM's. She's
|
||||
* excluded from the loop above not because she lacks MSG-TICK now, but
|
||||
* because she IS the pump -- self-targeting VM-EXEC would hit the same
|
||||
* reentrancy class the guard above exists for. No such problem calling
|
||||
* MSG-TICK directly here, though: it's a plain word in her own
|
||||
* dictionary, not a VM-EXEC dispatch into anyone else's input buffer.
|
||||
* Guarded the same defensive way as the loop above, not assumed. */
|
||||
{
|
||||
DictEntry *msgtick = vm_find_word(mama, "MSG-TICK", 8);
|
||||
if (msgtick && msgtick->acl_allow) {
|
||||
vm_interpret(mama, "MSG-TICK");
|
||||
}
|
||||
}
|
||||
/* Hera's own kernel-Hermes queue needs draining too, same as every
|
||||
* other VM's -- she is excluded from the loop above not because she
|
||||
* has nothing to drain, but because she IS the pump: a self-
|
||||
* targeting call here runs directly, no VM-EXEC/reentrancy concern
|
||||
* (sk_hermes_drain_checkpoint() is a plain C call, not a dispatch
|
||||
* into anyone else's input buffer). */
|
||||
(void)sk_hermes_drain_checkpoint(mama);
|
||||
g_idle_pump_active = 0;
|
||||
|
||||
if (console_tx_count() == tx_before_idle) {
|
||||
|
||||
Reference in New Issue
Block a user