nx_shipcheck.nx
buildroot/runtime/nx_shipcheck.nx
about
nx_shipcheck.nx -- SHIP-COMPLETE integration-orphan detector (POST-submit lane; operator law
feedback-ship-complete-lifecycle-standard 2026-07-21, ws=auto-shipcomplete-guards).
Counts integration orphans per class over the REAL registry surfaces:
noschema tool_allowlist.conf rows with NO schema row in knowledge/tool_schemas.conf
staleschema tool_schemas.conf rows whose tool is NOT in tool_allowlist.conf (ghost schema)
stagedref registry rows whose binary path contains .new (registered-but-never-promoted)
missingbin registry rows whose binary is ABSENT on disk (tools/call would exec-fail)
straynew stranded .new artifacts in the deploy root (one-level walk, DECLARED)
verb `listnew [root]` PRINTS those names (exit code = the count) -- see sc_scan_new's header for why.
noatlas registry tools absent from knowledge/registry/atlas_catalog.tsv col1
Composed context (owned elsewhere, echoed for the trend line, NEVER re-scanned or re-filed):
dupsrc last count from knowledge/status/dup_source.log (seq207 lane)
unreg_l003 last L003 measured from knowledge/status/law_warden.jrnl (warden lane)
frowjoin=-1 DECLARED UNMEASURED: frontier rows carry no ws column (F209 evidence gap).
verbs: scan [root] | beat [root] | file [root] [filer]
scan: sweep + print + O_APPEND one trend line to <root>/knowledge/status/shipcheck.log
beat: scan + auto-file debts via the ALLOWLIST-RESOLVED filer (default nx_debt)
file: scan + file via an INJECTED filer tool name (the gate passes argecho -- selftest
never writes the production debt plane; F872 harden pattern)
Descs are CANONICAL and COUNT-FREE so nx_debt content-idempotent add (F868) makes any
beat cadence spam-proof BY CONSTRUCTION. Envelope: per-file read caps DECLARED via capped=.
license_tier: ORIGINAL Read-only sweep + O_APPEND log + debt filing. No hw writes (Rule 26).
dependencies 1 imports · 0 importers
imports: nx_syscalls.nx
imported by: nobody (leaf or entry point)
call flow from main pre-order; caps 40 nodes / depth 6 declared; ↻ = already shown
structs
| none |
consts
| 25 | const SC_TAB: i64 = 9 |
| 26 | const SC_NL: i64 = 10 |
| 27 | const SC_HASH: i64 = 35 |
| 28 | const SC_DOT: i64 = 46 |
| 29 | const SC_SLASH: i64 = 47 |
| 30 | const SC_COLON: i64 = 58 |
| 31 | const SC_ZERO: i64 = 48 |
| 32 | const SC_NINE: i64 = 57 |
| 33 | const SC_MINUS: i64 = 45 |
| 34 | const SC_B10: i64 = 10 |
| 35 | const SC_B256: i64 = 256 |
| 36 | const SC_LC_N: i64 = 110 |
| 37 | const SC_LC_E: i64 = 101 |
| 38 | const SC_LC_W: i64 = 119 |
| 39 | const SC_BUFCAP: i64 = 262144 |
| 40 | const SC_LOGCAP: i64 = 1048576 |
| 41 | const SC_PATHCAP: i64 = 1024 |
| 42 | const SC_OUTCAP: i64 = 8192 |
| 43 | const SC_DESCCAP: i64 = 1024 |
| 44 | const SC_DIRCAP: i64 = 262144 |
| 45 | const SC_MODE_F: i64 = 420 |
| 46 | const SC_EXITRED: i64 = 3 |
| 47 | const SC_EXEFAIL: i64 = 127 |
| 48 | const SC_STATBUF: i64 = 160 |
| 49 | const SC_NEWLEN: i64 = 4 |
| 50 | const SC_SEV_MISSINGBIN: i64 = 7 |
| 51 | const SC_SEV_STAGEDREF: i64 = 7 |
| 52 | const SC_SEV_NOSCHEMA: i64 = 6 |
| 53 | const SC_SEV_STALESCHEMA: i64 = 5 |
| 54 | const SC_SEV_STRAYNEW: i64 = 5 |
| 55 | const SC_SEV_NOATLAS: i64 = 4 |
functions
| 81 | func sc_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } |
| 83 | func sc_cat(d: *u8, o: i64, s: *u8) -> i64 |
| 91 | func sc_catn(d: *u8, o: i64, v: i64) -> i64 |
| 105 | func sc_path(d: *u8, rel: *u8) -> *u8 |
| 113 | func sc_readf(rel: *u8, cap: i64) -> *u8 |
| 132 | func sc_le(b: *u8, i: i64, n: i64) -> i64 |
| 141 | func sc_col(b: *u8, ls: i64, le: i64, want: i64, sp: *i64) -> i64 |
| 157 | func sc_span_lit(b: *u8, s: i64, e: i64, lit: *u8) -> i64 |
| 165 | func sc_cpspan(b: *u8, sp: *i64) -> *u8 called by 1: sc_scan |
| 173 | func sc_cpspan2(b: *u8, sp: *i64) -> *u8 called by 1: sc_scan |
| 181 | func sc_name_in(b: *u8, n: i64, name: *u8, col: i64) -> i64 |
| 198 | func sc_has_new(b: *u8, sp: *i64) -> i64 called by 1: sc_scan |
| 207 | func sc_exists(p: *u8) -> i64 |
| 220 | func sc_scan_new(emit: i64) -> i64 |
| 246 | func sc_atoi_span(b: *u8, sp: *i64) -> i64 called by 1: sc_l003 |
| 253 | func sc_last_num_after(b: *u8, pat: *u8) -> i64 |
| 280 | func sc_l003(b: *u8) -> i64 |
| 300 | func sc_scan() -> i64 |
| 365 | func sc_append(b: *u8, n: i64) -> i64 |
| 375 | func sc_emit(verb: *u8) -> i64 |
| 418 | func sc_allow_path(name: *u8, outp: *u8) -> i64 |
| 445 | func sc_spawn_filer(fpath: *u8, desc: *u8) -> i64 |
| 467 | func sc_file_cls(fpath: *u8, tail: *u8) -> i64 |
| 491 | func sc_file(filer: *u8) -> i64 |
| 513 | func main(argc: i64, argv: *i64) -> i64 |