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"
]
]
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,39 @@
{
"frames": {
"00000000-0000-0000-0000-000000000101": [],
"00000000-0000-0000-0000-000000000102": [],
"00000000-0000-0000-0000-000000000103": []
},
"rows": {
"00000000-0000-0000-0000-000000000101": [],
"00000000-0000-0000-0000-000000000102": [],
"00000000-0000-0000-0000-000000000103": []
},
"layeredRows": {
"00000000-0000-0000-0000-000000000101": [],
"00000000-0000-0000-0000-000000000102": [],
"00000000-0000-0000-0000-000000000103": []
},
"events": [
[
210,
"server",
"null"
],
[
211,
"client",
"null"
],
[
211,
"other",
"null"
],
[
501,
"client",
"call verbinden 10.0.0.1:55555"
]
]
}
@@ -0,0 +1,49 @@
{
"frames": {
"00000000-0000-0000-0000-000000000101": [],
"00000000-0000-0000-0000-000000000102": [],
"00000000-0000-0000-0000-000000000103": []
},
"rows": {
"00000000-0000-0000-0000-000000000101": [],
"00000000-0000-0000-0000-000000000102": [],
"00000000-0000-0000-0000-000000000103": []
},
"layeredRows": {
"00000000-0000-0000-0000-000000000101": [],
"00000000-0000-0000-0000-000000000102": [],
"00000000-0000-0000-0000-000000000103": []
},
"events": [
[
208,
"server",
"null"
],
[
209,
"client",
"null"
],
[
210,
"other",
"null"
],
[
500,
"client",
"call senden Hallo"
],
[
500,
"client",
"Fehler beim Verbindungsaufbau"
],
[
500,
"client",
"returned senden"
]
]
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff