fix(v4.0.0): step 6e review round 1 -- a take that does not take does nothing; output and answers wait at a middle node; no queue on the kernel's port; a printing wait is not interrupted

- The result of every take is looked at: a wire cut between the look and
  the take leaves nothing acted on (the text before run again, a refusal
  counted, a wait ended by an old answer, a way forgotten).
- A node with no room to pass on what another printed, or its word of how
  text ended, leaves it on the wire it came by and moves it when there is
  room; what is behind it for the same port waits too.  Sleep for room (9)
  is woken by room on any of the node's wires (engine; MESH.md 7d.3).
- The lone node's host keeps no queue for the kernel's port: a message to
  it is error 18.  The step limit is counted while the node waits for room.
- A text waiting for room to print is not interrupted by console text;
  AWAIT is, as before.  (BREAK?) is gone.
- A GONE is believed only by the centre's port; unawaited answers let go
  are counted; nothing past a message's last character goes on a wire;
  AWAIT sets (AWAIT-FROM) only once the stack has been tried.
- test_host_depth.c: ten paths, each run works or ends in one named stack
  error; it fails with (ROOM) or (ROOM-SERVE) taken out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
rajames
2026-10-08 20:01:11 -04:00
co-authored by Claude Opus 5.5
parent b1d09af043
commit 6a7d0aa27f
16 changed files with 624 additions and 182 deletions
+17 -5
View File
@@ -794,7 +794,7 @@ the engine and happens whole.
| 6, first | The mark is put at the message at the front of the wire. |
| 7, next | The mark is put at the message after the one it is at. |
| 8, sleep | The node is blocked until a message has come to one of its wires since it last fetched "which wires have a message". |
| 9, sleep for room | The node is blocked until the wire has A cells free, or a message has come as in 8, whichever is first. |
| 9, sleep for room | If the wire has A cells free it answers 0 at once. If not, the node is blocked until a message has come as in 8, or a message has come off any of the wires that lead from it since it was last woken that way: it is then answered 0 if the wire has the A cells and 1 if not, and asks which wire has what (10). *(Changed 2026-10-08, fix round 1 of tasks 2 and 3: it was woken by room on the named wire only. A node may be waiting to put on several wires -- output it is passing on, the answers of texts it has not begun -- and can name one.)* |
| 10, room | Has the wire A cells free? It answers at once and changes nothing. |
- Each wire has a mark for the node that reads it: the message that
@@ -835,6 +835,15 @@ waiting, the words that turned it, the list of NACKs owed, and
it has been passed on 16 times, it is dropped, counted in `(LOST)`,
and a NACK is put on the wire back toward its sender. A NACK or a
GONE that cannot go is dropped and counted; nothing is owed for it.
*(Ruled 2026-10-08, fix round 1 of tasks 2 and 3:)* **but what a
node printed (type 2) and its word of how text ended (type 3) are
not dropped for want of room.** The message is left on the wire it
came by and gone past with next; what is behind it is served, but
for what goes the same way, which is left too so that the order is
kept; and it is moved when room appears. The node then sleeps for
room (9), which room on any of its wires ends. The code before step
6e waited here; letting output go while the line said ok was a
step back.
- *For itself:* it is taken and dealt with as now: text is done; a
NACK is counted; a GONE from its centre is believed.
- *`SEND`, how text ended, a NACK, a GONE* are built in the node's own
@@ -842,10 +851,13 @@ waiting, the words that turned it, the list of NACKs owed, and
others are counted in `(LOST)`.
- *What text prints* is put when the output buffer fills and when the
text ends. If the wire has no room the node sleeps for room (9). Woken
by a message instead, it passes on what is for other nodes, as above,
and sleeps again; text for itself from its console ends the text it is
doing in error 21, "Interrupted"; anything else for itself stays on
the wire.
with no room yet, it passes on what is for other nodes, as above, and
sleeps again; everything for itself stays on the wire. *(Reworded
2026-10-08, ruled by Captain Bob in fix round 1 of tasks 2 and 3: as
first ruled, text from its console ended the text in error 21. A line
typed ahead while a text printed then cut the printing short. A text
waiting for room to print is not interrupted; a console line ends an
`AWAIT` only.)*
- *`AWAIT`* sleeps (8) and, woken, goes through each wire with first and
next: what is for other nodes is passed on; what would end its wait is
taken -- the answer, a NACK or a believed GONE about the node waited