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}