Skip to content

feature: gale-nano 0.7.0 EXECUTES on real STM32F100 silicon — admit works, dispatch does not (AFD-113) - #256

Merged
avrabe merged 1 commit into
mainfrom
feat/gale-nano-on-silicon
Sep 7, 2026
Merged

feature: gale-nano 0.7.0 EXECUTES on real STM32F100 silicon — admit works, dispatch does not (AFD-113)#256
avrabe merged 1 commit into
mainfrom
feat/gale-nano-on-silicon

Conversation

@avrabe

@avrabe avrabe commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

feature: gale-nano 0.7.0 EXECUTES on real STM32F100 silicon — admit works, dispatch does not (AFD-113)

H3 second half: ADVANCED, NOT COMPLETE. Stated that way deliberately.

gale-nano 0.7.0 (digest-pinned) lowered for cortex-m3 and linked against jess's
real gust:hal MMIO (AFD-109), the generic embedder-init apply loop (AFD-107) and a
boot shim. 4,349 B, 0 undefined, embedder ABI verified. On silicon:

LEG (only the ADMIT word differs) poll-task# handle state completion
task admitted (baseline) 00000000 00000000 00000001 c0ffee00
no admit (negative control) 00000000 deadbeef deadbeef c0ffee00

Gale's code RUNS ON THE PART and exec_admit WORKS: gale's own exec_state(handle)
returns 1, exactly what TEST-PIX-035 asserts. handle 0 is correct, not a failure —
jess already recorded that gale-nano hands out handle 0.

But exec_poll_round reaches poll-task ZERO times, where the wasmtime reference —
re-run green the same day, 8/8, same pinned artifact, same PRIO/DEADLINE/NOW
constants taken from app/dispatch-driver — reaches it once. That is a confirmed
wasmtime-vs-silicon divergence, which is what jess's lane exists to produce.

LIKELY CAUSE, NOT PROVEN, AND NOT A GALE DEFECT. gale-nano's component manifest
declares exactly two imports (gust:os/taskdisp, gust:hal/mmio) and exports
gust:os/{time,log,spawn,exec,timer} — matching gale#223 in words. But
synth --relocatable --all-exports emits SIX undefined symbols and an export set
that does not match the declared one: it emits gust:sched/tasks@0.1.0#*, which the
component does NOT export, and nothing for gust:os/time@0.1.0, which it DOES.

Nothing in the object separates the 2 real obligations from the 4 internals, and
satisfying them the obvious way is measurably wrong:

  • stubbing set-deadline/slept-status/state inert replaced gale's task-state
    store. Aliasing them onto gale's own exports via objcopy --redefine-sym is
    correct and is what build.sh does.
  • deadline has nothing to alias to, because the gust:os/time export was not
    lowered. Returning 0 broke dispatch; a now+ticks guess did not fix it either.

jess is not going to keep guessing at a gale semantic — that is gale's lane, and
inventing one is how a stub becomes a false claim.

Two harness defects of jess's own, both caught by the reference rather than by
inspection:

  • the first run used deadline=(0,0), now=(0,0); the reference's own comment says
    NOW must be PAST the deadline for a task to be READY. Reporting that as
    "gale-nano does not dispatch on silicon" would have been a false supplier
    report — the meld#390 shape.
  • the openocd readback filter ^0x2000048 silently dropped the exec_state word
    at 0x20000490 — the one reading that localises the fault.

Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com

…orks, dispatch does not (AFD-113)

H3 second half: ADVANCED, NOT COMPLETE. Stated that way deliberately.

gale-nano 0.7.0 (digest-pinned) lowered for cortex-m3 and linked against jess's
real gust:hal MMIO (AFD-109), the generic embedder-init apply loop (AFD-107) and a
boot shim. 4,349 B, 0 undefined, embedder ABI verified. On silicon:

  LEG (only the ADMIT word differs)   poll-task#  handle    state     completion
    task admitted (baseline)          00000000    00000000  00000001  c0ffee00
    no admit (negative control)       00000000    deadbeef  deadbeef  c0ffee00

Gale's code RUNS ON THE PART and exec_admit WORKS: gale's own exec_state(handle)
returns 1, exactly what TEST-PIX-035 asserts. handle 0 is correct, not a failure —
jess already recorded that gale-nano hands out handle 0.

But exec_poll_round reaches poll-task ZERO times, where the wasmtime reference —
re-run green the same day, 8/8, same pinned artifact, same PRIO/DEADLINE/NOW
constants taken from app/dispatch-driver — reaches it once. That is a confirmed
wasmtime-vs-silicon divergence, which is what jess's lane exists to produce.

LIKELY CAUSE, NOT PROVEN, AND NOT A GALE DEFECT. gale-nano's component manifest
declares exactly two imports (gust:os/taskdisp, gust:hal/mmio) and exports
gust:os/{time,log,spawn,exec,timer} — matching gale#223 in words. But
`synth --relocatable --all-exports` emits SIX undefined symbols and an export set
that does not match the declared one: it emits gust:sched/tasks@0.1.0#*, which the
component does NOT export, and nothing for gust:os/time@0.1.0, which it DOES.

Nothing in the object separates the 2 real obligations from the 4 internals, and
satisfying them the obvious way is measurably wrong:
  - stubbing set-deadline/slept-status/state inert replaced gale's task-state
    store. Aliasing them onto gale's own exports via objcopy --redefine-sym is
    correct and is what build.sh does.
  - `deadline` has nothing to alias to, because the gust:os/time export was not
    lowered. Returning 0 broke dispatch; a now+ticks guess did not fix it either.

jess is not going to keep guessing at a gale semantic — that is gale's lane, and
inventing one is how a stub becomes a false claim.

Two harness defects of jess's own, both caught by the reference rather than by
inspection:
  - the first run used deadline=(0,0), now=(0,0); the reference's own comment says
    NOW must be PAST the deadline for a task to be READY. Reporting that as
    "gale-nano does not dispatch on silicon" would have been a false supplier
    report — the meld#390 shape.
  - the openocd readback filter `^0x2000048` silently dropped the exec_state word
    at 0x20000490 — the one reading that localises the fault.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@avrabe
avrabe merged commit 1a35cfb into main Sep 7, 2026
9 checks passed
@avrabe
avrabe deleted the feat/gale-nano-on-silicon branch September 7, 2026 14:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant