code wiki / _hdl_build / nx_uiq_sentinel_lib.nx
nx_uiq_sentinel_lib.nx source
↩ module page · 477 lines · 19281 B
1// nx_uiq_sentinel_lib.nx -- F106c: the zero-Claude experiential sentinel (console + atree composed).
2// baseline = bless the CURRENT docroot: copy each live page + record its console error/warning counts
3// and ARIA-tree node count into a manifest. check = re-audit every baselined page NOW and classify:
4// MISSING page gone from the docroot -> verdict REGRESSED
5// CONSOLE-REGRESSED console errors NOW > errors at baseline -> verdict REGRESSED
6// STRUCT-DRIFT Zhang-Shasha TED(baseline, now) > 0 -> verdict DRIFT (review)
7// NEW page in docroot but not in the manifest -> counted, note only
8// A cron can run `check` forever with zero sessions; a non-CLEAN verdict is the signal to look.
9// HONEST ENVELOPE: page cap 256 declared; TED refused (capped++) when a tree exceeds 512 nodes;
10// baseline read-failures counted loudly; detail rows capped at 40 with a capped flag.
11// license_tier: ORIGINAL genealogy: F106c; composes nx_uiq_console_lib + nx_uiq_atree_lib
12import "nx_uiq_atree_lib.nx"
13const US_MAGIC_65536: i64 = 65536
14const US_MAGIC_1024: i64 = 1024
15
16const US_CAP_PAGES: i64 = 256
17const US_CAP_DETAIL: i64 = 40
18const US_ARENA: i64 = 32768
19
20func us_cat(dst: *u8, off: i64, src: *u8) -> i64 {
21 var k: i64 = 0
22 var o: i64 = off
23 while src[k]!=(0 as u8) { dst[o]=src[k]; o=o+1; k=k+1 }
24 dst[o]=(0 as u8)
25 return o
26}
27
28func us_itoa(dst: *u8, off: i64, v: i64) -> i64 {
29 if v==0 { dst[off]=(48 as u8); dst[off+1]=(0 as u8); return off+1 }
30 var neg: i64 = 0
31 var x: i64 = v
32 if x<0 { neg=1; x=0-x }
33 let tmp: *u8 = sys_mmap(32)
34 var t: i64 = 0
35 while x>0 { let dg: i64 = x % 10; tmp[t]=(dg+48) as u8; t=t+1; x=x/10 }
36 var o: i64 = off
37 if neg==1 { dst[o]=(45 as u8); o=o+1 }
38 while t>0 { t=t-1; dst[o]=tmp[t]; o=o+1 }
39 dst[o]=(0 as u8)
40 return o
41}
42
43func us_atoi(buf: *u8, off: i64, out: *i64) -> i64 {
44 var o: i64 = off
45 var v: i64 = 0
46 var d: i64 = 0
47 while d==0 {
48 let c: i64 = buf[o] as i64
49 if c>=48 { if c<=57 { v=v*10+c-48; o=o+1 } else { d=1 } } else { d=1 }
50 }
51 out[0]=v
52 return o
53}
54
55func us_ends(s: *u8, lit: *u8) -> i64 {
56 let sl: i64 = cs_len(s)
57 let ll: i64 = cs_len(lit)
58 if ll>sl { return 0 }
59 var k: i64 = 0
60 while k<ll { let a: i64=s[sl-ll+k] as i64; let b: i64=lit[k] as i64; if a!=b { return 0 } k=k+1 }
61 return 1
62}
63
64func us_has(s: *u8, lit: *u8) -> i64 {
65 let sl: i64 = cs_len(s)
66 let o: i64 = cs_find_from(s, sl, 0, lit)
67 if o>=0 { return 1 }
68 return 0
69}
70
71func us_write(path: *u8, buf: *u8, n: i64) -> i64 {
72 let fd: i64 = sys_openat_wr(path, 420)
73 if fd<0 { return 0 }
74 var w: i64 = 0
75 while w<n { let r: i64 = sys_write(fd, ((buf as i64)+w) as *u8, n-w); if r<=0 { sys_close(fd); return 0 } w=w+r }
76 sys_close(fd)
77 return 1
78}
79
80// scan a directory for live .html pages (skips .prev/.bak). names -> arena as cstrs, offs[i]=arena off.
81func us_scan_dir(dir: *u8, arena: *u8, offs: *i64, cap: i64) -> i64 {
82 let fd: i64 = sys_openat_rd(dir)
83 if fd<0 { return 0-1 }
84 let db: *u8 = sys_mmap(US_MAGIC_65536)
85 var cnt: i64 = 0
86 var ao: i64 = 0
87 var done: i64 = 0
88 while done==0 {
89 let nr: i64 = sys_getdents64(fd, db, US_MAGIC_65536)
90 if nr<=0 { done=1 } else {
91 var off: i64 = 0
92 while off<nr {
93 let rec: *u8 = ((db as i64)+off) as *u8
94 let ty: i64 = dirent_type(rec)
95 let nm: *u8 = dirent_name(rec)
96 if ty==8 {
97 var keep: i64 = 0
98 if us_ends(nm, ".html" as *u8)==1 { keep=1 }
99 if keep==1 { if us_has(nm, ".prev" as *u8)==1 { keep=0 } }
100 if keep==1 { if us_has(nm, ".bak" as *u8)==1 { keep=0 } }
101 if keep==1 {
102 if cnt<cap {
103 if ao<US_ARENA-260 {
104 offs[cnt]=ao
105 ao = us_cat(arena, ao, nm)
106 ao=ao+1
107 cnt=cnt+1
108 }
109 }
110 }
111 }
112 let rl: i64 = dirent_reclen(rec)
113 off=off+rl
114 }
115 }
116 }
117 sys_close(fd)
118 return cnt
119}
120
121// read names from a list file (one per line) -> arena/offs
122func us_read_list(listfile: *u8, arena: *u8, offs: *i64, cap: i64) -> i64 {
123 let lb: *u8 = sys_mmap(US_MAGIC_65536)
124 let n: i64 = cs_slurp(listfile, lb, US_MAGIC_65536)
125 if n<=0 { return 0-1 }
126 var cnt: i64 = 0
127 var ao: i64 = 0
128 var i: i64 = 0
129 while i<n {
130 var e: i64 = i
131 var d: i64 = 0
132 while d==0 { if e>=n { d=1 } else { let c: i64=lb[e] as i64; if c==10 || c==13 { d=1 } else { e=e+1 } } }
133 if e>i {
134 if cnt<cap {
135 offs[cnt]=ao
136 var q: i64 = i
137 while q<e { arena[ao]=lb[q]; ao=ao+1; q=q+1 }
138 arena[ao]=(0 as u8)
139 ao=ao+1
140 cnt=cnt+1
141 }
142 }
143 i=e+1
144 }
145 return cnt
146}
147
148// warnings from the console lib's last audit (g_cls filled by cs_audit_buf)
149func us_last_warns() -> i64 {
150 let g: *i64 = g_cls
151 return g[1]+g[4]+g[7]
152}
153
154// baseline: for each page, copy + manifest row `name\terrs\twarns\tnodes`. emit=1 prints JSON summary.
155// dirz = docroot dir; listfile 0 => scan dirz. Returns pages baselined.
156func us_baseline(dirz: *u8, prefix: *u8, listfile: *u8, emit: i64) -> i64 {
157 let arena: *u8 = sys_mmap(US_ARENA)
158 let offs: *i64 = sys_mmap(US_CAP_PAGES*8) as *i64
159 var cnt: i64 = 0
160 if (listfile as i64)!=0 { cnt = us_read_list(listfile, arena, offs, US_CAP_PAGES) } else { cnt = us_scan_dir(dirz, arena, offs, US_CAP_PAGES) }
161 if cnt<0 { if emit==1 { uiq_w("{\"organ\":\"nx_uiq_sentinel\",\"verb\":\"baseline\",\"error\":\"cannot enumerate pages\"}\n" as *u8) } return 0-1 }
162 let pg: *u8 = sys_mmap(CS_CAP_BUF)
163 let pb: *u8 = sys_mmap(US_MAGIC_1024)
164 let mf: *u8 = sys_mmap(US_MAGIC_65536)
165 var mo: i64 = 0
166 var okc: i64 = 0
167 var fail: i64 = 0
168 var i: i64 = 0
169 while i<cnt {
170 let no: i64 = offs[i]
171 let nm: *u8 = ((arena as i64)+no) as *u8
172 var po: i64 = 0
173 po = us_cat(pb, 0, dirz)
174 po = us_cat(pb, po, "/" as *u8)
175 po = us_cat(pb, po, nm)
176 let n: i64 = cs_slurp(pb, pg, CS_CAP_BUF)
177 if n<=0 { fail=fail+1 } else {
178 let errs: i64 = cs_audit_buf(pg, n, 0)
179 let warns: i64 = us_last_warns()
180 let t: *i64 = sys_mmap(AT_SLOTS*8) as *i64
181 let nn: i64 = at_build(pg, n, t)
182 var do2: i64 = 0
183 do2 = us_cat(pb, 0, prefix)
184 do2 = us_cat(pb, do2, nm)
185 let wr: i64 = us_write(pb, pg, n)
186 if wr==0 { fail=fail+1 } else {
187 mo = us_cat(mf, mo, nm)
188 mf[mo]=(9 as u8)
189 mo=mo+1
190 mo = us_itoa(mf, mo, errs)
191 mf[mo]=(9 as u8)
192 mo=mo+1
193 mo = us_itoa(mf, mo, warns)
194 mf[mo]=(9 as u8)
195 mo=mo+1
196 mo = us_itoa(mf, mo, nn-1)
197 mf[mo]=(10 as u8)
198 mo=mo+1
199 okc=okc+1
200 }
201 }
202 i=i+1
203 }
204 var mp: i64 = 0
205 mp = us_cat(pb, 0, prefix)
206 mp = us_cat(pb, mp, "manifest.txt" as *u8)
207 let mw: i64 = us_write(pb, mf, mo)
208 if emit==1 {
209 uiq_w("{\"organ\":\"nx_uiq_sentinel\",\"verb\":\"baseline\",\"pages\":" as *u8)
210 uiq_pn(okc)
211 uiq_w(",\"readfail\":" as *u8)
212 uiq_pn(fail)
213 uiq_w(",\"manifest_write\":" as *u8)
214 uiq_pn(mw)
215 uiq_w(",\"env\":\"page-cap-256;html-only;prev-bak-skipped\"}\n" as *u8)
216 }
217 return okc
218}
219
220// check: classify every manifest row. out[0]=pages out[1]=missing out[2]=regressed out[3]=drift
221// out[4]=new(-1 = not scanned) out[5]=ted_capped. emit=1 prints JSON w/ detail. doscan=1 => NEW detection.
222func us_check(dirz: *u8, prefix: *u8, out: *i64, emit: i64, doscan: i64) -> i64 {
223 let pb: *u8 = sys_mmap(US_MAGIC_1024)
224 var mp: i64 = 0
225 mp = us_cat(pb, 0, prefix)
226 mp = us_cat(pb, mp, "manifest.txt" as *u8)
227 let mf: *u8 = sys_mmap(US_MAGIC_65536)
228 let mn: i64 = cs_slurp(pb, mf, US_MAGIC_65536)
229 out[0]=0
230 out[1]=0
231 out[2]=0
232 out[3]=0
233 out[4]=0-1
234 out[5]=0
235 if mn<=0 { if emit==1 { uiq_w("{\"organ\":\"nx_uiq_sentinel\",\"verb\":\"check\",\"error\":\"no manifest\"}\n" as *u8) } return 0-1 }
236 let cur: *u8 = sys_mmap(CS_CAP_BUF)
237 let bas: *u8 = sys_mmap(CS_CAP_BUF)
238 let nmb: *u8 = sys_mmap(512)
239 let iv: *i64 = sys_mmap(32) as *i64
240 var dn: i64 = 0
241 var dcapped: i64 = 0
242 if emit==1 { uiq_w("{\"organ\":\"nx_uiq_sentinel\",\"verb\":\"check\",\"detail\":[" as *u8) }
243 var i: i64 = 0
244 while i<mn {
245 var e: i64 = i
246 var d: i64 = 0
247 while d==0 { if e>=mn { d=1 } else { let c: i64=mf[e] as i64; if c==9 { d=1 } else { e=e+1 } } }
248 if e>=mn { i=mn } else {
249 var q: i64 = i
250 var no2: i64 = 0
251 while q<e { nmb[no2]=mf[q]; no2=no2+1; q=q+1 }
252 nmb[no2]=(0 as u8)
253 var p2: i64 = e+1
254 p2 = us_atoi(mf, p2, iv)
255 let base_errs: i64 = iv[0]
256 p2=p2+1
257 p2 = us_atoi(mf, p2, iv)
258 p2=p2+1
259 p2 = us_atoi(mf, p2, iv)
260 var d2: i64 = 0
261 while d2==0 { if p2>=mn { d2=1 } else { let c2: i64=mf[p2] as i64; if c2==10 { d2=1 } else { p2=p2+1 } } }
262 i=p2+1
263 out[0]=out[0]+1
264 var po: i64 = 0
265 po = us_cat(pb, 0, dirz)
266 po = us_cat(pb, po, "/" as *u8)
267 po = us_cat(pb, po, nmb)
268 let cn: i64 = cs_slurp(pb, cur, CS_CAP_BUF)
269 if cn<=0 {
270 out[1]=out[1]+1
271 if emit==1 { if dn<US_CAP_DETAIL { if dn>0 { uiq_w("," as *u8) } uiq_w("{\"p\":\"" as *u8); uiq_w(nmb); uiq_w("\",\"k\":\"missing\"}" as *u8); dn=dn+1 } else { dcapped=1 } }
272 } else {
273 let errs_now: i64 = cs_audit_buf(cur, cn, 0)
274 if errs_now>base_errs {
275 out[2]=out[2]+1
276 if emit==1 { if dn<US_CAP_DETAIL { if dn>0 { uiq_w("," as *u8) } uiq_w("{\"p\":\"" as *u8); uiq_w(nmb); uiq_w("\",\"k\":\"console-regressed\",\"was\":" as *u8); uiq_pn(base_errs); uiq_w(",\"now\":" as *u8); uiq_pn(errs_now); uiq_w("}" as *u8); dn=dn+1 } else { dcapped=1 } }
277 }
278 var bo: i64 = 0
279 bo = us_cat(pb, 0, prefix)
280 bo = us_cat(pb, bo, nmb)
281 let bn: i64 = cs_slurp(pb, bas, CS_CAP_BUF)
282 if bn<=0 {
283 out[1]=out[1]+1
284 if emit==1 { if dn<US_CAP_DETAIL { if dn>0 { uiq_w("," as *u8) } uiq_w("{\"p\":\"" as *u8); uiq_w(nmb); uiq_w("\",\"k\":\"baseline-unreadable\"}" as *u8); dn=dn+1 } else { dcapped=1 } }
285 } else {
286 let ta: *i64 = sys_mmap(AT_SLOTS*8) as *i64
287 let tb: *i64 = sys_mmap(AT_SLOTS*8) as *i64
288 at_build(bas, bn, ta)
289 at_build(cur, cn, tb)
290 let td: i64 = at_ted(ta, tb)
291 if td<0 { out[5]=out[5]+1 } else {
292 if td>0 {
293 out[3]=out[3]+1
294 if emit==1 { if dn<US_CAP_DETAIL { if dn>0 { uiq_w("," as *u8) } uiq_w("{\"p\":\"" as *u8); uiq_w(nmb); uiq_w("\",\"k\":\"struct-drift\",\"ted\":" as *u8); uiq_pn(td); uiq_w("}" as *u8); dn=dn+1 } else { dcapped=1 } }
295 }
296 }
297 }
298 }
299 }
300 }
301 if doscan==1 {
302 let sarena: *u8 = sys_mmap(US_ARENA)
303 let soffs: *i64 = sys_mmap(US_CAP_PAGES*8) as *i64
304 let sc: i64 = us_scan_dir(dirz, sarena, soffs, US_CAP_PAGES)
305 if sc>=0 {
306 var nw: i64 = 0
307 var s: i64 = 0
308 while s<sc {
309 let sno: i64 = soffs[s]
310 let snm: *u8 = ((sarena as i64)+sno) as *u8
311 let sl2: i64 = cs_len(snm)
312 var fnd: i64 = 0
313 var mi: i64 = 0
314 while mi<mn {
315 var me: i64 = mi
316 var d3: i64 = 0
317 while d3==0 { if me>=mn { d3=1 } else { let c3: i64=mf[me] as i64; if c3==9 { d3=1 } else { me=me+1 } } }
318 if me>=mn { mi=mn } else {
319 var eq2: i64 = 0
320 if me-mi==sl2 {
321 var y: i64 = 0
322 eq2=1
323 while y<sl2 { let ca: i64=mf[mi+y] as i64; let cb: i64=snm[y] as i64; if ca!=cb { eq2=0; y=sl2 } else { y=y+1 } }
324 }
325 if eq2==1 { fnd=1; mi=mn } else {
326 var mnl: i64 = mi
327 var d4: i64 = 0
328 while d4==0 { if mnl>=mn { d4=1 } else { let c4: i64=mf[mnl] as i64; if c4==10 { d4=1 } else { mnl=mnl+1 } } }
329 mi=mnl+1
330 }
331 }
332 }
333 if fnd==0 { nw=nw+1 }
334 s=s+1
335 }
336 out[4]=nw
337 }
338 }
339 if emit==1 {
340 uiq_w("],\"detail_capped\":" as *u8)
341 uiq_pn(dcapped)
342 uiq_w(",\"pages\":" as *u8)
343 uiq_pn(out[0])
344 uiq_w(",\"missing\":" as *u8)
345 uiq_pn(out[1])
346 uiq_w(",\"console_regressed\":" as *u8)
347 uiq_pn(out[2])
348 uiq_w(",\"struct_drift\":" as *u8)
349 uiq_pn(out[3])
350 uiq_w(",\"new_pages\":" as *u8)
351 uiq_pn(out[4])
352 uiq_w(",\"ted_capped\":" as *u8)
353 uiq_pn(out[5])
354 uiq_w(",\"verdict\":\"" as *u8)
355 var bad: i64 = out[1]+out[2]
356 if bad>0 { uiq_w("REGRESSED" as *u8) } else { if out[3]>0 { uiq_w("DRIFT" as *u8) } else { uiq_w("CLEAN" as *u8) } }
357 uiq_w("\",\"env\":\"page-cap-256;detail-cap-40;ted-cap-512-counted;regressed=missing-or-console-errors-up;drift=ted-gt-0\"}\n" as *u8)
358 }
359 return 0
360}
361
362// cron entry: argless default check with bootstrap defaults (rule-17: args override via `check`),
363// appends ONE `verdict=`-anchored line to knowledge/status/uiq_sentinel.log (O_APPEND) + echoes it.
364// the one verdict-string resolver (DRY -- log line + JSON endpoint share it). r<0 => NO-MANIFEST.
365func us_verdict(d: *u8, o: i64, r: i64, out: *i64) -> i64 {
366 var bad: i64 = out[1]+out[2]
367 if r<0 { return us_cat(d, o, "NO-MANIFEST" as *u8) }
368 if bad>0 { return us_cat(d, o, "REGRESSED" as *u8) }
369 if out[3]>0 { return us_cat(d, o, "DRIFT" as *u8) }
370 return us_cat(d, o, "CLEAN" as *u8)
371}
372
373// API SURFACE (2026-07-23): the sentinel's live verdict as a machine-readable GET endpoint, mirroring
374// the docroot health.json pattern -- consumable by any monitor/dashboard with NO MCP/cap. Written atomic
375// (truncating us_write) to the docroot on every cron run; served at https://nishifamily.com/experiential.json
376func us_emit_json(path: *u8, now: i64, r: i64, out: *i64) -> i64 {
377 let jb: *u8 = sys_mmap(US_MAGIC_1024)
378 var j: i64 = 0
379 j = us_cat(jb, 0, "{\"organ\":\"nx_uiq_sentinel\",\"ts\":" as *u8)
380 j = us_itoa(jb, j, now)
381 j = us_cat(jb, j, ",\"pages\":" as *u8)
382 j = us_itoa(jb, j, out[0])
383 j = us_cat(jb, j, ",\"missing\":" as *u8)
384 j = us_itoa(jb, j, out[1])
385 j = us_cat(jb, j, ",\"regressed\":" as *u8)
386 j = us_itoa(jb, j, out[2])
387 j = us_cat(jb, j, ",\"drift\":" as *u8)
388 j = us_itoa(jb, j, out[3])
389 j = us_cat(jb, j, ",\"new\":" as *u8)
390 j = us_itoa(jb, j, out[4])
391 j = us_cat(jb, j, ",\"ted_capped\":" as *u8)
392 j = us_itoa(jb, j, out[5])
393 j = us_cat(jb, j, ",\"verdict\":\"" as *u8)
394 j = us_verdict(jb, j, r, out)
395 j = us_cat(jb, j, "\",\"env\":\"static-source-scan;console+atree composed;page-cap-256;ted-cap-512-refused\"}\n" as *u8)
396 return us_write(path, jb, j)
397}
398
399func us_cron() -> i64 {
400 let out: *i64 = sys_mmap(64) as *i64
401 let r: i64 = us_check("sites/nishifamily" as *u8, "knowledge/uiqbase-" as *u8, out, 0, 1)
402 let lb: *u8 = sys_mmap(512)
403 var o: i64 = 0
404 o = us_cat(lb, 0, "ts=" as *u8)
405 let now: i64 = sys_now_realtime_sec()
406 us_emit_json("sites/nishifamily/experiential.json" as *u8, now, r, out)
407 o = us_itoa(lb, o, now)
408 o = us_cat(lb, o, " pages=" as *u8)
409 o = us_itoa(lb, o, out[0])
410 o = us_cat(lb, o, " missing=" as *u8)
411 o = us_itoa(lb, o, out[1])
412 o = us_cat(lb, o, " regressed=" as *u8)
413 o = us_itoa(lb, o, out[2])
414 o = us_cat(lb, o, " drift=" as *u8)
415 o = us_itoa(lb, o, out[3])
416 o = us_cat(lb, o, " new=" as *u8)
417 o = us_itoa(lb, o, out[4])
418 o = us_cat(lb, o, " capped=" as *u8)
419 o = us_itoa(lb, o, out[5])
420 o = us_cat(lb, o, " verdict=" as *u8)
421 o = us_verdict(lb, o, r, out)
422 lb[o]=(10 as u8)
423 o=o+1
424 lb[o]=(0 as u8)
425 let fd: i64 = sys_openat_append("knowledge/status/uiq_sentinel.log" as *u8, 420)
426 if fd<0 { uiq_w("UIQ-SENTINEL log-open-fail\n" as *u8); return 3 }
427 sys_write(fd, lb, o)
428 sys_close(fd)
429 uiq_w(lb)
430 return 0
431}
432
433// selftest: full lifecycle on kat-prefixed CWD files. 0 = GREEN.
434func us_selftest() -> i64 {
435 var f: i64 = 0
436 let a0: *u8 = "<nav><a href=\"/x\">X</a></nav><main><h1 id=\"m\">T</h1></main>" as *u8
437 let b0: *u8 = "<main id=\"q\"><h1>B</h1></main>" as *u8
438 let a0l: i64 = cs_len(a0)
439 let b0l: i64 = cs_len(b0)
440 us_write("uiqsentkat_a.html" as *u8, a0, a0l)
441 us_write("uiqsentkat_b.html" as *u8, b0, b0l)
442 let lst: *u8 = "uiqsentkat_a.html\nuiqsentkat_b.html\n" as *u8
443 let lstl: i64 = cs_len(lst)
444 us_write("uiqsentkat_list.txt" as *u8, lst, lstl)
445 let bl: i64 = us_baseline("." as *u8, "uiqsentkat-" as *u8, "uiqsentkat_list.txt" as *u8, 0)
446 if bl!=2 { f=f+1 }
447 let out: *i64 = sys_mmap(64) as *i64
448 us_check("." as *u8, "uiqsentkat-" as *u8, out, 0, 0)
449 if out[0]!=2 { f=f+1 }
450 if out[1]!=0 { f=f+1 }
451 if out[2]!=0 { f=f+1 }
452 if out[3]!=0 { f=f+1 }
453 let b1: *u8 = "<main id=\"q\"><h1 id=\"q\">B</h1></main>" as *u8
454 let b1l: i64 = cs_len(b1)
455 us_write("uiqsentkat_b.html" as *u8, b1, b1l)
456 us_check("." as *u8, "uiqsentkat-" as *u8, out, 0, 0)
457 if out[2]!=1 { f=f+1 }
458 if out[3]!=0 { f=f+1 }
459 let a1: *u8 = "<nav><a href=\"/x\">X</a></nav><main><h1 id=\"m\">T</h1></main><footer></footer>" as *u8
460 let a1l: i64 = cs_len(a1)
461 us_write("uiqsentkat_a.html" as *u8, a1, a1l)
462 us_check("." as *u8, "uiqsentkat-" as *u8, out, 0, 0)
463 if out[3]!=1 { f=f+1 }
464 if out[2]!=1 { f=f+1 }
465 let mf2: *u8 = sys_mmap(US_MAGIC_65536)
466 let mn2: i64 = cs_slurp("uiqsentkat-manifest.txt" as *u8, mf2, US_MAGIC_65536)
467 if mn2<=0 { f=f+1 } else {
468 let gh: *u8 = "uiqsentkat_ghost.html\t0\t0\t1\n" as *u8
469 var go: i64 = mn2
470 var gk: i64 = 0
471 while gh[gk]!=(0 as u8) { mf2[go]=gh[gk]; go=go+1; gk=gk+1 }
472 us_write("uiqsentkat-manifest.txt" as *u8, mf2, go)
473 us_check("." as *u8, "uiqsentkat-" as *u8, out, 0, 0)
474 if out[1]!=1 { f=f+1 }
475 }
476 return f
477}