code wiki / _hdl_build / nx_cdmap_referee_gate.nx

nx_cdmap_referee_gate.nx source

↩ module page · 237 lines · 15981 B

1// nx_cdmap_referee_gate.nx -- referee for the position map's SECOND RULER (datavis DV2a, 2026-09-15): the SVG scanner on a 2// hand-built figure, the heuristic critic reproducing a hand-worked grade, two PLANTED defects the ruler must fire on 3// (a label on a label, a label on a mark), the api.json reader with absent-key controls, then -- when the SIL-OFL face is 4// on disk -- real advances bounded by what a sans face can measure and the metric critic firing on the same plant, and 5// -- when the live search page is on disk -- the self-grade the emitter published re-derived from its own SVG. 6// The font and the live page are OPTIONAL witnesses, announced through gv_kv, never gv_need: a witness structurally absent 7// on one host must not SKIP the whole gate forever there (measured 2026-09-02 on the browser lane). license_tier: ORIGINAL 8import "nx_cdmap_referee_lib.nx" 9import "nx_syscalls.nx" 10import "nx_gate_verdict.nx" 11 12const G_FONT: i64 = 13 13const G_EXP_N: i64 = 2 14const G_FRAME_X0: i64 = 70 15const G_FRAME_X1: i64 = 730 16const G_FRAME_Y1: i64 = 460 17const G_L0_X: i64 = 201 18const G_L0_BOX_Y: i64 = 208 19const G_TW_NISHI: i64 = 36 // cl_text_w(5, 13) 20const G_TW_MOJEEK: i64 = 43 // cl_text_w(6, 13) = 43.68 floored 21const G_SPREAD_PRISTINE: i64 = 428 // marks 180..483 of 660 (459) and 216..387 of 430 (397), mean 428 22const G_PUB_MM: i64 = 1 23const G_PUB_SPREAD: i64 = 690 24const G_JSON_BYTES: i64 = 512 25const G_CH_QUOTE: i64 = 34 26const G_MIN_EM_PERMIL: i64 = 350 // a sans glyph advance never reads below 0.35 em on average... 27const G_MAX_EM_PERMIL: i64 = 900 // ...nor above 0.90 em; outside this band the ruler is broken, not the font 28const G_NISHI_CHARS: i64 = 5 29const G_CRIT_W: i64 = 6 30const G_FONT_NAS: *u8 = "knowledge/fonts/LiberationSans-Regular.ttf" 31const G_FONT_NAS_BOLD: *u8 = "knowledge/fonts/LiberationSans-Bold.ttf" 32const G_FONT_LAPTOP: *u8 = "web_assets/fonts/LiberationSans-Regular.ttf" 33const G_FONT_LAPTOP_BOLD: *u8 = "web_assets/fonts/LiberationSans-Bold.ttf" 34const G_LIVE_PAGE: *u8 = "sites/nishifamily/compare/search/index.html" 35const G_LIVE_API: *u8 = "sites/nishifamily/compare/search/api.json" 36const G_BLOCK: *u8 = "readability_cut" 37 38const G_FIX_HEAD: *u8 = "<figure><svg class='cdmap' viewBox='0 0 760 520'>\n<rect x='70' y='30' width='660' height='430' rx='6' fill='var(--nx-color-panel)'/>\n<text x='70' y='475' fill='var(--nx-color-mut)' font-size='11'>700</text>\n<circle cx='180' cy='216' r='15' fill='var(--nx-color-accent)'><title>Nishi</title></circle>\n<circle cx='483' cy='387' r='15' fill='rgb(230,159,0)'><title>Mojeek</title></circle>\n" 39const G_FIX_TAIL: *u8 = "</svg></figure>\n" 40const G_LBL_NISHI_OK: *u8 = "<text x='201' y='220' font-size='13' fill='var(--nx-color-fg)' style='paint-order:stroke' font-weight='700'>Nishi</text>\n" 41const G_LBL_NISHI_ONMARK: *u8 = "<text x='170' y='220' font-size='13' fill='var(--nx-color-fg)' style='paint-order:stroke' font-weight='700'>Nishi</text>\n" 42const G_LBL_MOJEEK_ONMARK: *u8 = "<text x='150' y='220' font-size='13' fill='var(--nx-color-fg)' style='paint-order:stroke'>Mojeek</text>\n" 43const G_LBL_MOJEEK_OK: *u8 = "<text x='504' y='391' font-size='13' fill='var(--nx-color-fg)' style='paint-order:stroke'>Mojeek</text>\n" 44const G_LBL_MOJEEK_ONLABEL: *u8 = "<text x='201' y='220' font-size='13' fill='var(--nx-color-fg)' style='paint-order:stroke'>Mojeek</text>\n" 45const G_FIX_BYTES: i64 = 2048 46 47func g_cat(d: *u8, o: i64, s: *u8) -> i64 { var i: i64 = 0; var p: i64 = o; while s[i] != (0 as u8) { d[p] = s[i]; p = p + 1; i = i + 1 } return p } 48func g_fixture(a: *u8, b: *u8) -> *u8 { 49 let d: *u8 = sys_mmap(G_FIX_BYTES) 50 var o: i64 = g_cat(d, 0, G_FIX_HEAD); o = g_cat(d, o, a); o = g_cat(d, o, b); o = g_cat(d, o, G_FIX_TAIL) 51 d[o] = 0 as u8 52 return d 53} 54func g_q(d: *u8, o: i64) -> i64 { d[o] = G_CH_QUOTE as u8; return o + 1 } 55func g_jkey(d: *u8, o: i64, k: *u8, v: i64) -> i64 { 56 var p: i64 = g_q(d, o); p = g_cat(d, p, k); p = g_q(d, p); p = g_cat(d, p, ":" as *u8); p = gv_catn(d, p, v); return p 57} 58// {"rows_written_today":1,"readability_cut":{...},"readability_cube":{"label_overlaps":2}} assembled at runtime so no 59// double quote has to live in a literal, and so the fixture cannot be mistaken for a published api.json by any scanner 60func g_json(d: *u8) -> i64 { 61 var o: i64 = g_cat(d, 0, "{" as *u8) 62 o = g_jkey(d, o, "rows_written_today" as *u8, 1); o = g_cat(d, o, "," as *u8) 63 o = g_q(d, o); o = g_cat(d, o, G_BLOCK); o = g_q(d, o); o = g_cat(d, o, ":{" as *u8) 64 o = g_jkey(d, o, "label_overlaps" as *u8, 0); o = g_cat(d, o, "," as *u8) 65 o = g_jkey(d, o, "labels_over_marks" as *u8, 0); o = g_cat(d, o, "," as *u8) 66 o = g_jkey(d, o, "off_canvas" as *u8, 0); o = g_cat(d, o, "," as *u8) 67 o = g_jkey(d, o, "unresolved" as *u8, 0); o = g_cat(d, o, "," as *u8) 68 o = g_jkey(d, o, "mark_overlaps" as *u8, G_PUB_MM); o = g_cat(d, o, "," as *u8) 69 o = g_jkey(d, o, "spread_permil" as *u8, G_PUB_SPREAD); o = g_cat(d, o, "," as *u8) 70 o = g_jkey(d, o, "defects" as *u8, 0); o = g_cat(d, o, "}," as *u8) 71 o = g_q(d, o); o = g_cat(d, o, "readability_cube" as *u8); o = g_q(d, o); o = g_cat(d, o, ":{" as *u8) 72 o = g_jkey(d, o, "label_overlaps" as *u8, 2); o = g_cat(d, o, "}}" as *u8) 73 d[o] = 0 as u8 74 return o 75} 76func g_i64(n: i64) -> *i64 { return sys_mmap(n * CR_I64_BYTES) as *i64 } 77func g_setname(names: *u8, i: i64, s: *u8) -> i64 { let slot: *u8 = cr_name_at(names, i); var k: i64 = 0; while s[k] != (0 as u8) { slot[k] = s[k]; k = k + 1 } slot[k] = 0 as u8; return k } 78// scan a fixture into fresh arrays; returns the label count and leaves everything in the record slots 79func g_scan(fx: *u8, rec: *i64, names: *u8) -> i64 { 80 // rec layout: 0 mx, 1 my, 2 mr, 3 lx, 4 ly, 5 lfont, 6 lbold, 7 frame, 8 out, 9 lw, 10 lh, 11 crit (pointers as i64) 81 var k: i64 = 0 82 while k < 12 { rec[k] = g_i64(CR_MAXN) as i64; k = k + 1 } 83 return cr_scan(fx, cr_slen(fx), rec[0] as *i64, rec[1] as *i64, rec[2] as *i64, rec[3] as *i64, rec[4] as *i64, rec[5] as *i64, rec[6] as *i64, names, rec[7] as *i64, rec[8] as *i64) 84} 85func g_grade(rec: *i64, names: *u8, n: i64, fhr: *i64, fhb: *i64) -> *i64 { 86 cr_boxes(n, names, rec[5] as *i64, rec[6] as *i64, fhr, fhb, rec[9] as *i64, rec[10] as *i64) 87 cr_critic(n, rec[0] as *i64, rec[1] as *i64, rec[2] as *i64, rec[3] as *i64, rec[4] as *i64, rec[9] as *i64, rec[10] as *i64, rec[7] as *i64, rec[11] as *i64) 88 return rec[11] as *i64 89} 90func g_load_font(nas: *u8, laptop: *u8) -> *i64 { 91 let a: *i64 = tf_load(nas) 92 if (a as i64) != 0 { return a } 93 return tf_load(laptop) 94} 95 96func main() -> i64 { 97 let ctr: *i64 = gv_ctr() 98 gv_head("=== NX-CDMAP-REFEREE GATE -- the position map's second ruler: SVG re-derivation, real-font re-measurement, both critics ===" as *u8) 99 // ---- T1: the scanner on the pristine fixture 100 let fxA: *u8 = g_fixture(G_LBL_NISHI_OK, G_LBL_MOJEEK_OK) 101 let recA: *i64 = g_i64(12) 102 let namesA: *u8 = sys_mmap(CR_MAXN * CR_NAME_W) 103 let nA: i64 = g_scan(fxA, recA, namesA) 104 let frA: *i64 = recA[7] as *i64 105 let lxA: *i64 = recA[3] as *i64 106 let lyA: *i64 = recA[4] as *i64 107 let lbA: *i64 = recA[6] as *i64 108 let lfA: *i64 = recA[5] as *i64 109 gv_check_eq("T1-scan-labels" as *u8, nA, G_EXP_N, ctr) 110 gv_check_eq("T1a-scan-marks" as *u8, (recA[8] as *i64)[0], G_EXP_N, ctr) 111 gv_check_eq("T1b-frame-x0-from-rect" as *u8, frA[CR_F_X0], G_FRAME_X0, ctr) 112 gv_check_eq("T1c-frame-x1-from-rect-width" as *u8, frA[CR_F_X1], G_FRAME_X1, ctr) 113 gv_check_eq("T1d-frame-y1-from-rect-height" as *u8, frA[CR_F_Y1], G_FRAME_Y1, ctr) 114 gv_check_eq("T1e-label0-x" as *u8, lxA[0], G_L0_X, ctr) 115 gv_check_eq("T1f-label0-box-top-is-baseline-minus-12" as *u8, lyA[0], G_L0_BOX_Y, ctr) 116 gv_check_eq("T1g-label0-bold-read-from-tag" as *u8, lbA[0], 1, ctr) 117 gv_check_eq("T1h-label1-not-bold" as *u8, lbA[1], 0, ctr) 118 gv_check_eq("T1i-label0-name" as *u8, cr_streq(cr_name_at(namesA, 0), "Nishi" as *u8), 1, ctr) 119 gv_check_eq("T1j-label1-name" as *u8, cr_streq(cr_name_at(namesA, 1), "Mojeek" as *u8), 1, ctr) 120 gv_check_eq("T1k-label-font-px" as *u8, lfA[0], G_FONT, ctr) 121 gv_check_eq("T1l-NEG-muted-tick-text-is-not-a-label" as *u8, cr_streq(cr_name_at(namesA, 0), "700" as *u8), 0, ctr) 122 // ---- T2 + T3: the heuristic ruler reproduces the emitter's widths and grades the pristine figure clean 123 let critA: *i64 = g_grade(recA, namesA, nA, 0 as *i64, 0 as *i64) 124 let lwA: *i64 = recA[9] as *i64 125 gv_check_eq("T2-heuristic-width-Nishi" as *u8, lwA[0], G_TW_NISHI, ctr) 126 gv_check_eq("T2a-heuristic-width-Mojeek" as *u8, lwA[1], G_TW_MOJEEK, ctr) 127 gv_check_eq("T3-pristine-LL-0" as *u8, critA[CL_C_LL], 0, ctr) 128 gv_check_eq("T3a-pristine-LM-0" as *u8, critA[CL_C_LM], 0, ctr) 129 gv_check_eq("T3b-pristine-OFF-0" as *u8, critA[CL_C_OFF], 0, ctr) 130 gv_check_eq("T3c-pristine-MM-0" as *u8, critA[CL_C_MM], 0, ctr) 131 gv_check_eq("T3d-pristine-spread-hand-worked" as *u8, critA[CL_C_SPREAD], G_SPREAD_PRISTINE, ctr) 132 gv_check_eq("T3e-pristine-defects-0" as *u8, critA[CL_C_DEFECTS], 0, ctr) 133 // ---- T4: a label planted on a label must fire 134 let fxB: *u8 = g_fixture(G_LBL_NISHI_OK, G_LBL_MOJEEK_ONLABEL) 135 let recB: *i64 = g_i64(12) 136 let namesB: *u8 = sys_mmap(CR_MAXN * CR_NAME_W) 137 let nB: i64 = g_scan(fxB, recB, namesB) 138 let critB: *i64 = g_grade(recB, namesB, nB, 0 as *i64, 0 as *i64) 139 gv_check_eq("T4-neg-control-label-on-label-LL-1" as *u8, critB[CL_C_LL], 1, ctr) 140 gv_check_eq("T4a-neg-control-label-on-label-defects-1" as *u8, critB[CL_C_DEFECTS], 1, ctr) 141 // ---- T5: a label planted on a mark must fire 142 let fxC: *u8 = g_fixture(G_LBL_NISHI_OK, G_LBL_MOJEEK_ONMARK) 143 let recC: *i64 = g_i64(12) 144 let namesC: *u8 = sys_mmap(CR_MAXN * CR_NAME_W) 145 let nC: i64 = g_scan(fxC, recC, namesC) 146 let critC: *i64 = g_grade(recC, namesC, nC, 0 as *i64, 0 as *i64) 147 var lm_fired: i64 = 0 148 if critC[CL_C_LM] >= 1 { lm_fired = 1 } 149 gv_check("T5-neg-control-label-on-mark-LM-fires" as *u8, lm_fired, ctr) 150 gv_check_eq("T5a-neg-control-label-on-mark-LL-still-0" as *u8, critC[CL_C_LL], 0, ctr) 151 // a label over its OWN mark is not a defect by design (the placer seats every label beside its own mark and the 152 // critic skips that pair), so the plant above is ANOTHER player's label; this control pins the semantics that the 153 // first cut of this gate got wrong rather than leaving it implicit 154 let fxD: *u8 = g_fixture(G_LBL_NISHI_ONMARK, G_LBL_MOJEEK_OK) 155 let recD: *i64 = g_i64(12) 156 let namesD: *u8 = sys_mmap(CR_MAXN * CR_NAME_W) 157 let nD: i64 = g_scan(fxD, recD, namesD) 158 let critD: *i64 = g_grade(recD, namesD, nD, 0 as *i64, 0 as *i64) 159 gv_check_eq("T5b-own-mark-overlap-is-not-a-defect-by-design" as *u8, critD[CL_C_LM], 0, ctr) 160 // ---- T6: the api.json reader and its absent-key controls 161 let jb: *u8 = sys_mmap(G_JSON_BYTES) 162 let jn: i64 = g_json(jb) 163 gv_check_eq("T6-json-label-overlaps" as *u8, cr_json_int(jb, jn, G_BLOCK, "label_overlaps" as *u8), 0, ctr) 164 gv_check_eq("T6a-json-mark-overlaps" as *u8, cr_json_int(jb, jn, G_BLOCK, "mark_overlaps" as *u8), G_PUB_MM, ctr) 165 gv_check_eq("T6b-json-spread" as *u8, cr_json_int(jb, jn, G_BLOCK, "spread_permil" as *u8), G_PUB_SPREAD, ctr) 166 gv_check_eq("T6c-json-defects" as *u8, cr_json_int(jb, jn, G_BLOCK, "defects" as *u8), 0, ctr) 167 gv_check_eq("T6d-NEG-json-absent-key-is-absent" as *u8, cr_json_int(jb, jn, G_BLOCK, "no_such_key" as *u8), CR_ABSENT, ctr) 168 gv_check_eq("T6e-NEG-json-absent-block-is-absent" as *u8, cr_json_int(jb, jn, "no_such_block" as *u8, "defects" as *u8), CR_ABSENT, ctr) 169 gv_check_eq("T6f-NEG-json-key-of-the-other-block-does-not-leak" as *u8, cr_json_int(jb, jn, G_BLOCK, "label_overlaps" as *u8), 0, ctr) 170 // ---- T7: the metric ruler over the real face (OPTIONAL witness, announced) 171 let fhr: *i64 = g_load_font(G_FONT_NAS, G_FONT_LAPTOP) 172 var fhb: *i64 = g_load_font(G_FONT_NAS_BOLD, G_FONT_LAPTOP_BOLD) 173 if (fhb as i64) == 0 { fhb = fhr } 174 var font_present: i64 = 0 175 var w_nishi: i64 = 0 176 var w_marg: i64 = 0 177 if (fhr as i64) != 0 { 178 font_present = 1 179 w_nishi = cr_w_metric(fhr, "Nishi" as *u8, G_FONT) 180 w_marg = cr_w_metric(fhr, "Marginalia" as *u8, G_FONT) 181 let lo: i64 = G_FONT * G_NISHI_CHARS * G_MIN_EM_PERMIL / CR_PERMIL 182 let hi: i64 = G_FONT * G_NISHI_CHARS * G_MAX_EM_PERMIL / CR_PERMIL 183 var in_band: i64 = 0 184 if w_nishi >= lo { if w_nishi <= hi { in_band = 1 } } 185 gv_check("T7-metric-width-Nishi-within-a-sans-band" as *u8, in_band, ctr) 186 var wider: i64 = 0 187 if w_marg > w_nishi { wider = 1 } 188 gv_check("T7a-metric-Marginalia-wider-than-Nishi" as *u8, wider, ctr) 189 let critBm: *i64 = g_grade(recB, namesB, nB, fhr, fhb) 190 gv_check_eq("T7b-neg-control-metric-ruler-fires-on-the-label-plant" as *u8, critBm[CL_C_LL], 1, ctr) 191 let critAm: *i64 = g_grade(recA, namesA, nA, fhr, fhb) 192 gv_check_eq("T7c-metric-ruler-pristine-LL-0" as *u8, critAm[CL_C_LL], 0, ctr) 193 gv_check_eq("T7d-metric-ruler-pristine-LM-0" as *u8, critAm[CL_C_LM], 0, ctr) 194 } 195 // ---- T8: the LIVE page's self-grade re-derived from its own SVG (OPTIONAL witness, announced) 196 var live_present: i64 = 0 197 var live_labels: i64 = 0 198 var live_metric_defects: i64 = CR_ABSENT 199 var live_pub_defects: i64 = CR_ABSENT 200 let pl: *i64 = g_i64(2) 201 let ph: *u8 = sys_read_file(G_LIVE_PAGE, pl) 202 let jl: *i64 = g_i64(2) 203 let pj: *u8 = sys_read_file(G_LIVE_API, jl) 204 if (ph as i64) != 0 { if (pj as i64) != 0 { 205 let recL: *i64 = g_i64(12) 206 let namesL: *u8 = sys_mmap(CR_MAXN * CR_NAME_W) 207 var k: i64 = 0 208 while k < 12 { recL[k] = g_i64(CR_MAXN) as i64; k = k + 1 } 209 let nL: i64 = cr_scan(ph, pl[0], recL[0] as *i64, recL[1] as *i64, recL[2] as *i64, recL[3] as *i64, recL[4] as *i64, recL[5] as *i64, recL[6] as *i64, namesL, recL[7] as *i64, recL[8] as *i64) 210 if nL > 0 { 211 live_present = 1 212 live_labels = nL 213 gv_check_eq("T8-live-labels-pair-with-marks" as *u8, nL, (recL[8] as *i64)[0], ctr) 214 let critL: *i64 = g_grade(recL, namesL, nL, 0 as *i64, 0 as *i64) 215 gv_check_eq("T8a-live-self-grade-LL-reproduced-from-svg" as *u8, critL[CL_C_LL], cr_json_int(pj, jl[0], G_BLOCK, "label_overlaps" as *u8), ctr) 216 gv_check_eq("T8b-live-self-grade-LM-reproduced" as *u8, critL[CL_C_LM], cr_json_int(pj, jl[0], G_BLOCK, "labels_over_marks" as *u8), ctr) 217 gv_check_eq("T8c-live-self-grade-OFF-reproduced" as *u8, critL[CL_C_OFF], cr_json_int(pj, jl[0], G_BLOCK, "off_canvas" as *u8), ctr) 218 gv_check_eq("T8d-live-self-grade-MM-reproduced" as *u8, critL[CL_C_MM], cr_json_int(pj, jl[0], G_BLOCK, "mark_overlaps" as *u8), ctr) 219 gv_check_eq("T8e-live-self-grade-spread-reproduced" as *u8, critL[CL_C_SPREAD], cr_json_int(pj, jl[0], G_BLOCK, "spread_permil" as *u8), ctr) 220 live_pub_defects = cr_json_int(pj, jl[0], G_BLOCK, "defects" as *u8) 221 if font_present == 1 { 222 let critLm: *i64 = g_grade(recL, namesL, nL, fhr, fhb) 223 live_metric_defects = critLm[CL_C_DEFECTS] 224 } 225 } 226 } } 227 gv_values_head() 228 gv_kv("font_present" as *u8, font_present) 229 gv_kv("nishi_heuristic_w_px" as *u8, G_TW_NISHI) 230 gv_kv("nishi_metric_w_px" as *u8, w_nishi) 231 gv_kv("marginalia_metric_w_px" as *u8, w_marg) 232 gv_kv("live_page_present" as *u8, live_present) 233 gv_kv("live_labels" as *u8, live_labels) 234 gv_kv("live_published_defects" as *u8, live_pub_defects) 235 gv_kv("live_metric_defects" as *u8, live_metric_defects) 236 return gv_verdict("nx_cdmap_referee_gate" as *u8, ctr, "the position map's second ruler: the SVG re-derivation, the real-font re-measurement and both critics, with the live page cross-checked when it is on disk" as *u8) 237}