code wiki / (root) / nx_nxa_morf_gate.nx

nx_nxa_morf_gate.nx source

↩ module page · 414 lines · 19332 B

1// nx_nxa_morf_gate.nx -- FACE AND MORF ARE GEOMETRY, NOT TAGS. 2// 3// The subject organ closes the last two ABSENT rows on nx_asset_floor_gate. That gate's own law is 4// the reason this one exists: 5// PRESENCE OF A SECTION IS NOT PRESENCE OF THE CAPABILITY. 6// A FACE section holding zero indices and a MORF section holding zero deltas would flip the floor 7// score to 7/7 while the character remained exactly as expressionless as before. So every tooth 8// here asks a question a tag cannot answer: 9// - does FACE carry real vertex membership, and is every index inside the mesh 10// - does MORF carry a displacement set for every declared channel, each with a NON-EMPTY support 11// - does full weight produce EXACTLY the stored vertex deltas, including unchanged non-FACE 12// vertices, independently of the subject's stdout (zero taper at a support edge is allowed) 13// - is a zero weight BYTE-IDENTICAL to the input (a no-op morph must be provably a no-op; size 14// equality would not do, so this compares every byte) 15// - is derive DETERMINISTIC (two runs, byte-identical) 16// The negative controls are real artifacts, not fixtures invented to fail: the banked pre-change 17// asset (which genuinely lacks both sections) and a malformed channel spec. 18// 19// This gate re-declares the section layout rather than importing it from the subject. That is 20// deliberate: an independent reader is a witness, whereas sharing the subject's own accessor would 21// let one bug agree with itself. 22// license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0 23import "nx_syscalls.nx" 24import "nx_gate_verdict.nx" 25import "nx_gatekit_lib.nx" 26import "nx_nxa.nx" 27import "nx_estate_path.nx" 28 29const MG_ELF: *u8 = "./nx_nxa_morf.elf" 30const MG_DIR: *u8 = "/tmp/nxmorfgate" 31const MG_PRE: *u8 = "knowledge/bank/ref9d.nxa.premorf-20260823" 32const MG_D1: *u8 = "/tmp/nxmorfgate/d1.nxa" 33const MG_D2: *u8 = "/tmp/nxmorfgate/d2.nxa" 34const MG_E0: *u8 = "/tmp/nxmorfgate/e0.nxa" 35const MG_EU: *u8 = "/tmp/nxmorfgate/eu.nxa" 36const MG_EBAD: *u8 = "/tmp/nxmorfgate/ebad.nxa" 37const MG_CAP: i64 = 65536 38const MG_MODE: i64 = 493 39 40// NXA container layout (nx_nxa.nx owns magic/checksum; these are the header shapes it implies) 41const MG_HDR: i64 = 32 42const MG_TOCE: i64 = 32 43const MG_W: i64 = 8 44// FACE payload: [nface, stature_axis, lo_permil, hi_permil] then nface vertex indices 45const MG_FACE_HDR: i64 = 4 46// MORF payload: [nchan, nrows, dstride, unit] then nchan x [tag, support] then deltas 47const MG_MORF_HDR: i64 = 4 48const MG_CHANREC: i64 = 2 49const MG_CONF: *u8 = "knowledge/facs_au.conf" 50const MG_UNIT: i64 = 1000 51// Select a channel with actual nonzero deltas from the derived asset. 52const MG_SPEC_ZERO: *u8 = "0:0" 53const MG_SPEC_BAD: *u8 = "notaspec" 54 55// Optional arguments: <subject ELF> <fresh /tmp basename>. 56// Relative ELF paths resolve from ep_anchor's estate root. Omitted args retain 57// the original subject and paths. A supplied basename must create a fresh dir. 58func mg_pathlen(p: *u8) -> i64 { 59 var n: i64 = 0 60 while p[n] != (0 as u8) { n = n+1 } 61 return n 62} 63func mg_join(a: *u8,b: *u8) -> *u8 { 64 let out: *u8 = sys_mmap(mg_pathlen(a)+mg_pathlen(b)+1) 65 if (out as i64) <= 0 { return 0 as *u8 } 66 var n: i64 = gk_cat(out,0,a) 67 n = gk_cat(out,n,b); out[n] = 0 as u8 68 return out 69} 70func mg_basename(p: *u8) -> i64 { 71 var i: i64 = 0 72 while p[i] != (0 as u8) { 73 let c: i64 = p[i] as i64; var ok: i64 = 0 74 if c >= 48 { if c <= 57 { ok = 1 } } 75 if c >= 65 { if c <= 90 { ok = 1 } } 76 if c >= 97 { if c <= 122 { ok = 1 } } 77 if c == 45 { ok = 1 }; if c == 95 { ok = 1 } 78 if ok == 0 { return 0 }; i = i+1 79 } 80 if i == 0 { return 0 } 81 return 1 82} 83 84func mg_rd(b: *u8, off: i64) -> i64 { 85 let p: *i64 = ((b as i64) + off) as *i64 86 return p[0] 87} 88func mg_tageq(b: *u8, off: i64, t: *u8) -> i64 { 89 var i: i64 = 0 90 while i < 4 { if b[off + i] != t[i] { return 0 } i = i + 1 } 91 return 1 92} 93// payload BYTE offset of section `t`, or -1 94func mg_sec(b: *u8, ns: i64, t: *u8) -> i64 { 95 var s: i64 = 0 96 while s < ns { 97 let e: i64 = MG_HDR + s*MG_TOCE 98 if mg_tageq(b, e, t) == 1 { return mg_rd(b, e + 8) } 99 s = s + 1 100 } 101 return 0 - 1 102} 103func mg_nsec(b: *u8) -> i64 { return mg_rd(b, 16) } 104 105// full-byte comparison. Size equality is NEVER identity (a same-size rewrite sails through), so 106// this reads both files whole and compares every byte. 107func mg_same(a: *u8, b: *u8) -> i64 { 108 let la: *i64 = sys_mmap(16) as *i64 109 let lb: *i64 = sys_mmap(16) as *i64 110 let ba: *u8 = sys_read_file(a, la) 111 let bb: *u8 = sys_read_file(b, lb) 112 if (ba as i64) == 0 { return 0 } 113 if (bb as i64) == 0 { return 0 } 114 if la[0] != lb[0] { return 0 } 115 var i: i64 = 0 116 while i < la[0] { 117 if ba[i] != bb[i] { return 0 } 118 i = i + 1 119 } 120 return 1 121} 122 123 124// Independent config witness: derive ordered tags from every complete AU row. 125// The byte-derived allocation cannot cap a future channel table silently. 126func mg_conf_tags(tags: *i64, b: *u8, n: i64) -> i64 { 127 var p: i64 = 0; var count: i64 = 0 128 while p < n { 129 var end: i64 = p 130 while end < n { if b[end] == (10 as u8) { break }; end = end + 1 } 131 if end - p >= 3 { 132 if b[p] == (97 as u8) { if b[p+1] == (117 as u8) { if b[p+2] == (124 as u8) { 133 var pipes: i64 = 0; var q: i64 = p 134 while q < end { if b[q] == (124 as u8) { pipes = pipes + 1 }; q = q + 1 } 135 if pipes != 9 { return 0 - 1 } 136 if end - p < 8 { return 0 - 1 } 137 if b[p+7] != (124 as u8) { return 0 - 1 } 138 var tag: i64 = 0; var j: i64 = 0 139 while j < 4 { tag = tag | ((b[p+3+j] as i64) << (j*8)); j = j + 1 } 140 j = 0; while j < count { if tags[j] == tag { return 0 - 1 }; j = j + 1 } 141 tags[count] = tag; count = count + 1 142 } } } 143 } 144 p = end + 1 145 } 146 return count 147} 148 149// Validate container boundaries before this independent gate reads payloads. 150func mg_container(b: *u8, n: i64) -> i64 { 151 if n < MG_HDR { return 0 } 152 if mg_rd(b, 0) != nxa_magic() { return 0 } 153 let ns: i64 = mg_nsec(b) 154 if ns < 1 { return 0 } 155 if ns > (n - MG_HDR)/MG_TOCE { return 0 } 156 var s: i64 = 0 157 while s < ns { 158 let e: i64 = MG_HDR + s*MG_TOCE 159 let off: i64 = mg_rd(b, e+8); let words: i64 = mg_rd(b, e+16) 160 if off < MG_HDR + ns*MG_TOCE { return 0 } 161 if off > n { return 0 }; if words < 0 { return 0 } 162 if words > (n-off)/MG_W { return 0 } 163 s = s + 1 164 } 165 return 1 166} 167func mg_words(b: *u8, tag: *u8) -> i64 { 168 var s: i64 = 0 169 while s < mg_nsec(b) { 170 let e: i64 = MG_HDR + s*MG_TOCE 171 if mg_tageq(b,e,tag) == 1 { return mg_rd(b,e+16) } 172 s = s + 1 173 } 174 return 0 175} 176 177// Compare actual VERT coordinates, never the subject's self-reported moved count. 178// Expected positions are the input coordinates plus stored deltas at full declared unit. 179func mg_eval_exact(d: *u8, fo: i64, mo: i64, vo: i64, nv: i64, nf: i64, nc: i64, ch: i64, path: *u8) -> i64 { 180 let lp: *i64 = sys_mmap(16) as *i64 181 let out: *u8 = sys_read_file(path, lp) 182 if (out as i64) == 0 { return 0 } 183 if mg_container(out, lp[0]) == 0 { return 0 } 184 let ov: i64 = mg_sec(out, mg_nsec(out), "VERT" as *u8) 185 if ov < 0 { return 0 } 186 if mg_words(out,"VERT" as *u8) < 1 + nv*3 { return 0 } 187 if mg_rd(out,ov) != nv { return 0 } 188 let expected: *i64 = sys_mmap(nv*3*MG_W) as *i64 189 var k: i64 = 0 190 while k < nv*3 { expected[k] = mg_rd(d,vo+MG_W+k*MG_W); k = k + 1 } 191 let db: i64 = mo + (MG_MORF_HDR+nc*MG_CHANREC)*MG_W 192 var row: i64 = 0; var moved: i64 = 0 193 while row < nf { 194 let vi: i64 = mg_rd(d,fo+(MG_FACE_HDR+row)*MG_W) 195 var a: i64 = 0; var any: i64 = 0 196 while a < 3 { 197 let delta: i64 = mg_rd(d,db+((ch*nf+row)*3+a)*MG_W) 198 expected[vi*3+a] = expected[vi*3+a]+delta 199 if delta != 0 { any = 1 } 200 a = a + 1 201 } 202 if any == 1 { moved = moved + 1 }; row = row + 1 203 } 204 if moved == 0 { return 0 } 205 k = 0 206 while k < nv*3 { 207 if mg_rd(out,ov+MG_W+k*MG_W) != expected[k] { return 0 } 208 k = k + 1 209 } 210 return 1 211} 212 213func main(argc: i64, argv: *i64) -> i64 { 214 if ep_anchor() < 0 { gv_puts("MORF-GATE-REFUSE estate anchor unavailable\n" as *u8); return 3 } 215 if argc > 3 { gv_puts("usage: gate [subject-ELF [fresh-tmp-basename]]\n" as *u8); return 2 } 216 var subject: *u8 = MG_ELF 217 var dir: *u8 = MG_DIR 218 var d1path: *u8 = MG_D1; var d2path: *u8 = MG_D2 219 var e0path: *u8 = MG_E0; var eupath: *u8 = MG_EU; var badpath: *u8 = MG_EBAD 220 if argc > 1 { subject = argv[1] as *u8 } 221 if mg_pathlen(subject) == 0 { return 2 } 222 if argc > 2 { 223 let name: *u8 = argv[2] as *u8 224 if mg_basename(name) == 0 { gv_puts("MORF-GATE-REFUSE invalid tmp basename\n" as *u8); return 2 } 225 dir = mg_join("/tmp/" as *u8,name) 226 if (dir as i64) <= 0 { return 3 } 227 if sys_mkdir(dir,493) != 0 { gv_puts("MORF-GATE-REFUSE tmp directory is not fresh\n" as *u8); return 3 } 228 d1path = mg_join(dir,"/d1.nxa" as *u8); d2path = mg_join(dir,"/d2.nxa" as *u8) 229 e0path = mg_join(dir,"/e0.nxa" as *u8); eupath = mg_join(dir,"/eu.nxa" as *u8); badpath = mg_join(dir,"/ebad.nxa" as *u8) 230 if (d1path as i64) <= 0 { return 3 }; if (d2path as i64) <= 0 { return 3 } 231 if (e0path as i64) <= 0 { return 3 }; if (eupath as i64) <= 0 { return 3 }; if (badpath as i64) <= 0 { return 3 } 232 } else { sys_mkdir(dir,493) } 233 gv_puts("subject=" as *u8); gv_puts(subject); gv_puts(" tmp=" as *u8); gv_puts(dir); gv_puts("\n" as *u8) 234 let ctr: *i64 = gv_ctr() 235 gv_head("nx_nxa_morf gate -- FACE and MORF carry geometry, and the morph moves exactly its own support" as *u8) 236 let buf: *u8 = sys_mmap(MG_CAP + 64) 237 let bl: *i64 = sys_mmap(16) as *i64 238 239 // ---- setup: the negative control is a REAL banked artifact, not an invented fixture -------- 240 let pre_ok: i64 = gk_exists(MG_PRE) 241 gv_check("setup-banked-pre-change-asset-present (the neg-control is a real artifact)" as *u8, pre_ok, ctr) 242 if pre_ok == 0 { 243 let rcp: i64 = gv_verdict("NX-NXA-MORF" as *u8, ctr, "no banked pre-change asset to measure against" as *u8) 244 sys_exit(rcp) 245 return rcp 246 } 247 248 // ---- derive ------------------------------------------------------------------------------ 249 let rc1: i64 = gk_run_capture(subject, "derive" as *u8, MG_PRE, d1path, 0 as *u8, buf, MG_CAP, bl) 250 gv_check("derive-exits-zero" as *u8, rc1 == 0, ctr) 251 252 let lp: *i64 = sys_mmap(16) as *i64 253 let d: *u8 = sys_read_file(d1path, lp) 254 var readable: i64 = 0 255 if (d as i64) != 0 { readable = mg_container(d, lp[0]) } 256 gv_check("derived-asset-readable" as *u8, readable, ctr) 257 if readable == 0 { 258 let rcr: i64 = gv_verdict("NX-NXA-MORF" as *u8, ctr, "derive produced nothing readable" as *u8) 259 sys_exit(rcr) 260 return rcr 261 } 262 let ns: i64 = mg_nsec(d) 263 let fo: i64 = mg_sec(d, ns, "FACE" as *u8) 264 let mo: i64 = mg_sec(d, ns, "MORF" as *u8) 265 let vo: i64 = mg_sec(d, ns, "VERT" as *u8) 266 gv_puts(" sections=" as *u8); gv_num(ns); gv_puts("\n" as *u8) 267 268 let fl: i64 = mg_words(d, "FACE" as *u8) 269 let ml: i64 = mg_words(d, "MORF" as *u8) 270 let vl: i64 = mg_words(d, "VERT" as *u8) 271 gv_check("FACE-header-bounded" as *u8, fl >= MG_FACE_HDR, ctr) 272 if fl < MG_FACE_HDR { return gv_verdict("NX-NXA-MORF" as *u8, ctr, "FACE header missing" as *u8) } 273 gv_check("MORF-header-bounded" as *u8, ml >= MG_MORF_HDR, ctr) 274 if ml < MG_MORF_HDR { return gv_verdict("NX-NXA-MORF" as *u8, ctr, "MORF header missing" as *u8) } 275 gv_check("VERT-header-bounded" as *u8, vl >= 1, ctr) 276 if vl < 1 { return gv_verdict("NX-NXA-MORF" as *u8, ctr, "VERT header missing" as *u8) } 277 let cl: *i64 = sys_mmap(16) as *i64 278 let cb: *u8 = sys_read_file(MG_CONF, cl) 279 var expected_count: i64 = 0 280 let tags: *i64 = sys_mmap((cl[0]+1)*MG_W) as *i64 281 if (cb as i64) != 0 { expected_count = mg_conf_tags(tags, cb, cl[0]) } 282 gv_check("AU-config-readable-valid-unique-tags-and-nonempty" as *u8, expected_count > 0, ctr) 283 284 // ---- FACE is real membership, not an empty tag -------------------------------------------- 285 var nface: i64 = 0 286 if fo >= 0 { nface = mg_rd(d, fo) } 287 var nv: i64 = 0 288 if vo >= 0 { nv = mg_rd(d, vo) } 289 gv_puts(" face_verts=" as *u8); gv_num(nface) 290 gv_puts(" of verts=" as *u8); gv_num(nv); gv_puts("\n" as *u8) 291 var face_ok: i64 = 0 292 if fo >= 0 { if nface > 0 { if nface <= nv { if nface <= fl-MG_FACE_HDR { if nv <= (vl-1)/3 { face_ok = 1 } } } } } 293 gv_check("FACE-present-with-non-empty-membership (count bound in the condition, an empty FACE cannot pass)" as *u8, face_ok, ctr) 294 295 // every index must address a real vertex -- a membership list of garbage is not a face 296 var idx_ok: i64 = 1 297 var oob: i64 = 0 298 let seen: *i64 = sys_mmap((vl+1)*MG_W) as *i64 299 if face_ok == 1 { 300 var i: i64 = 0 301 while i < nface { 302 let vi: i64 = mg_rd(d, fo + (MG_FACE_HDR + i)*MG_W) 303 if vi < 0 { idx_ok = 0; oob = oob + 1 } 304 else { if vi >= nv { idx_ok = 0; oob = oob + 1 } else { if seen[vi] != 0 { idx_ok = 0; oob = oob + 1 }; seen[vi] = 1 } } 305 i = i + 1 306 } 307 } else { idx_ok = 0 } 308 gv_puts(" face indices out of range=" as *u8); gv_num(oob); gv_puts("\n" as *u8) 309 gv_check("every-FACE-index-addresses-a-real-vertex" as *u8, idx_ok, ctr) 310 311 // ---- MORF declares every channel with a NON-EMPTY support --------------------------------- 312 var nchan: i64 = 0 313 var nrows: i64 = 0 314 var unit: i64 = 0 315 if mo >= 0 { 316 nchan = mg_rd(d, mo) 317 nrows = mg_rd(d, mo + MG_W) 318 unit = mg_rd(d, mo + MG_W*3) 319 } 320 gv_puts(" channels=" as *u8); gv_num(nchan) 321 gv_puts(" rows=" as *u8); gv_num(nrows) 322 gv_puts(" unit=" as *u8); gv_num(unit); gv_puts("\n" as *u8) 323 var morf_ok: i64 = 0 324 if expected_count > 0 { if nchan == expected_count { if nrows == nface { if unit == MG_UNIT { 325 if mg_rd(d, mo+MG_W*2) == 3 { 326 if nchan <= (ml-MG_MORF_HDR)/MG_CHANREC { 327 let available: i64 = ml-MG_MORF_HDR-nchan*MG_CHANREC 328 if nrows > 0 { if nrows <= available/3/nchan { morf_ok = 1 } } 329 } 330 } 331 } } } } 332 gv_check("MORF-shape-matches-all-config-channels-and-bounded-FACE-rows" as *u8, morf_ok, ctr) 333 if face_ok == 0 { return gv_verdict("NX-NXA-MORF" as *u8, ctr, "invalid FACE" as *u8) } 334 if idx_ok == 0 { return gv_verdict("NX-NXA-MORF" as *u8, ctr, "invalid membership" as *u8) } 335 if morf_ok == 0 { return gv_verdict("NX-NXA-MORF" as *u8, ctr, "invalid MORF" as *u8) } 336 var tags_ok: i64 = 1; var allsup: i64 = 1; var selected: i64 = 0 - 1 337 let db: i64 = mo+(MG_MORF_HDR+nchan*MG_CHANREC)*MG_W 338 var c: i64 = 0 339 while c < nchan { 340 let ro: i64 = mo+(MG_MORF_HDR+c*MG_CHANREC)*MG_W 341 if mg_rd(d,ro) != tags[c] { tags_ok = 0 } 342 let sup: i64 = mg_rd(d,ro+MG_W) 343 if sup <= 0 { allsup = 0 }; if sup > nface { allsup = 0 } 344 var nonzero: i64 = 0; var i: i64 = 0 345 while i < nface { 346 var a: i64 = 0; var any: i64 = 0 347 while a < 3 { if mg_rd(d,db+((c*nface+i)*3+a)*MG_W) != 0 { any = 1 }; a = a + 1 } 348 if any == 1 { nonzero = nonzero + 1 }; i = i + 1 349 } 350 gv_puts(" channel=" as *u8); gv_num(c); gv_puts(" support=" as *u8); gv_num(sup) 351 gv_puts(" nonzero_delta_vertices=" as *u8); gv_num(nonzero); gv_puts("\n" as *u8) 352 // A taper may legitimately make support-boundary deltas zero; an entirely 353 // zero action still fails the original non-vacuity requirement. 354 if nonzero == 0 { allsup = 0 }; if nonzero > sup { allsup = 0 } 355 if selected < 0 { if nonzero > 0 { selected = c } } 356 c = c + 1 357 } 358 gv_check("every-channel-tag-matches-ordered-config" as *u8, tags_ok, ctr) 359 gv_check("every-declared-channel-has-bounded-nonempty-support-and-real-deltas" as *u8, allsup, ctr) 360 gv_check("a-nonzero-channel-is-selected-from-the-actual-asset" as *u8, selected >= 0, ctr) 361 var exact: i64 = 0 362 if selected >= 0 { 363 let spec: *u8 = sys_mmap(256) 364 var so: i64 = gk_catn(spec, 0, selected) 365 so = gk_cat(spec, so, ":" as *u8); so = gk_catn(spec, so, unit); spec[so] = 0 as u8 366 let rc2: i64 = gk_run_capture(subject, "eval" as *u8, d1path, eupath, spec, buf, MG_CAP, bl) 367 gv_check("eval-at-asset-unit-exits-zero" as *u8, rc2 == 0, ctr) 368 if rc2 == 0 { exact = mg_eval_exact(d,fo,mo,vo,nv,nface,nchan,selected,eupath) } 369 } 370 gv_check("actual-VERT-equals-stored-deltas-and-all-non-FACE-vertices-unchanged" as *u8, exact, ctr) 371 372 // ---- a zero weight must be a PROVEN no-op, byte for byte ---------------------------------- 373 let rc3: i64 = gk_run_capture(subject, "eval" as *u8, d1path, e0path, MG_SPEC_ZERO, buf, MG_CAP, bl) 374 var zero_same: i64 = 0 375 if rc3 == 0 { zero_same = mg_same(d1path, e0path) } 376 gv_check("zero-weight-output-is-BYTE-IDENTICAL-to-its-input (size equality is not identity)" as *u8, zero_same, ctr) 377 378 // ---- determinism -------------------------------------------------------------------------- 379 let rc4: i64 = gk_run_capture(subject, "derive" as *u8, MG_PRE, d2path, 0 as *u8, buf, MG_CAP, bl) 380 var det: i64 = 0 381 if rc4 == 0 { det = mg_same(d1path, d2path) } 382 gv_check("derive-is-deterministic (two runs, byte-identical)" as *u8, det, ctr) 383 384 // ---- neg-control: the banked pre-change asset genuinely lacks both sections ---------------- 385 let lp2: *i64 = sys_mmap(16) as *i64 386 let p: *u8 = sys_read_file(MG_PRE, lp2) 387 var pre_lacks: i64 = 0 388 if (p as i64) != 0 { if mg_container(p, lp2[0]) == 1 { 389 let pns: i64 = mg_nsec(p) 390 var hasf: i64 = 0 391 var hasm: i64 = 0 392 if mg_sec(p, pns, "FACE" as *u8) >= 0 { hasf = 1 } 393 if mg_sec(p, pns, "MORF" as *u8) >= 0 { hasm = 1 } 394 if hasf == 0 { if hasm == 0 { pre_lacks = 1 } } 395 gv_puts(" pre-change asset sections=" as *u8); gv_num(pns) 396 gv_puts(" FACE=" as *u8); gv_num(hasf) 397 gv_puts(" MORF=" as *u8); gv_num(hasm); gv_puts("\n" as *u8) 398 } 399 } 400 var derived_has: i64 = 0 401 if fo >= 0 { if mo >= 0 { derived_has = 1 } } 402 gv_bite("neg-control-pre-change-asset-lacks-FACE-and-MORF" as *u8, pre_lacks, 1 - derived_has, ctr) 403 404 // ---- neg-control: a malformed channel spec must refuse BY NAME ---------------------------- 405 let rc5: i64 = gk_run_capture(subject, "eval" as *u8, d1path, badpath, MG_SPEC_BAD, buf, MG_CAP, bl) 406 var refused: i64 = 0 407 if rc5 != 0 { refused = gk_out_has(buf, bl[0], "MORF-REFUSE eval spec" as *u8) } 408 let rc6: i64 = gk_run_capture(subject, "eval" as *u8, d1path, e0path, MG_SPEC_ZERO, buf, MG_CAP, bl) 409 var good_refused: i64 = 0 410 if rc6 != 0 { good_refused = 1 } 411 gv_bite("neg-control-malformed-channel-spec-refused-by-name" as *u8, refused, good_refused, ctr) 412 413 return gv_verdict("NX-NXA-MORF" as *u8, ctr, "config-bound channels carry real deltas; actual vertices match the stored full-weight displacement" as *u8) 414}