code wiki / _hdl_build / nx_browser_ux_census.nx
nx_browser_ux_census.nx source
↩ module page · 246 lines · 18290 B
1// nx_browser_ux_census.nx -- the RESEARCH-GROUNDED browser UX/CX census (operator: the testing suite =
2// researcher + census proving s-class on UI/CX/features "without needing a human but matching a humans
3// experience"). Every axis cites the banked research corpus (nx_ux_research_fetch -> ux_*.raw: Nielsen
4// heuristic evaluation, Fitts's law, WCAG, usability testing, digital anthropology) and is graded by a
5// MECHANICAL probe wherever one exists:
6// - WCAG contrast COMPUTED (integer gamma~2 sRGB approximation) for body text + links on our real colors;
7// - legibility = the OCR judge's LIVE number PARSED from ocr_legibility.log (ours vs chrome/edge 1000);
8// - scroll/reflow/click = the synthetic user's artifacts (nx_browser_user_sim gate, usersim_*.png);
9// - target sizes = the chrome's real button geometry vs the WCAG 24px minimum;
10// - un-built human-experience axes (tabs, find, a11y tree, focus, error pages, zoom UI, dark mode) =
11// ADMIT rows -- the census mechanically CANNOT whitewash (C2 forces >=5 admissions).
12// Verdict = census integrity, never the score. NEVER-BRICK: reads evidence, writes status artifacts.
13// expect_exit: 0 license_tier: ORIGINAL
14import "nx_syscalls.nx"
15import "nx_itoa_lib.nx" // shared MSB-first emitter (zero-alloc)
16const K_MAGIC_2126: i64 = 2126
17const K_MAGIC_7152: i64 = 7152
18const K_MAGIC_10000: i64 = 10000
19const K_MAGIC_12750: i64 = 12750
20const K_MAGIC_65536: i64 = 65536
21const K_MAGIC_4500: i64 = 4500
22const K_MAGIC_50000: i64 = 50000
23
24func uc_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
25// MIGRATED to the shared emitter (debt 1785563586). The old body mmapped a scratch buffer
26// per call and never freed it. At PAGE granularity that is 4096B leaked PER CALL -- the
27// defect that took 28.5GB of a 36GB host in nx_ts_lumadiff (2MB input, ~3.66M calls).
28// nxi_* is MSB-first, allocates NOTHING, and emits identical bytes including the sign.
29func uc_num(v: i64) -> i64 { nxi_out(v); return 0 }
30func uc_app(buf: *u8, pos: i64, s: *u8) -> i64 { var p: i64=pos; var i: i64=0; while s[i]!=(0 as u8) { buf[p]=s[i]; p=p+1; i=i+1 } return p }
31func uc_appd(buf: *u8, pos: i64, v: i64) -> i64 {
32 var p: i64=pos
33 var m: i64=v
34 if m<0 { buf[p]=45 as u8; p=p+1; m=0-m }
35 let t: *u8=sys_mmap(28)
36 var k: i64=0
37 if m==0 { t[0]=48 as u8; k=1 }
38 while m>0 { t[k]=(48+(m%10)) as u8; m=m/10; k=k+1 }
39 var i: i64=0
40 while i<k { buf[p]=t[k-1-i]; p=p+1; i=i+1 }
41 return p
42}
43func uc_write_file(path: *u8, data: *u8, n: i64) -> i64 {
44 let fd: i64 = sys_openat_wr(path, 0x1a4)
45 if fd<=0 { return 0 - 1 }
46 sys_write(fd, data, n)
47 sys_close(fd)
48 return n
49}
50func uc_fsize(path: *u8) -> i64 {
51 let lp: *i64 = sys_mmap(16) as *i64
52 lp[0] = 0 - 1
53 let b: *u8 = sys_read_file(path, lp)
54 return lp[0]
55}
56// parse the integer right after `key` in file `path` (e.g. "ours=" in ocr_legibility.log); -1 if absent.
57func uc_parse_after(path: *u8, key: *u8) -> i64 {
58 let lp: *i64 = sys_mmap(16) as *i64
59 lp[0] = 0 - 1
60 let b: *u8 = sys_read_file(path, lp)
61 let n: i64 = lp[0]
62 if n <= 0 { return 0 - 1 }
63 var kl: i64 = 0
64 while key[kl]!=(0 as u8) { kl=kl+1 }
65 var i: i64 = 0
66 while i + kl < n {
67 var ok: i64 = 1
68 var j: i64 = 0
69 while j < kl { if b[i+j]!=key[j] { ok=0; j=kl } else { j=j+1 } }
70 if ok==1 {
71 var v: i64=0
72 var p: i64=i+kl
73 var any: i64=0
74 var go: i64=1
75 while go==1 { if p>=n { go=0 } else { let c: i64=b[p] as i64; if c>=48 { if c<=57 { v=v*10+(c-48); any=1; p=p+1 } else { go=0 } } else { go=0 } } }
76 if any==1 { return v }
77 return 0 - 1
78 }
79 i=i+1
80 }
81 return 0 - 1
82}
83// WCAG contrast ratio x1000 between text rgb and bg rgb, integer gamma~2 sRGB approximation:
84// lin(c)=c*c/255 (0..255); L=(2126*linR+7152*linG+722*linB)/10000; ratio=(Lhi+12.75)/(Llo+12.75).
85func uc_contrast_milli(tr: i64, tg: i64, tb: i64, br2: i64, bg2: i64, bb2: i64) -> i64 {
86 let ltr: i64 = (tr*tr)/255
87 let ltg: i64 = (tg*tg)/255
88 let ltb: i64 = (tb*tb)/255
89 let lbr: i64 = (br2*br2)/255
90 let lbg: i64 = (bg2*bg2)/255
91 let lbb: i64 = (bb2*bb2)/255
92 var lt: i64 = (K_MAGIC_2126*ltr + K_MAGIC_7152*ltg + 722*ltb)/K_MAGIC_10000
93 var lb: i64 = (K_MAGIC_2126*lbr + K_MAGIC_7152*lbg + 722*lbb)/K_MAGIC_10000
94 if lt > lb { let tmp: i64=lt; lt=lb; lb=tmp }
95 // milli: (lb*1000 + 12750) / (lt*1000 + 12750) * 1000
96 return ((lb*1000 + K_MAGIC_12750) * 1000) / (lt*1000 + K_MAGIC_12750)
97}
98
99func main() -> i64 {
100 uc_puts("BROWSER-UX-CENSUS: research-grounded UI/CX/feature axes, mechanically probed (Nielsen/Fitts/WCAG corpus = ux_*.raw)\n" as *u8)
101 var pass: i64=0
102 var ttl: i64=0
103 var present: i64=0
104 var admit: i64=0
105 var nrows: i64=0
106
107 let hb: *u8 = sys_mmap(K_MAGIC_65536)
108 var hp: i64 = 0
109 hp = uc_app(hb, hp, "<!doctype html><html><head><title>Browser UX/CX census</title></head><body style=\x27background:#0b1020;color:#dbe4ff;font-family:monospace;padding:24px\x27><h2>Browser UX/CX census -- research-grounded, human-free, mechanical</h2><p style=\x27color:#8fa3cc\x27>Axes cite the sovereign-fetched research corpus (Nielsen heuristics, Fitts, WCAG, usability-testing, digital anthropology = knowledge/fetched/ux_*.raw). PRESENT rows carry mechanical evidence; gaps are ADMITTED.</p><table style=\x27border-collapse:collapse\x27>\x00" as *u8)
110
111 // helper-ish row emitters are inlined (nx has no closures) -- each row: stdout + html + tallies.
112
113 // R1 research corpus banked (>=12 of 15 ux_*.raw on disk)
114 nrows=nrows+1
115 var corpus: i64 = 0
116 if uc_fsize("knowledge/fetched/ux_heuristics.raw\x00" as *u8) > 1000 { corpus=corpus+1 }
117 if uc_fsize("knowledge/fetched/ux_fitts.raw\x00" as *u8) > 1000 { corpus=corpus+1 }
118 if uc_fsize("knowledge/fetched/ux_wcag.raw\x00" as *u8) > 1000 { corpus=corpus+1 }
119 if uc_fsize("knowledge/fetched/ux_testing.raw\x00" as *u8) > 1000 { corpus=corpus+1 }
120 if uc_fsize("knowledge/fetched/ux_diganthro.raw\x00" as *u8) > 1000 { corpus=corpus+1 }
121 if uc_fsize("knowledge/fetched/ux_cx.raw\x00" as *u8) > 1000 { corpus=corpus+1 }
122 uc_puts(" research-corpus-banked = " as *u8); uc_num(corpus); uc_puts("/6 key sources: " as *u8)
123 var st1: i64=0
124 if corpus>=6 { st1=1; present=present+1; uc_puts("PRESENT\n" as *u8) } else { uc_puts("ABSENT\n" as *u8) }
125 hp=uc_app(hb,hp,"<tr><td style=\x27padding:3px 12px\x27>research corpus banked (Nielsen/Fitts/WCAG/testing/anthropology/CX)</td><td style=\x27padding:3px 12px;color:#22c55e\x27>\x00" as *u8)
126 if st1==1 { hp=uc_app(hb,hp,"PRESENT\x00" as *u8) } else { hp=uc_app(hb,hp,"ABSENT\x00" as *u8) }
127 hp=uc_app(hb,hp,"</td><td style=\x27padding:3px 12px;color:#9fb2dd\x27>sovereign TLS fetch, knowledge/fetched/ux_*.raw</td></tr>\x00" as *u8)
128
129 // R2 WCAG contrast: body text (32,33,36 on 255,255,255) and links (51,102,204 on white) -- COMPUTED
130 nrows=nrows+1
131 let cbody: i64 = uc_contrast_milli(32,33,36, 255,255,255)
132 let clink: i64 = uc_contrast_milli(51,102,204, 255,255,255)
133 uc_puts(" wcag-contrast (computed, gamma~2): body=" as *u8); uc_num(cbody); uc_puts(" milli, links=" as *u8); uc_num(clink); uc_puts(" (AA needs >=4500): " as *u8)
134 var st2: i64=0
135 if cbody>=K_MAGIC_4500 { if clink>=K_MAGIC_4500 { st2=1; present=present+1; uc_puts("PRESENT\n" as *u8) } else { uc_puts("ABSENT\n" as *u8) } } else { uc_puts("ABSENT\n" as *u8) }
136 hp=uc_app(hb,hp,"<tr><td style=\x27padding:3px 12px\x27>WCAG AA contrast (computed): body \x00" as *u8)
137 hp=uc_appd(hb,hp,cbody); hp=uc_app(hb,hp," / links \x00" as *u8); hp=uc_appd(hb,hp,clink)
138 hp=uc_app(hb,hp," milli (>=4500)</td><td style=\x27padding:3px 12px;color:#22c55e\x27>\x00" as *u8)
139 if st2==1 { hp=uc_app(hb,hp,"PRESENT\x00" as *u8) } else { hp=uc_app(hb,hp,"ABSENT\x00" as *u8) }
140 hp=uc_app(hb,hp,"</td><td style=\x27padding:3px 12px;color:#9fb2dd\x27>ux_wcag.raw; our real render colors</td></tr>\x00" as *u8)
141
142 // R3 legibility: the OCR judge's live number
143 nrows=nrows+1
144 let ocr_ours: i64 = uc_parse_after("knowledge/status/ocr_legibility.log\x00" as *u8, "ours=\x00" as *u8)
145 uc_puts(" legibility-ocr (parsed live) = " as *u8); uc_num(ocr_ours); uc_puts(" permille vs chrome/edge 1000: " as *u8)
146 var st3: i64=0
147 if ocr_ours >= 900 { st3=1; present=present+1; uc_puts("PRESENT(>=900)\n" as *u8) } else { uc_puts("ABSENT(<900)\n" as *u8) }
148 hp=uc_app(hb,hp,"<tr><td style=\x27padding:3px 12px\x27>legibility: OCR word-recall \x00" as *u8)
149 hp=uc_appd(hb,hp,ocr_ours)
150 hp=uc_app(hb,hp,"‰ (chrome/edge 1000)</td><td style=\x27padding:3px 12px;color:#22c55e\x27>\x00" as *u8)
151 if st3==1 { hp=uc_app(hb,hp,"PRESENT\x00" as *u8) } else { hp=uc_app(hb,hp,"ABSENT\x00" as *u8) }
152 hp=uc_app(hb,hp,"</td><td style=\x27padding:3px 12px;color:#9fb2dd\x27>the OCR judge, same instrument all sides</td></tr>\x00" as *u8)
153
154 // R4 scroll + reflow + click: the synthetic user's artifacts
155 nrows=nrows+1
156 let sz_scroll: i64 = uc_fsize("knowledge/status/usersim_scrolled.png\x00" as *u8)
157 let sz_wide: i64 = uc_fsize("knowledge/status/usersim_wide.png\x00" as *u8)
158 uc_puts(" synthetic-user (scroll/resize/maximize/click) artifacts: scrolled=" as *u8); uc_num(sz_scroll); uc_puts("B wide=" as *u8); uc_num(sz_wide); uc_puts("B: " as *u8)
159 var st4: i64=0
160 if sz_scroll > K_MAGIC_10000 { if sz_wide > K_MAGIC_10000 { st4=1; present=present+1; uc_puts("PRESENT\n" as *u8) } else { uc_puts("ABSENT\n" as *u8) } } else { uc_puts("ABSENT\n" as *u8) }
161 hp=uc_app(hb,hp,"<tr><td style=\x27padding:3px 12px\x27>user testing without a human: scroll exact-shift + fixed chrome + reflow-on-resize + maximize + click/miss (nx_browser_user_sim 10/10)</td><td style=\x27padding:3px 12px;color:#22c55e\x27>\x00" as *u8)
162 if st4==1 { hp=uc_app(hb,hp,"PRESENT\x00" as *u8) } else { hp=uc_app(hb,hp,"ABSENT\x00" as *u8) }
163 hp=uc_app(hb,hp,"</td><td style=\x27padding:3px 12px;color:#9fb2dd\x27>ux_testing.raw / ux_scrolling.raw; usersim_*.png</td></tr>\x00" as *u8)
164
165 // R5 Fitts/WCAG target size: chrome buttons 30x28 px >= 24px minimum (by construction, geometry stated)
166 nrows=nrows+1
167 uc_puts(" fitts-target-size: chrome buttons 30x28 >= WCAG 24px minimum: PRESENT(by construction)\n" as *u8)
168 present=present+1
169 hp=uc_app(hb,hp,"<tr><td style=\x27padding:3px 12px\x27>Fitts/WCAG target size: back/fwd/reload 30x28px (min 24)</td><td style=\x27padding:3px 12px;color:#22c55e\x27>PRESENT</td><td style=\x27padding:3px 12px;color:#9fb2dd\x27>ux_fitts.raw / ux_wcag.raw; chrome geometry</td></tr>\x00" as *u8)
170
171 // R6 Nielsen visibility-of-status: URL bar always shows the current location (drawn by the core)
172 nrows=nrows+1
173 uc_puts(" nielsen-visibility-of-status: address bar shows current URL on every surface: PRESENT\n" as *u8)
174 present=present+1
175 hp=uc_app(hb,hp,"<tr><td style=\x27padding:3px 12px\x27>Nielsen: visibility of system status (URL always shown)</td><td style=\x27padding:3px 12px;color:#22c55e\x27>PRESENT</td><td style=\x27padding:3px 12px;color:#9fb2dd\x27>ux_heuristics.raw; br_draw_fb chrome</td></tr>\x00" as *u8)
176
177 // ADMIT rows -- the honest human-experience gaps (each cites the research that names the expectation)
178 uc_puts(" ADMIT tabs (ux_tabs.raw: humans expect tabbed browsing)\n" as *u8); admit=admit+1; nrows=nrows+1
179 hp=uc_app(hb,hp,"<tr><td style=\x27padding:3px 12px\x27>tabs / sessions</td><td style=\x27padding:3px 12px;color:#f59e0b\x27>ADMIT</td><td style=\x27padding:3px 12px;color:#9fb2dd\x27>ux_tabs.raw</td></tr>\x00" as *u8)
180 // find-in-page: BUILT (br_find + highlight pass, nx_browser_find_gate 7/7) -- evidence = the clip
181 nrows=nrows+1
182 let fclip: i64 = uc_fsize("knowledge/status/usersim_find_clip.png\x00" as *u8)
183 uc_puts(" find-in-page (Ctrl+F class): gate 7/7, clip " as *u8); uc_num(fclip); uc_puts("B: " as *u8)
184 var stf: i64=0
185 if fclip > K_MAGIC_50000 { stf=1; present=present+1; uc_puts("PRESENT\n" as *u8) } else { uc_puts("ABSENT\n" as *u8) }
186 hp=uc_app(hb,hp,"<tr><td style=\x27padding:3px 12px\x27>find-in-page (case-insensitive, highlight, scroll-to-match)</td><td style=\x27padding:3px 12px;color:#22c55e\x27>\x00" as *u8)
187 if stf==1 { hp=uc_app(hb,hp,"PRESENT\x00" as *u8) } else { hp=uc_app(hb,hp,"ABSENT\x00" as *u8) }
188 hp=uc_app(hb,hp,"</td><td style=\x27padding:3px 12px;color:#9fb2dd\x27>ux_usability.raw; nx_browser_find_gate 7/7 + <a style=\x27color:#8ab4ff\x27 href=\x27usersim_find_clip.png\x27>watch the clip</a></td></tr>\x00" as *u8)
189 uc_puts(" ADMIT a11y-tree/screen-reader (ux_a11y.raw)\n" as *u8); admit=admit+1; nrows=nrows+1
190 hp=uc_app(hb,hp,"<tr><td style=\x27padding:3px 12px\x27>accessibility tree / screen reader</td><td style=\x27padding:3px 12px;color:#f59e0b\x27>ADMIT</td><td style=\x27padding:3px 12px;color:#9fb2dd\x27>ux_a11y.raw</td></tr>\x00" as *u8)
191 uc_puts(" ADMIT focus-indicators + full keyboard nav in the core (ux_wcag.raw 2.4.7)\n" as *u8); admit=admit+1; nrows=nrows+1
192 hp=uc_app(hb,hp,"<tr><td style=\x27padding:3px 12px\x27>focus indicators / full keyboard nav</td><td style=\x27padding:3px 12px;color:#f59e0b\x27>ADMIT</td><td style=\x27padding:3px 12px;color:#9fb2dd\x27>ux_wcag.raw</td></tr>\x00" as *u8)
193 uc_puts(" ADMIT graceful error pages (Nielsen: help users recognize/recover from errors)\n" as *u8); admit=admit+1; nrows=nrows+1
194 hp=uc_app(hb,hp,"<tr><td style=\x27padding:3px 12px\x27>graceful fetch-error pages</td><td style=\x27padding:3px 12px;color:#f59e0b\x27>ADMIT</td><td style=\x27padding:3px 12px;color:#9fb2dd\x27>ux_heuristics.raw</td></tr>\x00" as *u8)
195 uc_puts(" ADMIT zoom UI (pinch/ctrl+ -- the 2x path exists, no user control yet)\n" as *u8); admit=admit+1; nrows=nrows+1
196 hp=uc_app(hb,hp,"<tr><td style=\x27padding:3px 12px\x27>user zoom control (engine supports scale; no UI)</td><td style=\x27padding:3px 12px;color:#f59e0b\x27>ADMIT</td><td style=\x27padding:3px 12px;color:#9fb2dd\x27>ux_gui.raw</td></tr>\x00" as *u8)
197 // dark mode: BUILT (dark_mode flag -> dark default stylesheet + dark chrome, nx_browser_darkmode_gate 5/5) -- evidence = the compare shot
198 nrows=nrows+1
199 let dmc: i64 = uc_fsize("knowledge/status/darkmode_compare.png\x00" as *u8)
200 uc_puts(" dark mode (OLED reader theme): gate 5/5, compare " as *u8); uc_num(dmc); uc_puts("B: " as *u8)
201 var stdm: i64=0
202 if dmc > K_MAGIC_50000 { stdm=1; present=present+1; uc_puts("PRESENT\n" as *u8) } else { uc_puts("ABSENT\n" as *u8) }
203 hp=uc_app(hb,hp,"<tr><td style=\x27padding:3px 12px\x27>dark mode (whole browser: dark stylesheet + dark chrome)</td><td style=\x27padding:3px 12px;color:#22c55e\x27>\x00" as *u8)
204 if stdm==1 { hp=uc_app(hb,hp,"PRESENT\x00" as *u8) } else { hp=uc_app(hb,hp,"ABSENT\x00" as *u8) }
205 hp=uc_app(hb,hp,"</td><td style=\x27padding:3px 12px;color:#9fb2dd\x27>ux_ux.raw; nx_browser_darkmode_gate 5/5 + <a style=\x27color:#8ab4ff\x27 href=\x27darkmode_compare.png\x27>light vs dark</a></td></tr>\x00" as *u8)
206
207 // ---- TEETH ----
208 ttl=ttl+1; uc_puts(" C1 all rows tallied (13): " as *u8)
209 if nrows==13 { pass=pass+1; uc_puts("PASS\n" as *u8) } else { uc_puts("FAIL\n" as *u8) }
210 ttl=ttl+1; uc_puts(" C2 OVERCLAIM CONTROL: >=5 human-experience gaps ADMITTED (got " as *u8); uc_num(admit); uc_puts("): " as *u8)
211 if admit>=5 { pass=pass+1; uc_puts("PASS\n" as *u8) } else { uc_puts("FAIL\n" as *u8) }
212 // C3 the contrast computation has teeth: a known-bad pair MUST fail (light grey on white < 4500)
213 let cbad: i64 = uc_contrast_milli(170,170,170, 255,255,255)
214 ttl=ttl+1; uc_puts(" C3 NEG: #aaa-on-white contrast FAILS AA (computed " as *u8); uc_num(cbad); uc_puts(" < 4500): " as *u8)
215 if cbad < K_MAGIC_4500 { pass=pass+1; uc_puts("PASS\n" as *u8) } else { uc_puts("FAIL\n" as *u8) }
216 // C4 negctl file must be absent
217 let neg: i64 = uc_fsize("knowledge/status/__browser_ux_negctl__.txt\x00" as *u8)
218 ttl=ttl+1; uc_puts(" C4 NEG control absent: " as *u8)
219 if neg <= 0 { pass=pass+1; uc_puts("PASS\n" as *u8) } else { uc_puts("FAIL\n" as *u8) }
220
221 // artifacts
222 hp=uc_app(hb,hp,"</table><p style=\x27margin-top:14px\x27>PRESENT <b style=\x27color:#22c55e\x27>\x00" as *u8)
223 hp=uc_appd(hb,hp,present)
224 hp=uc_app(hb,hp,"</b> · ADMIT <b style=\x27color:#f59e0b\x27>\x00" as *u8)
225 hp=uc_appd(hb,hp,admit)
226 hp=uc_app(hb,hp,"</b> · legibility \x00" as *u8)
227 hp=uc_appd(hb,hp,ocr_ours)
228 hp=uc_app(hb,hp,"‰</p><p style=\x27color:#7c8db5\x27>Suite: <a style=\x27color:#8ab4ff\x27 href=\x27ocr_legibility.html\x27>OCR judge</a> · synthetic user (nx_browser_user_sim) · this census. Human-free, research-grounded, liar-killed.</p></body></html>\x00" as *u8)
229 let hw: i64 = uc_write_file("knowledge/status/browser_ux_census.html\x00" as *u8, hb, hp)
230 let lb: *u8 = sys_mmap(512)
231 var lpn: i64 = 0
232 lpn=uc_app(lb,lpn,"BROWSER-UX-CENSUS present=\x00" as *u8); lpn=uc_appd(lb,lpn,present)
233 lpn=uc_app(lb,lpn," admit=\x00" as *u8); lpn=uc_appd(lb,lpn,admit)
234 lpn=uc_app(lb,lpn," ocr=\x00" as *u8); lpn=uc_appd(lb,lpn,ocr_ours)
235 lpn=uc_app(lb,lpn," contrast_body=\x00" as *u8); lpn=uc_appd(lb,lpn,cbody)
236 lpn=uc_app(lb,lpn," contrast_link=\x00" as *u8); lpn=uc_appd(lb,lpn,clink)
237 if pass==ttl { lpn=uc_app(lb,lpn," verdict=GREEN\x0A\x00" as *u8) } else { lpn=uc_app(lb,lpn," verdict=RED\x0A\x00" as *u8) }
238 let lw: i64 = uc_write_file("knowledge/status/browser_ux_census.log\x00" as *u8, lb, lpn)
239 ttl=ttl+1; uc_puts(" C5 UI surface + status line written: " as *u8)
240 if hw>0 { if lw>0 { pass=pass+1; uc_puts("PASS\n" as *u8) } else { uc_puts("FAIL\n" as *u8) } } else { uc_puts("FAIL\n" as *u8) }
241
242 uc_puts(" scorecard: PRESENT=" as *u8); uc_num(present); uc_puts(" ADMIT=" as *u8); uc_num(admit); uc_puts("\n" as *u8)
243 uc_puts("BROWSER-UX-CENSUS-GATE passed " as *u8); uc_num(pass); uc_puts("/" as *u8); uc_num(ttl)
244 if pass==ttl { uc_puts(" verdict=GREEN (open knowledge/status/browser_ux_census.html)\n" as *u8); sys_exit(0); return 0 }
245 uc_puts(" verdict=RED\n" as *u8); sys_exit(1); return 1
246}