safety commit

This commit is contained in:
rajames
2026-10-19 06:35:46 -04:00
parent 63434f3762
commit 5707b07abf
12 changed files with 122 additions and 75 deletions
+12 -14
View File
@@ -1,5 +1,5 @@
# Capsule Block Manifest — Auto-generated
<!-- Generated by mkcapsule --manifest 2026-10-16T18:51:39Z -->
<!-- Generated by mkcapsule --manifest 2026-10-17T02:58:45Z -->
<!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. -->
<!-- Hand-written justifications and immutability notes live -->
<!-- in MANIFEST.md alongside this auto-generated index. -->
@@ -29,9 +29,9 @@
| `sdk.4th` | 5109, 5110, 5111, 5112, 5113, 5114, 5115 | `0x008fdbbb62c94a3a` | n/a |
| `turtle.4th` | 5100, 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108 | `0x4d470418ca543365` | n/a |
| `user-font-demo.4th` | 4200, 4201, 4202 | `0xce1fd7d1b581a56d` | n/a |
| `v4:centre.4th` | 8100, 8101, 8102, 8103, 8104, 8105, 8106, 8107, 8108 | `0x7b60682500afa138` | n/a |
| `v4:centre.4th` | 8100, 8101, 8102, 8104, 8105, 8106, 8107 | `0xccd1b28a101c78b2` | n/a |
| `v4:forth79.4th` | 6000, 6001, 6002 | `0x4055641ee17d176b` | n/a |
| `v4:hera.4th` | 8000, 8001 | `0xee06b95cae3e3bb4` | n/a |
| `v4:hera.4th` | 8000, 8001 | `0x85300ad4e6e8b86b` | n/a |
| `v4:starshipos.4th` | 7000, 7001 | `0xb74bfa51f8d4719a` | n/a |
| `workload-0.4th` | 2200, 2201 | `0x93f86f60aeba8feb` | n/a |
| `workload-1-lite.4th` | 5058, 5059 | `0x44a7a7e3176dcc8d` | n/a |
@@ -370,17 +370,15 @@
| 6002 | `v4:forth79.4th` | `0x4055641ee17d176b` | ok |
| 7000 | `v4:starshipos.4th` | `0xb74bfa51f8d4719a` | ok |
| 7001 | `v4:starshipos.4th` | `0xb74bfa51f8d4719a` | ok |
| 8000 | `v4:hera.4th` | `0xee06b95cae3e3bb4` | ok |
| 8001 | `v4:hera.4th` | `0xee06b95cae3e3bb4` | ok |
| 8100 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
| 8101 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
| 8102 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
| 8103 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
| 8104 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
| 8105 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
| 8106 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
| 8107 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
| 8108 | `v4:centre.4th` | `0x7b60682500afa138` | ok |
| 8000 | `v4:hera.4th` | `0x85300ad4e6e8b86b` | ok |
| 8001 | `v4:hera.4th` | `0x85300ad4e6e8b86b` | ok |
| 8100 | `v4:centre.4th` | `0xccd1b28a101c78b2` | ok |
| 8101 | `v4:centre.4th` | `0xccd1b28a101c78b2` | ok |
| 8102 | `v4:centre.4th` | `0xccd1b28a101c78b2` | ok |
| 8104 | `v4:centre.4th` | `0xccd1b28a101c78b2` | ok |
| 8105 | `v4:centre.4th` | `0xccd1b28a101c78b2` | ok |
| 8106 | `v4:centre.4th` | `0xccd1b28a101c78b2` | ok |
| 8107 | `v4:centre.4th` | `0xccd1b28a101c78b2` | ok |
## Conflicts
-27
View File
@@ -36,22 +36,6 @@ Block 8102
: (LINES) ( baddr u -- ) CAPSULE-OPEN 0= IF (FAIL) THEN
BEGIN PAD CAPSULE-LINE DUP 0< 0= WHILE PAD SWAP (TELL) REPEAT
DROP ;
Block 8103
( The nodes this one has had born: for each its number and )
( the port of this node it is on. Sixteen at most. )
CREATE (KIDS) 32 ALLOT VARIABLE (KIDS#) 0 (KIDS#) !
: (KID@) ( i -- addr ) 2 * (KIDS) + ;
: (NOTE) ( number port -- )
(KIDS#) @ 16 < IF
(KIDS#) @ (KID@) SWAP OVER 1+ ! ! 1 (KIDS#) +!
ELSE DROP DROP THEN ;
: (WHICH) ( number -- i | -1 )
-1 SWAP (KIDS#) @ DUP IF 0 DO
DUP I (KID@) @ = IF SWAP DROP I SWAP THEN
LOOP ELSE DROP THEN DROP ;
: (UNLIST) ( i -- )
(KIDS#) @ 1- DUP (KIDS#) ! (KID@) DUP @ SWAP 1+ @
ROT (KID@) SWAP OVER 1+ ! ! ;
Block 8104
( Who it is, where its printing goes, which of its ports )
( leads to everything it is not told of, and who is there. )
@@ -75,7 +59,6 @@ Block 8105
(PERS#) @ IF (PERS) @ (PERS#) @ (LINES) THEN
S" (SEAL)" (TELL)
(KID) @ (KID#) @ NODE-PARITY
(KID#) @ (KIDP) @ (NOTE)
(KID) @ ;
Block 8106
( number port childport -- place a node with no capsule )
@@ -105,13 +88,3 @@ VARIABLE (P1) VARIABLE (P2) VARIABLE (P3) VARIABLE (P4)
(P2) @ 2 (N) (X) (P4) @ 4 (N) (Y) (JOIN)
(P4) @ 4 (N) (X) (P3) @ 3 (N) (Y) (JOIN)
(P3) @ 3 (N) (X) (P1) @ 1 (N) (Y) (JOIN) ;
Block 8108
( n -- NODE n IS GONE: every node this one birthed is told, )
( as from this one, and n leaves the list if it was there. )
( The system calls this when it believes a GONE, through )
( GONE-HOOK in quit.f18; Hera calls it from KILL. )
: GONE-DOWN ( n -- )
DUP (WHICH) DUP 0< IF DROP ELSE (UNLIST) THEN
(KIDS#) @ DUP IF 0 DO DUP I (KID@) @ GONE LOOP
ELSE DROP THEN DROP ;
' GONE-DOWN (GONE-HOOK) !
+3 -3
View File
@@ -9,11 +9,11 @@ Block 8000
( n -- n flag a node there is, and not Hera herself )
: (THERE?) DUP (ME) @ = 0= OVER NODE-PLACE 0< 0= AND ;
: (NO-NODE) ( n -- ) DROP ." no such node" CR -1 NODE-ERROR ! ;
( n -- KILL: node n is removed, whatever it was doing; this )
( node forgets the way to it, and GONE goes down the graph. )
( n -- KILL: node n is removed, whatever it was doing; the )
( kernel tells every node it is gone, and Hera forgets it. )
: KILL ( n -- )
(THERE?) 0= IF ." KILL: " (NO-NODE) THEN
DUP NODE-KILL DUP NO-ROUTE GONE-DOWN ;
DUP NODE-KILL NO-ROUTE ;
Block 8001
: PAUSE ( n -- )
(THERE?) 0= IF ." PAUSE: " (NO-NODE) THEN NODE-SLEEP ;
+25 -15
View File
@@ -1389,10 +1389,19 @@ Checked in the code on 2026-10-16 (`kernel/src/capsule/mama_forth_words.c`,
6. **A centre faces another centre on port 6, on both sides.** The ports
of a centre: 0 the kernel, 1 the console or devices, 2 to 5 its outer
nodes, 6 and 7 other centres (section 4.1's proposal).
7. **GONE goes down the birth graph.** Hera sends it to the nodes she
7. ~~**GONE goes down the birth graph.** Hera sends it to the nodes she
birthed. A node that believes a GONE sends it on to the nodes it
birthed, as from itself. A node still believes a GONE only from its own
centre (7b.4).
birthed, as from itself.~~ **Changed 2026-10-16, after the final review
of step 7 (Captain Bob: "yes, agreed"): the kernel tells a node's
going.** When Hera kills a node, the kernel puts a GONE about it on the
wire of every live node from its parent, as if its parent had sent it.
No node hands a GONE on. A node still believes a GONE only from its own
centre (7b.4), and its parent is its centre. Why: handing a GONE on ran
message machinery on a node's own stacks, in whatever text it was in --
the cause 7c.6 found when the first wait was backed out, and which 7d
took off the nodes. The review found the hand-on lost at depth, and a
node between texts losing its values to a fault; the kernel has the
registry and needs no stack of a node's.
### 9a.3 The capsules
@@ -1409,10 +1418,6 @@ Checked in the code on 2026-10-16 (`kernel/src/capsule/mama_forth_words.c`,
capsule. It gains the child's port.
- `UNIT ( n -- )`, as now, giving `childport` 2.
- The words that join two outer nodes (`(JOIN)`, `(SAY)`), as now.
- `GONE-DOWN ( n -- )`: n is gone; every node this one birthed is told,
as from this one, and n leaves its table if it was one of them. It is
put in the system's `(GONE-HOOK)` when the capsule is loaded, before
the node seals.
- **`hera.4th`**: what is Hera's alone.
- `KILL ( n -- )`, `PAUSE ( n -- )`, `RESUME ( n -- )`.
- `UNIT-KILL ( n -- )`: asks the kernel for n's children, kills each, and
@@ -1421,14 +1426,14 @@ Checked in the code on 2026-10-16 (`kernel/src/capsule/mama_forth_words.c`,
`S" v4:centre.4th" BIRTH-AS`, sets her way to n+1 to n+4 to port 6,
and sends it the text `n UNIT`, waiting for it to end.
**The system's part (ruled 2026-10-16, planning).** A node believes a GONE
in the system (`(GONE?)`, `capsules/v4/sys/quit.f18`), so the system hands
it on: a variable, `(GONE-HOOK)`, holds the xt of a word that is given the
number of the node that is gone; 0, as at switch-on, does nothing. `COLD`
clears it if it points at or above the sealed system.
- Her table of the nodes she birthed is `centre.4th`'s, as every
centre's is: it is whom she tells a GONE. A node she did not birth she
finds through the kernel's registry.
- She keeps no table of the nodes she birthed: she finds a node, and its
children, through the kernel's registry.
~~**The system's part (ruled 2026-10-16, planning).** A node believes a GONE
in the system, so the system hands it on: a variable, `(GONE-HOOK)`, holds
the xt of a word that is given the number of the node that is gone.~~
**Withdrawn the same day with ruling 7:** the kernel tells the GONE; the
system hands nothing on.
### 9a.4 The kernel (`v4/include/v4/manage.h`, `v4/src/manage.c`)
@@ -1453,6 +1458,11 @@ clears it if it points at or above the sealed system.
- **`NODE-SLEEP`, `NODE-WAKE` and `NODE-KILL` take a number**, which the
registry turns into a place. `NODE-KILL` refuses Hera. A number that is
not live does nothing, as v3's `KILL` of a dead VM.
- **`NODE-KILL` tells everyone** (ruled 2026-10-16, ruling 7 as changed):
the killed node's children become Hera's, and the kernel puts a GONE
about it on every live node's wire from its parent. A wire with no room
for it is not waited for, and that node is not told (as an answer whose
way back is full, 7d.6).
- **Two queries:** `NODE-CHILD ( number i -- child | 0 )`, the i-th live
child of that node; `NODE-PLACE ( number -- place | -1 )`.
- **The requests' numbers are fixed** (ruled 2026-10-16, planning): -6 to
Binary file not shown.
+6 -6
View File
@@ -2,11 +2,11 @@ SPDXVersion: SPDX-2.3
DataLicense: CC0-1.0
SPDXID: SPDXRef-DOCUMENT
DocumentName: LithosAnanke
DocumentNamespace: https://anchore.com/syft/dir/LithosAnanke-4faf1868-80c5-46d4-94c7-f135ceb16ece
DocumentNamespace: https://anchore.com/syft/dir/LithosAnanke-6f39405c-a00b-4ec6-a261-5ac816f60003
LicenseListVersion: 3.28
Creator: Organization: Anchore, Inc
Creator: Tool: syft-1.52.0
Created: 2026-10-14T21:22:34Z
Created: 2026-10-15T08:08:53Z
##### Unpackaged files
@@ -1436,7 +1436,7 @@ FileCopyrightText: NOASSERTION
FileName: capsules/BLOCK_MAP.md
SPDXID: SPDXRef-File-capsules-BLOCK-MAP.md-60e0d9c6f645b854
FileType: TEXT
FileChecksum: SHA256: 9a2aca6fd9cf4c8139ca2f5c4d5cc65fe17f8024d199ea57347d536dff64f2a1
FileChecksum: SHA256: 60b323ed1b254d39aa31540e8125eefb63e53353f081ef724fef62ae80a0e4ec
LicenseConcluded: NOASSERTION
LicenseInfoInFile: NOASSERTION
FileCopyrightText: NOASSERTION
@@ -4813,7 +4813,7 @@ FileCopyrightText: NOASSERTION
FileName: v3/include/version.h
SPDXID: SPDXRef-File-v3-include-version.h-b91ab87bb4c7c29d
FileType: TEXT
FileChecksum: SHA256: a2bf5e8b521026b6822a8a0ca69d2f17e41fd212bdc1f411593dee14a089ad6b
FileChecksum: SHA256: b4186cb8736819635ed2815db7545e7b59cce31a1aebca2f51acd7092fbf260e
LicenseConcluded: NOASSERTION
LicenseInfoInFile: NOASSERTION
FileCopyrightText: NOASSERTION
@@ -6157,7 +6157,7 @@ FileCopyrightText: NOASSERTION
FileName: v4/system/boot.c
SPDXID: SPDXRef-File-v4-system-boot.c-2e70c76af91870d8
FileType: TEXT
FileChecksum: SHA256: 3f787fb428e9c7fc0901c8da2a2fed6fdc0c61156944fc95fb34ab6e228bf9a5
FileChecksum: SHA256: 3670fe89d4ea291ffe45cc173020a55f2e97fd5e17410a6c80d8623d8a40b09b
LicenseConcluded: NOASSERTION
LicenseInfoInFile: NOASSERTION
FileCopyrightText: NOASSERTION
@@ -6502,7 +6502,7 @@ FileCopyrightText: NOASSERTION
PackageName: LithosAnanke
SPDXID: SPDXRef-DocumentRoot-Directory-LithosAnanke
PackageVersion: 2.1.0+v2.1.0-203-g3b49cb15
PackageVersion: 2.1.0+v2.1.0-204-gc7bf68fe-dirty
PackageSupplier: NOASSERTION
PackageDownloadLocation: NOASSERTION
PrimaryPackagePurpose: FILE
+1 -1
View File
File diff suppressed because one or more lines are too long
+7 -4
View File
@@ -2,9 +2,12 @@
#define STARFORTH_VERSION_H
#define STARFORTH_VERSION "3.2.0"
#define STARFORTH_ARCH "x86_64"
#define STARFORTH_TARGET "standard"
#define STARFORTH_TIMESTAMP "2026-10-01T15:21:25-04:00"
#define STARFORTH_VERSION_FULL "StarForth v3.2.0 x86_64 standard 2026-10-01T15:21:25-04:00"
#define STARFORTH_ARCH "amd64"
#define STARFORTH_TARGET "kernel"
#define STARFORTH_TIMESTAMP "2026-10-16T22:58:44-04:00"
#define STARFORTH_VERSION_FULL "StarForth v3.2.0 amd64 kernel 2026-10-16T22:58:44-04:00"
#define LITHOS_VERSION "2.1.0"
#define LITHOS_VERSION_STR "LithosAnanke v2.1.0 amd64"
#endif /* STARFORTH_VERSION_H */
+4 -1
View File
@@ -26,7 +26,10 @@
* -12 NODE-KILL ( number -- ) Hera; not herself; a number not
* live does nothing. The node's
* children are not removed, as v3,
* and become Hera's children.
* and become Hera's children. The
* kernel puts a GONE about it on
* every live node's wire from its
* parent: no node hands one on.
* -13 NODE-PARITY ( place number -- ) for a node the asker birthed,
* under the number it was born as
* -14 CAPSULE-OPEN ( baddr u -- flag ) any node in the registry: the
+24
View File
@@ -3,6 +3,7 @@
* Nothing here uses the C library: the bare-metal kernel links this file.
*/
#include "v4/manage.h"
#include "v4/message.h"
const char *const v4_manage_words[V4_MANAGE_WORDS] = {
"NODE-ME", "NODE-BORN", "NODE-WIRE", "NODE-UNWIRE", "NODE-SLEEP", "NODE-WAKE", "NODE-KILL", "NODE-PARITY",
@@ -45,6 +46,28 @@ static int mine(const v4_manage *m, const v4_manage_entry *asker, unsigned place
const v4_manage_entry *e = by_place(m, place);
return asker && e && (e == asker || e->parent == asker->number);
}
/* THE KERNEL TELLS A NODE'S GOING (MESH.md 9a, ruled 2026-10-16). Every live node that has a parent, and is
* wired to it, is put a GONE about `gone` on the wire from its parent, as if its parent had sent it: so the
* node believes it, its parent being its centre (7b.4). No node hands a GONE on. A wire with no room for it
* is not waited for: that node is not told (as an answer whose way back is full, 7d.6). */
static void tell_gone(const v4_manage *m, v4_cell gone)
{
unsigned k, port;
v4_cell hd[V4_WIRE_HEADER], text[1];
for (k = 0; k < m->reg_cap; k++) {
const v4_manage_entry *c = &m->reg[k], *p;
if (c->number == 0 || c->parent == 0 || !(p = by_number(m, c->parent))) continue;
for (port = 0; port < V4_PORTS; port++) {
const v4_wire *w = &m->f->place[c->place].wire[port];
if (w->kind != V4_WIRE_NODE || w->node != p->place || !w->rx) continue;
hd[0] = c->number; hd[1] = p->number; hd[2] = V4_MSG_GONE; hd[3] = 16; hd[4] = 0; hd[5] = 0; hd[6] = 4;
text[0] = gone;
(void)v4_wire_put(w->rx, hd, text);
break;
}
}
}
/* error 12 on the node that asked: a store to NODE-ERROR raises it (D-18) */
static int refuse(v4_node *n) { v4_node_store(n, n->error_reg, 12); return 1; }
@@ -117,6 +140,7 @@ int v4_manage_serve(const v4_manage *m, unsigned place, v4_cell request)
* parent, so a node born later under it inherits nothing (the final review of step 7) */
for (k = 0; k < m->reg_cap; k++) if (m->reg[k].number != 0 && m->reg[k].parent == gone_number) m->reg[k].parent = me->number;
if (was && m->gone) m->gone(m->self, gone_place, was);
tell_gone(m, gone_number);
}
return 1;
case V4_REQ_NODE_PARITY: { /* ( place number -- ) */
+3 -4
View File
@@ -452,7 +452,6 @@ int main(void)
CHECK(strstr(tell(10, "RS1"), "UNKNOWN WORD") != NULL && strstr(tell(10, "ZERO"), "UNKNOWN WORD") != NULL, "nor anything POST's cases defined: POST leaves nothing, as in v3: \"%s\"", printed);
CHECK(load(10, "centre.4th") == 0, "she takes in what a node that births needs");
CHECK(load(10, "hera.4th") == 0, "and her own capsule, which makes it Hera");
CHECK(strcmp(tell(10, "(GONE-HOOK) @ 0= ."), "0 ") == 0, "centre.4th has put GONE-DOWN in her (GONE-HOOK)");
CHECK(strcmp(tell(10, "NODE-ME ."), "0 ") == 0 && refused == 0, "she asks where she is, by the word centre.4th made, and is answered");
CHECK(told(10, "(SEAL)"), "that is the system it comes back to");
@@ -717,9 +716,9 @@ int main(void)
CHECK(node_numbered(10)->mem[LOST] == hera_lost && node_numbered(11)->mem[LOST] == 0 && node_numbered(13)->mem[LOST] == 0 && node_numbered(14)->mem[LOST] == 0
&& waiting(10) && waiting(11) && waiting(13) && waiting(14), "nothing was let go in all of this, and all wait again: Hera %ld (%ld before)",
(long)node_numbered(10)->mem[LOST], (long)hera_lost);
/* Review Focus 4 (the final review of step 7): after UNIT-KILL no node still lists a removed node as its
* child -- the next KILL would tell it, and with no way to it that would be an error. */
CHECK(strcmp(tell(10, "20 (WHICH) ."), "-1 ") == 0, "Hera no longer lists node 20 among the nodes she birthed: \"%s\"", printed);
/* Review Focus 4 (the final review of step 7): after UNIT-KILL nothing still holds a removed node as a
* child, and the next KILL tells only the nodes there are. */
CHECK(strcmp(tell(10, "10 0 NODE-CHILD . 10 1 NODE-CHILD . 10 2 NODE-CHILD . 10 3 NODE-CHILD ."), "11 13 14 0 ") == 0, "the kernel lists only the nodes there are as Hera's: \"%s\"", printed);
CHECK(told(10, "14 KILL") && node_numbered(14) == NULL && strcmp(tell(13, "1 2 + ."), "3 ") == 0,
"and a KILL after UNIT-KILL tells only the nodes there are: it completes, and the rest go on: \"%s\"", printed);
+34
View File
@@ -4,6 +4,8 @@
* served, as the kernel does when the node writes its number to port 0. */
#include "v4/fabric.h"
#include "v4/manage.h"
#include "v4/message.h"
#include "v4/wire.h"
#include <stdio.h>
#include <string.h>
@@ -18,6 +20,7 @@ static int used[NODES];
static v4_place places[NODES];
static v4_fabric f;
static v4_manage_entry reg[NODES];
static v4_wire_queue queues[32];
static unsigned gone_count, parity_count;
static v4_cell parity_number;
static v4_manage m;
@@ -75,6 +78,7 @@ int main(void)
printf("v4 manage tests: V4_CELL_BITS=%d\n", V4_CELL_BITS);
v4_fabric_init(&f, places, NODES);
v4_fabric_queues(&f, queues, 32);
memset(&m, 0, sizeof m);
m.f = &f; m.reg = reg; m.reg_cap = NODES; m.born = born; m.gone = gone;
m.open = open_; m.cell = cell_; m.line = line_; m.parity = parity_;
@@ -163,6 +167,36 @@ int main(void)
}
CHECK(place_of(h, 12) == -1 && place_of(h, 10) == (v4_cell)h, "NODE-PLACE of a number not live is -1");
/* ---- THE KERNEL TELLS A NODE'S GOING (MESH.md 9a, ruled 2026-10-16 after the final review of step 7) ----
* When Hera kills a node, the kernel puts a GONE on the wire of every live node from its parent, as if its
* parent had sent it -- so that the node believes it, its parent being its centre -- and no node hands one
* on. Here: Hera (10) births 20 and 40; 20 births 21, wired 20:3 -- 21:2; 40 is killed. */
{
v4_cell p20, p21, p40;
v4_cell hd[V4_WIRE_HEADER];
const v4_wire_queue *q;
p20 = birth(h, 20); p40 = birth(h, 40);
p21 = birth((unsigned)p20, 21);
push(h, (v4_cell)h); push(h, 6); push(h, p20); push(h, 6);
CHECK(p20 >= 0 && p21 >= 0 && p40 >= 0 && v4_manage_serve(&m, h, V4_REQ_NODE_WIRE) == 1 && pop(h) == -1, "Hera's port 6 is wired to node 20's");
push((unsigned)p20, p20); push((unsigned)p20, 3); push((unsigned)p20, p21); push((unsigned)p20, 2);
CHECK(v4_manage_serve(&m, (unsigned)p20, V4_REQ_NODE_WIRE) == 1 && pop((unsigned)p20) == -1, "node 20's port 3 is wired to node 21's port 2");
push(h, 40);
CHECK(v4_manage_serve(&m, h, V4_REQ_NODE_KILL) == 1 && place_of(h, 40) == -1, "Hera kills 40");
q = places[p21].wire[2].rx;
CHECK(q && q->used == V4_WIRE_HEADER + 1u && q->arrived, "a message has come to node 21 on the wire from its parent: %u cells", q ? q->used : 0u);
if (q && q->used) {
v4_wire_queue copy = *q;
v4_wire_first(&copy);
CHECK(v4_wire_look(&copy, hd) == V4_WIRE_DONE && hd[0] == 21 && hd[1] == 20 && hd[2] == V4_MSG_GONE && hd[6] == 4
&& copy.cell[(copy.head + V4_WIRE_HEADER) % V4_WIRE_CELLS] == 40,
"a GONE about 40, to 21, from its parent 20: %ld %ld %ld len %ld", (long)hd[0], (long)hd[1], (long)hd[2], (long)hd[6]);
}
q = places[p20].wire[6].rx;
CHECK(q && q->used == V4_WIRE_HEADER + 1u, "and one to node 20, from Hera, on the wire from her: %u cells", q ? q->used : 0u);
CHECK(places[h].wire[6].rx == 0 || places[h].wire[6].rx->used == 0, "Hera is sent none: she has no parent, and kills");
}
printf(" %d checks, %d failures\n", checks, failures);
return failures != 0;
}