nx_donor_texm_gate.nx source
↩ module page · 172 lines · 8161 B
1// nx_donor_texm_gate.nx -- THE DONOR-SURFACE GATE: authored FBX materials carried into TEXC+TEXM
2// on ALL FOUR Fab donors, proven on the live artifacts (never fixtures standing in for them).
3//
4// Subject: knowledge/rigcorpus/{dark_witch,paladin,dark_knight,toon3d8}_rigged.nxa as written by
5// nx_fbx_texm. Proves, per donor:
6// (1) TEXC exists and its row count EQUALS the VERT count -- the desync refusal held;
7// (2) TEXM exists, declares 4 map records, albedo is record 0, non-empty, a REAL PNG, with
8// entropy above the constant-color floor (a scalar-flood atlas cannot pass);
9// (3) the UV set is non-degenerate (u-spread) and spans >= 2 charts.
10// Neg-control: the banked PRE-TEXM donor (knowledge/bank/) must FAIL the presence tooth --
11// a gate that cannot fire on the pre-fix artifact has not been shown to fire.
12// The donor count is bound IN the conditions (4 of 4), so the empty set cannot pass.
13
14import "nx_syscalls.nx"
15import "nx_gate_verdict.nx"
16
17const DTG_NDONOR: i64 = 4
18const DTG_A1: *u8 = "knowledge/rigcorpus/dark_witch_rigged.nxa"
19const DTG_A2: *u8 = "knowledge/rigcorpus/paladin_rigged.nxa"
20const DTG_A3: *u8 = "knowledge/rigcorpus/dark_knight_rigged.nxa"
21const DTG_A4: *u8 = "knowledge/rigcorpus/toon3d8_rigged.nxa"
22const DTG_BANKED: *u8 = "knowledge/bank/dark_witch_rigged.nxa.pretexm-20260823"
23
24const DTG_HDR: i64 = 32
25const DTG_TOCE: i64 = 32
26const DTG_TM_HDRW: i64 = 6
27const DTG_TM_RECW: i64 = 3
28const DTG_NMAPS: i64 = 4
29const DTG_RES_MIN: i64 = 8 // one PNG filter block, the same floor nx_nxa_texm enforces
30const DTG_PNG0: i64 = 137
31const DTG_PNG1: i64 = 80
32const DTG_PNG2: i64 = 78
33const DTG_PNG3: i64 = 71
34// entropy floor: a constant-color PNG of any res compresses to well under this permil of the
35// raw size; a real albedo cannot. Same discrimination the npc-atlas gate uses.
36const DTG_ENTROPY_MIN_BYTES: i64 = 65536
37const DTG_USPREAD_MIN_PERMIL: i64 = 500 // spread must cover over half the Q16 axis
38const DTG_Q16: i64 = 65536
39
40func dtg_rd64(b: *u8, off: i64) -> i64 {
41 var v: i64 = 0
42 var k: i64 = 7
43 while k >= 0 { v = v * 256 + (b[off + k] as i64); k = k - 1 }
44 return v
45}
46func dtg_tag4(s: *u8) -> i64 {
47 return (s[0] as i64) | ((s[1] as i64) << 8) | ((s[2] as i64) << 16) | ((s[3] as i64) << 24)
48}
49func dtg_sec(b: *u8, ns: i64, t: *u8, poff: *i64, pwords: *i64) -> i64 {
50 var s: i64 = 0
51 while s < ns {
52 let e: i64 = DTG_HDR + s * DTG_TOCE
53 if dtg_rd64(b, e) == dtg_tag4(t) {
54 poff[0] = dtg_rd64(b, e + 8)
55 pwords[0] = dtg_rd64(b, e + 16)
56 return 1
57 }
58 s = s + 1
59 }
60 return 0
61}
62
63// per-donor measurement: returns a bitmask of passed sub-checks and prints the values.
64// bit0 texc+texm present, bit1 texc rows == vert rows, bit2 albedo real png + entropy,
65// bit3 uv spread + multi-chart
66func dtg_measure(path: *u8) -> i64 {
67 let lp: *i64 = sys_mmap(16) as *i64
68 let b: *u8 = sys_read_file(path, lp)
69 if (b as i64) == 0 { gv_puts(" unreadable: " as *u8); gv_puts(path); gv_puts("\n" as *u8); return 0 }
70 let ns: i64 = dtg_rd64(b, 16)
71 let o1: *i64 = sys_mmap(16) as *i64
72 let w1: *i64 = sys_mmap(16) as *i64
73 let o2: *i64 = sys_mmap(16) as *i64
74 let w2: *i64 = sys_mmap(16) as *i64
75 let o3: *i64 = sys_mmap(16) as *i64
76 let w3: *i64 = sys_mmap(16) as *i64
77 var mask: i64 = 0
78 let has_texc: i64 = dtg_sec(b, ns, "TEXC" as *u8, o1, w1)
79 let has_texm: i64 = dtg_sec(b, ns, "TEXM" as *u8, o2, w2)
80 let has_vert: i64 = dtg_sec(b, ns, "VERT" as *u8, o3, w3)
81 if has_texc == 1 { if has_texm == 1 { mask = mask | 1 } }
82 if has_texc == 1 { if has_vert == 1 {
83 let texc_rows: i64 = dtg_rd64(b, o1[0])
84 let vert_rows: i64 = dtg_rd64(b, o3[0])
85 gv_puts(" texc_rows=" as *u8); gv_num(texc_rows)
86 gv_puts(" vert_rows=" as *u8); gv_num(vert_rows)
87 if texc_rows == vert_rows { mask = mask | 2 }
88 } }
89 if has_texm == 1 {
90 let nmaps: i64 = dtg_rd64(b, o2[0])
91 let res: i64 = dtg_rd64(b, o2[0] + 8)
92 let a_off: i64 = dtg_rd64(b, o2[0] + (DTG_TM_HDRW + 1) * 8)
93 let a_len: i64 = dtg_rd64(b, o2[0] + (DTG_TM_HDRW + 2) * 8)
94 gv_puts(" nmaps=" as *u8); gv_num(nmaps)
95 gv_puts(" res=" as *u8); gv_num(res)
96 gv_puts(" albedo_len=" as *u8); gv_num(a_len)
97 if nmaps == DTG_NMAPS { if res >= DTG_RES_MIN { if a_len > 0 {
98 let blobbase: i64 = o2[0] + (DTG_TM_HDRW + DTG_NMAPS * DTG_TM_RECW) * 8
99 let p0: i64 = blobbase + a_off
100 var pngok: i64 = 0
101 if (b[p0] as i64) == DTG_PNG0 { if (b[p0+1] as i64) == DTG_PNG1 {
102 if (b[p0+2] as i64) == DTG_PNG2 { if (b[p0+3] as i64) == DTG_PNG3 { pngok = 1 } } } }
103 if pngok == 1 { if a_len >= DTG_ENTROPY_MIN_BYTES { mask = mask | 4 } }
104 } } }
105 }
106 if has_texc == 1 {
107 let rows: i64 = dtg_rd64(b, o1[0])
108 let grid: i64 = dtg_rd64(b, o1[0] + 16)
109 var umin: i64 = DTG_Q16
110 var umax: i64 = 0
111 var cmin: i64 = 1 << 40
112 var cmax: i64 = 0 - 1
113 var i: i64 = 0
114 while i < rows {
115 let base: i64 = o1[0] + (4 + i * 3) * 8
116 let u: i64 = dtg_rd64(b, base)
117 let ch: i64 = dtg_rd64(b, base + 16)
118 if u < umin { umin = u }
119 if u > umax { umax = u }
120 if ch < cmin { cmin = ch }
121 if ch > cmax { cmax = ch }
122 i = i + 1
123 }
124 let spread_permil: i64 = (umax - umin) * 1000 / DTG_Q16
125 gv_puts(" u_spread_permil=" as *u8); gv_num(spread_permil)
126 gv_puts(" charts=" as *u8); gv_num(cmax - cmin + 1)
127 gv_puts(" grid=" as *u8); gv_num(grid)
128 gv_puts("\n" as *u8)
129 if spread_permil >= DTG_USPREAD_MIN_PERMIL { if cmax > cmin { mask = mask | 8 } }
130 } else { gv_puts("\n" as *u8) }
131 return mask
132}
133
134func main() -> i64 {
135 let ctr: *i64 = gv_ctr()
136 gv_head("nx_donor_texm_gate -- authored donor surfaces carried, proven per artifact" as *u8)
137
138 gv_puts("[donor 1] " as *u8); gv_puts(DTG_A1); gv_puts("\n" as *u8)
139 let m1: i64 = dtg_measure(DTG_A1)
140 gv_puts("[donor 2] " as *u8); gv_puts(DTG_A2); gv_puts("\n" as *u8)
141 let m2: i64 = dtg_measure(DTG_A2)
142 gv_puts("[donor 3] " as *u8); gv_puts(DTG_A3); gv_puts("\n" as *u8)
143 let m3: i64 = dtg_measure(DTG_A3)
144 gv_puts("[donor 4] " as *u8); gv_puts(DTG_A4); gv_puts("\n" as *u8)
145 let m4: i64 = dtg_measure(DTG_A4)
146
147 var full: i64 = 0
148 if m1 == 15 { full = full + 1 }
149 if m2 == 15 { full = full + 1 }
150 if m3 == 15 { full = full + 1 }
151 if m4 == 15 { full = full + 1 }
152
153 gv_check("all-4-donors-carry-texc-and-texm (count bound in condition, empty set cannot pass)" as *u8, full == DTG_NDONOR, ctr)
154 gv_check("witch-texc-rows-equal-vert-rows (the desync refusal held)" as *u8, (m1 & 2) == 2, ctr)
155 gv_check("paladin-texc-rows-equal-vert-rows" as *u8, (m2 & 2) == 2, ctr)
156 gv_check("knight-texc-rows-equal-vert-rows" as *u8, (m3 & 2) == 2, ctr)
157 gv_check("toon3d8-texc-rows-equal-vert-rows" as *u8, (m4 & 2) == 2, ctr)
158 gv_check("witch-albedo-real-png-above-entropy-floor (a scalar flood cannot pass)" as *u8, (m1 & 4) == 4, ctr)
159 gv_check("paladin-albedo-real-png-above-entropy-floor" as *u8, (m2 & 4) == 4, ctr)
160 gv_check("knight-albedo-real-png-above-entropy-floor" as *u8, (m3 & 4) == 4, ctr)
161 gv_check("toon3d8-albedo-real-png-above-entropy-floor" as *u8, (m4 & 4) == 4, ctr)
162 gv_check("witch-uv-spread-and-multichart" as *u8, (m1 & 8) == 8, ctr)
163 gv_check("paladin-uv-spread-and-multichart" as *u8, (m2 & 8) == 8, ctr)
164 gv_check("knight-uv-spread-and-multichart" as *u8, (m3 & 8) == 8, ctr)
165 gv_check("toon3d8-uv-spread-and-multichart" as *u8, (m4 & 8) == 8, ctr)
166
167 gv_puts("[neg-control] " as *u8); gv_puts(DTG_BANKED); gv_puts("\n" as *u8)
168 let mb: i64 = dtg_measure(DTG_BANKED)
169 gv_check("neg-control-banked-pretexm-donor-fires (pre-fix artifact lacks TEXC+TEXM -- the gate can fail)" as *u8, (mb & 1) == 0, ctr)
170
171 return gv_verdict("NX-DONOR-TEXM" as *u8, ctr, "donor surfaces are DATA carried from the author, and the carry is proven on every donor" as *u8)
172}