code wiki / _hdl_build / nx_ad_view_gate.nx

nx_ad_view_gate.nx source

↩ module page · 92 lines · 5027 B

1// nx_ad_view_gate.nx -- GATE (runnable) for the honest VIEWPORT-VERIFIED impression rule (nx_ad_view). 2// Proves on baked controls that the MRC rule is enforced and that served-but-unseen is REFUSED: 3// boundary : viewed + dwell==1000ms -> viewable (MRC >=1s); dwell==999ms -> NOT (under-dwell) 4// unseen : viewed==0 with huge dwell -> NOT viewable (served != seen: the liar-kill) 5// video : 2000ms threshold (1500ms video -> NOT, 2000ms -> viewable) 6// tally : mixed corpus -> served=100, viewable=60, stripped_inflation=40 (we refuse the 40 7// served-but-unseen impressions an incumbent serve-count would inflate) 8// where : per-slot viewable (above-fold=60, below-fold=0) -- transparent placement 9// no-false : an all-unseen corpus -> viewable=0 (the rule is not stuck-at-served) 10// Evidence -> knowledge/status/ad_view.log (VIEWGATE ... verdict=GREEN). Aggregate-only, no visitor 11// id by construction. license_tier: ORIGINAL 12import "nx_ad_view.nx" 13import "nx_syscalls.nx" 14import "nx_gate_verdict.nx" 15 16const VG_LOG: *u8 = "knowledge/status/ad_view.log" 17 18func vg_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 } 19func vg_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 } 20 21func vg_emit(fd: i64, served: i64, viewable: i64, stripped: i64, sa: i64, unseen_vw: i64, ok: i64) -> i64 { 22 vg_w(fd, "VIEWGATE authored=organ rule=MRC-50pct-1s served=" as *u8); vg_wn(fd, served) 23 vg_w(fd, " viewable=" as *u8); vg_wn(fd, viewable) 24 vg_w(fd, " stripped_inflation=" as *u8); vg_wn(fd, stripped) 25 vg_w(fd, " above_fold_viewable=" as *u8); vg_wn(fd, sa) 26 vg_w(fd, " all_unseen_viewable=" as *u8); vg_wn(fd, unseen_vw) 27 if ok == 1 { vg_w(fd, " verdict=GREEN\n" as *u8) } 28 if ok != 1 { vg_w(fd, " verdict=RED\n" as *u8) } 29 return 0 30} 31 32func main() -> i64 { 33 let ovw: *i64 = sys_mmap(8) as *i64 34 let osv: *i64 = sys_mmap(8) as *i64 35 36 // rule boundaries (display 1000ms) 37 let c1: i64 = av_viewable(1, 1000, AV_MIN_DISPLAY) // exactly 1s -> viewable 38 let c2: i64 = av_viewable(1, 999, AV_MIN_DISPLAY) // 999ms -> NOT 39 let c3: i64 = av_viewable(0, 5000, AV_MIN_DISPLAY) // served-but-unseen -> NOT 40 // video threshold (2000ms) 41 let c6: i64 = av_viewable(1, 1500, AV_MIN_VIDEO) // 1.5s video -> NOT 42 let c7: i64 = av_viewable(1, 2000, AV_MIN_VIDEO) // 2s video -> viewable 43 44 // mixed corpus [viewed, slot, dwell_ms, n] 45 let ev: *i64 = sys_mmap(8 * 4 * 3) as *i64 46 ev[0]=1; ev[1]=0; ev[2]=1500; ev[3]=60 // viewed, above-fold, 1.5s -> 60 viewable 47 ev[4]=1; ev[5]=1; ev[6]=500; ev[7]=30 // viewed, below-fold, 0.5s -> under-dwell (30 served) 48 ev[8]=0; ev[9]=2; ev[10]=3000; ev[11]=10 // NOT viewed, in-article -> unseen (10 served) 49 av_tally(ev, 3, AV_MIN_DISPLAY, ovw, osv) 50 let served: i64 = osv[0] // expect 100 51 let viewable: i64 = ovw[0] // expect 60 52 let stripped: i64 = served - viewable // expect 40 inflated impressions refused 53 54 let sa: i64 = av_tally_slot(ev, 3, AV_MIN_DISPLAY, 0) // above-fold viewable -> 60 55 let sb: i64 = av_tally_slot(ev, 3, AV_MIN_DISPLAY, 1) // below-fold viewable -> 0 (under-dwell) 56 57 // anti-false-green: an all-unseen corpus -> ZERO viewable (not stuck-at-served) 58 let un: *i64 = sys_mmap(8 * 4 * 2) as *i64 59 un[0]=0; un[1]=0; un[2]=5000; un[3]=50 60 un[4]=0; un[5]=1; un[6]=5000; un[7]=50 61 av_tally(un, 2, AV_MIN_DISPLAY, ovw, osv) 62 let unseen_vw: i64 = ovw[0] // expect 0 63 let unseen_sv: i64 = osv[0] // expect 100 64 65 var ok: i64 = 1 66 if c1 != 1 { ok = 0 } 67 if c2 != 0 { ok = 0 } 68 if c3 != 0 { ok = 0 } 69 if c6 != 0 { ok = 0 } 70 if c7 != 1 { ok = 0 } 71 if served != 100 { ok = 0 } 72 if viewable != 60 { ok = 0 } 73 if stripped != 40 { ok = 0 } 74 if sa != 60 { ok = 0 } 75 if sb != 0 { ok = 0 } 76 if unseen_vw != 0 { ok = 0 } 77 if unseen_sv != 100 { ok = 0 } 78 79 vg_emit(1, served, viewable, stripped, sa, unseen_vw, ok) 80 let lf: i64 = sys_openat_append(VG_LOG, 420) 81 if lf >= 0 { vg_emit(lf, served, viewable, stripped, sa, unseen_vw, ok); sys_close(lf) } 82 83 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 84 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 85 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 86 let ctr__dry: *i64 = gv_ctr() 87 ctr__dry[0] = ok 88 ctr__dry[1] = 1 89 let rc__dry: i64 = gv_verdict("AD-VIEW-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8) 90 sys_exit(rc__dry) 91 return rc__dry 92}