code wiki / _hdl_build / nx_uat_run.nx
nx_uat_run.nx source
↩ module page · 158 lines · 7099 B
1// nx_uat_run.nx -- THE CONSUMER UAT RUNNER (operator doctrine 2026-08-02: digital-twin, see it ->
2// log it -> work it -> UAT it, on cadence -- the loop a team of people AND consumers would run).
3// Walks knowledge/uat_journeys.conf (id|url|connect|latency_ms_max|must_contain), fetches each
4// journey through the REAL sovereign edge by forking the promoted nx_https_get.elf (the same bytes a
5// user's request traverses), measures WALL latency as a human feels it, checks HTTP 200 + the content
6// the human came for, and journals ONE frame per journey to knowledge/status/uat.jrnl (append-only).
7// A journey slower than its bar FAILS even if the bytes are perfect: the bar is the consumer's
8// patience, not the backend's throughput (seeded by the 8845ms SERP finding, 2026-08-02).
9// Bars/journeys live in DATA (rule 11): expanding UAT = adding a conf row, never a code change.
10// license_tier: ORIGINAL expect_exit: 0 when every journey passes
11import "nx_syscalls.nx"
12import "nx_estate_path.nx" // ep_anchor: the CWD must not decide this organ's verdict
13import "nx_gate_verdict.nx"
14
15func ua_slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
16
17func ua_find(hay: *u8, n: i64, needle: *u8) -> i64 {
18 let nl: i64 = ua_slen(needle)
19 if nl == 0 { return 0 - 1 }
20 var i: i64 = 0
21 while i + nl <= n {
22 var j: i64 = 0
23 var hit: i64 = 1
24 while j < nl { if hay[i+j] != needle[j] { hit = 0; j = nl } else { j = j + 1 } }
25 if hit == 1 { return i }
26 i = i + 1
27 }
28 return 0 - 1
29}
30
31func ua_atoi(s: *u8) -> i64 {
32 var v: i64 = 0
33 var i: i64 = 0
34 while s[i] != (0 as u8) {
35 let c: i64 = s[i] as i64
36 if c >= 48 { if c <= 57 { v = v * 10 + (c - 48) } }
37 i = i + 1
38 }
39 return v
40}
41
42// fork the promoted fetcher, stdout -> out_path; returns exit code (128+sig on signal)
43func ua_fetch(url: *u8, conn: *u8, out_path: *u8) -> i64 {
44 let pid: i64 = sys_fork()
45 if pid == 0 {
46 let out: i64 = sys_openat_wr(out_path, 0x1a4)
47 if out >= 0 { sys_dup3(out, 1, 0) }
48 let argv: *i64 = sys_mmap(8 * 4) as *i64
49 argv[0] = "nx_https_get.elf" as *u8 as i64
50 argv[1] = url as i64
51 var na: i64 = 2
52 if conn[0] != (45 as u8) { argv[2] = conn as i64; na = 3 }
53 argv[na] = 0
54 let envp: *i64 = sys_mmap(16) as *i64
55 envp[0] = "PATH=/usr/bin:/bin" as *u8 as i64
56 envp[1] = 0
57 sys_execve("nx_https_get.elf" as *u8, argv, envp)
58 sys_exit(127)
59 }
60 let st: *i64 = sys_mmap(16) as *i64
61 sys_wait4(pid, st, 0)
62 if (st[0] & 0x7f) != 0 { return 128 + (st[0] & 0x7f) }
63 return (st[0] >> 8) & 0xff
64}
65
66func ua_journal(id: *u8, ok: i64, ms: i64) -> i64 {
67 let fd: i64 = sys_openat_append("knowledge/status/uat.jrnl" as *u8, 0x1a4)
68 if fd < 0 { return 0 }
69 let ln: *u8 = sys_mmap(512)
70 var o: i64 = gv_catn(ln, 0, sys_now_realtime_sec())
71 ln[o] = 9 as u8; o = o + 1
72 o = gv_cat(ln, o, "uat" as *u8)
73 ln[o] = 9 as u8; o = o + 1
74 o = gv_cat(ln, o, id)
75 ln[o] = 9 as u8; o = o + 1
76 o = gv_cat(ln, o, "run" as *u8)
77 ln[o] = 9 as u8; o = o + 1
78 if ok == 1 { o = gv_cat(ln, o, "PASS" as *u8) } else { o = gv_cat(ln, o, "FAIL" as *u8) }
79 ln[o] = 9 as u8; o = o + 1
80 o = gv_cat(ln, o, "ms=" as *u8)
81 o = gv_catn(ln, o, ms)
82 ln[o] = 10 as u8; o = o + 1
83 sys_write(fd, ln, o)
84 sys_close(fd)
85 return 0
86}
87
88func main() -> i64 {
89 // ANCHOR FIRST (2026-08-04, nx_cwdguard finding): this organ reads a RELATIVE
90 // knowledge/ path, so its answer depended on where it was launched. No-op when
91 // already at the estate root, so the cron/MCP context is unchanged.
92 ep_anchor()
93 gv_puts("=== NX-UAT-RUN: consumer journeys through the REAL edge (see it, log it, UAT it) ===\n" as *u8)
94 let box: *i64 = sys_mmap(16) as *i64
95 let cf: *u8 = sys_read_file("knowledge/uat_journeys.conf" as *u8, box)
96 if (cf as i64) == 0 { gv_puts("UAT-RUN RED: journeys conf ABSENT (a loop with no journeys is a wish)\n" as *u8); return 3 }
97 let cn: i64 = box[0]
98 let ctr: *i64 = gv_ctr()
99 let idb: *u8 = sys_mmap(128)
100 let urlb: *u8 = sys_mmap(512)
101 let connb: *u8 = sys_mmap(128)
102 let latb: *u8 = sys_mmap(64)
103 let needb: *u8 = sys_mmap(256)
104 let outp: *u8 = sys_mmap(64)
105 let obox: *i64 = sys_mmap(16) as *i64
106 var jn: i64 = 0
107 var i: i64 = 0
108 while i < cn {
109 var e: i64 = i
110 while e < cn { if cf[e] == (10 as u8) { break } e = e + 1 }
111 if e > i { if cf[i] != (35 as u8) {
112 // split on | into 5 fields
113 let fs: *i64 = sys_mmap(8*6) as *i64
114 var nf: i64 = 0
115 fs[0] = i
116 var p: i64 = i
117 while p < e { if cf[p] == (124 as u8) { if nf < 4 { nf = nf + 1; fs[nf] = p + 1 } } p = p + 1 }
118 if nf == 4 {
119 var q: i64 = 0
120 q = 0; var s: i64 = fs[0]; while s < fs[1]-1 { if q < 127 { idb[q]=cf[s]; q=q+1 } s=s+1 } idb[q]=0 as u8
121 q = 0; s = fs[1]; while s < fs[2]-1 { if q < 511 { urlb[q]=cf[s]; q=q+1 } s=s+1 } urlb[q]=0 as u8
122 q = 0; s = fs[2]; while s < fs[3]-1 { if q < 127 { connb[q]=cf[s]; q=q+1 } s=s+1 } connb[q]=0 as u8
123 q = 0; s = fs[3]; while s < fs[4]-1 { if q < 63 { latb[q]=cf[s]; q=q+1 } s=s+1 } latb[q]=0 as u8
124 q = 0; s = fs[4]; while s < e { if q < 255 { needb[q]=cf[s]; q=q+1 } s=s+1 } needb[q]=0 as u8
125 let latmax: i64 = ua_atoi(latb)
126 var o2: i64 = gv_cat(outp, 0, "/tmp/uat_j" as *u8)
127 o2 = gv_catn(outp, o2, jn)
128 o2 = gv_cat(outp, o2, ".out" as *u8)
129 outp[o2] = 0 as u8
130 let t0: i64 = sys_now_us()
131 let rc: i64 = ua_fetch(urlb, connb, outp)
132 let ms: i64 = (sys_now_us() - t0) / 1000
133 var http_ok: i64 = 0
134 var body_ok: i64 = 0
135 let ob: *u8 = sys_read_file(outp, obox)
136 if (ob as i64) != 0 {
137 if ua_find(ob, obox[0], "HTTP/1.1 200" as *u8) >= 0 { http_ok = 1 }
138 if ua_find(ob, obox[0], needb) >= 0 { body_ok = 1 }
139 }
140 var ok: i64 = 0
141 if rc == 0 { if http_ok == 1 { if body_ok == 1 { if ms <= latmax { ok = 1 } } } }
142 gv_puts(" journey " as *u8); gv_puts(idb)
143 gv_puts(": ms=" as *u8); gv_num(ms)
144 gv_puts(" bar=" as *u8); gv_num(latmax)
145 gv_puts(" http200=" as *u8); gv_num(http_ok)
146 gv_puts(" content=" as *u8); gv_num(body_ok)
147 gv_puts(" rc=" as *u8); gv_num(rc)
148 gv_puts("\n" as *u8)
149 gv_check(idb, ok, ctr)
150 ua_journal(idb, ok, ms)
151 jn = jn + 1
152 }
153 } }
154 i = e + 1
155 }
156 if jn == 0 { gv_puts("UAT-RUN RED: zero journeys parsed\n" as *u8); return 3 }
157 return gv_verdict("UAT-RUN" as *u8, ctr, "every consumer journey inside its human-patience bar with the content the human came for" as *u8)
158}