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}