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}