code wiki / _hdl_build / nx_ad_meter_gate.nx
nx_ad_meter_gate.nx source
↩ module page · 108 lines · 5716 B
1// nx_ad_meter_gate.nx -- GATE (runnable) for ADS-007 the measurement keystone. Proves, on baked
2// controls + the LIVE sovereign-store figures (operator go-live 2026-06-13), that the meter:
3// (1) verdict boundaries are exact: UNDER < target <= PERFORM < target*mult <= EXCEED
4// (2) COMPOSES the foundations from the store: a conversion result = consented, bot-filtered,
5// k-anon-floored count (ADS-018/019); an impression result = bot-filtered valid count
6// (3) k-anon suppression is honest: a campaign too small to clear the floor -> result 0 -> UNDER
7// (4) BILLS LIVE off the store: reach target=10000/exceed_mult=2 -> 5000=UNDER, 10000=PERFORM,
8// 20000=EXCEED -- real verdicts from real figures
9// (5) STILL REFUSES honestly: a goal with NO figures (adgoal:nonexistent) -> UNMEASURABLE
10// Cannot false-green: (4)/(5) read the real store; if a figure were missing or wrong they break.
11//
12// Evidence -> knowledge/status/ad_meter.log (METERGATE authored=organ ... verdict=GREEN).
13// license_tier: ORIGINAL
14import "nx_ad_meter.nx"
15import "nx_ad_store.nx"
16import "nx_ad_botfilter.nx"
17import "nx_syscalls.nx"
18import "nx_gate_verdict.nx"
19
20const MG_LOG: *u8 = "knowledge/status/ad_meter.log"
21
22func mg_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 }
23func mg_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 }
24
25func mg_set(ev: *i64, b: i64, consent: i64, ctype: i64, ua: i64, src: i64, js: i64, n: i64) -> i64 {
26 ev[b * 6] = consent; ev[b * 6 + 1] = ctype; ev[b * 6 + 2] = ua
27 ev[b * 6 + 3] = src; ev[b * 6 + 4] = js; ev[b * 6 + 5] = n
28 return 0
29}
30
31func mg_emit(fd: i64, tgt: i64, mult: i64, vU: i64, vP: i64, vE: i64, convr: i64, vconv: i64, miss: i64, vmiss: i64, ok: i64) -> i64 {
32 mg_w(fd, "METERGATE authored=organ source=store live_reach_target=" as *u8); mg_wn(fd, tgt)
33 mg_w(fd, " live_exceed_mult=" as *u8); mg_wn(fd, mult)
34 mg_w(fd, " v_5000=" as *u8); mg_wn(fd, vU)
35 mg_w(fd, " v_10000=" as *u8); mg_wn(fd, vP)
36 mg_w(fd, " v_20000=" as *u8); mg_wn(fd, vE)
37 mg_w(fd, " conv_result=" as *u8); mg_wn(fd, convr)
38 mg_w(fd, " conv_verdict=" as *u8); mg_wn(fd, vconv)
39 mg_w(fd, " missing_goal_target=" as *u8); mg_wn(fd, miss)
40 mg_w(fd, " missing_goal_verdict=" as *u8); mg_wn(fd, vmiss)
41 mg_w(fd, " (-1=UNMEASURABLE 0=UNDER 1=PERFORM 2=EXCEED)" as *u8)
42 if ok == 1 { mg_w(fd, " verdict=GREEN\n" as *u8) } else { mg_w(fd, " verdict=RED\n" as *u8) }
43 return 0
44}
45
46func main() -> i64 {
47 let rules: *i64 = sys_mmap(BF_MAXRULES * 2 * 8) as *i64
48 let nrules: i64 = ads_botrules(rules, BF_MAXRULES)
49
50 // (1) verdict boundaries with a numeric target=100, exceed_mult=2.
51 let v_under: i64 = am_verdict(50, 100, 2)
52 let v_perform: i64 = am_verdict(100, 100, 2)
53 let v_exceed: i64 = am_verdict(200, 100, 2)
54
55 // (2)(3) conversion composition from store config: consented human (120) counts; unconsented
56 // (50) and bot (80) dropped -> 120. A below-floor campaign suppresses to 0 -> UNDER.
57 let k: i64 = ads_kanon_k()
58 let cev: *i64 = sys_mmap(256) as *i64
59 mg_set(cev, 0, 1, 2, 0, 0, 1, 120)
60 mg_set(cev, 1, 0, 0, 0, 0, 1, 50)
61 mg_set(cev, 2, 1, 1, 1, 1, 0, 80)
62 let conv_result: i64 = am_result_conversions(cev, 3, rules, nrules, k)
63 let v_conv: i64 = am_verdict(conv_result, 100, 2)
64 let sev: *i64 = sys_mmap(64) as *i64
65 mg_set(sev, 0, 1, 0, 0, 0, 1, k - 1)
66 let small_result: i64 = am_result_conversions(sev, 1, rules, nrules, k)
67
68 // (4) LIVE billing off the store: reach target + exceed_mult are now real figures.
69 let tgt: i64 = am_target_of("adgoal:reach" as *u8) // 10000
70 let mult: i64 = am_exceed_mult_of("adpricing:reach" as *u8) // 2
71 let vU: i64 = am_verdict(5000, tgt, mult) // UNDER
72 let vP: i64 = am_verdict(10000, tgt, mult) // PERFORM
73 let vE: i64 = am_verdict(20000, tgt, mult) // EXCEED
74
75 // (5) honest refusal still holds: a goal with NO figures -> UNMEASURABLE.
76 let miss: i64 = am_target_of("adgoal:nonexistent" as *u8) // -1
77 let vmiss: i64 = am_verdict(99999, miss, mult) // -1 UNMEASURABLE
78
79 var ok: i64 = 1
80 if nrules < 1 { ok = 0 }
81 if v_under != 0 { ok = 0 }
82 if v_perform != 1 { ok = 0 }
83 if v_exceed != 2 { ok = 0 }
84 if conv_result != 120 { ok = 0 }
85 if v_conv != 1 { ok = 0 }
86 if small_result != 0 { ok = 0 }
87 if tgt != 10000 { ok = 0 }
88 if mult != 2 { ok = 0 }
89 if vU != 0 { ok = 0 }
90 if vP != 1 { ok = 0 }
91 if vE != 2 { ok = 0 }
92 if miss != 0 - 1 { ok = 0 }
93 if vmiss != 0 - 1 { ok = 0 }
94
95 mg_emit(1, tgt, mult, vU, vP, vE, conv_result, v_conv, miss, vmiss, ok)
96 let lf: i64 = sys_openat_append(MG_LOG, 420)
97 if lf >= 0 { mg_emit(lf, tgt, mult, vU, vP, vE, conv_result, v_conv, miss, vmiss, ok); sys_close(lf) }
98
99 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
100 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
101 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
102 let ctr__dry: *i64 = gv_ctr()
103 ctr__dry[0] = ok
104 ctr__dry[1] = 1
105 let rc__dry: i64 = gv_verdict("AD-METER-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8)
106 sys_exit(rc__dry)
107 return rc__dry
108}