Findings: task 3.8 payload-aliasing defect found while starting 3.9
While orienting for task 3.9 (CONSOLE-CMD-EVENT cutover, per Captain Bob's ruling to verify via a real QMP/serial-socket console session), booting with a second real identity drive attached alongside Zuse's own exposed a real defect in the already-closed task 3.8 code: g_kh_blk_attach_buf (repl.c) is one static buffer, and sk_hermes_send_one() stores payload_addr as a caller-owned pointer, not a copy. Two real USB-MSC attaches in one sk_repl_idle() pass send before either drains, so both messages alias the same buffer -- only one identity ever completed. Task 3.8's own write-up claimed this "carries the same single-buffer- reuse shape ATTACH-ACK-BUF itself already had... not a new hazard" -- that claim was wrong and is amended in FABRIC-3.6.md's findings log. FORTH's own MSG-SEND had the identical pointer-aliasing shape but never hit the window: MSG-TICK drained from the same sk_repl_idle() pass that queues attaches. Kernel-Hermes drains at interpret checkpoints, which don't fire during that pass at all -- the cutover changed not just how delivery happens but when, opening a window FORTH's own design never had. Reported, not fixed here, per Captain Bob's Law: this is a defect in closed task 3.8 code, found while scoping a different task. A real fix changes SkHermesMessage's own shape to own its payload bytes rather than reference a caller's pointer -- bigger than a repl.c patch, touches every existing sender, needs its own three-ISA acceptance. Task 3.9's own send-side cutover (kernel_hermes.h, repl.c) is written but deliberately left uncommitted -- it would inherit the identical defect shape if shipped now. logs/20260922-111840/amd64/ is the reproduction. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
bbfd9103f4
commit
7944abca36
+46
-1
@@ -1117,9 +1117,18 @@ ruling]** cannot be written precisely until Captain Bob settles the named sub-it
|
|||||||
invisibility rather than producing new acceptance evidence. All superseded by
|
invisibility rather than producing new acceptance evidence. All superseded by
|
||||||
`105501`/`105758`/`110304`, cited above, once the disk-reset-before-each-arch procedure and
|
`105501`/`105758`/`110304`, cited above, once the disk-reset-before-each-arch procedure and
|
||||||
the final single-line evidence design were both settled.
|
the final single-line evidence design were both settled.
|
||||||
- [ ] **3.9** — **Stage D: `CONSOLE-CMD-EVENT` (type 7)**, then **3.10 `ELEVATE-REQUEST`
|
- [~] **3.9** — **Stage D: `CONSOLE-CMD-EVENT` (type 7)**, then **3.10 `ELEVATE-REQUEST`
|
||||||
(type 8)** — one type per task, each with the 3.8 check. Any type found live beyond these
|
(type 8)** — one type per task, each with the 3.8 check. Any type found live beyond these
|
||||||
three is added here, not bundled.
|
three is added here, not bundled.
|
||||||
|
2026-09-22 · **PAUSED, not started-and-blocked by its own scope** — the send-side cutover
|
||||||
|
(`SK_HERMES_MSG_TYPE_CONSOLE_CMD`, `kernel_hermes.h`; `sk_repl_dispatch_line()`'s new
|
||||||
|
kernel-Hermes call, `repl.c`) is written but uncommitted. Orienting for verification (Bob
|
||||||
|
ruled: full QMP/serial-socket-driven real console session, not a self-test) surfaced the
|
||||||
|
task 3.8 payload-aliasing defect recorded in the findings log above — real fix changes
|
||||||
|
`SkHermesMessage`'s shape and is bigger than this task. Paused pending Bob's call on
|
||||||
|
sequencing. `g_kh_console_cmd_buf` (this task's own new static buffer) inherits the exact
|
||||||
|
same defect shape if committed as-is — do not commit until the task 3.8 fix lands, or this
|
||||||
|
task ships the same bug a second time.
|
||||||
- [ ] **3.11** — **Phase 3 gate.** No FORTH-owned live message types remain; Stage B evidence
|
- [ ] **3.11** — **Phase 3 gate.** No FORTH-owned live message types remain; Stage B evidence
|
||||||
holds across a full boot on all three ISAs. **Do not start Phase 4 until this passes.**
|
holds across a full boot on all three ISAs. **Do not start Phase 4 until this passes.**
|
||||||
|
|
||||||
@@ -1210,6 +1219,42 @@ mid-dispatch, exercised live for the first time by this exact task) is not somet
|
|||||||
as a fluke. Reported, not chased further here — `logs/20260922-092154/` is kept as the sole
|
as a fluke. Reported, not chased further here — `logs/20260922-092154/` is kept as the sole
|
||||||
evidence.
|
evidence.
|
||||||
|
|
||||||
|
**2026-09-22, found while starting task 3.9 — task 3.8's `g_kh_blk_attach_buf` is a real
|
||||||
|
payload-aliasing defect, not a benign restatement of an existing hazard as that task's own
|
||||||
|
write-up claimed.** Discovered orienting for 3.9: booted amd64 with a second real identity drive
|
||||||
|
("bob") attached at boot alongside Zuse's own (`QEMU_EXTRA` at port 2,
|
||||||
|
`logs/20260922-111840/amd64/`), which puts two real USB-MSC devices through
|
||||||
|
`sk_repl_idle()`'s per-slot attach loop in one pass — two `KH-BLK-ATTACH-SEND` calls before
|
||||||
|
either drains. The ledger confirms it: `held=4096` (two admissions, 2×2048) at the first drain's
|
||||||
|
own evidence print, not `held=2048` as every single-device boot this session showed. Only one
|
||||||
|
device's identity ever completed (`Zuse: genesis minted...`); `S" bob" USE` afterward returned
|
||||||
|
`USE: bob not found` — bob's own WIREBIND pairing never happened.
|
||||||
|
|
||||||
|
**Root cause (following the code, not re-deriving it live):** `g_kh_blk_attach_buf`
|
||||||
|
(`repl.c`) is one static buffer, and `sk_hermes_send_one()` stores `payload_addr` as a caller-
|
||||||
|
owned pointer, not a copy. Two sends before either drain means both messages point at the same
|
||||||
|
address — whichever send wrote last. **Task 3.8's own write-up claim that this "carries the same
|
||||||
|
single-buffer-reuse shape `ATTACH-ACK-BUF` itself already had... not a new hazard this
|
||||||
|
introduces" is wrong, and is amended here rather than left standing.** FORTH's own `MSG-SEND`
|
||||||
|
had the identical pointer-aliasing shape, but never hit the window: `MSG-TICK` pumped from
|
||||||
|
`sk_repl_idle()` itself, draining between attaches in the same loop that queues them.
|
||||||
|
**Kernel-Hermes drains at interpret checkpoints, which do not fire during that idle-loop pass at
|
||||||
|
all** — the cutover didn't just change *how* delivery happens, it changed *when*, and that's what
|
||||||
|
opened a window FORTH's own design never had. Likely mechanism for why the second message
|
||||||
|
produced no visible failure either (inference, not confirmed): both messages probably drained
|
||||||
|
using the same (second-write) payload text, and the one carrying the wrong `dev-addr` most likely
|
||||||
|
hit `repl.c:246`'s `found_slot == 0 || !pending` early return — silent, no print, ahead of this
|
||||||
|
task's own evidence line. Not chased to confirm, per the scope decision below.
|
||||||
|
|
||||||
|
**Not fixed here.** This is a defect in already-committed, closed task 3.8 code, found while
|
||||||
|
scoping a different task — Captain Bob's Law: report, don't fix in passing. A real fix changes
|
||||||
|
`SkHermesMessage`'s own shape (task 2.1) to own its payload bytes rather than referencing a
|
||||||
|
caller's pointer, which is bigger than a `repl.c`-local patch: it touches every existing sender
|
||||||
|
(tasks 3.3/3.5/3.6/3.8) and needs its own three-ISA acceptance. `logs/20260922-111840/amd64/` is
|
||||||
|
kept as the reproduction — a second identity drive attached at boot is what exposes this; the
|
||||||
|
default single-drive boot this whole document's other acceptance runs used never will. Task 3.9
|
||||||
|
is paused pending Captain Bob's decision on when this gets fixed.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Out of scope, carried for visibility
|
## Out of scope, carried for visibility
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user