code wiki / _hdl_build / nx_memhealth.nx

nx_memhealth.nx source

↩ module page · 719 lines · 27916 B

1// nx_memhealth.nx -- SOVEREIGN health instrument for the laptop-local memory corpus. READ-ONLY. 2// 3// CONVERTED TO nx_memplane_lib 2026-08-07. It now owns only the analysis -- document frequency, the 4// duplicate ladder, the series and co-authorship discriminators, the cross-name index. Walk, name 5// table, link scanner, read, join and the derived-artefact test come from the lib. 6// ⚠THIS ORGAN WAS THE THIRD VICTIM of the dump-suppression bug, precisely because it kept a private 7// hardcoded list while its siblings were converted. The conversion retires that list. 8// 9// WHY IT EXISTS 10// ------------- 11// nx_memcliff keeps MEMORY.md under the harness cliff (25,000 B / 200 lines, both measured). But the 12// index exists to make memories FINDABLE, and a 25,000 B ceiling can only ever NAME about 35 files 13// out of 2,181. Everything else is reached by following links, or not at all -- which makes link 14// integrity the whole retrieval system, and nothing was measuring it. 15// 16// WHAT IT MEASURES (each a defect, not a statistic) 17// * DANGLING FROM THE INDEX -- a pointer in MEMORY.md to a file that does not exist. Every session 18// reads that file, so its pointers are the only ones GUARANTEED to be followed. Gate condition. 19// * DANGLING ANYWHERE -- 373 corpus-wide; the file the index labels "Read FIRST" emitted 11 alone. 20// * ORPHANS -- 581 files nothing points to. Written, then unreachable. 21// * DUPLICATE CANDIDATES -- the ladder below. 22// 23// THE DUPLICATE LADDER, each rung measured rather than assumed: 24// 1 slug prefix only ............ 67 candidates 25// 2 + raw token overlap >=400 ... 13 26// 3 + rarity weighting .......... 10 (true dups rank to the top: 800, 571) 27// 4 + sequence-marker rule ...... 3 28// plus a CROSS-NAME index (shared rare tokens, no slug similarity required), because 29// ★★★★★★ A SLUG-ANCHORED DETECTOR CANNOT SEE A DUPLICATE THAT WAS NAMED DIFFERENTLY -- AND A 30// DUPLICATE IS EXACTLY THE THING TWO AUTHORS NAME DIFFERENTLY. 31// 32// ⚠ AND ITS CEILING, MEASURED: the two files stating the store law share ZERO rare tokens, so every 33// lexical method here is blind to them. Independent wording is what makes a rediscovery a 34// rediscovery, and it is what defeats lexical detection. Found only by ranked search (nx_memfind). 35// 36// usage: nx_memhealth [--dir <memdir>] [--list] [--dups] 37// exit: 0 = front door intact; 1 = MEMORY.md contains a dangling pointer 38// Sovereign: imports nx_memplane_lib. license_tier: ORIGINAL 39import "nx_memplane_lib.nx" 40 41const MH_DIR: *u8 = "/mnt/c/Users/elder/.claude/projects/C--Users-elder/memory" 42const MH_IDX: *u8 = "MEMORY.md" 43const MH_FBUF: i64 = 1048576 44const MH_MSG: i64 = 16384 45const MH_DUPPFX: i64 = 22 // shared normalised prefix that flags a near-duplicate slug 46const MH_TOK: i64 = 16384 47const MH_DF: i64 = 262144 48const MH_RARE: i64 = 20 // in >20 of 2181 files (~1%) => template, not topic 49const MH_TOPK: i64 = 10 50const MH_POST: i64 = 16 51const MH_PIDX: i64 = 65536 52const MH_PAIRH: i64 = 262144 53const MH_MINSHARE: i64 = 3 54 55// ---- token sets --------------------------------------------------------------------------------- 56 57func mh_tokhas(set: *i64, h: i64) -> i64 { 58 var p: i64 = h & (MH_TOK - 1) 59 var r: i64 = 0 60 var go: i64 = 1 61 while go == 1 { 62 if set[p] == 0 { go = 0 } else { 63 if set[p] == h { r = 1; go = 0 } else { p = (p + 1) & (MH_TOK - 1) } 64 } 65 } 66 return r 67} 68 69func mh_tokput(set: *i64, h: i64) -> i64 { 70 var p: i64 = h & (MH_TOK - 1) 71 var r: i64 = 0 72 var go: i64 = 1 73 while go == 1 { 74 if set[p] == 0 { set[p] = h; r = 1; go = 0 } else { 75 if set[p] == h { go = 0 } else { p = (p + 1) & (MH_TOK - 1) } 76 } 77 } 78 return r 79} 80 81func mh_tokenise(buf: *u8, n: i64, set: *i64) -> i64 { 82 var distinct: i64 = 0 83 var h: i64 = 2166136261 84 var ln: i64 = 0 85 var i: i64 = 0 86 while i <= n { 87 var c: i64 = 0 - 1 88 if i < n { 89 let b: u8 = buf[i] 90 if b >= (65 as u8) { if b <= (90 as u8) { c = (b as i64) + 32 } } 91 if b >= (97 as u8) { if b <= (122 as u8) { c = b as i64 } } 92 if b >= (48 as u8) { if b <= (57 as u8) { c = b as i64 } } 93 } 94 if c >= 0 { 95 h = h ^ c 96 h = (h * 16777619) & 1073741823 97 ln = ln + 1 98 } else { 99 if ln >= 6 { if h != 0 { distinct = distinct + mh_tokput(set, h) } } 100 h = 2166136261 101 ln = 0 102 } 103 i = i + 1 104 } 105 return distinct 106} 107 108// ---- corpus-wide document frequency: the boilerplate filter ------------------------------------- 109// RAW token overlap cannot tell a DUPLICATE from a SERIES: sequential shipping records scored 402-541 110// against each other because siblings written by one process share a TEMPLATE, and a template is 111// mostly common words. 112// ★ THE WORDS THAT PROVE TWO DOCUMENTS ARE THE SAME ARE THE WORDS ALMOST NO OTHER DOCUMENT USES. 113 114func mh_dfslot(dfk: *i64, h: i64) -> i64 { 115 var p: i64 = h & (MH_DF - 1) 116 var r: i64 = 0 - 1 117 var go: i64 = 1 118 while go == 1 { 119 if dfk[p] == 0 { dfk[p] = h; r = p; go = 0 } else { 120 if dfk[p] == h { r = p; go = 0 } else { p = (p + 1) & (MH_DF - 1) } 121 } 122 } 123 return r 124} 125 126func mh_dfget(dfk: *i64, dfv: *i64, h: i64) -> i64 { 127 var p: i64 = h & (MH_DF - 1) 128 var r: i64 = 0 129 var go: i64 = 1 130 while go == 1 { 131 if dfk[p] == 0 { go = 0 } else { 132 if dfk[p] == h { r = dfv[p]; go = 0 } else { p = (p + 1) & (MH_DF - 1) } 133 } 134 } 135 return r 136} 137 138func mh_tokenise_df(buf: *u8, n: i64, set: *i64, dfk: *i64, dfv: *i64) -> i64 { 139 var distinct: i64 = 0 140 var h: i64 = 2166136261 141 var ln: i64 = 0 142 var i: i64 = 0 143 while i <= n { 144 var c: i64 = 0 - 1 145 if i < n { 146 let b: u8 = buf[i] 147 if b >= (65 as u8) { if b <= (90 as u8) { c = (b as i64) + 32 } } 148 if b >= (97 as u8) { if b <= (122 as u8) { c = b as i64 } } 149 if b >= (48 as u8) { if b <= (57 as u8) { c = b as i64 } } 150 } 151 if c >= 0 { 152 h = h ^ c 153 h = (h * 16777619) & 1073741823 154 ln = ln + 1 155 } else { 156 if ln >= 6 { 157 if h != 0 { 158 if mh_tokput(set, h) == 1 { 159 distinct = distinct + 1 160 let s: i64 = mh_dfslot(dfk, h) 161 if s >= 0 { dfv[s] = dfv[s] + 1 } 162 } 163 } 164 } 165 h = 2166136261 166 ln = 0 167 } 168 i = i + 1 169 } 170 return distinct 171} 172 173func mh_rarecount(buf: *u8, n: i64, seen: *i64, dfk: *i64, dfv: *i64) -> i64 { 174 var rare: i64 = 0 175 var h: i64 = 2166136261 176 var ln: i64 = 0 177 var i: i64 = 0 178 while i <= n { 179 var c: i64 = 0 - 1 180 if i < n { 181 let b: u8 = buf[i] 182 if b >= (65 as u8) { if b <= (90 as u8) { c = (b as i64) + 32 } } 183 if b >= (97 as u8) { if b <= (122 as u8) { c = b as i64 } } 184 if b >= (48 as u8) { if b <= (57 as u8) { c = b as i64 } } 185 } 186 if c >= 0 { 187 h = h ^ c 188 h = (h * 16777619) & 1073741823 189 ln = ln + 1 190 } else { 191 if ln >= 6 { 192 if h != 0 { if mh_tokput(seen, h) == 1 { if mh_dfget(dfk, dfv, h) <= MH_RARE { rare = rare + 1 } } } 193 } 194 h = 2166136261 195 ln = 0 196 } 197 i = i + 1 198 } 199 return rare 200} 201 202// ★★★★★★ CO-AUTHORSHIP EXPLAINS SHARED VOCABULARY; ONLY INDEPENDENT REDISCOVERY IS A DUPLICATE. 203// The cross-name detector's loudest false positive paired an asset catalogue with a DOS emulator at 204// 750 permil -- unrelated, both written by ONE session that shared its vocabulary across everything 205// it wrote that day. The genuine find came from two DIFFERENT sessions. 206// ⚠Applied to the CROSS-NAME path ONLY: a session can duplicate itself (nge-browser-first did), but 207// there the slug similarity is independent corroboration. This filter stands in for the evidence the 208// name would otherwise supply. 209func mh_sesshash(buf: *u8, n: i64) -> i64 { 210 let pat: *u8 = "originSessionId" as *u8 211 let pl: i64 = mp_len(pat) 212 var lim: i64 = n - pl 213 if lim > 1200 { lim = 1200 } 214 var i: i64 = 0 215 while i < lim { 216 var j: i64 = 0 217 var ok: i64 = 1 218 while j < pl { if buf[i + j] != pat[j] { ok = 0; j = pl } else { j = j + 1 } } 219 if ok == 1 { 220 var p: i64 = i + pl 221 var go: i64 = 1 222 while go == 1 { 223 if p >= n { go = 0 } else { 224 let c: u8 = buf[p] 225 if c == (58 as u8) { p = p + 1 } else { 226 if c == (32 as u8) { p = p + 1 } else { 227 if c == (34 as u8) { p = p + 1 } else { go = 0 } 228 } 229 } 230 } 231 } 232 var h: i64 = 2166136261 233 var k: i64 = 0 234 while k < 36 { 235 if p + k >= n { k = 36 } else { 236 let c2: u8 = buf[p + k] 237 if c2 == (10 as u8) { k = 36 } else { 238 h = h ^ (c2 as i64) 239 h = (h * 16777619) & 1073741823 240 k = k + 1 241 } 242 } 243 } 244 return h 245 } 246 i = i + 1 247 } 248 return 0 249} 250 251// rarity-weighted token overlap in permil. Extracted so BOTH candidate sources are judged by the 252// identical ruler -- two generators feeding two scorers would make their counts incomparable. 253func mh_pairsim(dir: *u8, na: *u8, nb: *u8, fbuf: *u8, fbuf2: *u8, 254 setA: *i64, setB: *i64, setC: *i64, path: *u8, dfk: *i64, dfv: *i64) -> i64 { 255 var z: i64 = 0 256 while z < MH_TOK { setA[z] = 0; setB[z] = 0; setC[z] = 0; z = z + 1 } 257 mp_join(path, dir, na) 258 let la: i64 = mp_readf(path, fbuf, MH_FBUF) 259 mp_join(path, dir, nb) 260 let lb: i64 = mp_readf(path, fbuf2, MH_FBUF) 261 mh_tokenise(fbuf, la, setA) 262 let ra: i64 = mh_rarecount(fbuf, la, setC, dfk, dfv) 263 var rb: i64 = 0 264 var inter: i64 = 0 265 var h2: i64 = 2166136261 266 var ln2: i64 = 0 267 var q3: i64 = 0 268 while q3 <= lb { 269 var c4: i64 = 0 - 1 270 if q3 < lb { 271 let b4: u8 = fbuf2[q3] 272 if b4 >= (65 as u8) { if b4 <= (90 as u8) { c4 = (b4 as i64) + 32 } } 273 if b4 >= (97 as u8) { if b4 <= (122 as u8) { c4 = b4 as i64 } } 274 if b4 >= (48 as u8) { if b4 <= (57 as u8) { c4 = b4 as i64 } } 275 } 276 if c4 >= 0 { 277 h2 = h2 ^ c4 278 h2 = (h2 * 16777619) & 1073741823 279 ln2 = ln2 + 1 280 } else { 281 if ln2 >= 6 { 282 if mh_tokput(setB, h2) == 1 { 283 if mh_dfget(dfk, dfv, h2) <= MH_RARE { 284 rb = rb + 1 285 if mh_tokhas(setA, h2) == 1 { inter = inter + 1 } 286 } 287 } 288 } 289 h2 = 2166136261 290 ln2 = 0 291 } 292 q3 = q3 + 1 293 } 294 if ra + rb <= 0 { return 0 } 295 return (2000 * inter) / (ra + rb) 296} 297 298// ★ A SEQUENCE MARKER IS NOT A TOPIC DIFFERENCE. Rarity weighting improved the RANKING but did not 299// separate: sequential records still scored 418-644, because c2-3b and c2-3c really are about the 300// same subject. No content maths tells "same project, next instalment" from "same doctrine, written 301// twice" -- the discriminator was never in the content, it is in the NAMES. 302func mh_isdigitc(c: u8) -> i64 { 303 if c < (48 as u8) { return 0 } 304 if c > (57 as u8) { return 0 } 305 return 1 306} 307 308func mh_common(a: *u8, b: *u8) -> i64 { 309 var i: i64 = 0 310 while a[i] != (0 as u8) { 311 if a[i] != b[i] { return i } 312 i = i + 1 313 } 314 return i 315} 316 317func mh_is_series(a: *u8, b: *u8) -> i64 { 318 let c: i64 = mh_common(a, b) 319 if mh_isdigitc(a[c]) == 1 { return 1 } 320 if mh_isdigitc(b[c]) == 1 { return 1 } 321 let la: i64 = mp_len(a) 322 let lb: i64 = mp_len(b) 323 if la == lb { 324 var diff: i64 = 0 325 var i: i64 = 0 326 while i < la { if a[i] != b[i] { diff = diff + 1 } i = i + 1 } 327 if diff <= 2 { return 1 } 328 } 329 return 0 330} 331 332func mh_cmp(a: *u8, b: *u8) -> i64 { 333 var i: i64 = 0 334 var r: i64 = 0 335 var go: i64 = 1 336 while go == 1 { 337 let ca: i64 = a[i] as i64 338 let cb: i64 = b[i] as i64 339 if ca != cb { if ca < cb { r = 0 - 1 } else { r = 1 } go = 0 } else { 340 if ca == 0 { go = 0 } else { i = i + 1 } 341 } 342 } 343 return r 344} 345 346func mh_norm(dst: *u8, src: *u8) -> i64 { 347 var o: i64 = 0 348 var i: i64 = 0 349 while src[i] != (0 as u8) { 350 let c: u8 = src[i] 351 var k: i64 = 0 - 1 352 if c >= (65 as u8) { if c <= (90 as u8) { k = (c as i64) + 32 } } 353 if c >= (97 as u8) { if c <= (122 as u8) { k = c as i64 } } 354 if c >= (48 as u8) { if c <= (57 as u8) { k = c as i64 } } 355 if k >= 0 { if o < MP_SLOT - 1 { dst[o] = k as u8; o = o + 1 } } 356 i = i + 1 357 } 358 dst[o] = 0 as u8 359 return o 360} 361 362// ---- cross-name candidate generation: shared RARE tokens, no slug similarity required ---------- 363 364func mh_post_slot(ptok: *i64, h: i64) -> i64 { 365 var p: i64 = h & (MH_PIDX - 1) 366 var r: i64 = 0 - 1 367 var go: i64 = 1 368 while go == 1 { 369 if ptok[p] == 0 { ptok[p] = h; r = p; go = 0 } else { 370 if ptok[p] == h { r = p; go = 0 } else { p = (p + 1) & (MH_PIDX - 1) } 371 } 372 } 373 return r 374} 375 376func mh_pair_bump(pk: *i64, pv: *i64, key: i64) -> i64 { 377 var p: i64 = (key * 2654435761) & (MH_PAIRH - 1) 378 var go: i64 = 1 379 var r: i64 = 0 380 while go == 1 { 381 if pk[p] == 0 { pk[p] = key; pv[p] = 1; r = 1; go = 0 } else { 382 if pk[p] == key { pv[p] = pv[p] + 1; r = pv[p]; go = 0 } else { p = (p + 1) & (MH_PAIRH - 1) } 383 } 384 } 385 return r 386} 387 388func main(argc: i64, argv: *i64) -> i64 { 389 var dir: *u8 = MH_DIR 390 var list: i64 = 0 391 var dups: i64 = 0 392 var ai: i64 = 1 393 while ai < argc { 394 let a: *u8 = argv[ai] as *u8 395 if mp_streq(a, "--list" as *u8) == 1 { list = 1 } 396 if mp_streq(a, "--dups" as *u8) == 1 { dups = 1 } 397 if mp_streq(a, "--dir" as *u8) == 1 { if ai + 1 < argc { dir = argv[ai + 1] as *u8; ai = ai + 1 } } 398 ai = ai + 1 399 } 400 401 let msg: *u8 = sys_mmap(MH_MSG) 402 let names: *u8 = sys_mmap(MP_MAXF * MP_SLOT) 403 let norms: *u8 = sys_mmap(MP_MAXF * MP_SLOT) 404 let tbl: *i64 = sys_mmap(8 * MP_HASH) as *i64 405 let inref: *i64 = sys_mmap(8 * MP_MAXF) as *i64 406 let sessh: *i64 = sys_mmap(8 * MP_MAXF) as *i64 407 let fbuf: *u8 = sys_mmap(MH_FBUF) 408 let fbuf2: *u8 = sys_mmap(MH_FBUF) 409 let path: *u8 = sys_mmap(4096) 410 let probe: *u8 = sys_mmap(1024) 411 let out: *i64 = sys_mmap(64) as *i64 412 let dfk: *i64 = sys_mmap(8 * MH_DF) as *i64 413 let dfv: *i64 = sys_mmap(8 * MH_DF) as *i64 414 let dfseen: *i64 = sys_mmap(8 * MH_TOK) as *i64 415 let setA: *i64 = sys_mmap(8 * MH_TOK) as *i64 416 let setB: *i64 = sys_mmap(8 * MH_TOK) as *i64 417 let setC: *i64 = sys_mmap(8 * MH_TOK) as *i64 418 419 let cnt: i64 = mp_scan(dir, names, tbl, MP_MAXF) 420 if cnt < 0 { 421 var e: i64 = mp_cat(msg, 0, "nx_memhealth: REFUSED -- cannot open the memory dir.\n" as *u8) 422 mp_say(msg, e) 423 return 1 424 } 425 var i: i64 = 0 426 while i < cnt { inref[i] = 0; sessh[i] = 0; i = i + 1 } 427 428 // ---- pass: links + document frequency + session identity ---- 429 var dangling: i64 = 0 430 var idx_dangling: i64 = 0 431 var totrefs: i64 = 0 432 var corpus: i64 = 0 433 var f: i64 = 0 434 while f < cnt { 435 let fname: *u8 = mp_nameptr(names, f) 436 // ⚠ ASK THE FILE, NOT A NAME LIST. This organ was the THIRD victim of a derived artefact 437 // supplying inbound links (orphans read 1 instead of 581, live) precisely because it kept a 438 // private hardcoded list while its siblings moved to the shared test. 439 var skipf: i64 = 0 440 if mp_is_dump(fname) == 1 { skipf = 1 } 441 mp_join(path, dir, fname) 442 let total: i64 = mp_readf(path, fbuf, MH_FBUF) 443 if total > 0 { if mp_is_derived(fbuf, total) == 1 { skipf = 1 } } 444 if total > 0 { if skipf == 0 { 445 corpus = corpus + total 446 var zf: i64 = 0 447 while zf < MH_TOK { dfseen[zf] = 0; zf = zf + 1 } 448 mh_tokenise_df(fbuf, total, dfseen, dfk, dfv) 449 sessh[f] = mh_sesshash(fbuf, total) 450 let is_index: i64 = mp_streq(fname, MH_IDX) 451 var from: i64 = 0 452 var go: i64 = 1 453 while go == 1 { 454 if mp_link_next(fbuf, total, from, out) == 1 { 455 from = out[3] 456 totrefs = totrefs + 1 457 let hit: i64 = mp_resolve(fbuf, out, names, tbl, probe) 458 if hit < 0 { 459 dangling = dangling + 1 460 if is_index == 1 { idx_dangling = idx_dangling + 1 } 461 if list == 1 { 462 var d: i64 = mp_cat(msg, 0, " DANGLING " as *u8) 463 d = mp_cat(msg, d, probe) 464 d = mp_cat(msg, d, " <- " as *u8) 465 d = mp_cat(msg, d, fname) 466 if is_index == 1 { d = mp_cat(msg, d, " *** FRONT DOOR ***" as *u8) } 467 d = mp_cat(msg, d, "\n" as *u8) 468 mp_say(msg, d) 469 } 470 } else { 471 if hit != f { inref[hit] = inref[hit] + 1 } 472 } 473 } else { go = 0 } 474 } 475 } } 476 f = f + 1 477 } 478 479 // ---- orphans. The index and any derived artefact are neither lost knowledge nor authored. ---- 480 var orph: i64 = 0 481 i = 0 482 while i < cnt { 483 if inref[i] == 0 { 484 let nm: *u8 = mp_nameptr(names, i) 485 var isderived: i64 = 0 486 if mp_streq(nm, MH_IDX) == 1 { isderived = 1 } 487 if mp_is_dump(nm) == 1 { isderived = 1 } 488 if isderived == 0 { orph = orph + 1 } 489 } 490 i = i + 1 491 } 492 493 // ---- rung 1: slug-similar candidates ---- 494 i = 0 495 while i < cnt { mh_norm(((norms as i64) + i * MP_SLOT) as *u8, mp_nameptr(names, i)); i = i + 1 } 496 let ord: *i64 = sys_mmap(8 * MP_MAXF) as *i64 497 i = 0 498 while i < cnt { ord[i] = i; i = i + 1 } 499 var a2: i64 = 1 500 while a2 < cnt { 501 let v: i64 = ord[a2] 502 let vp: *u8 = ((norms as i64) + v * MP_SLOT) as *u8 503 var b2: i64 = a2 - 1 504 var go4: i64 = 1 505 while go4 == 1 { 506 if b2 < 0 { go4 = 0 } else { 507 if mh_cmp(((norms as i64) + ord[b2] * MP_SLOT) as *u8, vp) > 0 { ord[b2 + 1] = ord[b2]; b2 = b2 - 1 } else { go4 = 0 } 508 } 509 } 510 ord[b2 + 1] = v 511 a2 = a2 + 1 512 } 513 var dupn: i64 = 0 514 var dupconf: i64 = 0 515 i = 1 516 while i < cnt { 517 let pa: *u8 = ((norms as i64) + ord[i - 1] * MP_SLOT) as *u8 518 let pb: *u8 = ((norms as i64) + ord[i] * MP_SLOT) as *u8 519 if mh_common(pa, pb) >= MH_DUPPFX { 520 dupn = dupn + 1 521 let na: *u8 = mp_nameptr(names, ord[i - 1]) 522 let nb: *u8 = mp_nameptr(names, ord[i]) 523 let sim: i64 = mh_pairsim(dir, na, nb, fbuf, fbuf2, setA, setB, setC, path, dfk, dfv) 524 let series: i64 = mh_is_series(pa, pb) 525 var isdup: i64 = 0 526 if sim >= 400 { if series == 0 { isdup = 1 } } 527 if isdup == 1 { dupconf = dupconf + 1 } 528 if dups == 1 { 529 var d2: i64 = mp_cat(msg, 0, " " as *u8) 530 if isdup == 1 { d2 = mp_cat(msg, d2, "DUPLICATE " as *u8) } else { 531 if series == 1 { d2 = mp_cat(msg, d2, "series " as *u8) } else { d2 = mp_cat(msg, d2, "distinct " as *u8) } 532 } 533 d2 = mp_cat(msg, d2, "sim=" as *u8) 534 d2 = mp_catn(msg, d2, sim) 535 d2 = mp_cat(msg, d2, " permil " as *u8) 536 d2 = mp_cat(msg, d2, na) 537 d2 = mp_cat(msg, d2, "\n " as *u8) 538 d2 = mp_cat(msg, d2, nb) 539 d2 = mp_cat(msg, d2, "\n" as *u8) 540 mp_say(msg, d2) 541 } 542 } 543 i = i + 1 544 } 545 546 // ---- CROSS-NAME candidates: shared rare tokens, whatever the files are called ---- 547 let ptok: *i64 = sys_mmap(8 * MH_PIDX) as *i64 548 let pcnt: *i64 = sys_mmap(8 * MH_PIDX) as *i64 549 let pfil: *i64 = sys_mmap(8 * MH_PIDX * MH_POST) as *i64 550 let pk: *i64 = sys_mmap(8 * MH_PAIRH) as *i64 551 let pv: *i64 = sys_mmap(8 * MH_PAIRH) as *i64 552 i = 0 553 while i < MH_PIDX { ptok[i] = 0; pcnt[i] = 0; i = i + 1 } 554 i = 0 555 while i < MH_PAIRH { pk[i] = 0; pv[i] = 0; i = i + 1 } 556 557 var ff: i64 = 0 558 while ff < cnt { 559 let fn2: *u8 = mp_nameptr(names, ff) 560 var isdump: i64 = 0 561 if mp_is_dump(fn2) == 1 { isdump = 1 } 562 if mp_streq(fn2, MH_IDX) == 1 { isdump = 1 } 563 if isdump == 0 { 564 mp_join(path, dir, fn2) 565 let tl: i64 = mp_readf(path, fbuf, MH_FBUF) 566 if mp_is_derived(fbuf, tl) == 1 { isdump = 1 } 567 if isdump == 0 { 568 var zz: i64 = 0 569 while zz < MH_TOK { dfseen[zz] = 0; zz = zz + 1 } 570 var kept: i64 = 0 571 var h3: i64 = 2166136261 572 var ln3: i64 = 0 573 var q4: i64 = 0 574 while q4 <= tl { 575 var c5: i64 = 0 - 1 576 if q4 < tl { 577 let b5: u8 = fbuf[q4] 578 if b5 >= (65 as u8) { if b5 <= (90 as u8) { c5 = (b5 as i64) + 32 } } 579 if b5 >= (97 as u8) { if b5 <= (122 as u8) { c5 = b5 as i64 } } 580 if b5 >= (48 as u8) { if b5 <= (57 as u8) { c5 = b5 as i64 } } 581 } 582 if c5 >= 0 { 583 h3 = h3 ^ c5 584 h3 = (h3 * 16777619) & 1073741823 585 ln3 = ln3 + 1 586 } else { 587 if ln3 >= 6 { 588 if kept < MH_TOPK { 589 if mh_tokput(dfseen, h3) == 1 { 590 let dfc: i64 = mh_dfget(dfk, dfv, h3) 591 if dfc >= 2 { if dfc <= MH_RARE { 592 let sl: i64 = mh_post_slot(ptok, h3) 593 if sl >= 0 { if pcnt[sl] < MH_POST { 594 pfil[sl * MH_POST + pcnt[sl]] = ff 595 pcnt[sl] = pcnt[sl] + 1 596 kept = kept + 1 597 } } 598 } } 599 } 600 } 601 } 602 h3 = 2166136261 603 ln3 = 0 604 } 605 q4 = q4 + 1 606 } 607 } 608 } 609 ff = ff + 1 610 } 611 612 i = 0 613 while i < MH_PIDX { 614 if ptok[i] != 0 { 615 let c: i64 = pcnt[i] 616 if c >= 2 { 617 var a3: i64 = 0 618 while a3 < c { 619 var b3: i64 = a3 + 1 620 while b3 < c { 621 let fa: i64 = pfil[i * MH_POST + a3] 622 let fb: i64 = pfil[i * MH_POST + b3] 623 var lo: i64 = fa 624 var hi: i64 = fb 625 if fa > fb { lo = fb; hi = fa } 626 mh_pair_bump(pk, pv, lo * MP_MAXF + hi + 1) 627 b3 = b3 + 1 628 } 629 a3 = a3 + 1 630 } 631 } 632 } 633 i = i + 1 634 } 635 636 var cdup: i64 = 0 637 var ccand: i64 = 0 638 var capped: i64 = 0 639 var scored: i64 = 0 640 i = 0 641 while i < MH_PAIRH { 642 if pk[i] != 0 { 643 if pv[i] >= MH_MINSHARE { 644 ccand = ccand + 1 645 if scored >= 3000 { capped = capped + 1 } else { 646 scored = scored + 1 647 let key: i64 = pk[i] - 1 648 let lo2: i64 = key / MP_MAXF 649 let hi2: i64 = key % MP_MAXF 650 let na3: *u8 = mp_nameptr(names, lo2) 651 let nb3: *u8 = mp_nameptr(names, hi2) 652 let pa3: *u8 = ((norms as i64) + lo2 * MP_SLOT) as *u8 653 let pb3: *u8 = ((norms as i64) + hi2 * MP_SLOT) as *u8 654 if mh_common(pa3, pb3) < MH_DUPPFX { 655 var coauth: i64 = 0 656 if sessh[lo2] != 0 { if sessh[lo2] == sessh[hi2] { coauth = 1 } } 657 if coauth == 0 { 658 if mh_is_series(pa3, pb3) == 0 { 659 let s3: i64 = mh_pairsim(dir, na3, nb3, fbuf, fbuf2, setA, setB, setC, path, dfk, dfv) 660 if s3 >= 400 { 661 cdup = cdup + 1 662 if dups == 1 { 663 var d3: i64 = mp_cat(msg, 0, " CROSS-NAME DUP sim=" as *u8) 664 d3 = mp_catn(msg, d3, s3) 665 d3 = mp_cat(msg, d3, " shared=" as *u8) 666 d3 = mp_catn(msg, d3, pv[i]) 667 d3 = mp_cat(msg, d3, " " as *u8) 668 d3 = mp_cat(msg, d3, na3) 669 d3 = mp_cat(msg, d3, "\n " as *u8) 670 d3 = mp_cat(msg, d3, nb3) 671 d3 = mp_cat(msg, d3, "\n" as *u8) 672 mp_say(msg, d3) 673 } 674 } 675 } 676 } 677 } 678 } 679 } 680 } 681 i = i + 1 682 } 683 684 var m: i64 = mp_cat(msg, 0, "nx_memhealth: " as *u8) 685 m = mp_catn(msg, m, cnt) 686 m = mp_cat(msg, m, " .md files, " as *u8) 687 m = mp_catn(msg, m, corpus / 1024) 688 m = mp_cat(msg, m, " KB, " as *u8) 689 m = mp_catn(msg, m, totrefs) 690 m = mp_cat(msg, m, " links\n DANGLING FROM INDEX (front door): " as *u8) 691 m = mp_catn(msg, m, idx_dangling) 692 m = mp_cat(msg, m, "\n dangling anywhere : " as *u8) 693 m = mp_catn(msg, m, dangling) 694 m = mp_cat(msg, m, "\n orphans (nothing points to them): " as *u8) 695 m = mp_catn(msg, m, orph) 696 m = mp_cat(msg, m, "\n slug-similar pairs (candidates): " as *u8) 697 m = mp_catn(msg, m, dupn) 698 m = mp_cat(msg, m, "\n CONTENT-CONFIRMED DUPLICATES : " as *u8) 699 m = mp_catn(msg, m, dupconf) 700 m = mp_cat(msg, m, " (>=400 permil token overlap; the rest are legitimate series)" as *u8) 701 m = mp_cat(msg, m, "\n CROSS-NAME dup pairs : " as *u8) 702 m = mp_catn(msg, m, cdup) 703 m = mp_cat(msg, m, " (from " as *u8) 704 m = mp_catn(msg, m, ccand) 705 m = mp_cat(msg, m, " shared-rare-token candidates -- these share NO slug prefix, so the name rule is blind to them)" as *u8) 706 if capped > 0 { 707 // NO SILENT CAPS: a bound that quietly drops work reads as "covered everything". 708 m = mp_cat(msg, m, "\n *** " as *u8) 709 m = mp_catn(msg, m, capped) 710 m = mp_cat(msg, m, " candidate pairs NOT scored (3000 cap) -- coverage is incomplete ***" as *u8) 711 } 712 m = mp_cat(msg, m, "\n" as *u8) 713 if idx_dangling > 0 { 714 m = mp_cat(msg, m, "*** THE FRONT DOOR IS BROKEN: MEMORY.md points at a file that does not exist. Every session reads that pointer and follows it into nothing. ***\n" as *u8) 715 } 716 mp_say(msg, m) 717 if idx_dangling > 0 { return 1 } 718 return 0 719}