code wiki / _hdl_build / nx_vqoe_gate.nx

nx_vqoe_gate.nx source

↩ module page · 396 lines · 17337 B

1// nx_vqoe_gate.nx -- the STANDING VIDEO SHIP-GATE (F601; eats debt seq35). 2// WHY: prior /video seeds measured the ENCODER VM (36-81fps) while the received room ran 1fps -- 3// the 100x engine-truth-vs-field-truth gap that made /video suck. This organ grades the thing the 4// family actually experiences: the RECEIVER-side /api/vqoe beacons (vqoe.jsonl, appended by 5// nx_mgmt_api ma_vqoe from real rooms + the headless probe). It publishes a machine verdict the 6// reliability plane (nx_deploy_ready via knowledge/registry/deploy_checks.tsv) and any agent can 7// gate on BEFORE shipping video changes. 8// VERDICTS (honest three-state): 9// GREEN = fresh beacons within thresholds -> ship. 10// AMBER = insufficient fresh evidence -> ship is UNPROVEN (not blocked; the remediation is to 11// generate evidence: headless probe or a real call). No GREEN marker = deploy_ready warns. 12// RED = received-room truth failed a threshold -> DO NOT ship video changes. 13// DATA-DRIVEN (rule 11/17): thresholds live in knowledge/registry/vqoe_gate.conf key=value rows, 14// compiled defaults only as bootstrap fallback. ENVELOPE DECLARED (scale law): reads the TAIL 15// tail_bytes of vqoe.jsonl (default 4MiB), keeps <=8192 rtt samples; over-cap is COUNTED + printed, 16// never silent. Imports ONLY nx_syscalls = drift-immune (the reliability-guard pattern). 17// usage: nx_vqoe_gate [jsonl] [conf] [outlog] (defaults: vqoe.jsonl, 18// knowledge/registry/vqoe_gate.conf, knowledge/status/video_vqoe_gate.log) 19// license_tier: ORIGINAL 20import "nx_syscalls.nx" 21import "nx_gate_verdict.nx" 22 23const VG_RTT_CAP: i64 = 8192 24 25func vg_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 26 27func vg_s(dst: *u8, off: i64, s: *u8) -> i64 { 28 var i: i64 = 0 29 while s[i] != (0 as u8) { dst[off+i] = s[i]; i = i + 1 } 30 return off + i 31} 32 33func vg_n(dst: *u8, off: i64, v: i64) -> i64 { 34 var m: i64 = v 35 var o: i64 = off 36 if m < 0 { dst[o] = 45 as u8; o = o + 1; m = 0 - m } 37 let t: *u8 = sys_mmap(32) 38 var k: i64 = 0 39 if m == 0 { t[0] = 48 as u8; k = 1 } 40 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 41 var j: i64 = 0 42 while j < k { dst[o+j] = t[k-1-j]; j = j + 1 } 43 return o + k 44} 45 46func vg_starts(b: *u8, off: i64, le: i64, lit: *u8) -> i64 { 47 var i: i64 = 0 48 while lit[i] != (0 as u8) { 49 if off + i >= le { return 0 } 50 if b[off+i] != lit[i] { return 0 } 51 i = i + 1 52 } 53 return 1 54} 55 56// find `needle` in [start,le); parse the (signed) integer right after it. Returns position 57// after the value (for repeat scans) or -1 if not found. Value -> oval[0]. 58func vg_findint(b: *u8, le: i64, needle: *u8, start: i64, oval: *i64) -> i64 { 59 var i: i64 = start 60 while i < le { 61 if vg_starts(b, i, le, needle) == 1 { 62 var nl: i64 = 0 63 while needle[nl] != (0 as u8) { nl = nl + 1 } 64 var p: i64 = i + nl 65 var neg: i64 = 0 66 if p < le { if b[p] == (45 as u8) { neg = 1; p = p + 1 } } 67 var v: i64 = 0 68 var any: i64 = 0 69 var sc: i64 = 1 70 while sc == 1 { 71 if p >= le { sc = 0 } else { 72 let c: i64 = b[p] as i64 73 if c < 48 { sc = 0 } else { if c > 57 { sc = 0 } else { v = v * 10 + (c - 48); any = 1; p = p + 1 } } 74 } 75 } 76 if any == 0 { oval[0] = 0 - 1; return p } 77 if neg == 1 { v = 0 - v } 78 oval[0] = v 79 return p 80 } 81 i = i + 1 82 } 83 return 0 - 1 84} 85 86// conf line "<key>=<uint>" -> value, else -1 87func vg_lineval(cb: *u8, ls: i64, le: i64, key: *u8) -> i64 { 88 var k: i64 = 0 89 while key[k] != (0 as u8) { 90 if ls + k >= le { return 0 - 1 } 91 if cb[ls+k] != key[k] { return 0 - 1 } 92 k = k + 1 93 } 94 if ls + k >= le { return 0 - 1 } 95 if cb[ls+k] != (61 as u8) { return 0 - 1 } 96 var v: i64 = 0 97 var any: i64 = 0 98 var p: i64 = ls + k + 1 99 while p < le { 100 let c: i64 = cb[p] as i64 101 if c >= 48 { if c <= 57 { v = v * 10 + (c - 48); any = 1 } } 102 p = p + 1 103 } 104 if any == 0 { return 0 - 1 } 105 return v 106} 107 108func vg_confget(cb: *u8, cn: i64, key: *u8, dflt: i64) -> i64 { 109 if (cb as i64) == 0 { return dflt } 110 var i: i64 = 0 111 while i < cn { 112 var e: i64 = i 113 var sc: i64 = 1 114 while sc == 1 { 115 if e >= cn { sc = 0 } else { if cb[e] == (10 as u8) { sc = 0 } else { e = e + 1 } } 116 } 117 if e > i { if cb[i] != (35 as u8) { 118 let v: i64 = vg_lineval(cb, i, e, key) 119 if v >= 0 { return v } 120 } } 121 i = e + 1 122 } 123 return dflt 124} 125 126func main(argc: i64, argv: *i64) -> i64 { 127 var jsonl: *u8 = "vqoe.jsonl" as *u8 128 var confp: *u8 = "knowledge/registry/vqoe_gate.conf" as *u8 129 var outp: *u8 = "knowledge/status/video_vqoe_gate.log" as *u8 130 if argc >= 2 { jsonl = argv[1] as *u8 } 131 if argc >= 3 { confp = argv[2] as *u8 } 132 if argc >= 4 { outp = argv[3] as *u8 } 133 134 // ---- thresholds (data-driven; compiled numbers are BOOTSTRAP DEFAULTS only) ---- 135 let clen: *i64 = sys_mmap(8) as *i64 136 let cb: *u8 = sys_read_file(confp, clen) 137 var cn: i64 = 0 138 if (cb as i64) != 0 { cn = clen[0] } 139 let window: i64 = vg_confget(cb, cn, "window_sec" as *u8, 86400) 140 let minb: i64 = vg_confget(cb, cn, "min_beacons" as *u8, 3) 141 let decmin: i64 = vg_confget(cb, cn, "dec_fps_min" as *u8, 8) 142 let rttmax: i64 = vg_confget(cb, cn, "rtt_ms_max" as *u8, 2000) 143 let dropmax: i64 = vg_confget(cb, cn, "drop_pct_max" as *u8, 20) 144 let tailb: i64 = vg_confget(cb, cn, "tail_bytes" as *u8, 4194304) 145 let starvmax: i64 = vg_confget(cb, cn, "starv_pct_max" as *u8, 25) 146 147 // ---- now (wall clock) ---- 148 let tsb: *i64 = sys_mmap(16) as *i64 149 tsb[0] = 0 150 sys_clock_gettime_real(tsb) 151 let now: i64 = tsb[0] 152 153 // ---- tail-read the beacon journal (ENVELOPE: last tail_bytes only, DECLARED below) ---- 154 var jb: *u8 = 0 as *u8 155 var jn: i64 = 0 156 var ds: i64 = 0 157 var fsz: i64 = 0 158 let fd: i64 = sys_openat_rd(jsonl) 159 if fd >= 0 { 160 fsz = sys_lseek(fd, 0, 2) 161 var start: i64 = 0 162 if fsz > tailb { start = fsz - tailb } 163 sys_lseek(fd, start, 0) 164 jb = sys_mmap(tailb + 64) 165 var got: i64 = 0 166 var rsc: i64 = 1 167 while rsc == 1 { 168 let r: i64 = sys_read(fd, jb + got, tailb - got) 169 if r <= 0 { rsc = 0 } else { got = got + r; if got >= tailb { rsc = 0 } } 170 } 171 jn = got 172 sys_close(fd) 173 if start > 0 { 174 var ssc: i64 = 1 175 while ssc == 1 { 176 if ds >= jn { ssc = 0 } else { if jb[ds] == (10 as u8) { ssc = 0; ds = ds + 1 } else { ds = ds + 1 } } 177 } 178 } 179 } 180 181 // ---- scan beacons ---- 182 let rtts: *i64 = sys_mmap(VG_RTT_CAP * 8) as *i64 183 var nrtt: i64 = 0 184 let decs: *i64 = sys_mmap(VG_RTT_CAP * 8) as *i64 185 var ndec: i64 = 0 186 var overcap: i64 = 0 187 var nb: i64 = 0 188 var nprobe: i64 = 0 189 var nstarv: i64 = 0 190 var newest: i64 = 0 191 var worstdec: i64 = 99999 192 var dksum: i64 = 0 193 var rxsum: i64 = 0 194 let vbox: *i64 = sys_mmap(8) as *i64 195 var i: i64 = ds 196 while i < jn { 197 var e: i64 = i 198 var sc: i64 = 1 199 while sc == 1 { 200 if e >= jn { sc = 0 } else { if jb[e] == (10 as u8) { sc = 0 } else { e = e + 1 } } 201 } 202 if e > i + 8 { 203 let tp: i64 = vg_findint(jb, e, "\"t\":" as *u8, i, vbox) 204 if tp >= 0 { 205 let t: i64 = vbox[0] 206 if t > newest { newest = t } 207 if t >= now - window { if t <= now + 3600 { 208 // 2026-07-29: DIAGNOSTIC HARNESS ROWS ARE NOT FAMILY TRUTH. Build 855+ tags probe 209 // beacons "tp":1 (?probe=1 auto-join rooms). Grade REAL rows only; count the 210 // excluded loudly. (Pre-855 probe rows are unmarked -- they age out of the window.) 211 var isprobe: i64 = 0 212 let pbp: i64 = vg_findint(jb, e, "\"tp\":" as *u8, i, vbox) 213 if pbp >= 0 { if vbox[0] == 1 { isprobe = 1 } } 214 if isprobe == 1 { nprobe = nprobe + 1 } else { 215 nb = nb + 1 216 let rp: i64 = vg_findint(jb, e, "\"rtt\":" as *u8, i, vbox) 217 if rp >= 0 { if vbox[0] >= 0 { 218 if nrtt < VG_RTT_CAP { rtts[nrtt] = vbox[0]; nrtt = nrtt + 1 } else { overcap = overcap + 1 } 219 } } 220 var sawneg: i64 = 0 221 var dp: i64 = i 222 var dsc: i64 = 1 223 while dsc == 1 { 224 dp = vg_findint(jb, e, "\"dec\":" as *u8, dp, vbox) 225 if dp < 0 { dsc = 0 } else { 226 if vbox[0] >= 0 { 227 if vbox[0] < worstdec { worstdec = vbox[0] } 228 if ndec < VG_RTT_CAP { decs[ndec] = vbox[0]; ndec = ndec + 1 } else { overcap = overcap + 1 } 229 } else { sawneg = 1 } 230 } 231 } 232 var kp: i64 = i 233 var ksc: i64 = 1 234 while ksc == 1 { 235 kp = vg_findint(jb, e, "\"dk\":" as *u8, kp, vbox) 236 if kp < 0 { ksc = 0 } else { if vbox[0] > 0 { dksum = dksum + vbox[0] } } 237 } 238 var sawrx: i64 = 0 239 var xp: i64 = i 240 var xsc: i64 = 1 241 while xsc == 1 { 242 xp = vg_findint(jb, e, "\"rx\":" as *u8, xp, vbox) 243 if xp < 0 { xsc = 0 } else { if vbox[0] > 0 { rxsum = rxsum + vbox[0]; sawrx = 1 } } 244 } 245 // DECODE-STARVATION (the probe835 blind spot 2026-07-20): frames ARRIVING (rx>0) but the 246 // decoder NEVER producing (dec=-1) is a hard failure signature, not a skip -- count it. 247 if sawneg == 1 { if sawrx == 1 { nstarv = nstarv + 1 } } 248 } 249 } } 250 } 251 } 252 i = e + 1 253 } 254 255 // ---- p50 rtt (insertion sort; nrtt <= 8192 by construction) ---- 256 var si: i64 = 1 257 while si < nrtt { 258 let key: i64 = rtts[si] 259 var sj: i64 = si - 1 260 var msc: i64 = 1 261 while msc == 1 { 262 if sj < 0 { msc = 0 } else { if rtts[sj] <= key { msc = 0 } else { rtts[sj+1] = rtts[sj]; sj = sj - 1 } } 263 } 264 rtts[sj+1] = key 265 si = si + 1 266 } 267 var p50: i64 = 0 - 1 268 if nrtt > 0 { p50 = rtts[nrtt / 2] } 269 270 // ---- p50 dec fps (median = the robust received-fps floor; MIN would false-RED on the by-design 271 // F604 slow-start ramp or one probe-host contention sample -- measured live 2026-07-20) ---- 272 var di: i64 = 1 273 while di < ndec { 274 let dkey: i64 = decs[di] 275 var dj: i64 = di - 1 276 var dmsc: i64 = 1 277 while dmsc == 1 { 278 if dj < 0 { dmsc = 0 } else { if decs[dj] <= dkey { dmsc = 0 } else { decs[dj+1] = decs[dj]; dj = dj - 1 } } 279 } 280 decs[dj+1] = dkey 281 di = di + 1 282 } 283 var p50dec: i64 = 0 - 1 284 if ndec > 0 { p50dec = decs[ndec / 2] } 285 286 var droppct: i64 = 0 - 1 287 if rxsum + dksum > 0 { droppct = (dksum * 100) / (rxsum + dksum) } 288 289 // ---- verdict ---- 290 var verdict: i64 = 0 291 let why: *u8 = sys_mmap(1024) 292 var wo: i64 = 0 293 if nb < minb { verdict = 2 } else { 294 if p50dec >= 0 { if p50dec < decmin { 295 verdict = 1 296 wo = vg_s(why, wo, " p50_dec_fps=" as *u8); wo = vg_n(why, wo, p50dec); wo = vg_s(why, wo, "<" as *u8); wo = vg_n(why, wo, decmin) 297 } } 298 if p50 >= 0 { if p50 > rttmax { 299 verdict = 1 300 wo = vg_s(why, wo, " p50_rtt_ms=" as *u8); wo = vg_n(why, wo, p50); wo = vg_s(why, wo, ">" as *u8); wo = vg_n(why, wo, rttmax) 301 } } 302 if droppct >= 0 { if droppct > dropmax { 303 verdict = 1 304 wo = vg_s(why, wo, " drop_pct=" as *u8); wo = vg_n(why, wo, droppct); wo = vg_s(why, wo, ">" as *u8); wo = vg_n(why, wo, dropmax) 305 } } 306 if nstarv * 100 > nb * starvmax { 307 verdict = 1 308 wo = vg_s(why, wo, " decode-starvation=" as *u8); wo = vg_n(why, wo, nstarv); wo = vg_s(why, wo, "/" as *u8); wo = vg_n(why, wo, nb) 309 } 310 } 311 why[wo] = 0 as u8 312 313 // ---- build report ---- 314 let ob: *u8 = sys_mmap(16384) 315 var o: i64 = 0 316 o = vg_s(ob, o, "nx_vqoe_gate epoch=" as *u8); o = vg_n(ob, o, now) 317 o = vg_s(ob, o, "\nevidence=" as *u8); o = vg_s(ob, o, jsonl) 318 o = vg_s(ob, o, " file_bytes=" as *u8); o = vg_n(ob, o, fsz) 319 o = vg_s(ob, o, " window_sec=" as *u8); o = vg_n(ob, o, window) 320 o = vg_s(ob, o, " beacons=" as *u8); o = vg_n(ob, o, nb) 321 o = vg_s(ob, o, " probe_rows_excluded=" as *u8); o = vg_n(ob, o, nprobe) 322 o = vg_s(ob, o, " newest_age_s=" as *u8) 323 if newest > 0 { o = vg_n(ob, o, now - newest) } else { o = vg_n(ob, o, 0 - 1) } 324 o = vg_s(ob, o, "\np50_dec_fps=" as *u8) 325 if p50dec >= 0 { o = vg_n(ob, o, p50dec) } else { o = vg_s(ob, o, "na" as *u8) } 326 o = vg_s(ob, o, " worst_dec_fps=" as *u8) 327 if worstdec < 99999 { o = vg_n(ob, o, worstdec) } else { o = vg_s(ob, o, "na" as *u8) } 328 o = vg_s(ob, o, " p50_rtt_ms=" as *u8) 329 if p50 >= 0 { o = vg_n(ob, o, p50) } else { o = vg_s(ob, o, "na" as *u8) } 330 o = vg_s(ob, o, " drop_pct=" as *u8) 331 if droppct >= 0 { o = vg_n(ob, o, droppct) } else { o = vg_s(ob, o, "na" as *u8) } 332 o = vg_s(ob, o, " (dk=" as *u8); o = vg_n(ob, o, dksum) 333 o = vg_s(ob, o, " rx=" as *u8); o = vg_n(ob, o, rxsum); o = vg_s(ob, o, ")" as *u8) 334 o = vg_s(ob, o, " starv=" as *u8); o = vg_n(ob, o, nstarv); o = vg_s(ob, o, "/" as *u8); o = vg_n(ob, o, nb) 335 o = vg_s(ob, o, "\nthresholds dec_fps_min=" as *u8); o = vg_n(ob, o, decmin) 336 o = vg_s(ob, o, " rtt_ms_max=" as *u8); o = vg_n(ob, o, rttmax) 337 o = vg_s(ob, o, " drop_pct_max=" as *u8); o = vg_n(ob, o, dropmax) 338 o = vg_s(ob, o, " min_beacons=" as *u8); o = vg_n(ob, o, minb) 339 o = vg_s(ob, o, " src=" as *u8); o = vg_s(ob, o, confp) 340 o = vg_s(ob, o, "\nenvelope tail_bytes=" as *u8); o = vg_n(ob, o, tailb) 341 o = vg_s(ob, o, " rtt_cap=" as *u8); o = vg_n(ob, o, VG_RTT_CAP) 342 o = vg_s(ob, o, " overcap_dropped=" as *u8); o = vg_n(ob, o, overcap) 343 o = vg_s(ob, o, " (DECLARED, never silent)\n" as *u8) 344 if verdict == 0 { 345 o = vg_s(ob, o, "VERDICT=GREEN received-room QoE within thresholds\n" as *u8) 346 } 347 if verdict == 2 { 348 o = vg_s(ob, o, "VERDICT=AMBER insufficient-fresh-evidence beacons=" as *u8); o = vg_n(ob, o, nb) 349 o = vg_s(ob, o, "<" as *u8); o = vg_n(ob, o, minb) 350 o = vg_s(ob, o, " -- video ship UNPROVEN (not blocked): generate receiver evidence via the headless room probe or a real family call\n" as *u8) 351 } 352 if verdict == 1 { 353 o = vg_s(ob, o, "VERDICT=RED" as *u8); o = vg_s(ob, o, why) 354 o = vg_s(ob, o, " -- received-room truth FAILED; do NOT ship video changes (check relay load, client pacing, codec regression; re-run after fix)\n" as *u8) 355 } 356 ob[o] = 0 as u8 357 358 // ---- publish atomically (tmp + rename; a reader never sees a torn verdict) ---- 359 let tmpp: *u8 = sys_mmap(1024) 360 var tp2: i64 = vg_s(tmpp, 0, outp) 361 tp2 = vg_s(tmpp, tp2, ".new" as *u8) 362 tmpp[tp2] = 0 as u8 363 let ofd: i64 = sys_openat_wr(tmpp, 0x1a4) 364 if ofd >= 0 { 365 sys_write(ofd, ob, o) 366 sys_close(ofd) 367 sys_renameat(tmpp, outp) 368 } 369 vg_puts(ob) 370 // ---- BASE-CLASS VERDICT (D001 migration 2026-08-19). The rich domain row above is kept verbatim 371 // (it is what the video lane reads and what the published log carries); the EXIT CODE and the 372 // canonical last line now come from nx_gate_verdict, per tooth, so the roster, /api/gate_run and 373 // harness.jrnl can read this gate. Insufficient fresh beacons is the third state: gv_need -> SKIP 374 // (exit 3), never RED -- "I could not look" is not "the room is bad". Each threshold is ONE tooth 375 // so the failing conjunct is named; a metric with no samples (p50 < 0) is not judged, as before. 376 let ctr: *i64 = gv_ctr() 377 var have_evidence: i64 = 0 378 if nb >= minb { have_evidence = 1 } 379 if gv_need("fresh receiver beacons >= min_beacons within window_sec" as *u8, have_evidence, ctr) == 1 { 380 var ok_dec: i64 = 1 381 if p50dec >= 0 { if p50dec < decmin { ok_dec = 0 } } 382 gv_check("p50 received decode fps >= dec_fps_min" as *u8, ok_dec, ctr) 383 var ok_rtt: i64 = 1 384 if p50 >= 0 { if p50 > rttmax { ok_rtt = 0 } } 385 gv_check("p50 rtt ms <= rtt_ms_max" as *u8, ok_rtt, ctr) 386 var ok_drop: i64 = 1 387 if droppct >= 0 { if droppct > dropmax { ok_drop = 0 } } 388 gv_check("drop pct <= drop_pct_max" as *u8, ok_drop, ctr) 389 var ok_starv: i64 = 1 390 if nstarv * 100 > nb * starvmax { ok_starv = 0 } 391 gv_check("decode-starvation beacons <= starv_pct_max" as *u8, ok_starv, ctr) 392 } 393 let rc: i64 = gv_verdict("VQOE-GATE" as *u8, ctr, "received-room QoE within the conf thresholds over fresh beacons" as *u8) 394 sys_exit(rc) 395 return rc 396}