code wiki / _hdl_build / nx_favela_decay.nx
nx_favela_decay.nx source
↩ module page · 370 lines · 18174 B
1// nx_favela_decay.nx -- the TIME DIMENSION on the favela census (operator 2026-07-20: "are landmines getting
2// eaten along with all of our debt"). MEASURED ANSWER THAT MOTIVATED IT: favela rooted_permil=94 vs debt
3// eaten 490permil -- landmines get ROOTED ~5x slower than debt gets eaten. ROOT ASYMMETRY: "mitigated" is a
4// TERMINAL state in the 7-field favela manifest (there is NO time field at all) and it earns HALF CREDIT
5// FOREVER. A mitigation here is overwhelmingly "a WARNING line in MEMORY.md", so tribal knowledge is a
6// load-bearing safety mechanism -- exactly what rule 26 forbids ("proven mechanically, never asserted").
7//
8// THIS ORGAN GIVES A MITIGATION AN EXPIRY. Data-driven per rule 11: the decay window is a CONFIG ROW in the
9// ledger, NEVER a constant in code. Evidence-derived per the R2b law: age comes from an APPEND-ONLY ledger of
10// observations, never from prose and never from an assertion. FAIL-CLOSED: a missing/unreadable config
11// measures decay_days=0 => every mitigation is ALREADY expired => maximally loud. A missing config can never
12// silently grant infinite grace. HONEST: the clock starts at FIRST OBSERVATION, not at the true mitigation
13// date (unknowable -- no historical record exists); the output DECLARES this rather than faking a backdate.
14//
15// COMPOSES, DOES NOT DUPLICATE (board queried before building, 2026-07-20): cap-autonomy owns auto-filing to
16// intake/debt/frontier -- this organ EMITS the DECAYED signal and THAT lane files it. ws-intel8 owns nx_feeder
17// gap-derivation. tsv-to-native-planes owns the favela_classes.tsv migration, so this adds NO TSV: the ledger
18// is an append-only evidence log (the ws_sync.jrnl / token_efficiency.log pattern), conflict-free under
19// concurrent seats via O_APPEND.
20//
21// VERBS: check (default -- auto-stamps then evaluates) | stamp | config <days> | selftest
22// license_tier: ORIGINAL expect_exit: 0
23import "nx_syscalls.nx"
24import "nx_estate_path.nx" // ep_anchor: the CWD must not decide this organ's verdict
25const K_MAGIC_1784576000: i64 = 1784576000
26const K_MAGIC_1048576: i64 = 1048576
27const K_MAGIC_4000: i64 = 4000
28const K_MAGIC_3000: i64 = 3000
29const K_MAGIC_65536: i64 = 65536
30const K_MAGIC_262144: i64 = 262144
31const K_MAGIC_86400: i64 = 86400
32
33func fd_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
34func fd_cat(o: *u8, at: i64, s: *u8) -> i64 { var i: i64=0; var a: i64=at; while s[i]!=(0 as u8){o[a]=s[i]; a=a+1; i=i+1} return a }
35func fd_catf(o: *u8, at: i64, p: *u8, n: i64) -> i64 { var i: i64=0; var a: i64=at; while i<n { o[a]=p[i]; a=a+1; i=i+1 } return a }
36func fd_catn(o: *u8, at: i64, v: i64) -> i64 {
37 var a: i64=at
38 var x: i64=v
39 if x<0 { o[a]=45 as u8; a=a+1; x=0-x }
40 let tm: *u8=sys_mmap(24)
41 var k: i64=0
42 if x==0 { tm[0]=48 as u8; k=1 }
43 while x>0 { tm[k]=(48+x%10) as u8; x=x/10; k=k+1 }
44 var j: i64=0
45 while j<k { o[a]=tm[k-1-j]; a=a+1; j=j+1 }
46 return a
47}
48func fd_zlen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
49// slice-vs-slice equality; flag-not-early-return (census idiom, early return in loop unproven in nx_cc)
50func fd_slice_eq(a: *u8, an: i64, b: *u8, bn: i64) -> i64 {
51 if an!=bn { return 0 }
52 var ok: i64=1
53 var i: i64=0
54 while i<an { if a[i]!=b[i] { ok=0; i=an } else { i=i+1 } }
55 return ok
56}
57func fd_atoi(p: *u8, n: i64) -> i64 {
58 var v: i64=0
59 var i: i64=0
60 while i<n {
61 let c: i64=p[i] as i64
62 if c>=48 { if c<=57 { v=v*10+(c-48) } }
63 i=i+1
64 }
65 return v
66}
67// earliest MITSTAMP epoch for class[cls,cn) in ledger buf; 0 = never stamped. Buffers HOISTED (scale law:
68// no mmap in the per-line loop -- the ark-v1 O(N)-fork lesson applied to allocation).
69func fd_earliest(lb: *u8, ln: i64, cls: *u8, cn: i64) -> i64 {
70 let fs: *i64=sys_mmap(64) as *i64
71 let fl: *i64=sys_mmap(64) as *i64
72 var best: i64=0
73 var i: i64=0
74 while i<ln {
75 let ls: i64=i
76 var le: i64=ls
77 var scan: i64=1
78 while scan==1 { if le>=ln { scan=0 } else { if lb[le]==(10 as u8) { scan=0 } else { le=le+1 } } }
79 i=le+1
80 var nf: i64=0
81 var p: i64=ls
82 var fstart: i64=ls
83 while p<le {
84 if lb[p]==(9 as u8) { if nf<4 { fs[nf]=fstart; fl[nf]=p-fstart; nf=nf+1 } fstart=p+1 }
85 p=p+1
86 }
87 if nf<4 { fs[nf]=fstart; fl[nf]=le-fstart; nf=nf+1 }
88 if nf==4 {
89 let m1: i64=fd_slice_eq((lb as i64+fs[1]) as *u8, fl[1], cls, cn)
90 if m1==1 {
91 let m2: i64=fd_slice_eq((lb as i64+fs[2]) as *u8, fl[2], "MITSTAMP\x00" as *u8, 8)
92 if m2==1 {
93 let e: i64=fd_atoi((lb as i64+fs[0]) as *u8, fl[0])
94 if e>0 { if best==0 { best=e } else { if e<best { best=e } } }
95 }
96 }
97 }
98 }
99 return best
100}
101// decay window in DAYS from the ledger CONFIG rows; LAST row wins (append-only semantics).
102// FAIL-CLOSED: absent/unreadable => 0 => every mitigation already expired => maximally loud.
103func fd_cfg_days(lb: *u8, ln: i64) -> i64 {
104 let fs: *i64=sys_mmap(64) as *i64
105 let fl: *i64=sys_mmap(64) as *i64
106 var days: i64=0
107 var i: i64=0
108 while i<ln {
109 let ls: i64=i
110 var le: i64=ls
111 var scan: i64=1
112 while scan==1 { if le>=ln { scan=0 } else { if lb[le]==(10 as u8) { scan=0 } else { le=le+1 } } }
113 i=le+1
114 var nf: i64=0
115 var p: i64=ls
116 var fstart: i64=ls
117 while p<le {
118 if lb[p]==(9 as u8) { if nf<4 { fs[nf]=fstart; fl[nf]=p-fstart; nf=nf+1 } fstart=p+1 }
119 p=p+1
120 }
121 if nf<4 { fs[nf]=fstart; fl[nf]=le-fstart; nf=nf+1 }
122 if nf==4 {
123 let c1: i64=fd_slice_eq((lb as i64+fs[1]) as *u8, fl[1], "CONFIG\x00" as *u8, 6)
124 if c1==1 {
125 let c2: i64=fd_slice_eq((lb as i64+fs[2]) as *u8, fl[2], "decay_days\x00" as *u8, 10)
126 if c2==1 { days=fd_atoi((lb as i64+fs[3]) as *u8, fl[3]) }
127 }
128 }
129 }
130 return days
131}
132
133func main(argc: i64, argv: *i64) -> i64 {
134 // ANCHOR FIRST (2026-08-04, nx_cwdguard finding): this organ reads a RELATIVE
135 // knowledge/ path, so its answer depended on where it was launched. No-op when
136 // already at the estate root, so the cron/MCP context is unchanged.
137 ep_anchor()
138 let LEDGER: *u8="knowledge/status/favela_mitigations.log\x00" as *u8
139 var verb: *u8="check\x00" as *u8
140 if argc>1 { verb=argv[1] as *u8 }
141 let vn: i64=fd_zlen(verb)
142
143 // ---- config <days>: append a CONFIG row (rule 11 -- the window is DATA, never a code constant)
144 if fd_slice_eq(verb, vn, "config\x00" as *u8, 6)==1 {
145 if argc<3 { fd_puts("usage: nx_favela_decay config <days>\n" as *u8); sys_exit(2); return 2 }
146 let dv: *u8=argv[2] as *u8
147 let days: i64=fd_atoi(dv, fd_zlen(dv))
148 let now: i64=sys_now_realtime_sec()
149 let ob: *u8=sys_mmap(256)
150 var o: i64=0
151 o=fd_catn(ob,o,now); o=fd_cat(ob,o,"\tCONFIG\tdecay_days\t" as *u8); o=fd_catn(ob,o,days); o=fd_cat(ob,o,"\n" as *u8)
152 let fd: i64=sys_openat_append(LEDGER, 0x1a4)
153 if fd<0 { fd_puts("FAVELA-DECAY RED -- cannot append ledger\n" as *u8); sys_exit(1); return 1 }
154 sys_write(fd, ob, o)
155 sys_close(fd)
156 fd_puts("CONFIG decay_days=" as *u8)
157 let pb: *u8=sys_mmap(64); var q: i64=0; q=fd_catn(pb,q,days); q=fd_cat(pb,q," appended (last row wins)\n" as *u8)
158 sys_write(1,pb,q)
159 return 0
160 }
161
162 // ---- selftest: pure-core gate + PRODUCTION-SHAPE scale tooth (scale law)
163 if fd_slice_eq(verb, vn, "selftest\x00" as *u8, 8)==1 {
164 var pass: i64=0
165 var fail: i64=0
166 // T1 atoi
167 if fd_atoi("1784576000\x00" as *u8, 10)==K_MAGIC_1784576000 { pass=pass+1 } else { fail=fail+1 }
168 // T2 slice_eq positive + negative (length-sensitive)
169 if fd_slice_eq("abc\x00" as *u8,3,"abc\x00" as *u8,3)==1 { pass=pass+1 } else { fail=fail+1 }
170 if fd_slice_eq("abc\x00" as *u8,3,"abcd\x00" as *u8,4)==0 { pass=pass+1 } else { fail=fail+1 }
171 // T3 FAIL-CLOSED: empty ledger => decay_days 0 => everything already expired
172 let eb: *u8=sys_mmap(16)
173 if fd_cfg_days(eb,0)==0 { pass=pass+1 } else { fail=fail+1 }
174 // T4 config LAST-ROW-WINS
175 let cb: *u8=sys_mmap(256)
176 var c: i64=0
177 c=fd_cat(cb,c,"100\tCONFIG\tdecay_days\t7\n" as *u8)
178 c=fd_cat(cb,c,"200\tCONFIG\tdecay_days\t14\n" as *u8)
179 if fd_cfg_days(cb,c)==14 { pass=pass+1 } else { fail=fail+1 }
180 // T5 earliest stamp wins + unknown class => 0 (never a silent match)
181 let sb: *u8=sys_mmap(512)
182 var s: i64=0
183 s=fd_cat(sb,s,"900\twsl-tmp-wipe\tMITSTAMP\tseen\n" as *u8)
184 s=fd_cat(sb,s,"500\twsl-tmp-wipe\tMITSTAMP\tseen\n" as *u8)
185 s=fd_cat(sb,s,"700\tcap-lottery-header\tMITSTAMP\tseen\n" as *u8)
186 if fd_earliest(sb,s,"wsl-tmp-wipe\x00" as *u8,12)==500 { pass=pass+1 } else { fail=fail+1 }
187 if fd_earliest(sb,s,"no-such-class\x00" as *u8,13)==0 { pass=pass+1 } else { fail=fail+1 }
188 // T6 NEGATIVE CONTROL: a CONFIG row must NOT be mistaken for a stamp
189 if fd_earliest(cb,c,"CONFIG\x00" as *u8,6)==0 { pass=pass+1 } else { fail=fail+1 }
190 // T7 SCALE TOOTH (production shape, not a fixture): 4000-row ledger, hoisted buffers, correct earliest
191 let big: *u8=sys_mmap(K_MAGIC_1048576)
192 var b: i64=0
193 var k: i64=0
194 while k<K_MAGIC_4000 {
195 b=fd_catn(big,b,K_MAGIC_3000+k); b=fd_cat(big,b,"\tfiller-class\tMITSTAMP\tx\n" as *u8)
196 k=k+1
197 }
198 b=fd_catn(big,b,42); b=fd_cat(big,b,"\tneedle-class\tMITSTAMP\tx\n" as *u8)
199 if fd_earliest(big,b,"needle-class\x00" as *u8,12)==42 { pass=pass+1 } else { fail=fail+1 }
200 if fd_earliest(big,b,"filler-class\x00" as *u8,12)==K_MAGIC_3000 { pass=pass+1 } else { fail=fail+1 }
201 let rb: *u8=sys_mmap(256)
202 var r: i64=0
203 r=fd_cat(rb,r,"nx_favela_decay selftest pass=" as *u8); r=fd_catn(rb,r,pass)
204 r=fd_cat(rb,r," fail=" as *u8); r=fd_catn(rb,r,fail)
205 if fail==0 { r=fd_cat(rb,r," VERDICT=GREEN\n" as *u8) } else { r=fd_cat(rb,r," VERDICT=RED\n" as *u8) }
206 sys_write(1,rb,r)
207 if fail>0 { sys_exit(1); return 1 }
208 return 0
209 }
210
211 // ---- manifest (fail-closed, same contract as the census)
212 let szp: *i64=sys_mmap(16) as *i64
213 let mb: *u8=sys_read_file("knowledge/registry/favela_classes.tsv\x00" as *u8, szp)
214 if (mb as i64)==0 {
215 fd_puts("FAVELA-DECAY RED -- manifest knowledge/registry/favela_classes.tsv MISSING (fail-closed)\n" as *u8)
216 sys_exit(1)
217 return 1
218 }
219 let mn: i64=szp[0]
220 let now: i64=sys_now_realtime_sec()
221
222 // ---- STAMP PASS (idempotent, rule 10): every mitigated class with no prior stamp gets one
223 let lszp: *i64=sys_mmap(16) as *i64
224 var lb: *u8=sys_read_file(LEDGER, lszp)
225 var ln: i64=0
226 if (lb as i64)!=0 { ln=lszp[0] } else { lb=sys_mmap(16); ln=0 }
227 let ab: *u8=sys_mmap(K_MAGIC_65536)
228 var ao: i64=0
229 var added: i64=0
230 let fs: *i64=sys_mmap(64) as *i64
231 let fl: *i64=sys_mmap(64) as *i64
232 var i: i64=0
233 while i<mn {
234 let ls: i64=i
235 var le: i64=ls
236 var scan: i64=1
237 while scan==1 { if le>=mn { scan=0 } else { if mb[le]==(10 as u8) { scan=0 } else { le=le+1 } } }
238 i=le+1
239 if le-ls>3 { if mb[ls]!=(35 as u8) {
240 var nf: i64=0
241 var p: i64=ls
242 var fstart: i64=ls
243 while p<le {
244 if mb[p]==(9 as u8) { if nf<7 { fs[nf]=fstart; fl[nf]=p-fstart; nf=nf+1 } fstart=p+1 }
245 p=p+1
246 }
247 if nf<7 { fs[nf]=fstart; fl[nf]=le-fstart; nf=nf+1 }
248 if nf==7 {
249 if mb[fs[3]]==(109 as u8) {
250 let e: i64=fd_earliest(lb, ln, (mb as i64+fs[0]) as *u8, fl[0])
251 if e==0 {
252 ao=fd_catn(ab,ao,now); ao=fd_cat(ab,ao,"\t" as *u8)
253 ao=fd_catf(ab,ao,(mb as i64+fs[0]) as *u8, fl[0])
254 ao=fd_cat(ab,ao,"\tMITSTAMP\tfirst-observed-mitigated\n" as *u8)
255 added=added+1
256 }
257 }
258 }
259 } }
260 }
261 if ao>0 {
262 let afd: i64=sys_openat_append(LEDGER, 0x1a4)
263 if afd<0 { fd_puts("FAVELA-DECAY RED -- cannot append ledger\n" as *u8); sys_exit(1); return 1 }
264 sys_write(afd, ab, ao)
265 sys_close(afd)
266 lb=sys_read_file(LEDGER, lszp)
267 ln=0
268 if (lb as i64)!=0 { ln=lszp[0] }
269 }
270 if fd_slice_eq(verb, vn, "stamp\x00" as *u8, 5)==1 {
271 let pb2: *u8=sys_mmap(128); var q2: i64=0
272 q2=fd_cat(pb2,q2,"STAMPED new=" as *u8); q2=fd_catn(pb2,q2,added)
273 q2=fd_cat(pb2,q2," (idempotent -- existing stamps untouched)\n" as *u8)
274 sys_write(1,pb2,q2)
275 return 0
276 }
277
278 // ---- CHECK PASS: age each mitigation, re-weight the expired ones as OPEN
279 let days: i64=fd_cfg_days(lb, ln)
280 var cfg_present: i64=1
281 if days==0 { cfg_present=0 }
282 let jb: *u8=sys_mmap(K_MAGIC_262144)
283 var j: i64=0
284 j=fd_cat(jb,j,"{\x22v\x22:1,\x22domain\x22:\x22favela-decay\x22,\x22title\x22:\x22Mitigation decay -- a mitigation is not allowed to be terminal\x22,\x22decay_days\x22:" as *u8)
285 j=fd_catn(jb,j,days)
286 j=fd_cat(jb,j,",\x22config_present\x22:" as *u8); j=fd_catn(jb,j,cfg_present)
287 j=fd_cat(jb,j,",\x22stamps_added_this_run\x22:" as *u8); j=fd_catn(jb,j,added)
288 j=fd_cat(jb,j,",\x22decayed\x22:[" as *u8)
289 var total: i64=0; var wnow: i64=0; var wdecay: i64=0
290 var nmit: i64=0; var ndec: i64=0; var nclass: i64=0
291 var first: i64=1
292 i=0
293 while i<mn {
294 let ls: i64=i
295 var le: i64=ls
296 var scan: i64=1
297 while scan==1 { if le>=mn { scan=0 } else { if mb[le]==(10 as u8) { scan=0 } else { le=le+1 } } }
298 i=le+1
299 if le-ls>3 { if mb[ls]!=(35 as u8) {
300 var nf: i64=0
301 var p: i64=ls
302 var fstart: i64=ls
303 while p<le {
304 if mb[p]==(9 as u8) { if nf<7 { fs[nf]=fstart; fl[nf]=p-fstart; nf=nf+1 } fstart=p+1 }
305 p=p+1
306 }
307 if nf<7 { fs[nf]=fstart; fl[nf]=le-fstart; nf=nf+1 }
308 if nf==7 {
309 let sev: i64=(mb[fs[2]] as i64)-48
310 let stc: i64=mb[fs[3]] as i64
311 nclass=nclass+1
312 total=total+2*sev
313 if stc==111 { wnow=wnow+2*sev; wdecay=wdecay+2*sev }
314 if stc==114 { wnow=wnow+0; wdecay=wdecay+0 }
315 if stc==109 {
316 nmit=nmit+1
317 wnow=wnow+sev
318 let e: i64=fd_earliest(lb, ln, (mb as i64+fs[0]) as *u8, fl[0])
319 var aged: i64=0
320 if e>0 { aged=(now-e)/K_MAGIC_86400 }
321 var dec: i64=0
322 if aged>=days { dec=1 }
323 if dec==1 {
324 ndec=ndec+1
325 wdecay=wdecay+2*sev
326 if first==0 { j=fd_cat(jb,j,"," as *u8) }
327 first=0
328 j=fd_cat(jb,j,"{\x22class\x22:\x22" as *u8); j=fd_catf(jb,j,(mb as i64+fs[0]) as *u8, fl[0])
329 j=fd_cat(jb,j,"\x22,\x22sev\x22:" as *u8); j=fd_catn(jb,j,sev)
330 j=fd_cat(jb,j,",\x22age_days\x22:" as *u8); j=fd_catn(jb,j,aged)
331 j=fd_cat(jb,j,",\x22window_days\x22:" as *u8); j=fd_catn(jb,j,days)
332 j=fd_cat(jb,j,",\x22root_fix\x22:\x22" as *u8); j=fd_catf(jb,j,(mb as i64+fs[6]) as *u8, fl[6])
333 j=fd_cat(jb,j,"\x22,\x22action\x22:\x22re-weighted as OPEN -- root it or re-justify the mitigation\x22}" as *u8)
334 } else {
335 wdecay=wdecay+sev
336 }
337 }
338 }
339 } }
340 }
341 var fnow: i64=0
342 var fdec: i64=0
343 if total>0 { fnow=(wnow*1000)/total; fdec=(wdecay*1000)/total }
344 j=fd_cat(jb,j,"],\x22classes\x22:" as *u8); j=fd_catn(jb,j,nclass)
345 j=fd_cat(jb,j,",\x22mitigated\x22:" as *u8); j=fd_catn(jb,j,nmit)
346 j=fd_cat(jb,j,",\x22decayed_count\x22:" as *u8); j=fd_catn(jb,j,ndec)
347 j=fd_cat(jb,j,",\x22favela_permil_now\x22:" as *u8); j=fd_catn(jb,j,fnow)
348 j=fd_cat(jb,j,",\x22favela_permil_if_all_decay\x22:" as *u8); j=fd_catn(jb,j,fdec)
349 j=fd_cat(jb,j,",\x22rule\x22:\x22a mitigation older than decay_days re-weights from sev to 2*sev (same as open): half credit EXPIRES. Root it, or append a fresh justification row.\x22" as *u8)
350 j=fd_cat(jb,j,",\x22failclosed\x22:\x22no CONFIG row => decay_days=0 => every mitigation already expired; a missing config can never silently grant infinite grace\x22" as *u8)
351 j=fd_cat(jb,j,",\x22envelope\x22:\x22clock starts at FIRST OBSERVATION (the true mitigation date is unknowable -- no historical record existed before this organ), so ages under-report until the ledger matures; ledger scan is O(rows x mitigated-classes) with hoisted buffers, proven to 4000 rows in selftest T7; manifest = the curated favela roster, NOT exhaustive\x22" as *u8)
352 j=fd_cat(jb,j,",\x22handoff\x22:\x22DECAYED rows are the signal for the cap-autonomy lane auto-filer (intake/debt/frontier) -- this organ deliberately does NOT file, to avoid double-driving that owner\x22}" as *u8)
353 sys_write(1, jb, j)
354 sys_write(1, "\n" as *u8, 1)
355 let lf: i64=sys_openat_wr("knowledge/status/favela_decay.log\x00" as *u8, 0x1a4)
356 if lf>=0 {
357 sys_write(lf, jb, j)
358 let tail: *u8=sys_mmap(256)
359 var t: i64=0
360 t=fd_cat(tail,t,"\nVERDICT=" as *u8)
361 if ndec==0 { t=fd_cat(tail,t,"GREEN" as *u8) } else { t=fd_cat(tail,t,"RED" as *u8) }
362 t=fd_cat(tail,t," decayed=" as *u8); t=fd_catn(tail,t,ndec)
363 t=fd_cat(tail,t," mitigated=" as *u8); t=fd_catn(tail,t,nmit)
364 t=fd_cat(tail,t," window_days=" as *u8); t=fd_catn(tail,t,days)
365 t=fd_cat(tail,t,"\n" as *u8)
366 sys_write(lf, tail, t)
367 sys_close(lf)
368 }
369 return 0
370}