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, "‰</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}