code wiki / _hdl_build / nx_pub_canary_gate.nx
nx_pub_canary_gate.nx source
↩ module page · 72 lines · 5395 B
1// nx_pub_canary_gate.nx -- R14b PROOF + MEASURED HEAD-TO-HEAD: canary rollout limits blast radius.
2//
3// A new version is staged to a SEPARATE canary slot and served-smoke-checked over a cohort BEFORE any promotion to
4// main. A bad version (served result != approved) fails the canary cohort -> ABORT -> main is never touched. Measured
5// vs the naive baseline that pushes straight to main:
6// bad version -> naive: main serves BAD (100% blast) vs canary: main untouched, still last-good (0% blast).
7// Forking server (psv_listen serves the slot dir); run foreground. license_tier: ORIGINAL expect_exit: 0
8import "nx_syscalls.nx"
9import "nx_publisher.nx"
10import "nx_pub_serve.nx"
11import "nx_runpath.nx"
12
13func g_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
14func g_n(v: i64) -> i64 { var m: i64=v; if m<0{g_w("-" as *u8);m=0-m} let t:*u8=sys_mmap(24); var k:i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i:i64=0; let o:*u8=sys_mmap(24); while i<k{o[i]=t[k-1-i];i=i+1} sys_write(1,o,k); return 0 }
15func g_row(id: *u8, ok: i64, pass: *i64) -> i64 { g_w(" " as *u8); g_w(id); g_w(": " as *u8); if ok==1 { g_w("OK\n" as *u8); pass[0]=pass[0]+1 } else { g_w("FAIL\n" as *u8) } return 0 }
16func sv_write(path: *u8, content: *u8) -> i64 { let fd: i64 = sys_openat_wr(path, 0x1a4); if fd<0 { return 0 } var n: i64=0; while content[n]!=(0 as u8){n=n+1} sys_write(fd, content, n); sys_close(fd); return 1 }
17
18func main() -> i64 {
19 let pass: *i64 = sys_mmap(8) as *i64; pass[0]=0
20 g_w("=== NX-PUB-CANARY GATE (separate-slot cohort smoke gate; blast radius measured vs naive) ===\n" as *u8)
21 let wsid: *u8 = sys_mmap(64); rp_wsid(wsid); rp_ensure(wsid)
22 let D: *u8 = sys_mmap(512); rp_path(wsid, "pcan" as *u8, D); __syscall(83, D as i64, 493, 0, 0, 0, 0)
23 var psum: i64 = 0; var pj: i64 = 0; while wsid[pj]!=(0 as u8){ psum = psum + (wsid[pj] as i64); pj = pj + 1 }
24 let port: i64 = 19220 + (psum % 300)
25
26 let mainp: *u8 = sys_mmap(700); pub_join(D, "page.html" as *u8, mainp)
27 let src_good: *u8 = sys_mmap(700); pub_join(D, "good.src" as *u8, src_good); sv_write(src_good, "CANARY-GOOD-V2\n" as *u8)
28 let src_bad: *u8 = sys_mmap(700); pub_join(D, "bad.src" as *u8, src_bad); sv_write(src_bad, "CANARY-BAD\n" as *u8)
29 let sha_good: *u8 = sys_mmap(72); pub_sha_file(src_good, sha_good)
30 sv_write(mainp, "MAIN-LASTGOOD\n" as *u8) // main starts at last-good
31
32 let pid: i64 = sys_fork()
33 if pid == 0 { psv_listen(D, port); sys_exit(0) } // serve the slot dir
34
35 let resp: *u8 = sys_mmap(262144)
36
37 // GOOD rollout: cohort of 3 served-smokes pass -> promote to main
38 let r_good: i64 = pub_canary_rollout(sha_good, src_good, D, "page.html" as *u8, "page.html" as *u8, port, 3)
39 let ng: i64 = pub_http_get(port, "page.html" as *u8, resp, 262144)
40 let main_is_good: i64 = pub_substr(resp, ng, "CANARY-GOOD-V2" as *u8)
41
42 // reset main to last-good for the bad scenario
43 sv_write(mainp, "MAIN-LASTGOOD\n" as *u8)
44 // NAIVE: push the bad version straight to main
45 pub_copy(src_bad, mainp)
46 let nn: i64 = pub_http_get(port, "page.html" as *u8, resp, 262144)
47 let naive_main_bad: i64 = pub_substr(resp, nn, "CANARY-BAD" as *u8)
48
49 // reset main; CANARY the same bad version (expecting the GOOD sha -> served mismatch -> abort)
50 sv_write(mainp, "MAIN-LASTGOOD\n" as *u8)
51 let r_bad: i64 = pub_canary_rollout(sha_good, src_bad, D, "page.html" as *u8, "page.html" as *u8, port, 3)
52 let mb: i64 = pub_http_get(port, "page.html" as *u8, resp, 262144)
53 let canary_main_bad: i64 = pub_substr(resp, mb, "CANARY-BAD" as *u8)
54 let canary_main_lastgood: i64 = pub_substr(resp, mb, "MAIN-LASTGOOD" as *u8)
55
56 __syscall(129, pid, 9, 0, 0, 0, 0) // rv64 kill=129; raw x86 62 is an RV64 KEY translated to lseek(8) -- the kill never happened (debt idx 2277)
57 let st: *i64 = sys_mmap(8) as *i64; var rr: i64 = 0; while rr < 20 { sys_wait4(0 - 1, st, 1); rr = rr + 1 }
58
59 g_w(" r_good=" as *u8); g_n(r_good); g_w(" main_is_good=" as *u8); g_n(main_is_good); g_w(" | r_bad=" as *u8); g_n(r_bad); g_w(" naive_main_bad=" as *u8); g_n(naive_main_bad); g_w(" canary_main_bad=" as *u8); g_n(canary_main_bad); g_w(" canary_main_lastgood=" as *u8); g_n(canary_main_lastgood); g_w("\n" as *u8)
60
61 g_row("GOOD: cohort healthy -> canary PROMOTES, main serves the new version (r_good==1)" as *u8, ((r_good==1) as i64) & main_is_good, pass)
62 g_row("BASELINE REAL: naive pushes bad straight to main (100% blast)" as *u8, naive_main_bad, pass)
63 g_row("CANARY: bad version ABORTED (r_bad==0), main untouched = still last-good (0% blast)" as *u8, ((r_bad==0) as i64) & canary_main_lastgood & ((canary_main_bad==0) as i64), pass)
64 let exceeds: i64 = (naive_main_bad) & ((canary_main_bad==0) as i64)
65 g_w("\n HEAD-TO-HEAD: bad-version main blast naive=100% vs canary=0%" as *u8)
66 if exceeds==1 { g_w(" => EXCEEDS (measured, liar-kill: naive blast real)\n" as *u8) } else { g_w(" => NOT EXCEEDS\n" as *u8) }
67 g_row("MEASURED EXCEEDS: canary limits blast radius to 0% of main" as *u8, exceeds, pass)
68
69 g_w("NX-PUB-CANARY rows=4 pass=" as *u8); g_n(pass[0])
70 if pass[0]==4 { g_w(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
71 g_w(" verdict=RED\n" as *u8); sys_exit(1); return 1
72}