code wiki / _hdl_build / nx_docpub_ship.nx

nx_docpub_ship.nx source

↩ module page · 107 lines · 6685 B

1// nx_docpub_ship.nx -- SHIP the self-generated documentation site TO THE NISHI PUBLISHER (operator: "ship to 2// the nishi publisher", 2026-06-21). Walks the whole generated site dir (web_assets/docgen, getdents) and submits 3// EVERY page to the publisher's CANONICAL intake via pub_submit -> knowledge/publish/queue.tsv (APPEND, flock'd, 4// sha256-identified; NEVER truncates, so other workstreams' queued requests are untouched). Docs are INTERNAL 5// behind the OPAQUE wall, so dest = sites/nishifamily/wiki/reference/<page>. This organ hands the docs TO the 6// publisher; the publisher workstream promotes + ships + serves (coordinate). NEVER calls nx_aw_push. 7// license_tier: ORIGINAL expect_exit: 0 8import "nx_syscalls.nx" 9import "nx_itoa_lib.nx" // shared MSB-first emitter (zero-alloc) 10import "nx_publisher.nx" 11import "nx_runpath.nx" 12const K_MAGIC_65536: i64 = 65536 13const K_MAGIC_2000: i64 = 2000 14const K_MAGIC_1048576: i64 = 1048576 15 16func dps_w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 17// MIGRATED to the shared emitter (debt 1785563586). The old body mmapped a scratch buffer 18// per call and never freed it. At PAGE granularity that is 4096B leaked PER CALL -- the 19// defect that took 28.5GB of a 36GB host in nx_ts_lumadiff (2MB input, ~3.66M calls). 20// nxi_* is MSB-first, allocates NOTHING, and emits identical bytes including the sign. 21func dps_n(v: i64) -> i64 { nxi_out(v); return 0 } 22func dps_cat(out: *u8, o: i64, s: *u8) -> i64 { var k: i64 = 0; while s[k] != (0 as u8) { out[o] = s[k]; o = o + 1; k = k + 1 } return o } 23func dps_ends_html(nm: *u8) -> i64 { 24 var n: i64 = 0; while nm[n] != (0 as u8) { n = n + 1 } 25 if n < 5 { return 0 } 26 if nm[n-5] == (46 as u8) { if nm[n-4] == (104 as u8) { if nm[n-3] == (116 as u8) { if nm[n-2] == (109 as u8) { if nm[n-1] == (108 as u8) { return 1 } } } } } 27 return 0 28} 29func dps_match(buf: *u8, p: i64, n: i64, needle: *u8) -> i64 { 30 var k: i64 = 0 31 while needle[k] != (0 as u8) { if p + k >= n { return 0 } if buf[p+k] != needle[k] { return 0 } k = k + 1 } 32 return 1 33} 34func dps_contains(buf: *u8, n: i64, needle: *u8) -> i64 { var i: i64 = 0; while i < n { if dps_match(buf, i, n, needle) == 1 { return 1 } i = i + 1 } return 0 } 35func dps_ishex(c: i64) -> i64 { if c >= 48 { if c <= 57 { return 1 } } if c >= 97 { if c <= 102 { return 1 } } return 0 } 36func dps_hexrun(buf: *u8, n: i64, need: i64) -> i64 { 37 var i: i64 = 0; var run: i64 = 0 38 while i < n { if dps_ishex(buf[i] & 0xff) == 1 { run = run + 1; if run >= need { return 1 } } else { run = 0 } i = i + 1 } 39 return 0 40} 41func dps_read(path: *u8, buf: *u8, cap: i64) -> i64 { 42 let fd: i64 = sys_openat_rd(path); if fd < 0 { return 0 - 1 } 43 var tot: i64 = 0 44 while tot < cap { let r: i64 = sys_read(fd, (buf as i64 + tot) as *u8, cap - tot); if r <= 0 { break } tot = tot + r } 45 sys_close(fd); return tot 46} 47 48func main() -> i64 { 49 dps_w("=== NX-DOCPUB-SHIP -- ship the generated doc site TO THE NISHI PUBLISHER (canonical intake) ===\n" as *u8) 50 let dfd: i64 = sys_openat_rd("web_assets/docgen" as *u8) 51 if dfd < 0 { dps_w("FATAL: web_assets/docgen not found (run nx_docpub_site + nx_docpub_tree first)\n" as *u8); sys_exit(2); return 2 } 52 let dirbuf: *u8 = sys_mmap(K_MAGIC_65536) 53 let srcp: *u8 = sys_mmap(512) 54 let dstp: *u8 = sys_mmap(512) 55 56 var submitted: i64 = 0 57 __syscall(83, "knowledge/publish" as i64, 493, 0, 0, 0, 0) 58 let tqfd: i64 = sys_openat_wr("knowledge/publish/docpub_ship.q" as *u8, 0x1a4); if tqfd >= 0 { sys_close(tqfd) } 59 var ok: i64 = 0 60 var done: i64 = 0 61 while done == 0 { 62 let nb: i64 = sys_getdents64(dfd, dirbuf, K_MAGIC_65536) 63 if nb <= 0 { done = 1 } 64 else { 65 var off: i64 = 0 66 while off < nb { 67 let rec: *u8 = (dirbuf as i64 + off) as *u8 68 let rl: i64 = dirent_reclen(rec) 69 if rl <= 0 { off = nb } 70 else { 71 let nm: *u8 = dirent_name(rec) 72 if dps_ends_html(nm) == 1 { 73 var sp: i64 = 0; sp = dps_cat(srcp, sp, "web_assets/docgen/" as *u8); sp = dps_cat(srcp, sp, nm); srcp[sp] = 0 as u8 74 var dp: i64 = 0; dp = dps_cat(dstp, dp, "sites/nishifamily/wiki/reference/" as *u8); dp = dps_cat(dstp, dp, nm); dstp[dp] = 0 as u8 75 let rc: i64 = pub_submit_to("knowledge/publish/docpub_ship.q" as *u8, srcp, dstp, "nishifamily" as *u8, "docpub" as *u8, "internal" as *u8) 76 submitted = submitted + 1 77 if rc == 1 { ok = ok + 1 } 78 } 79 if submitted > K_MAGIC_2000 { off = nb; done = 1 } 80 off = off + rl 81 } 82 } 83 } 84 } 85 sys_close(dfd) 86 dps_w(" submitted="); dps_n(submitted); dps_w(" durable_ok="); dps_n(ok); dps_w(" -> DEDICATED docpub queue knowledge/publish/docpub_ship.q (ready for the publisher's nx_pub_ship)\n") 87 88 let cap: i64 = K_MAGIC_1048576 89 let q: *u8 = sys_mmap(cap) 90 let qn: i64 = dps_read("knowledge/publish/docpub_ship.q" as *u8, q, cap) 91 let pend: i64 = 0 92 dps_w(" dedicated queue bytes="); dps_n(qn); dps_w("\n") 93 94 let pass: *i64 = sys_mmap(16) as *i64; pass[0] = 0 95 let t1: i64 = ((submitted > 0) as i64) & ((ok == submitted) as i64) 96 if t1 == 1 { dps_w(" T1 every generated page durably submitted (ok==submitted): PASS\n" as *u8); pass[0] = pass[0] + 1 } else { dps_w(" T1 every page submitted: FAIL\n" as *u8) } 97 let t2: i64 = dps_contains(q, qn, "wiki/reference/index.html" as *u8) 98 if t2 == 1 { dps_w(" T2 docs landing (index) handed to the publisher: PASS\n" as *u8); pass[0] = pass[0] + 1 } else { dps_w(" T2 index in canonical queue: FAIL\n" as *u8) } 99 let t3: i64 = (dps_contains(q, qn, "wiki/reference/nx_wiki_status.html" as *u8)) & (dps_contains(q, qn, "\tdocpub\t" as *u8)) 100 if t3 == 1 { dps_w(" T3 wiki-section pages + requester=docpub present: PASS\n" as *u8); pass[0] = pass[0] + 1 } else { dps_w(" T3 wiki pages + docpub requester: FAIL\n" as *u8) } 101 let t4: i64 = dps_hexrun(q, qn, 64) 102 if t4 == 1 { dps_w(" T4 requests carry sha256 content-identity (integrity): PASS\n" as *u8); pass[0] = pass[0] + 1 } else { dps_w(" T4 sha256 present: FAIL\n" as *u8) } 103 104 dps_w("NX-DOCPUB-SHIP "); dps_n(pass[0]); dps_w("/4 ") 105 if pass[0] == 4 { dps_w("verdict=GREEN (full doc site SHIPPED to the Nishi Publisher canonical intake; publisher promotes+serves behind OPAQUE)\n" as *u8); sys_exit(0); return 0 } 106 dps_w("verdict=RED (ship incomplete)\n" as *u8); sys_exit(1); return 1 107}