code wiki / _hdl_build / nx_polite_daemon.nx
nx_polite_daemon.nx source
↩ module page · 92 lines · 5738 B
1// nx_polite_daemon.nx -- the team's CONTINUOUS, HOSTING-AWARE autonomous backlog loop. KEPT SMALL so the
2// (currently toy-level) sovereign compiler builds it deterministically -- the live-monitor PAGE is built
3// SEPARATELY by the website builder (backlog refactor), reading this loop's heartbeat. Each beat: sense the
4// host (nx_sysload: load, cpu, free mem, live :8443 conns) -> governor (nx_resource_governor) decides
5// SERVE-FIRST pause (yield to live hosting) / minimal / run -> compose-or-raise-hand -> append a HEARTBEAT to
6// /tmp/nishi_loop_status.log -> sleep. Stop via /tmp/nishi_loop_stop. license_tier: ORIGINAL
7import "nx_sysload.nx"
8import "nx_resource_governor.nx"
9import "nx_syscalls.nx"
10
11func pd_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
12func pd_n(v: i64) -> i64 { let b: *u8=sys_mmap(28); var m: i64=v; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1}; while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}; var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1}; sys_write(1,b,k); return 0 }
13func pd_fw(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 }
14func pd_fn(fd: i64, v: i64) -> i64 { let b: *u8=sys_mmap(28); var m: i64=v; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1}; while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}; var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1}; sys_write(fd,b,k); return 0 }
15
16const PL_RESERVE: i64 = 1
17const PL_MEM_FLOOR_MB: i64 = 1024
18const PL_INTERVAL_MS: i64 = 60000
19const PL_MAXTICKS: i64 = 100000
20const NTYPE: i64 = 8
21const NP: i64 = 8
22const NTASK: i64 = 6
23
24func pd_reach(tin: i64, tout: i64, pin: *i64, pout: *i64, pav: *i64, reach: *i64) -> i64 {
25 var i: i64=0; while i<NTYPE { reach[i]=0; i=i+1 }
26 reach[tin]=1
27 var ch: i64=1
28 while ch==1 { ch=0; var p: i64=0; while p<NP { if pav[p]==1 { if reach[pin[p]]==1 { if reach[pout[p]]==0 { reach[pout[p]]=1; ch=1 } } } p=p+1 } }
29 return reach[tout]
30}
31
32func main() -> i64 {
33 let pin:*i64=sys_mmap(8*NP) as *i64; let pout:*i64=sys_mmap(8*NP) as *i64; let pav:*i64=sys_mmap(8*NP) as *i64
34 pin[0]=1;pout[0]=2;pav[0]=1; pin[1]=0;pout[1]=2;pav[1]=1; pin[2]=2;pout[2]=3;pav[2]=1; pin[3]=2;pout[3]=4;pav[3]=1
35 pin[4]=2;pout[4]=4;pav[4]=1; pin[5]=2;pout[5]=5;pav[5]=0; pin[6]=2;pout[6]=7;pav[6]=0; pin[7]=7;pout[7]=6;pav[7]=0
36 let tin:*i64=sys_mmap(8*NTASK) as *i64; let tout:*i64=sys_mmap(8*NTASK) as *i64
37 tin[0]=0;tout[0]=3; tin[1]=0;tout[1]=3; tin[2]=2;tout[2]=4; tin[3]=1;tout[3]=4; tin[4]=2;tout[4]=5; tin[5]=2;tout[5]=6
38 let reach:*i64=sys_mmap(8*NTYPE) as *i64
39 let sfd: i64 = sys_openat_append("/tmp/nishi_loop_status.log" as *u8, 0x1a4)
40 pd_fw(sfd, "\n# POLITE DAEMON start (continuous, hosting-aware)\n" as *u8)
41
42 var tick: i64 = 0
43 while tick < PL_MAXTICKS {
44 let stb: *i64 = sys_mmap(16) as *i64
45 let stop: *u8 = sys_read_file("/tmp/nishi_loop_stop" as *u8, stb)
46 if (stop as i64) != 0 { tick = PL_MAXTICKS }
47 else {
48 let load: i64 = sl_loadavg_milli()
49 let ncpu: i64 = sl_ncpu()
50 let freemb: i64 = sl_freemem_mb()
51 let conns: i64 = sl_active_conns_8443()
52 let hres: i64 = rg_hosting_reserve(ncpu)
53 let hceil: i64 = rg_hosting_ceil_milli()
54 let pfb: *i64 = sys_mmap(16) as *i64
55 let pf: *u8 = sys_read_file("/tmp/nishi_pause" as *u8, pfb)
56 let serve: i64 = rg_serve_first(conns)
57 let backoff: i64 = rg_should_backoff(RG_POLITE, ncpu, load, hceil)
58 let memok: i64 = rg_memory_ok(freemb, PL_MEM_FLOOR_MB)
59 let budget: i64 = rg_worker_budget(RG_POLITE, ncpu, load, hres, hceil)
60
61 pd_fw(sfd, "BEAT " as *u8); pd_fn(sfd, tick+1); pd_fw(sfd, " conns=" as *u8); pd_fn(sfd, conns); pd_fw(sfd, " load=" as *u8); pd_fn(sfd, load)
62 if serve != 0 { pd_fw(sfd, " PAUSE serve-first\n" as *u8) }
63 else { if (pf as i64) != 0 { pd_fw(sfd, " PAUSE flag\n" as *u8) }
64 else { if backoff == 1 { pd_fw(sfd, " PAUSE load\n" as *u8) }
65 else { if memok == 0 { pd_fw(sfd, " PAUSE mem\n" as *u8) }
66 else {
67 var built: i64=0; var hands: i64=0; var did: i64=0; var i: i64=0
68 while i < NTASK { if did >= budget { i = NTASK } else { if pd_reach(tin[i], tout[i], pin, pout, pav, reach) == 1 { built=built+1 } else { hands=hands+1 } did=did+1; i=i+1 } }
69 // AUTONOMY WIRING (2026-06-09): each RUN beat drives ONE ladder tick --
70 // gates run, BENCH/RUNGGRADE refresh, wiki ladder page regenerates,
71 // Claude out of the loop. Signal-aware; tick exit = fail count.
72 let tenv: *i64 = sys_mmap(32) as *i64
73 tenv[0] = "PATH=/usr/bin:/bin" as *u8 as i64; tenv[1] = 0
74 let tav: *i64 = sys_mmap(32) as *i64
75 tav[0] = "/tmp/nx_ladder_tick.sov.elf" as *u8 as i64; tav[1] = 0
76 var trc: i64 = 0
77 let tpid: i64 = sys_fork()
78 if tpid == 0 { sys_execve("/tmp/nx_ladder_tick.sov.elf" as *u8, tav, tenv); sys_exit(127) }
79 let tst: *i64 = sys_mmap(16) as *i64
80 sys_wait4(tpid, tst, 0)
81 let tsig: i64 = tst[0] & 0x7f
82 if tsig != 0 { trc = 128 + tsig } else { trc = (tst[0] >> 8) & 0xff }
83 pd_fw(sfd, " RUN composed=" as *u8); pd_fn(sfd, built); pd_fw(sfd, " hands=" as *u8); pd_fn(sfd, hands)
84 pd_fw(sfd, " tick_fails=" as *u8); pd_fn(sfd, trc); pd_fw(sfd, "\n" as *u8)
85 } } } }
86 sys_sleep_ms(PL_INTERVAL_MS)
87 tick = tick + 1
88 }
89 }
90 sys_close(sfd)
91 sys_exit(0); return 0
92}