code wiki / _hdl_build / nx_sota_bindings_differential_gate.nx

nx_sota_bindings_differential_gate.nx source

↩ module page · 116 lines · 5912 B

1// Four real owner invocations; caller freezes source changes during qualification. 2// Existing timed process runner; reports use owner's exclusive artifact output. 3import "nx_gatekit_lib.nx" 4import "nx_gate_verdict.nx" 5import "nx_estate_path.nx" 6import "nx_measurement_binding_lib.nx" 7import "nx_tool_run.nx" 8import "nx_json_lib.nx" 9const BD_MODE: i64=0x180 10const BD_WORD: i64=8 11func bc_prefix_ok(prefix: *u8) -> i64 { 12 let n: i64 = gk_len(prefix) 13 if n <= gk_len("/tmp/" as *u8) { return 0 } 14 if n+gk_len(".invalid-domain-artifact.json" as *u8)+gk_len("/tmp/../" as *u8)+1 > SYS_PATH_MAX { return 0 } 15 let root: *u8 = "/tmp/" as *u8 16 var i: i64 = 0 17 while i < gk_len(root) { if prefix[i] != root[i] { return 0 } i = i+1 } 18 while i < n { 19 let c: i64 = prefix[i] as i64 20 var ok: i64 = 0 21 if c >= 97 { if c <= 122 { ok = 1 } } 22 if c >= 65 { if c <= 90 { ok = 1 } } 23 if c >= 48 { if c <= 57 { ok = 1 } } 24 if c == 95 { ok = 1 } 25 if c == 45 { ok = 1 } 26 if ok == 0 { return 0 } 27 i = i+1 28 } 29 return 1 30} 31func bc_equal(before: *u8, bn: i64, after: *u8, an: i64) -> i64 { 32 if bn <= 0 { return 0 } 33 if bn != an { return 0 } 34 if (before as i64) <= 0 { return 0 } 35 if (after as i64) <= 0 { return 0 } 36 var i: i64 = 0 37 while i < bn { if before[i] != after[i] { return 0 } i = i+1 } 38 return 1 39} 40 41func bd_positive(s: *u8) -> i64 { 42 var n: i64=0; var i: i64=0 43 while s[i] != (0 as u8) { 44 let c: i64=s[i] as i64 45 if c < 48 || c > 57 { return 0 } 46 let digit: i64=c-48 47 if n > (PB_I64_MAX-digit)/10 { return 0 } 48 n=n*10+digit; i=i+1 49 }; return n 50} 51func bd_put(path: *u8, raw: *u8, n: i64) -> i64 { 52 let fd: i64=sys_openat_exclusive(path,BD_MODE); if fd < 0 { return 0 } 53 var done: i64=0; var ok: i64=1 54 while done < n && ok == 1 { 55 let w: i64=sys_write(fd,((raw as i64)+done) as *u8,n-done) 56 if w <= 0 { ok=0 } else { done=done+w } 57 } 58 if sys_fsync(fd) != 0 { ok=0 }; if sys_close(fd) != 0 { ok=0 }; return ok 59} 60func bd_case(elf: *u8, prefix: *u8, suffix: *u8, domain: *u8, cap: i64, timeout: i64, ctr: *i64) -> i64 { 61 let path: *u8=sys_mmap(SYS_PATH_MAX); let receipt: *u8=sys_mmap(SYS_PATH_MAX) 62 let av: *i64=sys_mmap(5*BD_WORD) as *i64; let raw: *u8=sys_mmap(cap) 63 let end: i64=gk_cat(path,0,prefix); gk_cat(path,end,suffix) 64 let rend: i64=gk_cat(receipt,0,path); gk_cat(receipt,rend,".receipt.json" as *u8) 65 let mode: *u8="bindings" as *u8 66 av[0]=elf as i64; av[1]=mode as i64; av[2]=domain as i64; av[3]=path as i64; av[4]=0 67 var n: i64=0 68 let rc: i64=tr_run_capture_to(elf,av,raw,cap,&n,timeout) 69 gv_check("actual subject exited zero" as *u8,rc==0,ctr) 70 let complete: i64=n>0 && n<cap 71 gv_check("complete receipt within caller capacity" as *u8,complete,ctr) 72 if complete == 1 { 73 raw[n]=0 as u8 74 gv_check("receipt retained exclusively" as *u8,bd_put(receipt,raw,n),ctr) 75 gv_check("receipt confirms ready artifact" as *u8,gk_has(raw,"\"ready\":true" as *u8),ctr) 76 var count: i64=0; let got: i64=jx_get_int(raw,n,0,"bytes_written" as *u8,&count) 77 var fn: i64=0; let report: *u8=pbm_read(path,&fn) 78 gv_check("full artifact read matches receipt byte count" as *u8,got>0 && fn>0 && fn==count,ctr) 79 if (report as i64)>0 { 80 var envelope: i64=0 81 if fn>1 { envelope=report[0]==(123 as u8) && report[fn-2]==(125 as u8) && report[fn-1]==(10 as u8) } 82 gv_check("full report envelope retained" as *u8,envelope,ctr) 83 sys_munmap(report,fn+1) 84 } 85 } 86 gv_puts("report_path=" as *u8); gv_puts(path); gv_puts(" receipt_path=" as *u8); gv_puts(receipt); gv_puts("\n" as *u8) 87 sys_munmap(path,SYS_PATH_MAX); sys_munmap(receipt,SYS_PATH_MAX) 88 sys_munmap(av as *u8,5*BD_WORD); sys_munmap(raw,cap); return rc 89} 90func main(argc: i64, argv: *i64) -> i64 { 91 if argc != 6 { gv_puts("usage: differential-gate absolute-incumbent absolute-staged /tmp/freshprefix receipt_capacity timeout_ms\n" as *u8); return 3 } 92 let old: *u8=argv[1] as *u8; let staged: *u8=argv[2] as *u8; let prefix: *u8=argv[3] as *u8 93 if old[0] != (47 as u8) || staged[0] != (47 as u8) || bc_prefix_ok(prefix)!=1 { return 3 } 94 if gk_len(prefix)+gk_len(".gameengine.incumbent.json.receipt.json" as *u8)+1 > SYS_PATH_MAX { return 3 } 95 let cap: i64=bd_positive(argv[4] as *u8); let timeout: i64=bd_positive(argv[5] as *u8) 96 if cap<=0 || timeout<=0 || ep_anchor()<0 { return 3 } 97 let ctr: *i64=gv_ctr(); gv_head("BINDINGS-DIFFERENTIAL" as *u8) 98 var jn: i64=0; var ln: i64=0 99 let jp: *u8="knowledge/status/sota_board.json" as *u8 100 let lp: *u8="knowledge/status/sota_board.ledger" as *u8 101 let jb: *u8=pbm_read(jp,&jn); let lb: *u8=pbm_read(lp,&ln) 102 gv_check("board baseline complete and readable" as *u8,(jb as i64)>0 && (lb as i64)>0 && jn>0 && ln>0,ctr) 103 if (jb as i64)<=0 || (lb as i64)<=0 || jn<=0 || ln<=0 { return 3 } 104 bd_case(old,prefix,".charsim.incumbent.json" as *u8,"charsim" as *u8,cap,timeout,ctr) 105 bd_case(staged,prefix,".charsim.staged.json" as *u8,"charsim" as *u8,cap,timeout,ctr) 106 bd_case(old,prefix,".gameengine.incumbent.json" as *u8,"gameengine" as *u8,cap,timeout,ctr) 107 bd_case(staged,prefix,".gameengine.staged.json" as *u8,"gameengine" as *u8,cap,timeout,ctr) 108 var an: i64=0; let ja: *u8=pbm_read(jp,&an) 109 gv_check("board JSON unchanged" as *u8,bc_equal(jb,jn,ja,an),ctr) 110 if (ja as i64)>0 { sys_munmap(ja,an+1) } 111 let la: *u8=pbm_read(lp,&an) 112 gv_check("board ledger unchanged" as *u8,bc_equal(lb,ln,la,an),ctr) 113 if (la as i64)>0 { sys_munmap(la,an+1) } 114 sys_munmap(jb,jn+1); sys_munmap(lb,ln+1) 115 return gv_verdict("BINDINGS-DIFFERENTIAL" as *u8,ctr,"captures ready for full JSON parity and independent source-byte hash verification; no publication" as *u8) 116}