code wiki / (root) / nx_crashresume_census.nx

nx_crashresume_census.nx source

↩ module page · 208 lines · 8957 B

1// nx_crashresume_census.nx -- ONE-SHOT crash-resume census CLI (CR-R0, crash-resume->SOTA roadmap 2// 2026-07-15). Measures whether the workstream capture plane is LIVE so a crash costs minutes, not 3// hand archaeology: HEARTBEAT staleness + REGISTRY staleness + CAPTURE lag (sessions vs captured 4// state) + MEMORY lag (sessions vs banked memory). Prints per-cell verdicts + permille and appends 5// one summary line to knowledge/status/crashresume_census.log (append-only journal). 6// usage: nx_crashresume_census [conf] [hb_log] [reg_path] [sessions_dir] [memory_dir] 7// conf rows: "hb_window_sec N" / "reg_window_sec N" / "cap_window_sec N" / "mem_window_sec N" 8// ('#' comments; malformed rows dropped fail-safe). No conf -> documented defaults below (the 9// conf is the rule-11 lever; defaults exist so a read-only census still runs on a bare tree). 10// Missing evidence -> UNKNOWN, never fabricated. ALWAYS exits 0 (a census must never fail its 11// caller); the verdict lives in the output + journal. Read-only apart from the journal append. 12// license_tier: ORIGINAL expect_exit: 0 13import "nx_syscalls.nx" 14import "nx_crashresume_census_core.nx" 15const K_MAGIC_86400: i64 = 86400 16const K_MAGIC_3600: i64 = 3600 17const K_MAGIC_8192: i64 = 8192 18const K_MAGIC_8191: i64 = 8191 19const K_MAGIC_262144: i64 = 262144 20const K_MAGIC_262143: i64 = 262143 21const K_MAGIC_1024: i64 = 1024 22 23func c_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 24 25func c_putn(v: i64) -> i64 { 26 let b: *u8 = sys_mmap(32) 27 let e: i64 = ccz_cat_num(b, 0, v) 28 sys_write(1, b, e) 29 return 0 30} 31 32func c_vname(v: i64) -> *u8 { 33 if v == CR_GREEN { return "GREEN" as *u8 } 34 if v == CR_RED { return "RED" as *u8 } 35 return "UNKNOWN" as *u8 36} 37 38// does buf[ws..we) equal the NUL-terminated key? 39func c_word_is(buf: *u8, ws: i64, we: i64, key: *u8) -> i64 { 40 let kl: i64 = ccz_slen(key) 41 if we - ws != kl { return 0 } 42 var i: i64 = 0 43 while i < kl { if buf[ws+i] != key[i] { return 0 } i = i + 1 } 44 return 1 45} 46 47// print one cell line: CRZ cell=<name> ts=<ts> age_s=<age|-1> window=<w> v=<verdict> 48func c_cell(name: *u8, ts: i64, now: i64, w: i64, v: i64) -> i64 { 49 c_puts("CRZ cell=" as *u8) 50 c_puts(name) 51 c_puts(" ts=" as *u8) 52 c_putn(ts) 53 c_puts(" age_s=" as *u8) 54 if ts > 0 { c_putn(now - ts) } else { c_putn(0 - 1) } 55 c_puts(" window=" as *u8) 56 c_putn(w) 57 c_puts(" v=" as *u8) 58 c_puts(c_vname(v)) 59 c_puts("\n" as *u8) 60 return 0 61} 62 63func main(argc: i64, argv: *i64) -> i64 { 64 var confp: *u8 = "knowledge/crashresume_census.conf" as *u8 65 var hbp: *u8 = "knowledge/status/wms_heartbeat.log" as *u8 66 var regp: *u8 = "knowledge/store/ws-manifest.txt" as *u8 67 var sesp: *u8 = "/mnt/c/Users/elder/.claude/projects/C--Users-elder" as *u8 68 var memp: *u8 = "/mnt/c/Users/elder/.claude/projects/C--Users-elder/memory" as *u8 69 if argc >= 2 { confp = argv[1] as *u8 } 70 if argc >= 3 { hbp = argv[2] as *u8 } 71 if argc >= 4 { regp = argv[3] as *u8 } 72 if argc >= 5 { sesp = argv[4] as *u8 } 73 if argc >= 6 { memp = argv[5] as *u8 } 74 75 // default windows (overridden by conf rows -- the config lever) 76 var hb_w: i64 = K_MAGIC_86400 77 var reg_w: i64 = K_MAGIC_86400 78 var cap_w: i64 = K_MAGIC_3600 79 var mem_w: i64 = K_MAGIC_86400 80 81 let conf: *u8 = sys_mmap(K_MAGIC_8192) 82 let cn: i64 = ccz_read(confp, conf, K_MAGIC_8191) 83 if cn > 0 { 84 let ep: *i64 = sys_mmap(16) as *i64 85 var ls: i64 = 0 86 while ls < cn { 87 var le: i64 = ls 88 var go: i64 = 1 89 while go == 1 { go = 0; if le < cn { if conf[le] != (10 as u8) { le = le + 1; go = 1 } } } 90 // skip leading ws 91 var i: i64 = ls 92 go = 1 93 while go == 1 { go = 0; if i < le { let c: i64 = conf[i] as i64; if c == 32 { i = i + 1; go = 1 } else { if c == 9 { i = i + 1; go = 1 } } } } 94 if i < le { if conf[i] != (35 as u8) { 95 let ws: i64 = i 96 go = 1 97 while go == 1 { go = 0; if i < le { let c: i64 = conf[i] as i64; if c != 32 { if c != 9 { i = i + 1; go = 1 } } } } 98 let we: i64 = i 99 go = 1 100 while go == 1 { go = 0; if i < le { let c: i64 = conf[i] as i64; if c == 32 { i = i + 1; go = 1 } else { if c == 9 { i = i + 1; go = 1 } } } } 101 let v: i64 = ccz_num_at(conf, le, i, ep) 102 if v >= 1 { 103 if c_word_is(conf, ws, we, "hb_window_sec" as *u8) == 1 { hb_w = v } 104 if c_word_is(conf, ws, we, "reg_window_sec" as *u8) == 1 { reg_w = v } 105 if c_word_is(conf, ws, we, "cap_window_sec" as *u8) == 1 { cap_w = v } 106 if c_word_is(conf, ws, we, "mem_window_sec" as *u8) == 1 { mem_w = v } 107 } 108 } } 109 ls = le + 1 110 } 111 } 112 113 let now: i64 = sys_now_realtime_sec() 114 115 // CELL 1: heartbeat staleness (content epochs -- wall-clock ground truth written by beaters) 116 let hbbuf: *u8 = sys_mmap(K_MAGIC_262144) 117 let hn: i64 = ccz_read(hbp, hbbuf, K_MAGIC_262143) 118 var hb_ts: i64 = 0 119 if hn > 0 { hb_ts = ccz_max_epoch(hbbuf, hn) } 120 let v_hb: i64 = ccz_stale_verdict(hb_ts, now, hb_w) 121 122 // CELL 2: registry SSOT staleness (manifest mtime) 123 let reg_ts: i64 = ccz_mtime(regp) 124 let v_reg: i64 = ccz_stale_verdict(reg_ts, now, reg_w) 125 126 // CELL 3: capture lag -- newest session transcript vs newest captured state (hb or registry) 127 let ses_ts: i64 = ccz_newest_mtime_ext(sesp, ".jsonl" as *u8) 128 let cap_ts: i64 = ccz_max(hb_ts, reg_ts) 129 let v_cap: i64 = ccz_lag_verdict(ses_ts, cap_ts, cap_w) 130 131 // CELL 4: memory lag -- newest session transcript vs newest banked memory file 132 let mem_ts: i64 = ccz_newest_mtime_ext(memp, ".md" as *u8) 133 let v_mem: i64 = ccz_lag_verdict(ses_ts, mem_ts, mem_w) 134 135 c_puts("CRZ now=" as *u8) 136 c_putn(now) 137 c_puts("\n" as *u8) 138 c_cell("heartbeat" as *u8, hb_ts, now, hb_w, v_hb) 139 c_cell("registry" as *u8, reg_ts, now, reg_w, v_reg) 140 c_puts("CRZ cell=capture_lag ses_ts=" as *u8) 141 c_putn(ses_ts) 142 c_puts(" cap_ts=" as *u8) 143 c_putn(cap_ts) 144 c_puts(" lag_s=" as *u8) 145 if ses_ts > 0 { if cap_ts > 0 { c_putn(ses_ts - cap_ts) } else { c_putn(0 - 1) } } else { c_putn(0 - 1) } 146 c_puts(" window=" as *u8) 147 c_putn(cap_w) 148 c_puts(" v=" as *u8) 149 c_puts(c_vname(v_cap)) 150 c_puts("\n" as *u8) 151 c_puts("CRZ cell=memory_lag ses_ts=" as *u8) 152 c_putn(ses_ts) 153 c_puts(" mem_ts=" as *u8) 154 c_putn(mem_ts) 155 c_puts(" lag_s=" as *u8) 156 if ses_ts > 0 { if mem_ts > 0 { c_putn(ses_ts - mem_ts) } else { c_putn(0 - 1) } } else { c_putn(0 - 1) } 157 c_puts(" window=" as *u8) 158 c_putn(mem_w) 159 c_puts(" v=" as *u8) 160 c_puts(c_vname(v_mem)) 161 c_puts("\n" as *u8) 162 163 var greens: i64 = 0 164 var reds: i64 = 0 165 var unknowns: i64 = 0 166 if v_hb == CR_GREEN { greens = greens + 1 } else { if v_hb == CR_RED { reds = reds + 1 } else { unknowns = unknowns + 1 } } 167 if v_reg == CR_GREEN { greens = greens + 1 } else { if v_reg == CR_RED { reds = reds + 1 } else { unknowns = unknowns + 1 } } 168 if v_cap == CR_GREEN { greens = greens + 1 } else { if v_cap == CR_RED { reds = reds + 1 } else { unknowns = unknowns + 1 } } 169 if v_mem == CR_GREEN { greens = greens + 1 } else { if v_mem == CR_RED { reds = reds + 1 } else { unknowns = unknowns + 1 } } 170 let permille: i64 = greens * 1000 / 4 171 var verdict: *u8 = "GREEN" as *u8 172 if unknowns > 0 { verdict = "UNKNOWN" as *u8 } 173 if reds > 0 { verdict = "RED" as *u8 } 174 175 // summary line -> stdout + append-only journal 176 let line: *u8 = sys_mmap(K_MAGIC_1024) 177 var o: i64 = 0 178 o = ccz_cat_str(line, o, "CRZ-SUM ts=" as *u8) 179 o = ccz_cat_num(line, o, now) 180 o = ccz_cat_str(line, o, " permille=" as *u8) 181 o = ccz_cat_num(line, o, permille) 182 o = ccz_cat_str(line, o, " green=" as *u8) 183 o = ccz_cat_num(line, o, greens) 184 o = ccz_cat_str(line, o, " red=" as *u8) 185 o = ccz_cat_num(line, o, reds) 186 o = ccz_cat_str(line, o, " unknown=" as *u8) 187 o = ccz_cat_num(line, o, unknowns) 188 o = ccz_cat_str(line, o, " hb=" as *u8) 189 o = ccz_cat_str(line, o, c_vname(v_hb)) 190 o = ccz_cat_str(line, o, " reg=" as *u8) 191 o = ccz_cat_str(line, o, c_vname(v_reg)) 192 o = ccz_cat_str(line, o, " cap=" as *u8) 193 o = ccz_cat_str(line, o, c_vname(v_cap)) 194 o = ccz_cat_str(line, o, " mem=" as *u8) 195 o = ccz_cat_str(line, o, c_vname(v_mem)) 196 o = ccz_cat_str(line, o, " verdict=" as *u8) 197 o = ccz_cat_str(line, o, verdict) 198 o = ccz_cat_str(line, o, "\n" as *u8) 199 sys_write(1, line, o) 200 let lfd: i64 = sys_openat_append("knowledge/status/crashresume_census.log" as *u8, 420) 201 if lfd >= 0 { 202 sys_write(lfd, line, o) 203 sys_close(lfd) 204 } else { 205 c_puts("CRZ note=journal-open-failed (stdout only)\n" as *u8) 206 } 207 return 0 208}