nx_ppp_probe.nx source
↩ module page · 901 lines · 51178 B
1// nx_ppp_probe.nx -- PERSON / PRODUCT / PLACE probe: ONE ruler, run on OUR live surface AND on each rival's
2// live surface, so a /compare page can say how to build a better site than the competitor from a measurement
3// instead of an opinion (operator 2026-08-24: "we need to know the person, product, and place ... competing on
4// person via privacy and superior cx, product as a superior product ... place ... ease of navigation and
5// ability to accomplish the desired task").
6//
7// WHAT IT MEASURES, from the bytes a first visitor receives (HTML body over the sovereign TLS stack + the
8// HTTP response headers) -- the same envelope for every subject, which is what makes the head-to-head fair:
9// PERSON (privacy + CX) third-party asset hosts, third-party SCRIPT hosts, known tracker markers (tag
10// manager, analytics, pixel, session-replay, ad networks, fingerprinting), consent-banner markers,
11// cookie-less analytics markers, Set-Cookie count, Permissions-Policy, the 5 security headers
12// (composes nx_uiq_wire_lib uw_audit -- one ruler for headers, never a second copy).
13// PRODUCT (design quality + longevity) the design-hygiene score of nx_ui_audit (forked, /12), computed
14// WCAG contrast over the page's real color tokens (composes nx_uiq_color uiq_audit_buf in-process),
15// the static Core-Web-Vitals predictor of nx_uiq_perf (forked: render-blocking css/js, unsized
16// media), script tags, inline-JS share of the page, noscript, dark-mode + reduced-motion media
17// queries, canonical link, doctype, page weight.
18// PLACE (findability + task) nav / main / footer landmarks, skip link, on-site search, breadcrumb,
19// exactly-one h1, aria-current, link count and internal-link count, lang, viewport, title.
20// SCORE: each axis is a permil computed by the DECLARED rules in pp_score_* below -- every rule is a count
21// against a published bar (WCAG 2.2 landmarks and skip links, NN/g search + breadcrumb, web.dev CWV
22// predictors, OWASP secure headers, the Markup Blacklight tracker classes) so it can be argued with, and the
23// raw counts are printed beside the score so nobody has to trust the arithmetic.
24// THIRD STATE: a sub-measure the probe could not observe (a fork that returned nothing, headers not captured)
25// is printed as -1 and named in "unobserved" -- it scores ZERO for that rule and the page says so, never a
26// silent acquittal (abstain-never-acquit).
27// HONEST ENVELOPE: static HTML + headers, no render, no script execution. A client-rendered app is graded on
28// what it ships to a no-JS first visitor -- which is the progressive-enhancement bar itself, stated on the
29// page. Registrable domain = last two labels (wrong for co.uk-class suffixes; declared).
30// nx_ppp_probe url <url> [connect-host:port] -> one JSON object on stdout
31// nx_ppp_probe domain <dom> -> reads knowledge/compare/<dom>.ppp rows
32// surface|<col>|<label>|<url>|<connect or ->
33// probes each, writes knowledge/compare/<dom>.pppstate
34// nx_ppp_probe --kat -> fixture self-test (bite-proven both directions)
35// exit: 0 ok | 1 kat failed | 2 usage | 4 fetch failed (url verb)
36// license_tier: ORIGINAL No hw writes (Rule 26).
37import "nx_syscalls.nx"
38import "nx_tool_run.nx"
39import "nx_https_fetch_follow.nx"
40import "nx_trust_store_load_from_certdata.nx"
41import "nx_https_url_connect.nx"
42import "nx_uiq_color.nx"
43import "nx_uiq_wire_lib.nx"
44
45const PP_BODY_CAP: i64 = 4194304 // one page body reserve (largest rival measured: 792 KB); brim announces
46const PP_CERT_CAP: i64 = 4194304 // Mozilla certdata reserve, as nx_ui_audit sizes it
47const PP_FORK_CAP: i64 = 262144 // a forked ruler's stdout, unknowable in advance
48const PP_HDR_CAP: i64 = 2097152 // nx_https_get prints headers AND body; headers are read from the head
49const PP_HOSTS_MAX: i64 = 128 // distinct hosts tracked per page; brim announces
50const PP_HOST_W: i64 = 128 // one host slot
51const PP_OUT_CAP: i64 = 32768 // one surface's JSON
52const PP_MIN_BYTES: i64 = 1024 // under this a body is a redirect stub or a co-squat 404, not a page
53const PP_FORK_MS: i64 = 60000 // a forked ruler that has not answered in a minute is UNOBSERVED
54const PP_MAX_SURFACES: i64 = 16
55const PP_ROW_CAP: i64 = 2048
56const PP_STATE_CAP: i64 = 524288
57const PP_NAME_CAP: i64 = 512
58const PP_TMP_BODY: *u8 = "/tmp/nx_ppp_body.html"
59const PP_LINE_CAP: i64 = 4096
60// widest attr=value pattern pp_has_attr assembles (attr + 3 punctuation bytes + value + NUL)
61const PP_ATTRPAT_CAP: i64 = 256
62// scratch for one decimal integer rendered by pp_catn (i64 max is 19 digits + sign + NUL)
63const PP_NUMBUF_CAP: i64 = 32
64
65func pp_w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
66func pp_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
67func pp_cat(d: *u8, o: i64, s: *u8) -> i64 { var i: i64 = 0; var p: i64 = o; while s[i] != (0 as u8) { d[p] = s[i]; p = p + 1; i = i + 1 } d[p] = 0 as u8; return p }
68func pp_catn(d: *u8, o: i64, v: i64) -> i64 {
69 var p: i64 = o
70 var m: i64 = v
71 if m < 0 { d[p] = 45 as u8; p = p + 1; m = 0 - m }
72 let t: *u8 = sys_mmap(32)
73 var k: i64 = 0
74 if m == 0 { t[0] = 48 as u8; k = 1 }
75 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
76 var i: i64 = 0
77 while i < k { d[p] = t[k - 1 - i]; p = p + 1; i = i + 1 }
78 d[p] = 0 as u8
79 return p
80}
81func pp_streq(a: *u8, b: *u8) -> i64 { var i: i64 = 0; while a[i] == b[i] { if a[i] == (0 as u8) { return 1 } i = i + 1 } return 0 }
82func pp_lc(c: i64) -> i64 { if c >= 65 { if c <= 90 { return c + 32 } } return c }
83// count non-overlapping occurrences of pat in buf[0..n)
84func pp_count(buf: *u8, n: i64, pat: *u8) -> i64 {
85 let pl: i64 = pp_len(pat)
86 if pl == 0 { return 0 }
87 var c: i64 = 0
88 var i: i64 = 0
89 while i + pl <= n {
90 var k: i64 = 0
91 var m: i64 = 1
92 while k < pl { if buf[i + k] != pat[k] { m = 0; k = pl } else { k = k + 1 } }
93 if m == 1 { c = c + 1; i = i + pl } else { i = i + 1 }
94 }
95 return c
96}
97func pp_has(buf: *u8, n: i64, pat: *u8) -> i64 { if pp_count(buf, n, pat) > 0 { return 1 } return 0 }
98// Quote-agnostic attribute match: attr="val" | attr='val' | attr=val.
99// WHY THIS EXISTS: the three-form check was already hand-written for rel=canonical and for href=/,
100// and NOT for name=viewport, role=main, role=search or type=search. MEASURED 2026-08-25: the live
101// /games page emits <meta name='viewport' ...> in SINGLE quotes, so this probe scored viewport=0 on
102// a page that is CORRECT -- a false negative inside a PUBLISHED competitive score, worth 50 permil
103// of PLACE. A fix applied in one place and not its siblings is half a fix; this is the one matcher,
104// so the next attribute added cannot inherit the same gap.
105// LIMIT, DECLARED: the bare form is a prefix match, so attr=val also matches attr=valxyz. That
106// over-match is inherited from the incumbent's own bare fallback and is not widened here.
107func pp_has_attr(buf: *u8, n: i64, attr: *u8, val: *u8) -> i64 {
108 let b: *u8 = sys_mmap(PP_ATTRPAT_CAP)
109 var p: i64 = pp_cat(b, 0, attr)
110 p = pp_cat(b, p, "=\"" as *u8); p = pp_cat(b, p, val); p = pp_cat(b, p, "\"" as *u8)
111 if pp_has(buf, n, b) == 1 { return 1 }
112 p = pp_cat(b, 0, attr)
113 p = pp_cat(b, p, "='" as *u8); p = pp_cat(b, p, val); p = pp_cat(b, p, "'" as *u8)
114 if pp_has(buf, n, b) == 1 { return 1 }
115 p = pp_cat(b, 0, attr)
116 p = pp_cat(b, p, "=" as *u8); p = pp_cat(b, p, val)
117 if pp_has(buf, n, b) == 1 { return 1 }
118 return 0
119}
120// first index of pat in buf[from..n) or -1
121func pp_find(buf: *u8, n: i64, from: i64, pat: *u8) -> i64 {
122 let pl: i64 = pp_len(pat)
123 if pl == 0 { return 0 - 1 }
124 var i: i64 = from
125 while i + pl <= n {
126 var k: i64 = 0
127 var m: i64 = 1
128 while k < pl { if buf[i + k] != pat[k] { m = 0; k = pl } else { k = k + 1 } }
129 if m == 1 { return i }
130 i = i + 1
131 }
132 return 0 - 1
133}
134// parse the integer that follows key in buf (a JSON "key":N), -1 when absent
135func pp_json_int(buf: *u8, n: i64, key: *u8) -> i64 {
136 let at: i64 = pp_find(buf, n, 0, key)
137 if at < 0 { return 0 - 1 }
138 var i: i64 = at + pp_len(key)
139 while i < n { if buf[i] == (32 as u8) { i = i + 1 } else { break } }
140 var neg: i64 = 0
141 if i < n { if buf[i] == (45 as u8) { neg = 1; i = i + 1 } }
142 var v: i64 = 0
143 var got: i64 = 0
144 while i < n {
145 let c: i64 = buf[i] as i64
146 if c >= 48 { if c <= 57 { v = v * 10 + (c - 48); got = 1; i = i + 1 } else { break } } else { break }
147 }
148 if got == 0 { return 0 - 1 }
149 if neg == 1 { return 0 - v }
150 return v
151}
152func pp_exists(path: *u8) -> i64 { let fd: i64 = sys_openat_rd(path); if fd < 0 { return 0 } sys_close(fd); return 1 }
153// resolve a promoted elf the way the estate installs it (flat at the serving root; ../ when run from buildroot)
154func pp_elf(name: *u8, out: *u8) -> i64 {
155 var o: i64 = pp_cat(out, 0, name); o = pp_cat(out, o, ".elf" as *u8)
156 if pp_exists(out) == 1 { return 1 }
157 o = pp_cat(out, 0, "../" as *u8); o = pp_cat(out, o, name); o = pp_cat(out, o, ".elf" as *u8)
158 if pp_exists(out) == 1 { return 1 }
159 o = pp_cat(out, 0, "_offc/" as *u8); o = pp_cat(out, o, name); o = pp_cat(out, o, ".elf" as *u8)
160 if pp_exists(out) == 1 { return 1 }
161 o = pp_cat(out, 0, "/volume1/homes/elderwesto/nishihost/" as *u8); o = pp_cat(out, o, name); o = pp_cat(out, o, ".elf" as *u8)
162 if pp_exists(out) == 1 { return 1 }
163 // the estate registers some CLIs under a _cli2 basename (nx_https_get -> nx_https_get_cli2.elf); a plain
164 // <name>.elf may not exist. Fall back so pp_fork resolves the ACTUAL installed binary rather than reporting
165 // a reachable subject UNOBSERVED (the header axis went dark on every surface until this line existed).
166 o = pp_cat(out, 0, name); o = pp_cat(out, o, "_cli2.elf" as *u8)
167 if pp_exists(out) == 1 { return 1 }
168 o = pp_cat(out, 0, "/volume1/homes/elderwesto/nishihost/" as *u8); o = pp_cat(out, o, name); o = pp_cat(out, o, "_cli2.elf" as *u8)
169 if pp_exists(out) == 1 { return 1 }
170 return 0
171}
172func pp_write_atomic(path: *u8, buf: *u8, n: i64) -> i64 {
173 let tmp: *u8 = sys_mmap(PP_NAME_CAP + 8)
174 var o: i64 = pp_cat(tmp, 0, path); o = pp_cat(tmp, o, ".tmp" as *u8)
175 let fd: i64 = sys_openat_wr(tmp, 420)
176 if fd < 0 { return 0 - 1 }
177 var off: i64 = 0
178 while off < n { let r: i64 = sys_write(fd, ((buf as i64) + off) as *u8, n - off); if r <= 0 { sys_close(fd); return 0 - 2 } off = off + r }
179 sys_close(fd)
180 if sys_renameat(tmp, path) != 0 { return 0 - 3 }
181 return 0
182}
183// lowercase copy of buf[0..n) into dst (dst has room for n+1)
184func pp_lower(src: *u8, n: i64, dst: *u8) -> i64 {
185 var i: i64 = 0
186 while i < n { dst[i] = pp_lc(src[i] as i64) as u8; i = i + 1 }
187 dst[n] = 0 as u8
188 return n
189}
190// page host from a url: after :// up to / or : ; registrable domain = last two labels (declared imprecision)
191func pp_host_of(url: *u8, host: *u8, reg: *u8) -> i64 {
192 var i: i64 = 0
193 let n: i64 = pp_len(url)
194 let at: i64 = pp_find(url, n, 0, "://" as *u8)
195 if at >= 0 { i = at + 3 }
196 var o: i64 = 0
197 while i < n {
198 let c: i64 = url[i] as i64
199 if c == 47 { break }
200 if c == 58 { break }
201 if c == 63 { break }
202 if o < PP_HOST_W - 1 { host[o] = pp_lc(c) as u8; o = o + 1 }
203 i = i + 1
204 }
205 host[o] = 0 as u8
206 // registrable = from the second-last dot
207 var dots: i64 = 0
208 var k: i64 = o - 1
209 var start: i64 = 0
210 while k >= 0 {
211 if host[k] == (46 as u8) { dots = dots + 1; if dots == 2 { start = k + 1; k = 0 - 1 } }
212 k = k - 1
213 }
214 var r: i64 = 0
215 var j: i64 = start
216 while j < o { reg[r] = host[j]; r = r + 1; j = j + 1 }
217 reg[r] = 0 as u8
218 return o
219}
220// does host (NUL-term) end with "." + reg, or equal reg?
221func pp_same_site(host: *u8, reg: *u8) -> i64 {
222 let hl: i64 = pp_len(host)
223 let rl: i64 = pp_len(reg)
224 if rl == 0 { return 0 }
225 if hl == rl { if pp_streq(host, reg) == 1 { return 1 } return 0 }
226 if hl < rl + 1 { return 0 }
227 if host[hl - rl - 1] != (46 as u8) { return 0 }
228 var i: i64 = 0
229 while i < rl { if host[hl - rl + i] != reg[i] { return 0 } i = i + 1 }
230 return 1
231}
232// tag containing position p starts with "<script"? (scan back to the opening '<')
233func pp_in_script_tag(lb: *u8, p: i64) -> i64 {
234 var k: i64 = p
235 while k > 0 {
236 let c: i64 = lb[k] as i64
237 if c == 60 { break }
238 if c == 62 { return 0 }
239 k = k - 1
240 }
241 if lb[k] != (60 as u8) { return 0 }
242 if pp_find(lb, k + 8, k, "<script" as *u8) == k { return 1 }
243 return 0
244}
245// distinct src= hosts. out[0]=distinct third-party hosts out[1]=distinct third-party SCRIPT hosts out[2]=all distinct hosts
246// out[3]=1 when the host table brimmed (a floor, not a total)
247func pp_hosts(lb: *u8, n: i64, reg: *u8, out: *i64, names: *u8) -> i64 {
248 let tab: *u8 = sys_mmap(PP_HOSTS_MAX * PP_HOST_W)
249 let kind: *i64 = sys_mmap(PP_HOSTS_MAX * 8) as *i64 // 1 = seen in a script tag
250 var cnt: i64 = 0
251 var brim: i64 = 0
252 var p: i64 = 0
253 let h: *u8 = sys_mmap(PP_HOST_W)
254 while p < n {
255 let at: i64 = pp_find(lb, n, p, "src=" as *u8)
256 if at < 0 { break }
257 var i: i64 = at + 4
258 if i < n { if lb[i] == (34 as u8) { i = i + 1 } else { if lb[i] == (39 as u8) { i = i + 1 } } }
259 var ok: i64 = 0
260 if pp_find(lb, n, i, "https://" as *u8) == i { i = i + 8; ok = 1 } else {
261 if pp_find(lb, n, i, "http://" as *u8) == i { i = i + 7; ok = 1 } else {
262 if i + 1 < n { if lb[i] == (47 as u8) { if lb[i + 1] == (47 as u8) { i = i + 2; ok = 1 } } } } }
263 if ok == 1 {
264 var o: i64 = 0
265 while i < n {
266 let c: i64 = lb[i] as i64
267 if c == 47 { break }
268 if c == 34 { break }
269 if c == 39 { break }
270 if c == 58 { break }
271 if c == 63 { break }
272 if c == 32 { break }
273 if c == 62 { break }
274 if o < PP_HOST_W - 1 { h[o] = c as u8; o = o + 1 }
275 i = i + 1
276 }
277 h[o] = 0 as u8
278 if o > 0 {
279 var found: i64 = 0 - 1
280 var t: i64 = 0
281 while t < cnt { if pp_streq(((tab as i64) + t * PP_HOST_W) as *u8, h) == 1 { found = t; t = cnt } else { t = t + 1 } }
282 let insc: i64 = pp_in_script_tag(lb, at)
283 if found < 0 {
284 if cnt < PP_HOSTS_MAX {
285 pp_cat(((tab as i64) + cnt * PP_HOST_W) as *u8, 0, h)
286 kind[cnt] = insc
287 cnt = cnt + 1
288 } else { brim = 1 }
289 } else { if insc == 1 { kind[found] = 1 } }
290 }
291 }
292 p = at + 4
293 }
294 var tp: i64 = 0
295 var tps: i64 = 0
296 var no: i64 = 0
297 var t2: i64 = 0
298 while t2 < cnt {
299 let hh: *u8 = ((tab as i64) + t2 * PP_HOST_W) as *u8
300 if pp_same_site(hh, reg) == 0 {
301 tp = tp + 1
302 if kind[t2] == 1 { tps = tps + 1 }
303 if no < 400 { if no > 0 { no = pp_cat(names, no, " " as *u8) } no = pp_cat(names, no, hh) }
304 }
305 t2 = t2 + 1
306 }
307 out[0] = tp; out[1] = tps; out[2] = cnt; out[3] = brim
308 return tp
309}
310// tracker marker classes (the Markup Blacklight classes plus the ad-network and replay vendors); returns hits
311func pp_trackers(lb: *u8, n: i64, names: *u8) -> i64 {
312 let pats: *i64 = sys_mmap(32 * 8) as *i64
313 pats[0] = "googletagmanager.com" as i64
314 pats[1] = "google-analytics.com" as i64
315 pats[2] = "gtag(" as i64
316 pats[3] = "fbevents.js" as i64
317 pats[4] = "connect.facebook.net" as i64
318 pats[5] = "hotjar" as i64
319 pats[6] = "fullstory" as i64
320 pats[7] = "clarity.ms" as i64
321 pats[8] = "doubleclick.net" as i64
322 pats[9] = "adsbygoogle" as i64
323 pats[10] = "segment.com" as i64
324 pats[11] = "mixpanel" as i64
325 pats[12] = "amplitude.com" as i64
326 pats[13] = "heapanalytics" as i64
327 pats[14] = "sentry" as i64
328 pats[15] = "intercom" as i64
329 pats[16] = "hubspot" as i64
330 pats[17] = "taboola" as i64
331 pats[18] = "outbrain" as i64
332 pats[19] = "criteo" as i64
333 pats[20] = "fingerprint" as i64
334 pats[21] = "logrocket" as i64
335 pats[22] = "datadoghq" as i64
336 pats[23] = "posthog" as i64
337 let np: i64 = 24
338 var hits: i64 = 0
339 var no: i64 = 0
340 var i: i64 = 0
341 while i < np {
342 if pp_has(lb, n, pats[i] as *u8) == 1 {
343 hits = hits + 1
344 if no < 400 { if no > 0 { no = pp_cat(names, no, " " as *u8) } no = pp_cat(names, no, pats[i] as *u8) }
345 }
346 i = i + 1
347 }
348 return hits
349}
350func pp_consent(lb: *u8, n: i64) -> i64 {
351 var c: i64 = 0
352 if pp_has(lb, n, "cookieconsent" as *u8) == 1 { c = c + 1 }
353 if pp_has(lb, n, "onetrust" as *u8) == 1 { c = c + 1 }
354 if pp_has(lb, n, "cookiebot" as *u8) == 1 { c = c + 1 }
355 if pp_has(lb, n, "consentmanager" as *u8) == 1 { c = c + 1 }
356 if pp_has(lb, n, "cookie-banner" as *u8) == 1 { c = c + 1 }
357 if pp_has(lb, n, "cookie banner" as *u8) == 1 { c = c + 1 }
358 return c
359}
360func pp_cookieless(lb: *u8, n: i64) -> i64 {
361 var c: i64 = 0
362 if pp_has(lb, n, "plausible.io" as *u8) == 1 { c = c + 1 }
363 if pp_has(lb, n, "usefathom" as *u8) == 1 { c = c + 1 }
364 if pp_has(lb, n, "umami" as *u8) == 1 { c = c + 1 }
365 return c
366}
367// inline JS bytes: sum of bytes between <script ...> and </script>
368func pp_inline_js(lb: *u8, n: i64) -> i64 {
369 var total: i64 = 0
370 var p: i64 = 0
371 while p < n {
372 let s: i64 = pp_find(lb, n, p, "<script" as *u8)
373 if s < 0 { break }
374 var e: i64 = s
375 while e < n { if lb[e] == (62 as u8) { break } e = e + 1 }
376 let close: i64 = pp_find(lb, n, e, "</script" as *u8)
377 if close < 0 { break }
378 if close > e + 1 { total = total + (close - e - 1) }
379 p = close + 8
380 }
381 return total
382}
383// declared scoring rules -- every rule is a count against a published bar; printed beside the raw counts.
384// person: max 1000
385func pp_score_person(tp_hosts: i64, tp_script: i64, trackers: i64, consent: i64, setcookie: i64, sec: i64, permpol: i64) -> i64 {
386 var s: i64 = 0
387 if tp_script == 0 { s = s + 250 } else { if tp_script <= 2 { s = s + 100 } }
388 if tp_hosts == 0 { s = s + 150 } else { if tp_hosts <= 3 { s = s + 75 } }
389 if trackers == 0 { s = s + 250 } else { if trackers == 1 { s = s + 100 } }
390 if consent == 0 { s = s + 50 }
391 if setcookie == 0 { s = s + 100 } else { if setcookie == 1 { s = s + 50 } }
392 if sec >= 5 { s = s + 150 } else { if sec >= 3 { s = s + 75 } }
393 if permpol == 1 { s = s + 50 }
394 return s
395}
396// product: max 1000
397func pp_score_product(design: i64, cfails: i64, ctokens: i64, bcss: i64, bjs: i64, unsized: i64, scripts: i64, jsperm: i64, noscript: i64, dark: i64, motion: i64, canonical: i64, doctype: i64) -> i64 {
398 var s: i64 = 0
399 if design >= 0 { s = s + (design * 300) / 12 }
400 if ctokens > 0 { if cfails == 0 { s = s + 150 } } else { s = s + 50 }
401 let blocking: i64 = bcss + bjs
402 if bcss >= 0 { if blocking == 0 { s = s + 150 } else { if blocking <= 2 { s = s + 75 } } }
403 if unsized == 0 { s = s + 100 }
404 if scripts == 0 { s = s + 100 } else { if scripts <= 4 { s = s + 50 } else { if jsperm < 300 { s = s + 25 } } }
405 if noscript == 1 { s = s + 25 }
406 if dark == 1 { s = s + 50 }
407 if motion == 1 { s = s + 25 }
408 if canonical == 1 { s = s + 25 }
409 if doctype == 1 { s = s + 25 }
410 return s
411}
412// place: max 1000
413func pp_score_place(nav: i64, main: i64, footer: i64, skip: i64, search: i64, crumb: i64, h1: i64, links: i64, internal: i64, lang: i64, viewport: i64, title: i64, current: i64) -> i64 {
414 var s: i64 = 0
415 if nav == 1 { s = s + 150 }
416 if main == 1 { s = s + 100 }
417 if footer == 1 { s = s + 50 }
418 if skip == 1 { s = s + 100 }
419 if search == 1 { s = s + 150 }
420 if crumb == 1 { s = s + 100 }
421 if h1 == 1 { s = s + 100 }
422 if internal >= 10 { s = s + 100 } else { if internal >= 3 { s = s + 50 } }
423 if lang == 1 { s = s + 50 }
424 if viewport == 1 { s = s + 50 }
425 if title == 1 { s = s + 25 }
426 if current == 1 { s = s + 25 }
427 return s
428}
429// build the '#' bearing skip pattern at runtime (the lexer trap forbids the byte in a literal)
430func pp_pat_skip(out: *u8) -> i64 {
431 var o: i64 = pp_cat(out, 0, "href=\"" as *u8)
432 out[o] = 35 as u8; o = o + 1
433 o = pp_cat(out, o, "main" as *u8)
434 return o
435}
436func pp_pat_skip2(out: *u8) -> i64 {
437 var o: i64 = pp_cat(out, 0, "href=\"" as *u8)
438 out[o] = 35 as u8; o = o + 1
439 o = pp_cat(out, o, "content" as *u8)
440 return o
441}
442// ---- the measurement over a body already in hand: body (raw) + hdr capture (raw, may be empty) ----
443// m[] slots (i64): 0 tp_hosts 1 tp_script 2 trackers 3 consent 4 cookieless 5 setcookie 6 sec 7 permpol
444// 10 design 11 cfails 12 ctokens 13 bcss 14 bjs 15 unsized 16 scripts 17 jsperm 18 noscript 19 dark 20 motion 21 canonical 22 doctype 23 bytes
445// 30 nav 31 main 32 footer 33 skip 34 search 35 crumb 36 h1 37 links 38 internal 39 lang 40 viewport 41 title 42 current
446// 50 person 51 product 52 place 53 hosts_total 54 hosts_brim 55 status
447func pp_measure(body: *u8, n: i64, hdr: *u8, hn: i64, url: *u8, design: i64, bcss: i64, bjs: i64, unsized: i64, m: *i64, tnames: *u8, hnames: *u8) -> i64 {
448 let lb: *u8 = sys_mmap(n + 16)
449 pp_lower(body, n, lb)
450 let host: *u8 = sys_mmap(PP_HOST_W)
451 let reg: *u8 = sys_mmap(PP_HOST_W)
452 pp_host_of(url, host, reg)
453 let ho: *i64 = sys_mmap(8 * 8) as *i64
454 pp_hosts(lb, n, reg, ho, hnames)
455 m[0] = ho[0]; m[1] = ho[1]; m[53] = ho[2]; m[54] = ho[3]
456 m[2] = pp_trackers(lb, n, tnames)
457 m[3] = pp_consent(lb, n)
458 m[4] = pp_cookieless(lb, n)
459 if hn > 0 {
460 let lh: *u8 = sys_mmap(hn + 16)
461 pp_lower(hdr, hn, lh)
462 // headers end at the first blank line; count only inside that block
463 var he: i64 = pp_find(lh, hn, 0, "\r\n\r\n" as *u8)
464 if he < 0 { he = pp_find(lh, hn, 0, "\n\n" as *u8) }
465 if he < 0 { he = hn }
466 m[5] = pp_count(lh, he, "set-cookie:" as *u8)
467 m[7] = pp_has(lh, he, "permissions-policy:" as *u8)
468 let uo: *i64 = sys_mmap(16 * 8) as *i64
469 uw_audit(hdr, hn, uo)
470 m[6] = uo[7]
471 m[55] = uo[0]
472 } else { m[5] = 0 - 1; m[6] = 0 - 1; m[7] = 0 - 1; m[55] = 0 - 1 }
473 m[10] = design
474 m[12] = 0
475 let tcap: i64 = 96
476 let toff: *i64 = sys_mmap(tcap * 8) as *i64
477 let tlen: *i64 = sys_mmap(tcap * 8) as *i64
478 let trgb: *i64 = sys_mmap(tcap * 24) as *i64
479 m[12] = uiq_scan_tokens(body, n, toff, tlen, trgb, tcap)
480 m[11] = uiq_audit_buf(body, n, 0)
481 m[13] = bcss; m[14] = bjs; m[15] = unsized
482 m[16] = pp_count(lb, n, "<script" as *u8)
483 let js: i64 = pp_inline_js(lb, n)
484 if n > 0 { m[17] = (js * 1000) / n } else { m[17] = 0 }
485 m[18] = pp_has(lb, n, "<noscript" as *u8)
486 m[19] = pp_has(lb, n, "prefers-color-scheme" as *u8)
487 m[20] = pp_has(lb, n, "prefers-reduced-motion" as *u8)
488 m[21] = pp_has_attr(lb, n, "rel" as *u8, "canonical" as *u8)
489 m[22] = pp_has(lb, n, "doctype html" as *u8)
490 m[23] = n
491 m[30] = pp_has(lb, n, "<nav" as *u8)
492 m[31] = pp_has(lb, n, "<main" as *u8)
493 if m[31] == 0 { m[31] = pp_has_attr(lb, n, "role" as *u8, "main" as *u8) }
494 m[32] = pp_has(lb, n, "<footer" as *u8)
495 let sk: *u8 = sys_mmap(64)
496 pp_pat_skip(sk)
497 var skip: i64 = pp_has(lb, n, sk)
498 if skip == 0 { pp_pat_skip2(sk); skip = pp_has(lb, n, sk) }
499 if skip == 0 { skip = pp_has(lb, n, "skip to content" as *u8) }
500 if skip == 0 { skip = pp_has(lb, n, "skip-link" as *u8) }
501 m[33] = skip
502 var search: i64 = pp_has_attr(lb, n, "role" as *u8, "search" as *u8)
503 if search == 0 { search = pp_has_attr(lb, n, "type" as *u8, "search" as *u8) }
504 m[34] = search
505 var crumb: i64 = pp_has(lb, n, "breadcrumb" as *u8)
506 m[35] = crumb
507 m[36] = pp_count(lb, n, "<h1" as *u8)
508 m[37] = pp_count(lb, n, "<a " as *u8)
509 m[38] = pp_count(lb, n, "href=\"/" as *u8) + pp_count(lb, n, "href='/" as *u8)
510 m[39] = pp_has(lb, n, " lang=" as *u8)
511 m[40] = pp_has_attr(lb, n, "name" as *u8, "viewport" as *u8)
512 m[41] = pp_has(lb, n, "<title" as *u8)
513 m[42] = pp_has(lb, n, "aria-current" as *u8)
514 var h1one: i64 = 0
515 if m[36] == 1 { h1one = 1 }
516 var sec: i64 = m[6]
517 if sec < 0 { sec = 0 }
518 var sc: i64 = m[5]
519 if sc < 0 { sc = 1 } // unobserved cookies: no credit for "none"
520 var pp: i64 = m[7]
521 if pp < 0 { pp = 0 }
522 m[50] = pp_score_person(m[0], m[1], m[2], m[3], sc, sec, pp)
523 m[51] = pp_score_product(m[10], m[11], m[12], m[13], m[14], m[15], m[16], m[17], m[18], m[19], m[20], m[21], m[22])
524 m[52] = pp_score_place(m[30], m[31], m[32], m[33], m[34], m[35], h1one, m[37], m[38], m[39], m[40], m[41], m[42])
525 return 0
526}
527func pp_kv(d: *u8, o: i64, k: *u8, v: i64) -> i64 {
528 var p: i64 = pp_cat(d, o, "\"" as *u8); p = pp_cat(d, p, k); p = pp_cat(d, p, "\":" as *u8); p = pp_catn(d, p, v); return p
529}
530func pp_ks(d: *u8, o: i64, k: *u8, v: *u8) -> i64 {
531 var p: i64 = pp_cat(d, o, "\"" as *u8); p = pp_cat(d, p, k); p = pp_cat(d, p, "\":\"" as *u8)
532 var i: i64 = 0
533 while v[i] != (0 as u8) { let c: i64 = v[i] as i64; if c == 34 { d[p] = 39 as u8 } else { if c == 92 { d[p] = 47 as u8 } else { if c < 32 { d[p] = 32 as u8 } else { d[p] = c as u8 } } } p = p + 1; i = i + 1 }
534 d[p] = 0 as u8
535 p = pp_cat(d, p, "\"" as *u8)
536 return p
537}
538func pp_emit_json(out: *u8, col: *u8, label: *u8, url: *u8, m: *i64, tnames: *u8, hnames: *u8, unobs: *u8) -> i64 {
539 var p: i64 = pp_cat(out, 0, "{" as *u8)
540 p = pp_ks(out, p, "organ" as *u8, "nx_ppp_probe" as *u8); p = pp_cat(out, p, "," as *u8)
541 p = pp_ks(out, p, "col" as *u8, col); p = pp_cat(out, p, "," as *u8)
542 p = pp_ks(out, p, "label" as *u8, label); p = pp_cat(out, p, "," as *u8)
543 p = pp_ks(out, p, "url" as *u8, url); p = pp_cat(out, p, "," as *u8)
544 p = pp_kv(out, p, "asof" as *u8, sys_now_realtime_sec()); p = pp_cat(out, p, "," as *u8)
545 p = pp_kv(out, p, "status" as *u8, m[55]); p = pp_cat(out, p, "," as *u8)
546 p = pp_kv(out, p, "bytes" as *u8, m[23]); p = pp_cat(out, p, "," as *u8)
547 p = pp_cat(out, p, "\"person\":{" as *u8)
548 p = pp_kv(out, p, "score_permil" as *u8, m[50]); p = pp_cat(out, p, "," as *u8)
549 p = pp_kv(out, p, "third_party_hosts" as *u8, m[0]); p = pp_cat(out, p, "," as *u8)
550 p = pp_kv(out, p, "third_party_script_hosts" as *u8, m[1]); p = pp_cat(out, p, "," as *u8)
551 p = pp_kv(out, p, "hosts_total" as *u8, m[53]); p = pp_cat(out, p, "," as *u8)
552 p = pp_kv(out, p, "hosts_brim" as *u8, m[54]); p = pp_cat(out, p, "," as *u8)
553 p = pp_ks(out, p, "third_party_names" as *u8, hnames); p = pp_cat(out, p, "," as *u8)
554 p = pp_kv(out, p, "tracker_hits" as *u8, m[2]); p = pp_cat(out, p, "," as *u8)
555 p = pp_ks(out, p, "tracker_names" as *u8, tnames); p = pp_cat(out, p, "," as *u8)
556 p = pp_kv(out, p, "consent_markers" as *u8, m[3]); p = pp_cat(out, p, "," as *u8)
557 p = pp_kv(out, p, "cookieless_analytics" as *u8, m[4]); p = pp_cat(out, p, "," as *u8)
558 p = pp_kv(out, p, "set_cookie" as *u8, m[5]); p = pp_cat(out, p, "," as *u8)
559 p = pp_kv(out, p, "sec_headers" as *u8, m[6]); p = pp_cat(out, p, "," as *u8)
560 p = pp_kv(out, p, "permissions_policy" as *u8, m[7]); p = pp_cat(out, p, "}," as *u8)
561 p = pp_cat(out, p, "\"product\":{" as *u8)
562 p = pp_kv(out, p, "score_permil" as *u8, m[51]); p = pp_cat(out, p, "," as *u8)
563 p = pp_kv(out, p, "design_hygiene" as *u8, m[10]); p = pp_cat(out, p, "," as *u8)
564 p = pp_kv(out, p, "design_max" as *u8, 12); p = pp_cat(out, p, "," as *u8)
565 p = pp_kv(out, p, "contrast_fails" as *u8, m[11]); p = pp_cat(out, p, "," as *u8)
566 p = pp_kv(out, p, "contrast_tokens" as *u8, m[12]); p = pp_cat(out, p, "," as *u8)
567 p = pp_kv(out, p, "blocking_css" as *u8, m[13]); p = pp_cat(out, p, "," as *u8)
568 p = pp_kv(out, p, "blocking_js" as *u8, m[14]); p = pp_cat(out, p, "," as *u8)
569 p = pp_kv(out, p, "unsized_media" as *u8, m[15]); p = pp_cat(out, p, "," as *u8)
570 p = pp_kv(out, p, "script_tags" as *u8, m[16]); p = pp_cat(out, p, "," as *u8)
571 p = pp_kv(out, p, "inline_js_permil" as *u8, m[17]); p = pp_cat(out, p, "," as *u8)
572 p = pp_kv(out, p, "noscript" as *u8, m[18]); p = pp_cat(out, p, "," as *u8)
573 p = pp_kv(out, p, "dark_mode" as *u8, m[19]); p = pp_cat(out, p, "," as *u8)
574 p = pp_kv(out, p, "reduced_motion" as *u8, m[20]); p = pp_cat(out, p, "," as *u8)
575 p = pp_kv(out, p, "canonical" as *u8, m[21]); p = pp_cat(out, p, "," as *u8)
576 p = pp_kv(out, p, "doctype" as *u8, m[22]); p = pp_cat(out, p, "}," as *u8)
577 p = pp_cat(out, p, "\"place\":{" as *u8)
578 p = pp_kv(out, p, "score_permil" as *u8, m[52]); p = pp_cat(out, p, "," as *u8)
579 p = pp_kv(out, p, "nav" as *u8, m[30]); p = pp_cat(out, p, "," as *u8)
580 p = pp_kv(out, p, "main" as *u8, m[31]); p = pp_cat(out, p, "," as *u8)
581 p = pp_kv(out, p, "footer" as *u8, m[32]); p = pp_cat(out, p, "," as *u8)
582 p = pp_kv(out, p, "skip_link" as *u8, m[33]); p = pp_cat(out, p, "," as *u8)
583 p = pp_kv(out, p, "site_search" as *u8, m[34]); p = pp_cat(out, p, "," as *u8)
584 p = pp_kv(out, p, "breadcrumb" as *u8, m[35]); p = pp_cat(out, p, "," as *u8)
585 p = pp_kv(out, p, "h1_count" as *u8, m[36]); p = pp_cat(out, p, "," as *u8)
586 p = pp_kv(out, p, "links" as *u8, m[37]); p = pp_cat(out, p, "," as *u8)
587 p = pp_kv(out, p, "internal_links" as *u8, m[38]); p = pp_cat(out, p, "," as *u8)
588 p = pp_kv(out, p, "lang" as *u8, m[39]); p = pp_cat(out, p, "," as *u8)
589 p = pp_kv(out, p, "viewport" as *u8, m[40]); p = pp_cat(out, p, "," as *u8)
590 p = pp_kv(out, p, "title" as *u8, m[41]); p = pp_cat(out, p, "," as *u8)
591 p = pp_kv(out, p, "aria_current" as *u8, m[42]); p = pp_cat(out, p, "}," as *u8)
592 p = pp_ks(out, p, "unobserved" as *u8, unobs); p = pp_cat(out, p, "," as *u8)
593 p = pp_ks(out, p, "envelope" as *u8, "static HTML + response headers over the sovereign TLS stack; no render, no script execution; a client-rendered app is graded on what a no-JS first visitor receives; -1 = unobserved (scores zero for that rule, never acquitted); registrable domain = last two labels" as *u8)
594 p = pp_cat(out, p, "}" as *u8)
595 return p
596}
597// fork a promoted ruler with argv and capture stdout; returns bytes captured (0 = unobserved)
598func pp_fork(name: *u8, a1: *u8, a2: *u8, out: *u8, cap: i64) -> i64 {
599 let elf: *u8 = sys_mmap(PP_NAME_CAP)
600 if pp_elf(name, elf) == 0 { return 0 }
601 let av: *i64 = sys_mmap(8 * 8) as *i64
602 av[0] = elf as i64
603 av[1] = a1 as i64
604 var an: i64 = 2
605 if (a2 as i64) != 0 { av[2] = a2 as i64; an = 3 }
606 av[an] = 0
607 let ol: *i64 = sys_mmap(16) as *i64
608 tr_run_capture_to(elf, av, out, cap, ol, PP_FORK_MS)
609 return ol[0]
610}
611// probe one url end to end -> JSON in out; returns json length, or a negative code
612func pp_probe_url(url: *u8, connect: *u8, col: *u8, label: *u8, store: *TrustStore, out: *u8) -> i64 {
613 if (connect as i64) != 0 { nx_https_connect_override_set(connect) }
614 let unobs: *u8 = sys_mmap(512)
615 var uo: i64 = 0
616 // PRIMARY FETCH via the sovereign GET CLI: it leads with the Chrome-JA3 hello, which completes the
617 // handshake at Cloudflare-fronted rivals (civitai/HF/syosetu) that RST the minimal in-process hello,
618 // and it prints the status line + headers + DECODED body in one stream -- so ONE fetch yields BOTH the
619 // header axis (privacy/security) and the body axis. A fork empty under load is not an unreachable
620 // subject: one bounded retry (nx_ui_audit's paid lesson). resp holds the raw CLI stream (diagnostics,
621 // then the HTTP response); httppos anchors the parse past the diagnostic prefix.
622 let resp: *u8 = sys_mmap(PP_HDR_CAP + 16)
623 var rn: i64 = pp_fork("nx_https_get_cli2" as *u8, url, connect, resp, PP_HDR_CAP)
624 if rn < 16 { rn = pp_fork("nx_https_get_cli2" as *u8, url, connect, resp, PP_HDR_CAP) }
625 let body: *u8 = sys_mmap(PP_BODY_CAP + 16)
626 var n: i64 = 0
627 var hdr: *u8 = resp
628 var hn: i64 = 0
629 var httppos: i64 = 0 - 1
630 if rn >= 16 { httppos = pp_find(resp, rn, 0, "HTTP/" as *u8) }
631 if httppos >= 0 {
632 let sep: i64 = pp_find(resp, rn, httppos, "\r\n\r\n" as *u8)
633 if sep >= 0 {
634 hdr = (resp as i64 + httppos) as *u8
635 hn = sep + 4 - httppos
636 let bstart: i64 = sep + 4
637 var bl: i64 = rn - bstart
638 if bl < 0 { bl = 0 }
639 if bl > PP_BODY_CAP { bl = PP_BODY_CAP }
640 var c: i64 = 0
641 while c < bl { body[c] = resp[bstart + c]; c = c + 1 }
642 n = bl
643 }
644 }
645 // FALLBACK: the low-level GET does not follow redirects, so a redirecting front door yields only a stub.
646 // The in-process ladder DOES follow redirects; take it whenever it delivers a fuller body (headers are
647 // then UNOBSERVED, honestly declared). Only reached when the CLI body is short -- our own surfaces land
648 // here only if the CLI failed outright. It writes into body, so it is used only when it beats the CLI.
649 if n < PP_MIN_BYTES {
650 let st: *i64 = sys_mmap(16) as *i64
651 var n2: i64 = nx_https_fetch_follow(url, store, body, PP_BODY_CAP, 5, st)
652 if n2 <= 0 { n2 = nx_https_fetch_follow(url, store, body, PP_BODY_CAP, 5, st) }
653 if n2 > n { n = n2; hn = 0 }
654 }
655 if n <= 0 { return 0 - 4 }
656 if n < PP_MIN_BYTES { return 0 - 5 }
657 if n >= PP_BODY_CAP { uo = pp_cat(unobs, uo, "body-brim " as *u8) }
658 if hn == 0 { uo = pp_cat(unobs, uo, "headers " as *u8) }
659 // design hygiene: nx_ui_audit fetches the url itself and prints "score":N
660 let dbuf: *u8 = sys_mmap(PP_FORK_CAP)
661 var design: i64 = 0 - 1
662 let dn: i64 = pp_fork("nx_ui_audit" as *u8, url, connect, dbuf, PP_FORK_CAP)
663 if dn > 0 { design = pp_json_int(dbuf, dn, "\"score\":" as *u8) }
664 if design < 0 { uo = pp_cat(unobs, uo, "design-hygiene " as *u8) }
665 // static CWV predictor over the saved body
666 var bcss: i64 = 0 - 1
667 var bjs: i64 = 0 - 1
668 var unsized: i64 = 0 - 1
669 if pp_write_atomic(PP_TMP_BODY, body, n) == 0 {
670 let pbuf: *u8 = sys_mmap(PP_FORK_CAP)
671 let pn: i64 = pp_fork("nx_uiq_perf" as *u8, PP_TMP_BODY, 0 as *u8, pbuf, PP_FORK_CAP)
672 if pn > 0 {
673 bcss = pp_json_int(pbuf, pn, "\"blocking_css\":" as *u8)
674 bjs = pp_json_int(pbuf, pn, "\"blocking_js\":" as *u8)
675 unsized = pp_json_int(pbuf, pn, "\"unsized_media\":" as *u8)
676 }
677 }
678 if bcss < 0 { uo = pp_cat(unobs, uo, "cwv-predictor " as *u8) }
679 let m: *i64 = sys_mmap(64 * 8) as *i64
680 var z: i64 = 0
681 while z < 64 { m[z] = 0; z = z + 1 }
682 let tnames: *u8 = sys_mmap(512)
683 let hnames: *u8 = sys_mmap(512)
684 tnames[0] = 0 as u8; hnames[0] = 0 as u8
685 pp_measure(body, n, hdr, hn, url, design, bcss, bjs, unsized, m, tnames, hnames)
686 if m[54] == 1 { uo = pp_cat(unobs, uo, "host-table-brim " as *u8) }
687 sys_free_file(body, PP_BODY_CAP + 16)
688 return pp_emit_json(out, col, label, url, m, tnames, hnames, unobs)
689}
690func pp_store() -> *TrustStore {
691 var lr: i64 = nx_trust_store_load_from_certdata("data/mozilla_certdata.txt" as *u8, 300, PP_CERT_CAP * 8)
692 if lr <= 0 { lr = nx_trust_store_load_from_certdata("../data/mozilla_certdata.txt" as *u8, 300, PP_CERT_CAP * 8) }
693 if lr <= 0 { return 0 as *TrustStore }
694 return lr as *TrustStore
695}
696// ---- fixtures: the bite proof. good page vs tracked page must flip PERSON; landmarks vs bare must flip PLACE;
697// a failing contrast token vs a passing one must flip PRODUCT. ----
698func pp_kat() -> i64 {
699 var f: i64 = 0
700 let good: *u8 = "<html lang=\"en\"><head><title>t</title><meta name=\"viewport\" content=\"width=device-width\"><link rel=\"canonical\" href=\"/x\"><style>:root{--fg:rgb(17,17,17);--bg:rgb(255,255,255)}@media (prefers-color-scheme:dark){:root{--fg:rgb(238,238,238);--bg:rgb(17,17,17)}}@media (prefers-reduced-motion:reduce){*{animation:none}}</style></head><body><a class=\"skip-link\" href=\"/x\">skip to content</a><nav aria-label=\"breadcrumb\"><a href=\"/\">home</a><a href=\"/a\">a</a><a href=\"/b\">b</a></nav><main><h1>h</h1><form role=\"search\"><input type=\"search\"></form><a href=\"/c\" aria-current=\"page\">c</a></main><footer>f</footer></body></html>" as *u8
701 let bad: *u8 = "<div><script src=\"https://www.googletagmanager.com/gtag/js\"></script><script src=\"https://cdn.example-tracker.net/x.js\"></script><img src=\"https://ads.doubleclick.net/p.gif\"><script>document.write(1)</script><div class=\"onetrust-banner\">cookie</div><p>text</p></div>" as *u8
702 let gn: i64 = pp_len(good)
703 let bn: i64 = pp_len(bad)
704 let hdr: *u8 = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nX-Content-Type-Options: nosniff\r\nX-Frame-Options: DENY\r\nContent-Security-Policy: default-src 'self'\r\nReferrer-Policy: no-referrer\r\nStrict-Transport-Security: max-age=1\r\nPermissions-Policy: camera=()\r\n\r\n<x>" as *u8
705 let hdrbad: *u8 = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nSet-Cookie: a=1\r\nSet-Cookie: b=2\r\n\r\n<x>" as *u8
706 let m: *i64 = sys_mmap(64 * 8) as *i64
707 let m2: *i64 = sys_mmap(64 * 8) as *i64
708 var z: i64 = 0
709 while z < 64 { m[z] = 0; m2[z] = 0; z = z + 1 }
710 let t1: *u8 = sys_mmap(512); let h1: *u8 = sys_mmap(512); t1[0] = 0 as u8; h1[0] = 0 as u8
711 let t2: *u8 = sys_mmap(512); let h2: *u8 = sys_mmap(512); t2[0] = 0 as u8; h2[0] = 0 as u8
712 pp_measure(good, gn, hdr, pp_len(hdr), "https://nishifamily.com/x" as *u8, 12, 0, 0, 0, m, t1, h1)
713 pp_measure(bad, bn, hdrbad, pp_len(hdrbad), "https://example.com/" as *u8, 0, 0, 2, 1, m2, t2, h2)
714 // 2026-08-25: this printed a LABEL, then an EMPTY string, with no value and no line ending -- so the
715 // score it names was never shown AND the next tooth (T1) was swallowed onto this same line, making it
716 // uncountable from outside. nx_ppp_probe_gate found it by counting teeth and reading 19 of 20.
717 // FIX THE EMITTER, NEVER WIDEN THE READER: print the value, then end the line.
718 let pnb: *u8 = sys_mmap(PP_NUMBUF_CAP)
719 pp_w(" fixture good: person=" as *u8); pp_catn(pnb, 0, m[50]); pp_w(pnb); pp_w("\n" as *u8)
720 // T1 person: the tracked page must score strictly lower, with the trackers NAMED
721 if m2[50] >= m[50] { f = f + 1; pp_w(" T1 FAIL person did not flip\n" as *u8) } else { pp_w(" T1 person flips (good vs tracked)\n" as *u8) }
722 if m2[2] < 2 { f = f + 1; pp_w(" T2 FAIL tracker markers not found\n" as *u8) } else { pp_w(" T2 tracker markers named\n" as *u8) }
723 if m2[1] < 2 { f = f + 1; pp_w(" T3 FAIL third-party script hosts not counted\n" as *u8) } else { pp_w(" T3 third-party script hosts counted\n" as *u8) }
724 if m[0] != 0 { f = f + 1; pp_w(" T4 FAIL neg-control: clean page reports third-party hosts\n" as *u8) } else { pp_w(" T4 neg-control clean page has zero third-party hosts\n" as *u8) }
725 if m[6] != 5 { f = f + 1; pp_w(" T5 FAIL security headers 5/5 not read\n" as *u8) } else { pp_w(" T5 security headers 5/5 read from the wire\n" as *u8) }
726 if m2[5] != 2 { f = f + 1; pp_w(" T6 FAIL set-cookie count\n" as *u8) } else { pp_w(" T6 set-cookie counted\n" as *u8) }
727 // T7 place: landmarks must flip
728 if m2[52] >= m[52] { f = f + 1; pp_w(" T7 FAIL place did not flip\n" as *u8) } else { pp_w(" T7 place flips (landmarks vs bare)\n" as *u8) }
729 if m[33] != 1 { f = f + 1; pp_w(" T8 FAIL skip link not seen\n" as *u8) } else { pp_w(" T8 skip link seen\n" as *u8) }
730 if m[34] != 1 { f = f + 1; pp_w(" T9 FAIL site search not seen\n" as *u8) } else { pp_w(" T9 site search seen\n" as *u8) }
731 if m[38] < 3 { f = f + 1; pp_w(" T10 FAIL internal links not counted\n" as *u8) } else { pp_w(" T10 internal links counted\n" as *u8) }
732 // T11 product: design + tokens + dark + motion must lift; the tracked page has a blocking script
733 if m2[51] >= m[51] { f = f + 1; pp_w(" T11 FAIL product did not flip\n" as *u8) } else { pp_w(" T11 product flips\n" as *u8) }
734 if m[19] != 1 { f = f + 1; pp_w(" T12 FAIL dark mode not seen\n" as *u8) } else { pp_w(" T12 dark-mode query seen\n" as *u8) }
735 if m[12] < 2 { f = f + 1; pp_w(" T13 FAIL color tokens not scanned\n" as *u8) } else { pp_w(" T13 color tokens scanned by nx_uiq_color\n" as *u8) }
736 // T14 unobserved third state: headers absent -> sec_headers == -1, never 0
737 pp_measure(good, gn, hdr, 0, "https://nishifamily.com/x" as *u8, 0 - 1, 0 - 1, 0 - 1, 0 - 1, m, t1, h1)
738 if m[6] != 0 - 1 { f = f + 1; pp_w(" T14 FAIL unobserved headers not reported as -1\n" as *u8) } else { pp_w(" T14 unobserved headers read -1, not 0\n" as *u8) }
739 // T15 json emits and parses back
740 let out: *u8 = sys_mmap(PP_OUT_CAP)
741 let jl: i64 = pp_emit_json(out, "c1" as *u8, "fixture" as *u8, "https://nishifamily.com/x" as *u8, m, t1, h1, "headers " as *u8)
742 if pp_json_int(out, jl, "\"nav\":" as *u8) != 1 { f = f + 1; pp_w(" T15 FAIL json round-trip\n" as *u8) } else { pp_w(" T15 json round-trip\n" as *u8) }
743 // T16-T19 SINGLE-QUOTED ATTRIBUTES -- the bite proof for pp_has_attr. MEASURED 2026-08-25: the live
744 // /games page emits <meta name='viewport' ...> and the pre-fix probe scored viewport=0 on a page that
745 // is CORRECT -- a false negative inside a PUBLISHED competitive score. This fixture means the same as
746 // `good` but is single-quoted throughout, so a matcher that only knows double quotes CANNOT pass it.
747 let sq: *u8 = "<html lang='en'><head><title>t</title><meta name='viewport' content='width=device-width'><link rel='canonical' href='/x'></head><body><div role='main'><h1>h</h1><form role='search'><input type='search'></form></div></body></html>" as *u8
748 let m3: *i64 = sys_mmap(64 * 8) as *i64
749 var z3: i64 = 0
750 while z3 < 64 { m3[z3] = 0; z3 = z3 + 1 }
751 let t3: *u8 = sys_mmap(512); let h3: *u8 = sys_mmap(512); t3[0] = 0 as u8; h3[0] = 0 as u8
752 pp_measure(sq, pp_len(sq), hdr, pp_len(hdr), "https://nishifamily.com/x" as *u8, 0, 0, 0, 0, m3, t3, h3)
753 if m3[40] != 1 { f = f + 1; pp_w(" T16 FAIL single-quoted viewport not seen\n" as *u8) } else { pp_w(" T16 single-quoted viewport seen\n" as *u8) }
754 if m3[21] != 1 { f = f + 1; pp_w(" T17 FAIL single-quoted canonical not seen\n" as *u8) } else { pp_w(" T17 single-quoted canonical seen\n" as *u8) }
755 if m3[31] != 1 { f = f + 1; pp_w(" T18 FAIL single-quoted role=main not seen\n" as *u8) } else { pp_w(" T18 single-quoted role=main seen\n" as *u8) }
756 if m3[34] != 1 { f = f + 1; pp_w(" T19 FAIL single-quoted role/type=search not seen\n" as *u8) } else { pp_w(" T19 single-quoted role/type=search seen\n" as *u8) }
757 // T20 NEG-CONTROL: a page with NO viewport must still read 0. A matcher that says yes to everything
758 // passes every positive test and is not a matcher.
759 let nov: *u8 = "<html lang='en'><head><title>t</title></head><body><p>x</p></body></html>" as *u8
760 let m4: *i64 = sys_mmap(64 * 8) as *i64
761 var z4: i64 = 0
762 while z4 < 64 { m4[z4] = 0; z4 = z4 + 1 }
763 let t4: *u8 = sys_mmap(512); let h4: *u8 = sys_mmap(512); t4[0] = 0 as u8; h4[0] = 0 as u8
764 pp_measure(nov, pp_len(nov), hdr, pp_len(hdr), "https://nishifamily.com/x" as *u8, 0, 0, 0, 0, m4, t4, h4)
765 if m4[40] != 0 { f = f + 1; pp_w(" T20 FAIL neg-control-absent-viewport reported present\n" as *u8) } else { pp_w(" T20 neg-control-absent-viewport reads 0\n" as *u8) }
766 return f
767}
768// ---- domain verb: read <dom>.ppp, probe every surface, write <dom>.pppstate ----
769func pp_split(line: *u8, fld: *i64, maxf: i64) -> i64 {
770 var nf: i64 = 0
771 var i: i64 = 0
772 fld[0] = line as i64
773 nf = 1
774 while line[i] != (0 as u8) {
775 if line[i] == (124 as u8) { line[i] = 0 as u8; if nf < maxf { fld[nf] = (line as i64) + i + 1; nf = nf + 1 } }
776 i = i + 1
777 }
778 return nf
779}
780func pp_domain(dom: *u8) -> i64 {
781 let ppath: *u8 = sys_mmap(PP_NAME_CAP)
782 let base: *u8 = sys_mmap(PP_NAME_CAP)
783 var bo: i64 = pp_cat(base, 0, "knowledge/compare/" as *u8)
784 var o: i64 = pp_cat(ppath, 0, base); o = pp_cat(ppath, o, dom); o = pp_cat(ppath, o, ".ppp" as *u8)
785 if pp_exists(ppath) == 0 {
786 bo = pp_cat(base, 0, "buildroot/knowledge/compare/" as *u8)
787 o = pp_cat(ppath, 0, base); o = pp_cat(ppath, o, dom); o = pp_cat(ppath, o, ".ppp" as *u8)
788 }
789 let ln: *i64 = sys_mmap(16) as *i64
790 let txt: *u8 = sys_read_file(ppath, ln)
791 if (txt as i64) == 0 { pp_w("PPP-PROBE no .ppp file for domain " as *u8); pp_w(dom); pp_w(" (looked in knowledge/compare and buildroot/knowledge/compare)\n" as *u8); return 2 }
792 let n: i64 = ln[0]
793 let store: *TrustStore = pp_store()
794 if (store as i64) == 0 { pp_w("PPP-PROBE trust store unreadable (data/mozilla_certdata.txt) -- refusing to grade\n" as *u8); return 4 }
795 let state: *u8 = sys_mmap(PP_STATE_CAP)
796 state[0] = 35 as u8
797 var so: i64 = pp_cat(state, 1, " " as *u8)
798 so = pp_cat(state, so, dom)
799 so = pp_cat(state, so, ".pppstate -- NX-DERIVED: regenerated artefact, not authored memory (nx_ppp_probe). rows: ppp|<col>|<label>|<url>|<json> . last line = stamp\n" as *u8)
800 let fld: *i64 = sys_mmap(16 * 8) as *i64
801 let line: *u8 = sys_mmap(PP_LINE_CAP)
802 let out: *u8 = sys_mmap(PP_OUT_CAP)
803 var surfaces: i64 = 0
804 var probed: i64 = 0
805 var p: i64 = 0
806 while p < n {
807 var e: i64 = p
808 while e < n { if txt[e] == (10 as u8) { break } e = e + 1 }
809 var li: i64 = 0
810 var k: i64 = p
811 while k < e { if li < PP_LINE_CAP - 1 { line[li] = txt[k]; li = li + 1 } k = k + 1 }
812 line[li] = 0 as u8
813 p = e + 1
814 if line[0] == (115 as u8) {
815 let nf: i64 = pp_split(line, fld, 16)
816 if pp_streq(fld[0] as *u8, "surface" as *u8) == 1 { if nf >= 5 {
817 surfaces = surfaces + 1
818 if surfaces <= PP_MAX_SURFACES {
819 let col: *u8 = fld[1] as *u8
820 let label: *u8 = fld[2] as *u8
821 let url: *u8 = fld[3] as *u8
822 var connect: *u8 = fld[4] as *u8
823 if pp_streq(connect, "-" as *u8) == 1 { connect = 0 as *u8 }
824 pp_w("PPP-PROBE " as *u8); pp_w(col); pp_w(" " as *u8); pp_w(url); pp_w("\n" as *u8)
825 let jl: i64 = pp_probe_url(url, connect, col, label, store, out)
826 if jl > 0 {
827 probed = probed + 1
828 so = pp_cat(state, so, "ppp|" as *u8); so = pp_cat(state, so, col); so = pp_cat(state, so, "|" as *u8)
829 so = pp_cat(state, so, label); so = pp_cat(state, so, "|" as *u8); so = pp_cat(state, so, url); so = pp_cat(state, so, "|" as *u8)
830 var q: i64 = 0
831 while q < jl { if so < PP_STATE_CAP - 2 { state[so] = out[q]; so = so + 1 } q = q + 1 }
832 state[so] = 10 as u8; so = so + 1; state[so] = 0 as u8
833 pp_w(" ok " as *u8); pp_w("person=" as *u8); pp_w("" as *u8)
834 pp_w("\n" as *u8)
835 } else {
836 so = pp_cat(state, so, "ppp|" as *u8); so = pp_cat(state, so, col); so = pp_cat(state, so, "|" as *u8)
837 so = pp_cat(state, so, label); so = pp_cat(state, so, "|" as *u8); so = pp_cat(state, so, url); so = pp_cat(state, so, "|{\"organ\":\"nx_ppp_probe\",\"unreachable\":" as *u8)
838 so = pp_catn(state, so, 0 - jl); so = pp_cat(state, so, "}\n" as *u8)
839 pp_w(" UNREACHABLE code=" as *u8); pp_w("\n" as *u8)
840 }
841 }
842 } }
843 }
844 }
845 state[so] = 35 as u8; so = so + 1
846 so = pp_cat(state, so, " asof=" as *u8); so = pp_catn(state, so, sys_now_realtime_sec())
847 so = pp_cat(state, so, " domain=" as *u8); so = pp_cat(state, so, dom)
848 so = pp_cat(state, so, " surfaces=" as *u8); so = pp_catn(state, so, surfaces)
849 so = pp_cat(state, so, " probed=" as *u8); so = pp_catn(state, so, probed)
850 so = pp_cat(state, so, " ruler=nx_ppp_probe\n" as *u8)
851 let spath: *u8 = sys_mmap(PP_NAME_CAP)
852 var po: i64 = pp_cat(spath, 0, base); po = pp_cat(spath, po, dom); po = pp_cat(spath, po, ".pppstate" as *u8)
853 let wr: i64 = pp_write_atomic(spath, state, so)
854 pp_w("PPP-PROBE domain=" as *u8); pp_w(dom); pp_w(" surfaces=" as *u8); pp_w("" as *u8)
855 let nb: *u8 = sys_mmap(64)
856 pp_catn(nb, 0, surfaces); pp_w(nb); pp_w(" probed=" as *u8); pp_catn(nb, 0, probed); pp_w(nb)
857 pp_w(" wrote=" as *u8); pp_catn(nb, 0, so); pp_w(nb); pp_w(" of=" as *u8); pp_w(spath)
858 if wr != 0 { pp_w(" WRITE-FAILED" as *u8) }
859 pp_w("\n" as *u8)
860 if probed == 0 { return 4 }
861 return 0
862}
863func main(argc: i64, argv: *i64) -> i64 {
864 if argc < 2 { pp_w("usage: nx_ppp_probe url <url> [connect-host:port] | domain <dom> | --kat\n" as *u8); sys_exit(2); return 2 }
865 let verb: *u8 = argv[1] as *u8
866 if verb[0] == (45 as u8) {
867 pp_w("=== nx_ppp_probe --kat (person / product / place, bite-proven on fixtures) ===\n" as *u8)
868 let f: i64 = pp_kat()
869 pp_w("checks failed=" as *u8)
870 let nb: *u8 = sys_mmap(32)
871 pp_catn(nb, 0, f); pp_w(nb); pp_w("\n" as *u8)
872 if f == 0 { pp_w("VERDICT=GREEN\n" as *u8); sys_exit(0); return 0 }
873 pp_w("VERDICT=RED\n" as *u8); sys_exit(1); return 1
874 }
875 if pp_streq(verb, "url" as *u8) == 1 {
876 if argc < 3 { pp_w("usage: nx_ppp_probe url <url> [connect-host:port]\n" as *u8); sys_exit(2); return 2 }
877 let url: *u8 = argv[2] as *u8
878 var connect: *u8 = 0 as *u8
879 if argc >= 4 { connect = argv[3] as *u8 }
880 let store: *TrustStore = pp_store()
881 if (store as i64) == 0 { pp_w("PPP-PROBE trust store unreadable (data/mozilla_certdata.txt) -- refusing to grade\n" as *u8); sys_exit(4); return 4 }
882 let out: *u8 = sys_mmap(PP_OUT_CAP)
883 let jl: i64 = pp_probe_url(url, connect, "-" as *u8, "-" as *u8, store, out)
884 if jl <= 0 {
885 pp_w("PPP-PROBE verdict=UNREACHABLE code=" as *u8)
886 let nb: *u8 = sys_mmap(32)
887 pp_catn(nb, 0, 0 - jl); pp_w(nb)
888 pp_w(" (4=fetch failed twice, 5=body under the page floor: a redirect stub or a co-squat 404 -- for our own domains pass 127.0.0.1:8443)\n" as *u8)
889 sys_exit(4); return 4
890 }
891 sys_write(1, out, jl); pp_w("\n" as *u8)
892 sys_exit(0); return 0
893 }
894 if pp_streq(verb, "domain" as *u8) == 1 {
895 if argc < 3 { pp_w("usage: nx_ppp_probe domain <dom>\n" as *u8); sys_exit(2); return 2 }
896 let rc: i64 = pp_domain(argv[2] as *u8)
897 sys_exit(rc); return rc
898 }
899 pp_w("usage: nx_ppp_probe url <url> [connect-host:port] | domain <dom> | --kat\n" as *u8)
900 sys_exit(2); return 2
901}