code wiki / _hdl_build / nx_research_pool_admission_t68.nx
nx_research_pool_admission_t68.nx source
↩ module page · 60 lines · 3933 B
1// nx_research_pool.nx -- GATE for the engine's folded-in R2+R3 (rf_slot_* semaphore + polite rf_fetch_bank).
2// The bounded-parallel + polite logic now lives IN nx_research_engine, so EVERY researcher inherits it (DRY);
3// this organ is the gate that PROVES it: resource-sized slots, descriptor-owned exclusion, acquire/release, polite fetch.
4// (Was the R2/R3 prototype; superseded once the mechanism was folded into the engine.)
5// license_tier: ORIGINAL expect_exit: 0
6import "nx_research_engine_admission_t68.nx"
7const K_MAGIC_8388608: i64 = 8388608
8
9func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
10func gn(v: i64) -> i64 { let b: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0} 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 }
11
12func main() -> i64 {
13 let fixture: *u8 = sys_mmap(512)
14 var o: i64 = rf_scat(fixture, 0, "/tmp/research-pool-t68-" as *u8)
15 let ds: *u8 = sys_mmap(32); var v: i64 = sys_now_realtime_us(); var k: i64 = 0
16 while v > 0 { ds[k] = (48 + (v % 10)) as u8; k = k + 1; v = v / 10 }
17 while k > 0 { k = k - 1; fixture[o] = ds[k]; o = o + 1 }
18 fixture[o] = 0 as u8
19 if sys_mkdir(fixture, 0x1ed) != 0 { return 90 }
20 if sys_chdir(fixture) != 0 { return 91 }
21 gp("fixture=" as *u8); gp(fixture); gp("\n" as *u8)
22 sys_mkdir("knowledge" as *u8, 0x1ed); sys_mkdir("knowledge/status" as *u8, 0x1ed)
23 sys_mkdir("knowledge/fetched" as *u8, 0x1ed); sys_mkdir("knowledge/library" as *u8, 0x1ed)
24 let store: *TrustStore = 0 as *TrustStore
25 let dir: *u8 = "knowledge/status/research_slots" as *u8
26 sys_mkdir(dir, 0x1ed)
27 let n: i64 = rf_nslots()
28 gp("=== nx_research_pool GATE -- engine R2+R3 (polite + bounded-parallel) ===\n" as *u8)
29 gp("free_mb=" as *u8); gn(rf_free_mb()); gp(" concurrency slots N=" as *u8); gn(n); gp("\n" as *u8)
30 var pass: i64 = 0; var total: i64 = 0
31
32 // T1: resource sizing sane (1..MAX)
33 var t1: i64 = 0; if n >= 1 { t1 = 1 }
34 total=total+1; if t1==1 { pass=pass+1; gp(" PASS T1 slots sized 1..MAX\n" as *u8) } else { gp(" FAIL T1\n" as *u8) }
35
36 // T2: descriptor-owned exclusion -- a 2nd lock on the SAME slot must be DENIED (this is what bounds concurrency)
37 let p: *u8 = sys_mmap(512); rf_slotpath(dir, 0, p)
38 let a: i64 = rf_slot_lock(p)
39 let b: i64 = rf_slot_lock(p)
40 var t2: i64 = 0; if a >= 0 { if b < 0 { t2 = 1 } }
41 if a >= 0 { rf_slot_release(dir, 0, a) }
42 if b >= 0 { sys_close(b) }
43 total=total+1; if t2==1 { pass=pass+1; gp(" PASS T2 descriptor-owned slot exclusion (2nd acquire denied)\n" as *u8) } else { gp(" FAIL T2\n" as *u8) }
44
45 // T3: acquire/release roundtrip through the semaphore
46 let idx: *i64 = sys_mmap(16) as *i64
47 let fd: i64 = rf_slot_acquire(dir, n, idx)
48 var t3: i64 = 0; if fd >= 0 { t3 = 1; rf_slot_release(dir, idx[0], fd) }
49 total=total+1; if t3==1 { pass=pass+1; gp(" PASS T3 acquire/release roundtrip (slot " as *u8); gn(idx[0]); gp(")\n" as *u8) } else { gp(" FAIL T3\n" as *u8) }
50
51 // T4: local cached raw through actual bank API; network admission is covered by the engine gate
52 let cap: i64 = K_MAGIC_8388608; let out: *u8 = sys_mmap(cap)
53 rf_save("knowledge/fetched/rp_gate_r6b.raw" as *u8, "<p>local fixture</p>" as *u8, 20)
54 let r: i64 = rf_fetch_bank("" as *u8, "rp_gate_r6b" as *u8, store, out, cap)
55 total=total+1; if r==1 { pass=pass+1; gp(" PASS T4 retained local raw fixture -> banked\n" as *u8) } else { gp(" FAIL T4 fetch\n" as *u8) }
56
57 gp("---- nx_research_pool GATE: " as *u8); gn(pass); gp(" / " as *u8); gn(total); gp(" ----\n" as *u8)
58 if pass==total { gp("verdict=GREEN (private slot ownership and local banking validated; network workload not exercised)\n" as *u8); return 0 }
59 gp("verdict=RED\n" as *u8); return 1
60}