code wiki / _hdl_build / nx_aid_gate.nx
nx_aid_gate.nx source
↩ module page · 133 lines · 8289 B
1// nx_aid_gate.nx -- GATE: charity anti-scam R-AID. T1 a genuinely NEEDY household trips no flags (risk 0) and is
2// served. T2 a DOUBLE-DIPPER (claims across many orgs) is flagged for REVIEW (not denied). T3 a RESELLER (units
3// far beyond household use) is flagged HIGH (not denied). T4 THE FAIL-OPEN GUARANTEE: ad_auto_deny == 0 for
4// EVERYONE incl the reseller -- the system never auto-denies. T5 ADDITIVE ledger + privacy (claims accumulate,
5// history intact, recipient is a token w/ no PII). T6 the review queue renders (flagged only, reasons, privacy
6// note) + ships. license_tier: ORIGINAL
7import "nx_aid.nx"
8import "nx_publisher.nx"
9import "nx_seg_store.nx"
10import "nx_syscalls.nx"
11import "nx_gate_verdict.nx"
12
13const AG_STORE: *u8 = "knowledge/store/aid-"
14const AG_STAGE_FILE: *u8 = "knowledge/staging/aid/review.html"
15const AG_LIVE_FILE: *u8 = "knowledge/publish/aid-live/review.html"
16const NOW: i64 = 110
17
18func g_p(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
19func g_i(v: i64) -> i64 {
20 let bb: *u8 = sys_mmap(28); var m: i64 = v
21 if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m }
22 let t: *u8 = sys_mmap(28); var k: i64 = 0
23 if m == 0 { t[0] = 48 as u8; k = 1 }
24 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
25 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(1, bb, k); return 0
26}
27func g_exists(path: *u8) -> i64 { let fd: i64 = sys_openat_rd(path); if fd < 0 { return 0 } sys_close(fd); return 1 }
28
29func main() -> i64 {
30 g_p("=== nx_aid_gate (R-AID: charity anti-scam, fail-open + privacy-first) ===\n" as *u8)
31 ad_seed_policy(AG_STORE)
32
33 // a genuinely needy family of four, one normal claim
34 ad_add_recipient(AG_STORE, "needy01" as *u8, 4, 1, 50, "intake" as *u8)
35 ad_record_claim(AG_STORE, "needy01" as *u8, "foodbankA" as *u8, 108, 4000, 12, "monthly box" as *u8)
36
37 // a double-dipper: claiming from three different orgs inside the period
38 ad_add_recipient(AG_STORE, "dipper02" as *u8, 2, 1, 60, "intake" as *u8)
39 ad_record_claim(AG_STORE, "dipper02" as *u8, "foodbankA" as *u8, 105, 3000, 10, "-" as *u8)
40 ad_record_claim(AG_STORE, "dipper02" as *u8, "foodbankB" as *u8, 107, 3000, 10, "-" as *u8)
41 ad_record_claim(AG_STORE, "dipper02" as *u8, "foodbankC" as *u8, 109, 3000, 10, "-" as *u8)
42
43 // a reseller: huge units, same org twice
44 ad_add_recipient(AG_STORE, "reseller03" as *u8, 2, 1, 40, "intake" as *u8)
45 ad_record_claim(AG_STORE, "reseller03" as *u8, "foodbankA" as *u8, 100, 20000, 120, "-" as *u8)
46 ad_record_claim(AG_STORE, "reseller03" as *u8, "foodbankA" as *u8, 108, 20000, 120, "-" as *u8)
47
48 var pass: i64 = 0
49 var tot: i64 = 0
50
51 // T1 needy NOT flagged
52 let rn: i64 = ad_risk(AG_STORE, "needy01" as *u8, NOW)
53 g_p("needy risk=" as *u8); g_i(rn); g_p(" review=" as *u8); g_i(ad_needs_review(AG_STORE, "needy01" as *u8, NOW)); g_p("\n" as *u8)
54 tot = tot + 1
55 if rn == 0 { if ad_needs_review(AG_STORE, "needy01" as *u8, NOW) == 0 { pass = pass + 1; g_p("PASS T1 needy household trips no flags (risk 0) -- served, not bothered\n" as *u8) } else { g_p("FAIL T1 review\n" as *u8) } } else { g_p("FAIL T1 risk=" as *u8); g_i(rn); g_p("\n" as *u8) }
56
57 // T2 double-dipper -> review
58 let rd: i64 = ad_risk(AG_STORE, "dipper02" as *u8, NOW)
59 let dorgs: i64 = ad_distinct_orgs(AG_STORE, "dipper02" as *u8, NOW)
60 g_p("dipper risk=" as *u8); g_i(rd); g_p(" distinct-orgs=" as *u8); g_i(dorgs); g_p(" dup=" as *u8); g_i(ad_dup_flag(AG_STORE, "dipper02" as *u8, NOW)); g_p("\n" as *u8)
61 tot = tot + 1
62 var ok2: i64 = 1
63 if ad_dup_flag(AG_STORE, "dipper02" as *u8, NOW) != 1 { ok2 = 0 }
64 if rd != 1 { ok2 = 0 }
65 if dorgs != 3 { ok2 = 0 }
66 if ok2 == 1 { pass = pass + 1; g_p("PASS T2 double-dipper flagged for REVIEW (3 orgs in period), not denied\n" as *u8) } else { g_p("FAIL T2\n" as *u8) }
67
68 // T3 reseller -> high
69 let rr: i64 = ad_risk(AG_STORE, "reseller03" as *u8, NOW)
70 let runits: i64 = ad_units_in_period(AG_STORE, "reseller03" as *u8, NOW)
71 g_p("reseller risk=" as *u8); g_i(rr); g_p(" units=" as *u8); g_i(runits); g_p(" reseller-flag=" as *u8); g_i(ad_reseller_flag(AG_STORE, "reseller03" as *u8, NOW)); g_p("\n" as *u8)
72 tot = tot + 1
73 var ok3: i64 = 1
74 if ad_reseller_flag(AG_STORE, "reseller03" as *u8, NOW) != 1 { ok3 = 0 }
75 if rr != 2 { ok3 = 0 }
76 if runits != 240 { ok3 = 0 }
77 if ok3 == 1 { pass = pass + 1; g_p("PASS T3 reseller flagged HIGH (240 units, household 2), not denied\n" as *u8) } else { g_p("FAIL T3\n" as *u8) }
78
79 // T4 FAIL-OPEN: nobody is ever auto-denied
80 tot = tot + 1
81 var ok4: i64 = 1
82 if ad_auto_deny(AG_STORE, "needy01" as *u8, NOW) != 0 { ok4 = 0 }
83 if ad_auto_deny(AG_STORE, "dipper02" as *u8, NOW) != 0 { ok4 = 0 }
84 if ad_auto_deny(AG_STORE, "reseller03" as *u8, NOW) != 0 { ok4 = 0 }
85 if ok4 == 1 { pass = pass + 1; g_p("PASS T4 FAIL-OPEN guarantee: ad_auto_deny==0 for EVERYONE (needy, dipper, reseller) -- system never auto-denies\n" as *u8) } else { g_p("FAIL T4 a denial path exists!\n" as *u8) }
86
87 // T5 additive ledger + privacy
88 let nc: i64 = ad_claimn(AG_STORE, "reseller03" as *u8)
89 let firstv: i64 = ad_claim_int(AG_STORE, "reseller03" as *u8, 0, 2) // first claim value still intact
90 // privacy: the recipient record holds household/tier/day/cite only -- no name field; field 0 is an integer.
91 let hh: i64 = ad_recip_int(AG_STORE, "needy01" as *u8, 0)
92 g_p("reseller claims=" as *u8); g_i(nc); g_p(" first-claim-value=" as *u8); g_i(firstv); g_p(" needy household=" as *u8); g_i(hh); g_p("\n" as *u8)
93 tot = tot + 1
94 var ok5: i64 = 1
95 if nc != 2 { ok5 = 0 }
96 if firstv != 20000 { ok5 = 0 } // additive: the earlier claim survived the later one
97 if hh != 4 { ok5 = 0 }
98 if ok5 == 1 { pass = pass + 1; g_p("PASS T5 additive ledger (2 claims, history intact) + recipient is a token (no PII)\n" as *u8) } else { g_p("FAIL T5\n" as *u8) }
99
100 // T6 review queue renders + ships
101 let page: *u8 = sys_mmap(65536)
102 let np: i64 = ad_render_review(AG_STORE, NOW, page)
103 g_p("review page = " as *u8); g_i(np); g_p(" bytes\n" as *u8)
104 tot = tot + 1
105 var ok6: i64 = 1
106 if as_has_thirdparty_js(page, np) != 0 { ok6 = 0 }
107 if as_contains(page, np, "dipper02" as *u8) != 1 { ok6 = 0 }
108 if as_contains(page, np, "reseller03" as *u8) != 1 { ok6 = 0 }
109 if as_contains(page, np, "needy01" as *u8) != 0 { ok6 = 0 } // the needy are NOT in the queue
110 if as_contains(page, np, "resale signature" as *u8) != 1 { ok6 = 0 }
111 if as_contains(page, np, "never denies aid" as *u8) != 1 { ok6 = 0 } // fail-open stated
112 sys_mkdir("knowledge/staging" as *u8, 0x1ed)
113 sys_mkdir("knowledge/staging/aid" as *u8, 0x1ed)
114 let sfd: i64 = sys_openat_wr(AG_STAGE_FILE, 420); if sfd >= 0 { sys_write(sfd, page, np); sys_close(sfd) }
115 pub_init()
116 sys_mkdir("knowledge/publish/aid-stage" as *u8, 0x1ed)
117 sys_mkdir("knowledge/publish/aid-live" as *u8, 0x1ed)
118 pub_submit_to("knowledge/publish/aid-queue.tsv" as *u8, AG_STAGE_FILE, "review.html" as *u8, "nishifoodfamily" as *u8, "nishi-aid" as *u8, "internal" as *u8)
119 pub_run_full("knowledge/publish/aid-queue.tsv" as *u8, "knowledge/publish/aid-ledger.tsv" as *u8, "knowledge/publish/aid-stage" as *u8, "knowledge/publish/aid-live" as *u8, "publish:aid" as *u8)
120 if g_exists(AG_LIVE_FILE) != 1 { ok6 = 0 }
121 if ok6 == 1 { pass = pass + 1; g_p("PASS T6 review queue: flagged-only + reasons + privacy note, sovereign, shipped\n" as *u8) } else { g_p("FAIL T6\n" as *u8) }
122
123 g_p("nx_aid_gate pass=" as *u8); g_i(pass); g_p("/" as *u8); g_i(tot)
124 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
125 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
126 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
127 let ctr__dry: *i64 = gv_ctr()
128 ctr__dry[0] = pass
129 ctr__dry[1] = tot
130 let rc__dry: i64 = gv_verdict("AID-GATE" as *u8, ctr__dry, "people in need get the food; exploiters get flagged for review; nobody auto-denied)" as *u8)
131 sys_exit(rc__dry)
132 return rc__dry
133}