code wiki / _hdl_build / nx_receipt_gate.nx

nx_receipt_gate.nx source

↩ module page · 72 lines · 4814 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" 8import "nx_gate_verdict.nx" 9 10func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw(" 11" as *u8); return ok } 12func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 13func 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 } 14func g_row6(buf: *u8, off: i64, a: *u8, b: *u8, c: *u8, d: *u8, e: *u8, f: *u8) -> i64 { 15 var o: i64=g_app(buf,off,a); buf[o]=9 as u8; o=o+1 16 o=g_app(buf,o,b); buf[o]=9 as u8; o=o+1 17 o=g_app(buf,o,c); buf[o]=9 as u8; o=o+1 18 o=g_app(buf,o,d); buf[o]=9 as u8; o=o+1 19 o=g_app(buf,o,e); buf[o]=9 as u8; o=o+1 20 o=g_app(buf,o,f); buf[o]=10 as u8; o=o+1 21 return o 22} 23 24func main(argc: i64, argv: *i64) -> i64 { 25 gp("=== nx_receipt_gate (op acceptance/receipt: emit->read->validate; no fabricated acceptance) ===\n" as *u8) 26 var pass: i64 = 0; var fail: i64 = 0 27 28 // T1 -- emit is atomic + returns bytes>0 (the write path; fa_appendz floor proven separately) 29 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) 30 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) } 31 32 // ---- in-memory fixture ledger for deterministic count/verdict tests ---- 33 let led: *u8 = sys_mmap(8192); var ln: i64 = 0 34 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) 35 ln = g_row6(led, ln, "1002" as *u8, "nx_opaque_login" as *u8, "recover" as *u8, "elderwesto" as *u8, "ACCEPTED" as *u8, "-" as *u8) 36 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) 37 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) 38 // a comment line + a MALFORMED row (only 4 fields) -- must NOT be counted (no fabricated acceptance) 39 ln = g_app(led, ln, "# census comment line\n" as *u8) 40 ln = g_app(led, ln, "1005\tbad\tonly\tfourfields\n" as *u8) 41 42 // T2 -- count well-formed receipts (4 valid; comment + malformed excluded) 43 let c: i64 = rcpt_count(led, ln) 44 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) } 45 46 // T3 -- verdict tally: ACCEPTED=2 47 let a: i64 = rcpt_count_verdict(led, ln, "ACCEPTED" as *u8, 8) 48 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) } 49 50 // T4 -- verdict tally: REJECTED=1 (the orchestration-health signal teammates watch) 51 let rj: i64 = rcpt_count_verdict(led, ln, "REJECTED" as *u8, 8) 52 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) } 53 54 // T5 (NEG) -- empty buffer => 0 receipts (no fabricated acceptance from nothing) 55 let e: i64 = rcpt_count(led, 0) 56 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) } 57 58 // T6 (NEG) -- a verdict with no rows => 0 59 let z: i64 = rcpt_count_verdict(led, ln, "FAILED" as *u8, 6) 60 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) } 61 62 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail) 63 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 64 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 65 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 66 let ctr__dry: *i64 = gv_ctr() 67 ctr__dry[0] = pass 68 ctr__dry[1] = pass + fail 69 let rc__dry: i64 = gv_verdict("RECEIPT-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8) 70 sys_exit(rc__dry) 71 return rc__dry 72}