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}