code wiki / _hdl_build / nx_adnet_bill_gate.nx
nx_adnet_bill_gate.nx source
↩ module page · 111 lines · 5082 B
1// nx_adnet_bill_gate.nx -- GATE for CPM/CPC billing math (nx_adnet_bill). Proves exact integer math,
2// the HONEST-BILLING refusals (missing rate / negative count -> REFUSED, never a fabricated charge),
3// the no-charge-by-default zero case, the budgetable flat ceiling, per-AD log counting, and that the
4// refusal is LOAD-BEARING through the invoice line (negative control). expect_exit: 0
5// license_tier: ORIGINAL
6import "nx_syscalls.nx"
7import "_hdl_build/nx_adnet_bill.nx"
8import "nx_gate_verdict.nx"
9
10func bg_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
11func bg_putn(v: i64) -> i64 { var m: i64 = v; if m < 0 { bg_puts("-" as *u8); m = 0 - m } let t: *u8 = sys_mmap(24); var k: i64 = 0; if m == 0 { t[0] = 48 as u8; k = 1 } while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } let o: *u8 = sys_mmap(24); var i: i64 = 0; while i < k { o[i] = t[k - 1 - i]; i = i + 1 } sys_write(1, o, k); return 0 }
12func bg_cat(dst: *u8, off: i64, s: *u8) -> i64 { var o: i64 = off; var i: i64 = 0; while s[i] != (0 as u8) { dst[o] = s[i]; o = o + 1; i = i + 1 } return o }
13
14func bg_has(hay: *u8, n: i64, needle: *u8) -> i64 {
15 var nl: i64 = 0
16 while needle[nl] != (0 as u8) { nl = nl + 1 }
17 if nl == 0 { return 0 }
18 var i: i64 = 0
19 while i + nl <= n {
20 var j: i64 = 0
21 var eq: i64 = 1
22 while j < nl { if hay[i + j] != needle[j] { eq = 0; break } j = j + 1 }
23 if eq == 1 { return 1 }
24 i = i + 1
25 }
26 return 0
27}
28
29func main() -> i64 {
30 bg_puts("=== nx_adnet_bill_gate ===\n" as *u8)
31 var pass: i64 = 0
32 var fail: i64 = 0
33
34 // T1 exact integer math
35 let t1: i64 = anb_total_milli(12345, 7, 2000, 250)
36 if t1 == 26440 { pass = pass + 1 } else { fail = fail + 1; bg_puts("T1 FAIL math\n" as *u8) }
37
38 // T2 refusals (missing rate / negative count)
39 var t2: i64 = 1
40 if anb_total_milli(100, 5, 0 - 1, 250) != (0 - 1) { t2 = 0 }
41 if anb_total_milli(100, 5, 2000, 0 - 1) != (0 - 1) { t2 = 0 }
42 if anb_total_milli(0 - 1, 5, 2000, 250) != (0 - 1) { t2 = 0 }
43 if t2 == 1 { pass = pass + 1 } else { fail = fail + 1; bg_puts("T2 FAIL refusals\n" as *u8) }
44
45 // T3 zero counts -> zero due (no-charge default)
46 let t3: i64 = anb_total_milli(0, 0, 2000, 250)
47 if t3 == 0 { pass = pass + 1 } else { fail = fail + 1; bg_puts("T3 FAIL zero default\n" as *u8) }
48
49 // T4 budgetable ceiling
50 var t4: i64 = 1
51 if anb_capped(26440, 20000) != 20000 { t4 = 0 }
52 if anb_capped(26440, 0 - 1) != 26440 { t4 = 0 }
53 if anb_capped(0 - 1, 100) != (0 - 1) { t4 = 0 }
54 if t4 == 1 { pass = pass + 1 } else { fail = fail + 1; bg_puts("T4 FAIL ceiling\n" as *u8) }
55
56 // T5 per-AD log counting
57 let logb: *u8 = sys_mmap(256)
58 var ln: i64 = 0
59 ln = bg_cat(logb, ln, "h1" as *u8)
60 logb[ln] = 10 as u8
61 ln = ln + 1
62 ln = bg_cat(logb, ln, "h1" as *u8)
63 logb[ln] = 10 as u8
64 ln = ln + 1
65 ln = bg_cat(logb, ln, "h2" as *u8)
66 logb[ln] = 10 as u8
67 ln = ln + 1
68 ln = bg_cat(logb, ln, "h1" as *u8)
69 logb[ln] = 10 as u8
70 ln = ln + 1
71 var t5: i64 = 1
72 if anb_count(logb, ln, "h1" as *u8) != 3 { t5 = 0 }
73 if anb_count(logb, ln, "h2" as *u8) != 1 { t5 = 0 }
74 if anb_count(logb, ln, "zz" as *u8) != 0 { t5 = 0 }
75 if t5 == 1 { pass = pass + 1 } else { fail = fail + 1; bg_puts("T5 FAIL log counts\n" as *u8) }
76
77 // T6 invoice line + LOAD-BEARING refusal (negative control)
78 let line: *u8 = sys_mmap(512)
79 let w1: i64 = anb_invoice_line("h1" as *u8, 3, 1, 2000, 250, 0 - 1, line, 512)
80 var t6: i64 = 1
81 if w1 <= 0 { t6 = 0 }
82 if bg_has(line, w1, "id=h1 imps=3 clicks=1 due_milli=256" as *u8) == 0 { t6 = 0 }
83 let w2: i64 = anb_invoice_line("h1" as *u8, 3, 1, 0 - 1, 250, 0 - 1, line, 512)
84 if w2 <= 0 { t6 = 0 }
85 if bg_has(line, w2, "due_milli=REFUSED" as *u8) == 0 { t6 = 0 }
86 if t6 == 1 { pass = pass + 1 } else { fail = fail + 1; bg_puts("T6 FAIL invoice line\n" as *u8) }
87
88 bg_puts("pass=" as *u8)
89 bg_putn(pass)
90 bg_puts(" fail=" as *u8)
91 bg_putn(fail)
92 bg_puts("\n" as *u8)
93
94 let log2: *u8 = sys_mmap(256)
95 var lo: i64 = 0
96 if fail == 0 { lo = bg_cat(log2, lo, "ADNETBILL authored=organ verdict=GREEN" as *u8) } else { lo = bg_cat(log2, lo, "ADNETBILL authored=organ verdict=RED" as *u8) }
97 log2[lo] = 10 as u8
98 lo = lo + 1
99 let fd: i64 = sys_openat_wr("knowledge/status/adnet_bill.log" as *u8, 0x1A4)
100 if fd >= 0 { sys_write(fd, log2, lo); sys_close(fd) }
101
102 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
103 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
104 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
105 let ctr__dry: *i64 = gv_ctr()
106 ctr__dry[0] = pass
107 ctr__dry[1] = pass + fail
108 let rc__dry: i64 = gv_verdict("ADNET-BILL-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8)
109 sys_exit(rc__dry)
110 return rc__dry
111}