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}