nx_dr_refute_cli.nx source
↩ module page · 91 lines · 4688 B
1// nx_dr_refute_cli.nx -- callable MCP/API surface for the adversarial refutation stage (DR-2).
2// Aggregates N verifier votes on a claim under a correlation estimate and decides KILL vs
3// SURVIVE, encoding the decorrelation discount (correlated verifiers count less).
4// nx_dr_refute <rho_permil> <bar_permil> <votes_csv>
5// votes = comma-separated per-verifier verdicts: 0=refute 1=abstain 2=support
6// rho_permil = estimated correlation among verifiers (0=independent, 1000=one voice)
7// bar_permil = confidence bar in EFFECTIVE independent refutations (e.g. 2000 = 2 votes)
8// e.g. nx_dr_refute 0 2000 0,0,0,0,2 -> {"killed":1,"verdict":"KILLED",...}
9// nx_dr_refute 1000 2000 0,0,0,0,2 -> {"killed":0,"verdict":"SURVIVED",...} (correlated)
10// license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0
11import "nx_dr_refute.nx"
12import "nx_syscalls.nx"
13const K_MAGIC_1024: i64 = 1024
14
15func rb_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
16func rb_q() -> i64 { let b: *u8 = sys_mmap(1); b[0] = 34 as u8; sys_write(1, b, 1); return 0 }
17func rb_key(name: *u8) -> i64 { rb_q(); rb_puts(name); rb_q(); rb_puts(":" as *u8); return 0 }
18func rb_num(v: i64) -> i64 {
19 let bb: *u8 = sys_mmap(28); var m: i64 = v; var neg: i64 = 0
20 if m < 0 { neg = 1; m = 0 - m }
21 let t: *u8 = sys_mmap(28); var k: i64 = 0
22 if m == 0 { t[0] = 48 as u8; k = 1 }
23 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
24 var o: i64 = 0
25 if neg == 1 { bb[o] = 45 as u8; o = o + 1 }
26 var i: i64 = 0
27 while i < k { bb[o] = t[k-1-i]; o = o + 1; i = i + 1 }
28 sys_write(1, bb, o); return 0
29}
30func rb_strlen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
31func rb_atoi(a: *u8) -> i64 {
32 var v: i64 = 0; var i: i64 = 0
33 while a[i] != (0 as u8) {
34 let ch: i64 = a[i] as i64
35 if ch >= 48 { if ch <= 57 { v = v * 10 + (ch - 48) } }
36 i = i + 1
37 }
38 return v
39}
40func rb_parse_csv(s: *u8, out: *i64, maxn: i64) -> i64 {
41 var cnt: i64 = 0; var cur: i64 = 0; var have: i64 = 0; var i: i64 = 0
42 let n: i64 = rb_strlen(s)
43 while i < n {
44 let c: i64 = s[i] as i64
45 if c >= 48 { if c <= 57 { cur = cur * 10 + (c - 48); have = 1 } }
46 if c == 44 { if cnt < maxn { out[cnt] = cur; cnt = cnt + 1 } cur = 0; have = 0 }
47 i = i + 1
48 }
49 if have == 1 { if cnt < maxn { out[cnt] = cur; cnt = cnt + 1 } }
50 return cnt
51}
52
53func main(argc: i64, argv: *i64) -> i64 {
54 if argc < 4 { rb_puts("{" as *u8); rb_key("error" as *u8); rb_q(); rb_puts("usage: nx_dr_refute <rho_permil> <bar_permil> <votes_csv 0=refute 1=abstain 2=support>" as *u8); rb_q(); rb_puts("}\n" as *u8); sys_exit(2); return 2 }
55 let rho: i64 = rb_atoi(argv[1] as *u8)
56 let bar: i64 = rb_atoi(argv[2] as *u8)
57 let raw: *i64 = sys_mmap(K_MAGIC_1024 * 8) as *i64
58 let n: i64 = rb_parse_csv(argv[3] as *u8, raw, K_MAGIC_1024)
59 if n < 1 { rb_puts("{" as *u8); rb_key("error" as *u8); rb_q(); rb_puts("need >=1 vote" as *u8); rb_q(); rb_puts("}\n" as *u8); sys_exit(1); return 1 }
60
61 // map 0/1/2 -> -1/0/+1
62 let sv: *i64 = sys_mmap(K_MAGIC_1024 * 8) as *i64
63 var i: i64 = 0
64 while i < n { sv[i] = raw[i] - 1; i = i + 1 }
65 let out: *i64 = sys_mmap(3 * 8) as *i64
66 rf_tally(sv, n, out)
67 let R: i64 = out[0]
68 let S: i64 = out[1]
69 let A: i64 = out[2]
70 let effn: i64 = rf_effective_n(n, rho)
71 let effref: i64 = rf_effective_refutes(R, n, rho)
72 let killed: i64 = rf_kill(R, S, n, rho, bar)
73
74 rb_puts("{" as *u8)
75 rb_key("tool" as *u8); rb_q(); rb_puts("nx_dr_refute" as *u8); rb_q(); rb_puts("," as *u8)
76 rb_key("m" as *u8); rb_num(n); rb_puts("," as *u8)
77 rb_key("refutes" as *u8); rb_num(R); rb_puts("," as *u8)
78 rb_key("supports" as *u8); rb_num(S); rb_puts("," as *u8)
79 rb_key("abstains" as *u8); rb_num(A); rb_puts("," as *u8)
80 rb_key("rho_permil" as *u8); rb_num(rho); rb_puts("," as *u8)
81 rb_key("effective_n_permil" as *u8); rb_num(effn); rb_puts("," as *u8)
82 rb_key("effective_refutes_permil" as *u8); rb_num(effref); rb_puts("," as *u8)
83 rb_key("bar_permil" as *u8); rb_num(bar); rb_puts("," as *u8)
84 rb_key("killed" as *u8); rb_num(killed); rb_puts("," as *u8)
85 rb_key("verdict" as *u8); rb_q()
86 if killed == 1 { rb_puts("KILLED" as *u8) } else { rb_puts("SURVIVED" as *u8) }
87 rb_q(); rb_puts("," as *u8)
88 rb_key("note" as *u8); rb_q(); rb_puts("Co-Scientist reflection kill-stage; decorrelated m_eff=m/(1+(m-1)rho); correlated refutes discounted; sovereign integer" as *u8); rb_q()
89 rb_puts("}\n" as *u8)
90 sys_exit(0); return 0
91}