code wiki / _hdl_build / nx_survey_engine_gate.nx

nx_survey_engine_gate.nx source

↩ module page · 275 lines · 15385 B

1import "nx_gate_gn.nx" 2// nx_survey_engine_gate.nx -- GATE for the general survey/poll engine (nx_survey_engine). 3// Proves on a hermetic /tmp seg_store: 4// load spec-as-data (poll + deep survey) -> respond -> REVOTE REPLACES (one respondent = one 5// effective ballot BY CONSTRUCTION of per-key latest-wins; NEG-CONTROL: the naive append tally 6// over preserved history double-counts) -> identical resubmit stays stable -> close FREEZES -> 7// invalid answers/tokens/qids refused LOUD with the store unchanged -> text answers optional + 8// maxtext-capped -> survey isolation -> and the ballot COMPOSES the existing nx_survey triage 9// (sv_triage/sv_band on a_<qid> fields) = the situation-management lib is the scoring layer. 10// Exits 0 iff ALL pass. license_tier: ORIGINAL expect_exit: 0 11import "nx_syscalls.nx" 12import "nx_survey_engine.nx" 13 14func gp(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 15func chk(name: *u8, got: i64, want: i64, st: *i64) -> i64 { 16 if got == want { st[0] = st[0] + 1; gp(" PASS " as *u8); gp(name); gp("\n" as *u8) } 17 else { st[1] = st[1] + 1; gp(" FAIL " as *u8); gp(name); gp(" got=" as *u8); gn(got); gp(" want=" as *u8); gn(want); gp("\n" as *u8) } 18 return 0 19} 20 21func main() -> i64 { 22 let st: *i64 = sys_mmap(16) as *i64 23 st[0] = 0 24 st[1] = 0 25 gp("=== nx_survey_engine_gate (poll+survey as data; latest-wins ballots; close-freeze; triage compose) ===\n" as *u8) 26 27 // hermetic prefix "/tmp/svye_<us>-" 28 let pfx: *u8 = sys_mmap(64) 29 var pp: i64 = se_cat(pfx, 0, "/tmp/svye_" as *u8) 30 pp = se_catn(pfx, pp, sys_now_us()) 31 pp = se_catc(pfx, pp, 45) 32 pfx[pp] = 0 as u8 33 34 // ---- E1 load the 1-question POLL ---- 35 let specA: *u8 = "@survey pulse\n@title Test Pulse\n@anon 1\n@kmin 2\nQ|q1|C|Best day|Mon|Tue|Wed\n" as *u8 36 let idb: *u8 = sys_mmap(64) 37 chk("E1 load poll spec -> nq=1" as *u8, se_load(pfx, specA, se_slen(specA), idb, 64), 1, st) 38 chk("E1b id captured" as *u8, se_seq(idb, "pulse" as *u8), 1, st) 39 let mks: *i64 = sys_mmap(8 * 32) as *i64 40 let mvs: *i64 = sys_mmap(8 * 32) as *i64 41 let mnf: i64 = se_meta(pfx, "pulse" as *u8, mks, mvs, 32) 42 var m_ok: i64 = 0 43 if mnf > 0 { 44 if se_field_n(mks, mvs, mnf, "kmin" as *u8, 0 - 1) == 2 { 45 if se_field_n(mks, mvs, mnf, "anon" as *u8, 0 - 1) == 1 { 46 let stt: *u8 = sv_get(mks, mvs, mnf, "status" as *u8) 47 if (stt as i64) != 0 { if se_seq(stt, "open" as *u8) == 1 { m_ok = 1 } } 48 } 49 } 50 } 51 chk("E1c meta roundtrip (kmin=2 anon=1 status=open)" as *u8, m_ok, 1, st) 52 let qks: *i64 = sys_mmap(8 * 32) as *i64 53 let qvs: *i64 = sys_mmap(8 * 32) as *i64 54 let qnf: i64 = se_qst(pfx, "pulse" as *u8, 1, qks, qvs, 32) 55 var q_ok: i64 = 0 56 if qnf > 0 { 57 let qid: *u8 = sv_get(qks, qvs, qnf, "qid" as *u8) 58 let opts: *u8 = sv_get(qks, qvs, qnf, "opts" as *u8) 59 if (qid as i64) != 0 { if (opts as i64) != 0 { 60 if se_seq(qid, "q1" as *u8) == 1 { if se_nopts(opts) == 3 { 61 let ob: *u8 = sys_mmap(64) 62 se_opt(opts, 1, ob, 64) 63 if se_seq(ob, "Tue" as *u8) == 1 { q_ok = 1 } 64 } } 65 } } 66 } 67 chk("E2 question roundtrip (qid=q1, 3 opts, opt1=Tue)" as *u8, q_ok, 1, st) 68 69 // ---- E3/E4 two respondents ---- 70 let aq: *i64 = sys_mmap(8 * 8) as *i64 71 let av: *i64 = sys_mmap(8 * 8) as *i64 72 aq[0] = "q1" as *u8 as i64 73 av[0] = "1" as *u8 as i64 74 chk("E3 alice responds" as *u8, se_respond(pfx, "pulse" as *u8, "alice-tok" as *u8, aq, av, 1), 1, st) 75 let bk: *i64 = sys_mmap(8 * 128) as *i64 76 let bv: *i64 = sys_mmap(8 * 128) as *i64 77 let bl: *i64 = sys_mmap(8 * 128) as *i64 78 chk("E3b ballots=1" as *u8, se_ballots(pfx, "pulse" as *u8, bk, bv, bl, 128), 1, st) 79 chk("E4 bob responds" as *u8, se_respond(pfx, "pulse" as *u8, "bob-tok00" as *u8, aq, av, 1), 1, st) 80 var nb: i64 = se_ballots(pfx, "pulse" as *u8, bk, bv, bl, 128) 81 chk("E4b ballots=2" as *u8, nb, 2, st) 82 chk("E4c count(Tue)=2" as *u8, se_count_eq(bv, bl, nb, "q1" as *u8, "1" as *u8), 2, st) 83 84 // ---- E5 REVOTE replaces; history preserved; NEG append-tally double-counts ---- 85 av[0] = "2" as *u8 as i64 86 chk("E5 alice revotes Wed" as *u8, se_respond(pfx, "pulse" as *u8, "alice-tok" as *u8, aq, av, 1), 1, st) 87 nb = se_ballots(pfx, "pulse" as *u8, bk, bv, bl, 128) 88 chk("E5b ballots STILL 2 (one voter one effective ballot)" as *u8, nb, 2, st) 89 chk("E5c count(Tue) moved 2->1" as *u8, se_count_eq(bv, bl, nb, "q1" as *u8, "1" as *u8), 1, st) 90 chk("E5d count(Wed)=1" as *u8, se_count_eq(bv, bl, nb, "q1" as *u8, "2" as *u8), 1, st) 91 // history: alice's key holds 2 VERSIONS (additive, nothing destroyed) 92 let hk: *i64 = sys_mmap(8 * 300) as *i64 93 let hpt: *i64 = sys_mmap(8 * 300) as *i64 94 let hl: *i64 = sys_mmap(8 * 300) as *i64 95 let nver_a: i64 = ss_scan_cap(pfx, "rsp:pulse:alice-tok" as *u8, hk, hpt, hl, 4096) 96 let nver_b: i64 = ss_scan_cap(pfx, "rsp:pulse:bob-tok00" as *u8, hk, hpt, hl, 4096) 97 chk("E5e alice history = 2 versions (revote destroyed nothing)" as *u8, nver_a, 2, st) 98 // NEG-CONTROL: the naive incumbent tally = count EVERY stored record -> 3 "ballots" for 2 voters 99 var naive: i64 = nver_a + nver_b 100 var neg_ok: i64 = 0 101 if naive == 3 { if nb == 2 { neg_ok = 1 } } 102 chk("E5f NEG-CONTROL: append tally says 3, effective says 2 -> naive double-counts" as *u8, neg_ok, 1, st) 103 104 // ---- E6 identical resubmit -> stable ---- 105 av[0] = "1" as *u8 as i64 106 chk("E6 bob resubmits identical" as *u8, se_respond(pfx, "pulse" as *u8, "bob-tok00" as *u8, aq, av, 1), 1, st) 107 nb = se_ballots(pfx, "pulse" as *u8, bk, bv, bl, 128) 108 var st_ok: i64 = 0 109 if nb == 2 { if se_count_eq(bv, bl, nb, "q1" as *u8, "1" as *u8) == 1 { st_ok = 1 } } 110 chk("E6b ballots=2, count(Tue)=1 -> double-submit cannot inflate" as *u8, st_ok, 1, st) 111 112 // ---- E7 LOUD refusals, store unchanged ---- 113 av[0] = "7" as *u8 as i64 114 chk("E7a out-of-range option -3" as *u8, se_respond(pfx, "pulse" as *u8, "carol-tok" as *u8, aq, av, 1), 0 - 3, st) 115 av[0] = "abc" as *u8 as i64 116 chk("E7b non-numeric choice -3" as *u8, se_respond(pfx, "pulse" as *u8, "carol-tok" as *u8, aq, av, 1), 0 - 3, st) 117 chk("E7c missing required answer -3" as *u8, se_respond(pfx, "pulse" as *u8, "carol-tok" as *u8, aq, av, 0), 0 - 3, st) 118 let aq2: *i64 = sys_mmap(8 * 8) as *i64 119 let av2: *i64 = sys_mmap(8 * 8) as *i64 120 aq2[0] = "q1" as *u8 as i64 121 av2[0] = "0" as *u8 as i64 122 aq2[1] = "q9" as *u8 as i64 123 av2[1] = "1" as *u8 as i64 124 chk("E7d unknown qid answered -6" as *u8, se_respond(pfx, "pulse" as *u8, "carol-tok" as *u8, aq2, av2, 2), 0 - 6, st) 125 av[0] = "1" as *u8 as i64 126 chk("E7e bad token -5" as *u8, se_respond(pfx, "pulse" as *u8, "x" as *u8, aq, av, 1), 0 - 5, st) 127 chk("E7f unknown survey -1" as *u8, se_respond(pfx, "ghost" as *u8, "carol-tok" as *u8, aq, av, 1), 0 - 1, st) 128 nb = se_ballots(pfx, "pulse" as *u8, bk, bv, bl, 128) 129 chk("E7g refusals left the store unchanged (ballots=2)" as *u8, nb, 2, st) 130 131 // ---- E8 close freezes ---- 132 chk("E8 close" as *u8, se_close(pfx, "pulse" as *u8), 0, st) 133 let m2ks: *i64 = sys_mmap(8 * 32) as *i64 134 let m2vs: *i64 = sys_mmap(8 * 32) as *i64 135 let m2nf: i64 = se_meta(pfx, "pulse" as *u8, m2ks, m2vs, 32) 136 var cl_ok: i64 = 0 137 if m2nf > 0 { 138 let stt2: *u8 = sv_get(m2ks, m2vs, m2nf, "status" as *u8) 139 if (stt2 as i64) != 0 { if se_seq(stt2, "closed" as *u8) == 1 { cl_ok = 1 } } 140 } 141 chk("E8b status=closed (re-stated record, history kept)" as *u8, cl_ok, 1, st) 142 chk("E8c respond after close -2" as *u8, se_respond(pfx, "pulse" as *u8, "dave-tok0" as *u8, aq, av, 1), 0 - 2, st) 143 nb = se_ballots(pfx, "pulse" as *u8, bk, bv, bl, 128) 144 chk("E8d results frozen (ballots=2)" as *u8, nb, 2, st) 145 chk("E8e close of unknown survey -1" as *u8, se_close(pfx, "ghost" as *u8), 0 - 1, st) 146 147 // ---- E9 the DEEPER survey: scale + choice + text ---- 148 let specB: *u8 = "@survey deep\n@title Deep Welfare\n@anon 0\n@kmin 1\n@results admin\n@maxtext 40\nQ|w1|S|0|10|Food security\nQ|w2|C|Housing|Stable|At risk|Crisis\nQ|w3|T|What would help\n" as *u8 149 chk("E9 load deep spec -> nq=3" as *u8, se_load(pfx, specB, se_slen(specB), idb, 64), 3, st) 150 let dq: *i64 = sys_mmap(8 * 8) as *i64 151 let dv: *i64 = sys_mmap(8 * 8) as *i64 152 dq[0] = "w1" as *u8 as i64 153 dv[0] = "3" as *u8 as i64 154 dq[1] = "w2" as *u8 as i64 155 dv[1] = "2" as *u8 as i64 156 dq[2] = "w3" as *u8 as i64 157 dv[2] = "need steady work" as *u8 as i64 158 chk("E9b dave answers all three" as *u8, se_respond(pfx, "deep" as *u8, "dave-tok0" as *u8, dq, dv, 3), 1, st) 159 let ek: *i64 = sys_mmap(8 * 128) as *i64 160 let ev: *i64 = sys_mmap(8 * 128) as *i64 161 let el: *i64 = sys_mmap(8 * 128) as *i64 162 var ndb: i64 = se_ballots(pfx, "deep" as *u8, ek, ev, el, 128) 163 chk("E9c deep ballots=1" as *u8, ndb, 1, st) 164 let nst: *i64 = sys_mmap(32) as *i64 165 se_num_stats(ev, el, ndb, "w1" as *u8, nst) 166 var ns_ok: i64 = 0 167 if nst[0] == 1 { if nst[1] == 3 { ns_ok = 1 } } 168 chk("E9d scale stats n=1 sum=3" as *u8, ns_ok, 1, st) 169 chk("E9e count(Crisis)=1" as *u8, se_count_eq(ev, el, ndb, "w2" as *u8, "2" as *u8), 1, st) 170 chk("E9f text answers counted" as *u8, se_text_count(ev, el, ndb, "w3" as *u8), 1, st) 171 let ab: *u8 = sys_mmap(256) 172 se_answer_of(ev[0] as *u8, el[0], "w3" as *u8, ab, 256) 173 chk("E9g text answer roundtrips" as *u8, se_seq(ab, "need steady work" as *u8), 1, st) 174 175 // ---- E10 bounds LOUD ---- 176 dv[0] = "11" as *u8 as i64 177 chk("E10a scale over max -3" as *u8, se_respond(pfx, "deep" as *u8, "erin-tok0" as *u8, dq, dv, 3), 0 - 3, st) 178 dv[0] = "5" as *u8 as i64 179 dv[2] = "this text answer is far longer than the forty byte cap set by the spec" as *u8 as i64 180 chk("E10b text over @maxtext -3" as *u8, se_respond(pfx, "deep" as *u8, "erin-tok0" as *u8, dq, dv, 3), 0 - 3, st) 181 182 // ---- E11 text optional; isolation ---- 183 let dq2: *i64 = sys_mmap(8 * 8) as *i64 184 let dv2: *i64 = sys_mmap(8 * 8) as *i64 185 dq2[0] = "w1" as *u8 as i64 186 dv2[0] = "5" as *u8 as i64 187 dq2[1] = "w2" as *u8 as i64 188 dv2[1] = "0" as *u8 as i64 189 chk("E11 text question optional (erin answers 2 of 3)" as *u8, se_respond(pfx, "deep" as *u8, "erin-tok0" as *u8, dq2, dv2, 2), 1, st) 190 ndb = se_ballots(pfx, "deep" as *u8, ek, ev, el, 128) 191 se_num_stats(ev, el, ndb, "w1" as *u8, nst) 192 var e11: i64 = 0 193 if ndb == 2 { if nst[0] == 2 { if nst[1] == 8 { if se_text_count(ev, el, ndb, "w3" as *u8) == 1 { e11 = 1 } } } } 194 chk("E11b deep n=2, scale sum=8, texts still 1" as *u8, e11, 1, st) 195 nb = se_ballots(pfx, "pulse" as *u8, bk, bv, bl, 128) 196 chk("E11c ISOLATION: pulse ballots still 2 (deep never leaks)" as *u8, nb, 2, st) 197 let sk: *i64 = sys_mmap(8 * 64) as *i64 198 let sv2: *i64 = sys_mmap(8 * 64) as *i64 199 let sl2: *i64 = sys_mmap(8 * 64) as *i64 200 chk("E11d survey list = 2" as *u8, se_surveys(pfx, sk, sv2, sl2, 64), 2, st) 201 202 // ---- E12 COMPOSE the existing nx_survey triage on a ballot (the consolidation proof) ---- 203 var di: i64 = 0 204 var dfound: i64 = 0 - 1 205 while di < ndb { 206 if se_seq(ek[di] as *u8, "rsp:deep:dave-tok0" as *u8) == 1 { dfound = di; di = ndb } else { di = di + 1 } 207 } 208 var tri_ok: i64 = 0 209 if dfound >= 0 { 210 let cks: *i64 = sys_mmap(8 * 40) as *i64 211 let cvs: *i64 = sys_mmap(8 * 40) as *i64 212 let cnf: i64 = canon_decode(ev[dfound] as *u8, el[dfound], cks, cvs, 40) 213 if cnf > 0 { 214 let wq: *i64 = sys_mmap(8 * 4) as *i64 215 let wt: *i64 = sys_mmap(8 * 4) as *i64 216 wq[0] = "a_w1" as *u8 as i64 217 wt[0] = 30 218 let sc: i64 = sv_triage(cks, cvs, cnf, wq, wt, 1) 219 if sc == 30 { if sv_band(sc, 20, 60) == 1 { tri_ok = 1 } } 220 } 221 } 222 chk("E12 nx_survey sv_triage/sv_band COMPOSE on the ballot (score 30 -> band strained)" as *u8, tri_ok, 1, st) 223 224 // ---- E13 bad spec lines refused ---- 225 let badA: *u8 = "@survey bad\nQ|q1|C|only one option|Solo\n" as *u8 226 chk("E13a choice with <2 options refused -2" as *u8, se_load(pfx, badA, se_slen(badA), idb, 64), 0 - 2, st) 227 let badB: *u8 = "@survey BAD_ID\nQ|q1|T|x\n" as *u8 228 chk("E13b bad survey id refused -1" as *u8, se_load(pfx, badB, se_slen(badB), idb, 64), 0 - 1, st) 229 let badC: *u8 = "@survey noq\n@title No Questions\n" as *u8 230 chk("E13c zero questions refused -5" as *u8, se_load(pfx, badC, se_slen(badC), idb, 64), 0 - 5, st) 231 232 // ---- E14 attention-check (@check) directive roundtrips into the meta 'checks' field ---- 233 let specC: *u8 = "@survey chk\n@title Chk\nQ|q1|C|Best day|Mon|Tue|Wed\nQ|q2|C|Attention: pick option two|A|B|C\n@check q2 1\n" as *u8 234 chk("E14 load spec with @check -> nq=2" as *u8, se_load(pfx, specC, se_slen(specC), idb, 64), 2, st) 235 let cks: *i64 = sys_mmap(8 * 32) as *i64 236 let cvs: *i64 = sys_mmap(8 * 32) as *i64 237 let cnf: i64 = se_meta(pfx, "chk" as *u8, cks, cvs, 32) 238 var chkok: i64 = 0 239 if cnf > 0 { 240 let cv: *u8 = sv_get(cks, cvs, cnf, "checks" as *u8) 241 if (cv as i64) != 0 { if se_seq(cv, "q2:1," as *u8) == 1 { chkok = 1 } } 242 } 243 chk("E14b checks field = 'q2:1,'" as *u8, chkok, 1, st) 244 245 // ---- E15 @quota caps DISTINCT respondents; a revote by an existing respondent is EXEMPT ---- 246 let specQ: *u8 = "@survey cap\n@title Capped\n@quota 2\nQ|q1|C|Pick|Yes|No\n" as *u8 247 chk("E15 load @quota 2 -> nq=1" as *u8, se_load(pfx, specQ, se_slen(specQ), idb, 64), 1, st) 248 let cqk: *i64 = sys_mmap(8 * 32) as *i64 249 let cqv: *i64 = sys_mmap(8 * 32) as *i64 250 let cqn: i64 = se_meta(pfx, "cap" as *u8, cqk, cqv, 32) 251 chk("E15b quota meta field = 2 (data-driven, in the record)" as *u8, se_field_n(cqk, cqv, cqn, "quota" as *u8, 0), 2, st) 252 let cqq: *i64 = sys_mmap(8 * 4) as *i64 253 let cqa: *i64 = sys_mmap(8 * 4) as *i64 254 cqq[0] = "q1" as *u8 as i64 255 cqa[0] = "0" as *u8 as i64 256 chk("E15c respondent A accepted (1 of 2)" as *u8, se_respond(pfx, "cap" as *u8, "aaa-tok0" as *u8, cqq, cqa, 1), 1, st) 257 cqa[0] = "1" as *u8 as i64 258 chk("E15d respondent B accepted (2 of 2 = full)" as *u8, se_respond(pfx, "cap" as *u8, "bbb-tok0" as *u8, cqq, cqa, 1), 1, st) 259 chk("E15e NEW respondent C REFUSED -8 quota reached" as *u8, se_respond(pfx, "cap" as *u8, "ccc-tok0" as *u8, cqq, cqa, 1), 0 - 8, st) 260 cqa[0] = "0" as *u8 as i64 261 chk("E15f EXISTING respondent A revote accepted (exempt -- never inflates the tally)" as *u8, se_respond(pfx, "cap" as *u8, "aaa-tok0" as *u8, cqq, cqa, 1), 1, st) 262 let cqbk: *i64 = sys_mmap(8 * 64) as *i64 263 let cqbv: *i64 = sys_mmap(8 * 64) as *i64 264 let cqbl: *i64 = sys_mmap(8 * 64) as *i64 265 chk("E15g count STILL 2 after refused C + A revote (quota never inflated)" as *u8, se_ballots(pfx, "cap" as *u8, cqbk, cqbv, cqbl, 64), 2, st) 266 267 gp("nx_survey_engine_gate: PASS=" as *u8) 268 gn(st[0]) 269 gp(" FAIL=" as *u8) 270 gn(st[1]) 271 gp("\n" as *u8) 272 if st[1] == 0 { gp("VERDICT: verdict=GREEN (survey engine: data-driven specs, latest-wins ballots, close-freeze, LOUD bounds, triage compose)\n" as *u8); return 0 } 273 gp("VERDICT: RED\n" as *u8) 274 return 1 275}