Move PLOT/FB-WIDTH/FB-HEIGHT registration to Hestia only -- FABRIC-3.6.md task 1.8

Real fix for task 0.8's finding. register_framebuffer_words() was
called unconditionally from register_forth79_words() (word_registry.c),
itself called unconditionally from vm_init_with_host() -- the generic
per-VM bootstrap every VM goes through, with no way to know a VM's
name at that point.

Removed the unconditional call. Added a name-gated call instead in
capsule_birth_baby() (capsule_birth.c), beside the existing
is_fleet_foundation check -- the one place in the birth path where
capsule_name and the newly-allocated VM* are both in scope together:
Hestia gets register_framebuffer_words(), nobody else does.

Positively verified live, exactly as the task's own check demands:
FB-WIDTH via VM-EXEC returns UNKNOWN WORD in Hermes and Artemis, 1280
in Hestia. Confirmed at the fundamental level too: Hera's own base
PARITY:M7.1a word count dropped from 531 to 528 -- exactly the three
words removed -- identical across all three architectures.

Three-arch boot clean: amd64/aarch64/riscv64 all reach [zuse@Hera] ok>,
zero UNKNOWN WORD during boot. mkcapsule --lint capsules/ clean, 38
files / 0 violations (pure C change, no capsule content touched). No
compiler warnings.

Side effect on the vendored hosted build, expected and not a
regression: capsule_birth.c is kernel-only, so the hosted starforth
binary has no Hestia concept and now never registers these words at
all -- confirmed live. framebuffer_words.c's own top comment already
calls this surface "kernel-only, no-op on hosted builds," so the prior
stub registration was already vestigial. Ran a plain `make` sanity
build per CLAUDE.md's own stated purpose for that target; regenerated
lfs/amd64/starforth included here rather than left stale.

Authorized by Captain Bob ("yes").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Robert Allan James
2026-09-19 17:36:18 -04:00
co-authored by Claude Sonnet 5
parent 5afb33049f
commit 6c6293cd52
11 changed files with 27449 additions and 3 deletions
+14
View File
@@ -38,6 +38,7 @@
#include "starkernel/session.h" /* session_register()/session_set_pinned() -- FABRIC-2.md §H.12 step 5 */
#include "starkernel/timer.h" /* timer_calibration_record()->vm_mode -- FABRIC-2.md §I.5 CONTRIB trust tier */
#include "starkernel/capsule_vm_switch_signal.h" /* FABRIC-3.md §XXVIII Stage 4 -- capsule_vm_force_reap() */
#include "word_source/include/framebuffer_words.h" /* FABRIC-3.6.md task 1.8 -- register_framebuffer_words() */
#include "vm.h"
#include "platform_alloc.h"
/* No LOG_LINE_MAX include-order constraint anymore: vm.h's own
@@ -815,6 +816,19 @@ CapsuleRunResult capsule_birth_baby(
if (is_fleet_foundation) session_set_pinned(vm_id, 1);
}
}
/* FABRIC-3.6.md task 1.8 (item 33): PLOT/FB-WIDTH/FB-HEIGHT
* (framebuffer_words.c) are no longer registered unconditionally
* in register_forth79_words() -- Hestia is the sole owner of the
* drawing fabric, and this is the one place a VM's name is known
* at the point its dictionary is actually built (vm_init_with_host()
* itself takes no name). Every other VM simply never gets these
* words now, which is the point -- confirmed live, task 0.8 found
* Hermes/Artemis could both call FB-WIDTH despite never loading
* fabric.4th. */
if (vm_name_prefix_eq_nocase(capsule_name, "Hestia")) {
register_framebuffer_words((VM *)new_vm);
}
}
const uint8_t *payload = capsule_get_payload(cap, arena);
+7 -1
View File
@@ -136,7 +136,13 @@ void register_forth79_words(VM *vm) {
register_q48_words(vm); /* Module 25: Q48.16 Fixed-Point Math */
register_inference_words(vm); /* Module 26: SSM Inference + Jacquard */
register_defer_words(vm); /* Module 27: DEFER / IS late binding */
register_framebuffer_words(vm); /* Module 28: Console fabric -- raw framebuffer primitives */
/* Module 28 (PLOT/FB-WIDTH/FB-HEIGHT, framebuffer_words.c) deliberately
* NOT registered here -- FABRIC-3.6.md task 1.8 (item 33): every VM got
* these unconditionally before this change (confirmed live, task 0.8 --
* Hermes and Artemis could both call FB-WIDTH despite never loading
* fabric.4th). Hestia is now the sole owner; see the name-gated call in
* capsule_birth_baby() (capsule_birth.c), the only place a VM's name is
* known at the point its dictionary is built. */
register_keyboard_words(vm); /* Module 29: Console fabric -- raw keyboard scancode diagnostic */
register_ttf_words(vm); /* Module 30: TrueType text entry point */
register_scroll_words(vm); /* Module 31: REPL scrollback (FABRIC-0.md 4.4q) */