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}