code wiki / (root) / nx_microscan_gate.nx

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}