code wiki / _hdl_build / nx_dedup_migrate.nx
nx_dedup_migrate.nx source
↩ module page · 899 lines · 43990 B
1// nx_dedup_migrate.nx -- D001-FAMILY ORGAN-DEDUP MIGRATION VERIFIER (2026-07-23, dedupq-/TS03 lane).
2//
3// THE DEBT (measured): 245 organs in _hdl_build re-implement the same ~10 span/JSON helpers inline
4// (~2400 duplicated funcs, D001-family; queue = knowledge/store/dedupq-). The canonical base is
5// nx_sovjson_lib.nx (proven consumers: nx_seat/nx_clawf_route/nx_actlog/nx_tokroi/nx_ctxcost).
6// The EDIT (delegate local helpers to sj_*) is mechanical -- an author lane or the local maker
7// produces a .migrated source; THIS organ is the unfailable judge that makes committing it safe,
8// which is what lets the migration run AUTONOMOUSLY (a tool that cannot do the wrong thing beats
9// a session that must remember).
10//
11// THE SOUND ORACLE = BEHAVIOR-EQUIVALENCE (source-byte equivalence is the WRONG oracle -- param
12// names/registers differ across organs; the exact lesson that unblocked the D001 gate campaign
13// via judge-equivalence):
14// (a) exit code identical (original argless probe vs migrated argless probe)
15// (b) stdout byte-identical -- or, when the original is not self-deterministic (two baseline
16// runs differ, e.g. epoch stamps), digit-normalized-identical; the MODE is DECLARED in the
17// report, never silently weakened
18// (c) non-vacuity: the migrated source imports nx_sovjson_lib AND calls sj_* AND differs from
19// the original (an unchanged "migration" is a lie -> REFUSE)
20// commit-or-restore: on ANY refusal/build-failure/harness error the ORIGINAL source is restored
21// AND rebuilt (so /tmp + staged artifacts match reality); the pre-migration copy is kept as
22// <src>.premigrate, FIRST-TOUCH preserved (rule 13 additive -- a second run never clobbers the
23// true original). never-brick: touches ONLY buildroot sources + /tmp build artifacts; live elf
24// promotion stays a separate deliberate /api step. No hw writes (Rule 26).
25//
26// nx_dedup_migrate stage <organ> -- copy <src> -> <src>.migrated (edit substrate)
27// nx_dedup_migrate verify <organ> <migrated-src> -- judge + commit-or-restore
28// nx_dedup_migrate selftest -- hermetic oracle teeth (gv lib)
29// license_tier: ORIGINAL expect_exit: 0
30import "nx_syscalls.nx"
31import "nx_gate_verdict.nx"
32import "nx_tool_run.nx"
33import "nx_sovjson_lib.nx"
34import "nx_store_seed_lib.nx"
35import "nx_seg_store.nx"
36const DD_MAGIC_4096: i64 = 4096
37const DD_MAGIC_1024: i64 = 1024
38const DD_MAGIC_65536: i64 = 65536
39
40const DD_CAP: i64 = 262144
41const DD_PATH: i64 = 512
42const DD_MODE: i64 = 420
43const DD_XMODE: i64 = 493
44const DD_ELF_MAG0: i64 = 127
45const DD_SLOT: i64 = 16
46const DD_ARGV: i64 = 40
47const DD_RES_BYTES: i64 = 64
48const DD_SRC: i64 = 524288
49const DD_PLANE: i64 = 1048576
50const DD_USAGE: i64 = 2
51const DD_REFUSE: i64 = 3
52const DD_HARNESS: i64 = 4
53// res[] contract shared by dd_oracle (writer) and dd_report (reader) -- names ARE the contract
54const DD_R_EXIT: i64 = 0
55const DD_R_OUT: i64 = 1
56const DD_R_NORM: i64 = 2
57const DD_R_IMPORT: i64 = 3
58const DD_R_CALLS: i64 = 4
59const DD_R_CHANGED: i64 = 5
60const DD_R_RAN: i64 = 6
61const DD_RESN: i64 = 7
62const DD_UNMEASURED: i64 = 0 - 1
63
64func dd_eqz(a: *u8, b: *u8) -> i64 {
65 var i: i64 = 0
66 while a[i] != (0 as u8) { if a[i] != b[i] { return 0 } i = i + 1 }
67 if b[i] != (0 as u8) { return 0 }
68 return 1
69}
70
71func dd_read(path: *u8, lenp: *i64) -> *u8 {
72 let szp: *i64 = sys_mmap(DD_SLOT) as *i64
73 let b: *u8 = sys_read_file(path, szp)
74 if (b as i64) == 0 { lenp[0] = 0 - 1; return 0 as *u8 }
75 lenp[0] = szp[0]
76 return b
77}
78
79func dd_write_file(path: *u8, buf: *u8, n: i64) -> i64 { return dd_write_file_m(path, buf, n, DD_MODE) }
80
81func dd_write_file_m(path: *u8, buf: *u8, n: i64, mode: i64) -> i64 {
82 let fd: i64 = sys_openat_wr(path, mode)
83 if fd < 0 { return 0 - 1 }
84 var w: i64 = 0
85 var go: i64 = 1
86 while go == 1 {
87 if w >= n { go = 0 } else {
88 let r: i64 = sys_write(fd, ((buf as i64) + w) as *u8, n - w)
89 if r <= 0 { go = 0 } else { w = w + r }
90 }
91 }
92 sys_close(fd)
93 if w == n { return 0 }
94 return 0 - 1
95}
96
97func dd_byteeq(a: *u8, na: i64, b: *u8, nb: i64) -> i64 {
98 if na != nb { return 0 }
99 var i: i64 = 0
100 while i < na { if a[i] != b[i] { return 0 } i = i + 1 }
101 return 1
102}
103
104// digit-normalized equality: both streams compared with ASCII digits skipped. Used ONLY when the
105// baseline is not self-deterministic, and the report DECLARES the mode (never silently weakened).
106func dd_normeq(a: *u8, na: i64, b: *u8, nb: i64) -> i64 {
107 var i: i64 = 0
108 var j: i64 = 0
109 var eq: i64 = 1
110 var go: i64 = 1
111 while go == 1 {
112 var s1: i64 = 1
113 while s1 == 1 { if i >= na { s1 = 0 } else { let c: i64 = a[i] as i64; if c >= 48 { if c <= 57 { i = i + 1 } else { s1 = 0 } } else { s1 = 0 } } }
114 var s2: i64 = 1
115 while s2 == 1 { if j >= nb { s2 = 0 } else { let d: i64 = b[j] as i64; if d >= 48 { if d <= 57 { j = j + 1 } else { s2 = 0 } } else { s2 = 0 } } }
116 if i >= na { if j >= nb { go = 0 } else { eq = 0; go = 0 } } else {
117 if j >= nb { eq = 0; go = 0 } else {
118 if a[i] != b[j] { eq = 0; go = 0 } else { i = i + 1; j = j + 1 }
119 }
120 }
121 }
122 return eq
123}
124
125// ---------- THE ORACLE (pure: no I/O, hermetically gateable) ----------
126func dd_oracle(rcA: i64, rcB: i64, outA: *u8, nA: i64, outB: *u8, nB: i64, selfdet: i64, imp: i64, calls: i64, changed: i64, res: *i64) -> i64 {
127 var i: i64 = 0
128 while i < DD_RESN { res[i] = 0; i = i + 1 }
129 if rcA == rcB { res[DD_R_EXIT] = 1 }
130 var ranA: i64 = 1
131 if rcA == 127 { if nA == 0 { ranA = 0 } }
132 var ranB: i64 = 1
133 if rcB == 127 { if nB == 0 { ranB = 0 } }
134 if ranA == 1 { if ranB == 1 { res[DD_R_RAN] = 1 } }
135 if selfdet == 1 { res[DD_R_OUT] = dd_byteeq(outA, nA, outB, nB) } else { res[DD_R_OUT] = dd_normeq(outA, nA, outB, nB); res[DD_R_NORM] = 1 }
136 res[DD_R_IMPORT] = imp
137 res[DD_R_CALLS] = calls
138 res[DD_R_CHANGED] = changed
139 if res[DD_R_RAN] == 1 { if res[DD_R_EXIT] == 1 { if res[DD_R_OUT] == 1 { if imp == 1 { if calls == 1 { if changed == 1 { return 1 } } } } } }
140 return 0
141}
142
143func dd_path_src(organ: *u8, out: *u8) -> i64 {
144 var o: i64 = sj_cat(out, 0, "buildroot/runtime/_hdl_build/" as *u8)
145 o = sj_cat(out, o, organ)
146 o = sj_cat(out, o, ".nx" as *u8)
147 out[o] = 0 as u8
148 return o
149}
150
151func dd_path_art(organ: *u8, out: *u8) -> i64 {
152 var o: i64 = sj_cat(out, 0, "/tmp/" as *u8)
153 o = sj_cat(out, o, organ)
154 o = sj_cat(out, o, ".sov.elf" as *u8)
155 out[o] = 0 as u8
156 return o
157}
158
159// build <organ> via the canonical NAS builder (nx_hostctl buildrun -- the same engine /api/build
160// drives; it chdirs to buildroot itself). success = rc 0 + BUILDRUN OK + a real ELF in /tmp.
161func dd_build(organ: *u8) -> i64 {
162 let out: *u8 = sys_mmap(DD_CAP)
163 let ol: *i64 = sys_mmap(DD_SLOT) as *i64
164 let av: *i64 = sys_mmap(DD_ARGV) as *i64
165 let hc: *u8 = "/volume1/homes/elderwesto/nishihost/nx_hostctl\x00" as *u8
166 av[0] = hc as i64
167 av[1] = "buildrun" as *u8 as i64
168 av[2] = organ as i64
169 av[3] = 0
170 let rc: i64 = tr_run_capture(hc, av, out, DD_CAP, ol)
171 if rc != 0 { return 0 - 1 }
172 if tr_contains(out, ol[0], "BUILDRUN OK" as *u8) == 0 { return 0 - 1 }
173 let ap: *u8 = sys_mmap(DD_PATH)
174 dd_path_art(organ, ap)
175 let lp: *i64 = sys_mmap(DD_SLOT) as *i64
176 let ab: *u8 = dd_read(ap, lp)
177 if lp[0] < 4 { return 0 - 1 }
178 if ab[0] != (DD_ELF_MAG0 as u8) { return 0 - 1 }
179 if ab[1] != (69 as u8) { return 0 - 1 }
180 if ab[2] != (76 as u8) { return 0 - 1 }
181 if ab[3] != (70 as u8) { return 0 - 1 }
182 return 0
183}
184
185// NAS /tmp is mounted NOEXEC (banked gotcha) -- exec'ing the artifact there fails 127 with EMPTY
186// output, and a naive equality oracle FALSE-ACCEPTS two identical exec-failures. Caught LIVE on
187// the first exemplar run (favela rc=127/127, 0 bytes -> ACCEPT). Fix: copy the artifact to an
188// exec-ok cwd scratch (0755) and run THAT; the oracle's ran-clause also refuses 127+empty outright.
189func dd_run(organ: *u8, out: *u8, ol: *i64) -> i64 {
190 let ap: *u8 = sys_mmap(DD_PATH)
191 dd_path_art(organ, ap)
192 let lp: *i64 = sys_mmap(DD_SLOT) as *i64
193 let ab: *u8 = dd_read(ap, lp)
194 if lp[0] <= 0 { ol[0] = 0; return 127 }
195 let pb: *u8 = "./_ddm_probe.elf\x00" as *u8
196 if dd_write_file_m(pb, ab, lp[0], DD_XMODE) != 0 { ol[0] = 0; return 127 }
197 return tr_run1(pb, 0 as *u8, out, DD_CAP, ol)
198}
199
200// report: one JSON line to stdout + latest-result evidence file (knowledge/status/dedup_migrate.out).
201// -1 fields = UNMEASURED (the step was never reached), never a silent 0.
202func dd_report(organ: *u8, verdict: *u8, res: *i64, rcA: i64, rcB: i64, nA: i64, nB: i64, srcA: i64, srcB: i64, reason: *u8) -> i64 {
203 let jb: *u8 = sys_mmap(DD_CAP)
204 var j: i64 = 0
205 j = sj_cat(jb, j, "{\x22organ\x22:\x22" as *u8)
206 j = sj_cat(jb, j, organ)
207 j = sj_cat(jb, j, "\x22,\x22verdict\x22:\x22" as *u8)
208 j = sj_cat(jb, j, verdict)
209 j = sj_cat(jb, j, "\x22,\x22mode\x22:\x22" as *u8)
210 if res[DD_R_NORM] == 1 { j = sj_cat(jb, j, "NORM-digits-stripped" as *u8) } else { j = sj_cat(jb, j, "BYTE" as *u8) }
211 j = sj_cat(jb, j, "\x22,\x22rc_orig\x22:" as *u8)
212 j = sj_catn(jb, j, rcA)
213 j = sj_cat(jb, j, ",\x22rc_mig\x22:" as *u8)
214 j = sj_catn(jb, j, rcB)
215 j = sj_cat(jb, j, ",\x22out_bytes_orig\x22:" as *u8)
216 j = sj_catn(jb, j, nA)
217 j = sj_cat(jb, j, ",\x22out_bytes_mig\x22:" as *u8)
218 j = sj_catn(jb, j, nB)
219 j = sj_cat(jb, j, ",\x22src_bytes_orig\x22:" as *u8)
220 j = sj_catn(jb, j, srcA)
221 j = sj_cat(jb, j, ",\x22src_bytes_mig\x22:" as *u8)
222 j = sj_catn(jb, j, srcB)
223 j = sj_cat(jb, j, ",\x22clauses\x22:{\x22exit\x22:" as *u8)
224 j = sj_catn(jb, j, res[DD_R_EXIT])
225 j = sj_cat(jb, j, ",\x22out\x22:" as *u8)
226 j = sj_catn(jb, j, res[DD_R_OUT])
227 j = sj_cat(jb, j, ",\x22import\x22:" as *u8)
228 j = sj_catn(jb, j, res[DD_R_IMPORT])
229 j = sj_cat(jb, j, ",\x22calls\x22:" as *u8)
230 j = sj_catn(jb, j, res[DD_R_CALLS])
231 j = sj_cat(jb, j, ",\x22changed\x22:" as *u8)
232 j = sj_catn(jb, j, res[DD_R_CHANGED])
233 j = sj_cat(jb, j, ",\x22ran\x22:" as *u8)
234 j = sj_catn(jb, j, res[DD_R_RAN])
235 j = sj_cat(jb, j, "},\x22reason\x22:\x22" as *u8)
236 j = sj_cat(jb, j, reason)
237 j = sj_cat(jb, j, "\x22}" as *u8)
238 jb[j] = 10 as u8
239 j = j + 1
240 sys_write(1, jb, j)
241 dd_write_file("knowledge/status/dedup_migrate.out\x00" as *u8, jb, j)
242 return 0
243}
244
245// ---------- TS06: THE DETERMINISTIC DELEGATION EDITOR ----------
246// Rewrites known duplicated helper bodies to one-line sj_* delegations. Quote+comment-aware,
247// top-level (line-start) decls only, and GUARDED per class: semantic look-alikes that differ
248// (a NUL-terminating cat, a count-returning puts) are SKIPPED, never rewritten. The VERIFY
249// judge stays the soundness authority downstream -- these guards just keep the editor from
250// PROPOSING a known-divergent rewrite. Bounded structural table (6 rows) lives in the de_*
251// accessor funcs (indexable-const trap avoided by construction).
252
253func de_isws(c: i64) -> i64 { if c == 32 { return 1 } if c == 9 { return 1 } return 0 }
254
255func de_at(q: *u8, n: i64, i: i64, lit: *u8) -> i64 {
256 var k: i64 = 0
257 while lit[k] != (0 as u8) {
258 if i + k >= n { return 0 }
259 if q[i+k] != lit[k] { return 0 }
260 k = k + 1
261 }
262 return 1
263}
264
265func de_linestart(q: *u8, i: i64) -> i64 {
266 if i == 0 { return 1 }
267 if q[i-1] == (10 as u8) { return 1 }
268 return 0
269}
270
271// matching close brace from q[open]=='{' -- quote-span and //-comment aware; -1 if unbalanced
272func de_close(q: *u8, n: i64, open: i64) -> i64 {
273 var d: i64 = 0
274 var i: i64 = open
275 var instr: i64 = 0
276 while i < n {
277 var c: i64 = q[i] as i64
278 if instr == 1 {
279 if c == 34 { instr = 0 }
280 i = i + 1
281 } else {
282 if c == 34 { instr = 1; i = i + 1 } else {
283 var iscmt: i64 = 0
284 if c == 47 { if i + 1 < n { if q[i+1] == (47 as u8) { iscmt = 1 } } }
285 if iscmt == 1 {
286 var s: i64 = 1
287 while s == 1 { if i >= n { s = 0 } else { if q[i] == (10 as u8) { s = 0 } else { i = i + 1 } } }
288 } else {
289 if c == 123 { d = d + 1 }
290 if c == 125 { d = d - 1; if d == 0 { return i } }
291 i = i + 1
292 }
293 }
294 }
295 }
296 return 0 - 1
297}
298
299func de_endswith(q: *u8, s: i64, e: i64, lit: *u8) -> i64 {
300 let ll: i64 = sj_vlen(lit)
301 if e - s < ll { return 0 }
302 return sj_lit_eq(q, e - ll, e, lit)
303}
304
305// F958 (2026-07-23): table GROWN to the measured tree-wide helper shapes. Coverage scales by ROWS,
306// pipeline unchanged. _put/_w are cat/puts-class aliases (nx_cleanview ncv_put, nx_dup_source_check dp_w);
307// _putn is catn-class BUT ncv_putn was MEASURED to lack the negative branch, so putn/catn-class now
308// REQUIRE the sign-write marker -- a divergent look-alike is refused, never rewritten (fail-closed).
309const DE_N: i64 = 9
310func de_suffix(k: i64) -> *u8 {
311 if k == 0 { return "_puts" as *u8 }
312 if k == 1 { return "_werr" as *u8 }
313 if k == 2 { return "_vlen" as *u8 }
314 if k == 3 { return "_slen" as *u8 }
315 if k == 4 { return "_cat" as *u8 }
316 if k == 5 { return "_catn" as *u8 }
317 if k == 6 { return "_put" as *u8 }
318 if k == 7 { return "_putn" as *u8 }
319 if k == 8 { return "_w" as *u8 }
320 return 0 as *u8
321}
322func de_sig(k: i64) -> *u8 {
323 if k == 0 { return "p" as *u8 }
324 if k == 1 { return "p" as *u8 }
325 if k == 2 { return "p" as *u8 }
326 if k == 3 { return "p" as *u8 }
327 if k == 4 { return "pip" as *u8 }
328 if k == 5 { return "pii" as *u8 }
329 if k == 6 { return "pip" as *u8 }
330 if k == 7 { return "pii" as *u8 }
331 if k == 8 { return "p" as *u8 }
332 return 0 as *u8
333}
334func de_target(k: i64) -> *u8 {
335 if k == 0 { return "sj_puts" as *u8 }
336 if k == 1 { return "sj_werr" as *u8 }
337 if k == 2 { return "sj_vlen" as *u8 }
338 if k == 3 { return "sj_vlen" as *u8 }
339 if k == 4 { return "sj_cat" as *u8 }
340 if k == 5 { return "sj_catn" as *u8 }
341 if k == 6 { return "sj_cat" as *u8 }
342 if k == 7 { return "sj_catn" as *u8 }
343 if k == 8 { return "sj_puts" as *u8 }
344 return 0 as *u8
345}
346
347// cat-class divergence: a body that NUL-terminates its own output is NOT sj_cat (gm_cat-style).
348func de_nulterm(q: *u8, ob: i64, cb: i64) -> i64 {
349 if sj_span_has(q, ob, cb, "] = 0 as u8" as *u8) == 1 { return 1 }
350 if sj_span_has(q, ob, cb, "]=0 as u8" as *u8) == 1 { return 1 }
351 return 0
352}
353
354// attempt a rewrite at q[i]=="func ": on success emit decl-verbatim + delegation into out at o,
355// write [resume_i, new_o] into res2, return 1. Any parse doubt or failed guard -> return 0 (fail-closed).
356func de_try(q: *u8, n: i64, i: i64, out: *u8, o: i64, res2: *i64) -> i64 {
357 var ns: i64 = i + 5
358 var ne: i64 = ns
359 var s: i64 = 1
360 while s == 1 { if ne >= n { return 0 } if q[ne] == (40 as u8) { s = 0 } else { ne = ne + 1 } }
361 var nee: i64 = ne
362 var t: i64 = 1
363 while t == 1 { if nee > ns { if de_isws(q[nee-1] as i64) == 1 { nee = nee - 1 } else { t = 0 } } else { t = 0 } }
364 if de_at(q, n, ns, "sj_" as *u8) == 1 { return 0 }
365 var k: i64 = 0 - 1
366 var kk2: i64 = 0
367 while kk2 < DE_N {
368 if k < 0 { if de_endswith(q, ns, nee, de_suffix(kk2)) == 1 { k = kk2 } }
369 kk2 = kk2 + 1
370 }
371 if k < 0 { return 0 }
372 let ps: i64 = ne + 1
373 var pe: i64 = ps
374 s = 1
375 while s == 1 { if pe >= n { return 0 } if q[pe] == (41 as u8) { s = 0 } else { pe = pe + 1 } }
376 if pe == ps { return 0 }
377 let pns: *i64 = sys_mmap(64) as *i64
378 let pnl: *i64 = sys_mmap(64) as *i64
379 let sigb: *u8 = sys_mmap(16)
380 var np: i64 = 0
381 var cur: i64 = ps
382 var go: i64 = 1
383 while go == 1 {
384 var ce: i64 = cur
385 var s3: i64 = 1
386 while s3 == 1 { if ce >= pe { s3 = 0 } else { if q[ce] == (44 as u8) { s3 = 0 } else { ce = ce + 1 } } }
387 var a: i64 = cur
388 var t2: i64 = 1
389 while t2 == 1 { if a < ce { if de_isws(q[a] as i64) == 1 { a = a + 1 } else { t2 = 0 } } else { t2 = 0 } }
390 var b: i64 = a
391 s3 = 1
392 while s3 == 1 { if b >= ce { return 0 } if q[b] == (58 as u8) { s3 = 0 } else { b = b + 1 } }
393 var bb: i64 = b
394 t2 = 1
395 while t2 == 1 { if bb > a { if de_isws(q[bb-1] as i64) == 1 { bb = bb - 1 } else { t2 = 0 } } else { t2 = 0 } }
396 if np >= 4 { return 0 }
397 pns[np] = a
398 pnl[np] = bb - a
399 var isp: i64 = 0
400 var x: i64 = b
401 while x < ce { if q[x] == (42 as u8) { isp = 1 } x = x + 1 }
402 if isp == 1 { sigb[np] = 112 as u8 } else { sigb[np] = 105 as u8 }
403 np = np + 1
404 if ce >= pe { go = 0 } else { cur = ce + 1 }
405 }
406 if sj_lit_eq(sigb, 0, np, de_sig(k)) == 0 { return 0 }
407 var os2: i64 = pe + 1
408 var ob: i64 = 0 - 1
409 s = 1
410 while s == 1 { if os2 >= n { return 0 } if q[os2] == (123 as u8) { ob = os2; s = 0 } else { os2 = os2 + 1 } }
411 if sj_span_has(q, pe, ob, "i64" as *u8) == 0 { return 0 }
412 let cb: i64 = de_close(q, n, ob)
413 if cb < 0 { return 0 }
414 if k == 0 { if sj_span_has(q, ob, cb, "return 0" as *u8) == 0 { return 0 } }
415 if k == 1 { if sj_span_has(q, ob, cb, "return 0" as *u8) == 0 { return 0 } }
416 if k == 8 { if sj_span_has(q, ob, cb, "return 0" as *u8) == 0 { return 0 } }
417 if k == 2 { if sj_span_has(q, ob, cb, "return n" as *u8) == 0 { return 0 } }
418 if k == 3 { if sj_span_has(q, ob, cb, "return n" as *u8) == 0 { return 0 } }
419 if k == 4 { if de_nulterm(q, ob, cb) == 1 { return 0 } }
420 if k == 6 { if de_nulterm(q, ob, cb) == 1 { return 0 } }
421 if k == 5 { if sj_span_has(q, ob, cb, "45 as u8" as *u8) == 0 { return 0 } }
422 if k == 7 { if sj_span_has(q, ob, cb, "45 as u8" as *u8) == 0 { return 0 } }
423 var oo: i64 = o
424 var y: i64 = i
425 while y < ob { out[oo] = q[y]; oo = oo + 1; y = y + 1 }
426 oo = sj_cat(out, oo, "{ return " as *u8)
427 oo = sj_cat(out, oo, de_target(k))
428 oo = sj_cat(out, oo, "(" as *u8)
429 var z: i64 = 0
430 while z < np {
431 if z > 0 { oo = sj_cat(out, oo, ", " as *u8) }
432 var w2: i64 = 0
433 while w2 < pnl[z] { out[oo] = q[pns[z] + w2]; oo = oo + 1; w2 = w2 + 1 }
434 z = z + 1
435 }
436 oo = sj_cat(out, oo, ") }" as *u8)
437 res2[0] = cb + 1
438 res2[1] = oo
439 return 1
440}
441
442// rewrite pass: known-helper bodies -> sj_ delegations. Import NOT inserted here (explicit
443// second step) so a zero-rewrite pass leaves the source byte-identical. Returns rewrite count.
444func dd_edit(q: *u8, n: i64, out: *u8, lenp: *i64) -> i64 {
445 var o: i64 = 0
446 var i: i64 = 0
447 var count: i64 = 0
448 var instr: i64 = 0
449 while i < n {
450 var c: i64 = q[i] as i64
451 var handled: i64 = 0
452 if instr == 0 {
453 var iscmt: i64 = 0
454 if c == 47 { if i + 1 < n { if q[i+1] == (47 as u8) { iscmt = 1 } } }
455 if iscmt == 1 {
456 var s2: i64 = 1
457 while s2 == 1 { if i >= n { s2 = 0 } else { if q[i] == (10 as u8) { s2 = 0 } else { out[o] = q[i]; o = o + 1; i = i + 1 } } }
458 handled = 1
459 } else {
460 if c == 102 { if de_linestart(q, i) == 1 { if de_at(q, n, i, "func " as *u8) == 1 {
461 let r2: *i64 = sys_mmap(16) as *i64
462 if de_try(q, n, i, out, o, r2) == 1 { i = r2[0]; o = r2[1]; count = count + 1; handled = 1 }
463 } } }
464 }
465 }
466 if handled == 0 {
467 if instr == 1 { if c == 34 { instr = 0 } } else { if c == 34 { instr = 1 } }
468 out[o] = c as u8
469 o = o + 1
470 i = i + 1
471 }
472 }
473 lenp[0] = o
474 return count
475}
476
477// insert the lib import before the first existing import line; returns 1 if inserted
478func dd_insert_import(q: *u8, n: i64, out: *u8, lenp: *i64) -> i64 {
479 var i: i64 = 0
480 var o: i64 = 0
481 var done: i64 = 0
482 while i < n {
483 if done == 0 { if de_linestart(q, i) == 1 { if de_at(q, n, i, "import \x22" as *u8) == 1 {
484 o = sj_cat(out, o, "import \x22nx_sovjson_lib.nx\x22\n" as *u8)
485 done = 1
486 } } }
487 out[o] = q[i]
488 o = o + 1
489 i = i + 1
490 }
491 lenp[0] = o
492 return done
493}
494
495// parse a dedupq- plane line: payload = last tab-separated field, pipe-packed
496// id|organ|route|status|note. Returns 1 ONLY for route=LOCAL-MAKER status=queued rows;
497// res = [id_s, id_e, organ_s, organ_e]. Summary/measured/done/skipped rows all return 0.
498func dd_qparse(q: *u8, ls: i64, le: i64, res: *i64) -> i64 {
499 var lt: i64 = 0 - 1
500 var i: i64 = ls
501 while i < le { if q[i] == (9 as u8) { lt = i } i = i + 1 }
502 if lt < 0 { return 0 }
503 let ps: i64 = lt + 1
504 let pp: *i64 = sys_mmap(64) as *i64
505 var np: i64 = 0
506 i = ps
507 while i < le { if q[i] == (124 as u8) { if np < 6 { pp[np] = i; np = np + 1 } } i = i + 1 }
508 if np < 4 { return 0 }
509 if sj_lit_eq(q, pp[1] + 1, pp[2], "LOCAL-MAKER" as *u8) == 0 { return 0 }
510 if sj_lit_eq(q, pp[2] + 1, pp[3], "queued" as *u8) == 0 { return 0 }
511 res[0] = ps
512 res[1] = pp[0]
513 res[2] = pp[0] + 1
514 res[3] = pp[1]
515 return 1
516}
517
518func main(argc: i64, argv: *i64) -> i64 {
519 if argc < 2 {
520 sj_werr("usage: nx_dedup_migrate stage <organ> | edit <organ> | verify <organ> <migrated-src> | queue [max] | selftest\n" as *u8)
521 sys_exit(DD_USAGE)
522 return DD_USAGE
523 }
524 let verb: *u8 = argv[1] as *u8
525
526 if dd_eqz(verb, "selftest" as *u8) == 1 {
527 let ctr: *i64 = gv_ctr()
528 gv_head("nx_dedup_migrate selftest -- the behavior-equivalence oracle (hermetic, pure fns only)" as *u8)
529 let tx: *u8 = "hello n=123 end\n" as *u8
530 let ty: *u8 = "hello n=456 end\n" as *u8
531 let tz: *u8 = "goodbye n=123 end\n" as *u8
532 let nx1: i64 = sj_vlen(tx)
533 let ny1: i64 = sj_vlen(ty)
534 let nz1: i64 = sj_vlen(tz)
535 let res: *i64 = sys_mmap(DD_RES_BYTES) as *i64
536 gv_check("T1 identical out+rc with vacuity ok -> ACCEPT" as *u8, dd_oracle(0, 0, tx, nx1, tx, nx1, 1, 1, 1, 1, res), ctr)
537 gv_check("T2 exit-code divergence -> REFUSE" as *u8, 1 - dd_oracle(0, 1, tx, nx1, tx, nx1, 1, 1, 1, 1, res), ctr)
538 gv_check("T3 BYTE mode digit drift -> REFUSE" as *u8, 1 - dd_oracle(0, 0, tx, nx1, ty, ny1, 1, 1, 1, 1, res), ctr)
539 gv_check("T4 NORM mode declared, digit drift tolerated -> ACCEPT" as *u8, dd_oracle(0, 0, tx, nx1, ty, ny1, 0, 1, 1, 1, res), ctr)
540 gv_check("T5 NORM mode structural drift still -> REFUSE" as *u8, 1 - dd_oracle(0, 0, tx, nx1, tz, nz1, 0, 1, 1, 1, res), ctr)
541 gv_check("T6 vacuity no lib import -> REFUSE" as *u8, 1 - dd_oracle(0, 0, tx, nx1, tx, nx1, 1, 0, 1, 1, res), ctr)
542 gv_check("T7 vacuity no sj_ call -> REFUSE" as *u8, 1 - dd_oracle(0, 0, tx, nx1, tx, nx1, 1, 1, 0, 1, res), ctr)
543 gv_check("T8 vacuity unchanged source -> REFUSE" as *u8, 1 - dd_oracle(0, 0, tx, nx1, tx, nx1, 1, 1, 1, 0, res), ctr)
544 gv_check("T9 normeq digits-stripped equal holds" as *u8, dd_normeq(tx, nx1, ty, ny1), ctr)
545 gv_check("T10 normeq structural difference refused" as *u8, 1 - dd_normeq(tx, nx1, tz, nz1), ctr)
546 gv_check("T11 exec-failure sentinel 127+empty never ACCEPTs (the live favela false-accept, reproduced)" as *u8, 1 - dd_oracle(127, 127, tx, 0, tx, 0, 1, 1, 1, 1, res), ctr)
547 gv_check("T12 rc 127 WITH real output stays judgeable" as *u8, dd_oracle(127, 127, tx, nx1, tx, nx1, 1, 1, 1, 1, res), ctr)
548 let e1: *u8 = sys_mmap(DD_SRC)
549 let el1: *i64 = sys_mmap(DD_SLOT) as *i64
550 let t13: *u8 = "import \x22nx_syscalls.nx\x22\nfunc ab_puts(s: *u8) -> i64 { var n: i64 = 0\nwhile s[n] != (0 as u8) { n = n + 1 }\nsys_write(1, s, n)\nreturn 0 }\nfunc main() -> i64 { return 0 }\n" as *u8
551 let c13: i64 = dd_edit(t13, sj_vlen(t13), e1, el1)
552 var ok13: i64 = 0
553 if c13 == 1 { if tr_contains(e1, el1[0], "func ab_puts(s: *u8) -> i64 { return sj_puts(s) }" as *u8) == 1 { ok13 = 1 } }
554 gv_check("T13 editor rewrites a matching _puts helper to sj_ delegation" as *u8, ok13, ctr)
555 let e2: *u8 = sys_mmap(DD_SRC)
556 let el2: *i64 = sys_mmap(DD_SLOT) as *i64
557 dd_insert_import(e1, el1[0], e2, el2)
558 gv_check("T14 lib import inserted before the first existing import" as *u8, tr_contains(e2, el2[0], "import \x22nx_sovjson_lib.nx\x22\nimport \x22nx_syscalls.nx\x22" as *u8), ctr)
559 let t15: *u8 = "func ab_cat(o: i64, s: *u8) -> i64 { return 0 }\n" as *u8
560 let c15: i64 = dd_edit(t15, sj_vlen(t15), e1, el1)
561 var ok15: i64 = 0
562 if c15 == 0 { if dd_byteeq(t15, sj_vlen(t15), e1, el1[0]) == 1 { ok15 = 1 } }
563 gv_check("T15 signature mismatch skipped, source byte-identical" as *u8, ok15, ctr)
564 let t16: *u8 = "func ab_cat(d: *u8, o: i64, s: *u8) -> i64 { var i: i64 = 0\nvar oo: i64 = o\nwhile s[i] != (0 as u8) { d[oo] = s[i]; oo = oo + 1; i = i + 1 }\nd[oo] = 0 as u8\nreturn oo }\n" as *u8
565 let c16: i64 = dd_edit(t16, sj_vlen(t16), e1, el1)
566 gv_check("T16 NUL-terminating cat variant REFUSED by guard" as *u8, 1 - c16, ctr)
567 let t17: *u8 = "// func zz_puts(s: *u8) -> i64 { junk }\nfunc ab_vlen(s: *u8) -> i64 { var n: i64 = 0\nwhile s[n] != (0 as u8) { n = n + 1 }\nreturn n }\n" as *u8
568 let c17: i64 = dd_edit(t17, sj_vlen(t17), e1, el1)
569 var ok17: i64 = 0
570 if c17 == 1 { if tr_contains(e1, el1[0], "return sj_vlen(s)" as *u8) == 1 { if tr_contains(e1, el1[0], "// func zz_puts(s: *u8) -> i64 { junk }" as *u8) == 1 { ok17 = 1 } } }
571 gv_check("T17 commented decl untouched while real decl rewrites" as *u8, ok17, ctr)
572 let t18: *u8 = "func ab_werr(s: *u8) -> i64 { sys_write(2, \x22{\x22 as *u8, 1)\nreturn 0 }\nfunc tail2() -> i64 { return 7 }\n" as *u8
573 let c18: i64 = dd_edit(t18, sj_vlen(t18), e1, el1)
574 var ok18: i64 = 0
575 if c18 == 1 { if tr_contains(e1, el1[0], "{ return sj_werr(s) }" as *u8) == 1 { if tr_contains(e1, el1[0], "func tail2() -> i64 { return 7 }" as *u8) == 1 { ok18 = 1 } } }
576 gv_check("T18 brace-inside-string body: close brace found correctly, tail preserved" as *u8, ok18, ctr)
577 let q19: *u8 = "999\x09actor\x09put\x09DQ099\x09-\x09DQ099|nx_foo|LOCAL-MAKER|queued|note" as *u8
578 let r19: *i64 = sys_mmap(64) as *i64
579 var ok19: i64 = 0
580 if dd_qparse(q19, 0, sj_vlen(q19), r19) == 1 { if sj_lit_eq(q19, r19[2], r19[3], "nx_foo" as *u8) == 1 { ok19 = 1 } }
581 gv_check("T19 queue row parse extracts organ from queued LOCAL-MAKER row" as *u8, ok19, ctr)
582 let q20: *u8 = "999\x09actor\x09put\x09DQ098\x09-\x09DQ098|nx_foo|LOCAL-MAKER|done|note" as *u8
583 let q21: *u8 = "999\x09actor\x09put\x09DQ000\x09-\x09DQ000|summary|MEASURED|reframe|note" as *u8
584 var ok20: i64 = 0
585 if dd_qparse(q20, 0, sj_vlen(q20), r19) == 0 { if dd_qparse(q21, 0, sj_vlen(q21), r19) == 0 { ok20 = 1 } }
586 gv_check("T20 done rows and non-LOCAL-MAKER rows rejected by the queue parser" as *u8, ok20, ctr)
587 let t21: *u8 = "func ab_put(d: *u8, o: i64, s: *u8) -> i64 { var i: i64 = 0\nvar oo: i64 = o\nwhile s[i] != (0 as u8) { d[oo] = s[i]; oo = oo + 1; i = i + 1 }\nreturn oo }\n" as *u8
588 let c21: i64 = dd_edit(t21, sj_vlen(t21), e1, el1)
589 var ok21: i64 = 0
590 if c21 == 1 { if tr_contains(e1, el1[0], "{ return sj_cat(d, o, s) }" as *u8) == 1 { ok21 = 1 } }
591 gv_check("T21 F958 _put alias rewrites to sj_cat" as *u8, ok21, ctr)
592 let t22: *u8 = "func ab_putn(d: *u8, o: i64, v: i64) -> i64 { var m: i64 = v\nreturn o }\n" as *u8
593 let c22: i64 = dd_edit(t22, sj_vlen(t22), e1, el1)
594 var ok22: i64 = 0
595 if c22 == 0 { if dd_byteeq(t22, sj_vlen(t22), e1, el1[0]) == 1 { ok22 = 1 } }
596 gv_check("T22 F958 _putn WITHOUT the negative branch REFUSED (the measured ncv_putn divergence)" as *u8, ok22, ctr)
597 let t23: *u8 = "func ab_putn(d: *u8, o: i64, v: i64) -> i64 { var m: i64 = v\nif m < 0 { d[o] = 45 as u8 }\nreturn o }\n" as *u8
598 let c23: i64 = dd_edit(t23, sj_vlen(t23), e1, el1)
599 var ok23: i64 = 0
600 if c23 == 1 { if tr_contains(e1, el1[0], "{ return sj_catn(d, o, v) }" as *u8) == 1 { ok23 = 1 } }
601 gv_check("T23 F958 _putn WITH the sign write accepted" as *u8, ok23, ctr)
602 let t24: *u8 = "func ab_w(s: *u8) -> i64 { var n: i64 = 0\nwhile s[n] != (0 as u8) { n = n + 1 }\nsys_write(1, s, n)\nreturn 0 }\n" as *u8
603 let c24: i64 = dd_edit(t24, sj_vlen(t24), e1, el1)
604 var ok24: i64 = 0
605 if c24 == 1 { if tr_contains(e1, el1[0], "{ return sj_puts(s) }" as *u8) == 1 { ok24 = 1 } }
606 gv_check("T24 F958 _w alias rewrites to sj_puts" as *u8, ok24, ctr)
607 let rc: i64 = gv_verdict("DEDUP-MIGRATE-SELFTEST" as *u8, ctr, "oracle sound: equivalence + declared NORM + non-vacuity + fail-closed" as *u8)
608 sys_exit(rc)
609 return rc
610 }
611
612 if dd_eqz(verb, "stage" as *u8) == 1 {
613 if argc < 3 { sj_werr("DD-USAGE stage <organ>\n" as *u8); sys_exit(DD_USAGE); return DD_USAGE }
614 let organ: *u8 = argv[2] as *u8
615 let sp: *u8 = sys_mmap(DD_PATH)
616 dd_path_src(organ, sp)
617 let olp: *i64 = sys_mmap(DD_SLOT) as *i64
618 let ob: *u8 = dd_read(sp, olp)
619 if olp[0] <= 0 { sj_werr("DD-HARNESS cannot read organ source\n" as *u8); sys_exit(DD_HARNESS); return DD_HARNESS }
620 let mp: *u8 = sys_mmap(DD_PATH)
621 var mo: i64 = dd_path_src(organ, mp)
622 mo = sj_cat(mp, mo, ".migrated" as *u8)
623 mp[mo] = 0 as u8
624 if dd_write_file(mp, ob, olp[0]) != 0 { sj_werr("DD-HARNESS stage write failed\n" as *u8); sys_exit(DD_HARNESS); return DD_HARNESS }
625 sj_puts("DD-STAGED " as *u8)
626 sj_puts(mp)
627 sj_puts(" bytes=" as *u8)
628 let bb: *u8 = sys_mmap(32)
629 var bo: i64 = sj_catn(bb, 0, olp[0])
630 bb[bo] = 10 as u8
631 sys_write(1, bb, bo + 1)
632 sys_exit(0)
633 return 0
634 }
635
636 // TS06b ZERO-CLAUDE WALKER: drain queued dedupq- rows -- fork SELF (live elf) for
637 // edit+verify (the judge stays the authority), fork nx_store_put to mark each row by
638 // OUTCOME (done/skipped/refused); harness-errors are NOT marked = left queued for retry.
639 // Bounded per run (scale-law: remaining_queued declared). Promotion stays a deliberate
640 // /api step (never-brick) -- done rows note the staged artifact awaiting promote.
641 if dd_eqz(verb, "queue" as *u8) == 1 {
642 var maxn: i64 = 2
643 if argc >= 3 { maxn = sj_atoi_z(argv[2] as *u8) }
644 if maxn <= 0 { maxn = 2 }
645 let pb: *u8 = sys_mmap(DD_PLANE)
646 let pn: i64 = sts_load("knowledge/store/dedupq-\x00" as *u8, pb, DD_PLANE - DD_MAGIC_4096)
647 if pn <= 0 { sj_werr("DD-HARNESS dedupq- plane absent or empty\n" as *u8); sys_exit(DD_HARNESS); return DD_HARNESS }
648 let selfp: *u8 = "/volume1/homes/elderwesto/nishihost/nx_dedup_migrate.elf\x00" as *u8
649 let sput: *u8 = "/volume1/homes/elderwesto/nishihost/nx_store_put.elf\x00" as *u8
650 var i: i64 = 0
651 var processed: i64 = 0
652 var ndone: i64 = 0
653 var nskip: i64 = 0
654 var nref: i64 = 0
655 var nerr: i64 = 0
656 var nrem: i64 = 0
657 while i < pn {
658 let ls: i64 = i
659 let le2: i64 = sj_le(pb, ls, pn)
660 i = le2 + 1
661 let r4: *i64 = sys_mmap(64) as *i64
662 if dd_qparse(pb, ls, le2, r4) == 1 {
663 if processed >= maxn { nrem = nrem + 1 } else {
664 processed = processed + 1
665 let idb: *u8 = sys_mmap(128)
666 var x1: i64 = 0
667 var y1: i64 = r4[0]
668 while y1 < r4[1] { idb[x1] = pb[y1]; x1 = x1 + 1; y1 = y1 + 1 }
669 idb[x1] = 0 as u8
670 let ogb: *u8 = sys_mmap(256)
671 x1 = 0
672 y1 = r4[2]
673 while y1 < r4[3] { ogb[x1] = pb[y1]; x1 = x1 + 1; y1 = y1 + 1 }
674 ogb[x1] = 0 as u8
675 let eo: *u8 = sys_mmap(DD_CAP)
676 let eol: *i64 = sys_mmap(DD_SLOT) as *i64
677 let av1: *i64 = sys_mmap(DD_ARGV) as *i64
678 av1[0] = selfp as i64
679 av1[1] = "edit" as *u8 as i64
680 av1[2] = ogb as i64
681 av1[3] = 0
682 let erc: i64 = tr_run_capture(selfp, av1, eo, DD_CAP, eol)
683 var code: i64 = 3
684 if erc == 0 {
685 if tr_contains(eo, eol[0], "NO-CANDIDATES" as *u8) == 1 { code = 1 } else {
686 let mp2: *u8 = sys_mmap(DD_PATH)
687 var mo2: i64 = dd_path_src(ogb, mp2)
688 mo2 = sj_cat(mp2, mo2, ".migrated" as *u8)
689 mp2[mo2] = 0 as u8
690 let vo: *u8 = sys_mmap(DD_CAP)
691 let vol: *i64 = sys_mmap(DD_SLOT) as *i64
692 let av2: *i64 = sys_mmap(DD_ARGV) as *i64
693 av2[0] = selfp as i64
694 av2[1] = "verify" as *u8 as i64
695 av2[2] = ogb as i64
696 av2[3] = mp2 as i64
697 av2[4] = 0
698 let vrc: i64 = tr_run_capture(selfp, av2, vo, DD_CAP, vol)
699 if vrc == 0 { code = 0 }
700 if vrc == DD_REFUSE { code = 2 }
701 }
702 }
703 if code == 0 { ndone = ndone + 1 }
704 if code == 1 { nskip = nskip + 1 }
705 if code == 2 { nref = nref + 1 }
706 if code == 3 { nerr = nerr + 1 }
707 if code < 3 {
708 let pay: *u8 = sys_mmap(DD_MAGIC_1024)
709 var po2: i64 = 0
710 po2 = sj_cat(pay, po2, idb)
711 po2 = sj_cat(pay, po2, "|" as *u8)
712 po2 = sj_cat(pay, po2, ogb)
713 po2 = sj_cat(pay, po2, "|LOCAL-MAKER|" as *u8)
714 if code == 0 { po2 = sj_cat(pay, po2, "done|walker:edit+verify-ACCEPT-committed;staged-elf-new-awaits-promote" as *u8) }
715 if code == 1 { po2 = sj_cat(pay, po2, "skipped|walker:editor-NO-CANDIDATES-guards-refused" as *u8) }
716 if code == 2 { po2 = sj_cat(pay, po2, "refused|walker:verify-REFUSED-original-restored-review-needed" as *u8) }
717 pay[po2] = 0 as u8
718 let so: *u8 = sys_mmap(DD_MAGIC_65536)
719 let sol: *i64 = sys_mmap(DD_SLOT) as *i64
720 let av3: *i64 = sys_mmap(64) as *i64
721 av3[0] = sput as i64
722 av3[1] = "knowledge/store/dedupq-" as *u8 as i64
723 av3[2] = "put" as *u8 as i64
724 av3[3] = "nx-dedup-walker" as *u8 as i64
725 av3[4] = idb as i64
726 av3[5] = pay as i64
727 av3[6] = 0
728 tr_run_capture(sput, av3, so, DD_MAGIC_65536, sol)
729 }
730 sj_puts("DD-QUEUE-ITEM " as *u8)
731 sj_puts(idb)
732 sj_puts(" " as *u8)
733 sj_puts(ogb)
734 sj_puts(" -> " as *u8)
735 if code == 0 { sj_puts("done\n" as *u8) }
736 if code == 1 { sj_puts("skipped\n" as *u8) }
737 if code == 2 { sj_puts("refused\n" as *u8) }
738 if code == 3 { sj_puts("harness-error (left queued for retry)\n" as *u8) }
739 }
740 }
741 }
742 let sb: *u8 = sys_mmap(512)
743 var so2: i64 = 0
744 so2 = sj_cat(sb, so2, "DD-QUEUE processed=" as *u8)
745 so2 = sj_catn(sb, so2, processed)
746 so2 = sj_cat(sb, so2, " done=" as *u8)
747 so2 = sj_catn(sb, so2, ndone)
748 so2 = sj_cat(sb, so2, " skipped=" as *u8)
749 so2 = sj_catn(sb, so2, nskip)
750 so2 = sj_cat(sb, so2, " refused=" as *u8)
751 so2 = sj_catn(sb, so2, nref)
752 so2 = sj_cat(sb, so2, " harness=" as *u8)
753 so2 = sj_catn(sb, so2, nerr)
754 so2 = sj_cat(sb, so2, " remaining_queued=" as *u8)
755 so2 = sj_catn(sb, so2, nrem)
756 so2 = sj_cat(sb, so2, " max=" as *u8)
757 so2 = sj_catn(sb, so2, maxn)
758 sb[so2] = 10 as u8
759 so2 = so2 + 1
760 sys_write(1, sb, so2)
761 dd_write_file("knowledge/status/dedup_queue.out\x00" as *u8, sb, so2)
762 sys_exit(0)
763 return 0
764 }
765
766 if dd_eqz(verb, "edit" as *u8) == 1 {
767 if argc < 3 { sj_werr("DD-USAGE edit <organ>\n" as *u8); sys_exit(DD_USAGE); return DD_USAGE }
768 let organ: *u8 = argv[2] as *u8
769 let sp: *u8 = sys_mmap(DD_PATH)
770 dd_path_src(organ, sp)
771 let olp: *i64 = sys_mmap(DD_SLOT) as *i64
772 let orig: *u8 = dd_read(sp, olp)
773 if olp[0] <= 0 { sj_werr("DD-HARNESS cannot read organ source\n" as *u8); sys_exit(DD_HARNESS); return DD_HARNESS }
774 let eb: *u8 = sys_mmap(DD_SRC)
775 let el: *i64 = sys_mmap(DD_SLOT) as *i64
776 let cnt: i64 = dd_edit(orig, olp[0], eb, el)
777 if cnt == 0 {
778 sj_puts("DD-EDIT NO-CANDIDATES organ=" as *u8)
779 sj_puts(organ)
780 sj_puts(" (guards refuse divergent look-alikes; nothing rewritten)\n" as *u8)
781 sys_exit(0)
782 return 0
783 }
784 let mp: *u8 = sys_mmap(DD_PATH)
785 var mo: i64 = dd_path_src(organ, mp)
786 mo = sj_cat(mp, mo, ".migrated" as *u8)
787 mp[mo] = 0 as u8
788 var wr: i64 = 0 - 1
789 var outlen: i64 = 0
790 if sj_span_has(orig, 0, olp[0], "nx_sovjson_lib" as *u8) == 0 {
791 let ib: *u8 = sys_mmap(DD_SRC)
792 let il: *i64 = sys_mmap(DD_SLOT) as *i64
793 dd_insert_import(eb, el[0], ib, il)
794 wr = dd_write_file(mp, ib, il[0])
795 outlen = il[0]
796 } else {
797 wr = dd_write_file(mp, eb, el[0])
798 outlen = el[0]
799 }
800 if wr != 0 { sj_werr("DD-HARNESS migrated write failed\n" as *u8); sys_exit(DD_HARNESS); return DD_HARNESS }
801 sj_puts("DD-EDIT organ=" as *u8)
802 sj_puts(organ)
803 sj_puts(" rewritten=" as *u8)
804 let bb2: *u8 = sys_mmap(64)
805 var bo2: i64 = sj_catn(bb2, 0, cnt)
806 bb2[bo2] = 0 as u8
807 sj_puts(bb2)
808 sj_puts(" bytes=" as *u8)
809 let bb3: *u8 = sys_mmap(64)
810 var bo3: i64 = sj_catn(bb3, 0, outlen)
811 bb3[bo3] = 0 as u8
812 sj_puts(bb3)
813 sj_puts(" -> " as *u8)
814 sj_puts(mp)
815 sj_puts("\n" as *u8)
816 sys_exit(0)
817 return 0
818 }
819
820 if dd_eqz(verb, "verify" as *u8) == 1 {
821 if argc < 4 { sj_werr("DD-USAGE verify <organ> <migrated-src>\n" as *u8); sys_exit(DD_USAGE); return DD_USAGE }
822 let organ: *u8 = argv[2] as *u8
823 let migp: *u8 = argv[3] as *u8
824 let sp: *u8 = sys_mmap(DD_PATH)
825 dd_path_src(organ, sp)
826 let olp: *i64 = sys_mmap(DD_SLOT) as *i64
827 let orig: *u8 = dd_read(sp, olp)
828 if olp[0] <= 0 { sj_werr("DD-HARNESS organ source unreadable\n" as *u8); sys_exit(DD_HARNESS); return DD_HARNESS }
829 let olen: i64 = olp[0]
830 let mlp: *i64 = sys_mmap(DD_SLOT) as *i64
831 let mig: *u8 = dd_read(migp, mlp)
832 if mlp[0] <= 0 { sj_werr("DD-HARNESS migrated source unreadable\n" as *u8); sys_exit(DD_HARNESS); return DD_HARNESS }
833 let mlen: i64 = mlp[0]
834 let imp: i64 = sj_span_has(mig, 0, mlen, "nx_sovjson_lib" as *u8)
835 let calls: i64 = sj_span_has(mig, 0, mlen, "sj_" as *u8)
836 let changed: i64 = 1 - dd_byteeq(orig, olen, mig, mlen)
837 let res: *i64 = sys_mmap(DD_RES_BYTES) as *i64
838 var zi: i64 = 0
839 while zi < DD_RESN { res[zi] = 0; zi = zi + 1 }
840 res[DD_R_IMPORT] = imp
841 res[DD_R_CALLS] = calls
842 res[DD_R_CHANGED] = changed
843 if imp == 0 { dd_report(organ, "REFUSE" as *u8, res, DD_UNMEASURED, DD_UNMEASURED, DD_UNMEASURED, DD_UNMEASURED, olen, mlen, "vacuity-precheck: no nx_sovjson_lib import" as *u8); sys_exit(DD_REFUSE); return DD_REFUSE }
844 if calls == 0 { dd_report(organ, "REFUSE" as *u8, res, DD_UNMEASURED, DD_UNMEASURED, DD_UNMEASURED, DD_UNMEASURED, olen, mlen, "vacuity-precheck: no sj_ call" as *u8); sys_exit(DD_REFUSE); return DD_REFUSE }
845 if changed == 0 { dd_report(organ, "REFUSE" as *u8, res, DD_UNMEASURED, DD_UNMEASURED, DD_UNMEASURED, DD_UNMEASURED, olen, mlen, "vacuity-precheck: migrated identical to original" as *u8); sys_exit(DD_REFUSE); return DD_REFUSE }
846 // rule 13: first-touch premigrate backup (a second run never clobbers the true original)
847 let pp: *u8 = sys_mmap(DD_PATH)
848 var po: i64 = dd_path_src(organ, pp)
849 po = sj_cat(pp, po, ".premigrate" as *u8)
850 pp[po] = 0 as u8
851 let plp: *i64 = sys_mmap(DD_SLOT) as *i64
852 dd_read(pp, plp)
853 if plp[0] < 0 { dd_write_file(pp, orig, olen) }
854 // baseline: original must build + run deterministically enough to judge
855 if dd_build(organ) != 0 { dd_report(organ, "HARNESS" as *u8, res, DD_UNMEASURED, DD_UNMEASURED, DD_UNMEASURED, DD_UNMEASURED, olen, mlen, "baseline build failed -- nothing touched" as *u8); sys_exit(DD_HARNESS); return DD_HARNESS }
856 let outA1: *u8 = sys_mmap(DD_CAP)
857 let la1: *i64 = sys_mmap(DD_SLOT) as *i64
858 let rcA1: i64 = dd_run(organ, outA1, la1)
859 let outA2: *u8 = sys_mmap(DD_CAP)
860 let la2: *i64 = sys_mmap(DD_SLOT) as *i64
861 let rcA2: i64 = dd_run(organ, outA2, la2)
862 if rcA1 == 127 { if la1[0] == 0 { dd_report(organ, "HARNESS" as *u8, res, rcA1, DD_UNMEASURED, 0, DD_UNMEASURED, olen, mlen, "baseline probe did not execute (127+empty) -- nothing touched" as *u8); sys_exit(DD_HARNESS); return DD_HARNESS } }
863 if rcA1 != rcA2 { dd_report(organ, "HARNESS" as *u8, res, rcA1, rcA2, la1[0], la2[0], olen, mlen, "organ exit code is nondeterministic -- cannot judge" as *u8); sys_exit(DD_HARNESS); return DD_HARNESS }
864 let selfdet: i64 = dd_byteeq(outA1, la1[0], outA2, la2[0])
865 // swap in the migrated source
866 if dd_write_file(sp, mig, mlen) != 0 { dd_report(organ, "HARNESS" as *u8, res, rcA2, DD_UNMEASURED, la2[0], DD_UNMEASURED, olen, mlen, "source swap write failed" as *u8); sys_exit(DD_HARNESS); return DD_HARNESS }
867 if dd_build(organ) != 0 {
868 dd_write_file(sp, orig, olen)
869 dd_build(organ)
870 dd_report(organ, "REFUSE" as *u8, res, rcA2, DD_UNMEASURED, la2[0], DD_UNMEASURED, olen, mlen, "migrated build failed -- original restored + rebuilt" as *u8)
871 sys_exit(DD_REFUSE)
872 return DD_REFUSE
873 }
874 let outB: *u8 = sys_mmap(DD_CAP)
875 let lb: *i64 = sys_mmap(DD_SLOT) as *i64
876 let rcB: i64 = dd_run(organ, outB, lb)
877 let ok: i64 = dd_oracle(rcA2, rcB, outA2, la2[0], outB, lb[0], selfdet, imp, calls, changed, res)
878 if ok == 1 {
879 dd_report(organ, "ACCEPT" as *u8, res, rcA2, rcB, la2[0], lb[0], olen, mlen, "all clauses hold -- migration committed; premigrate kept" as *u8)
880 sj_puts("NX-DEDUP-MIGRATE " as *u8)
881 sj_puts(organ)
882 sj_puts(" verdict=GREEN (committed)\n" as *u8)
883 sys_exit(0)
884 return 0
885 }
886 dd_write_file(sp, orig, olen)
887 dd_build(organ)
888 dd_report(organ, "REFUSE" as *u8, res, rcA2, rcB, la2[0], lb[0], olen, mlen, "clause divergence -- original restored + rebuilt" as *u8)
889 sj_puts("NX-DEDUP-MIGRATE " as *u8)
890 sj_puts(organ)
891 sj_puts(" verdict=RED (restored)\n" as *u8)
892 sys_exit(DD_REFUSE)
893 return DD_REFUSE
894 }
895
896 sj_werr("usage: nx_dedup_migrate stage <organ> | verify <organ> <migrated-src> | selftest\n" as *u8)
897 sys_exit(DD_USAGE)
898 return DD_USAGE
899}