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}