feat(v4.0.0): refusals and waits on bare metal, and step 6c written up

The bare-metal host hands a waiting node the next line typed, as the
hosted one does: 5 AWAIT, then 7 8 * . -- Interrupted, then 56.

amd64, aarch64 and riscv64 boot, POST 538 of 538, word_count=317,
dict_hash 0x54520ade672566ad, the same as the three hosted programs:
logs/20261007-202737, -203230, -203616.

MESH.md step 6c: what was built, how it was verified, and two things
found on the way that are not mended and are for ruling: Hera blocked
writing to a stuck node, and a message that can go round for ever between
two nodes whose ways disagree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
rajames
2026-10-07 20:38:20 -04:00
co-authored by Claude Opus 5.5
parent ee2bbf4ecf
commit d343001dea
7 changed files with 575 additions and 12 deletions
+36 -5
View File
@@ -136,9 +136,8 @@ word address `base`:
three boots type `5 7 PORT!` and go on: `logs/20261007-121743` (amd64),
`-122008` (aarch64), `-122337` (riscv64); POST 538 of 538,
`dict_hash=0x5f0a949a6fc8ef2b` on all six.
**Not mended, and reported:** a node that waits at "any port" for an
answer that never comes (`AWAIT`, on a node that never answers) waits
for ever, and on the lone node that ends the line as "stopped".
A node that waited at "any port" for an answer that never came
(`AWAIT`) was not mended by this, and was by step 6c: section 7b.
### 4.2 A node at reset
@@ -921,8 +920,40 @@ Each is tested, committed and pushed before the next.
6. *The suite.* `make -C v4 test` and `sanitize` pass at both widths;
`mkcapsule --lint capsules/` is clean.
**6c. Refusals and waits (section 7b).** Acceptance, approved
2026-10-07:
**6c. Refusals and waits (section 7b).** **Done 2026-10-07.**
- *In the nucleus* (`v4/capsule/core.v4`, `quit.v4`): `(OWE)` and
`(PAY)`; the room kept for NACK and GONE; `NO-ROUTE`; `GONE`; `AWAIT`
ending in errors 19, 20 and 21; `(REFUSED)`.
- *Hera* (`capsules/v4/hera.4th`): her table of the nodes she has had
born, and `KILL`.
- *The lone node* (`v4/system/boot.c`, `v4/tools/hosted.c`,
`kernel/src/v4/sk_v4.c`): a line that waits is reported as waiting,
and the next line typed breaks the wait and is then done.
- *Tests.* `v4/tests/test_host_mesh.c`, 76 checks, three nodes in a row:
acceptance 1, 2 and 7, a GONE from a node's centre and one that is
not, and a console line breaking a wait while text for another node
passes through. `v4/tests/test_host_unit.c`, 74 checks: acceptance 3,
4 and 5, and `KILL` of what is not a node of hers. `hosted-check` and
the three boots type `5 AWAIT` and then another line: acceptance 6.
- *Verified.* `make -C v4 test`, `sanitize` and `hosted-check`; three
bare-metal boots, `logs/20261007-202737` (amd64), `-203230`
(aarch64), `-203616` (riscv64). On all six: POST 538 of 538,
`word_count=317`, `dict_hash=0x54520ade672566ad`.
- **Found on the way, and not mended: for ruling.**
- *Hera blocked writing to a stuck node.* Hera has the lowest number,
so by section 7a she writes to a neighbour without looking and is
blocked until it reads. If that neighbour is stuck she is blocked
writing, not waiting, and a line from the console does not release
her. `KILL` sends GONE to every other node, so with two nodes stuck
at once, killing one would leave her blocked on the other.
- *A message that goes round for ever.* When a node forgets the way to
another, what it sends there goes by its way for everything else.
If the node at that end still believes the way is back through the
first, the message passes between them without end: nothing counts
hops (the TTL is carried and not acted on). `KILL` has Hera forget
her own way first, which prevents it there.
Acceptance, approved 2026-10-07:
1. *No room.* A node's queue is filled; the next message for it is
refused, and the sender's `(REFUSED)` count rises by one. A sender
that was waiting has its line end "Message refused".