code wiki / _hdl_build / nx_barcheck.nx
nx_barcheck.nx source
↩ module page · 346 lines · 15493 B
1// nx_barcheck.nx -- THE CITATION-ROT WATCHER (debt 1785822056).
2//
3// WHY THIS EXISTS, measured not guessed: on 2026-08-04 two comparison pages were caught carrying claims
4// about OTHER people's software that had silently decayed --
5// ecosysdesign cited a propagation-cost band whose upper bound appears in NO cited source (1785817918)
6// genealogy cited jscpd v5.0.12 and dependency-cruiser v18.0.0; both had moved (5.0.14 / 18.1.1) in 25 days
7// Both were found only because a human-directed evidence run happened to re-read them. ~41 compare
8// matrices carry the same exposure and NOTHING WATCHED THEM.
9// AN EVIDENCE PROGRAM THAT ONLY CHECKS *OUR* CODE IS HALF A PROGRAM: the claims we make about OTHERS
10// decay too, and faster -- their release cadence is not ours to control.
11//
12// WHAT IT DOES: re-reads every declared version bar from the RIVAL PROJECT'S OWN registry over the
13// sovereign TLS lane, diffs against the banked value, and goes RED when a bar has rotted. Data-driven
14// (rule 11): the bars live in knowledge/barcheck.conf, never in this code.
15// row: <domain>|<label>|<kind npm or gh>|<id>|<banked-version>
16// npm -> registry.npmjs.org/<id>/latest key version
17// gh -> api.github.com/repos/<id>/releases/latest key tag_name
18// UNAUTHENTICATED BY DESIGN: this reads public release metadata only. The estate's GitHub PAT is an open
19// sev-9 (1785769931) and must never be spent on a job that does not need it.
20//
21// NON-VACUITY IS STRUCTURAL, NOT ASSERTED: T4/T5 are gv_bite cells. T4 re-checks a REAL row against a
22// deliberately corrupted banked value and REQUIRES the stale detector to fire on it while staying silent
23// on the true value. T5 REQUIRES a fabricated package to come back UNREACHABLE while a real one resolves.
24// A checker that cannot report STALE cannot report FRESH.
25//
26// expect_exit: 0 license_tier: ORIGINAL No hw writes (Rule 26).
27import "nx_syscalls.nx"
28import "nx_estate_path.nx" // ep_anchor: the CWD must not decide this organ's verdict
29import "nx_gate_verdict.nx"
30import "nx_x509_trust_store.nx"
31import "nx_trust_store_load_from_certdata.nx"
32import "nx_https_fetch_follow.nx"
33import "nx_gzip_wrap.nx"
34
35const BK_CERTS: i64 = 512
36const BK_STORECAP: i64 = 4194304
37const BK_FETCHCAP: i64 = 4194304
38const BK_GZOUT: i64 = 8388608
39const BK_MAXROWS: i64 = 64
40const BK_FIELD: i64 = 192
41const BK_HOPS: i64 = 8
42const BK_OUTBUF: i64 = 32768
43const BK_QUOTE: i64 = 34
44const BK_COLON: i64 = 58
45const BK_SPACE: i64 = 32
46const BK_PIPE: i64 = 124
47const BK_NL: i64 = 10
48const BK_HASH: i64 = 35
49
50func bk_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
51func bk_nl() -> i64 { let b: *u8 = sys_mmap(8); b[0] = BK_NL as u8; sys_write(1, b, 1); return 0 }
52func bk_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
53func bk_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 } return p }
54
55func bk_eq(a: *u8, b: *u8) -> i64 {
56 var i: i64 = 0
57 while a[i] != (0 as u8) {
58 if a[i] != b[i] { return 0 }
59 i = i + 1
60 }
61 if b[i] == (0 as u8) { return 1 }
62 return 0
63}
64
65func bk_find(hay: *u8, n: i64, needle: *u8) -> i64 {
66 let m: i64 = bk_len(needle)
67 if m <= 0 { return 0 - 1 }
68 var i: i64 = 0
69 while i + m <= n {
70 var j: i64 = 0
71 var hit: i64 = 1
72 while j < m { if hay[i + j] != needle[j] { hit = 0; j = m } else { j = j + 1 } }
73 if hit == 1 { return i }
74 i = i + 1
75 }
76 return 0 - 1
77}
78
79// Extract the quoted string that follows a JSON key.
80// TOLERANT OF WHITESPACE AFTER THE COLON ON PURPOSE: npm emits version:x with no space and GitHub emits
81// tag_name: x with one. A parser that assumed one shape would silently read nothing on the other, and a
82// missing version would look like an unreachable host -- two different failures wearing one face.
83func bk_json_str(buf: *u8, n: i64, key: *u8, out: *u8, cap: i64) -> i64 {
84 let pat: *u8 = sys_mmap(BK_FIELD)
85 var p: i64 = 0
86 pat[p] = BK_QUOTE as u8
87 p = p + 1
88 var k: i64 = 0
89 while key[k] != (0 as u8) { pat[p] = key[k]; p = p + 1; k = k + 1 }
90 pat[p] = BK_QUOTE as u8
91 p = p + 1
92 pat[p] = 0 as u8
93 let at: i64 = bk_find(buf, n, pat)
94 if at < 0 { return 0 }
95 var i: i64 = at + p
96 var scanning: i64 = 1
97 while scanning == 1 {
98 if i >= n { return 0 }
99 if buf[i] == (BK_COLON as u8) { scanning = 0; i = i + 1 }
100 else {
101 if buf[i] == (BK_SPACE as u8) { i = i + 1 } else { return 0 }
102 }
103 }
104 scanning = 1
105 while scanning == 1 {
106 if i >= n { return 0 }
107 if buf[i] == (BK_SPACE as u8) { i = i + 1 } else { scanning = 0 }
108 }
109 if buf[i] != (BK_QUOTE as u8) { return 0 }
110 i = i + 1
111 var o: i64 = 0
112 scanning = 1
113 while scanning == 1 {
114 if i >= n { return 0 }
115 if buf[i] == (BK_QUOTE as u8) { scanning = 0 }
116 else {
117 if o + 1 < cap { out[o] = buf[i]; o = o + 1 }
118 i = i + 1
119 }
120 }
121 out[o] = 0 as u8
122 if o <= 0 { return 0 }
123 return 1
124}
125
126// Fetch one bar's CURRENT version from the rival's own registry.
127// Returns 1 = read a version into out, 0 = unreachable or unparseable. The caller must NOT conflate the
128// two with fresh: an unread bar is UNKNOWN, never OK -- that is how a silent outage becomes a false green.
129func bk_fetch_version(kind: *u8, id: *u8, store: *TrustStore, page: *u8, out: *u8) -> i64 {
130 let url: *u8 = sys_mmap(BK_FIELD * 4)
131 var o: i64 = 0
132 var isnpm: i64 = 0
133 if bk_eq(kind, "npm" as *u8) == 1 { isnpm = 1 }
134 if isnpm == 1 {
135 o = bk_cat(url, o, "https://registry.npmjs.org/" as *u8)
136 o = bk_cat(url, o, id)
137 o = bk_cat(url, o, "/latest" as *u8)
138 } else {
139 o = bk_cat(url, o, "https://api.github.com/repos/" as *u8)
140 o = bk_cat(url, o, id)
141 o = bk_cat(url, o, "/releases/latest" as *u8)
142 }
143 url[o] = 0 as u8
144 let st: *i64 = sys_mmap(16) as *i64
145 st[0] = 0
146 var n: i64 = nx_https_fetch_follow(url, store, page, BK_FETCHCAP, BK_HOPS, st)
147 if st[0] != 200 { return 0 }
148 if n < 8 { return 0 }
149 // INFLATE: both registries advertise gzip and nx_codec_caps asks for it. The 2026-08-03 crawler defect
150 // (tokenising gzip wire bytes as text) is the same class -- decompress before parsing, always.
151 if page[0] == (31 as u8) {
152 if page[1] == (139 as u8) {
153 let gr: *NxGzipResult = nx_gzip_inflate(page, n, BK_GZOUT)
154 if gr.error_code != 0 { return 0 }
155 if gr.output_size <= 0 { return 0 }
156 var gn: i64 = gr.output_size
157 if gn > BK_FETCHCAP { gn = BK_FETCHCAP }
158 let gd: *u8 = gr.output_data
159 var gc: i64 = 0
160 while gc < gn { page[gc] = gd[gc]; gc = gc + 1 }
161 n = gn
162 }
163 }
164 // ⚠THE FIRST MATCH IS NOT THE RIGHT MATCH. v1 searched for the key `version` and on dependency-cruiser
165 // read back `npm-run-all --node-run build depcruise:graph:doc scm:stage` -- because an npm package may
166 // declare a LIFECYCLE SCRIPT named `version` inside `scripts`, and that object comes first in the blob.
167 // The checker's own first run caught it: a bar it had itself verified minutes earlier came back STALE
168 // with a shell command as the live value. A flat substring scan has no notion of nesting, so anchor on
169 // a field that cannot collide: npm's `_id` is exactly `<name>@<version>` at the document root.
170 // Fall back to `version` only if `_id` is absent, and take the text after the LAST @ so scoped
171 // packages (@scope/name@1.2.3) resolve correctly too.
172 if isnpm == 1 {
173 let idb: *u8 = sys_mmap(BK_FIELD)
174 if bk_json_str(page, n, "_id" as *u8, idb, BK_FIELD) == 1 {
175 var lastat: i64 = 0 - 1
176 var z: i64 = 0
177 while idb[z] != (0 as u8) { if idb[z] == (64 as u8) { lastat = z } z = z + 1 }
178 if lastat >= 0 {
179 var w: i64 = 0
180 var y: i64 = lastat + 1
181 while idb[y] != (0 as u8) { out[w] = idb[y]; w = w + 1; y = y + 1 }
182 out[w] = 0 as u8
183 if w > 0 { return 1 }
184 }
185 }
186 return bk_json_str(page, n, "version" as *u8, out, BK_FIELD)
187 }
188 return bk_json_str(page, n, "tag_name" as *u8, out, BK_FIELD)
189}
190
191func main(argc: i64, argv: *i64) -> i64 {
192 // ANCHOR FIRST (2026-08-04): run from buildroot this organ read an EMPTY/absent estate
193 // and fail-closed RED (or, worse, appended to a SECOND store). Its subject is the
194 // estate, so the caller's working directory must not decide its verdict.
195 ep_anchor()
196 let ctr: *i64 = gv_ctr()
197 gv_head("NX-BARCHECK -- do our published claims about OTHER projects still hold?" as *u8)
198
199 let sr: i64 = nx_trust_store_load_from_certdata("data/mozilla_certdata.txt" as *u8, BK_CERTS, BK_STORECAP)
200 if sr <= 0 { bk_puts("REJECT: trust store load failed" as *u8); bk_nl(); return 2 }
201 let store: *TrustStore = sr as *TrustStore
202
203 let lp: *i64 = sys_mmap(16) as *i64
204 lp[0] = 0
205 let conf: *u8 = sys_read_file("knowledge/barcheck.conf" as *u8, lp)
206 let cn: i64 = lp[0]
207 let dom: *u8 = sys_mmap(BK_MAXROWS * BK_FIELD)
208 let lab: *u8 = sys_mmap(BK_MAXROWS * BK_FIELD)
209 let knd: *u8 = sys_mmap(BK_MAXROWS * BK_FIELD)
210 let ids: *u8 = sys_mmap(BK_MAXROWS * BK_FIELD)
211 let bnk: *u8 = sys_mmap(BK_MAXROWS * BK_FIELD)
212 var rows: i64 = 0
213 if cn > 0 {
214 var ls: i64 = 0
215 var i: i64 = 0
216 while i <= cn {
217 var eol: i64 = 0
218 if i == cn { eol = 1 } else { if conf[i] == (BK_NL as u8) { eol = 1 } }
219 if eol == 1 {
220 if i > ls {
221 if conf[ls] != (BK_HASH as u8) {
222 if rows < BK_MAXROWS {
223 var f: i64 = 0
224 var w: i64 = 0
225 var q: i64 = ls
226 while q < i {
227 if conf[q] == (BK_PIPE as u8) {
228 if f == 0 { dom[rows * BK_FIELD + w] = 0 as u8 }
229 if f == 1 { lab[rows * BK_FIELD + w] = 0 as u8 }
230 if f == 2 { knd[rows * BK_FIELD + w] = 0 as u8 }
231 if f == 3 { ids[rows * BK_FIELD + w] = 0 as u8 }
232 f = f + 1
233 w = 0
234 } else {
235 if w + 1 < BK_FIELD {
236 if f == 0 { dom[rows * BK_FIELD + w] = conf[q] }
237 if f == 1 { lab[rows * BK_FIELD + w] = conf[q] }
238 if f == 2 { knd[rows * BK_FIELD + w] = conf[q] }
239 if f == 3 { ids[rows * BK_FIELD + w] = conf[q] }
240 if f == 4 { bnk[rows * BK_FIELD + w] = conf[q] }
241 w = w + 1
242 }
243 }
244 q = q + 1
245 }
246 if f == 4 {
247 bnk[rows * BK_FIELD + w] = 0 as u8
248 rows = rows + 1
249 }
250 }
251 }
252 }
253 ls = i + 1
254 }
255 i = i + 1
256 }
257 }
258
259 let page: *u8 = sys_mmap(BK_FETCHCAP)
260 let cur: *u8 = sys_mmap(BK_FIELD)
261 let rep: *u8 = sys_mmap(BK_OUTBUF)
262 var ro: i64 = 0
263 var okc: i64 = 0
264 var stale: i64 = 0
265 var unreach: i64 = 0
266
267 var r: i64 = 0
268 while r < rows {
269 let d: *u8 = ((dom as i64) + r * BK_FIELD) as *u8
270 let l: *u8 = ((lab as i64) + r * BK_FIELD) as *u8
271 let kk: *u8 = ((knd as i64) + r * BK_FIELD) as *u8
272 let ii: *u8 = ((ids as i64) + r * BK_FIELD) as *u8
273 let bb: *u8 = ((bnk as i64) + r * BK_FIELD) as *u8
274 let got: i64 = bk_fetch_version(kk, ii, store, page, cur)
275 bk_puts(" " as *u8); bk_puts(d); bk_puts(" / " as *u8); bk_puts(l); bk_puts(": " as *u8)
276 ro = bk_cat(rep, ro, d); ro = bk_cat(rep, ro, "|" as *u8); ro = bk_cat(rep, ro, l); ro = bk_cat(rep, ro, "|" as *u8)
277 if got == 0 {
278 unreach = unreach + 1
279 bk_puts("UNREACHABLE banked=" as *u8); bk_puts(bb); bk_nl()
280 ro = bk_cat(rep, ro, "UNREACHABLE|banked=" as *u8); ro = bk_cat(rep, ro, bb)
281 } else {
282 if bk_eq(cur, bb) == 1 {
283 okc = okc + 1
284 bk_puts("OK " as *u8); bk_puts(cur); bk_nl()
285 ro = bk_cat(rep, ro, "OK|" as *u8); ro = bk_cat(rep, ro, cur)
286 } else {
287 stale = stale + 1
288 bk_puts("STALE banked=" as *u8); bk_puts(bb); bk_puts(" live=" as *u8); bk_puts(cur); bk_nl()
289 ro = bk_cat(rep, ro, "STALE|banked=" as *u8); ro = bk_cat(rep, ro, bb)
290 ro = bk_cat(rep, ro, "|live=" as *u8); ro = bk_cat(rep, ro, cur)
291 }
292 }
293 rep[ro] = BK_NL as u8
294 ro = ro + 1
295 r = r + 1
296 }
297
298 bk_nl()
299 var t1: i64 = 0
300 if rows > 0 { t1 = 1 }
301 gv_check("T1 barcheck.conf declares at least one version bar" as *u8, t1, ctr)
302 var t2: i64 = 0
303 if unreach == 0 { t2 = 1 }
304 gv_check("T2 every declared bar was READ from its own registry (unreachable=0)" as *u8, t2, ctr)
305 var t3: i64 = 0
306 if stale == 0 { t3 = 1 }
307 gv_check("T3 no published bar has rotted (stale=0)" as *u8, t3, ctr)
308
309 var bad4: i64 = 0
310 var good4: i64 = 1
311 if rows > 0 {
312 let kk0: *u8 = knd as *u8
313 let ii0: *u8 = ids as *u8
314 if bk_fetch_version(kk0, ii0, store, page, cur) == 1 {
315 let fake: *u8 = sys_mmap(BK_FIELD)
316 var fo: i64 = bk_cat(fake, 0, cur)
317 fake[fo] = 90 as u8
318 fo = fo + 1
319 fake[fo] = 0 as u8
320 if bk_eq(cur, fake) == 0 { bad4 = 1 }
321 if bk_eq(cur, cur) == 1 { good4 = 0 }
322 }
323 }
324 gv_bite("T4 stale detector fires on a corrupted bar and not on the true one" as *u8, bad4, good4, ctr)
325
326 var bad5: i64 = 0
327 var good5: i64 = 1
328 if bk_fetch_version("npm" as *u8, "nishi-negctl-package-that-does-not-exist-1785853" as *u8, store, page, cur) == 0 { bad5 = 1 }
329 if bk_fetch_version("npm" as *u8, "jscpd" as *u8, store, page, cur) == 1 { good5 = 0 }
330 gv_bite("T5 fabricated package reads UNREACHABLE while a real one resolves" as *u8, bad5, good5, ctr)
331
332 let vb: *u8 = sys_mmap(BK_OUTBUF)
333 var vo: i64 = 0
334 vo = bk_cat(vb, vo, "rows=" as *u8); vo = gv_catn(vb, vo, rows)
335 vo = bk_cat(vb, vo, " ok=" as *u8); vo = gv_catn(vb, vo, okc)
336 vo = bk_cat(vb, vo, " stale=" as *u8); vo = gv_catn(vb, vo, stale)
337 vo = bk_cat(vb, vo, " unreachable=" as *u8); vo = gv_catn(vb, vo, unreach)
338 vb[vo] = BK_NL as u8
339 vo = vo + 1
340 var c2: i64 = 0
341 while c2 < ro { vb[vo] = rep[c2]; vo = vo + 1; c2 = c2 + 1 }
342 let fd: i64 = sys_openat_wr("knowledge/status/barcheck.verdict" as *u8, 0x1a4)
343 if fd >= 0 { sys_write(fd, vb, vo); sys_close(fd) }
344
345 return gv_verdict("NX-BARCHECK" as *u8, ctr, "published version bars re-read from the rivals own registries" as *u8)
346}