nx_uxf_tsv_migrate.nx source
↩ module page · 156 lines · 7291 B
1// nx_uxf_tsv_migrate.nx -- UXF arc R2: the ORIGINAL crash goal made real -- REPLACE A TSV.
2// Reads a real registry TSV, turns EACH data row into a canonical content-addressed record
3// (keys = positional column ids c0..cN, vals = the row's tab-separated fields), and stamps a
4// profiled CID (UXF_DATA). General over ANY TSV (no per-file schema): skip '#' comment lines,
5// split rows on TAB, positional keys. Proves on real data (Rule 7):
6// T1 parsed real rows ; T2 row0 round-trips through nx_uxf_decode to the SAME CID ;
7// T3 DEDUP -- the CID is field-ORDER-INDEPENDENT (canonicalization => same logical row =>
8// one CID, regardless of how the fields were ordered) ; T4 distinct rows => distinct CIDs.
9// Composes the proven envelope: canon_encode + uxf_cid_profiled + canon_decode. No hardware
10// writes (Rule 26). First corpus = sci_units.tsv (small/structured per the substrate spec).
11// expect_exit: 0 license_tier: ORIGINAL
12import "nx_syscalls.nx"
13import "nx_canon_cid.nx"
14import "nx_uxf_cid.nx"
15import "nx_uxf_decode.nx"
16const K_MAGIC_65536: i64 = 65536
17
18func mg_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
19func mg_putn(v: i64) -> i64 { let bb: *u8 = sys_mmap(28); var m: i64 = v; if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) } let t: *u8 = sys_mmap(28); var k: i64 = 0; if m == 0 { t[0] = 48 as u8; k = 1 } while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(1, bb, k); return 0 }
20
21func mg_streq(a: *u8, b: *u8) -> i64 {
22 var i: i64 = 0
23 while 1 == 1 {
24 if a[i] != b[i] { return 0 }
25 if a[i] == (0 as u8) { return 1 }
26 i = i + 1
27 }
28 return 1
29}
30
31// "c" + decimal(idx) + NUL into dst.
32func mg_keyname(idx: i64, dst: *u8) -> i64 {
33 dst[0] = 99 as u8 // 'c'
34 if idx == 0 { dst[1] = 48 as u8; dst[2] = 0 as u8; return 2 }
35 let tmp: *u8 = sys_mmap(24)
36 var m: i64 = idx
37 var k: i64 = 0
38 while m > 0 { tmp[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
39 var i: i64 = 0
40 while i < k { dst[1 + i] = tmp[k - 1 - i]; i = i + 1 }
41 dst[1 + k] = 0 as u8
42 return k + 1
43}
44
45func mg_cpcid(src: *u8, dst: *u8) -> i64 { var i: i64 = 0; while i < 73 { dst[i] = src[i]; i = i + 1 } return 0 }
46
47func main() -> i64 {
48 let lenp: *i64 = sys_mmap(8) as *i64
49 let buf: *u8 = sys_read_file("knowledge/registry/sci_units.tsv\x00", lenp)
50 if (buf as i64) == 0 { mg_puts("R2: sci_units.tsv not found\n" as *u8); sys_exit(1); return 1 }
51 let n: i64 = lenp[0]
52 mg_puts("R2 TSV MIGRATION: knowledge/registry/sci_units.tsv -> content-addressed records\n" as *u8)
53
54 let keys: *i64 = sys_mmap(8 * 64) as *i64
55 let vals: *i64 = sys_mmap(8 * 64) as *i64
56 let canon0: *u8 = sys_mmap(K_MAGIC_65536)
57 var clen0: i64 = 0
58 let first_cid: *u8 = sys_mmap(128)
59 let row1_cid: *u8 = sys_mmap(128)
60 var nrows: i64 = 0
61
62 var i: i64 = 0
63 while i < n {
64 let ls: i64 = i
65 var le: i64 = i
66 var f: i64 = 1
67 while f == 1 {
68 if le >= n { f = 0 } else { if buf[le] == (0x0A as u8) { f = 0 } else { le = le + 1 } }
69 }
70 if le > ls {
71 if buf[ls] != (0x23 as u8) { // not a '#' comment
72 var ncol: i64 = 0
73 var fstart: i64 = ls
74 var p: i64 = ls
75 while p <= le {
76 var isend: i64 = 0
77 if p == le { isend = 1 } else { if buf[p] == (0x09 as u8) { isend = 1 } }
78 if isend == 1 {
79 let flen: i64 = p - fstart
80 let vbuf: *u8 = sys_mmap(flen + 2)
81 var t: i64 = 0
82 while t < flen { vbuf[t] = buf[fstart + t]; t = t + 1 }
83 vbuf[flen] = 0 as u8
84 let kbuf: *u8 = sys_mmap(24)
85 mg_keyname(ncol, kbuf)
86 keys[ncol] = kbuf as i64
87 vals[ncol] = vbuf as i64
88 ncol = ncol + 1
89 fstart = p + 1
90 }
91 p = p + 1
92 }
93 let canonbuf: *u8 = sys_mmap(K_MAGIC_65536)
94 let clen: i64 = canon_encode(keys, vals, ncol, canonbuf)
95 let cidbuf: *u8 = sys_mmap(128)
96 uxf_cid_profiled(UXF_DATA, canonbuf, clen, cidbuf)
97 if nrows == 0 {
98 var z: i64 = 0
99 while z < clen { canon0[z] = canonbuf[z]; z = z + 1 }
100 clen0 = clen
101 mg_cpcid(cidbuf, first_cid)
102 mg_puts(" row0 ncol=" as *u8); mg_putn(ncol); mg_puts(" CID=" as *u8); mg_puts(cidbuf); mg_puts("\n" as *u8)
103 }
104 if nrows == 1 {
105 mg_cpcid(cidbuf, row1_cid)
106 mg_puts(" row1 ncol=" as *u8); mg_putn(ncol); mg_puts(" CID=" as *u8); mg_puts(cidbuf); mg_puts("\n" as *u8)
107 }
108 nrows = nrows + 1
109 }
110 }
111 i = le + 1
112 }
113
114 mg_puts("migrated_rows=" as *u8); mg_putn(nrows); mg_puts("\n" as *u8)
115
116 var pass: i64 = 0
117 var total: i64 = 0
118
119 total = total + 1
120 mg_puts("T1 parsed real rows (>0): " as *u8)
121 if nrows > 0 { pass = pass + 1; mg_puts("PASS\n" as *u8) } else { mg_puts("FAIL\n" as *u8) }
122
123 // T2 round-trip row0 through the tolerant decoder -> same CID
124 let dkeys: *i64 = sys_mmap(8 * 64) as *i64
125 let dvals: *i64 = sys_mmap(8 * 64) as *i64
126 let nf: i64 = canon_decode(canon0, clen0, dkeys, dvals, 64)
127 let rt: *u8 = sys_mmap(K_MAGIC_65536)
128 let rtlen: i64 = canon_encode(dkeys, dvals, nf, rt)
129 let rtcid: *u8 = sys_mmap(128)
130 uxf_cid_profiled(UXF_DATA, rt, rtlen, rtcid)
131 total = total + 1
132 mg_puts("T2 row0 round-trip CID stable (nf=" as *u8); mg_putn(nf); mg_puts("): " as *u8)
133 if mg_streq(rtcid, first_cid) == 1 { pass = pass + 1; mg_puts("PASS\n" as *u8) } else { mg_puts("FAIL\n" as *u8) }
134
135 // T3 dedup: re-encode the decoded fields in REVERSE order -> canonicalization -> same CID
136 let rkeys: *i64 = sys_mmap(8 * 64) as *i64
137 let rvals: *i64 = sys_mmap(8 * 64) as *i64
138 var q: i64 = 0
139 while q < nf { rkeys[q] = dkeys[nf - 1 - q]; rvals[q] = dvals[nf - 1 - q]; q = q + 1 }
140 let rev: *u8 = sys_mmap(K_MAGIC_65536)
141 let revlen: i64 = canon_encode(rkeys, rvals, nf, rev)
142 let revcid: *u8 = sys_mmap(128)
143 uxf_cid_profiled(UXF_DATA, rev, revlen, revcid)
144 total = total + 1
145 mg_puts("T3 dedup (field-order-independent CID): " as *u8)
146 if mg_streq(revcid, first_cid) == 1 { pass = pass + 1; mg_puts("PASS\n" as *u8) } else { mg_puts("FAIL\n" as *u8) }
147
148 // T4 distinct rows -> distinct CIDs
149 total = total + 1
150 mg_puts("T4 distinct rows -> distinct CIDs (row0 != row1): " as *u8)
151 if mg_streq(first_cid, row1_cid) == 0 { pass = pass + 1; mg_puts("PASS\n" as *u8) } else { mg_puts("FAIL\n" as *u8) }
152
153 mg_puts("UXF-TSV-MIGRATE-GATE passed " as *u8); mg_putn(pass); mg_puts("/" as *u8); mg_putn(total)
154 if pass == total { mg_puts(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
155 mg_puts(" verdict=RED\n" as *u8); sys_exit(1); return 1
156}