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}