feat(core): programs' threads, and FILIUS' echo server and generic client after Java, measured against Java

Programs run as generators that yield what they wait for (threads.ts); the
engine resumes them after every event. TCP connect, send, receive, accept
and name resolution exist as such steps; the blocking calls wrap them.
EchoRun records eight stories in Java FILIUS, frames, tables and each
program's window lines; echoJava.test.ts plays them card by card. Not
taken from Java: a connection without a route hangs for ever; a server
switched off leaves its connections' last FIN unanswered.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-01 16:27:44 +00:00
co-authored by Claude Opus 5.5
parent 0abce60aef
commit de3a1d4dfe
24 changed files with 13454 additions and 28 deletions
@@ -0,0 +1,377 @@
{
"frames": {
"00000000-0000-0000-0000-000000000101": [
{
"time": 641,
"source": "02:00:00:00:01:12",
"destination": "FF:FF:FF:FF:FF:FF",
"arp": 1,
"senderIp": "192.168.0.20",
"targetIp": "192.168.0.30"
}
],
"00000000-0000-0000-0000-000000000102": [
{
"time": 519,
"source": "02:00:00:00:01:12",
"destination": "FF:FF:FF:FF:FF:FF",
"arp": 1,
"senderIp": "192.168.0.20",
"targetIp": "192.168.0.30"
},
{
"time": 755,
"source": "02:00:00:00:01:13",
"destination": "02:00:00:00:01:12",
"arp": 2,
"senderIp": "192.168.0.30",
"targetIp": "192.168.0.20"
},
{
"time": 758,
"source": "02:00:00:00:01:12",
"destination": "02:00:00:00:01:13",
"sourceIp": "192.168.0.20",
"destinationIp": "192.168.0.30",
"protocol": 6,
"sourcePort": 58845,
"destinationPort": 55555,
"payload": null,
"tcpFlags": "S",
"sequence": 2000000,
"acknowledgement": 0
}
],
"00000000-0000-0000-0000-000000000103": [
{
"time": 641,
"source": "02:00:00:00:01:12",
"destination": "FF:FF:FF:FF:FF:FF",
"arp": 1,
"senderIp": "192.168.0.20",
"targetIp": "192.168.0.30"
},
{
"time": 643,
"source": "02:00:00:00:01:13",
"destination": "02:00:00:00:01:12",
"arp": 2,
"senderIp": "192.168.0.30",
"targetIp": "192.168.0.20"
},
{
"time": 871,
"source": "02:00:00:00:01:12",
"destination": "02:00:00:00:01:13",
"sourceIp": "192.168.0.20",
"destinationIp": "192.168.0.30",
"protocol": 6,
"sourcePort": 58845,
"destinationPort": 55555,
"payload": null,
"tcpFlags": "S",
"sequence": 2000000,
"acknowledgement": 0
}
]
},
"rows": {
"00000000-0000-0000-0000-000000000101": [
[
"1",
"02:00:00:00:01:12",
"FF:FF:FF:FF:FF:FF",
"",
"Netzzugang",
"0x806"
],
[
"1",
"192.168.0.20",
"192.168.0.30",
"ARP",
"Vermittlung",
"Suche nach MAC für 192.168.0.30 [op=REQUEST, sender=02:00:00:00:01:12|192.168.0.20, target=FF:FF:FF:FF:FF:FF|192.168.0.30]"
]
],
"00000000-0000-0000-0000-000000000102": [
[
"1",
"02:00:00:00:01:12",
"FF:FF:FF:FF:FF:FF",
"",
"Netzzugang",
"0x806"
],
[
"1",
"192.168.0.20",
"192.168.0.30",
"ARP",
"Vermittlung",
"Suche nach MAC für 192.168.0.30 [op=REQUEST, sender=02:00:00:00:01:12|192.168.0.20, target=FF:FF:FF:FF:FF:FF|192.168.0.30]"
],
[
"2",
"02:00:00:00:01:13",
"02:00:00:00:01:12",
"",
"Netzzugang",
"0x806"
],
[
"2",
"192.168.0.30",
"192.168.0.20",
"ARP",
"Vermittlung",
"MAC ist 02:00:00:00:01:13 [op=REPLY, sender=02:00:00:00:01:13|192.168.0.30, target=02:00:00:00:01:12|192.168.0.20]"
],
[
"3",
"02:00:00:00:01:12",
"02:00:00:00:01:13",
"",
"Netzzugang",
"0x800"
],
[
"3",
"192.168.0.20",
"192.168.0.30",
"IP",
"Vermittlung",
"Protokoll: 6, TTL: 64"
],
[
"3",
"192.168.0.20:58845",
"192.168.0.30:55555",
"TCP",
"Transport",
"SYN, SEQ: 2.000.000"
]
],
"00000000-0000-0000-0000-000000000103": [
[
"1",
"02:00:00:00:01:12",
"FF:FF:FF:FF:FF:FF",
"",
"Netzzugang",
"0x806"
],
[
"1",
"192.168.0.20",
"192.168.0.30",
"ARP",
"Vermittlung",
"Suche nach MAC für 192.168.0.30 [op=REQUEST, sender=02:00:00:00:01:12|192.168.0.20, target=FF:FF:FF:FF:FF:FF|192.168.0.30]"
],
[
"2",
"02:00:00:00:01:13",
"02:00:00:00:01:12",
"",
"Netzzugang",
"0x806"
],
[
"2",
"192.168.0.30",
"192.168.0.20",
"ARP",
"Vermittlung",
"MAC ist 02:00:00:00:01:13 [op=REPLY, sender=02:00:00:00:01:13|192.168.0.30, target=02:00:00:00:01:12|192.168.0.20]"
],
[
"3",
"02:00:00:00:01:12",
"02:00:00:00:01:13",
"",
"Netzzugang",
"0x800"
],
[
"3",
"192.168.0.20",
"192.168.0.30",
"IP",
"Vermittlung",
"Protokoll: 6, TTL: 64"
],
[
"3",
"192.168.0.20:58845",
"192.168.0.30:55555",
"TCP",
"Transport",
"SYN, SEQ: 2.000.000"
]
]
},
"layeredRows": {
"00000000-0000-0000-0000-000000000101": [
[
"1",
"02:00:00:00:01:12",
"FF:FF:FF:FF:FF:FF",
"",
"Netzzugang",
"0x806"
],
[
"1",
"192.168.0.20",
"192.168.0.30",
"ARP",
"Vermittlung",
"Suche nach MAC für 192.168.0.30 [op=REQUEST, sender=02:00:00:00:01:12|192.168.0.20, target=FF:FF:FF:FF:FF:FF|192.168.0.30]"
]
],
"00000000-0000-0000-0000-000000000102": [
[
"1",
"02:00:00:00:01:12",
"FF:FF:FF:FF:FF:FF",
"",
"Netzzugang",
"0x806"
],
[
"1",
"192.168.0.20",
"192.168.0.30",
"ARP",
"Vermittlung",
"Suche nach MAC für 192.168.0.30 [op=REQUEST, sender=02:00:00:00:01:12|192.168.0.20, target=FF:FF:FF:FF:FF:FF|192.168.0.30]"
],
[
"2",
"02:00:00:00:01:13",
"02:00:00:00:01:12",
"",
"Netzzugang",
"0x806"
],
[
"2",
"192.168.0.30",
"192.168.0.20",
"ARP",
"Vermittlung",
"MAC ist 02:00:00:00:01:13 [op=REPLY, sender=02:00:00:00:01:13|192.168.0.30, target=02:00:00:00:01:12|192.168.0.20]"
],
[
"3",
"02:00:00:00:01:12",
"02:00:00:00:01:13",
"",
"Netzzugang",
"0x800"
],
[
"3",
"192.168.0.20",
"192.168.0.30",
"IP",
"Vermittlung",
"Protokoll: 6, TTL: 64"
],
[
"3",
"58845",
"55555",
"TCP",
"Transport",
"SYN, SEQ: 2.000.000"
]
],
"00000000-0000-0000-0000-000000000103": [
[
"1",
"02:00:00:00:01:12",
"FF:FF:FF:FF:FF:FF",
"",
"Netzzugang",
"0x806"
],
[
"1",
"192.168.0.20",
"192.168.0.30",
"ARP",
"Vermittlung",
"Suche nach MAC für 192.168.0.30 [op=REQUEST, sender=02:00:00:00:01:12|192.168.0.20, target=FF:FF:FF:FF:FF:FF|192.168.0.30]"
],
[
"2",
"02:00:00:00:01:13",
"02:00:00:00:01:12",
"",
"Netzzugang",
"0x806"
],
[
"2",
"192.168.0.30",
"192.168.0.20",
"ARP",
"Vermittlung",
"MAC ist 02:00:00:00:01:13 [op=REPLY, sender=02:00:00:00:01:13|192.168.0.30, target=02:00:00:00:01:12|192.168.0.20]"
],
[
"3",
"02:00:00:00:01:12",
"02:00:00:00:01:13",
"",
"Netzzugang",
"0x800"
],
[
"3",
"192.168.0.20",
"192.168.0.30",
"IP",
"Vermittlung",
"Protokoll: 6, TTL: 64"
],
[
"3",
"58845",
"55555",
"TCP",
"Transport",
"SYN, SEQ: 2.000.000"
]
]
},
"events": [
[
211,
"server",
"null"
],
[
212,
"client",
"null"
],
[
213,
"other",
"null"
],
[
500,
"client",
"call verbinden 192.168.0.30:55555"
],
[
8810,
"client",
"Fehler beim Verbindungsaufbau\nZeitüberschreitung beim Verbindungsaufbau"
]
]
}