code wiki / (root) / nx_shard_validator.nx

nx_shard_validator.nx source

↩ module page · 191 lines · 7042 B

1// nx_shard_validator.nx -- per-decl structural validator. 2// 3// Reads a JSONL shard (one decl per line) and verifies EVERY row: 4// 1. row starts with '{' and ends with '}' 5// 2. row contains "source":"<kind>" field 6// 3. row contains "kind":<int> field 7// 4. row contains "name":"<ident>" field 8// 5. name is non-empty, ASCII, no control chars / whitespace inside 9// 6. kind is in {1, 2} 10// 11// Emits per-violation FAIL line + aggregate counters. Exits non-zero 12// if ANY row fails. This is the actual "per-decl smoke" the previous 13// scale-only smoke conflated -- per honest-hard-verdict cardinal. 14// 15// genealogy_id: substrate_per_decl_validator_2026_05_14 16// lineage_id: honest_per_decl_smoke 17 18// nx_safety_envelope: 19// intended_use: AUTO_APPLIED -- primitive-specific tuning queued 20// sil_target: SIL1 21// evidence: [bulk_applied_2026-05-16, see-file-comment-for-detail] 22// verdict: NOT_YET_EVALUATED 23 24import "nx_syscalls.nx" 25import "nx_runtime.nx" 26import "nx_tier.nx" 27const K_MAGIC_1000000: i64 = 1000000 28 29// Search forward from p for the literal pattern. Returns position of 30// first match, or -1 if not found within [p, end). 31func nx_sv_find(buf: *u8, p: nx_int, end: nx_int, pat: *u8, pat_len: nx_int) -> nx_int { 32 var i: nx_int = p 33 while i + pat_len <= end { 34 var j: nx_int = 0 35 var ok: nx_int = 1 36 while j < pat_len { 37 if buf[i + j] != pat[j] { ok = 0; j = pat_len } 38 j = j + 1 39 } 40 if ok == 1 { return i } 41 i = i + 1 42 } 43 return -1 44} 45 46// Validate one JSONL row at buf[lo..hi]. Returns 0 if OK, non-zero 47// failure code per check. 48func nx_sv_validate_row(buf: *u8, lo: nx_int, hi: nx_int) -> nx_int { 49 if hi <= lo + 2 { return 1 } // empty 50 if buf[lo] != 123 { return 2 } // not '{' 51 if buf[hi - 1] != 125 { return 3 } // not '}' 52 53 // Must contain "source": 54 let p_src: nx_int = nx_sv_find(buf, lo, hi, "\"source\":" as *u8, 9) 55 if p_src < 0 { return 4 } 56 57 // Must contain "kind": 58 let p_kind: nx_int = nx_sv_find(buf, lo, hi, "\"kind\":" as *u8, 7) 59 if p_kind < 0 { return 5 } 60 61 // kind must be a digit '1' or '2' immediately after "kind": 62 let kc: nx_int = buf[p_kind + 7] as nx_int 63 if kc < 49 { return 6 } // < '1' 64 if kc > 57 { return 7 } // > '9' 65 66 // Must contain "name":" 67 let p_name: nx_int = nx_sv_find(buf, lo, hi, "\"name\":\"" as *u8, 8) 68 if p_name < 0 { return 8 } 69 70 // Find the closing quote of the name value. 71 let name_start: nx_int = p_name + 8 72 var name_end: nx_int = name_start 73 var de: nx_int = 0 74 while de == 0 { 75 if name_end >= hi { de = 1 } 76 if de == 0 { 77 if buf[name_end] == 34 { de = 1 } // '"' 78 if de == 0 { name_end = name_end + 1 } 79 } 80 } 81 if name_end >= hi { return 9 } 82 if name_end == name_start { return 10 } // empty name 83 84 // Name must be ASCII + no control chars or whitespace inside. 85 var i: nx_int = name_start 86 while i < name_end { 87 let c: nx_int = buf[i] as nx_int 88 if c < 33 { return 11 } // space / control char 89 if c > 126 { return 12 } // non-ASCII 90 i = i + 1 91 } 92 93 return 0 94} 95 96func main() -> nx_exit { 97 let path: *u8 = "/tmp/nx_ingest_lean-shard-0000.jsonl" as *u8 98 let len_p: *nx_int = (sys_mmap(8)) as *nx_int 99 len_p[0] = 0 100 let buf: *u8 = sys_read_file(path, len_p) 101 if (buf as nx_int) == 0 { 102 println("FAIL: shard file not found at /tmp/nx_ingest_lean-shard-0000.jsonl" as *u8) 103 return 100 104 } 105 let n: nx_int = len_p[0] 106 print("shard_bytes=" as *u8); print_i64(n); println("" as *u8) 107 108 var rows_total: nx_int = 0 109 var rows_ok: nx_int = 0 110 var rows_fail: nx_int = 0 111 var fail_first: nx_int = -1 112 var fail_first_row: nx_int = 0 113 var kind_1: nx_int = 0 114 var kind_2: nx_int = 0 115 var name_min_len: nx_int = K_MAGIC_1000000 116 var name_max_len: nx_int = 0 117 var name_total_len: nx_int = 0 118 119 var p: nx_int = 0 120 while p < n { 121 var eol: nx_int = p 122 var de: nx_int = 0 123 while de == 0 { 124 if eol >= n { de = 1 } 125 if de == 0 { 126 if buf[eol] == 10 { de = 1 } 127 if de == 0 { eol = eol + 1 } 128 } 129 } 130 if eol > p { 131 rows_total = rows_total + 1 132 let rc: nx_int = nx_sv_validate_row(buf, p, eol) 133 if rc == 0 { 134 rows_ok = rows_ok + 1 135 // Track kind distribution + name length stats 136 let p_kind: nx_int = nx_sv_find(buf, p, eol, "\"kind\":" as *u8, 7) 137 if p_kind >= 0 { 138 let kc: nx_int = buf[p_kind + 7] as nx_int 139 if kc == 49 { kind_1 = kind_1 + 1 } 140 if kc == 50 { kind_2 = kind_2 + 1 } 141 } 142 let p_name: nx_int = nx_sv_find(buf, p, eol, "\"name\":\"" as *u8, 8) 143 if p_name >= 0 { 144 let ns: nx_int = p_name + 8 145 var ne: nx_int = ns 146 var d: nx_int = 0 147 while d == 0 { 148 if ne >= eol { d = 1 } 149 if d == 0 { 150 if buf[ne] == 34 { d = 1 } 151 if d == 0 { ne = ne + 1 } 152 } 153 } 154 let len: nx_int = ne - ns 155 if len < name_min_len { name_min_len = len } 156 if len > name_max_len { name_max_len = len } 157 name_total_len = name_total_len + len 158 } 159 } 160 if rc != 0 { 161 rows_fail = rows_fail + 1 162 if fail_first < 0 { 163 fail_first = rc 164 fail_first_row = rows_total 165 } 166 } 167 } 168 p = eol + 1 169 } 170 171 println("" as *u8) 172 println("=== PER-DECL VALIDATOR REPORT ===" as *u8) 173 print("rows_total=" as *u8); print_i64(rows_total); println("" as *u8) 174 print("rows_ok=" as *u8); print_i64(rows_ok); println("" as *u8) 175 print("rows_fail=" as *u8); print_i64(rows_fail); println("" as *u8) 176 if rows_fail > 0 { 177 print("first_failure_code=" as *u8); print_i64(fail_first); println("" as *u8) 178 print("first_failure_row=" as *u8); print_i64(fail_first_row); println("" as *u8) 179 } 180 print("kind_1_count=" as *u8); print_i64(kind_1); println("" as *u8) 181 print("kind_2_count=" as *u8); print_i64(kind_2); println("" as *u8) 182 print("name_min_len=" as *u8); print_i64(name_min_len); println("" as *u8) 183 print("name_max_len=" as *u8); print_i64(name_max_len); println("" as *u8) 184 if rows_ok > 0 { 185 print("name_avg_len=" as *u8); print_i64(name_total_len / rows_ok); println("" as *u8) 186 } 187 println("=================================" as *u8) 188 189 if rows_fail > 0 { return 1 } 190 return 0 191}