nx_microscan_gate.nx source
↩ module page · 402 lines · 22201 B
1// nx_microscan_gate.nx -- THE INVERSE MICRO-ANALYSER, GATED BY ROUND TRIP. Subject: nx_microscan_lib.
2//
3// WHY A ROUND TRIP IS THE RIGHT REFEREE HERE, AND WHY IT NEEDS NO EXTERNAL GROUND TRUTH. The estate
4// already owns the FORWARD law: nx_relief_lib bakes a jittered-grid pore layer whose pitch, orifice
5// diameter and coverage are declared constants with a provenance ledger. So the honest test of an
6// INVERSE analyser is to hand it a field the shipped generator produced and ask it to recover the
7// number the generator was told -- WITHOUT the analyser importing any of it. nx_microscan_lib imports
8// nx_syscalls and nx_vecmath and nothing else; this gate imports the generator, synthesises the field,
9// and checks the recovered pitch against RLF_PORE_PITCH_UM. A wrong analyser cannot pass by knowing
10// the answer, because it has no way to see the answer.
11//
12// AND IT IS CHECKED AT TWO LATTICE SCALES ON PURPOSE. A single scale can be satisfied by a constant.
13// T5 asserts the recovered period TRACKS the generator -- double the cell, double the answer -- which
14// is the property a hardcoded 800 provably cannot have.
15//
16// THE TOOTH THE OPERATOR ACTUALLY ASKED FOR IS T8/T9: "does the hair come out of the pore properly".
17// That is a REGISTRATION question between two layers, and it is decidable today. T8 places follicles
18// through the generator's own centre function and must read BOUND. T9 places follicles by AREA
19// SAMPLING -- which is what nx_nxa_groom actually does, it samples scalp triangles by area and never
20// consults a pore field -- and must read DECOUPLED. Both directions, one bar, and the null is the
21// field's OWN measured coverage rather than an assumed rate.
22//
23// THE TWO POINT SETS ARE DELIBERATELY DIFFERENT SIZES and that is the finding of the first run, not an
24// oversight. BOUND is a presence claim and carries on 256 points; DECOUPLED is an ABSENCE claim and
25// needs enough EXPECTED chance hits to have detected binding had it existed, which 256 points at a
26// 12-permil chance rate does not provide. ms_reg_verdict abstains there, and the last neg-control
27// proves it abstains by handing it exactly that under-powered subset.
28//
29// DECLARED RESOLUTION BAR, so no reading of this gate can be inflated into a clinical claim. The
30// fields here are synthetic and sampled at a texel derived from the generator's declared pitch. The
31// baked per-region asset carries a 50 um texel. Dermoscopic assessment of a pigmented lesion works at
32// roughly 10-20 um per pixel and reads COLOUR and PIGMENT NETWORK, not height. This organ measures a
33// height/thickness field for periodicity, layer registration and departure-from-self. It emits
34// candidates with scores. IT IS NOT A DIAGNOSIS OF ANYTHING and the melanoma bar is a statement of the
35// resolution we do not yet carry, not a capability claimed. The dermoscopy figure is SOURCE-UNPINNED
36// -- no reference was mirrored for this lane -- and that is stated in the verdict note too.
37//
38// license_tier: ORIGINAL expect_exit: 0 No hw writes (Rule 26).
39import "nx_syscalls.nx"
40import "nx_gate_verdict.nx"
41import "nx_relief_lib.nx"
42import "nx_microscan_lib.nx"
43
44// FIXTURE GEOMETRY. Both cells DIVIDE RLF_OFF exactly, which is what makes the expected feature count
45// exact rather than approximate: the generator biases coordinates by RLF_OFF before dividing into
46// cells, so a cell that does not divide it puts a partial cell row at the edge and the density -- the
47// one quantity the whole period estimate rests on -- stops being a whole number of cells.
48const MG_W: i64 = 512
49const MG_H: i64 = 512
50const MG_CELL_A: i64 = 32
51const MG_CELL_B: i64 = 64
52// DERIVED, not chosen: the texel size at which the generator's declared pitch spans MG_CELL_A texels.
53// 800 / 32 = 25 um exactly, so the physical round trip in T3 is exact and not a rounding.
54const MG_TEXEL_A_UM: i64 = 25
55const MG_EXP_N_A: i64 = 256 // (MG_W / MG_CELL_A) squared
56const MG_EXP_N_B: i64 = 64 // (MG_W / MG_CELL_B) squared
57
58const MG_CAP: i64 = 4096
59const MG_BLK_CAP: i64 = 1024
60const MG_BS: i64 = 64 // anomaly block edge -> 8 x 8 = 64 blocks over the fixture
61const MG_BW: i64 = 8
62const MG_PATCH_BX: i64 = 3
63const MG_PATCH_BY: i64 = 5
64const MG_PATCH_IDX: i64 = 43 // MG_PATCH_BY * MG_BW + MG_PATCH_BX
65
66// the material fixture: a WALL THICKNESS field, carrying no skin construct whatsoever.
67const MG_WALL_OK: i64 = 1000
68const MG_WALL_THIN: i64 = 400
69const MG_TEX_AMP: i64 = 20 // benign surface variation, so the robust scale is non-degenerate
70const MG_TEX_LAT: i64 = 96
71const MG_K_MILLI: i64 = 3000 // three deviations
72
73// coverage agreement tolerance in permil. DECLARED IMPRECISION: a disc is measured on an integer grid,
74// so a finite sweep quantises its area. This is that quantisation, not slack for a wrong model. Same
75// bar nx_relief_bands_gate uses for the same reason.
76const MG_TOL_PERMIL: i64 = 4
77// the lattice/scatter bar is the MIDPOINT of the two analytic references the lib publishes, so it is
78// derived from the geometry rather than tuned to the fixture that motivated it.
79const MG_REG_BAR: i64 = 750
80
81const MG_HASH_X1: i64 = 101
82const MG_HASH_X2: i64 = 103
83const MG_HASH_Y1: i64 = 107
84const MG_HASH_Y2: i64 = 109
85const MG_SCATTER_SEED: i64 = 20260901
86// THE INDEPENDENT-SAMPLING CONTROL. A step COPRIME to both cell sizes, so the lattice is
87// incommensurate with the pore lattice and visits every relative phase uniformly BY CONSTRUCTION --
88// no generator, no seed, nothing shared with the subject. 30 x 30 = 900 points over the fixture,
89// which is also what carries the DECOUPLED claim past the minimum expected count.
90const MG_AREA_STEP: i64 = 17
91const MG_AREA_OFF: i64 = 7
92
93func mg_kv(k: *u8, v: i64) -> i64 { gv_puts(k); gv_num(v); gv_puts("\n" as *u8); return 0 }
94
95// ---- FIXTURE BUILDERS -------------------------------------------------------------------------
96// the pore field, produced by the SHIPPED generator. The analyser never sees this function.
97func mg_fill_pore(f: *i64, cell: i64) -> i64 {
98 var y: i64 = 0
99 while y < MG_H {
100 var x: i64 = 0
101 while x < MG_W {
102 f[y * MG_W + x] = rlf_pore_mask(x, y, cell)
103 x = x + 1
104 }
105 y = y + 1
106 }
107 return 0
108}
109func mg_fill_const(f: *i64, v: i64) -> i64 {
110 var i: i64 = 0
111 while i < MG_W * MG_H { f[i] = v; i = i + 1 }
112 return 0
113}
114// a RANDOM SCATTER of the same density as the pore field, built from the generator's own hash so the
115// control differs from the subject in ONE property -- spatial regularity -- and in nothing else.
116func mg_fill_scatter(f: *i64, n: i64) -> i64 {
117 mg_fill_const(f, 0)
118 var i: i64 = 0
119 while i < n {
120 let x: i64 = rlf_hash3(i, MG_HASH_X1, MG_HASH_X2) * MG_W / RLF_UNIT
121 let y: i64 = rlf_hash3(i, MG_HASH_Y1, MG_HASH_Y2) * MG_H / RLF_UNIT
122 f[y * MG_W + x] = RLF_H_RANGE
123 i = i + 1
124 }
125 return 0
126}
127// the planted thin patch, in a field of thicknesses. textured = 1 adds benign variation so the robust
128// scale is non-degenerate; textured = 0 leaves the single-level case the lib declares as degenerate.
129func mg_fill_wall(f: *i64, textured: i64) -> i64 {
130 var y: i64 = 0
131 while y < MG_H {
132 var x: i64 = 0
133 while x < MG_W {
134 var v: i64 = MG_WALL_OK
135 if textured == 1 {
136 v = v + (rlf_noise3(x, y, MG_SCATTER_SEED, MG_TEX_LAT) * MG_TEX_AMP / RLF_H_RANGE)
137 }
138 var bx: i64 = x / MG_BS
139 var by: i64 = y / MG_BS
140 if bx == MG_PATCH_BX { if by == MG_PATCH_BY { v = MG_WALL_THIN } }
141 f[y * MG_W + x] = v
142 x = x + 1
143 }
144 y = y + 1
145 }
146 return 0
147}
148
149// FOLLICLE PLACEMENT THROUGH THE FORWARD MODEL. The point set is built from rlf_pore_centre, NOT
150// harvested from the analyser's own feature list -- a point set taken from the output being tested
151// would make the registration tooth circular and it would pass for any analyser at all.
152func mg_place_bound(px: *i64, py: *i64, cell: i64) -> i64 {
153 let g0: i64 = RLF_OFF / cell
154 let ncell: i64 = MG_W / cell
155 var n: i64 = 0
156 var j: i64 = 0
157 while j < ncell {
158 var i: i64 = 0
159 while i < ncell {
160 let cx: i64 = rlf_pore_centre(g0 + i, g0 + j, 0)
161 let cy: i64 = rlf_pore_centre(g0 + i, g0 + j, 1)
162 px[n] = i * cell + cx * cell / RLF_UNIT
163 py[n] = j * cell + cy * cell / RLF_UNIT
164 n = n + 1
165 i = i + 1
166 }
167 j = j + 1
168 }
169 return n
170}
171// AREA SAMPLING, the analogue of what the shipped groom actually does: nx_nxa_groom samples scalp
172// triangles BY AREA and never consults a pore field. Placed here on a lattice incommensurate with the
173// pore lattice, so the control differs from the subject in exactly one property.
174//
175// THE FIRST VERSION OF THIS CONTROL DREW ITS POSITIONS FROM THE GENERATOR'S OWN HASH, and measured 31
176// permil against a 12 permil chance rate -- a control correlated with its subject through a shared
177// function, which is the shared-failure-mode defect wearing a fixture. The analyser was RIGHT to
178// refuse to call that set DECOUPLED; the fixture was wrong. Recorded here rather than quietly
179// replaced, because the failure is what found the missing denominator guard in ms_reg_verdict.
180func mg_place_area(px: *i64, py: *i64) -> i64 {
181 var n: i64 = 0
182 var y: i64 = MG_AREA_OFF
183 while y < MG_H {
184 var x: i64 = MG_AREA_OFF
185 while x < MG_W {
186 px[n] = x
187 py[n] = y
188 n = n + 1
189 x = x + MG_AREA_STEP
190 }
191 y = y + MG_AREA_STEP
192 }
193 return n
194}
195
196func main(argc: i64, argv: *i64) -> i64 {
197 gv_head("nx_microscan_gate -- INVERSE MICRO-SURFACE ANALYSIS, PROVEN BY ROUND TRIP" as *u8)
198 let ctr: *i64 = gv_ctr()
199
200 let f: *i64 = sys_mmap(MG_W * MG_H * 8) as *i64
201 let xs: *i64 = sys_mmap(MG_CAP * 8) as *i64
202 let ys: *i64 = sys_mmap(MG_CAP * 8) as *i64
203 let px: *i64 = sys_mmap(MG_CAP * 8) as *i64
204 let py: *i64 = sys_mmap(MG_CAP * 8) as *i64
205 let blk: *i64 = sys_mmap(MG_BLK_CAP * 8) as *i64
206 let scr: *i64 = sys_mmap(MG_BLK_CAP * 8) as *i64
207 let out2: *i64 = sys_mmap(32) as *i64
208 let oidx: *i64 = sys_mmap(32) as *i64
209
210 // ---- PASS 1: the coarser lattice, measured first so its field can be discarded.
211 mg_fill_pore(f, MG_CELL_B)
212 let nB: i64 = ms_features(f, MG_W, MG_H, 0, xs, ys, MG_CAP)
213 let perB: i64 = ms_period_texels(nB, MG_W, MG_H)
214 let covB: i64 = ms_coverage_permil(f, MG_W, MG_H, 0)
215
216 // ---- PASS 2: the finer lattice, which carries the physical round trip and the registration work.
217 mg_fill_pore(f, MG_CELL_A)
218 let nA: i64 = ms_features(f, MG_W, MG_H, 0, xs, ys, MG_CAP)
219 let perA: i64 = ms_period_texels(nA, MG_W, MG_H)
220 let perA_um: i64 = ms_period_um(nA, MG_W, MG_H, MG_TEXEL_A_UM)
221 let covA: i64 = ms_coverage_permil(f, MG_W, MG_H, 0)
222 let nnA: i64 = ms_nn_mean_milli(xs, ys, nA)
223 let regA: i64 = ms_regularity_permil(nnA, perA)
224 let derived: i64 = rlf_pore_area_permil()
225
226 let nb: i64 = mg_place_bound(px, py, MG_CELL_A)
227 let hitB: i64 = ms_hit_permil(f, MG_W, MG_H, 0, px, py, nb)
228 let vB: i64 = ms_reg_verdict(hitB, covA, nb)
229 let na: i64 = mg_place_area(px, py)
230 let hitA: i64 = ms_hit_permil(f, MG_W, MG_H, 0, px, py, na)
231 let vA: i64 = ms_reg_verdict(hitA, covA, na)
232 // THE SAME POINT SET, TRUNCATED BELOW THE MINIMUM EXPECTED COUNT. Same field, same placement,
233 // only fewer points -- so anything but an abstention here is a claim made on absent evidence.
234 let hitU: i64 = ms_hit_permil(f, MG_W, MG_H, 0, px, py, MG_EXP_N_A)
235 let vU: i64 = ms_reg_verdict(hitU, covA, MG_EXP_N_A)
236 let vEmpty: i64 = ms_reg_verdict(ms_hit_permil(f, MG_W, MG_H, 0, px, py, 0), covA, 0)
237
238 // ---- PASS 3: flat, the control that must yield nothing at all.
239 mg_fill_const(f, 0)
240 let nFlat: i64 = ms_features(f, MG_W, MG_H, 0, xs, ys, MG_CAP)
241 let perFlat: i64 = ms_period_texels(nFlat, MG_W, MG_H)
242
243 // ---- PASS 4: a scatter of the SAME density, the control for the lattice claim.
244 mg_fill_scatter(f, MG_EXP_N_A)
245 let nS: i64 = ms_features(f, MG_W, MG_H, 0, xs, ys, MG_CAP)
246 let perS: i64 = ms_period_texels(nS, MG_W, MG_H)
247 let regS: i64 = ms_regularity_permil(ms_nn_mean_milli(xs, ys, nS), perS)
248
249 // ---- PASS 5: the MATERIAL case. A field of wall thicknesses, built with no skin construct.
250 mg_fill_wall(f, 0)
251 let nbk: i64 = ms_block_means(f, MG_W, MG_H, MG_BS, blk, MG_BLK_CAP)
252 ms_robust(blk, nbk, scr, out2)
253 let medU: i64 = out2[0]
254 let madU: i64 = out2[1]
255 let anomU: i64 = ms_anom_count(blk, nbk, medU, madU, MG_K_MILLI)
256 let worstU: i64 = ms_worst_idx(blk, nbk, medU)
257 let minV: i64 = ms_min_loc(f, MG_W * MG_H, oidx)
258 let minX: i64 = oidx[0] % MG_W
259 let minY: i64 = oidx[0] / MG_W
260
261 mg_fill_wall(f, 1)
262 let nbk2: i64 = ms_block_means(f, MG_W, MG_H, MG_BS, blk, MG_BLK_CAP)
263 ms_robust(blk, nbk2, scr, out2)
264 let medT: i64 = out2[0]
265 let madT: i64 = out2[1]
266 let anomT: i64 = ms_anom_count(blk, nbk2, medT, madT, MG_K_MILLI)
267 let worstT: i64 = ms_worst_idx(blk, nbk2, medT)
268
269 mg_fill_const(f, MG_WALL_OK)
270 let nbk3: i64 = ms_block_means(f, MG_W, MG_H, MG_BS, blk, MG_BLK_CAP)
271 ms_robust(blk, nbk3, scr, out2)
272 let anomC: i64 = ms_anom_count(blk, nbk3, out2[0], out2[1], MG_K_MILLI)
273
274 // ---- THE NUMBERS. Printed before any verdict, because both vacuous teeth this estate has caught
275 // were caught by a diagnostic dump and never by the pass/fail vector.
276 mg_kv("features_cellA=" as *u8, nA)
277 mg_kv("features_cellB=" as *u8, nB)
278 mg_kv("period_texels_cellA=" as *u8, perA)
279 mg_kv("period_texels_cellB=" as *u8, perB)
280 mg_kv("period_um_cellA=" as *u8, perA_um)
281 mg_kv("generator_declared_pitch_um=" as *u8, RLF_PORE_PITCH_UM)
282 mg_kv("coverage_permil_cellA=" as *u8, covA)
283 mg_kv("coverage_permil_cellB=" as *u8, covB)
284 mg_kv("generator_derived_coverage_permil=" as *u8, derived)
285 mg_kv("nn_mean_milli_cellA=" as *u8, nnA)
286 mg_kv("regularity_permil_pore=" as *u8, regA)
287 mg_kv("regularity_permil_scatter=" as *u8, regS)
288 mg_kv("regularity_bar=" as *u8, MG_REG_BAR)
289 mg_kv("follicles_placed=" as *u8, nb)
290 mg_kv("hit_permil_placed_in_pores=" as *u8, hitB)
291 mg_kv("area_sampled_points=" as *u8, na)
292 mg_kv("hit_permil_area_sampled=" as *u8, hitA)
293 mg_kv("expected_chance_hits_area=" as *u8, na * covA / 1000)
294 mg_kv("hit_permil_underpowered_subset=" as *u8, hitU)
295 mg_kv("reg_verdict_underpowered_subset=" as *u8, vU)
296 mg_kv("chance_permil_is_field_coverage=" as *u8, covA)
297 mg_kv("reg_verdict_placed_in_pores=" as *u8, vB)
298 mg_kv("reg_verdict_area_sampled=" as *u8, vA)
299 mg_kv("scatter_features=" as *u8, nS)
300 mg_kv("flat_features=" as *u8, nFlat)
301 mg_kv("wall_blocks=" as *u8, nbk)
302 mg_kv("wall_uniform_med=" as *u8, medU)
303 mg_kv("wall_uniform_mad=" as *u8, madU)
304 mg_kv("wall_uniform_anomalies=" as *u8, anomU)
305 mg_kv("wall_uniform_worst_block=" as *u8, worstU)
306 mg_kv("wall_textured_mad=" as *u8, madT)
307 mg_kv("wall_textured_anomalies=" as *u8, anomT)
308 mg_kv("wall_textured_worst_block=" as *u8, worstT)
309 mg_kv("planted_block=" as *u8, MG_PATCH_IDX)
310 mg_kv("min_thickness=" as *u8, minV)
311 mg_kv("min_thickness_x=" as *u8, minX)
312 mg_kv("min_thickness_y=" as *u8, minY)
313 mg_kv("control_uniform_anomalies=" as *u8, anomC)
314 gv_puts("\n" as *u8)
315
316 // ---- T1 THE FIXTURE REACHED THE CONDITION. Asserted BEFORE any outcome, because a round trip
317 // over a field with no features would recover nothing and report it as a clean pass.
318 var t1: i64 = 0
319 if nA == MG_EXP_N_A { if nB == MG_EXP_N_B { t1 = 1 } }
320 gv_check("T1 fixture-reached-one-feature-per-lattice-cell-at-both-scales" as *u8, t1, ctr)
321
322 // ---- T2/T3/T4 THE ROUND TRIP. The analyser recovers the generator's lattice without importing it.
323 gv_check("T2 recovers-the-lattice-period-in-texels-at-the-fine-scale" as *u8,
324 perA == MG_CELL_A, ctr)
325 gv_check("T3 recovers-the-generators-declared-pitch-in-microns" as *u8,
326 perA_um == RLF_PORE_PITCH_UM, ctr)
327 gv_check("T4 recovers-the-lattice-period-at-a-second-independent-scale" as *u8,
328 perB == MG_CELL_B, ctr)
329
330 // ---- T5 THE ANSWER TRACKS THE GENERATOR RATHER THAN BEING A CONSTANT. A hardcoded pitch passes
331 // T3 and dies here, which is the only reason T3 is evidence of anything.
332 gv_check("T5 recovered-period-doubles-when-the-generators-cell-doubles" as *u8,
333 perB == perA * 2, ctr)
334
335 // ---- T6 COVERAGE AGAINST THE MODEL'S OWN DERIVED AREA, at the better-sampled scale.
336 gv_check("T6 recovered-coverage-matches-the-generators-own-derived-disc-area" as *u8,
337 ms_abs(covB - derived) <= MG_TOL_PERMIL, ctr)
338
339 // ---- T7 IS IT A LATTICE. Read against the midpoint of two analytic references, not a tuned bar.
340 gv_check("T7 the-pore-field-reads-as-a-lattice-not-a-scatter" as *u8, regA >= MG_REG_BAR, ctr)
341
342 // ---- T8/T9 THE OPERATOR'S QUESTION: DOES THE HAIR COME OUT OF THE PORE. Both directions.
343 gv_check("T8 follicles-placed-by-the-forward-model-read-BOUND" as *u8,
344 vB == MS_REG_BOUND, ctr)
345 gv_check("T9 follicles-area-sampled-without-consulting-the-pore-layer-read-DECOUPLED" as *u8,
346 vA == MS_REG_DECOUPLED, ctr)
347
348 // ---- T10 THE NULL IS LOAD-BEARING, NOT DECORATION. Hand the SAME observation a different chance
349 // rate and the verdict must FLIP. An implementation that ignored the null entirely would answer
350 // identically either way, and T8/T9 would then both be passing for the wrong reason.
351 gv_check("T10 the-registration-verdict-flips-when-the-null-is-replaced" as *u8,
352 ms_reg_verdict(hitB, MS_PERMIL, nb) != vB, ctr)
353
354 // ---- T11/T12 DEPARTURE FROM SELF, on a NON-SKIN field, in both the degenerate and the textured
355 // case. This is the material generalisation made real rather than asserted: nothing in this
356 // fixture is a pore, a follicle or a skin construct.
357 var t11: i64 = 0
358 if anomU == 1 { if worstU == MG_PATCH_IDX { t11 = 1 } }
359 gv_check("T11 degenerate-scale-names-the-planted-thin-block-and-only-it" as *u8, t11, ctr)
360 var t12: i64 = 0
361 if madT > 0 { if worstT == MG_PATCH_IDX { if anomT >= 1 { t12 = 1 } } }
362 gv_check("T12 textured-field-with-a-non-degenerate-scale-still-names-the-planted-block" as *u8,
363 t12, ctr)
364
365 // ---- T13 THE FAIL-POINT QUERY. The teapot class: the thinnest wall, and WHERE.
366 var t13: i64 = 0
367 if minV == MG_WALL_THIN {
368 if minX / MG_BS == MG_PATCH_BX { if minY / MG_BS == MG_PATCH_BY { t13 = 1 } }
369 }
370 gv_check("T13 fail-point-query-returns-the-thin-value-and-its-location" as *u8, t13, ctr)
371
372 // ---- T14 THE SCATTER CONTROL REACHED COMPARABLE DENSITY. Without this the regularity comparison
373 // below is unmoored: a control with a tenth of the features would differ for the wrong reason.
374 var t14: i64 = 0
375 if nS * 2 >= MG_EXP_N_A { if nS <= MG_EXP_N_A { t14 = 1 } }
376 gv_check("T14 scatter-control-reached-comparable-feature-density" as *u8, t14, ctr)
377
378 // ---- NEGATIVE CONTROLS. Each fires on a field the analyser must NOT bless, and each is silent on
379 // the subject -- which is the only evidence the teeth above can fail at all.
380 var n1: i64 = 0
381 if nFlat == 0 { if perFlat < 0 { n1 = 1 } }
382 gv_check("neg-control-a-flat-field-yields-no-features-and-an-UNMEASURABLE-period" as *u8, n1, ctr)
383
384 gv_check("neg-control-a-random-scatter-must-not-read-as-a-lattice" as *u8,
385 regS < MG_REG_BAR, ctr)
386
387 gv_check("neg-control-a-uniform-thickness-field-reports-zero-anomalies" as *u8,
388 anomC == 0, ctr)
389
390 gv_check("neg-control-an-empty-point-set-is-UNMEASURABLE-never-DECOUPLED" as *u8,
391 vEmpty == MS_REG_UNMEASURABLE, ctr)
392
393 // THE GUARD THAT FIRST RUN BOUGHT. An independence claim needs enough expected chance hits to
394 // have detected binding had it existed; below that the analyser must abstain rather than pick the
395 // flattering answer. This is the DECOUPLED path only -- BOUND is a presence claim and T8 proves
396 // it still passes on the same 256 points.
397 gv_check("neg-control-an-underpowered-independence-claim-abstains-instead-of-reading-DECOUPLED" as *u8,
398 vU == MS_REG_UNMEASURABLE, ctr)
399
400 return gv_verdict("nx_microscan_gate" as *u8, ctr,
401 "the inverse of the estate's micro-relief generator, proven by round trip: handed a field the shipped pore layer produced, the analyser recovers the declared pitch in microns and the lattice period at two scales without importing any of the generator, and the recovered period doubles when the generator's cell doubles so a constant cannot pass. Layer registration is decided against the field's OWN measured coverage as the null, and it answers the question both ways: follicles placed through the forward model read BOUND while follicles AREA-SAMPLED without consulting the pore layer read DECOUPLED at chance. The same analyser, with no skin input at all, names a planted thin block in a field of WALL THICKNESSES in both the degenerate and the textured case and returns the fail point's location, which is the teapot-leak question in the same call. DECLARED SCOPE: this measures periodicity, registration and departure-from-self on a height or thickness field and emits CANDIDATES WITH SCORES. It is not a diagnosis of anything. The melanoma reference in the brief is a RESOLUTION BAR we do not carry -- dermoscopy reads colour and pigment network at roughly 10-20 um per pixel, our baked per-region asset carries a 50 um texel and height only -- and it is recorded here as the gap, never as a capability. THAT RESOLUTION FIGURE IS SOURCE-UNPINNED: no dermatology reference was mirrored for this lane, so it is recorded as an honest absence rather than a borrowed citation, the same way nx_relief_lib records two of its three band sources as UNPINNED. Pinning it is owed and it does not change any measurement above, all of which are against the estate's own generator." as *u8)
402}