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}