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}