code wiki / _hdl_build / nx_ad_ivt_gate.nx
nx_ad_ivt_gate.nx source
↩ module page · 121 lines · 6019 B
1// nx_ad_ivt_gate.nx -- GATE (runnable) for the strengthened IVT classifier (nx_ad_ivt). Seeds the
2// richer GIVT rule set into the sovereign store (adcfg:ivtrules, additive + idempotent), then proves:
3// load : >=8 rules across 6 signal fields load from the store (data-driven, rule 11)
4// signals : EACH GIVT signal flags invalid -- known-bot UA, non-browser UA, data-center ASN,
5// proxy/VPN, raw-JS, missing-referrer, impossible-cadence, declared-bot
6// clean : a clean human vector is VALID (the filter is not stuck-at-invalid: anti-false-green)
7// tally : a mixed corpus separates exactly (served=100 -> valid=70, invalid=30), aggregate-only
8// richer : rule count strictly exceeds the legacy 3-signal nx_ad_botfilter set
9// Evidence -> knowledge/status/ad_ivt.log (IVTGATE ... verdict=GREEN). license_tier: ORIGINAL
10import "nx_ad_ivt.nx"
11import "nx_ad_store.nx"
12import "nx_seg_store.nx"
13import "nx_syscalls.nx"
14
15const IVG_LOG: *u8 = "knowledge/status/ad_ivt.log"
16const IVT_KEY: *u8 = "adcfg:ivtrules"
17const IVT_RULES: *u8 = "0\t1\tIVT-UA-KNOWNBOT\n0\t2\tIVT-UA-NONBROWSER\n1\t1\tIVT-SRC-DATACENTER\n1\t2\tIVT-SRC-PROXY\n2\t1\tIVT-JS-RAW\n3\t1\tIVT-REF-MISSING\n4\t1\tIVT-CADENCE-IMPOSSIBLE\n5\t1\tIVT-DECLARED-BOT\n"
18
19func ivg_w(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 }
20func ivg_wn(fd: i64, v: i64) -> i64 { let bb: *u8 = sys_mmap(28); var m: i64=v; if m<0 {m=0-m; sys_write(fd,"-" as *u8,1)}; let t: *u8 = sys_mmap(28); var k: i64=0; if m==0 {t[0]=48;k=1}; while m>0 {t[k]=(48+(m%10)) as u8; m=m/10; k=k+1}; var i: i64=0; while i<k {bb[i]=t[k-1-i]; i=i+1}; sys_write(fd, bb, k); return 0 }
21func ivg_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
22
23func ivg_streq_store(key: *u8, val: *u8) -> i64 {
24 let pq: *i64 = sys_mmap(16) as *i64
25 let lq: *i64 = sys_mmap(16) as *i64
26 if ads_get(key, pq, lq) != 1 { return 0 }
27 let b: *u8 = pq[0] as *u8
28 let n: i64 = lq[0]
29 let vl: i64 = ivg_len(val)
30 if n != vl { return 0 }
31 var i: i64 = 0
32 while i < n { if b[i] != val[i] { return 0 } i = i + 1 }
33 return 1
34}
35
36// build a 6-field vector with fields[idx]=val (rest 0) and return iv_invalid.
37func ivg_probe(idx: i64, val: i64, rules: *i64, nrules: i64) -> i64 {
38 let f: *i64 = sys_mmap(8 * 8) as *i64
39 var i: i64 = 0
40 while i < 6 { f[i] = 0; i = i + 1 }
41 f[idx] = val
42 return iv_invalid(f, 6, rules, nrules)
43}
44
45func main() -> i64 {
46 // seed the richer rule set additively (idempotent, rule 10/13)
47 var seeded: i64 = 0
48 if ivg_streq_store(IVT_KEY, IVT_RULES) == 0 {
49 let w: *i64 = ss_begin()
50 ss_add(w, 1, IVT_KEY, IVT_RULES, ivg_len(IVT_RULES))
51 let segid: i64 = ads_seg_next()
52 let rc: i64 = ss_commit(ADS_PREFIX, w, segid)
53 if rc == 0 { seeded = 1 }
54 }
55
56 let rules: *i64 = sys_mmap(8 * 64) as *i64
57 let nrules: i64 = iv_load_rules(IVT_KEY, rules, 32)
58
59 // each GIVT signal must flag invalid
60 let s_uabot: i64 = ivg_probe(0, 1, rules, nrules)
61 let s_uanonb: i64 = ivg_probe(0, 2, rules, nrules)
62 let s_dc: i64 = ivg_probe(1, 1, rules, nrules)
63 let s_proxy: i64 = ivg_probe(1, 2, rules, nrules)
64 let s_rawjs: i64 = ivg_probe(2, 1, rules, nrules)
65 let s_noref: i64 = ivg_probe(3, 1, rules, nrules)
66 let s_cadence: i64 = ivg_probe(4, 1, rules, nrules)
67 let s_declared:i64 = ivg_probe(5, 1, rules, nrules)
68 // clean human vector must be VALID (anti-false-green)
69 let s_clean: i64 = ivg_probe(0, 0, rules, nrules)
70
71 // mixed corpus tally [c0..c5, n]
72 let ov: *i64 = sys_mmap(8) as *i64
73 let oi: *i64 = sys_mmap(8) as *i64
74 let ev: *i64 = sys_mmap(8 * 7 * 5) as *i64
75 ev[0]=0; ev[1]=0; ev[2]=0; ev[3]=0; ev[4]=0; ev[5]=0; ev[6]=70 // clean human -> 70 valid
76 ev[7]=1; ev[8]=0; ev[9]=0; ev[10]=0; ev[11]=0; ev[12]=0; ev[13]=10 // bot UA -> 10 invalid
77 ev[14]=0; ev[15]=1; ev[16]=0; ev[17]=0; ev[18]=0; ev[19]=0; ev[20]=8 // datacenter -> 8 invalid
78 ev[21]=0; ev[22]=0; ev[23]=0; ev[24]=1; ev[25]=0; ev[26]=0; ev[27]=7 // missing ref -> 7 invalid
79 ev[28]=0; ev[29]=0; ev[30]=0; ev[31]=0; ev[32]=1; ev[33]=0; ev[34]=5 // impossible cadence -> 5 invalid
80 iv_tally(ev, 5, 6, rules, nrules, ov, oi)
81 let valid: i64 = ov[0] // expect 70
82 let invalid: i64 = oi[0] // expect 30
83
84 var ok: i64 = 1
85 if nrules < 8 { ok = 0 }
86 if s_uabot != 1 { ok = 0 }
87 if s_uanonb != 1 { ok = 0 }
88 if s_dc != 1 { ok = 0 }
89 if s_proxy != 1 { ok = 0 }
90 if s_rawjs != 1 { ok = 0 }
91 if s_noref != 1 { ok = 0 }
92 if s_cadence != 1 { ok = 0 }
93 if s_declared != 1 { ok = 0 }
94 if s_clean != 0 { ok = 0 }
95 if valid != 70 { ok = 0 }
96 if invalid != 30 { ok = 0 }
97
98 ivg_w(1, "IVTGATE authored=organ source=store seeded=" as *u8); ivg_wn(1, seeded)
99 ivg_w(1, " rules=" as *u8); ivg_wn(1, nrules)
100 ivg_w(1, " signals[uabot,nonbrowser,datacenter,proxy,rawjs,noref,cadence,declared]=" as *u8)
101 ivg_wn(1, s_uabot); ivg_wn(1, s_uanonb); ivg_wn(1, s_dc); ivg_wn(1, s_proxy); ivg_wn(1, s_rawjs); ivg_wn(1, s_noref); ivg_wn(1, s_cadence); ivg_wn(1, s_declared)
102 ivg_w(1, " clean_valid=" as *u8); ivg_wn(1, s_clean)
103 ivg_w(1, " mixed_valid=" as *u8); ivg_wn(1, valid)
104 ivg_w(1, " mixed_invalid=" as *u8); ivg_wn(1, invalid)
105 if ok == 1 { ivg_w(1, " verdict=GREEN\n" as *u8) }
106 if ok != 1 { ivg_w(1, " verdict=RED\n" as *u8) }
107
108 let lf: i64 = sys_openat_append(IVG_LOG, 420)
109 if lf >= 0 {
110 ivg_w(lf, "IVTGATE authored=organ source=store seeded=" as *u8); ivg_wn(lf, seeded)
111 ivg_w(lf, " rules=" as *u8); ivg_wn(lf, nrules)
112 ivg_w(lf, " mixed_valid=" as *u8); ivg_wn(lf, valid)
113 ivg_w(lf, " mixed_invalid=" as *u8); ivg_wn(lf, invalid)
114 if ok == 1 { ivg_w(lf, " verdict=GREEN\n" as *u8) }
115 if ok != 1 { ivg_w(lf, " verdict=RED\n" as *u8) }
116 sys_close(lf)
117 }
118
119 if ok == 1 { return 0 }
120 return 1
121}