nx_twincard_gate.nx source
↩ module page · 247 lines · 20355 B
1// nx_twincard_gate.nx -- the referee for nx_twincard_lib (aesthetictwin AT23, 2026-09-16). In-process, on fixtures built at
2// runtime under /tmp/twincard_gate/ (never the production schema, canon or a real card): a good card is accepted with its method
3// partition, coverage and completed left-right pairs exact, and a bad card is refused with every defect class counted and the
4// first offender named -- the group-label neg-control (an "ancestry" axis) is refused BY NAME, a face id not in the canon is
5// undeclared, a paired axis without a side and an unpaired axis with one are refused, a feature of unknown kind, unknown region
6// or outside its chart is refused, a signed value parses, a class word outside its declared set is refused. Values are printed
7// with gv_kv; the verdict line stays LAST.
8// license_tier: ORIGINAL No hw writes (Rule 26).
9import "nx_syscalls.nx"
10import "nx_gate_verdict.nx"
11import "nx_twincard_lib.nx"
12
13const TG_DIR: *u8 = "/tmp/twincard_gate"
14const TG_SCHEMA: *u8 = "/tmp/twincard_gate/twincard.axes"
15const TG_CANON: *u8 = "/tmp/twincard_gate/facecanon.conf"
16const TG_GOOD: *u8 = "/tmp/twincard_gate/good.card"
17const TG_BAD: *u8 = "/tmp/twincard_gate/bad.card"
18const TG_BAD2: *u8 = "/tmp/twincard_gate/bad2.card"
19const TG_BAD2_TEXT: *u8 = "card|gamma|Gamma Fixture|real|F|REVIEW|1\naxis|ident|ancestry|C|anything|observed|r1|2026-09-16\n"
20const TG_NEG20: i64 = 0 - 20
21const TG_SCHEMA_TEXT: *u8 = "axis|ident|stature|cm10|1200|2200|0|standing height\naxis|ident|sex|class|0|0|0|sex\nclass|ident|sex|F\nclass|ident|sex|M\nclass|ident|sex|X\naxis|skin|freckle_density|class|0|0|0|freckles\nclass|skin|freckle_density|none\nclass|skin|freckle_density|moderate\naxis|soft|areola_over_breast|permil|50|400|1|areola over breast base\naxis|eyes|canthal_tilt|deg10|-150|150|1|lateral canthus above medial is positive\nregion|face|the face chart\nregion|chest|the chest chart\nruler|soft|areola_over_breast|/tmp/twincard_gate/organ_present.nx|am_areola\nruler|face|*|/tmp/twincard_gate/organ_nosymbol.nx|pm_landmarks\nclass|shot|presentation|nude-art\nclass|shot|presentation|glamour\nclass|shot|makeup|none\nclass|shot|makeup|full\nclass|shot|hair_state|natural\nclass|shot|hair_state|styled\nclass|shot|retouch|raw\nclass|shot|retouch|unknown\n"
22const TG_CANON_TEXT: *u8 = "canon|facial_index|bizygomatic|trichion-menton|744|0|0|A|permil|BRIEF|BRIEF\ncanon|vthird_upper|trichion-glabella|trichion-menton|333|0|0|A|permil|BRIEF|BRIEF\n"
23const TG_GOOD_TEXT: *u8 = "card|alpha|Alpha Fixture|real|F|REVIEW|1\nref|r1|knowledge/fetched/fx.jpg|0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef|REVIEW|mirrored\nref|r2|-|-|REVIEW|unmirrored paste\nshot|r1|2019-05|22|seated|neutral|dappled|wicker|eye-level|necklace|nude-art|none|natural|raw\nshot|r2|-|-|standing|smile|soft|studio|eye-level|-|glamour|full|styled|unknown\naxis|ident|stature|C|1680|measured|r1|2026-09-16\naxis|ident|sex|C|F|declared|operator|2026-09-16\naxis|skin|freckle_density|C|moderate|observed|r2|2026-09-16\naxis|soft|areola_over_breast|L|180|observed|r2|2026-09-16\naxis|soft|areola_over_breast|R|172|observed|r2|2026-09-16\naxis|eyes|canthal_tilt|L|-20|measured|r1|2026-09-16\naxis|face|facial_index|C|744|measured|r1|2026-09-16\nfeature|freckle|L|face|412|388|120|620|180|210|observed|r2\nfeature|mole|C|chest|500|300|450|350|150|120|measured|r1\n"
24const TG_BAD_TEXT: *u8 = "card|beta|Beta Fixture|human|F|REVIEW|1\naxis|ident|ancestry|C|anything|observed|r1|2026-09-16\naxis|face|golden_ratio|C|618|measured|r1|2026-09-16\naxis|ident|stature|C|3000|measured|r1|2026-09-16\naxis|ident|stature|C|1700|measured|r1|2026-09-16\naxis|skin|freckle_density|C|lots|observed|r1|2026-09-16\naxis|eyes|canthal_tilt|L|10|guessed|r1|2026-09-16\naxis|soft|areola_over_breast|C|200|observed|r1|2026-09-16\naxis|ident|stature|L|1650|measured|r1|2026-09-16\nref|r1|-|abc|REVIEW|bad sha\nshot|r9|-|-|-|-|-|-|-|-|nude-art|none|natural|raw\nshot|r1|-|-|-|-|-|-|-|-|beach|none|natural|raw\nfeature|wart|L|face|10|10|10|500|0|0|observed|r1\nfeature|freckle|L|nowhere|10|10|10|500|0|0|observed|r1\nfeature|freckle|L|face|2000|10|10|500|0|0|observed|r1\n"
25const TG_GOOD_AXES: i64 = 7
26const TG_GOOD_MEASURED: i64 = 3
27const TG_GOOD_OBSERVED: i64 = 3
28const TG_GOOD_DECLARED: i64 = 1
29const TG_GOOD_REFS: i64 = 2
30const TG_GOOD_SHOTS: i64 = 2
31const TG_GOOD_FEATURES: i64 = 2
32const TG_SCHEMA_SECTIONS: i64 = 4
33const TG_FACE_DECLARED: i64 = 2
34const TG_SOFT_DECLARED: i64 = 2
35const TG_EYES_DECLARED: i64 = 2
36const TG_TOTAL_DECLARED: i64 = 9
37const TG_TOTAL_FILLED: i64 = 7
38const TG_PAIRS_DECLARED: i64 = 2
39const TG_HALF: i64 = 500
40const TG_BAD_DEFECTS: i64 = 15
41const TG_BAD_SHOTS: i64 = 2
42const TG_COV_AXES: i64 = 7
43const TG_COV_RULED: i64 = 3
44const TG_COV_UNRULED: i64 = 4
45const TG_BAD_UNDECLARED: i64 = 2
46const TG_BAD_SIDE: i64 = 2
47const TG_BAD_FEATURES: i64 = 3
48const TG_BAD_AXES: i64 = 8
49const TG_CENSUS_N: i64 = 4
50// the ruler census has its own fixture so every bucket is reached by construction: a planted organ that declares its symbol, a
51// planted organ that does not, and a path removed at setup. The first cut named real-looking runtime/ organs it assumed would never
52// exist, and went RED the day one of them (nx_photomark) was built -- a fixture that depends on what the tree holds measures the tree.
53const TG_CEN_SCHEMA: *u8 = "/tmp/twincard_gate/census.axes"
54const TG_ORGAN_PRESENT: *u8 = "/tmp/twincard_gate/organ_present.nx"
55const TG_ORGAN_NOSYMBOL: *u8 = "/tmp/twincard_gate/organ_nosymbol.nx"
56const TG_ORGAN_MISSING: *u8 = "/tmp/twincard_gate/organ_missing.nx"
57const TG_ORGAN_PRESENT_TEXT: *u8 = "func am_areola(x: i64) -> i64 {\n return x\n}\n"
58const TG_ORGAN_NOSYMBOL_TEXT: *u8 = "func tg_unrelated(x: i64) -> i64 {\n return x\n}\n"
59const TG_CEN_SCHEMA_TEXT: *u8 = "ruler|soft|areola_over_breast|/tmp/twincard_gate/organ_present.nx|am_areola\nruler|face|*|/tmp/twincard_gate/organ_nosymbol.nx|pm_landmarks\nruler|eyes|canthal_tilt|/tmp/twincard_gate/organ_missing.nx|ct_tilt\n"
60const TG_CEN_ROWS: i64 = 3
61const TG_CEN_ABSENT_AFTER: i64 = 2
62
63func tg_write(path: *u8, text: *u8) -> i64 {
64 let fd: i64 = sys_openat_wr(path, RI_MODE644)
65 if fd < 0 { return 0 - 1 }
66 let w: i64 = sys_write(fd, text, ri_slen(text))
67 sys_close(fd)
68 return w
69}
70
71func main(argc: i64, argv: *i64) -> i64 {
72 gv_head("nx_twincard_gate -- twin card: declared axes, canon face ids, sides, features, method partition, coverage, named refusals" as *u8)
73 let ctr: *i64 = gv_ctr()
74 sys_mkdir(TG_DIR, RI_MODE755)
75 gv_need("fixture-schema-written" as *u8, (tg_write(TG_SCHEMA, TG_SCHEMA_TEXT) > 0) as i64, ctr)
76 gv_need("fixture-canon-written" as *u8, (tg_write(TG_CANON, TG_CANON_TEXT) > 0) as i64, ctr)
77 gv_need("fixture-good-card-written" as *u8, (tg_write(TG_GOOD, TG_GOOD_TEXT) > 0) as i64, ctr)
78 gv_need("fixture-bad-card-written" as *u8, (tg_write(TG_BAD, TG_BAD_TEXT) > 0) as i64, ctr)
79 gv_need("fixture-census-schema-written" as *u8, (tg_write(TG_CEN_SCHEMA, TG_CEN_SCHEMA_TEXT) > 0) as i64, ctr)
80 gv_need("fixture-organ-declaring-the-symbol-written" as *u8, (tg_write(TG_ORGAN_PRESENT, TG_ORGAN_PRESENT_TEXT) > 0) as i64, ctr)
81 gv_need("fixture-organ-without-the-symbol-written" as *u8, (tg_write(TG_ORGAN_NOSYMBOL, TG_ORGAN_NOSYMBOL_TEXT) > 0) as i64, ctr)
82 sys_unlinkat(TG_ORGAN_MISSING)
83 let mfd: i64 = sys_openat_rd(TG_ORGAN_MISSING)
84 if mfd >= 0 { sys_close(mfd) }
85 gv_need("fixture-missing-organ-is-missing" as *u8, (mfd < 0) as i64, ctr)
86 let sl: *i64 = sys_mmap(RI_I64) as *i64
87 let schema: *u8 = ri_load(TG_SCHEMA, sl)
88 let kl: *i64 = sys_mmap(RI_I64) as *i64
89 let canon: *u8 = ri_load(TG_CANON, kl)
90 let gl: *i64 = sys_mmap(RI_I64) as *i64
91 let good: *u8 = ri_load(TG_GOOD, gl)
92 let bl: *i64 = sys_mmap(RI_I64) as *i64
93 let bad: *u8 = ri_load(TG_BAD, bl)
94 let sn: i64 = sl[0]
95 let kn: i64 = kl[0]
96 let gn: i64 = gl[0]
97 let bn: i64 = bl[0]
98 gv_check("fixtures-reached-the-condition-readable" as *u8, ((sn > 0) as i64) * ((kn > 0) as i64) * ((gn > 0) as i64) * ((bn > 0) as i64), ctr)
99 // the good card
100 let rep: *i64 = sys_mmap(TC_R_N * RI_I64) as *i64
101 let first: *u8 = sys_mmap(RI_ROWB)
102 let gdef: i64 = tc_validate(good, gn, schema, sn, canon, kn, rep, first)
103 gv_check_eq("good-card-defects" as *u8, gdef, 0, ctr)
104 gv_check_eq("good-card-header" as *u8, rep[TC_R_HEADER], 1, ctr)
105 gv_check_eq("good-card-axes" as *u8, rep[TC_R_AXES], TG_GOOD_AXES, ctr)
106 gv_check_eq("good-card-valid-equals-axes" as *u8, rep[TC_R_VALID], TG_GOOD_AXES, ctr)
107 let msum: i64 = rep[TC_R_MEASURED] + rep[TC_R_OBSERVED] + rep[TC_R_DECLARED] + rep[TC_R_GENERATED]
108 gv_check_eq("good-card-method-partition-sums-to-valid" as *u8, msum, rep[TC_R_VALID], ctr)
109 gv_check_eq("good-card-measured" as *u8, rep[TC_R_MEASURED], TG_GOOD_MEASURED, ctr)
110 gv_check_eq("good-card-observed" as *u8, rep[TC_R_OBSERVED], TG_GOOD_OBSERVED, ctr)
111 gv_check_eq("good-card-declared" as *u8, rep[TC_R_DECLARED], TG_GOOD_DECLARED, ctr)
112 gv_check_eq("good-card-generated" as *u8, rep[TC_R_GENERATED], 0, ctr)
113 gv_check_eq("good-card-side-defects" as *u8, rep[TC_R_SIDE], 0, ctr)
114 gv_check_eq("good-card-refs" as *u8, rep[TC_R_REFS], TG_GOOD_REFS, ctr)
115 gv_check_eq("good-card-badref" as *u8, rep[TC_R_BADREF], 0, ctr)
116 gv_check_eq("good-card-shots" as *u8, rep[TC_R_SHOTS], TG_GOOD_SHOTS, ctr)
117 gv_check_eq("good-card-badshot" as *u8, rep[TC_R_BADSHOT], 0, ctr)
118 gv_check_eq("good-card-features" as *u8, rep[TC_R_FEATURES], TG_GOOD_FEATURES, ctr)
119 gv_check_eq("good-card-badfeature" as *u8, rep[TC_R_BADFEATURE], 0, ctr)
120 gv_check("good-card-first-offender-empty" as *u8, (first[0] == (0 as u8)) as i64, ctr)
121 let pairs: *i64 = sys_mmap(RI_I64) as *i64
122 let done: i64 = tc_pairs_complete(good, gn, schema, sn, pairs)
123 gv_check_eq("pairs-declared-2" as *u8, pairs[0], TG_PAIRS_DECLARED, ctr)
124 gv_check_eq("pairs-complete-1-areola-both-sides-canthal-left-only" as *u8, done, 1, ctr)
125 // the helpers the validator rests on
126 gv_check_eq("signed-value-parses" as *u8, tc_atoi_signed("-20" as *u8), TG_NEG20, ctr)
127 gv_check("class-word-declared-accepted" as *u8, tc_class_ok(schema, sn, "skin" as *u8, "freckle_density" as *u8, "moderate" as *u8), ctr)
128 gv_check("neg-control-class-word-undeclared-refused" as *u8, (tc_class_ok(schema, sn, "skin" as *u8, "freckle_density" as *u8, "lots" as *u8) == 0) as i64, ctr)
129 let pos: *i64 = sys_mmap(TC_POS_N * RI_I64) as *i64
130 gv_check("face-axis-is-a-canon-id" as *u8, tc_axis_declared(schema, sn, canon, kn, "face" as *u8, "facial_index" as *u8, pos), ctr)
131 gv_check("neg-control-face-id-outside-canon-undeclared" as *u8, (tc_axis_declared(schema, sn, canon, kn, "face" as *u8, "golden_ratio" as *u8, pos) == 0) as i64, ctr)
132 gv_check("neg-control-group-label-is-not-an-axis" as *u8, (tc_axis_declared(schema, sn, canon, kn, "ident" as *u8, "ancestry" as *u8, pos) == 0) as i64, ctr)
133 gv_check("paired-axis-read-from-schema" as *u8, tc_paired(schema, sn, "soft" as *u8, "areola_over_breast" as *u8), ctr)
134 gv_check("neg-control-unpaired-axis-reads-0" as *u8, (tc_paired(schema, sn, "ident" as *u8, "stature" as *u8) == 0) as i64, ctr)
135 gv_check("side-paired-accepts-L" as *u8, tc_side_ok("soft" as *u8, 1, "L" as *u8), ctr)
136 gv_check("neg-control-side-paired-refuses-C" as *u8, (tc_side_ok("soft" as *u8, 1, "C" as *u8) == 0) as i64, ctr)
137 gv_check("neg-control-side-unpaired-refuses-R" as *u8, (tc_side_ok("ident" as *u8, 0, "R" as *u8) == 0) as i64, ctr)
138 gv_check("side-face-accepts-any" as *u8, tc_side_ok("face" as *u8, 0, "L" as *u8), ctr)
139 gv_check("region-declared" as *u8, tc_region_ok(schema, sn, "chest" as *u8), ctr)
140 gv_check("neg-control-region-undeclared" as *u8, (tc_region_ok(schema, sn, "nowhere" as *u8) == 0) as i64, ctr)
141 let organ: *u8 = sys_mmap(RI_PATHB)
142 let symbol: *u8 = sys_mmap(RI_PATHB)
143 gv_check_eq("ruler-exact-row-found" as *u8, tc_ruler_for(schema, sn, "soft" as *u8, "areola_over_breast" as *u8, organ, symbol), TC_RULER_EXACT, ctr)
144 gv_check("ruler-exact-symbol-copied" as *u8, ri_streq(symbol, "am_areola" as *u8), ctr)
145 gv_check_eq("ruler-wildcard-row-found-for-face" as *u8, tc_ruler_for(schema, sn, "face" as *u8, "facial_index" as *u8, organ, symbol), TC_RULER_WILDCARD, ctr)
146 gv_check_eq("neg-control-ruler-none" as *u8, tc_ruler_for(schema, sn, "ident" as *u8, "stature" as *u8, organ, symbol), TC_RULER_NONE, ctr)
147 // the ruler census on its own fixture: one bucket per row, each reached by construction
148 let cl: *i64 = sys_mmap(RI_I64) as *i64
149 let cschema: *u8 = ri_load(TG_CEN_SCHEMA, cl)
150 let cen: *i64 = sys_mmap(TG_CENSUS_N * RI_I64) as *i64
151 let crows: i64 = tc_ruler_census(cschema, cl[0], cen)
152 gv_check_eq("ruler-census-rows-3" as *u8, crows, TG_CEN_ROWS, ctr)
153 gv_check_eq("ruler-census-present-1-planted-organ-declares-the-symbol" as *u8, cen[TC_C_PRESENT], 1, ctr)
154 gv_check_eq("ruler-census-absent-1-planted-organ-lacks-the-symbol" as *u8, cen[TC_C_ABSENT], 1, ctr)
155 gv_check_eq("ruler-census-unjudged-1-organ-file-missing-named-not-invented" as *u8, cen[TC_C_UNJUDGED], 1, ctr)
156 gv_check_eq("ruler-census-partition-sums" as *u8, cen[TC_C_PRESENT] + cen[TC_C_ABSENT] + cen[TC_C_UNJUDGED], crows, ctr)
157 // the census reads the organ, not a constant: strip the symbol from the planted organ and the same row moves present -> absent
158 gv_need("fixture-planted-symbol-removed" as *u8, (tg_write(TG_ORGAN_PRESENT, TG_ORGAN_NOSYMBOL_TEXT) > 0) as i64, ctr)
159 let cen2: *i64 = sys_mmap(TG_CENSUS_N * RI_I64) as *i64
160 tc_ruler_census(cschema, cl[0], cen2)
161 gv_check_eq("neg-control-census-follows-the-file-present-0-after-the-symbol-is-removed" as *u8, cen2[TC_C_PRESENT], 0, ctr)
162 gv_check_eq("neg-control-census-follows-the-file-absent-2-after-the-symbol-is-removed" as *u8, cen2[TC_C_ABSENT], TG_CEN_ABSENT_AFTER, ctr)
163 // sections and coverage
164 let list: *u8 = sys_mmap(TC_LISTB)
165 let sections: i64 = tc_sections(schema, sn, list, TC_LISTB)
166 gv_check_eq("schema-sections-distinct" as *u8, sections, TG_SCHEMA_SECTIONS, ctr)
167 gv_check("schema-first-section-ident" as *u8, ri_streq(tc_list_at(list, 0), "ident" as *u8), ctr)
168 let ident_d: i64 = tc_declared_count(schema, sn, canon, kn, "ident" as *u8)
169 let ident_f: i64 = tc_filled_count(good, gn, schema, sn, canon, kn, "ident" as *u8)
170 gv_check_eq("coverage-ident-declared-2" as *u8, ident_d, 2, ctr)
171 gv_check_eq("coverage-ident-filled-2" as *u8, ident_f, 2, ctr)
172 let soft_d: i64 = tc_declared_count(schema, sn, canon, kn, "soft" as *u8)
173 let soft_f: i64 = tc_filled_count(good, gn, schema, sn, canon, kn, "soft" as *u8)
174 gv_check_eq("coverage-paired-axis-declares-two-values" as *u8, soft_d, TG_SOFT_DECLARED, ctr)
175 gv_check_eq("coverage-paired-axis-both-sides-filled" as *u8, soft_f, TG_SOFT_DECLARED, ctr)
176 let eyes_d: i64 = tc_declared_count(schema, sn, canon, kn, "eyes" as *u8)
177 let eyes_f: i64 = tc_filled_count(good, gn, schema, sn, canon, kn, "eyes" as *u8)
178 gv_check_eq("coverage-eyes-declared-2" as *u8, eyes_d, TG_EYES_DECLARED, ctr)
179 gv_check_eq("coverage-eyes-filled-1-left-only" as *u8, eyes_f, 1, ctr)
180 let face_d: i64 = tc_declared_count(schema, sn, canon, kn, "face" as *u8)
181 let face_f: i64 = tc_filled_count(good, gn, schema, sn, canon, kn, "face" as *u8)
182 gv_check_eq("coverage-face-declared-from-canon" as *u8, face_d, TG_FACE_DECLARED, ctr)
183 gv_check_eq("coverage-face-filled-1" as *u8, face_f, 1, ctr)
184 gv_check_eq("coverage-face-permil-500" as *u8, tc_permil(face_f, face_d), TG_HALF, ctr)
185 gv_check_eq("permil-of-zero-denominator-is-0-not-a-crash" as *u8, tc_permil(1, 0), 0, ctr)
186 let skin_d: i64 = tc_declared_count(schema, sn, canon, kn, "skin" as *u8)
187 let skin_f: i64 = tc_filled_count(good, gn, schema, sn, canon, kn, "skin" as *u8)
188 gv_check_eq("coverage-total-declared-9" as *u8, ident_d + skin_d + soft_d + eyes_d + face_d, TG_TOTAL_DECLARED, ctr)
189 gv_check_eq("coverage-total-filled-7" as *u8, ident_f + skin_f + soft_f + eyes_f + face_f, TG_TOTAL_FILLED, ctr)
190 // the bad card: every defect class counted, the first offender named
191 let brep: *i64 = sys_mmap(TC_R_N * RI_I64) as *i64
192 let bfirst: *u8 = sys_mmap(RI_ROWB)
193 let bdef: i64 = tc_validate(bad, bn, schema, sn, canon, kn, brep, bfirst)
194 gv_check_eq("bad-card-defects" as *u8, bdef, TG_BAD_DEFECTS, ctr)
195 gv_check_eq("bad-card-header-refused" as *u8, brep[TC_R_HEADER], 0, ctr)
196 gv_check_eq("bad-card-undeclared-2-group-label-and-non-canon-face" as *u8, brep[TC_R_UNDECLARED], TG_BAD_UNDECLARED, ctr)
197 gv_check("bad-card-first-offender-is-the-header-in-file-order" as *u8, ri_streq(bfirst, "card/header" as *u8), ctr)
198 // a second bad card whose header is sound, so the group label is the first offender and is named BY NAME
199 gv_need("fixture-bad2-card-written" as *u8, (tg_write(TG_BAD2, TG_BAD2_TEXT) > 0) as i64, ctr)
200 let b2l: *i64 = sys_mmap(RI_I64) as *i64
201 let bad2: *u8 = ri_load(TG_BAD2, b2l)
202 let b2rep: *i64 = sys_mmap(TC_R_N * RI_I64) as *i64
203 let b2first: *u8 = sys_mmap(RI_ROWB)
204 let b2def: i64 = tc_validate(bad2, b2l[0], schema, sn, canon, kn, b2rep, b2first)
205 gv_check_eq("bad2-card-defects-1" as *u8, b2def, 1, ctr)
206 gv_check_eq("bad2-card-undeclared-1" as *u8, b2rep[TC_R_UNDECLARED], 1, ctr)
207 gv_check("neg-control-group-label-refused-by-name-ident-ancestry" as *u8, ri_streq(b2first, "ident/ancestry" as *u8), ctr)
208 gv_check_eq("bad-card-range-1" as *u8, brep[TC_R_RANGE], 1, ctr)
209 gv_check_eq("bad-card-dup-1" as *u8, brep[TC_R_DUP], 1, ctr)
210 gv_check_eq("bad-card-classword-1" as *u8, brep[TC_R_CLASSWORD], 1, ctr)
211 gv_check_eq("bad-card-method-1" as *u8, brep[TC_R_METHOD], 1, ctr)
212 gv_check_eq("bad-card-side-2-paired-without-side-and-unpaired-with-one" as *u8, brep[TC_R_SIDE], TG_BAD_SIDE, ctr)
213 gv_check_eq("bad-card-badref-1" as *u8, brep[TC_R_BADREF], 1, ctr)
214 gv_check_eq("bad-card-badshot-2-unknown-ref-and-undeclared-presentation-word" as *u8, brep[TC_R_BADSHOT], TG_BAD_SHOTS, ctr)
215 // ruler coverage over the fixture schema: soft is ruled exactly, face through its wildcard, the other four axes are not
216 let cov: *i64 = sys_mmap(TG_CENSUS_N * RI_I64) as *i64
217 tc_ruler_coverage(schema, sn, canon, kn, 0, cov)
218 gv_check_eq("ruler-coverage-axes-7-schema-5-plus-canon-2" as *u8, cov[0], TG_COV_AXES, ctr)
219 gv_check_eq("ruler-coverage-ruled-3-exact-soft-and-wildcard-face" as *u8, cov[1], TG_COV_RULED, ctr)
220 gv_check_eq("ruler-coverage-unruled-4-named-by-the-cli-worklist" as *u8, cov[2], TG_COV_UNRULED, ctr)
221 gv_check_eq("ruler-coverage-partition-sums" as *u8, cov[1] + cov[2], cov[0], ctr)
222 gv_check_eq("bad-card-badfeature-3-kind-region-chart" as *u8, brep[TC_R_BADFEATURE], TG_BAD_FEATURES, ctr)
223 gv_check_eq("bad-card-axes-seen" as *u8, brep[TC_R_AXES], TG_BAD_AXES, ctr)
224 gv_check_eq("bad-card-valid-0" as *u8, brep[TC_R_VALID], 0, ctr)
225 gv_values_head()
226 gv_kv("good_defects" as *u8, gdef)
227 gv_kv("good_valid" as *u8, rep[TC_R_VALID])
228 gv_kv("good_measured" as *u8, rep[TC_R_MEASURED])
229 gv_kv("good_observed" as *u8, rep[TC_R_OBSERVED])
230 gv_kv("good_declared" as *u8, rep[TC_R_DECLARED])
231 gv_kv("good_features" as *u8, rep[TC_R_FEATURES])
232 gv_kv("pairs_declared" as *u8, pairs[0])
233 gv_kv("pairs_complete" as *u8, done)
234 gv_kv("schema_sections" as *u8, sections)
235 gv_kv("face_declared" as *u8, face_d)
236 gv_kv("total_declared" as *u8, ident_d + skin_d + soft_d + eyes_d + face_d)
237 gv_kv("bad_defects" as *u8, bdef)
238 gv_kv("bad_undeclared" as *u8, brep[TC_R_UNDECLARED])
239 gv_kv("bad_side" as *u8, brep[TC_R_SIDE])
240 gv_kv("bad_features" as *u8, brep[TC_R_BADFEATURE])
241 gv_kv("census_rows" as *u8, crows)
242 gv_kv("census_present" as *u8, cen[TC_C_PRESENT])
243 gv_kv("census_absent" as *u8, cen[TC_C_ABSENT])
244 gv_kv("census_unjudged" as *u8, cen[TC_C_UNJUDGED])
245 gv_kv("census_absent_after_strip" as *u8, cen2[TC_C_ABSENT])
246 return gv_verdict("nx_twincard_gate" as *u8, ctr, "a good card accepted with its method partition, coverage and completed pairs exact, a bad card refused with every defect class counted and the first offender named, on runtime fixtures under /tmp/twincard_gate" as *u8)
247}