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}