code wiki / (root) / nx_writebench.nx

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}