code wiki / _hdl_build / nx_apistack_trace_gate.nx

nx_apistack_trace_gate.nx source

↩ module page · 48 lines · 2840 B

1// nx_apistack_trace_gate.nx -- hermetic gate for CAP-API-TRACE. Proves the W3C traceparent is well-formed, the right 2// length, deterministic for a seed, and distinct across seeds. Sovereign: nx_syscalls + nx_apistack_trace. expect_exit: 0 3import "nx_syscalls.nx" 4import "nx_apistack_trace.nx" 5import "nx_gate_verdict.nx" 6 7func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 8func gn(v: i64) -> i64 { var t: i64=v; if t<0{sys_write(1,"-" as *u8,1);t=0-t} let tm:*u8=sys_mmap(24); var k:i64=0; if t==0{tm[0]=48 as u8;k=1} while t>0{tm[k]=(48+(t%10)) as u8;t=t/10;k=k+1} let b:*u8=sys_mmap(24); var j:i64=0; while j<k{b[j]=tm[k-1-j];j=j+1} sys_write(1,b,k); return 0 } 9func g_eq(a: *u8, b: *u8, n: i64) -> i64 { var i: i64=0; while i<n { if a[i]!=b[i] { return 0 } i=i+1 } return 1 } 10 11func main(argc: i64, argv: *i64) -> i64 { 12 gp("=== nx_apistack_trace_gate (deterministic W3C traceparent) ===\n" as *u8) 13 var pass: i64 = 0; var fail: i64 = 0 14 let o1: *u8 = sys_mmap(128); let n1: i64 = tr_traceparent(o1, 42) 15 gp(" TRACEPARENT: " as *u8); sys_write(1, o1, n1); gp("\n" as *u8) 16 17 // T1 length 55 18 if n1 == 55 { pass=pass+1; gp(" T1 length 55 PASS\n" as *u8) } else { fail=fail+1; gp(" T1 FAIL len=" as *u8); gn(n1); gp("\n" as *u8) } 19 20 // T2 well-formed: 00- prefix, dashes at 2/35/52, 01 suffix 21 var wf: i64 = 1 22 if o1[0]!=(48 as u8) { wf=0 } 23 if o1[1]!=(48 as u8) { wf=0 } 24 if o1[2]!=(45 as u8) { wf=0 } 25 if o1[35]!=(45 as u8) { wf=0 } 26 if o1[52]!=(45 as u8) { wf=0 } 27 if o1[54]!=(49 as u8) { wf=0 } 28 if wf == 1 { pass=pass+1; gp(" T2 well-formed 00-<32>-<16>-01 PASS\n" as *u8) } else { fail=fail+1; gp(" T2 FAIL format\n" as *u8) } 29 30 // T3 deterministic: same seed -> identical 31 let o2: *u8 = sys_mmap(128); tr_traceparent(o2, 42) 32 if g_eq(o1, o2, 55) == 1 { pass=pass+1; gp(" T3 same seed -> identical (reproducible) PASS\n" as *u8) } else { fail=fail+1; gp(" T3 FAIL nondeterministic\n" as *u8) } 33 34 // T4 distinct: different seed -> different 35 let o3: *u8 = sys_mmap(128); tr_traceparent(o3, 43) 36 if g_eq(o1, o3, 55) == 0 { pass=pass+1; gp(" T4 different seed -> different PASS\n" as *u8) } else { fail=fail+1; gp(" T4 FAIL collision\n" as *u8) } 37 38 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail) 39 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 40 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 41 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 42 let ctr__dry: *i64 = gv_ctr() 43 ctr__dry[0] = pass 44 ctr__dry[1] = pass + fail 45 let rc__dry: i64 = gv_verdict("APISTACK-TRACE-GATE" as *u8, ctr__dry, "n" as *u8) 46 sys_exit(rc__dry) 47 return rc__dry 48}