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}