code wiki / _hdl_build / nx_netsync_gate.nx
nx_netsync_gate.nx source
↩ module page · 483 lines · 20109 B
1// nx_netsync_gate.nx -- CERTIFICATION of nx_netsync (gamebench gap-queue rank 1: networking-multiplayer).
2// The existing nx_lockstep/nx_rollback gates prove netcode mechanisms on a TOY stepper; this gate proves
3// the same laws hold when the simulation is the REAL certified world (nx_worldsim) and the snapshots are
4// REAL save files (nx_gamesave) -- the composition the capability actually demands.
5// T1 LOCKSTEP DETERMINISM -- two peers, same commands, different within-tick arrival order,
6// 200 ticks -> checksums equal EVERY tick and shared state word-exact
7// T2 STALL-NOT-GUESS -- missing one peer's input for a tick freezes the session (no advance, no state
8// change) until it arrives; advancing on partial input is THE lockstep desync bug
9// T3 ARRIVAL-CHAOS IMMUNE -- the full 400-command schedule delivered in a shuffled order with
10// duplicates -> final state EXACTLY equals the in-order run; a conflicting resend is REFUSED
11// T4 DESYNC LOCALIZED -- a 1-unit wealth mint injected into one peer at tick 120 is first visible in
12// the checksum stream AT tick 120 (never earlier, never missed)
13// T5 ROLLBACK ON THE REAL SIM -- speculative head with predicted inputs diverges when the prediction
14// was wrong; discard + resim from the confirmed state converges bit-exact to ground truth; a
15// CORRECT prediction triggers no divergence (no false rollback)
16// T6 LATE-JOIN VIA nx_gamesave -- a peer that loads a mid-session snapshot file into a ZEROED arena
17// tracks the original checksum-for-checksum to the end (GX-9 transparency)
18// T7 BOUNDED + LOUD -- out-of-range tick/peer and conflicting input each refuse with a DISTINCT code
19// and change nothing
20// T8 ANTI-VACUITY -- the session actually traded and grew (a frozen or all-no-op world would pass
21// T1-T3 while proving nothing)
22// T9 ARTIFACT -- the final session round-trips through a real save file and RESUMES identically;
23// knowledge/nx_netsync_session.sav is the board evidence
24// license_tier: ORIGINAL expect_exit: 0
25import "nx_syscalls.nx"
26import "nx_netsync.nx"
27import "nx_gamesave.nx"
28import "nx_net_chan.nx"
29const K_MAGIC_25214903917: i64 = 25214903917
30const K_MAGIC_2654435761: i64 = 2654435761
31const K_MAGIC_100000000: i64 = 100000000
32const K_MAGIC_1000000: i64 = 1000000
33const K_MAGIC_4242: i64 = 4242
34const K_MAGIC_20260730: i64 = 20260730
35const K_MAGIC_60621: i64 = 60621
36const K_MAGIC_1785425000: i64 = 1785425000
37const K_MAGIC_9750: i64 = 9750
38const K_MAGIC_60620: i64 = 60620
39const K_MAGIC_38921: i64 = 38921
40const K_MAGIC_31337: i64 = 31337
41
42func pw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
43func pn(v: i64) -> i64 {
44 if v==0 { sys_write(1,"0" as *u8,1); return 0 }
45 var m: i64=v; if m<0 { sys_write(1,"-" as *u8,1); m=0-m }
46 let t: *u8=sys_mmap(32); var k: i64=0
47 while m>0 { t[k]=(48+(m%10)) as u8; m=m/10; k=k+1 }
48 let o: *u8=sys_mmap(32); var q: i64=k-1; var i: i64=0
49 while q>=0 { o[i]=t[q]; i=i+1; q=q-1 }
50 sys_write(1,o,i); return 0
51}
52func lcg(s: *i64) -> i64 { s[0] = ((s[0]*K_MAGIC_25214903917)+11) & 0x7FFFFFFFFFFF; return s[0] }
53
54// the deterministic command schedule -- a pure function of (tick,peer), so every session in this gate
55// independently derives the same "player decisions". ~3/4 of commands are real trade orders.
56func cmd_for(t: i64, p: i64) -> i64 {
57 var x: i64 = t*31 + p*17 + 7
58 x = (x * K_MAGIC_2654435761) & 0x7FFFFFFFFFFFFFFF
59 if x % 4 == 0 { return 0 }
60 let from: i64 = x % 6
61 var to: i64 = (x / 7) % 6
62 if to == from { to = (to + 1) % 6 }
63 let amt: i64 = 100 + ((x / 49) % 300)
64 return from*K_MAGIC_100000000 + to*K_MAGIC_1000000 + amt
65}
66
67const GMAXT: i64 = 300
68const GNFAC: i64 = 6
69// 2 peers, 300 tick capacity, 6 factions
70func mksess(a: *i64, self_id: i64, seed: i64) -> i64 {
71 ns_init(a, 2, self_id, GMAXT, GNFAC, seed)
72 let w: *i64 = ns_world(a)
73 var i: i64 = 0
74 while i < GNFAC {
75 ws_set_res(w, i, 1000 + i*250)
76 ws_set_pop(w, i, 500 + i*100)
77 ws_set_terr(w, i, 3 + i)
78 i = i + 1
79 }
80 return 0
81}
82
83func main() -> i64 {
84 pw("=== nx_netsync_gate: is multiplayer netcode safe to build on the certified parts? ===\n\n")
85 var pass: i64 = 0
86 var checks: i64 = 0
87 let W: i64 = ns_words(2, GMAXT, GNFAC)
88 let AP: *u8 = "knowledge/nx_netsync_session.sav" as *u8
89 let JP: *u8 = "knowledge/nx_netsync_join.sav" as *u8
90 // start clean -- both artifacts must be REGENERATED by this run
91 sys_unlinkat(AP)
92 sys_unlinkat(JP)
93
94 // ---------- T1 lockstep determinism on the real sim ----------
95 checks = checks + 1
96 let A: *i64 = sys_mmap(W*8) as *i64
97 let B: *i64 = sys_mmap(W*8) as *i64
98 mksess(A, 0, K_MAGIC_4242)
99 mksess(B, 1, K_MAGIC_4242)
100 var ckok: i64 = 1
101 var t: i64 = 0
102 while t < 200 {
103 ns_offer(A, t, 0, cmd_for(t,0)); ns_offer(A, t, 1, cmd_for(t,1))
104 ns_offer(B, t, 1, cmd_for(t,1)); ns_offer(B, t, 0, cmd_for(t,0))
105 ns_step(A, 4); ns_step(B, 4)
106 if ns_checksum(A) != ns_checksum(B) { ckok = 0 }
107 t = t + 1
108 }
109 var t1: i64 = 0
110 if ckok==1 { if ns_shared_eq(A,B)==1 { if ns_tick(A)==200 { t1=1 } } }
111 if t1==1 {
112 pw("T1 GREEN lockstep deterministic: 2 peers, 200 ticks, different arrival order -> checksum equal every tick, shared state word-exact (ck=")
113 pn(ns_checksum(A)); pw(")\n"); pass=pass+1
114 } else { pw("T1 RED peers diverged: ckok="); pn(ckok); pw(" tick="); pn(ns_tick(A)); pw("\n") }
115
116 // ---------- T2 stall-not-guess ----------
117 checks = checks + 1
118 let S: *i64 = sys_mmap(W*8) as *i64
119 mksess(S, 0, 777)
120 t = 0
121 while t < 50 {
122 ns_offer(S, t, 0, cmd_for(t,0)); ns_offer(S, t, 1, cmd_for(t,1))
123 t = t + 1
124 }
125 ns_offer(S, 50, 0, cmd_for(50,0))
126 while ns_step(S, 4)==1 {}
127 let stick: i64 = ns_tick(S)
128 let sck: i64 = ns_checksum(S)
129 let z1: i64 = ns_step(S, 4)
130 let z2: i64 = ns_step(S, 4)
131 var t2: i64 = 0
132 if stick==50 { if z1==0 { if z2==0 { if ns_checksum(S)==sck {
133 ns_offer(S, 50, 1, cmd_for(50,1))
134 if ns_step(S, 4)==1 { if ns_tick(S)==51 { t2=1 } }
135 } } } }
136 if t2==1 {
137 pw("T2 GREEN stalls-not-guesses: missing peer-1 input froze tick at 50 (2 step attempts, state untouched); arrival unfroze to 51\n")
138 pass=pass+1
139 } else { pw("T2 RED advanced on partial input: tick="); pn(stick); pw("\n") }
140
141 // ---------- T3 arrival-chaos immune ----------
142 checks = checks + 1
143 let list: *i64 = sys_mmap(400*8) as *i64
144 var i: i64 = 0
145 while i < 400 { list[i]=i; i=i+1 }
146 let rs: *i64 = sys_mmap(8) as *i64
147 rs[0] = K_MAGIC_20260730
148 i = 399
149 while i > 0 {
150 let j: i64 = lcg(rs) % (i+1)
151 let tmp: i64 = list[i]; list[i]=list[j]; list[j]=tmp
152 i = i - 1
153 }
154 let C: *i64 = sys_mmap(W*8) as *i64
155 mksess(C, 0, K_MAGIC_4242)
156 var acc: i64 = 0
157 var dup: i64 = 0
158 i = 0
159 while i < 400 {
160 let k: i64 = list[i]
161 let kt: i64 = k / 2
162 let kp: i64 = k % 2
163 let rc: i64 = ns_offer(C, kt, kp, cmd_for(kt,kp))
164 if rc==1 { acc = acc + 1 }
165 if i % 8 == 0 {
166 let rc2: i64 = ns_offer(C, kt, kp, cmd_for(kt,kp))
167 if rc2==0 { dup = dup + 1 }
168 }
169 while ns_step(C, 4)==1 {}
170 i = i + 1
171 }
172 let ck3: i64 = ns_checksum(C)
173 let rcx: i64 = ns_offer(C, 10, 0, cmd_for(10,0)+1)
174 var t3: i64 = 0
175 if ns_tick(C)==200 { if ns_shared_eq(C,A)==1 { if acc==400 { if dup==50 {
176 if rcx==NS_E_CONFLICT { if ns_checksum(C)==ck3 { t3=1 } } } } } }
177 if t3==1 {
178 pw("T3 GREEN chaos immune: 400 commands shuffled + 50 duplicates -> identical to in-order run; conflicting resend REFUSED, state untouched\n")
179 pass=pass+1
180 } else {
181 pw("T3 RED chaos diverged: tick="); pn(ns_tick(C)); pw(" eq="); pn(ns_shared_eq(C,A))
182 pw(" acc="); pn(acc); pw(" dup="); pn(dup); pw(" rcx="); pn(rcx); pw("\n")
183 }
184
185 // ---------- T4 desync localized to the exact tick ----------
186 checks = checks + 1
187 let A2: *i64 = sys_mmap(W*8) as *i64
188 let B2: *i64 = sys_mmap(W*8) as *i64
189 mksess(A2, 0, 999)
190 mksess(B2, 1, 999)
191 var first_diff: i64 = 0-1
192 t = 0
193 while t < 200 {
194 if t==120 {
195 let wc: *i64 = ns_world(B2)
196 wc[ws_o_res(wc)+0] = wc[ws_o_res(wc)+0] + 1
197 }
198 ns_offer(A2, t, 0, cmd_for(t,0)); ns_offer(A2, t, 1, cmd_for(t,1))
199 ns_offer(B2, t, 0, cmd_for(t,0)); ns_offer(B2, t, 1, cmd_for(t,1))
200 ns_step(A2, 4); ns_step(B2, 4)
201 if ns_checksum(A2) != ns_checksum(B2) { if first_diff < 0 { first_diff = t } }
202 t = t + 1
203 }
204 let mint: i64 = ws_total_res(ns_world(B2)) - ws_total_res(ns_world(A2))
205 var t4: i64 = 0
206 if first_diff==120 { if mint==1 { t4=1 } }
207 if t4==1 {
208 pw("T4 GREEN desync localized: 1-unit mint at tick 120 first flagged AT tick 120 (0 false positives before), audit shows exactly +"); pn(mint); pw(" phantom unit\n")
209 pass=pass+1
210 } else { pw("T4 RED first_diff="); pn(first_diff); pw(" mint="); pn(mint); pw("\n") }
211
212 // ---------- T5 rollback on the real sim ----------
213 checks = checks + 1
214 var TK: i64 = 250
215 while cmd_for(TK,1)==0 { TK = TK + 1 }
216 let GT: *i64 = sys_mmap(W*8) as *i64
217 mksess(GT, 0, 555)
218 t = 0
219 while t < TK+3 {
220 ns_offer(GT, t, 0, cmd_for(t,0)); ns_offer(GT, t, 1, cmd_for(t,1))
221 ns_step(GT, 4)
222 t = t + 1
223 }
224 let P: *i64 = sys_mmap(W*8) as *i64
225 mksess(P, 0, 555)
226 t = 0
227 while t < TK {
228 ns_offer(P, t, 0, cmd_for(t,0)); ns_offer(P, t, 1, cmd_for(t,1))
229 ns_step(P, 4)
230 t = t + 1
231 }
232 let H: *i64 = sys_mmap(W*8) as *i64
233 ns_copy(H, P, W)
234 t = TK
235 while t < TK+3 {
236 ns_offer(H, t, 0, cmd_for(t,0))
237 ns_offer(H, t, 1, 0)
238 ns_step(H, 4)
239 t = t + 1
240 }
241 var mispred: i64 = 0
242 if cmd_for(TK,1) != 0 { mispred = 1 }
243 var hdiv: i64 = 0
244 if ns_shared_eq(H, GT)==0 { hdiv = 1 }
245 t = TK
246 while t < TK+3 {
247 ns_offer(P, t, 0, cmd_for(t,0)); ns_offer(P, t, 1, cmd_for(t,1))
248 ns_step(P, 4)
249 t = t + 1
250 }
251 let conv: i64 = ns_shared_eq(P, GT)
252 var TK2: i64 = 250
253 while cmd_for(TK2,1)!=0 { TK2 = TK2 + 1 }
254 let G2: *i64 = sys_mmap(W*8) as *i64
255 mksess(G2, 0, 555)
256 t = 0
257 while t < TK2 {
258 ns_offer(G2, t, 0, cmd_for(t,0)); ns_offer(G2, t, 1, cmd_for(t,1))
259 ns_step(G2, 4)
260 t = t + 1
261 }
262 let H2: *i64 = sys_mmap(W*8) as *i64
263 ns_copy(H2, G2, W)
264 ns_offer(H2, TK2, 0, cmd_for(TK2,0)); ns_offer(H2, TK2, 1, 0)
265 ns_step(H2, 4)
266 ns_offer(G2, TK2, 0, cmd_for(TK2,0)); ns_offer(G2, TK2, 1, cmd_for(TK2,1))
267 ns_step(G2, 4)
268 let nofalse: i64 = ns_shared_eq(H2, G2)
269 var t5: i64 = 0
270 if mispred==1 { if hdiv==1 { if conv==1 { if nofalse==1 { t5=1 } } } }
271 if t5==1 {
272 pw("T5 GREEN rollback converges: wrong prediction at tick "); pn(TK)
273 pw(" diverged the speculative head; resim from confirmed state == ground truth bit-exact; correct prediction (tick ")
274 pn(TK2); pw(") rolled nothing back\n"); pass=pass+1
275 } else {
276 pw("T5 RED mispred="); pn(mispred); pw(" hdiv="); pn(hdiv); pw(" conv="); pn(conv)
277 pw(" nofalse="); pn(nofalse); pw("\n")
278 }
279
280 // ---------- T6 late-join via nx_gamesave ----------
281 checks = checks + 1
282 let A3: *i64 = sys_mmap(W*8) as *i64
283 mksess(A3, 0, 888)
284 t = 0
285 while t < 150 {
286 ns_offer(A3, t, 0, cmd_for(t,0)); ns_offer(A3, t, 1, cmd_for(t,1))
287 ns_step(A3, 4)
288 t = t + 1
289 }
290 let jw: i64 = gs_save(JP, K_MAGIC_60621, A3, W, K_MAGIC_1785425000)
291 let C3: *i64 = sys_mmap(W*8) as *i64
292 let jr: i64 = gs_load(JP, C3, W, 0 as *i64)
293 C3[1] = 1
294 var jok: i64 = 1
295 t = 150
296 while t < 200 {
297 ns_offer(A3, t, 0, cmd_for(t,0)); ns_offer(A3, t, 1, cmd_for(t,1))
298 ns_offer(C3, t, 0, cmd_for(t,0)); ns_offer(C3, t, 1, cmd_for(t,1))
299 ns_step(A3, 4); ns_step(C3, 4)
300 if ns_checksum(A3) != ns_checksum(C3) { jok = 0 }
301 t = t + 1
302 }
303 var t6: i64 = 0
304 if jw > 0 { if jr==W { if jok==1 { if ns_shared_eq(A3,C3)==1 { if ns_tick(C3)==200 { t6=1 } } } } }
305 if t6==1 {
306 pw("T6 GREEN late-join: peer loaded the tick-150 snapshot file ("); pn(jw)
307 pw("B) into a ZEROED arena and tracked the host checksum-for-checksum to tick 200\n"); pass=pass+1
308 } else { pw("T6 RED jw="); pn(jw); pw(" jr="); pn(jr); pw(" jok="); pn(jok); pw("\n") }
309
310 // ---------- T7 bounded + loud ----------
311 checks = checks + 1
312 let S7: *i64 = sys_mmap(W*8) as *i64
313 mksess(S7, 0, 111)
314 let ckb: i64 = ns_checksum(S7)
315 let r1: i64 = ns_offer(S7, 0-1, 0, 5)
316 let r2: i64 = ns_offer(S7, GMAXT, 0, 5)
317 let r3: i64 = ns_offer(S7, 5, 2, 5)
318 ns_offer(S7, 5, 0, 7)
319 let r4: i64 = ns_offer(S7, 5, 0, 8)
320 let r5: i64 = ns_offer(S7, 5, 0, 7)
321 var t7: i64 = 0
322 if r1==NS_E_TICK { if r2==NS_E_TICK { if r3==NS_E_PEER { if r4==NS_E_CONFLICT { if r5==NS_DUP {
323 if ns_checksum(S7)==ckb { t7=1 } } } } } }
324 if t7==1 {
325 pw("T7 GREEN bounded+loud: tick/peer/conflict refusals distinct ("); pn(r1); pw("/"); pn(r3)
326 pw("/"); pn(r4); pw("), duplicate idempotent ("); pn(r5); pw("), shared state untouched\n"); pass=pass+1
327 } else {
328 pw("T7 RED codes r1="); pn(r1); pw(" r2="); pn(r2); pw(" r3="); pn(r3)
329 pw(" r4="); pn(r4); pw(" r5="); pn(r5); pw("\n")
330 }
331
332 // ---------- T8 anti-vacuity ----------
333 checks = checks + 1
334 var sched_nz: i64 = 0
335 t = 0
336 while t < 200 {
337 if cmd_for(t,0)!=0 { sched_nz = sched_nz + 1 }
338 if cmd_for(t,1)!=0 { sched_nz = sched_nz + 1 }
339 t = t + 1
340 }
341 let wA: *i64 = ns_world(A)
342 var relmoved: i64 = 0
343 i = 0
344 while i < GNFAC {
345 var jj: i64 = i+1
346 while jj < GNFAC {
347 if ws_rel(wA, i, jj) != 0 { relmoved = 1 }
348 jj = jj + 1
349 }
350 i = i + 1
351 }
352 var t8: i64 = 0
353 if ns_applied(A) >= 50 { if ns_moved(A) > 0 { if ws_total_res(wA) > K_MAGIC_9750 {
354 if relmoved==1 { if sched_nz >= 100 { t8=1 } } } } }
355 if t8==1 {
356 pw("T8 GREEN anti-vacuity: "); pn(ns_applied(A)); pw(" trades moved "); pn(ns_moved(A))
357 pw(" units over "); pn(sched_nz); pw(" real commands; wealth 9750 -> "); pn(ws_total_res(wA))
358 pw("; relations moved -- the session actually simulates\n"); pass=pass+1
359 } else {
360 pw("T8 RED applied="); pn(ns_applied(A)); pw(" moved="); pn(ns_moved(A))
361 pw(" total="); pn(ws_total_res(wA)); pw(" relmoved="); pn(relmoved); pw("\n")
362 }
363
364 // ---------- T9 artifact round-trip + resume ----------
365 checks = checks + 1
366 let aw: i64 = gs_save(AP, K_MAGIC_60620, A, W, K_MAGIC_1785425000)
367 let RD: *i64 = sys_mmap(W*8) as *i64
368 let ar: i64 = gs_load(AP, RD, W, 0 as *i64)
369 var exact: i64 = 1
370 i = 0
371 while i < W { if RD[i]!=A[i] { exact=0 } i=i+1 }
372 var t9: i64 = 0
373 if aw > 0 { if ar==W { if exact==1 {
374 ns_offer(A, 200, 0, cmd_for(200,0)); ns_offer(A, 200, 1, cmd_for(200,1))
375 ns_offer(RD, 200, 0, cmd_for(200,0)); ns_offer(RD, 200, 1, cmd_for(200,1))
376 ns_step(A, 4); ns_step(RD, 4)
377 if ns_shared_eq(A, RD)==1 { t9=1 }
378 } } }
379 if t9==1 {
380 pw("T9 GREEN artifact: "); pn(W); pw("-word session ("); pn(aw)
381 pw("B) round-tripped through knowledge/nx_netsync_session.sav word-exact AND resumed stepping identically\n")
382 pass=pass+1
383 } else { pw("T9 RED aw="); pn(aw); pw(" ar="); pn(ar); pw(" exact="); pn(exact); pw("\n") }
384
385 // ---------- T10 REAL-SOCKET TRANSPORT (closes the declared residual) ----------
386 // Two PROCESSES, one per peer, exchange commands over a REAL loopback TCP socket using the
387 // nx_net_chan 8-byte big-endian frame protocol -- the wire is the kernel's, not a model.
388 // Property: sessions converge tick-for-tick across the socket; final checksums exchanged OVER
389 // THE WIRE must match and the child must exit clean. A bind failure (port squat) FAILS LOUD
390 // rather than skipping -- the throwaway-port lesson: a tooth must verify its own listener.
391 checks = checks + 1
392 var t10: i64 = 0
393 let NSPORT: i64 = K_MAGIC_38921
394 let lfd: i64 = nx_sock_socket(NX_AF_INET, NX_SOCK_STREAM, NX_IPPROTO_TCP)
395 var bok: i64 = 0
396 if lfd >= 0 {
397 nx_sock_reuseaddr(lfd)
398 let sa: *u8 = sys_mmap(16)
399 nx_sock_sin_init(sa, 0x0100007F, NSPORT)
400 if nx_sock_bind(lfd, sa, 16) >= 0 { if nx_sock_listen(lfd, 1) >= 0 { bok = 1 } }
401 }
402 if bok == 0 {
403 pw("T10 RED cannot bind loopback port 38921 (squatter or perm) -- refusing to skip\n")
404 }
405 if bok == 1 {
406 let pid: i64 = sys_fork()
407 if pid == 0 {
408 let cfd: i64 = nx_sock_socket(NX_AF_INET, NX_SOCK_STREAM, NX_IPPROTO_TCP)
409 let ca: *u8 = sys_mmap(16)
410 nx_sock_sin_init(ca, 0x0100007F, NSPORT)
411 if cfd < 0 { sys_exit(9) }
412 if nx_sock_connect(cfd, ca, 16) < 0 { sys_exit(9) }
413 let nc: *NxNetChan = nx_net_chan_from_fd(cfd)
414 let SC: *i64 = sys_mmap(W*8) as *i64
415 mksess(SC, 1, K_MAGIC_31337)
416 let rvp: *i64 = sys_mmap(16) as *i64
417 var tt: i64 = 0
418 var bad: i64 = 0
419 while tt < 120 {
420 if nx_net_chan_send(nc, cmd_for(tt,1)) != 0 { bad = 1 }
421 if bad == 0 { if nx_net_chan_recv(nc, rvp) != 0 { bad = 1 } }
422 if bad == 0 {
423 ns_offer(SC, tt, 1, cmd_for(tt,1))
424 ns_offer(SC, tt, 0, rvp[0])
425 ns_step(SC, 4)
426 }
427 tt = tt + 1
428 }
429 if bad == 1 { sys_exit(8) }
430 let myck: i64 = ns_checksum(SC)
431 if nx_net_chan_send(nc, myck) != 0 { sys_exit(8) }
432 if nx_net_chan_recv(nc, rvp) != 0 { sys_exit(8) }
433 if rvp[0] != myck { sys_exit(7) }
434 sys_exit(0)
435 }
436 let afd: i64 = nx_sock_accept(lfd, 0 as *u8, 0 as *i64)
437 var pok: i64 = 1
438 if afd < 0 { pok = 0 }
439 var pck: i64 = 0
440 var rck: i64 = 0
441 let SP: *i64 = sys_mmap(W*8) as *i64
442 if pok == 1 {
443 let np: *NxNetChan = nx_net_chan_from_fd(afd)
444 mksess(SP, 0, K_MAGIC_31337)
445 let rp: *i64 = sys_mmap(16) as *i64
446 var tp: i64 = 0
447 while tp < 120 {
448 if nx_net_chan_send(np, cmd_for(tp,0)) != 0 { pok = 0 }
449 if pok == 1 { if nx_net_chan_recv(np, rp) != 0 { pok = 0 } }
450 if pok == 1 {
451 ns_offer(SP, tp, 0, cmd_for(tp,0))
452 ns_offer(SP, tp, 1, rp[0])
453 ns_step(SP, 4)
454 }
455 tp = tp + 1
456 }
457 pck = ns_checksum(SP)
458 if pok == 1 { if nx_net_chan_recv(np, rp) != 0 { pok = 0 } }
459 if pok == 1 { rck = rp[0] }
460 nx_net_chan_send(np, pck)
461 }
462 let stp: *i64 = sys_mmap(16) as *i64
463 stp[0] = 0
464 sys_wait4(pid, stp, 0)
465 let cexit: i64 = (stp[0] >> 8) & 255
466 if pok == 1 { if cexit == 0 { if rck == pck { if ns_tick(SP) == 120 { if ns_applied(SP) > 0 {
467 t10 = 1
468 } } } } }
469 if t10 == 1 {
470 pw("T10 GREEN real-socket transport: 2 processes, 120 ticks over loopback TCP (nx_net_chan 8B-BE frames), checksums exchanged OVER THE WIRE match (ck=")
471 pn(pck); pw("), child exit 0 -- the residual is closed by execution, not declaration\n")
472 pass = pass + 1
473 } else {
474 pw("T10 RED socket lockstep failed: pok="); pn(pok); pw(" child-exit="); pn(cexit)
475 pw(" pck="); pn(pck); pw(" rck="); pn(rck); pw(" tick="); pn(ns_tick(SP)); pw("\n")
476 }
477 }
478
479 pw("\n=== nx_netsync_gate "); pn(pass); pw("/"); pn(checks)
480 if pass == checks { pw(" verdict=GREEN ===\n"); return 0 }
481 pw(" RED ===\n")
482 return 1
483}