docs(v4.0.0): step 6d -- the wait: rulings, engine, nucleus, limits and acceptance
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
59727f762a
commit
5150155281
@@ -240,6 +240,10 @@ and these tables. Nothing else changes.
|
||||
|
||||
## 7a. Two neighbours writing to each other (ruled 2026-10-06)
|
||||
|
||||
*(The lower-number rule and the looking again of this section are
|
||||
replaced by the wait, section 7c, ruled 2026-10-07. The messages waiting,
|
||||
and what flooding costs, stand.)*
|
||||
|
||||
The fault is in section 10, step 4. **Ruled: a node writes only to a
|
||||
neighbour that is already reading; a node keeps the messages it takes in
|
||||
meanwhile, and one there is no room for is lost and counted.**
|
||||
@@ -457,6 +461,120 @@ Two types, beside text (1), output (2) and done (3):
|
||||
and passes it on when its wait ends, not before.
|
||||
- A node that was never told who is on its centre's port believes no GONE.
|
||||
|
||||
## 7c. The wait (ruled 2026-10-07)
|
||||
|
||||
**What it closes.** Section 7b.7's limit: a node with something for a
|
||||
neighbour that was not reading could only write anyway, and be blocked, or
|
||||
look again and again, never sleeping and never showing as reading. Either
|
||||
way a stuck node held up its neighbours until it was killed. What was
|
||||
missing was a third move: sleep until the neighbour I want is ready, or
|
||||
until anyone wants me.
|
||||
|
||||
**v3's way.** A send never blocks: kernel-Hermes queues it for the target
|
||||
and refuses at once when there is no room (section 7b). v4 left that at
|
||||
step 4, when nodes were ruled to talk through ports. Put to Captain Bob:
|
||||
the wait below, or v3's way in full. **Ruled: the wait.** It is not an
|
||||
F18 thing either; it is nearer the alternation of CSP. Captain Bob: "we
|
||||
don't necessarily have to stick to the F18 rules... we're just borrowing
|
||||
ideas."
|
||||
|
||||
### 7c.1 The rulings
|
||||
|
||||
1. **A node offers the first word of a message and sleeps**, until that
|
||||
word is taken or a word comes for it, whichever is first.
|
||||
2. **The fabric does the handing over in one step**, so nothing can change
|
||||
between a node's looking and its writing.
|
||||
3. **The lower-number rule of section 7a is dropped.** When two nodes each
|
||||
offer to the other, the fabric picks.
|
||||
4. **The console release of 7b.6 ("a blocked write") comes out of the
|
||||
engine.** A console line reaches a node in the wait as any message
|
||||
does.
|
||||
|
||||
### 7c.2 The engine
|
||||
|
||||
Two more addresses follow a node's ports (section 4.1, 7a):
|
||||
|
||||
| Address | What |
|
||||
|---|---|
|
||||
| `base + V4_PORTS + 4` | Offer to: store the number of a port |
|
||||
| `base + V4_PORTS + 5` | Offer: store the word offered. Fetch: the wait |
|
||||
|
||||
- A store to either is remembered and waits for nothing.
|
||||
- **A fetch of the wait blocks the node** until one of these, which the
|
||||
fabric looks for once a step, in this order:
|
||||
1. *A word for it.* A neighbour is blocked writing to it, on any port,
|
||||
or a device on one of its ports has a word to give. It gets that
|
||||
word, as a read of "any port" would, and "which port" says where
|
||||
from. Its offer is withdrawn.
|
||||
2. *Its offer taken.* The node on the port offered to is blocked reading
|
||||
that port or any port; or is a device that takes what is written; or
|
||||
is itself in the wait. The word is handed over. The fetch gives 0,
|
||||
and "which port" gives `V4_PORTS`, which is no port: the offer was
|
||||
taken.
|
||||
3. *Two nodes each offering to the other:* the one at the lower place in
|
||||
the fabric has its offer taken, and the other gets the word (case 2
|
||||
for the one, case 1 for the other).
|
||||
- A node in the wait that is handed a word by case 2 of another node gets
|
||||
it by its own case 1.
|
||||
- A node in the wait executes nothing and spends no heat. It shows to its
|
||||
neighbours as waiting to read.
|
||||
- With nothing on the port offered to, a node that can take an error has
|
||||
error 18 raised on it (section 4.1); a bare node waits. A neighbour that
|
||||
is asleep takes nothing: the offer stands.
|
||||
- `v4_fabric_interrupt_error`, a device's `pending`, and
|
||||
`v4_node_words_since_look` are removed.
|
||||
- The lone node of the two products (`v4/system/boot.c`) has the same
|
||||
wait: the kernel and the console take an offer at once; any other port
|
||||
has nothing on it.
|
||||
|
||||
### 7c.3 The nucleus
|
||||
|
||||
- *Beginning a message* (`(GATE)`): offer its first word; if a word comes
|
||||
instead, take that message in and offer again; when the offer is taken,
|
||||
write the rest, each word waiting for the neighbour, which has taken the
|
||||
first and reads to the end.
|
||||
- *Paying what is owed* (`(PAY)`): each NACK is offered the same way. A
|
||||
node with nothing to do that owes one sleeps in the wait; it no longer
|
||||
goes round, and it no longer writes one without looking.
|
||||
- *Text from its console for a node that is waiting to begin a message*
|
||||
ends what the node was doing in error 21, "Interrupted", and is then
|
||||
done, as in `AWAIT` (7b.6). This is how Hera is typed to while she waits
|
||||
on a stuck node.
|
||||
- `NEIGHBOUR` stays: a node must know who is on its centre's port to
|
||||
believe a GONE (7b.4). It is no longer needed to write.
|
||||
|
||||
### 7c.4 What is still a limit
|
||||
|
||||
- A node's own line that must begin a message to a stuck node waits until
|
||||
Hera kills that node or, on Hera, a line is typed. It takes in
|
||||
everything sent to it meanwhile, and holds up no one.
|
||||
- A node in `AWAIT` keeps what comes for other nodes, and what it owes,
|
||||
until its wait ends (7b.7).
|
||||
- A message once begun is written to its end. A node that takes a first
|
||||
word and is then removed leaves its writer with error 18.
|
||||
|
||||
### 7c.5 Acceptance
|
||||
|
||||
1. *Offer taken.* A node offers to a neighbour that is reading: the word
|
||||
passes and the rest follows.
|
||||
2. *Offer withdrawn.* A node offering to a neighbour that never reads is
|
||||
written to by another: it takes that message and offers again.
|
||||
3. *Two offers.* Two nodes offer to each other in the same step: one
|
||||
message passes each way, and neither is lost.
|
||||
4. *A stuck neighbour holds up no one.* With a node stuck in a loop: a
|
||||
neighbour that owes it a NACK, whether its number is higher or lower,
|
||||
goes on doing what it is sent, and so does a third node that writes to
|
||||
that neighbour. A node with a message for the stuck one takes in what
|
||||
it is sent meanwhile.
|
||||
5. *Hera.* Waiting to begin a message to a stuck node, she is typed to:
|
||||
the line that waited ends "Interrupted", and the new line, which kills
|
||||
the stuck node, is done.
|
||||
6. *An empty port.* An offer to a port with nothing on it is error 18.
|
||||
7. *Nothing deadlocks.* The flood of section 7a's test, 800 messages
|
||||
among three nodes, comes to rest.
|
||||
8. *Nothing else changes.* POST 538 of 538, the existing tests, and one
|
||||
hash on all six systems; `sanitize`, `hosted-check`, lint, three boots.
|
||||
|
||||
## 8. Storage
|
||||
|
||||
**Ruled 2026-10-06 and 2026-10-07** (Captain Bob). On 2026-10-07 he found
|
||||
@@ -1069,6 +1187,8 @@ Each is tested, committed and pushed before the next.
|
||||
8. *Nothing else changes.* POST 538 of 538, the existing tests, and the
|
||||
same hashes on all six systems.
|
||||
|
||||
**6d. The wait (section 7c).** Ruled 2026-10-07; not built.
|
||||
|
||||
7. **A second unit; scaling while running; sleep, wake and kill by
|
||||
command.**
|
||||
8. **The hosted product is the five nodes**, on three ISAs: acceptance 1
|
||||
|
||||
Reference in New Issue
Block a user