code wiki / _hdl_build / nx_claude_harvest.nx

nx_claude_harvest.nx source

↩ module page · 1268 lines · 59546 B

1// nx_claude_harvest.nx -- CLAUDE TRANSCRIPT HARVESTER + OUTSIDE-GAUGE (miner-sota lane F964/F973, 2026-07-23). 2// PORTABLE organ (gen-image pattern: runs where the transcripts live -- laptop WSL today, NAS, any host): 3// parses Claude Code transcript JSONL into sovereign actlog frames, bulk-ingests staged frames into a 4// journal (validated, marker-idempotent), and derives the outside_permil gauge (nishi vs outside tool 5// split) that MUST FALL as capabilities move inside (MG00 baseline 651, 2026-07-23). 6// Composes nx_sovjson_lib (sj_*) -- no helper dup (D001 discipline). State derived; journals append-only 7// (O_APPEND, conflict-free, ws_sync lineage). No hw writes (Rule 26). 8// frames <transcript.jsonl> <ws> <outjournal> -> parse transcript, append actlog frames; HARVEST OK 9// ingest <framesfile> <journal> -> validated bulk append, idempotent by marker frame 10// gauge <journal> [days] -> JSON outside_permil (0 days = all frames) 11// selftest <scratch-prefix> -> gate T1..T8 (unique per-run scratch names) 12// license_tier: ORIGINAL 13import "nx_sovjson_lib.nx" 14import "nx_syscalls.nx" 15import "nx_gate_verdict.nx" 16import "nx_tool_run.nx" 17const CH_MAGIC_146097: i64 = 146097 18const CH_MAGIC_719468: i64 = 719468 19const CH_MAGIC_86400: i64 = 86400 20const CH_MAGIC_3600: i64 = 3600 21const CH_MAGIC_1784764900: i64 = 1784764900 22const CH_MAGIC_1784764901: i64 = 1784764901 23const CH_MAGIC_1784764803: i64 = 1784764803 24 25const CH_WIN: i64 = 67108864 26const CH_JWIN: i64 = 4194304 27const CH_OUT: i64 = 65536 28const CH_LINE: i64 = 4096 29const CH_NAME_MAX: i64 = 120 30const CH_NAME_SCAN: i64 = 400 31const CH_MODE_644: i64 = 420 32 33func ch_read(path: *u8, buf: *u8, cap: i64) -> i64 { 34 let fd: i64 = sys_openat_rd(path) 35 if fd < 0 { return -1 } 36 var n: i64 = 0 37 var go: i64 = 1 38 while go == 1 { let r: i64 = sys_read(fd, ((buf as i64)+n) as *u8, cap-n); if r <= 0 { go = 0 } else { n = n + r } if n >= cap { go = 0 } } 39 sys_close(fd) 40 return n 41} 42// substring search in q[from..endlim) -> position or -1 43func ch_find_from(q: *u8, from: i64, endlim: i64, lit: *u8) -> i64 { 44 var i: i64 = from 45 while i < endlim { 46 var k: i64 = 0 47 var ok: i64 = 1 48 var go: i64 = 1 49 while go == 1 { 50 if lit[k] == (0 as u8) { go = 0 } else { 51 if i + k >= endlim { ok = 0; go = 0 } else { 52 if q[i+k] != lit[k] { ok = 0; go = 0 } else { k = k + 1 } 53 } 54 } 55 } 56 if ok == 1 { return i } 57 i = i + 1 58 } 59 return -1 60} 61func ch_find(q: *u8, n: i64, lit: *u8) -> i64 { 62 if ch_find_from(q, 0, n, lit) >= 0 { return 1 } 63 return 0 64} 65// span q[s..e) begins with lit? 66func ch_starts(q: *u8, s: i64, e: i64, lit: *u8) -> i64 { 67 var k: i64 = 0 68 while lit[k] != (0 as u8) { 69 if s + k >= e { return 0 } 70 if q[s+k] != lit[k] { return 0 } 71 k = k + 1 72 } 73 return 1 74} 75func ch_digits(q: *u8, s: i64, e: i64) -> i64 { 76 if e <= s { return 0 } 77 var i: i64 = s 78 while i < e { let c: i64 = q[i] as i64; if c < 48 { return 0 } if c > 57 { return 0 } i = i + 1 } 79 return 1 80} 81// civil date -> unix epoch (Hinnant days-from-civil, integer only; years >= 1970 here) 82func ch_epoch_ymdhms(y: i64, mo: i64, d: i64, h: i64, mi: i64, s: i64) -> i64 { 83 var yy: i64 = y 84 var mp: i64 = 0 85 if mo > 2 { mp = mo - 3 } else { mp = mo + 9; yy = yy - 1 } 86 let era: i64 = yy / 400 87 let yoe: i64 = yy - era * 400 88 let doy: i64 = (153 * mp + 2) / 5 + d - 1 89 let doe: i64 = yoe * 365 + yoe / 4 - yoe / 100 + doy 90 let days: i64 = era * CH_MAGIC_146097 + doe - CH_MAGIC_719468 91 return days * CH_MAGIC_86400 + h * CH_MAGIC_3600 + mi * 60 + s 92} 93// parse ISO "YYYY-MM-DDTHH:MM:SS" at q[s..] (lim-bounded) -> epoch, 0 if malformed 94func ch_iso_epoch(q: *u8, s: i64, lim: i64) -> i64 { 95 if s + 19 > lim { return 0 } 96 if ch_digits(q, s, s+4) == 0 { return 0 } 97 if q[s+4] != (45 as u8) { return 0 } 98 if ch_digits(q, s+5, s+7) == 0 { return 0 } 99 if q[s+7] != (45 as u8) { return 0 } 100 if ch_digits(q, s+8, s+10) == 0 { return 0 } 101 if q[s+10] != (84 as u8) { return 0 } 102 if ch_digits(q, s+11, s+13) == 0 { return 0 } 103 if q[s+13] != (58 as u8) { return 0 } 104 if ch_digits(q, s+14, s+16) == 0 { return 0 } 105 if q[s+16] != (58 as u8) { return 0 } 106 if ch_digits(q, s+17, s+19) == 0 { return 0 } 107 let y: i64 = sj_atoi_span(q, s, s+4) 108 let mo: i64 = sj_atoi_span(q, s+5, s+7) 109 let d: i64 = sj_atoi_span(q, s+8, s+10) 110 let h: i64 = sj_atoi_span(q, s+11, s+13) 111 let mi: i64 = sj_atoi_span(q, s+14, s+16) 112 let se: i64 = sj_atoi_span(q, s+17, s+19) 113 if mo < 1 { return 0 } 114 if mo > 12 { return 0 } 115 if d < 1 { return 0 } 116 if d > 31 { return 0 } 117 return ch_epoch_ymdhms(y, mo, d, h, mi, se) 118} 119// write one actlog frame line to an open fd: <ts>TAB<ws>TAB<tool>TAB<verb>TAB<outcome>TAB<note>NL 120func ch_frame_write(fd: i64, ln: *u8, ts: i64, ws: *u8, tool: *u8, verb: *u8, outcome: *u8, note: *u8) -> i64 { 121 var o: i64 = 0 122 o = sj_catn(ln, o, ts) 123 ln[o] = 9 as u8; o = o + 1 124 o = sj_cat(ln, o, ws) 125 ln[o] = 9 as u8; o = o + 1 126 o = sj_cat(ln, o, tool) 127 ln[o] = 9 as u8; o = o + 1 128 o = sj_cat(ln, o, verb) 129 ln[o] = 9 as u8; o = o + 1 130 o = sj_cat(ln, o, outcome) 131 ln[o] = 9 as u8; o = o + 1 132 o = sj_cat(ln, o, note) 133 ln[o] = 10 as u8; o = o + 1 134 sys_write(fd, ln, o) 135 return 0 136} 137func ch_frame_append(path: *u8, ts: i64, ws: *u8, tool: *u8, verb: *u8, outcome: *u8, note: *u8) -> i64 { 138 let fd: i64 = sys_openat_append(path, CH_MODE_644) 139 if fd < 0 { return -1 } 140 let ln: *u8 = sys_mmap(CH_LINE) 141 ch_frame_write(fd, ln, ts, ws, tool, verb, outcome, note) 142 sys_close(fd) 143 return 0 144} 145// ---------- frames: transcript JSONL -> actlog frames ---------- 146// returns frames harvested, -1 missing/empty transcript, -3 cannot open out journal. 147// tcx[0] receives truncated flag. 148func ch_frames(tpath: *u8, ws: *u8, outj: *u8, tcx: *i64) -> i64 { 149 let buf: *u8 = sys_mmap(CH_WIN) 150 let cap: i64 = CH_WIN - 8 151 let n: i64 = ch_read(tpath, buf, cap) 152 tcx[0] = 0 153 if n <= 0 { return -1 } 154 if n >= cap { tcx[0] = 1 } 155 let fd: i64 = sys_openat_append(outj, CH_MODE_644) 156 if fd < 0 { return -3 } 157 let ln: *u8 = sys_mmap(CH_LINE) 158 let nm: *u8 = sys_mmap(256) 159 var frames: i64 = 0 160 var i: i64 = 0 161 while i < n { 162 let le: i64 = sj_le(buf, i, n) 163 var ts: i64 = 0 164 let tp: i64 = ch_find_from(buf, i, le, "\"timestamp\":\"" as *u8) 165 if tp >= 0 { ts = ch_iso_epoch(buf, tp + 13, le) } 166 var j: i64 = i 167 var go: i64 = 1 168 while go == 1 { 169 let tu: i64 = ch_find_from(buf, j, le, "\"type\":\"tool_use\"" as *u8) 170 if tu < 0 { go = 0 } else { 171 var scanend: i64 = tu + CH_NAME_SCAN 172 if scanend > le { scanend = le } 173 let np: i64 = ch_find_from(buf, tu, scanend, "\"name\":\"" as *u8) 174 if np >= 0 { 175 var k: i64 = np + 8 176 var o: i64 = 0 177 var g2: i64 = 1 178 while g2 == 1 { 179 if k >= le { g2 = 0 } else { 180 if buf[k] == (34 as u8) { g2 = 0 } else { 181 if o < CH_NAME_MAX { nm[o] = buf[k]; o = o + 1 } 182 k = k + 1 183 } 184 } 185 } 186 nm[o] = 0 as u8 187 if o > 0 { 188 ch_frame_write(fd, ln, ts, ws, nm, "use" as *u8, "-" as *u8, "harvest" as *u8) 189 frames = frames + 1 190 } 191 } 192 j = tu + 17 193 } 194 } 195 i = le + 1 196 } 197 sys_close(fd) 198 return frames 199} 200// ---------- delta: HIGH-WATER-MARK harvest, the F973 self-sufficiency half ---------- 201// The ongoing-harvest loop lived in a laptop PowerShell parser (MG03: Claude hand-writes miners). 202// This puts the byte-offset high-water mark INSIDE the organ, so the harvester is self-sufficient on 203// ANY host that holds transcripts: run the ELF, it consumes only what grew since last time. 204// EXACTLY-ONCE BY CONSTRUCTION: only COMPLETE lines are consumed (a partial trailing line stays below 205// the mark for the next run), and the mark advances only over what was actually parsed. A re-run on an 206// unchanged transcript yields 0 frames -- idempotent without needing a marker. 207// hcx[0]=frames hcx[1]=new_hwm hcx[2]=old_hwm hcx[3]=truncated 208func ch_hwm_read(path: *u8) -> i64 { 209 let b: *u8 = sys_mmap(CH_LINE) 210 let fd: i64 = sys_openat_rd(path) 211 if fd < 0 { return 0 } 212 let r: i64 = sys_read(fd, b, CH_LINE - 8) 213 sys_close(fd) 214 if r <= 0 { return 0 } 215 var v: i64 = 0 216 var i: i64 = 0 217 while i < r { let c: i64 = b[i] as i64; if c >= 48 { if c <= 57 { v = v * 10 + (c - 48) } } i = i + 1 } 218 return v 219} 220func ch_hwm_write(path: *u8, v: i64) -> i64 { 221 let fd: i64 = sys_openat_wr(path, CH_MODE_644) 222 if fd < 0 { return -1 } 223 let b: *u8 = sys_mmap(CH_LINE) 224 var o: i64 = sj_catn(b, 0, v) 225 b[o] = 10 as u8 226 sys_write(fd, b, o + 1) 227 sys_close(fd) 228 return 0 229} 230func ch_delta(tpath: *u8, ws: *u8, outj: *u8, hwmpath: *u8, hcx: *i64) -> i64 { 231 hcx[0] = 0 232 hcx[1] = 0 233 hcx[2] = 0 234 hcx[3] = 0 235 let buf: *u8 = sys_mmap(CH_WIN) 236 let cap: i64 = CH_WIN - 8 237 let n: i64 = ch_read(tpath, buf, cap) 238 if n <= 0 { return -1 } 239 if n >= cap { hcx[3] = 1 } 240 var hwm: i64 = ch_hwm_read(hwmpath) 241 if hwm < 0 { hwm = 0 } 242 if hwm > n { hwm = 0 } 243 hcx[2] = hwm 244 hcx[1] = hwm 245 if hwm >= n { return 0 } 246 // consume only up to the LAST newline: a partial trailing line waits for the next run 247 var lastnl: i64 = 0 - 1 248 var z: i64 = n - 1 249 while z >= hwm { if lastnl < 0 { if buf[z] == (10 as u8) { lastnl = z } } z = z - 1 } 250 if lastnl < 0 { return 0 } 251 let fd: i64 = sys_openat_append(outj, CH_MODE_644) 252 if fd < 0 { return -3 } 253 let ln: *u8 = sys_mmap(CH_LINE) 254 let nm: *u8 = sys_mmap(256) 255 var frames: i64 = 0 256 var i: i64 = hwm 257 while i <= lastnl { 258 let le: i64 = sj_le(buf, i, lastnl + 1) 259 var ts: i64 = 0 260 let tp: i64 = ch_find_from(buf, i, le, "\"timestamp\":\"" as *u8) 261 if tp >= 0 { ts = ch_iso_epoch(buf, tp + 13, le) } 262 var j: i64 = i 263 var go: i64 = 1 264 while go == 1 { 265 let tu: i64 = ch_find_from(buf, j, le, "\"type\":\"tool_use\"" as *u8) 266 if tu < 0 { go = 0 } else { 267 var scanend: i64 = tu + CH_NAME_SCAN 268 if scanend > le { scanend = le } 269 let np: i64 = ch_find_from(buf, tu, scanend, "\"name\":\"" as *u8) 270 if np >= 0 { 271 var k: i64 = np + 8 272 var o: i64 = 0 273 var g2: i64 = 1 274 while g2 == 1 { 275 if k >= le { g2 = 0 } else { 276 if buf[k] == (34 as u8) { g2 = 0 } else { 277 if o < CH_NAME_MAX { nm[o] = buf[k]; o = o + 1 } 278 k = k + 1 279 } 280 } 281 } 282 nm[o] = 0 as u8 283 if o > 0 { 284 ch_frame_write(fd, ln, ts, ws, nm, "use" as *u8, "-" as *u8, "delta" as *u8) 285 frames = frames + 1 286 } 287 } 288 j = tu + 17 289 } 290 } 291 i = le + 1 292 } 293 sys_close(fd) 294 hcx[0] = frames 295 hcx[1] = lastnl + 1 296 ch_hwm_write(hwmpath, lastnl + 1) 297 return 0 298} 299// ---------- ingest: validated bulk append of a staged frames file, marker-idempotent ---------- 300// returns >=0 ingested count (mcx[0]=malformed), -1 missing frames file, -2 already ingested, 301// -3 journal window exceeded (idempotence unverifiable -> fail closed), -4 cannot open journal. 302func ch_ingest(fpath: *u8, jpath: *u8, mcx: *i64) -> i64 { 303 mcx[0] = 0 304 // marker = "harvest-ingest:" + basename(fpath) 305 var bs: i64 = 0 306 var i: i64 = 0 307 while fpath[i] != (0 as u8) { if fpath[i] == (47 as u8) { bs = i + 1 } i = i + 1 } 308 let marker: *u8 = sys_mmap(512) 309 var mo: i64 = sj_cat(marker, 0, "harvest-ingest:" as *u8) 310 mo = sj_cat(marker, mo, ((fpath as i64) + bs) as *u8) 311 marker[mo] = 0 as u8 312 let jbuf: *u8 = sys_mmap(CH_JWIN) 313 let jcap: i64 = CH_JWIN - 8 314 let jn: i64 = ch_read(jpath, jbuf, jcap) 315 if jn >= jcap { return -3 } 316 if jn > 0 { if ch_find(jbuf, jn, marker) == 1 { return -2 } } 317 let fbuf: *u8 = sys_mmap(CH_WIN) 318 let fcap: i64 = CH_WIN - 8 319 let fn: i64 = ch_read(fpath, fbuf, fcap) 320 if fn <= 0 { return -1 } 321 let fd: i64 = sys_openat_append(jpath, CH_MODE_644) 322 if fd < 0 { return -4 } 323 let sp: *i64 = sys_mmap(16) as *i64 324 let nl: *u8 = sys_mmap(8) 325 nl[0] = 10 as u8 326 var ing: i64 = 0 327 var p: i64 = 0 328 while p < fn { 329 let le: i64 = sj_le(fbuf, p, fn) 330 var ok: i64 = 0 331 if le > p { 332 if sj_col(fbuf, p, le, 5, sp) == 1 { 333 if sj_col(fbuf, p, le, 6, sp) == 0 { 334 if sj_col(fbuf, p, le, 0, sp) == 1 { 335 if ch_digits(fbuf, sp[0], sp[1]) == 1 { ok = 1 } 336 } 337 } 338 } 339 } 340 if ok == 1 { 341 sys_write(fd, ((fbuf as i64) + p) as *u8, le - p) 342 sys_write(fd, nl, 1) 343 ing = ing + 1 344 } else { 345 if le > p { mcx[0] = mcx[0] + 1 } 346 } 347 p = le + 1 348 } 349 let ln: *u8 = sys_mmap(CH_LINE) 350 ch_frame_write(fd, ln, sys_now_realtime_sec(), "harvest" as *u8, "nx_claude_harvest" as *u8, "ingest" as *u8, "ok" as *u8, marker) 351 sys_close(fd) 352 return ing 353} 354// ---------- gauge: outside_permil JSON from a frames journal ---------- 355func ch_nishi_tool(q: *u8, s: i64, e: i64) -> i64 { 356 if ch_starts(q, s, e, "mcp__nishi__" as *u8) == 1 { return 1 } 357 if ch_starts(q, s, e, "nx_" as *u8) == 1 { return 1 } 358 if ch_starts(q, s, e, "nishi" as *u8) == 1 { return 1 } 359 if ch_starts(q, s, e, "vizsla" as *u8) == 1 { return 1 } 360 return 0 361} 362func ch_key(d: *u8, o: i64, name: *u8) -> i64 { 363 d[o] = 34 as u8 364 var p: i64 = o + 1 365 p = sj_cat(d, p, name) 366 d[p] = 34 as u8 367 p = p + 1 368 d[p] = 58 as u8 369 p = p + 1 370 return p 371} 372// ---------- bootgauge: SOTA-FROM-THE-FIRST-BYTE (operator 2026-07-24 'go SOTA from the first byte up') ---------- 373// For each session (ws) is the FIRST tool nishi-native? A session that opens with nx_seat boot is SOTA 374// from byte 1; one that opens by reading 40KB of memory / scratchpadding is LEGACY. Measures the 375// SOTA-boot ratio + the softer nishi-within-first-K signal. Sessions interned by ws span (bounded, declared). 376const CH_WS_MAX: i64 = 4096 377func ch_bg_intern(q: *u8, cs: i64, ce: i64, wss: *i64, wse: *i64, np: *i64) -> i64 { 378 var i: i64 = 0 379 while i < np[0] { 380 if ce - cs == wse[i] - wss[i] { 381 var m: i64 = 0 382 var eq: i64 = 1 383 while m < ce - cs { if q[cs+m] != q[wss[i]+m] { eq = 0; m = ce - cs } else { m = m + 1 } } 384 if eq == 1 { return i } 385 } 386 i = i + 1 387 } 388 if np[0] >= CH_WS_MAX { return -1 } 389 wss[np[0]] = cs 390 wse[np[0]] = ce 391 np[0] = np[0] + 1 392 return np[0] - 1 393} 394func ch_bootgauge(journal: *u8, k: i64, d: *u8) -> i64 { 395 let q: *u8 = sys_mmap(CH_JWIN) 396 let cap: i64 = CH_JWIN - 8 397 var n: i64 = ch_read(journal, q, cap) 398 if n < 0 { n = 0 } 399 var trunc: i64 = 0 400 if n >= cap { trunc = 1 } 401 let wss: *i64 = sys_mmap(8 * CH_WS_MAX) as *i64 402 let wse: *i64 = sys_mmap(8 * CH_WS_MAX) as *i64 403 let wfn: *i64 = sys_mmap(8 * CH_WS_MAX) as *i64 404 let wnk: *i64 = sys_mmap(8 * CH_WS_MAX) as *i64 405 let wc: *i64 = sys_mmap(8 * CH_WS_MAX) as *i64 406 let np: *i64 = sys_mmap(16) as *i64 407 let sp: *i64 = sys_mmap(16) as *i64 408 var frames: i64 = 0 409 var malformed: i64 = 0 410 var capped: i64 = 0 411 var i: i64 = 0 412 while i < n { 413 let le: i64 = sj_le(q, i, n) 414 if le > i { 415 if sj_col(q, i, le, 1, sp) == 1 { 416 let ws0: i64 = sp[0] 417 let ws1: i64 = sp[1] 418 if sj_col(q, i, le, 2, sp) == 1 { 419 frames = frames + 1 420 let wi: i64 = ch_bg_intern(q, ws0, ws1, wss, wse, np) 421 if wi < 0 { capped = 1 } else { 422 let isn: i64 = ch_nishi_tool(q, sp[0], sp[1]) 423 let c: i64 = wc[wi] 424 wc[wi] = c + 1 425 if c == 0 { wfn[wi] = isn } 426 if c < k { if isn == 1 { wnk[wi] = 1 } } 427 } 428 } else { malformed = malformed + 1 } 429 } else { malformed = malformed + 1 } 430 } 431 i = le + 1 432 } 433 var sota: i64 = 0 434 var nishik: i64 = 0 435 var kk: i64 = 0 436 while kk < np[0] { 437 if wfn[kk] == 1 { sota = sota + 1 } 438 if wnk[kk] == 1 { nishik = nishik + 1 } 439 kk = kk + 1 440 } 441 let total: i64 = np[0] 442 var sotaperm: i64 = 0 - 1 443 var nkperm: i64 = 0 - 1 444 if total > 0 { sotaperm = sota * 1000 / total; nkperm = nishik * 1000 / total } 445 var p: i64 = 0 446 d[p] = 123 as u8; p = p + 1 447 p = ch_key(d, p, "v" as *u8); p = sj_catn(d, p, 1); d[p] = 44 as u8; p = p + 1 448 p = ch_key(d, p, "tool" as *u8); d[p]=34 as u8;p=p+1; p = sj_cat(d,p,"nx_claude_harvest" as *u8); d[p]=34 as u8;p=p+1; d[p]=44 as u8;p=p+1 449 p = ch_key(d, p, "averb" as *u8); d[p]=34 as u8;p=p+1; p = sj_cat(d,p,"bootgauge" as *u8); d[p]=34 as u8;p=p+1; d[p]=44 as u8;p=p+1 450 p = ch_key(d, p, "journal_bytes" as *u8); p = sj_catn(d,p,n); d[p]=44 as u8;p=p+1 451 p = ch_key(d, p, "truncated" as *u8); p = sj_catn(d,p,trunc); d[p]=44 as u8;p=p+1 452 p = ch_key(d, p, "k" as *u8); p = sj_catn(d,p,k); d[p]=44 as u8;p=p+1 453 p = ch_key(d, p, "frames" as *u8); p = sj_catn(d,p,frames); d[p]=44 as u8;p=p+1 454 p = ch_key(d, p, "malformed" as *u8); p = sj_catn(d,p,malformed); d[p]=44 as u8;p=p+1 455 p = ch_key(d, p, "sessions" as *u8); p = sj_catn(d,p,total); d[p]=44 as u8;p=p+1 456 p = ch_key(d, p, "sota_first" as *u8); p = sj_catn(d,p,sota); d[p]=44 as u8;p=p+1 457 p = ch_key(d, p, "legacy_first" as *u8); p = sj_catn(d,p,total-sota); d[p]=44 as u8;p=p+1 458 p = ch_key(d, p, "sota_boot_permil" as *u8); p = sj_catn(d,p,sotaperm); d[p]=44 as u8;p=p+1 459 p = ch_key(d, p, "nishi_within_k" as *u8); p = sj_catn(d,p,nishik); d[p]=44 as u8;p=p+1 460 p = ch_key(d, p, "nishi_within_k_permil" as *u8); p = sj_catn(d,p,nkperm); d[p]=44 as u8;p=p+1 461 p = ch_key(d, p, "sessions_capped" as *u8); p = sj_catn(d,p,capped) 462 d[p] = 125 as u8; p = p + 1 463 d[p] = 10 as u8; p = p + 1 464 return p 465} 466// gauge core: g slots 0 total 1 nishi 2 outside 3 permil 4 malformed 5 trunc 6 bytes 467func ch_gauge_calc(jpath: *u8, days: i64, g: *i64) -> i64 { 468 let q: *u8 = sys_mmap(CH_JWIN) 469 let cap: i64 = CH_JWIN - 8 470 var n: i64 = ch_read(jpath, q, cap) 471 if n < 0 { n = 0 } 472 var trunc: i64 = 0 473 if n >= cap { trunc = 1 } 474 var cutoff: i64 = 0 475 if days > 0 { cutoff = sys_now_realtime_sec() - days * CH_MAGIC_86400 } 476 let sp: *i64 = sys_mmap(16) as *i64 477 var total: i64 = 0 478 var nishi: i64 = 0 479 var outside: i64 = 0 480 var malformed: i64 = 0 481 var i: i64 = 0 482 while i < n { 483 let le: i64 = sj_le(q, i, n) 484 if le > i { 485 var ok: i64 = 0 486 var ts: i64 = 0 487 if sj_col(q, i, le, 0, sp) == 1 { 488 if ch_digits(q, sp[0], sp[1]) == 1 { 489 ts = sj_atoi_span(q, sp[0], sp[1]) 490 if sj_col(q, i, le, 2, sp) == 1 { ok = 1 } 491 } 492 } 493 if ok == 1 { 494 if ts >= cutoff { 495 total = total + 1 496 if ch_nishi_tool(q, sp[0], sp[1]) == 1 { nishi = nishi + 1 } else { outside = outside + 1 } 497 } 498 } else { malformed = malformed + 1 } 499 } 500 i = le + 1 501 } 502 var permil: i64 = 0 - 1 503 if total > 0 { permil = outside * 1000 / total } 504 g[0] = total 505 g[1] = nishi 506 g[2] = outside 507 g[3] = permil 508 g[4] = malformed 509 g[5] = trunc 510 g[6] = n 511 return 0 512} 513func ch_gauge_json(jpath: *u8, days: i64, d: *u8) -> i64 { 514 let g: *i64 = sys_mmap(64) as *i64 515 ch_gauge_calc(jpath, days, g) 516 let total: i64 = g[0] 517 let nishi: i64 = g[1] 518 let outside: i64 = g[2] 519 let permil: i64 = g[3] 520 let malformed: i64 = g[4] 521 let trunc: i64 = g[5] 522 let n: i64 = g[6] 523 var p: i64 = 0 524 d[p] = 123 as u8; p = p + 1 525 p = ch_key(d, p, "v" as *u8); p = sj_catn(d, p, 1); d[p] = 44 as u8; p = p + 1 526 p = ch_key(d, p, "tool" as *u8) 527 d[p] = 34 as u8; p = p + 1 528 p = sj_cat(d, p, "nx_claude_harvest" as *u8) 529 d[p] = 34 as u8; p = p + 1 530 d[p] = 44 as u8; p = p + 1 531 p = ch_key(d, p, "averb" as *u8) 532 d[p] = 34 as u8; p = p + 1 533 p = sj_cat(d, p, "gauge" as *u8) 534 d[p] = 34 as u8; p = p + 1 535 d[p] = 44 as u8; p = p + 1 536 p = ch_key(d, p, "journal" as *u8) 537 d[p] = 34 as u8; p = p + 1 538 p = sj_cat_esc(d, p, jpath, 0, sj_vlen(jpath), 200) 539 d[p] = 34 as u8; p = p + 1 540 d[p] = 44 as u8; p = p + 1 541 p = ch_key(d, p, "journal_bytes" as *u8); p = sj_catn(d, p, n); d[p] = 44 as u8; p = p + 1 542 p = ch_key(d, p, "truncated" as *u8); p = sj_catn(d, p, trunc); d[p] = 44 as u8; p = p + 1 543 p = ch_key(d, p, "days" as *u8); p = sj_catn(d, p, days); d[p] = 44 as u8; p = p + 1 544 p = ch_key(d, p, "frames_total" as *u8); p = sj_catn(d, p, total); d[p] = 44 as u8; p = p + 1 545 p = ch_key(d, p, "malformed" as *u8); p = sj_catn(d, p, malformed); d[p] = 44 as u8; p = p + 1 546 p = ch_key(d, p, "nishi" as *u8); p = sj_catn(d, p, nishi); d[p] = 44 as u8; p = p + 1 547 p = ch_key(d, p, "outside" as *u8); p = sj_catn(d, p, outside); d[p] = 44 as u8; p = p + 1 548 p = ch_key(d, p, "outside_permil" as *u8); p = sj_catn(d, p, permil) 549 d[p] = 125 as u8; p = p + 1 550 d[p] = 10 as u8; p = p + 1 551 return p 552} 553// ---------- page: the F965 watch-it-fall surface (HTML, minimal; U2/U3 restyle rides ui-debt lane) ---------- 554func ch_page(jpath: *u8, outp: *u8, days: i64) -> i64 { 555 let g: *i64 = sys_mmap(64) as *i64 556 ch_gauge_calc(jpath, days, g) 557 let d: *u8 = sys_mmap(CH_OUT) 558 var p: i64 = 0 559 d[p] = 60 as u8; p = p + 1 560 d[p] = 33 as u8; p = p + 1 561 p = sj_cat(d, p, "doctype html><html><head><meta charset=\"utf-8\"><title>Outside Gauge</title></head><body>" as *u8) 562 p = sj_cat(d, p, "<h1>Outside Gauge</h1><p>share of observed tool actions still OUTSIDE the nishi ecosystem (permil, derived from the sovereign actlog)</p>" as *u8) 563 p = sj_cat(d, p, "<p style=\"font-size:64px;margin:8px 0\">" as *u8) 564 p = sj_catn(d, p, g[3]) 565 p = sj_cat(d, p, "&permil;</p>" as *u8) 566 p = sj_cat(d, p, "<p>outside_permil=" as *u8) 567 p = sj_catn(d, p, g[3]) 568 p = sj_cat(d, p, " (frames=" as *u8) 569 p = sj_catn(d, p, g[0]) 570 p = sj_cat(d, p, " nishi=" as *u8) 571 p = sj_catn(d, p, g[1]) 572 p = sj_cat(d, p, " outside=" as *u8) 573 p = sj_catn(d, p, g[2]) 574 p = sj_cat(d, p, " malformed=" as *u8) 575 p = sj_catn(d, p, g[4]) 576 p = sj_cat(d, p, " truncated=" as *u8) 577 p = sj_catn(d, p, g[5]) 578 p = sj_cat(d, p, " days=" as *u8) 579 p = sj_catn(d, p, days) 580 p = sj_cat(d, p, ")</p>" as *u8) 581 p = sj_cat(d, p, "<p>Baseline 2026-07-23: laptop 651 / sovereign 643. This number must FALL as capabilities move inside (minergap- MG00-MG11; frontier F964-F973).</p>" as *u8) 582 p = sj_cat(d, p, "<p><a href=\"/wsmine\">wsmine</a> <a href=\"/claims\">claims</a> <a href=\"/intake\">intake</a> <a href=\"/frontier\">frontier</a></p>" as *u8) 583 p = sj_cat(d, p, "<p>emitted by nx_claude_harvest page (hourly beat); journal " as *u8) 584 p = sj_cat(d, p, jpath) 585 p = sj_cat(d, p, "</p></body></html>" as *u8) 586 let fd: i64 = sys_openat_wr(outp, CH_MODE_644) 587 if fd < 0 { return -1 } 588 sys_write(fd, d, p) 589 sys_close(fd) 590 return 0 591} 592// ---------- F971 propose: the gauge FILES its own migration work (feeder pattern) ---------- 593// codes: 0 filed | 1 filer-fail | 2 below-threshold | 3 intake-window-exceeded (fail closed) | 594// 4 already-proposed (marker) | 5 insufficient-data. Filer is INJECTABLE (argecho in the 595// gate) and ALLOWLIST-RESOLVED (never a hardcoded sibling path). Marker [HARV:outsidegap:v1] 596// makes re-runs never re-file. NOTE ch_allow_path duplicates nx_actlog al_allow_path -- the 597// shared nx_jrnl_lib extraction is the filed rule-15 residual. 598// DELEGATES to the shared base (rule-15 extraction 2026-07-23) 599func ch_allow_path(name: *u8, outp: *u8) -> i64 { return sj_allow_path(name, outp) } 600func ch_propose(jpath: *u8, ipath: *u8, thr: i64, filer: *u8, cout: *u8, colen: *i64) -> i64 { 601 colen[0] = 0 602 let g: *i64 = sys_mmap(64) as *i64 603 ch_gauge_calc(jpath, 0, g) 604 if g[3] < 0 { return 5 } 605 if g[3] < thr { return 2 } 606 let jb: *u8 = sys_mmap(CH_JWIN) 607 let jcap: i64 = CH_JWIN - 8 608 let jn: i64 = ch_read(ipath, jb, jcap) 609 if jn >= jcap { return 3 } 610 if jn > 0 { if ch_find(jb, jn, "[HARV:outsidegap:v1]" as *u8) == 1 { return 4 } } 611 let fpath: *u8 = sys_mmap(512) 612 if ch_allow_path(filer, fpath) == 0 { return 1 } 613 let txt: *u8 = sys_mmap(CH_LINE) 614 var o: i64 = sj_cat(txt, 0, "[HARV:outsidegap:v1] outside_permil=" as *u8) 615 o = sj_catn(txt, o, g[3]) 616 o = sj_cat(txt, o, " over threshold " as *u8) 617 o = sj_catn(txt, o, thr) 618 o = sj_cat(txt, o, " (frames=" as *u8) 619 o = sj_catn(txt, o, g[0]) 620 o = sj_cat(txt, o, " nishi=" as *u8) 621 o = sj_catn(txt, o, g[1]) 622 o = sj_cat(txt, o, " outside=" as *u8) 623 o = sj_catn(txt, o, g[2]) 624 o = sj_cat(txt, o, ") - drive capability-migration from the minergap- catalog MG01-MG11 / frontier F964-F973; auto-filed by nx_claude_harvest propose" as *u8) 625 txt[o] = 0 as u8 626 let av: *i64 = sys_mmap(64) as *i64 627 av[0] = fpath as i64 628 av[1] = "ask" as *u8 as i64 629 av[2] = ipath as i64 630 av[3] = "nx_claude_harvest" as *u8 as i64 631 av[4] = txt as i64 632 av[5] = 0 633 let ex: i64 = tr_run_capture(fpath, av, cout, CH_LINE - 8, colen) 634 if ex != 0 { return 1 } 635 return 0 636} 637// ---------- selftest ---------- 638func ch_selftest(prefix: *u8) -> i64 { 639 let ctr: *i64 = gv_ctr() 640 gv_head("nx_claude_harvest selftest -- transcript parse + ingest + gauge teeth (unique scratch per run)" as *u8) 641 let now: i64 = sys_now_realtime_sec() 642 let tj: *u8 = sys_mmap(512) 643 var o: i64 = sj_cat(tj, 0, prefix) 644 o = sj_catn(tj, o, now) 645 o = sj_cat(tj, o, ".jsonl" as *u8) 646 tj[o] = 0 as u8 647 let fr: *u8 = sys_mmap(512) 648 o = sj_cat(fr, 0, prefix) 649 o = sj_catn(fr, o, now) 650 o = sj_cat(fr, o, ".frames" as *u8) 651 fr[o] = 0 as u8 652 let st: *u8 = sys_mmap(512) 653 o = sj_cat(st, 0, prefix) 654 o = sj_catn(st, o, now) 655 o = sj_cat(st, o, ".staged" as *u8) 656 st[o] = 0 as u8 657 let jr: *u8 = sys_mmap(512) 658 o = sj_cat(jr, 0, prefix) 659 o = sj_catn(jr, o, now) 660 o = sj_cat(jr, o, ".jrnl" as *u8) 661 jr[o] = 0 as u8 662 // fixture transcript: decoy name outside tool_use + 2 tool_use on one line + 1 on another 663 let tfd: i64 = sys_openat_append(tj, CH_MODE_644) 664 let lb: *u8 = sys_mmap(CH_LINE) 665 var lo: i64 = sj_cat(lb, 0, "{\"type\":\"user\",\"name\":\"decoy1\",\"timestamp\":\"2026-07-23T00:00:00Z\"}" as *u8) 666 lb[lo] = 10 as u8 667 sys_write(tfd, lb, lo + 1) 668 lo = sj_cat(lb, 0, "{\"timestamp\":\"2026-07-23T00:00:01Z\",\"c\":[{\"type\":\"tool_use\",\"id\":\"a\",\"name\":\"Edit\"},{\"type\":\"tool_use\",\"id\":\"b\",\"name\":\"PowerShell\"}]}" as *u8) 669 lb[lo] = 10 as u8 670 sys_write(tfd, lb, lo + 1) 671 lo = sj_cat(lb, 0, "{\"timestamp\":\"2026-07-23T00:00:02Z\",\"c\":[{\"type\":\"tool_use\",\"id\":\"c\",\"name\":\"mcp__nishi__nx_fs\"}]}" as *u8) 672 lb[lo] = 10 as u8 673 sys_write(tfd, lb, lo + 1) 674 sys_close(tfd) 675 // T1 harvest exact: 3 frames, decoy never harvested 676 let tcx: *i64 = sys_mmap(16) as *i64 677 let got: i64 = ch_frames(tj, "wtest" as *u8, fr, tcx) 678 let fb: *u8 = sys_mmap(CH_JWIN) 679 let fn: i64 = ch_read(fr, fb, CH_JWIN - 8) 680 var ok1: i64 = 0 681 if got == 3 { if fn > 0 { if ch_find(fb, fn, "Edit" as *u8) == 1 { if ch_find(fb, fn, "PowerShell" as *u8) == 1 { if ch_find(fb, fn, "decoy1" as *u8) == 0 { ok1 = 1 } } } } } 682 gv_check("T1 harvest exactly the 3 tool_use names, decoy name never fabricated" as *u8, ok1, ctr) 683 // T2 iso timestamp -> epoch propagated (2026-07-23T00:00:01Z = 1784764801) 684 var ok2: i64 = 0 685 if ch_find(fb, fn, "1784764801" as *u8) == 1 { if ch_find(fb, fn, "1784764802" as *u8) == 1 { ok2 = 1 } } 686 gv_check("T2 iso timestamps parsed to exact epochs" as *u8, ok2, ctr) 687 // T3 gauge exact split: Edit+PowerShell outside, nx_fs nishi -> 666 permil 688 let d: *u8 = sys_mmap(CH_OUT) 689 var dl: i64 = ch_gauge_json(fr, 0, d) 690 var ok3: i64 = 0 691 if dl > 0 { if ch_find(d, dl, "\"frames_total\":3" as *u8) == 1 { if ch_find(d, dl, "\"outside_permil\":666" as *u8) == 1 { ok3 = 1 } } } 692 gv_check("T3 gauge exact: 2 outside 1 nishi = 666 permil" as *u8, ok3, ctr) 693 // T4 gauge on missing journal refuses a number (-1, insufficient data honesty) 694 let miss: *u8 = sys_mmap(512) 695 o = sj_cat(miss, 0, prefix) 696 o = sj_catn(miss, o, now) 697 o = sj_cat(miss, o, ".absent" as *u8) 698 miss[o] = 0 as u8 699 dl = ch_gauge_json(miss, 0, d) 700 var ok4: i64 = 0 701 if dl > 0 { if ch_find(d, dl, "\"frames_total\":0" as *u8) == 1 { if ch_find(d, dl, "\"outside_permil\":-1" as *u8) == 1 { ok4 = 1 } } } 702 gv_check("T4 empty journal refuses permil (-1) never fabricates" as *u8, ok4, ctr) 703 // T5 ingest: 2 valid + 1 malformed staged line -> journal gains exactly the 2 + marker 704 ch_frame_append(st, CH_MAGIC_1784764900, "w2" as *u8, "Read" as *u8, "use" as *u8, "-" as *u8, "harvest" as *u8) 705 ch_frame_append(st, CH_MAGIC_1784764901, "w2" as *u8, "nx_fs_write" as *u8, "use" as *u8, "-" as *u8, "harvest" as *u8) 706 let sfd: i64 = sys_openat_append(st, CH_MODE_644) 707 var go2: i64 = sj_cat(lb, 0, "garbage-no-tabs" as *u8) 708 lb[go2] = 10 as u8 709 sys_write(sfd, lb, go2 + 1) 710 sys_close(sfd) 711 let mcx: *i64 = sys_mmap(16) as *i64 712 let r5: i64 = ch_ingest(st, jr, mcx) 713 let jb: *u8 = sys_mmap(CH_JWIN) 714 var jn: i64 = ch_read(jr, jb, CH_JWIN - 8) 715 var ok5: i64 = 0 716 if r5 == 2 { if mcx[0] == 1 { if ch_find(jb, jn, "Read" as *u8) == 1 { if ch_find(jb, jn, "harvest-ingest:" as *u8) == 1 { if ch_find(jb, jn, "garbage-no-tabs" as *u8) == 0 { ok5 = 1 } } } } } 717 gv_check("T5 ingest validates: 2 in, malformed counted out, marker banked" as *u8, ok5, ctr) 718 // T6 idempotent: second ingest refuses, journal bytes unchanged 719 let r6: i64 = ch_ingest(st, jr, mcx) 720 let jn2: i64 = ch_read(jr, jb, CH_JWIN - 8) 721 var ok6: i64 = 0 722 if r6 == (0 - 2) { if jn2 == jn { ok6 = 1 } } 723 gv_check("T6 re-ingest ALREADY, journal byte-identical" as *u8, ok6, ctr) 724 // T7 missing transcript fails closed 725 let r7: i64 = ch_frames(miss, "w" as *u8, fr, tcx) 726 var ok7: i64 = 0 727 if r7 == (0 - 1) { ok7 = 1 } 728 gv_check("T7 missing transcript refused (-1) fail closed" as *u8, ok7, ctr) 729 // T8 sovereign-organ frames (nx_ prefix) classify as nishi: add one -> 2 outside / 2 nishi = 500 730 ch_frame_append(fr, CH_MAGIC_1784764803, "wtest" as *u8, "nx_shelltool" as *u8, "use" as *u8, "-" as *u8, "harvest" as *u8) 731 dl = ch_gauge_json(fr, 0, d) 732 var ok8: i64 = 0 733 if dl > 0 { if ch_find(d, dl, "\"frames_total\":4" as *u8) == 1 { if ch_find(d, dl, "\"outside_permil\":500" as *u8) == 1 { ok8 = 1 } } } 734 gv_check("T8 nx_-prefixed frames count as nishi (500 permil exact)" as *u8, ok8, ctr) 735 // T9 page emits the exact gauge + title (from the T8 journal: permil 500) 736 let pg: *u8 = sys_mmap(512) 737 o = sj_cat(pg, 0, prefix) 738 o = sj_catn(pg, o, now) 739 o = sj_cat(pg, o, ".html" as *u8) 740 pg[o] = 0 as u8 741 let r9: i64 = ch_page(fr, pg, 0) 742 let pb: *u8 = sys_mmap(CH_OUT) 743 let pn: i64 = ch_read(pg, pb, CH_OUT - 8) 744 var ok9: i64 = 0 745 if r9 == 0 { if pn > 0 { if ch_find(pb, pn, "outside_permil=500" as *u8) == 1 { if ch_find(pb, pn, "Outside Gauge" as *u8) == 1 { ok9 = 1 } } } } 746 gv_check("T9 page emits the exact gauge + title" as *u8, ok9, ctr) 747 // T13-T16 propose (F971): threshold honesty, injectable filer, marker idempotence, insufficient refuse 748 let ijr: *u8 = sys_mmap(512) 749 o = sj_cat(ijr, 0, prefix) 750 o = sj_catn(ijr, o, now) 751 o = sj_cat(ijr, o, ".ijr" as *u8) 752 ijr[o] = 0 as u8 753 let pcl: *i64 = sys_mmap(16) as *i64 754 let r13: i64 = ch_propose(fr, ijr, 600, "argecho" as *u8, d, pcl) 755 var ok13: i64 = 0 756 if r13 == 2 { ok13 = 1 } 757 gv_check("T13 below threshold never files (code 2)" as *u8, ok13, ctr) 758 let r14: i64 = ch_propose(fr, ijr, 400, "argecho" as *u8, d, pcl) 759 var ok14: i64 = 0 760 if r14 == 0 { if pcl[0] > 0 { if ch_find(d, pcl[0], "[HARV:outsidegap:v1] outside_permil=500" as *u8) == 1 { ok14 = 1 } } } 761 gv_check("T14 above threshold files through the injected filer w/ exact marker+permil" as *u8, ok14, ctr) 762 let mfd: i64 = sys_openat_append(ijr, CH_MODE_644) 763 let mln: *u8 = sys_mmap(256) 764 var mo2: i64 = sj_cat(mln, 0, "1 seeded [HARV:outsidegap:v1] marker" as *u8) 765 mln[mo2] = 10 as u8 766 sys_write(mfd, mln, mo2 + 1) 767 sys_close(mfd) 768 let r15: i64 = ch_propose(fr, ijr, 400, "argecho" as *u8, d, pcl) 769 var ok15: i64 = 0 770 if r15 == 4 { ok15 = 1 } 771 gv_check("T15 marker present refuses re-file (code 4, idempotent)" as *u8, ok15, ctr) 772 let r16: i64 = ch_propose(miss, ijr, 400, "argecho" as *u8, d, pcl) 773 var ok16: i64 = 0 774 if r16 == 5 { ok16 = 1 } 775 gv_check("T16 insufficient data refuses to propose (code 5)" as *u8, ok16, ctr) 776 // T17-T20 DELTA (F973): exactly-once harvest by byte high-water mark 777 let dj: *u8 = sys_mmap(512) 778 o = sj_cat(dj, 0, prefix) 779 o = sj_catn(dj, o, now) 780 o = sj_cat(dj, o, ".dj" as *u8) 781 dj[o] = 0 as u8 782 let hw: *u8 = sys_mmap(512) 783 o = sj_cat(hw, 0, prefix) 784 o = sj_catn(hw, o, now) 785 o = sj_cat(hw, o, ".hwm" as *u8) 786 hw[o] = 0 as u8 787 let hcx: *i64 = sys_mmap(64) as *i64 788 // tj holds 3 lines / 3 tool_use frames from T1 789 let rd1: i64 = ch_delta(tj, "wd" as *u8, dj, hw, hcx) 790 var ok17: i64 = 0 791 if rd1 == 0 { if hcx[0] == 3 { if hcx[2] == 0 { if hcx[1] > 0 { ok17 = 1 } } } } 792 gv_check("T17 first delta harvests all 3 frames and banks a high-water mark" as *u8, ok17, ctr) 793 let firsthwm: i64 = hcx[1] 794 let rd2: i64 = ch_delta(tj, "wd" as *u8, dj, hw, hcx) 795 var ok18: i64 = 0 796 if rd2 == 0 { if hcx[0] == 0 { if hcx[1] == firsthwm { ok18 = 1 } } } 797 gv_check("T18 re-run on an unchanged transcript harvests ZERO (exactly-once, no marker needed)" as *u8, ok18, ctr) 798 // grow the transcript by ONE complete line (1 tool_use) + a PARTIAL trailing line 799 let gfd: i64 = sys_openat_append(tj, CH_MODE_644) 800 lo = sj_cat(lb, 0, "{\"timestamp\":\"2026-07-23T00:00:03Z\",\"c\":[{\"type\":\"tool_use\",\"id\":\"g\",\"name\":\"Grep\"}]}" as *u8) 801 lb[lo] = 10 as u8 802 sys_write(gfd, lb, lo + 1) 803 lo = sj_cat(lb, 0, "{\"type\":\"tool_use\",\"name\":\"PartialNeverCounted\"" as *u8) 804 sys_write(gfd, lb, lo) 805 sys_close(gfd) 806 let rd3: i64 = ch_delta(tj, "wd" as *u8, dj, hw, hcx) 807 var ok19: i64 = 0 808 if rd3 == 0 { if hcx[0] == 1 { if hcx[2] == firsthwm { ok19 = 1 } } } 809 gv_check("T19 growth harvests ONLY the new line (1 frame), resuming from the banked mark" as *u8, ok19, ctr) 810 let db: *u8 = sys_mmap(CH_JWIN) 811 let dn: i64 = ch_read(dj, db, CH_JWIN - 8) 812 var ok20: i64 = 0 813 if dn > 0 { if ch_find(db, dn, "Grep" as *u8) == 1 { if ch_find(db, dn, "PartialNeverCounted" as *u8) == 0 { ok20 = 1 } } } 814 gv_check("T20 a PARTIAL trailing line is never consumed (waits below the mark)" as *u8, ok20, ctr) 815 // T21/T22 BOOTGAUGE (SOTA-from-the-first-byte): s1 opens nishi-native (nx_seat), s2 opens legacy 816 // (Read) but touches nishi within K, s3 stays outside => sota_first 1/3=333, nishi_within_k 2/3=666. 817 let bj: *u8 = sys_mmap(512) 818 o = sj_cat(bj, 0, prefix) 819 o = sj_catn(bj, o, now) 820 o = sj_cat(bj, o, ".bj" as *u8) 821 bj[o] = 0 as u8 822 ch_frame_append(bj, CH_MAGIC_1784764900, "s1" as *u8, "nx_seat" as *u8, "boot" as *u8, "-" as *u8, "-" as *u8) 823 ch_frame_append(bj, CH_MAGIC_1784764900, "s1" as *u8, "mcp__nishi__nx_fs" as *u8, "lines" as *u8, "-" as *u8, "-" as *u8) 824 ch_frame_append(bj, CH_MAGIC_1784764900, "s2" as *u8, "Read" as *u8, "use" as *u8, "-" as *u8, "-" as *u8) 825 ch_frame_append(bj, CH_MAGIC_1784764900, "s2" as *u8, "mcp__nishi__nx_store_put" as *u8, "put" as *u8, "-" as *u8, "-" as *u8) 826 ch_frame_append(bj, CH_MAGIC_1784764900, "s3" as *u8, "PowerShell" as *u8, "use" as *u8, "-" as *u8, "-" as *u8) 827 ch_frame_append(bj, CH_MAGIC_1784764900, "s3" as *u8, "Bash" as *u8, "use" as *u8, "-" as *u8, "-" as *u8) 828 let bd: i64 = ch_bootgauge(bj, 3, d) 829 var ok21: i64 = 0 830 if bd > 0 { if ch_find(d, bd, "\"sessions\":3,\"sota_first\":1,\"legacy_first\":2,\"sota_boot_permil\":333" as *u8) == 1 { ok21 = 1 } } 831 gv_check("T21 bootgauge: first tool nishi in 1 of 3 sessions = 333 permil SOTA-boot" as *u8, ok21, ctr) 832 var ok22: i64 = 0 833 if bd > 0 { if ch_find(d, bd, "\"nishi_within_k\":2,\"nishi_within_k_permil\":666" as *u8) == 1 { ok22 = 1 } } 834 gv_check("T22 nishi-within-first-K = 2 of 3 = 666 permil (the softer signal)" as *u8, ok22, ctr) 835 let lc: *u8 = sys_mmap(512) 836 o = sj_cat(lc, 0, prefix) 837 o = sj_catn(lc, o, now) 838 o = sj_cat(lc, o, ".lconf" as *u8) 839 lc[o] = 0 as u8 840 let lt: *u8 = sys_mmap(512) 841 o = sj_cat(lt, 0, prefix) 842 o = sj_catn(lt, o, now) 843 o = sj_cat(lt, o, ".ltx" as *u8) 844 lt[o] = 0 as u8 845 let lo2: *u8 = sys_mmap(512) 846 o = sj_cat(lo2, 0, prefix) 847 o = sj_catn(lo2, o, now) 848 o = sj_cat(lo2, o, ".lout" as *u8) 849 lo2[o] = 0 as u8 850 let cfd: i64 = sys_openat_append(lc, CH_MODE_644) 851 let cb2: *u8 = sys_mmap(CH_LINE) 852 var co: i64 = sj_cat(cb2, 0, "marker=LAW:|6\nmarker=ROOT CAUSE|5\nmarker=MEASURED|3\nstar_char=★\nwarn_char=⚠\nwarn_bonus=2\nstar_max=6\nmin_rank_store=3\nmin_len=40\nmax_len=400\n" as *u8) 853 sys_write(cfd, cb2, co) 854 sys_close(cfd) 855 let tfd2: i64 = sys_openat_append(lt, CH_MODE_644) 856 let tb2: *u8 = sys_mmap(CH_LINE) 857 var to2: i64 = sj_cat(tb2, 0, "{\"timestamp\":\"2026-07-23T00:00:00Z\",\"c\":[{\"type\":\"text\",\"text\":\"LAW: a guard placed after the act it guards is not a guard\"}]}\n" as *u8) 858 to2 = sj_cat(tb2, to2, "{\"timestamp\":\"2026-07-23T00:00:01Z\",\"c\":[{\"type\":\"text\",\"text\":\"we then opened the file and looked at it for a while and moved on\"}]}\n" as *u8) 859 to2 = sj_cat(tb2, to2, "{\"timestamp\":\"2026-07-23T00:00:02Z\",\"c\":[{\"type\":\"tool_use\",\"id\":\"a\",\"name\":\"Edit\"}]}\n" as *u8) 860 to2 = sj_cat(tb2, to2, "{\"timestamp\":\"2026-07-23T00:00:03Z\",\"c\":[{\"type\":\"text\",\"text\":\"★★★★ gate on the resource the work actually consumes\"}]}\n" as *u8) 861 to2 = sj_cat(tb2, to2, "{\"timestamp\":\"2026-07-23T00:00:04Z\",\"c\":[{\"type\":\"text\",\"text\":\"the axes run 0..1000 and -1 means UNMEASURED for this row\"}]}\n" as *u8) 862 to2 = sj_cat(tb2, to2, "{\"timestamp\":\"2026-07-23T00:00:05Z\",\"c\":[{\"type\":\"text\",\"text\":\"LAW: an echoed frame must not become two separate records\"},{\"type\":\"text\",\"text\":\"LAW: an echoed frame must not become two separate records\"}]}\n" as *u8) 863 sys_write(tfd2, tb2, to2) 864 sys_close(tfd2) 865 let lcx2: *i64 = sys_mmap(64) as *i64 866 let lgot: i64 = ch_learn(lt, "lw" as *u8, lo2, lc, lcx2) 867 let lb2: *u8 = sys_mmap(CH_JWIN) 868 let ln2: i64 = ch_read(lo2, lb2, CH_JWIN - 8) 869 var ok23: i64 = 0 870 if ln2 > 0 { if ch_find(lb2, ln2, "\"rank\":6" as *u8) == 1 { ok23 = 1 } } 871 gv_check("T23 learn captures a LAW: PROSE line at rank 6 (the thing frames/delta never could)" as *u8, ok23, ctr) 872 var ok24: i64 = 1 873 if ln2 > 0 { if ch_find(lb2, ln2, "looked at it for a while" as *u8) == 1 { ok24 = 0 } } 874 gv_check("T24 NEG-CONTROL: unmarked prose ABOVE min_len is REJECTED -- the ranker can fail" as *u8, ok24, ctr) 875 var ok25: i64 = 1 876 if ln2 > 0 { if ch_find(lb2, ln2, "Edit" as *u8) == 1 { ok25 = 0 } } 877 gv_check("T25 learn ignores tool_use frames entirely -- learn is not a second frames" as *u8, ok25, ctr) 878 var ok26: i64 = 0 879 if lcx2[1] >= 2 { ok26 = 1 } 880 gv_check("T26 markers/weights come from the conf file, never compiled in (rule 11)" as *u8, ok26, ctr) 881 var ok27: i64 = 0 882 if ln2 > 0 { if ch_find(lb2, ln2, "\"rank\":4" as *u8) == 1 { ok27 = 1 } } 883 gv_check("T27 a 4-star run ranks 4 -- multi-byte glyph run counted as bytes, not chars" as *u8, ok27, ctr) 884 var ok28: i64 = 0 885 if lgot == 3 { ok28 = 1 } 886 gv_check("T28 exactly 3 of 6 transcript lines clear the floor (kept count is not a dump)" as *u8, ok28, ctr) 887 var ok29: i64 = 1 888 if ln2 > 0 { if ch_find(lb2, ln2, "axes run 0..1000" as *u8) == 1 { ok29 = 0 } } 889 gv_check("T29 WORD BOUNDARY: UNMEASURED does not match the marker MEASURED (substring flattery)" as *u8, ok29, ctr) 890 var ok30: i64 = 0 891 var dcount: i64 = 0 892 var dp: i64 = 0 893 while dp < ln2 { 894 let dq: i64 = ch_find_from(lb2, dp, ln2, "an echoed frame must not become" as *u8) 895 if dq < 0 { dp = ln2 } else { dcount = dcount + 1; dp = dq + 20 } 896 } 897 if dcount == 1 { ok30 = 1 } 898 gv_check("T30 an echoed payload emits ONCE, not twice (adjacent-duplicate suppression)" as *u8, ok30, ctr) 899 let rc: i64 = gv_verdict("CLAWHARV-GATE" as *u8, ctr, "transcript parse + delta hwm + ingest + gauge + page + propose + bootgauge teeth green" as *u8) 900 return rc 901} 902 903// ---------- learn: LEARNING-TEXT harvest (root fix for debt 1785525736) ---------- 904// Every other verb in this organ extracts "type":"tool_use" NAMES. That is tool TELEMETRY, not 905// learning capture: ch_frame_write puts '-' in the two columns where a lesson would go, and the 906// 6-hourly beat reported fail=0 for weeks while moving ZERO learnings, over transcripts holding 907// ~40k LAW:/LESSON/ROOT CAUSE/FINDING: statements. This verb reads the PROSE instead -- the "text" 908// payloads written by the assistant and the operator -- ranks each line, and keeps only what clears 909// the floor. Because it CAN reject plain prose, its output is evidence rather than a transcript dump. 910// Rule 11: every marker, weight and floor is loaded from a conf file. No weight is written in code. 911const CH_MK_MAX: i64 = 64 912const CH_CONF_WIN: i64 = 65536 913const CH_TXTWIN: i64 = 262144 914 915// longest run of CONSECUTIVE occurrences of a (possibly multi-byte) glyph in q[s..e) 916// the star/warn glyphs are 3-byte UTF-8, so this compares byte sequences, never single chars. 917func ch_run_of(q: *u8, s: i64, e: i64, g: *u8) -> i64 { 918 let gl: i64 = sj_vlen(g) 919 if gl <= 0 { return 0 } 920 var best: i64 = 0 921 var i: i64 = s 922 while i < e { 923 var run: i64 = 0 924 var j: i64 = i 925 var go: i64 = 1 926 while go == 1 { 927 if j + gl > e { go = 0 } else { 928 var k: i64 = 0 929 var same: i64 = 1 930 while k < gl { 931 if q[j+k] != g[k] { same = 0; k = gl } else { k = k + 1 } 932 } 933 if same == 1 { run = run + 1; j = j + gl } else { go = 0 } 934 } 935 } 936 if run > best { best = run } 937 if run > 0 { i = j } else { i = i + 1 } 938 } 939 return best 940} 941 942// conf loader. mk is INTERLEAVED (mk[2k]=literal offset into cbuf, mk[2k+1]=weight) so this stays 943// at 4 params; sc carries the scalars: 0=warn_bonus 1=min_rank 2=min_len 3=max_len 4=star_off 944// 5=warn_off 6=star_max 7=marker_count. Returns marker count, or -1 if the conf cannot be read -- 945// FAIL-CLOSED: no conf means no ranking basis, so the verb refuses rather than inventing weights. 946func ch_conf_load(path: *u8, cbuf: *u8, mk: *i64, sc: *i64) -> i64 { 947 let n: i64 = ch_read(path, cbuf, CH_CONF_WIN - 8) 948 if n <= 0 { return 0 - 1 } 949 sc[0] = 2 950 sc[1] = 3 951 sc[2] = 40 952 sc[3] = 400 953 sc[4] = 0 - 1 954 sc[5] = 0 - 1 955 sc[6] = 6 956 var cnt: i64 = 0 957 var i: i64 = 0 958 while i < n { 959 let le: i64 = sj_le(cbuf, i, n) 960 if cbuf[i] != (35 as u8) { 961 if ch_starts(cbuf, i, le, "marker=" as *u8) == 1 { 962 if cnt < CH_MK_MAX { 963 let vs: i64 = i + 7 964 var bar: i64 = 0 - 1 965 var p: i64 = vs 966 while p < le { if cbuf[p] == (124 as u8) { bar = p } p = p + 1 } 967 if bar > vs { 968 cbuf[bar] = 0 as u8 969 cbuf[le] = 0 as u8 970 mk[cnt*2] = vs 971 mk[cnt*2+1] = sj_atoi_z(((cbuf as i64) + bar + 1) as *u8) 972 cnt = cnt + 1 973 } 974 } 975 } 976 if ch_starts(cbuf, i, le, "star_char=" as *u8) == 1 { cbuf[le] = 0 as u8; sc[4] = i + 10 } 977 if ch_starts(cbuf, i, le, "warn_char=" as *u8) == 1 { cbuf[le] = 0 as u8; sc[5] = i + 10 } 978 if ch_starts(cbuf, i, le, "warn_bonus=" as *u8) == 1 { cbuf[le] = 0 as u8; sc[0] = sj_atoi_z(((cbuf as i64) + i + 11) as *u8) } 979 if ch_starts(cbuf, i, le, "min_rank_store=" as *u8) == 1 { cbuf[le] = 0 as u8; sc[1] = sj_atoi_z(((cbuf as i64) + i + 15) as *u8) } 980 if ch_starts(cbuf, i, le, "min_len=" as *u8) == 1 { cbuf[le] = 0 as u8; sc[2] = sj_atoi_z(((cbuf as i64) + i + 8) as *u8) } 981 if ch_starts(cbuf, i, le, "max_len=" as *u8) == 1 { cbuf[le] = 0 as u8; sc[3] = sj_atoi_z(((cbuf as i64) + i + 8) as *u8) } 982 if ch_starts(cbuf, i, le, "star_max=" as *u8) == 1 { cbuf[le] = 0 as u8; sc[6] = sj_atoi_z(((cbuf as i64) + i + 9) as *u8) } 983 } 984 i = le + 1 985 } 986 sc[7] = cnt 987 return cnt 988} 989 990// a marker must sit on a WORD BOUNDARY. Measured on real prose: the naive substring test scored 991// "UNMEASURED" as the marker "MEASURED" and promoted a doc line to rank 3 -- a substring needle 992// flatters silently. Only the left edge needs guarding (markers are prefixes like "LAW:"). 993func ch_isalpha(c: u8) -> i64 { 994 if c >= (65 as u8) { if c <= (90 as u8) { return 1 } } 995 if c >= (97 as u8) { if c <= (122 as u8) { return 1 } } 996 return 0 997} 998 999// rank = the MAX of the signals, never the mean (banked law): a star run is the operator's own 1000// ranking convention, a warn glyph is a callout worth rank+bonus, and marker phrases carry their 1001// configured weight. Capped at star_max so a decorative row of stars cannot outrank a real law. 1002func ch_rank_text(q: *u8, s: i64, e: i64, cbuf: *u8, mk: *i64, sc: *i64) -> i64 { 1003 var r: i64 = 0 1004 if sc[4] >= 0 { 1005 let sr: i64 = ch_run_of(q, s, e, ((cbuf as i64) + sc[4]) as *u8) 1006 if sr > r { r = sr } 1007 } 1008 if sc[5] >= 0 { 1009 let wr: i64 = ch_run_of(q, s, e, ((cbuf as i64) + sc[5]) as *u8) 1010 if wr > 0 { let wv: i64 = wr + sc[0]; if wv > r { r = wv } } 1011 } 1012 var k: i64 = 0 1013 while k < sc[7] { 1014 let lit: *u8 = ((cbuf as i64) + mk[k*2]) as *u8 1015 var from: i64 = s 1016 var hit: i64 = 0 1017 while hit == 0 { 1018 let hp: i64 = ch_find_from(q, from, e, lit) 1019 if hp < 0 { hit = 0 - 1 } else { 1020 var okb: i64 = 1 1021 if hp > s { if ch_isalpha(q[hp-1]) == 1 { okb = 0 } } 1022 if okb == 1 { hit = 1 } else { from = hp + 1 } 1023 } 1024 } 1025 if hit == 1 { if mk[k*2+1] > r { r = mk[k*2+1] } } 1026 k = k + 1 1027 } 1028 if r > sc[6] { r = sc[6] } 1029 return r 1030} 1031 1032func ch_learn(tpath: *u8, ws: *u8, outp: *u8, confp: *u8, cx: *i64) -> i64 { 1033 let cbuf: *u8 = sys_mmap(CH_CONF_WIN) 1034 let mk: *i64 = sys_mmap(CH_MK_MAX * 16) as *i64 1035 let sc: *i64 = sys_mmap(128) as *i64 1036 let cnt: i64 = ch_conf_load(confp, cbuf, mk, sc) 1037 if cnt < 0 { return 0 - 4 } 1038 cx[1] = cnt 1039 let buf: *u8 = sys_mmap(CH_WIN) 1040 let cap: i64 = CH_WIN - 8 1041 let n: i64 = ch_read(tpath, buf, cap) 1042 cx[0] = 0 1043 if n <= 0 { return 0 - 1 } 1044 if n >= cap { cx[0] = 1 } 1045 let fd: i64 = sys_openat_append(outp, CH_MODE_644) 1046 if fd < 0 { return 0 - 3 } 1047 let tb: *u8 = sys_mmap(CH_TXTWIN) 1048 let ob: *u8 = sys_mmap(CH_TXTWIN) 1049 // last emitted segment. A real transcript frame carries the same assistant text more than once 1050 // (the message and its echo), so without this the organ emits provable duplicates -- measured 2 1051 // identical records from one real line. Adjacent-compare, not a full set: the echo is adjacent. 1052 let pb: *u8 = sys_mmap(CH_TXTWIN) 1053 var pl: i64 = 0 1054 var kept: i64 = 0 1055 var i: i64 = 0 1056 while i < n { 1057 let le: i64 = sj_le(buf, i, n) 1058 var ts: i64 = 0 1059 let tp: i64 = ch_find_from(buf, i, le, "\"timestamp\":\"" as *u8) 1060 if tp >= 0 { ts = ch_iso_epoch(buf, tp + 13, le) } 1061 var j: i64 = i 1062 var go: i64 = 1 1063 while go == 1 { 1064 let xp: i64 = ch_find_from(buf, j, le, "\"text\":\"" as *u8) 1065 if xp < 0 { go = 0 } else { 1066 var p: i64 = xp + 8 1067 var to: i64 = 0 1068 var g2: i64 = 1 1069 while g2 == 1 { 1070 if p >= le { g2 = 0 } else { 1071 let c: u8 = buf[p] 1072 if c == (34 as u8) { g2 = 0 } else { 1073 if c == (92 as u8) { 1074 let d2: u8 = buf[p+1] 1075 var em: u8 = d2 1076 if d2 == (110 as u8) { em = 10 as u8 } 1077 if d2 == (116 as u8) { em = 32 as u8 } 1078 if d2 == (114 as u8) { em = 32 as u8 } 1079 if to < CH_TXTWIN - 4 { tb[to] = em; to = to + 1 } 1080 p = p + 2 1081 } else { 1082 if to < CH_TXTWIN - 4 { tb[to] = c; to = to + 1 } 1083 p = p + 1 1084 } 1085 } 1086 } 1087 } 1088 var q: i64 = 0 1089 while q < to { 1090 let qe: i64 = sj_le(tb, q, to) 1091 let seg: i64 = qe - q 1092 if seg >= sc[2] { 1093 var endq: i64 = qe 1094 if seg > sc[3] { endq = q + sc[3] } 1095 let r: i64 = ch_rank_text(tb, q, endq, cbuf, mk, sc) 1096 var dup: i64 = 0 1097 if pl == (endq - q) { 1098 var z: i64 = 0 1099 var sm: i64 = 1 1100 while z < pl { if pb[z] != tb[q+z] { sm = 0; z = pl } else { z = z + 1 } } 1101 if sm == 1 { dup = 1 } 1102 } 1103 if r >= sc[1] { if dup == 0 { 1104 var o: i64 = sj_cat(ob, 0, "{\"ts\":" as *u8) 1105 o = sj_catn(ob, o, ts) 1106 o = sj_cat(ob, o, ",\"ws\":\"" as *u8) 1107 o = sj_cat(ob, o, ws) 1108 o = sj_cat(ob, o, "\",\"src\":\"transcript\",\"rank\":" as *u8) 1109 o = sj_catn(ob, o, r) 1110 o = sj_cat(ob, o, ",\"text\":\"" as *u8) 1111 var k2: i64 = q 1112 while k2 < endq { 1113 let c2: u8 = tb[k2] 1114 if c2 == (34 as u8) { ob[o] = 92 as u8; o = o + 1; ob[o] = 34 as u8; o = o + 1 } else { 1115 if c2 == (92 as u8) { ob[o] = 92 as u8; o = o + 1; ob[o] = 92 as u8; o = o + 1 } else { 1116 if c2 < (32 as u8) { ob[o] = 32 as u8; o = o + 1 } else { ob[o] = c2; o = o + 1 } 1117 } 1118 } 1119 k2 = k2 + 1 1120 } 1121 o = sj_cat(ob, o, "\"}" as *u8) 1122 ob[o] = 10 as u8 1123 sys_write(fd, ob, o + 1) 1124 pl = endq - q 1125 var z3: i64 = 0 1126 while z3 < pl { pb[z3] = tb[q+z3]; z3 = z3 + 1 } 1127 kept = kept + 1 1128 } } 1129 } 1130 q = qe + 1 1131 } 1132 j = p + 1 1133 } 1134 } 1135 i = le + 1 1136 } 1137 sys_close(fd) 1138 return kept 1139} 1140 1141func main(argc: i64, argv: *i64) -> i64 { 1142 if argc < 3 { sj_puts("usage: nx_claude_harvest {frames <transcript.jsonl> <ws> <outjournal> | delta <transcript.jsonl> <ws> <outjournal> <hwmfile> | ingest <framesfile> <journal> | gauge <journal> [days] | page <journal> <outfile> [days] | propose <journal> <intake_jrnl> <threshold_permil> [filer] | bootgauge <framesjournal> [k] | learn <transcript.jsonl> <ws> <outfile> <markersconf> | selftest <scratch-prefix>}\n" as *u8); sys_exit(2); return 2 } 1143 let verb: *u8 = argv[1] as *u8 1144 let vl: i64 = sj_vlen(verb) 1145 if sj_lit_eq(verb, 0, vl, "selftest" as *u8) == 1 { 1146 let rc: i64 = ch_selftest(argv[2] as *u8) 1147 sys_exit(rc) 1148 return rc 1149 } 1150 if sj_lit_eq(verb, 0, vl, "bootgauge" as *u8) == 1 { 1151 var k: i64 = 3 1152 if argc >= 4 { let kz: i64 = sj_atoi_z(argv[3] as *u8); if kz > 0 { k = kz } } 1153 let d: *u8 = sys_mmap(CH_OUT) 1154 let dl: i64 = ch_bootgauge(argv[2] as *u8, k, d) 1155 sys_write(1, d, dl) 1156 sys_exit(0) 1157 return 0 1158 } 1159 if sj_lit_eq(verb, 0, vl, "learn" as *u8) == 1 { 1160 if argc < 6 { sj_puts("learn needs <transcript.jsonl> <ws> <outfile> <markersconf>\n" as *u8); sys_exit(2); return 2 } 1161 let lcx: *i64 = sys_mmap(64) as *i64 1162 let lg: i64 = ch_learn(argv[2] as *u8, argv[3] as *u8, argv[4] as *u8, argv[5] as *u8, lcx) 1163 if lg < 0 { sj_puts("LEARN FAIL rc=" as *u8); let eb4: *u8 = sys_mmap(32); var e4: i64 = sj_catn(eb4, 0, lg); eb4[e4] = 10 as u8; sys_write(1, eb4, e4 + 1); sys_exit(1); return 1 } 1164 let ob4: *u8 = sys_mmap(256) 1165 var o4: i64 = sj_cat(ob4, 0, "LEARN OK kept=" as *u8) 1166 o4 = sj_catn(ob4, o4, lg) 1167 o4 = sj_cat(ob4, o4, " markers=" as *u8) 1168 o4 = sj_catn(ob4, o4, lcx[1]) 1169 o4 = sj_cat(ob4, o4, " truncated=" as *u8) 1170 o4 = sj_catn(ob4, o4, lcx[0]) 1171 ob4[o4] = 10 as u8 1172 sys_write(1, ob4, o4 + 1) 1173 sys_exit(0) 1174 return 0 1175 } 1176 if sj_lit_eq(verb, 0, vl, "frames" as *u8) == 1 { 1177 if argc < 5 { sj_puts("frames needs <transcript.jsonl> <ws> <outjournal>\n" as *u8); sys_exit(2); return 2 } 1178 let tcx: *i64 = sys_mmap(16) as *i64 1179 let got: i64 = ch_frames(argv[2] as *u8, argv[3] as *u8, argv[4] as *u8, tcx) 1180 if got < 0 { sj_puts("HARVEST FAIL rc=" as *u8); let eb: *u8 = sys_mmap(32); var eo: i64 = sj_catn(eb, 0, got); eb[eo] = 10 as u8; sys_write(1, eb, eo + 1); sys_exit(1); return 1 } 1181 let ob: *u8 = sys_mmap(256) 1182 var oo: i64 = sj_cat(ob, 0, "HARVEST OK frames=" as *u8) 1183 oo = sj_catn(ob, oo, got) 1184 oo = sj_cat(ob, oo, " truncated=" as *u8) 1185 oo = sj_catn(ob, oo, tcx[0]) 1186 ob[oo] = 10 as u8 1187 sys_write(1, ob, oo + 1) 1188 sys_exit(0) 1189 return 0 1190 } 1191 if sj_lit_eq(verb, 0, vl, "ingest" as *u8) == 1 { 1192 if argc < 4 { sj_puts("ingest needs <framesfile> <journal>\n" as *u8); sys_exit(2); return 2 } 1193 let mcx: *i64 = sys_mmap(16) as *i64 1194 let r: i64 = ch_ingest(argv[2] as *u8, argv[3] as *u8, mcx) 1195 if r == (0 - 2) { sj_puts("ALREADY-INGESTED (marker present, journal untouched)\n" as *u8); sys_exit(0); return 0 } 1196 if r == (0 - 3) { sj_puts("REFUSED journal window exceeded, idempotence unverifiable\n" as *u8); sys_exit(3); return 3 } 1197 if r < 0 { sj_puts("INGEST FAIL rc=" as *u8); let eb2: *u8 = sys_mmap(32); var e2: i64 = sj_catn(eb2, 0, r); eb2[e2] = 10 as u8; sys_write(1, eb2, e2 + 1); sys_exit(1); return 1 } 1198 let ob2: *u8 = sys_mmap(256) 1199 var o2: i64 = sj_cat(ob2, 0, "INGEST OK frames=" as *u8) 1200 o2 = sj_catn(ob2, o2, r) 1201 o2 = sj_cat(ob2, o2, " malformed=" as *u8) 1202 o2 = sj_catn(ob2, o2, mcx[0]) 1203 ob2[o2] = 10 as u8 1204 sys_write(1, ob2, o2 + 1) 1205 sys_exit(0) 1206 return 0 1207 } 1208 if sj_lit_eq(verb, 0, vl, "gauge" as *u8) == 1 { 1209 var days: i64 = 0 1210 if argc >= 4 { days = sj_atoi_z(argv[3] as *u8) } 1211 let d: *u8 = sys_mmap(CH_OUT) 1212 let dl: i64 = ch_gauge_json(argv[2] as *u8, days, d) 1213 sys_write(1, d, dl) 1214 sys_exit(0) 1215 return 0 1216 } 1217 if sj_lit_eq(verb, 0, vl, "page" as *u8) == 1 { 1218 if argc < 4 { sj_puts("page needs <journal> <outfile> [days]\n" as *u8); sys_exit(2); return 2 } 1219 var days2: i64 = 0 1220 if argc >= 5 { days2 = sj_atoi_z(argv[4] as *u8) } 1221 let rp: i64 = ch_page(argv[2] as *u8, argv[3] as *u8, days2) 1222 if rp != 0 { sj_puts("PAGE FAIL\n" as *u8); sys_exit(1); return 1 } 1223 sj_puts("PAGE OK\n" as *u8) 1224 sys_exit(0) 1225 return 0 1226 } 1227 if sj_lit_eq(verb, 0, vl, "delta" as *u8) == 1 { 1228 if argc < 6 { sj_puts("delta needs <transcript.jsonl> <ws> <outjournal> <hwmfile>\n" as *u8); sys_exit(2); return 2 } 1229 let hcx: *i64 = sys_mmap(64) as *i64 1230 let r: i64 = ch_delta(argv[2] as *u8, argv[3] as *u8, argv[4] as *u8, argv[5] as *u8, hcx) 1231 if r < 0 { sj_puts("DELTA FAIL (missing transcript or unwritable journal)\n" as *u8); sys_exit(1); return 1 } 1232 let ob: *u8 = sys_mmap(256) 1233 var oo: i64 = sj_cat(ob, 0, "DELTA OK frames=" as *u8) 1234 oo = sj_catn(ob, oo, hcx[0]) 1235 oo = sj_cat(ob, oo, " from_hwm=" as *u8) 1236 oo = sj_catn(ob, oo, hcx[2]) 1237 oo = sj_cat(ob, oo, " new_hwm=" as *u8) 1238 oo = sj_catn(ob, oo, hcx[1]) 1239 oo = sj_cat(ob, oo, " truncated=" as *u8) 1240 oo = sj_catn(ob, oo, hcx[3]) 1241 ob[oo] = 10 as u8 1242 sys_write(1, ob, oo + 1) 1243 sys_exit(0) 1244 return 0 1245 } 1246 if sj_lit_eq(verb, 0, vl, "propose" as *u8) == 1 { 1247 if argc < 5 { sj_puts("propose needs <journal> <intake_jrnl> <threshold_permil> [filer]\n" as *u8); sys_exit(2); return 2 } 1248 let thr: i64 = sj_atoi_z(argv[4] as *u8) 1249 let filer: *u8 = sys_mmap(128) 1250 var fo: i64 = 0 1251 if argc >= 6 { fo = sj_cat(filer, 0, argv[5] as *u8) } else { fo = sj_cat(filer, 0, "nx_pm_intake" as *u8) } 1252 filer[fo] = 0 as u8 1253 let co: *u8 = sys_mmap(CH_OUT) 1254 let cl: *i64 = sys_mmap(16) as *i64 1255 let r: i64 = ch_propose(argv[2] as *u8, argv[3] as *u8, thr, filer, co, cl) 1256 if r == 0 { sj_puts("PROPOSED " as *u8); if cl[0] > 0 { sys_write(1, co, cl[0]) } sj_puts("\n" as *u8); sys_exit(0); return 0 } 1257 if r == 2 { sj_puts("BELOW-THRESHOLD\n" as *u8); sys_exit(0); return 0 } 1258 if r == 4 { sj_puts("ALREADY-PROPOSED (marker present)\n" as *u8); sys_exit(0); return 0 } 1259 if r == 5 { sj_puts("SKIP-INSUFFICIENT (no frames)\n" as *u8); sys_exit(0); return 0 } 1260 if r == 3 { sj_puts("REFUSED intake window exceeded\n" as *u8); sys_exit(3); return 3 } 1261 sj_puts("PROPOSE FAIL (filer)\n" as *u8) 1262 sys_exit(1) 1263 return 1 1264 } 1265 sj_puts("unknown verb\n" as *u8) 1266 sys_exit(2) 1267 return 2 1268}