code wiki / (root) / nx_survey_gate.nx

nx_survey_gate.nx source

↩ module page · 95 lines · 4725 B

1// nx_survey_gate.nx -- R0 GATE: proves the survey engine captures a response as a content-addressed record, 2// round-trips numeric + flag answers, and derives a data-driven TRIAGE score + band that distinguishes a 3// CRISIS profile from a STABLE one (so the system routes the person to the right help). Hermetic /tmp 4// prefix. Exits 0 iff ALL pass. license_tier: ORIGINAL 5import "nx_syscalls.nx" 6import "nx_survey.nx" 7 8func g_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 9func g_putn(v: i64) -> i64 { 10 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 } 11 var m: i64 = v; if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m } 12 let d: *u8 = sys_mmap(24); var k: i64 = 0 13 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 14 var j: i64 = k - 1 15 while j >= 0 { sys_write(1, ((d as i64)+j) as *u8, 1); j = j - 1 } 16 return 0 17} 18func chk(name: *u8, got: i64, want: i64, st: *i64) -> i64 { 19 if got == want { st[0] = st[0] + 1; g_puts(" PASS "); g_puts(name); g_puts("\n") } 20 else { st[1] = st[1] + 1; g_puts(" FAIL "); g_puts(name); g_puts(" got="); g_putn(got); g_puts(" want="); g_putn(want); g_puts("\n") } 21 return 0 22} 23func seti(a: *i64, i: i64, v: i64) -> i64 { a[i] = v; return 0 } 24 25func main() -> i64 { 26 let st: *i64 = sys_mmap(16) as *i64 27 st[0] = 0; st[1] = 0 28 29 // hermetic prefix "/tmp/svy_<us>-" 30 let pfx: *u8 = sys_mmap(64) 31 var pp: i64 = 0 32 let pre: *u8 = "/tmp/svy_\x00" as *u8 33 while pre[pp] != (0 as u8) { pfx[pp] = pre[pp]; pp = pp + 1 } 34 let us: i64 = sys_now_us() 35 let tmp: *u8 = sys_mmap(32); var m: i64 = us; var kk: i64 = 0 36 if m == 0 { tmp[0] = 0x30 as u8; kk = 1 } 37 while m > 0 { tmp[kk] = (0x30 + (m % 10)) as u8; m = m / 10; kk = kk + 1 } 38 var z: i64 = kk - 1 39 while z >= 0 { pfx[pp] = tmp[z]; pp = pp + 1; z = z - 1 } 40 pfx[pp] = 0x2d as u8; pp = pp + 1; pfx[pp] = 0 as u8 41 42 // question ids (shared by both respondents) 43 let qids: *i64 = sys_mmap(8 * 8) as *i64 44 qids[0] = "behind_mortgage\x00" as *u8 as i64 45 qids[1] = "medical_debt\x00" as *u8 as i64 46 qids[2] = "job_loss_risk\x00" as *u8 as i64 47 qids[3] = "high_interest_debt\x00" as *u8 as i64 48 qids[4] = "emergency_fund_months\x00" as *u8 as i64 49 qids[5] = "income_monthly\x00" as *u8 as i64 50 51 // triage weights (DATA) 52 let wq: *i64 = sys_mmap(8 * 8) as *i64 53 let wt: *i64 = sys_mmap(8 * 8) as *i64 54 wq[0] = "behind_mortgage\x00" as *u8 as i64; wt[0] = 30 55 wq[1] = "medical_debt\x00" as *u8 as i64; wt[1] = 25 56 wq[2] = "job_loss_risk\x00" as *u8 as i64; wt[2] = 20 57 wq[3] = "high_interest_debt\x00" as *u8 as i64; wt[3] = 15 58 59 // ---- CRISIS respondent ---- 60 let v1: *i64 = sys_mmap(8 * 8) as *i64 61 seti(v1,0,1); seti(v1,1,1); seti(v1,2,1); seti(v1,3,1); seti(v1,4,0); seti(v1,5,4000) 62 let cid1: *u8 = sys_mmap(96) 63 chk("record crisis response", sv_record(pfx, "elder\x00" as *u8, qids, v1, 6, cid1), 0, st) 64 let k1: *i64 = sys_mmap(8 * 64) as *i64 65 let d1: *i64 = sys_mmap(8 * 64) as *i64 66 let nf1: i64 = sv_load(pfx, cid1, k1, d1, 64) 67 var lok: i64 = 0 68 if nf1 > 0 { lok = 1 } 69 chk("response loads + decodes", lok, 1, st) 70 chk("numeric answer round-trips (income=4000)", sv_answer(k1, d1, nf1, "income_monthly\x00" as *u8), 4000, st) 71 chk("flag answer round-trips (behind_mortgage=1)", sv_answer(k1, d1, nf1, "behind_mortgage\x00" as *u8), 1, st) 72 chk("absent question -> 0", sv_answer(k1, d1, nf1, "owns_yacht\x00" as *u8), 0, st) 73 let t1: i64 = sv_triage(k1, d1, nf1, wq, wt, 4) 74 g_puts(" [info] crisis triage score="); g_putn(t1); g_puts("\n") 75 chk("crisis triage score = 90", t1, 90, st) 76 chk("crisis band = 2 (crisis)", sv_band(t1, 20, 60), 2, st) 77 78 // ---- STABLE respondent (same questions, no risks) ---- 79 let v2: *i64 = sys_mmap(8 * 8) as *i64 80 seti(v2,0,0); seti(v2,1,0); seti(v2,2,0); seti(v2,3,0); seti(v2,4,6); seti(v2,5,8000) 81 let cid2: *u8 = sys_mmap(96) 82 chk("record stable response", sv_record(pfx, "stable\x00" as *u8, qids, v2, 6, cid2), 0, st) 83 chk("distinct respondent -> distinct CID", sv_streq(cid1, cid2), 0, st) 84 let k2: *i64 = sys_mmap(8 * 64) as *i64 85 let d2: *i64 = sys_mmap(8 * 64) as *i64 86 let nf2: i64 = sv_load(pfx, cid2, k2, d2, 64) 87 let t2: i64 = sv_triage(k2, d2, nf2, wq, wt, 4) 88 chk("stable triage score = 0", t2, 0, st) 89 chk("stable band = 0 (stable)", sv_band(t2, 20, 60), 0, st) 90 91 g_puts("nx_survey_gate: PASS="); g_putn(st[0]); g_puts(" FAIL="); g_putn(st[1]); g_puts("\n") 92 if st[1] == 0 { g_puts("SITUATION R0 nx_survey: GREEN\n"); return 0 } 93 g_puts("SITUATION R0 nx_survey: RED\n") 94 return 1 95}