code wiki / _hdl_build / nx_ui_struct.nx
nx_ui_struct.nx source
↩ module page · 154 lines · 9546 B
1// nx_ui_struct.nx -- ui-validation (the DETERMINISTIC, LLM-FREE structural-regression core of the operator's
2// DARPA/Tier-1 hybrid UI-testing architecture, Section 2.A). NO semantic reasoning, NO model: it captures a
3// page's STRUCTURAL FINGERPRINT (the interactive-role + landmark inventory of the DOM = an AXTree-lite over
4// the served HTML) and diffs current-vs-baseline to flag STRUCTURAL REGRESSIONS instantly -- e.g. a <button>
5// silently becoming a <div onclick> (the architecture's exact example: role downgrade = a11y + test-hook
6// regression). Deterministic, ~ms, air-gapped-capable (fork-captures nx_https_get for the fetch only).
7// HONEST ENVELOPE: structural-inventory fingerprint (tag/landmark census + non-semantic-interaction smell),
8// NOT full Zhang-Shasha tree-edit-distance over a real AXTree (that needs the sovereign browser's live
9// accessibility tree = filed next rung). Single baseline at a time.
10// nx_ui_struct baseline <url> [connect] | check <url> [connect]
11// exit: 0 GREEN(no regression) | 3 STRUCTURAL-REGRESSION | 4 fetch/baseline-fail | 2 usage.
12// license_tier: ORIGINAL expect_exit: 0
13import "nx_tool_run.nx"
14const K_MAGIC_30000: i64 = 30000
15const K_MAGIC_524288: i64 = 524288
16const K_MAGIC_4096: i64 = 4096
17const K_MAGIC_1024: i64 = 1024
18const K_MAGIC_8192: i64 = 8192
19const K_MAGIC_8000: i64 = 8000
20const K_MAGIC_16384: i64 = 16384
21
22func us_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 }
23func us_b(rep: *u8, pos: i64, s: *u8) -> i64 { var p: i64 = pos; var i: i64 = 0; while s[i] != (0 as u8) { if p < K_MAGIC_30000 { rep[p] = s[i]; p = p + 1 } i = i + 1 } return p }
24func us_bn(rep: *u8, pos: i64, v: i64) -> i64 { var p: i64 = pos; var m: i64 = v; if m < 0 { if p < K_MAGIC_30000 { rep[p] = 45 as u8; p = p + 1 } m = 0 - m } let t: *u8 = sys_mmap(28); var k: i64 = 0; if m == 0 { t[0] = 48 as u8; 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 { if p < K_MAGIC_30000 { rep[p] = t[k - 1 - i]; p = p + 1 } i = i + 1 } return p }
25func us_count(buf: *u8, n: i64, pat: *u8) -> i64 {
26 var pl: i64 = 0
27 while pat[pl] != (0 as u8) { pl = pl + 1 }
28 if pl == 0 { return 0 }
29 var c: i64 = 0
30 var i: i64 = 0
31 while i + pl <= n {
32 var k: i64 = 0
33 var m: i64 = 1
34 while k < pl { if buf[i + k] != pat[k] { m = 0; k = pl } else { k = k + 1 } }
35 if m == 1 { c = c + 1; i = i + pl } else { i = i + 1 }
36 }
37 return c
38}
39func us_reads(path: *u8, buf: *u8, cap: i64) -> i64 {
40 let fd: i64 = sys_openat_rd(path)
41 if fd < 0 { return 0 - 1 }
42 var n: i64 = 0
43 var go: i64 = 1
44 while go == 1 { let r: i64 = sys_read(fd, (buf as i64 + n) as *u8, cap - n); if r <= 0 { go = 0 } else { n = n + r } if n >= cap { go = 0 } }
45 sys_close(fd)
46 return n
47}
48// the structural fingerprint: 12 deterministic byte-counts over the served HTML
49func us_fp(buf: *u8, n: i64, fp: *i64) -> i64 {
50 fp[0] = us_count(buf, n, "<button" as *u8)
51 fp[1] = us_count(buf, n, "<a " as *u8)
52 fp[2] = us_count(buf, n, "<input" as *u8)
53 fp[3] = us_count(buf, n, "<form" as *u8)
54 fp[4] = us_count(buf, n, "<select" as *u8)
55 fp[5] = us_count(buf, n, "<textarea" as *u8)
56 fp[6] = us_count(buf, n, "<main" as *u8)
57 fp[7] = us_count(buf, n, "<nav" as *u8)
58 fp[8] = us_count(buf, n, "<h1" as *u8)
59 fp[9] = us_count(buf, n, "<table" as *u8)
60 fp[10] = us_count(buf, n, "role=" as *u8)
61 fp[11] = us_count(buf, n, "onclick" as *u8)
62 return 0
63}
64func main(argc: i64, argv: *i64) -> i64 {
65 if argc < 3 { us_w(2, "usage: nx_ui_struct baseline|check <url> [connect]\n" as *u8); sys_exit(2); return 2 }
66 let verb: *u8 = argv[1] as *u8
67 let url: *u8 = argv[2] as *u8
68 let HG: *u8 = "/volume1/homes/elderwesto/nishihost/nx_https_get.elf" as *u8
69 let cap: i64 = K_MAGIC_524288
70 let buf: *u8 = sys_mmap(cap + 16)
71 let olen: *i64 = sys_mmap(16) as *i64
72 let av: *i64 = sys_mmap(16 * 8) as *i64
73 av[0] = HG as i64
74 av[1] = url as i64
75 if argc >= 4 { av[2] = argv[3] as i64; av[3] = 0 } else { av[2] = 0 }
76 let frc: i64 = tr_run_capture(HG, av, buf, cap, olen)
77 let n: i64 = olen[0]
78 if frc == 127 { us_w(1, "UI-STRUCT verdict=FETCH-FAIL exec-127\n" as *u8); sys_exit(4); return 4 }
79 if n <= 0 { us_w(1, "UI-STRUCT verdict=FETCH-FAIL empty\n" as *u8); sys_exit(4); return 4 }
80 let fp: *i64 = sys_mmap(16 * 8) as *i64
81 us_fp(buf, n, fp)
82 let basepath: *u8 = "knowledge/status/ui_struct_base.txt" as *u8
83 let v0: i64 = verb[0]
84 if v0 == 98 {
85 // baseline: write the fingerprint
86 let wb: *u8 = sys_mmap(K_MAGIC_4096)
87 var wp: i64 = 0
88 wp = us_b(wb, wp, "UI-STRUCT-BASELINE url=" as *u8); wp = us_b(wb, wp, url); wp = us_b(wb, wp, "\n" as *u8)
89 var i: i64 = 0
90 while i < 12 { wp = us_bn(wb, wp, fp[i]); wp = us_b(wb, wp, "\n" as *u8); i = i + 1 }
91 let bt: *u8 = "knowledge/status/ui_struct_base.txt.tmp" as *u8
92 let bfd: i64 = sys_openat_wr(bt, 420)
93 if bfd < 0 { us_w(1, "UI-STRUCT verdict=WRITE-FAIL\n" as *u8); sys_exit(4); return 4 }
94 sys_write(bfd, wb, wp); sys_close(bfd); sys_renameat(bt, basepath)
95 us_w(1, "UI-STRUCT verb=baseline captured buttons=" as *u8)
96 let rep0: *u8 = sys_mmap(K_MAGIC_1024); var r0: i64 = 0
97 r0 = us_bn(rep0, r0, fp[0]); r0 = us_b(rep0, r0, " links=" as *u8); r0 = us_bn(rep0, r0, fp[1]); r0 = us_b(rep0, r0, " inputs=" as *u8); r0 = us_bn(rep0, r0, fp[2]); r0 = us_b(rep0, r0, " main=" as *u8); r0 = us_bn(rep0, r0, fp[6]); r0 = us_b(rep0, r0, " nav=" as *u8); r0 = us_bn(rep0, r0, fp[7]); r0 = us_b(rep0, r0, " onclick=" as *u8); r0 = us_bn(rep0, r0, fp[11]); r0 = us_b(rep0, r0, " -> knowledge/status/ui_struct_base.txt\n" as *u8)
98 sys_write(1, rep0, r0)
99 sys_exit(0); return 0
100 }
101 // check: read baseline, diff
102 let bbuf: *u8 = sys_mmap(K_MAGIC_8192)
103 let bn: i64 = us_reads(basepath, bbuf, K_MAGIC_8000)
104 if bn < 0 { us_w(1, "UI-STRUCT verdict=NO-BASELINE (run baseline first)\n" as *u8); sys_exit(4); return 4 }
105 // parse baseline: skip line 0 (header), then 12 integer lines
106 let base: *i64 = sys_mmap(16 * 8) as *i64
107 var bi: i64 = 0
108 var li: i64 = 0
109 var start: i64 = 0
110 var seenhdr: i64 = 0
111 while bi <= bn {
112 var isend: i64 = 0
113 if bi == bn { isend = 1 } else { if bbuf[bi] == (10 as u8) { isend = 1 } }
114 if isend == 1 {
115 if seenhdr == 0 { seenhdr = 1 } else { if li < 12 { var vv: i64 = 0; var j: i64 = start; while j < bi { let c: i64 = bbuf[j]; if c >= 48 { if c <= 57 { vv = vv * 10 + (c - 48) } } j = j + 1 } base[li] = vv; li = li + 1 } }
116 start = bi + 1
117 }
118 bi = bi + 1
119 }
120 let rep: *u8 = sys_mmap(K_MAGIC_16384)
121 var p: i64 = 0
122 p = us_b(rep, p, "{" as *u8)
123 p = us_b(rep, p, "\"kind\":\"structural_regression\",\"url\":\"" as *u8); p = us_b(rep, p, url); p = us_b(rep, p, "\",\"deltas\":[" as *u8)
124 let names: *u8 = 0 as *u8
125 var reg: i64 = 0
126 var i2: i64 = 0
127 // per-field delta
128 while i2 < 12 {
129 if i2 > 0 { p = us_b(rep, p, "," as *u8) }
130 p = us_b(rep, p, "{\"f\":" as *u8); p = us_bn(rep, p, i2)
131 p = us_b(rep, p, ",\"base\":" as *u8); p = us_bn(rep, p, base[i2])
132 p = us_b(rep, p, ",\"now\":" as *u8); p = us_bn(rep, p, fp[i2]); p = us_b(rep, p, "}" as *u8)
133 i2 = i2 + 1
134 }
135 p = us_b(rep, p, "]," as *u8)
136 // regression rules (deterministic): interactive/landmark DROP or button->div (buttons down & onclick up)
137 var reasons: i64 = 0
138 p = us_b(rep, p, "\"regressions\":[" as *u8)
139 if fp[0] < base[0] { if reasons > 0 { p = us_b(rep, p, "," as *u8) } p = us_b(rep, p, "\"buttons dropped " as *u8); p = us_bn(rep, p, base[0]); p = us_b(rep, p, "->" as *u8); p = us_bn(rep, p, fp[0]); p = us_b(rep, p, "\"" as *u8); reasons = reasons + 1; reg = 1 }
140 if fp[0] < base[0] { if fp[11] > base[11] { if reasons > 0 { p = us_b(rep, p, "," as *u8) } p = us_b(rep, p, "\"BUTTON->DIV downgrade (buttons down, onclick up) = a11y+test-hook regression\"" as *u8); reasons = reasons + 1; reg = 1 } }
141 if fp[6] < base[6] { if reasons > 0 { p = us_b(rep, p, "," as *u8) } p = us_b(rep, p, "\"<main> landmark lost\"" as *u8); reasons = reasons + 1; reg = 1 }
142 if fp[7] < base[7] { if reasons > 0 { p = us_b(rep, p, "," as *u8) } p = us_b(rep, p, "\"<nav> landmark lost\"" as *u8); reasons = reasons + 1; reg = 1 }
143 if fp[2] < base[2] { if reasons > 0 { p = us_b(rep, p, "," as *u8) } p = us_b(rep, p, "\"inputs dropped\"" as *u8); reasons = reasons + 1; reg = 1 }
144 if fp[1] < base[1] { if reasons > 0 { p = us_b(rep, p, "," as *u8) } p = us_b(rep, p, "\"links dropped\"" as *u8); reasons = reasons + 1; reg = 1 }
145 p = us_b(rep, p, "],\"verdict\":\"" as *u8)
146 if reg == 1 { p = us_b(rep, p, "STRUCTURAL-REGRESSION" as *u8) } else { p = us_b(rep, p, "GREEN" as *u8) }
147 p = us_b(rep, p, "\",\"envelope\":\"deterministic LLM-free structural-inventory fingerprint diff (interactive+landmark census + button->div smell); full ZSS tree-edit-distance over the sovereign browser AXTree = next rung\"}" as *u8)
148 sys_write(1, rep, p)
149 let ofd: i64 = sys_openat_wr("knowledge/status/ui_struct.out.tmp" as *u8, 420)
150 if ofd >= 0 { sys_write(ofd, rep, p); sys_close(ofd); sys_renameat("knowledge/status/ui_struct.out.tmp" as *u8, "knowledge/status/ui_struct.out" as *u8) }
151 if reg == 1 { sys_exit(3); return 3 }
152 sys_exit(0)
153 return 0
154}