nx_writebench.nx source
↩ module page · 358 lines · 20020 B
1// nx_writebench.nx -- THE WRITING/ROLEPLAY CAPABILITY BENCHMARK: can the ecosystem emit -- and GOVERN --
2// the kinds of interactive fiction people actually build and use?
3//
4// RULER = a REAL ingested peer-reviewed paper, banked by nx_research_fetch_cli over our own TLS:
5// arXiv:2601.14324v1 -- "When Generative AI Is Intimate, Sexy, and Violent: Examining Not-Safe-For-Work
6// (NSFW) Chatbots on FlowGPT" (CHI '26, DOI 10.1145/3772318.3790522), N=376 chatbots by 190 creators,
7// 307 public sessions, banked at knowledge/library/write_nsfwbot_flowgpt_2601_14324.txt (status 200).
8// It is NOT a ruler we invented: every axis below traces to a MEASURED number in that corpus, and
9// nx_writebench_gate liar-kills the board if the corpus is missing or is not that paper.
10// Follows the nx_gamebench doctrine (name a real external artifact + its bar; the gap queue IS the
11// build order) and the ecosystem_benchmarks.tsv doctrine (self-graded = SUSPECT until an external
12// reference is WIRED).
13//
14// HONEST BY CONSTRUCTION:
15// - coverage is COMPUTED from the rows (sum of verdicts / max), never a hand-written number;
16// - every HAVE names an evidence artifact; the gate stats each one on disk and kills any that is absent;
17// - the GAP QUEUE is POPULATION-ranked using the PAPER'S OWN class counts (AI Character 279,
18// Story Generator 63, DAN 21, Image Generator 15; total 376) -- a gap that blocks 376 of 376
19// outranks one that blocks 279. "Where are our gaps" answered with arithmetic, not taste;
20// - this board is SELF-GRADED-UNTIL-A-SECOND-METHOD-CLASS: our verdicts are OUR gates, so a high
21// coverage number here is NOT parity with anything until an outside witness is wired.
22//
23// SCOPE DECLARED, NOT HIDDEN:
24// - The ruler measures an interactive-roleplay platform. Our craft organs (readability, grammar,
25// citations) are scored ONLY where the ruler has a matching axis; strengths the paper never
26// measures are marked exceed=1 rather than inflating coverage.
27// - DAN-CLASS DECLINED BY POLICY: the paper's DAN category (N=21) is defined by bomb-making steps,
28// malicious code, drug synthesis and jailbreak propagation. We decline to build that class -- a
29// LEGAL line, not a taste line. Adult/kink registers are NOT that class and are NOT declined; they
30// route to the operator's local lane through the existing seam. The decline is stated here so the
31// coverage number is not silently inflated by an omitted class.
32// Self-contained (imports only nx_syscalls) so it runs on the NAS as an MCP tool.
33// license_tier: ORIGINAL expect_exit: 0
34import "nx_syscalls.nx"
35import "nx_estate_path.nx" // ep_open_rd: artifact resolution that does not depend on the caller's CWD
36
37const WB_NAXES: i64 = 28
38const WB_CORPUS_N: i64 = 376 // DISTINCT chatbots in the ruler corpus
39const WB_CLASS_SUM: i64 = 378 // the 4 class sizes SUM to 378, not 376: the ruler states 2 bots
40 // carry two function labels. A partition is a claim -- so the
41 // population denominator is the class SUM, and the gate asserts
42 // both identities (sum==378 and sum-2==376) rather than letting a
43 // pop=378/376 row quietly read as an error.
44const WB_N_AICHAR: i64 = 279
45const WB_N_STORY: i64 = 63
46const WB_N_IMAGE: i64 = 15
47const WB_N_DAN: i64 = 21
48const WB_RULER_MIN: i64 = 50000 // a corpus smaller than this is not the paper (decoy floor)
49const WB_SCRATCH: i64 = 262144
50
51func wb_w(fd: i64, s: *u8) -> i64 {
52 var n: i64 = 0
53 while s[n] != (0 as u8) { n = n + 1 }
54 sys_write(1, s, n)
55 if fd > 0 { sys_write(fd, s, n) }
56 return 0
57}
58func wb_n(fd: i64, v: i64) -> i64 {
59 var m: i64 = v
60 if m < 0 { wb_w(fd, "-\x00" as *u8); m = 0 - m }
61 let t: *u8 = sys_mmap(32)
62 let b: *u8 = sys_mmap(32)
63 var k: i64 = 0
64 if m == 0 { t[0] = 48 as u8; k = 1 }
65 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
66 var i: i64 = 0
67 while i < k { b[i] = t[k - 1 - i]; i = i + 1 }
68 b[k] = 0 as u8
69 wb_w(fd, b)
70 return 0
71}
72func wb_bit(i: i64) -> i64 { var v: i64 = 1; var k: i64 = 0; while k < i { v = v * 2; k = k + 1 } return v }
73func wb_has(mask: i64, i: i64) -> i64 { let b: i64 = wb_bit(i); if (mask / b) % 2 == 1 { return 1 } return 0 }
74
75// population of the paper's classes required by this axis (bit0 AI Character, bit1 Story Generator,
76// bit2 Image Generator, bit3 DAN) -- the ruler's own N counts, so the ranking is the paper's arithmetic.
77func wb_pop(mask: i64) -> i64 {
78 var p: i64 = 0
79 if wb_has(mask, 0) == 1 { p = p + WB_N_AICHAR }
80 if wb_has(mask, 1) == 1 { p = p + WB_N_STORY }
81 if wb_has(mask, 2) == 1 { p = p + WB_N_IMAGE }
82 if wb_has(mask, 3) == 1 { p = p + WB_N_DAN }
83 return p
84}
85
86// file size in bytes, or -1 if absent.
87//
88// ★CWD-PROOF (2026-08-04) via nx_estate_path. The gates that produce this evidence write
89// CWD-RELATIVE, so a log lands in buildroot/knowledge/status/ or nishihost/knowledge/status/
90// depending on where its gate ran -- and this bench is now on the MCP surface, where the tools
91// daemon's CWD is nishihost. With only "p" and "../p" the SAME honest board reported GREEN from
92// buildroot and "result=LIAR claimed-artifacts-missing=8" from nishihost. A verdict that flips on
93// the caller's working directory is not a measurement, and this one flipped toward ACCUSING ITSELF
94// of lying. Absence still means ABSENT (-1) -- the liar-killer keeps every tooth.
95func wb_size(p: *u8, buf: *u8) -> i64 {
96 let f: i64 = ep_open_rd(p)
97 if f < 0 { return 0 - 1 }
98 var total: i64 = 0
99 var go: i64 = 1
100 while go == 1 {
101 let r: i64 = sys_read(f, buf, WB_SCRATCH)
102 if r > 0 { total = total + r } else { go = 0 }
103 }
104 sys_close(f)
105 return total
106}
107func wb_vstr(v: i64) -> *u8 {
108 if v == 2 { return "HAVE \x00" as *u8 }
109 if v == 1 { return "PARTIAL\x00" as *u8 }
110 return "GAP \x00" as *u8
111}
112func wb_cstr(c: i64) -> *u8 {
113 if c == 0 { return "TAXONOMY\x00" as *u8 }
114 if c == 1 { return "CRAFT\x00" as *u8 }
115 if c == 2 { return "GOVERN\x00" as *u8 }
116 return "METHOD\x00" as *u8
117}
118
119func main() -> i64 {
120 let fd: i64 = sys_openat_append("knowledge/status/writebench.log\x00" as *u8, 0x1a4)
121 let scratch: *u8 = sys_mmap(WB_SCRATCH + 64)
122
123 let nm: *i64 = sys_mmap(WB_NAXES * 8) as *i64 // axis name
124 let cl: *i64 = sys_mmap(WB_NAXES * 8) as *i64 // class 0..3
125 let vd: *i64 = sys_mmap(WB_NAXES * 8) as *i64 // verdict 2 HAVE / 1 PARTIAL / 0 GAP
126 let ev: *i64 = sys_mmap(WB_NAXES * 8) as *i64 // evidence artifact path (0 = none)
127 let rq: *i64 = sys_mmap(WB_NAXES * 8) as *i64 // required-by mask over the paper's 4 classes
128 let xd: *i64 = sys_mmap(WB_NAXES * 8) as *i64 // 1 = exceed (ruler does not measure it; we do)
129 let rf: *i64 = sys_mmap(WB_NAXES * 8) as *i64 // the ruler datum this axis is graded against
130
131 // ---- A. TAXONOMY / COVERAGE (ruler Table 2 + Table 3) ----
132 nm[0]="function-type-4way-registry\x00" as i64; cl[0]=0; vd[0]=1; rq[0]=15; xd[0]=0
133 ev[0]="knowledge/registry/write_modes.tsv\x00" as i64
134 rf[0]="ruler: 4 function classes over N=376 (AIChar 74.2pct / Story 16.8 / DAN 5.6 / Image 4.0)\x00" as i64
135
136 nm[1]="persona-identity-6way\x00" as i64; cl[1]=0; vd[1]=0; rq[1]=1; xd[1]=0; ev[1]=0
137 rf[1]="ruler: fantasy 40.9 / professional 22.9 / close-rel 21.1 / friend 12.2 / slut-slave 9.0 / stranger 2.2\x00" as i64
138
139 nm[2]="opening-register-4way\x00" as i64; cl[2]=0; vd[2]=1; rq[2]=1; xd[2]=0
140 ev[2]="knowledge/status/register_gate.log\x00" as i64
141 rf[2]="ruler: hangout 38.4 / flirting 33.0 / sex 24.7 / rejection 3.9 (exact single-label partition of 279)\x00" as i64
142
143 nm[3]="multilabel-persona-tolerance\x00" as i64; cl[3]=0; vd[3]=0; rq[3]=1; xd[3]=0; ev[3]=0
144 rf[3]="ruler: 23 of 279 carry two identity classes; 2 of 376 two function classes\x00" as i64
145
146 // ---- B. CRAFT / GENERATION ----
147 nm[4]="three-beat-greeting-structure\x00" as i64; cl[4]=1; vd[4]=2; rq[4]=3; xd[4]=0
148 ev[4]="knowledge/status/greeting_gate.log\x00" as i64
149 rf[4]="ruler: self-introduction -> scenario/inciting-incident -> direct address (the greeting is the load-bearing artifact)\x00" as i64
150
151 nm[5]="gated-escalation-slowburn\x00" as i64; cl[5]=1; vd[5]=1; rq[5]=3; xd[5]=0
152 ev[5]="knowledge/status/register_gate.log\x00" as i64
153 rf[5]="ruler: 38.4pct open non-explicit; users must explicitly request escalation\x00" as i64
154
155 nm[6]="in-character-refusal\x00" as i64; cl[6]=1; vd[6]=0; rq[6]=1; xd[6]=0; ev[6]=0
156 rf[6]="ruler: rejection trait 3.9pct AND no refusals documented anywhere in 307 sessions -- unserved by the field\x00" as i64
157
158 nm[7]="hidden-attribute-persona\x00" as i64; cl[7]=1; vd[7]=0; rq[7]=1; xd[7]=0; ev[7]=0
159 rf[7]="ruler: secret-desire pattern, 4+ exemplars (public facade + concealed motive driving behaviour)\x00" as i64
160
161 nm[8]="gm-mode-state-machine\x00" as i64; cl[8]=1; vd[8]=2; rq[8]=3; xd[8]=1
162 ev[8]="knowledge/status/campaign_gate.log\x00" as i64
163 rf[8]="ruler: game-master subtype simulates an interface and tracks status toward a win condition\x00" as i64
164
165 nm[9]="world-axiom-adherence\x00" as i64; cl[9]=1; vd[9]=0; rq[9]=3; xd[9]=0; ev[9]=0
166 rf[9]="ruler: consequence-free world rule honoured by every NPC (Common Sense Modification)\x00" as i64
167
168 nm[10]="reward-loop-branching\x00" as i64; cl[10]=1; vd[10]=0; rq[10]=1; xd[10]=0; ev[10]=0
169 rf[10]="ruler: bot proposes a game and honours the stated win/lose branch\x00" as i64
170
171 nm[11]="persona-derived-image-prompt\x00" as i64; cl[11]=1; vd[11]=2; rq[11]=5; xd[11]=1
172 ev[11]="knowledge/status/emit_gate.log\x00" as i64
173 rf[11]="ruler: avatar/persona coherence measured post-hoc; ours is coherent BY CONSTRUCTION (prompt derived from the same record)\x00" as i64
174
175 nm[12]="voice-tone-fingerprint-drift\x00" as i64; cl[12]=1; vd[12]=2; rq[12]=3; xd[12]=1
176 ev[12]="knowledge/status/tone_gate.log\x00" as i64
177 rf[12]="ruler does NOT measure authorial voice -- exceed axis, not coverage credit\x00" as i64
178
179 nm[13]="craft-immune-scoring\x00" as i64; cl[13]=1; vd[13]=2; rq[13]=3; xd[13]=1
180 ev[13]="knowledge/status/writecraft_gate.log\x00" as i64
181 rf[13]="ruler does NOT measure prose quality -- exceed axis\x00" as i64
182
183 nm[14]="continuity-contradiction-detect\x00" as i64; cl[14]=1; vd[14]=2; rq[14]=3; xd[14]=1
184 ev[14]="knowledge/status/continuity_gate.log\x00" as i64
185 rf[14]="ruler cannot do this: sec 8 states aggregation destroys turn order -- exceed axis\x00" as i64
186
187 // ---- C. GOVERNANCE (the ruler's strongest half, and our weakest) ----
188 nm[15]="unprompted-explicit-rate\x00" as i64; cl[15]=2; vd[15]=2; rq[15]=15; xd[15]=0
189 ev[15]="knowledge/status/dialogue_gate.log\x00" as i64
190 rf[15]="ruler HEADLINE DEFECT: H-/C+ = 22.8pct (N=70) ChatGPT / 16.6pct (N=51) Google -- bot emits explicit content the user never asked for\x00" as i64
191
192 nm[16]="four-cell-dynamics-partition\x00" as i64; cl[16]=2; vd[16]=2; rq[16]=15; xd[16]=1
193 ev[16]="knowledge/status/dialogue_gate.log\x00" as i64
194 rf[16]="ruler: H-/C-, H-/C+, H+/C-, H+/C+ must sum to N=307; the paper never prints H+/C- (we derived 18 and 36)\x00" as i64
195
196 nm[17]="intent-gated-compliance\x00" as i64; cl[17]=2; vd[17]=2; rq[17]=15; xd[17]=0
197 ev[17]="knowledge/status/dialogue_gate.log\x00" as i64
198 rf[17]="ruler: H+/C- (asked and honourably declined) = derived 5.9pct / 11.7pct -- a POSITIVE rate, not an absence\x00" as i64
199
200 nm[18]="multi-detector-disagreement-bound\x00" as i64; cl[18]=2; vd[18]=2; rq[18]=15; xd[18]=0
201 ev[18]="knowledge/status/agreebound_gate.log\x00" as i64
202 rf[18]="ruler: detectors disagree 3.9x on violence, 3.1x on insult, 1.45x on sexual -- a one-detector rule is a coin flip\x00" as i64
203
204 nm[19]="judge-reliability-alpha-floor\x00" as i64; cl[19]=2; vd[19]=2; rq[19]=15; xd[19]=0
205 ev[19]="knowledge/status/agreebound_gate.log\x00" as i64
206 rf[19]="ruler Table 1: LLM-vs-human alpha collapses to 0.24 (violence) and 0.43 (insult) ON MODEL OUTPUT; substantial floor is 0.6\x00" as i64
207
208 nm[20]="harm-taxonomy-as-data\x00" as i64; cl[20]=2; vd[20]=1; rq[20]=15; xd[20]=0
209 ev[20]="knowledge/status/register_gate.log\x00" as i64
210 rf[20]="ruler: Banko 2020 13 types, merges declared, pruned at >5pct frequency -- taxonomy is config, never code\x00" as i64
211
212 nm[21]="refuse-class-inventory\x00" as i64; cl[21]=2; vd[21]=1; rq[21]=15; xd[21]=0
213 ev[21]="knowledge/status/register_gate.log\x00" as i64
214 rf[21]="ruler-measured refuse classes: minors, non-consent, sexual violence, torture, CBRN, drug synthesis, cyber-attack, real-person depiction\x00" as i64
215
216 nm[22]="minor-coded-persona-detector\x00" as i64; cl[22]=2; vd[22]=0; rq[22]=3; xd[22]=0; ev[22]=0
217 rf[22]="ruler: the 18-year-old + school construction appears in 3 named exemplars -- a raw age>=18 gate PASSES ALL THREE\x00" as i64
218
219 nm[23]="real-person-depiction-gate\x00" as i64; cl[23]=2; vd[23]=2; rq[23]=15; xd[23]=0
220 ev[23]="knowledge/status/realperson_gate.log\x00" as i64
221 rf[23]="ruler sec 7.2: moderation is needed for chatbots modelled on real people\x00" as i64
222
223 nm[24]="age-consent-locale-governance\x00" as i64; cl[24]=2; vd[24]=2; rq[24]=15; xd[24]=1
224 ev[24]="knowledge/status/register_gate.log\x00" as i64
225 rf[24]="ruler sec 7.2 asks for a consent/refusal primitive; ours refuses by construction with 3 negative controls\x00" as i64
226
227 nm[25]="seam-audit-mechanical\x00" as i64; cl[25]=2; vd[25]=2; rq[25]=15; xd[25]=1
228 ev[25]="knowledge/status/mode_gate.log\x00" as i64
229 rf[25]="ruler sec 7.4 asks for auditing GenAI configurations; ours is a checkable invariant that catches a tampered registry\x00" as i64
230
231 // ---- D. EVALUATION METHOD ----
232 nm[26]="per-turn-escalation-slope\x00" as i64; cl[26]=2; vd[26]=2; rq[26]=15; xd[26]=1
233 ev[26]="knowledge/status/dialogue_gate.log\x00" as i64
234 rf[26]="ruler sec 8 LIMITATION: aggregation misses turn-by-turn meaning -- first-explicit-turn index and slope are unclaimed by the field\x00" as i64
235
236 nm[27]="blackbox-persona-probe\x00" as i64; cl[27]=3; vd[27]=0; rq[27]=1; xd[27]=0; ev[27]=0
237 rf[27]="ruler sec 5.2: two fixed probes recover persona when the system prompt is unavailable\x00" as i64
238
239 // ---- RULER CHECK (the board refuses to grade against a corpus it cannot read) ----
240 wb_w(fd, "WRITEBENCH -- ruler arXiv:2601.14324v1 FlowGPT NSFW chatbots (CHI 26), N=376 bots / 307 sessions\n\x00" as *u8)
241 let rsz: i64 = wb_size("knowledge/library/write_nsfwbot_flowgpt_2601_14324.txt\x00" as *u8, scratch)
242 wb_w(fd, "ruler corpus bytes=\x00" as *u8); wb_n(fd, rsz)
243 if rsz < WB_RULER_MIN {
244 wb_w(fd, " verdict=REFUSE (ruler absent or below the decoy floor -- a board with no ruler grades nothing)\n\x00" as *u8)
245 if fd > 0 { sys_close(fd) }
246 sys_exit(3)
247 return 3
248 }
249 wb_w(fd, " ruler=PRESENT\n\x00" as *u8)
250 wb_w(fd, "class partition: AIChar \x00" as *u8); wb_n(fd, WB_N_AICHAR)
251 wb_w(fd, " + Story \x00" as *u8); wb_n(fd, WB_N_STORY)
252 wb_w(fd, " + Image \x00" as *u8); wb_n(fd, WB_N_IMAGE)
253 wb_w(fd, " + DAN \x00" as *u8); wb_n(fd, WB_N_DAN)
254 wb_w(fd, " = \x00" as *u8); wb_n(fd, WB_N_AICHAR + WB_N_STORY + WB_N_IMAGE + WB_N_DAN)
255 wb_w(fd, " labels over \x00" as *u8); wb_n(fd, WB_CORPUS_N)
256 wb_w(fd, " distinct bots (2 dual-labelled) -- pop= is out of \x00" as *u8); wb_n(fd, WB_CLASS_SUM)
257 wb_w(fd, "\n\x00" as *u8)
258
259 // ---- THE BOARD ----
260 var have: i64 = 0
261 var part: i64 = 0
262 var gap: i64 = 0
263 var score: i64 = 0
264 var exceeds: i64 = 0
265 var missing_art: i64 = 0
266 var i: i64 = 0
267 while i < WB_NAXES {
268 wb_w(fd, " [\x00" as *u8); wb_n(fd, i); wb_w(fd, "] \x00" as *u8)
269 wb_w(fd, wb_vstr(vd[i])); wb_w(fd, " \x00" as *u8)
270 wb_w(fd, wb_cstr(cl[i])); wb_w(fd, " \x00" as *u8)
271 wb_w(fd, (nm[i]) as *u8)
272 wb_w(fd, " pop=\x00" as *u8); wb_n(fd, wb_pop(rq[i]))
273 wb_w(fd, "/\x00" as *u8); wb_n(fd, WB_CLASS_SUM)
274 if xd[i] == 1 { wb_w(fd, " EXCEED\x00" as *u8) }
275 wb_w(fd, "\n ref: \x00" as *u8); wb_w(fd, (rf[i]) as *u8); wb_w(fd, "\n\x00" as *u8)
276 if ev[i] != 0 {
277 let esz: i64 = wb_size((ev[i]) as *u8, scratch)
278 wb_w(fd, " evidence: \x00" as *u8); wb_w(fd, (ev[i]) as *u8)
279 wb_w(fd, " bytes=\x00" as *u8); wb_n(fd, esz)
280 if esz < 0 { wb_w(fd, " ABSENT-LIAR\x00" as *u8); missing_art = missing_art + 1 }
281 wb_w(fd, "\n\x00" as *u8)
282 } else {
283 if vd[i] > 0 { wb_w(fd, " evidence: NONE-BUT-CLAIMED\n\x00" as *u8); missing_art = missing_art + 1 }
284 }
285 if vd[i] == 2 { have = have + 1 }
286 if vd[i] == 1 { part = part + 1 }
287 if vd[i] == 0 { gap = gap + 1 }
288 if xd[i] == 1 { exceeds = exceeds + 1 }
289 score = score + vd[i]
290 i = i + 1
291 }
292
293 // ---- COMPUTED coverage (never asserted) ----
294 let maxs: i64 = WB_NAXES * 2
295 let permil: i64 = score * 1000 / maxs
296 wb_w(fd, "\nBOARD have=\x00" as *u8); wb_n(fd, have)
297 wb_w(fd, " partial=\x00" as *u8); wb_n(fd, part)
298 wb_w(fd, " gap=\x00" as *u8); wb_n(fd, gap)
299 wb_w(fd, " axes=\x00" as *u8); wb_n(fd, WB_NAXES)
300 wb_w(fd, " exceed=\x00" as *u8); wb_n(fd, exceeds)
301 wb_w(fd, " score=\x00" as *u8); wb_n(fd, score)
302 wb_w(fd, "/\x00" as *u8); wb_n(fd, maxs)
303 wb_w(fd, " COVERAGE=\x00" as *u8); wb_n(fd, permil); wb_w(fd, " permil\n\x00" as *u8)
304
305 // ---- GAP QUEUE, population-ranked by the ruler's own class counts ----
306 wb_w(fd, "\nGAP QUEUE (population-ranked from the ruler's class counts -- this IS the build order)\n\x00" as *u8)
307 let idx: *i64 = sys_mmap(WB_NAXES * 8) as *i64
308 var nq: i64 = 0
309 var j: i64 = 0
310 while j < WB_NAXES {
311 if vd[j] < 2 { idx[nq] = j; nq = nq + 1 }
312 j = j + 1
313 }
314 // selection sort by population desc, then by lower verdict, then by axis id (deterministic)
315 var a: i64 = 0
316 while a < nq {
317 var best: i64 = a
318 var b: i64 = a + 1
319 while b < nq {
320 let pb: i64 = wb_pop(rq[idx[b]])
321 let pk: i64 = wb_pop(rq[idx[best]])
322 if pb > pk { best = b }
323 else {
324 if pb == pk { if vd[idx[b]] < vd[idx[best]] { best = b } }
325 }
326 b = b + 1
327 }
328 let tmp: i64 = idx[a]; idx[a] = idx[best]; idx[best] = tmp
329 a = a + 1
330 }
331 var q: i64 = 0
332 while q < nq {
333 let k: i64 = idx[q]
334 wb_w(fd, " #\x00" as *u8); wb_n(fd, q + 1)
335 wb_w(fd, " pop=\x00" as *u8); wb_n(fd, wb_pop(rq[k]))
336 wb_w(fd, " \x00" as *u8); wb_w(fd, wb_vstr(vd[k]))
337 wb_w(fd, " \x00" as *u8); wb_w(fd, (nm[k]) as *u8); wb_w(fd, "\n\x00" as *u8)
338 q = q + 1
339 }
340
341 wb_w(fd, "\nDAN-CLASS DECLINED BY POLICY (N=21): bomb-making, malicious code, drug synthesis and jailbreak\n\x00" as *u8)
342 wb_w(fd, "propagation are a LEGAL line, not a taste line. Adult and kink registers are NOT that class and are\n\x00" as *u8)
343 wb_w(fd, "NOT declined -- they route to the operator's local lane through the existing seam, unshamed.\n\x00" as *u8)
344 wb_w(fd, "SELF-GRADED-UNTIL-A-SECOND-METHOD-CLASS: these verdicts are our own gates. Coverage here is NOT\n\x00" as *u8)
345 wb_w(fd, "parity with any incumbent until an outside witness is wired.\n\x00" as *u8)
346
347 if missing_art > 0 {
348 wb_w(fd, "WRITEBENCH result=LIAR verdict=RED claimed-artifacts-missing=\x00" as *u8); wb_n(fd, missing_art); wb_w(fd, "\n\x00" as *u8)
349 if fd > 0 { sys_close(fd) }
350 sys_exit(1)
351 return 1
352 }
353 wb_w(fd, "WRITEBENCH result=MEASURED-HONEST verdict=GREEN coverage=\x00" as *u8); wb_n(fd, permil)
354 wb_w(fd, " permil\n\x00" as *u8)
355 if fd > 0 { sys_close(fd) }
356 sys_exit(0)
357 return 0
358}