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}