code wiki / _hdl_build / nx_receipt_gate.nx

nx_receipt_gate.nx source

↩ module page · 64 lines · 4357 B

1import "nx_gate_gn.nx" 2import "nx_gate_base.nx" 3// nx_receipt_gate.nx -- hermetic gate for the op ACCEPTANCE/RECEIPT ledger. Proves the emit->read->validate 4// loop teammates rely on to confirm orchestration: emit is atomic, well-formed rows count, verdict tallies are 5// correct, and malformed/comment lines are NOT counted (no fabricated acceptance). Sovereign: nx_receipt. 6import "nx_syscalls.nx" 7import "nx_receipt.nx" 8 9func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw(" 10" as *u8); return ok } 11func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 12func g_app(buf: *u8, off: i64, s: *u8) -> i64 { var i: i64=0; while s[i]!=(0 as u8){buf[off+i]=s[i]; i=i+1} return off+i } 13func g_row6(buf: *u8, off: i64, a: *u8, b: *u8, c: *u8, d: *u8, e: *u8, f: *u8) -> i64 { 14 var o: i64=g_app(buf,off,a); buf[o]=9 as u8; o=o+1 15 o=g_app(buf,o,b); buf[o]=9 as u8; o=o+1 16 o=g_app(buf,o,c); buf[o]=9 as u8; o=o+1 17 o=g_app(buf,o,d); buf[o]=9 as u8; o=o+1 18 o=g_app(buf,o,e); buf[o]=9 as u8; o=o+1 19 o=g_app(buf,o,f); buf[o]=10 as u8; o=o+1 20 return o 21} 22 23func main(argc: i64, argv: *i64) -> i64 { 24 gp("=== nx_receipt_gate (op acceptance/receipt: emit->read->validate; no fabricated acceptance) ===\n" as *u8) 25 var pass: i64 = 0; var fail: i64 = 0 26 27 // T1 -- emit is atomic + returns bytes>0 (the write path; fa_appendz floor proven separately) 28 var w: i64 = rcpt_emit_to("/tmp/nx_rcpt_gate.tsv" as *u8, 1000, "nx_aw_hostctl" as *u8, "logindeploy" as *u8, "nas:nishihost" as *u8, "ISSUED" as *u8, "rc=0" as *u8) 29 if w > 0 { pass = pass + 1; gp(" T1 rcpt_emit atomic bytes=" as *u8); gn(w); gp(" PASS\n" as *u8) } else { fail = fail + 1; gp(" T1 FAIL w=" as *u8); gn(w); gp("\n" as *u8) } 30 31 // ---- in-memory fixture ledger for deterministic count/verdict tests ---- 32 let led: *u8 = sys_mmap(8192); var ln: i64 = 0 33 ln = g_row6(led, ln, "1001" as *u8, "nx_aw_hostctl" as *u8, "logindeploy" as *u8, "nas" as *u8, "ACCEPTED" as *u8, "rc=0" as *u8) 34 ln = g_row6(led, ln, "1002" as *u8, "nx_opaque_login" as *u8, "recover" as *u8, "elderwesto" as *u8, "ACCEPTED" as *u8, "-" as *u8) 35 ln = g_row6(led, ln, "1003" as *u8, "nx_aw_send" as *u8, "send" as *u8, "/volume1/ai/hub/x" as *u8, "COMPLETED" as *u8, "bytes=1234" as *u8) 36 ln = g_row6(led, ln, "1004" as *u8, "nx_opaque_login" as *u8, "recover" as *u8, "ghost" as *u8, "REJECTED" as *u8, "bad-mnemonic" as *u8) 37 // a comment line + a MALFORMED row (only 4 fields) -- must NOT be counted (no fabricated acceptance) 38 ln = g_app(led, ln, "# census comment line\n" as *u8) 39 ln = g_app(led, ln, "1005\tbad\tonly\tfourfields\n" as *u8) 40 41 // T2 -- count well-formed receipts (4 valid; comment + malformed excluded) 42 let c: i64 = rcpt_count(led, ln) 43 if c == 4 { pass = pass + 1; gp(" T2 rcpt_count=4 (comment+malformed excluded) PASS\n" as *u8) } else { fail = fail + 1; gp(" T2 FAIL count=" as *u8); gn(c); gp("\n" as *u8) } 44 45 // T3 -- verdict tally: ACCEPTED=2 46 let a: i64 = rcpt_count_verdict(led, ln, "ACCEPTED" as *u8, 8) 47 if a == 2 { pass = pass + 1; gp(" T3 ACCEPTED=2 PASS\n" as *u8) } else { fail = fail + 1; gp(" T3 FAIL accepted=" as *u8); gn(a); gp("\n" as *u8) } 48 49 // T4 -- verdict tally: REJECTED=1 (the orchestration-health signal teammates watch) 50 let rj: i64 = rcpt_count_verdict(led, ln, "REJECTED" as *u8, 8) 51 if rj == 1 { pass = pass + 1; gp(" T4 REJECTED=1 PASS\n" as *u8) } else { fail = fail + 1; gp(" T4 FAIL rejected=" as *u8); gn(rj); gp("\n" as *u8) } 52 53 // T5 (NEG) -- empty buffer => 0 receipts (no fabricated acceptance from nothing) 54 let e: i64 = rcpt_count(led, 0) 55 if e == 0 { pass = pass + 1; gp(" T5 (NEG) empty->0 PASS\n" as *u8) } else { fail = fail + 1; gp(" T5 FAIL empty=" as *u8); gn(e); gp("\n" as *u8) } 56 57 // T6 (NEG) -- a verdict with no rows => 0 58 let z: i64 = rcpt_count_verdict(led, ln, "FAILED" as *u8, 6) 59 if z == 0 { pass = pass + 1; gp(" T6 (NEG) FAILED=0 PASS\n" as *u8) } else { fail = fail + 1; gp(" T6 FAIL failed=" as *u8); gn(z); gp("\n" as *u8) } 60 61 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail) 62 if fail == 0 { gp(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 } 63 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1 64}