code wiki / _hdl_build / nx_ui_audit.nx
nx_ui_audit.nx source
↩ module page · 127 lines · 14247 B
1// nx_ui_audit.nx -- ui-debt lane. The REAL design-quality judge (the operator's #1 gap: incredible backend +
2// dev-grade frontend != SOTA). The existing judge (nx_page_verify a11y-lite + nx_contrast) measures DOCUMENT
3// STRUCTURE (title/h1/main/alt) + is a contrast CALCULATOR -- it CANNOT tell a designed product from a dev
4// dump. This measures DESIGN QUALITY from the live page source, LIAR-KILLED (every sub-score IS a measured
5// count over the fetched bytes -- unfakeable). Composes nx_https_get (fork-capture) for the fetch; complements
6// (does NOT touch) the racing-owned page_verify/nx_contrast. Run across every surface -> the UI-debt MAP.
7// Dimensions (source-measurable, high design-signal): design-TOKEN discipline (var(--)), THEME-awareness
8// (prefers-color-scheme), RESPONSIVE (@media + viewport), TYPE-scale (clamp + font-size variety), POLISH
9// (transition/animation/:focus). Score/12 -> grade DEV-GRADE/FUNCTIONAL/DESIGNED/POLISHED.
10// nx_ui_audit <url> [connect-host:port] (override 127.0.0.1:8443 for our own domains)
11// ENVELOPE (declared): analyzes INLINE CSS in the fetched HTML (external stylesheets + rendered-pixel +
12// real-color-extraction-into-nx_contrast = next rungs, honestly deferred). 512KB capture.
13// exit: 0 audited | 4 fetch-fail | 2 usage.
14// license_tier: ORIGINAL expect_exit: 0
15import "nx_tool_run.nx"
16const UA_MAGIC_30000: i64 = 30000
17const UA_MAGIC_524288: i64 = 524288
18const UA_MAGIC_32768: i64 = 32768
19const UA_MAGIC_2048: i64 = 2048
20
21// REDIRECT/STUB GUARD constants (trap T1, 2026-07-20 claude_e8e3bdf3; rule-11: named, not inline).
22const UA_MINBYTES: i64 = 1024
23const UA_EXIT_UNSCORABLE: i64 = 5
24
25func ua_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 }
26func ua_b(rep: *u8, pos: i64, s: *u8) -> i64 { var p: i64 = pos; var i: i64 = 0; while s[i] != (0 as u8) { if p < UA_MAGIC_30000 { rep[p] = s[i]; p = p + 1 } i = i + 1 } return p }
27func ua_bn(rep: *u8, pos: i64, v: i64) -> i64 { var p: i64 = pos; var m: i64 = v; if m < 0 { if p < UA_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 < UA_MAGIC_30000 { rep[p] = t[k - 1 - i]; p = p + 1 } i = i + 1 } return p }
28func ua_q(rep: *u8, pos: i64) -> i64 { var p: i64 = pos; if p < UA_MAGIC_30000 { rep[p] = 34 as u8; p = p + 1 } return p }
29func ua_je(rep: *u8, pos: i64, src: *u8, s: i64, e: i64) -> i64 { var p: i64 = pos; var i: i64 = s; while i < e { let c: i64 = src[i]; if c == 34 { if p < UA_MAGIC_30000 { rep[p] = 92 as u8; p = p + 1 } if p < UA_MAGIC_30000 { rep[p] = 34 as u8; p = p + 1 } } else { if c == 92 { if p < UA_MAGIC_30000 { rep[p] = 92 as u8; p = p + 1 } if p < UA_MAGIC_30000 { rep[p] = 92 as u8; p = p + 1 } } else { if c < 32 { if p < UA_MAGIC_30000 { rep[p] = 32 as u8; p = p + 1 } } else { if p < UA_MAGIC_30000 { rep[p] = c as u8; p = p + 1 } } } } i = i + 1 } return p }
30func ua_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
31// count non-overlapping occurrences of NUL-term pat in buf[0,n)
32func ua_count(buf: *u8, n: i64, pat: *u8) -> i64 {
33 var pl: i64 = 0
34 while pat[pl] != (0 as u8) { pl = pl + 1 }
35 if pl == 0 { return 0 }
36 var c: i64 = 0
37 var i: i64 = 0
38 while i + pl <= n {
39 var k: i64 = 0
40 var m: i64 = 1
41 while k < pl { if buf[i + k] != pat[k] { m = 0; k = pl } else { k = k + 1 } }
42 if m == 1 { c = c + 1; i = i + pl } else { i = i + 1 }
43 }
44 return c
45}
46func main(argc: i64, argv: *i64) -> i64 {
47 if argc < 2 { ua_w(2, "usage: nx_ui_audit <url> [connect-host:port]\n" as *u8); sys_exit(2); return 2 }
48 let url: *u8 = argv[1] as *u8
49 let HG: *u8 = "/volume1/homes/elderwesto/nishihost/nx_https_get.elf" as *u8
50 let cap: i64 = UA_MAGIC_524288
51 let buf: *u8 = sys_mmap(cap + 16)
52 let olen: *i64 = sys_mmap(16) as *i64
53 let av: *i64 = sys_mmap(16 * 8) as *i64
54 av[0] = HG as i64
55 av[1] = url as i64
56 if argc >= 3 { av[2] = argv[2] as i64; av[3] = 0 } else { av[2] = 0 }
57 let frc: i64 = tr_run_capture(HG, av, buf, cap, olen)
58 let n: i64 = olen[0]
59 if frc == 127 { ua_w(1, "UI-AUDIT verdict=FETCH-FAIL exec-127\n" as *u8); sys_exit(4); return 4 }
60 if n <= 0 { ua_w(1, "UI-AUDIT verdict=FETCH-FAIL empty\n" as *u8); sys_exit(4); return 4 }
61 // ---- measure (each = a real count over the fetched bytes) ----
62 let toks: i64 = ua_count(buf, n, "var(--" as *u8)
63 let theme: i64 = ua_count(buf, n, "prefers-color-scheme" as *u8)
64 let media: i64 = ua_count(buf, n, "@media" as *u8)
65 let viewport: i64 = ua_count(buf, n, "viewport" as *u8)
66 let clampc: i64 = ua_count(buf, n, "clamp(" as *u8)
67 let fsz: i64 = ua_count(buf, n, "font-size" as *u8)
68 let trans: i64 = ua_count(buf, n, "transition" as *u8)
69 let anim: i64 = ua_count(buf, n, "animation" as *u8)
70 let focusv: i64 = ua_count(buf, n, ":focus" as *u8)
71 let hexcol: i64 = ua_count(buf, n, ":#" as *u8)
72 let hasstyle: i64 = ua_count(buf, n, "<style" as *u8)
73 // ---- score (max 12) ----
74 var p_tok: i64 = 0
75 if toks == 0 { p_tok = 0 } else { if toks <= 5 { p_tok = 1 } else { if toks <= 15 { p_tok = 2 } else { p_tok = 3 } } }
76 var p_theme: i64 = 0
77 if theme > 0 { p_theme = 2 }
78 var p_resp: i64 = media
79 if p_resp > 3 { p_resp = 3 }
80 if viewport == 0 { p_resp = 0 }
81 var p_type: i64 = 0
82 if clampc > 0 { p_type = p_type + 1 }
83 if fsz >= 3 { p_type = p_type + 1 }
84 var p_polish: i64 = 0
85 if trans > 0 { p_polish = p_polish + 1 } else { if anim > 0 { p_polish = p_polish + 1 } }
86 if focusv > 0 { p_polish = p_polish + 1 }
87 let total: i64 = p_tok + p_theme + p_resp + p_type + p_polish
88 let rep: *u8 = sys_mmap(UA_MAGIC_32768)
89 var p: i64 = 0
90 p = ua_b(rep, p, "{" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "kind" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "ui_design_quality" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "," as *u8)
91 p = ua_q(rep, p); p = ua_b(rep, p, "url" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_q(rep, p); p = ua_je(rep, p, url, 0, ua_slen(url)); p = ua_q(rep, p); p = ua_b(rep, p, "," as *u8)
92 p = ua_q(rep, p); p = ua_b(rep, p, "bytes" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_bn(rep, p, n); p = ua_b(rep, p, "," as *u8)
93 p = ua_q(rep, p); p = ua_b(rep, p, "dimensions" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":[" as *u8)
94 // tokens
95 p = ua_b(rep, p, "{" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "dim" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "design-tokens" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "measured" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_bn(rep, p, toks); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "unit" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "var(--) uses" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "points" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_bn(rep, p, p_tok); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "max" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":3}," as *u8)
96 // theme
97 p = ua_b(rep, p, "{" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "dim" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "theme-aware" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "measured" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_bn(rep, p, theme); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "unit" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "prefers-color-scheme" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "points" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_bn(rep, p, p_theme); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "max" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":2}," as *u8)
98 // responsive
99 p = ua_b(rep, p, "{" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "dim" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "responsive" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "measured" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_bn(rep, p, media); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "unit" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "@media queries (viewport=" as *u8); p = ua_bn(rep, p, viewport); p = ua_b(rep, p, ")" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "points" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_bn(rep, p, p_resp); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "max" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":3}," as *u8)
100 // type
101 p = ua_b(rep, p, "{" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "dim" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "type-scale" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "measured" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_bn(rep, p, fsz); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "unit" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "font-size decls (clamp=" as *u8); p = ua_bn(rep, p, clampc); p = ua_b(rep, p, ")" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "points" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_bn(rep, p, p_type); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "max" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":2}," as *u8)
102 // polish
103 p = ua_b(rep, p, "{" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "dim" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "polish" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "measured" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_bn(rep, p, trans + anim + focusv); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "unit" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "transition+animation+:focus" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "points" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_bn(rep, p, p_polish); p = ua_b(rep, p, "," as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "max" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":2}" as *u8)
104 p = ua_b(rep, p, "]," as *u8)
105 p = ua_q(rep, p); p = ua_b(rep, p, "score" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_bn(rep, p, total); p = ua_b(rep, p, "," as *u8)
106 p = ua_q(rep, p); p = ua_b(rep, p, "max" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":12," as *u8)
107 p = ua_q(rep, p); p = ua_b(rep, p, "explicit_colors" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_bn(rep, p, hexcol); p = ua_b(rep, p, "," as *u8)
108 p = ua_q(rep, p); p = ua_b(rep, p, "has_stylesheet" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_bn(rep, p, hasstyle); p = ua_b(rep, p, "," as *u8)
109 p = ua_q(rep, p); p = ua_b(rep, p, "grade" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_q(rep, p)
110 if total <= 3 { p = ua_b(rep, p, "DEV-GRADE" as *u8) } else { if total <= 6 { p = ua_b(rep, p, "HYGIENE-PARTIAL" as *u8) } else { if total <= 9 { p = ua_b(rep, p, "HYGIENE-GOOD" as *u8) } else { p = ua_b(rep, p, "HYGIENE-COMPLETE" as *u8) } } }
111 p = ua_q(rep, p); p = ua_b(rep, p, "," as *u8)
112 p = ua_q(rep, p); p = ua_b(rep, p, "envelope" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, ":" as *u8); p = ua_q(rep, p); p = ua_b(rep, p, "MEASURES DESIGN-SYSTEM HYGIENE ONLY (are the ingredients present: tokens/theme/responsive/type/polish) -- NOT aesthetic or brand quality vs SOTA (Nike/agency). A HYGIENE-COMPLETE page can still look toy. PREMIUM certification needs perceptual (VLM/human on-brand judgment) + structural (nx_ui_struct AXTree tree-edit-distance regression) + rendered-pixel validation -- filed rungs, NOT this score. Do not read this as a design-quality verdict." as *u8); p = ua_q(rep, p)
113 p = ua_b(rep, p, "}" as *u8)
114 sys_write(1, rep, p)
115 let tfd: i64 = sys_openat_wr("knowledge/status/ui_audit.out.tmp" as *u8, 420)
116 if tfd >= 0 { sys_write(tfd, rep, p); sys_close(tfd); sys_renameat("knowledge/status/ui_audit.out.tmp" as *u8, "knowledge/status/ui_audit.out" as *u8) }
117 // append one MAP line per run -> auditing every surface BUILDS the UI-debt map (the operator's 'mapped to everything')
118 let mp: *u8 = sys_mmap(UA_MAGIC_2048)
119 var q: i64 = 0
120 q = ua_b(mp, q, "UI-MAP\t" as *u8); q = ua_b(mp, q, url); q = ua_b(mp, q, "\tscore=" as *u8); q = ua_bn(mp, q, total); q = ua_b(mp, q, "/12\tgrade=" as *u8)
121 if total <= 3 { q = ua_b(mp, q, "DEV-GRADE" as *u8) } else { if total <= 6 { q = ua_b(mp, q, "HYGIENE-PARTIAL" as *u8) } else { if total <= 9 { q = ua_b(mp, q, "HYGIENE-GOOD" as *u8) } else { q = ua_b(mp, q, "HYGIENE-COMPLETE" as *u8) } } }
122 q = ua_b(mp, q, "\ttok=" as *u8); q = ua_bn(mp, q, p_tok); q = ua_b(mp, q, "\ttheme=" as *u8); q = ua_bn(mp, q, p_theme); q = ua_b(mp, q, "\tresp=" as *u8); q = ua_bn(mp, q, p_resp); q = ua_b(mp, q, "\ttype=" as *u8); q = ua_bn(mp, q, p_type); q = ua_b(mp, q, "\tpolish=" as *u8); q = ua_bn(mp, q, p_polish); q = ua_b(mp, q, "\n" as *u8)
123 let mfd: i64 = sys_openat_append("knowledge/status/ui_debt_map.log" as *u8, 420)
124 if mfd >= 0 { sys_write(mfd, mp, q); sys_close(mfd) }
125 sys_exit(0)
126 return 0
127}