nx_forge_evidence_t274.nx source
↩ module page · 101 lines · 4633 B
1// Additive structured evaluation for synthetic release-evidence reasoning.
2// Does not authorize releases or execute model-produced code.
3import "nx_json.nx"
4import "_hdl_build/nx_json_lib_route_t160.nx"
5import "nx_sha256.nx"
6import "nx_lib_std.nx"
7const FJ_TRI_MISSING:i64=0-2
8const FJ_TRI_UNKNOWN:i64=0-1
9func fje_len(s:*u8)->i64 { var n:i64=0;while s[n]!=(0 as u8){n=n+1};return n }
10func fje_eq(a:*u8,n:i64,b:*u8)->i64 { if n!=fje_len(b){return 0};var i:i64=0;while i<n{if a[i]!=b[i]{return 0};i=i+1};return 1 }
11func fje_parse(src:*u8,n:i64,fixture:i64,v:*i64)->i64 {
12 let bytes:i64=__size_of(NxJsonTok)
13 let t:*NxJsonTok=sys_mmap_try(bytes) as *NxJsonTok
14 if (t as i64)<=0{return 0-1}
15 let decoded:*u8=sys_mmap_try(n+1)
16 if (decoded as i64)<=0{sys_munmap_direct(t as *u8,bytes);return 0-1}
17 t.src=src;t.len=n;t.pos=0;t.kind=0;t.tok_off=0;t.tok_len=0
18 var i:i64=0;while i<4{v[i]=FJ_TRI_MISSING;i=i+1}
19 var ok:i64=1;var done:i64=0
20 if nx_json_next(t)!=NX_JSON_LBRACE{ok=0}
21 while ok==1 && done==0 {
22 if nx_json_next(t)!=NX_JSON_STRING {ok=0} else {
23 let raw:*u8=((src as i64)+t.tok_off+1) as *u8
24 let kn:i64=jx_decode_span(raw,t.tok_len-2,decoded,n+1)
25 let k:*u8=decoded
26 if kn<0{ok=0}
27 var slot:i64=0-1
28 if fixture==1 {
29 if fje_eq(k,kn,"sourceHashMatches" as *u8)==1{slot=0}
30 if fje_eq(k,kn,"buildTests" as *u8)==1{slot=1}
31 if fje_eq(k,kn,"servedReview" as *u8)==1{slot=2}
32 } else {
33 if fje_eq(k,kn,"sourceVerified" as *u8)==1{slot=0}
34 if fje_eq(k,kn,"buildQualified" as *u8)==1{slot=1}
35 if fje_eq(k,kn,"servedAccepted" as *u8)==1{slot=2}
36 if fje_eq(k,kn,"promote" as *u8)==1{slot=3}
37 }
38 if slot<0{ok=0} else {
39 if v[slot]!=FJ_TRI_MISSING{ok=0}
40 if nx_json_next(t)!=NX_JSON_COLON{ok=0}
41 let kind:i64=nx_json_next(t)
42 if kind==NX_JSON_TRUE{v[slot]=1} else {
43 if kind==NX_JSON_FALSE{v[slot]=0} else {
44 if kind==NX_JSON_NULL{v[slot]=FJ_TRI_UNKNOWN} else {ok=0}
45 }
46 }
47 }
48 if ok==1{
49 let sep:i64=nx_json_next(t)
50 if sep==NX_JSON_RBRACE{done=1} else {if sep!=NX_JSON_COMMA{ok=0}}
51 }
52 }
53 }
54 if ok==1{if nx_json_next(t)!=NX_JSON_EOF{ok=0}}
55 if v[0]==FJ_TRI_MISSING || v[1]==FJ_TRI_MISSING || v[2]==FJ_TRI_MISSING{ok=0}
56 if fixture==0 && v[3]==FJ_TRI_MISSING{ok=0}
57 sys_munmap_direct(decoded,n+1);sys_munmap_direct(t as *u8,bytes);return ok
58}
59func fje_score(a:*i64,b:*i64)->i64 {
60 var i:i64=0;while i<3{if a[i]!=b[i]{return 0};i=i+1}
61 var promote:i64=0;if a[0]==1 && a[1]==1 && a[2]==1{promote=1}
62 if b[3]!=promote{return 0};return 1
63}
64func fje_hash(src:*u8,n:i64)->i64 {
65 let digest:*u8=sys_mmap_try(SHA256_DIGEST_BYTES)
66 if (digest as i64)<=0{return 0}
67 if sha256_digest_checked_native(src,n,digest)!=0{sys_munmap_direct(digest,SHA256_DIGEST_BYTES);return 0}
68 let digits:*u8="0123456789abcdef" as *u8
69 var i:i64=0;while i<SHA256_DIGEST_BYTES{
70 let v:i64=digest[i] as i64;sys_write(1,((digits as i64)+(v/16)) as *u8,1);sys_write(1,((digits as i64)+(v%16)) as *u8,1);i=i+1
71 };sys_munmap_direct(digest,SHA256_DIGEST_BYTES);return 1
72}
73func fje_cli(fixture:*u8,response:*u8)->i64 {
74 let fields:i64=4*__size_of(i64)
75 let a:*i64=sys_mmap_try(fields) as *i64;let b:*i64=sys_mmap_try(fields) as *i64
76 if (a as i64)<=0 || (b as i64)<=0{
77 if (a as i64)>0{sys_munmap_direct(a as *u8,fields)};if (b as i64)>0{sys_munmap_direct(b as *u8,fields)}
78 std_putln("{\"state\":\"unavailable\",\"reason\":\"allocation\"}" as *u8);return 3
79 }
80 let ap:i64=fje_parse(fixture,fje_len(fixture),1,a);let bp:i64=fje_parse(response,fje_len(response),0,b)
81 var state:*u8="rejected" as *u8
82 var accepted:i64=0
83 if ap!=1{state="insufficient-evidence" as *u8} else {
84 if bp==1{accepted=fje_score(a,b);if accepted==1{state="accepted" as *u8}}
85 }
86 if ap<0 || bp<0{state="unavailable" as *u8;accepted=0}
87 var complete:i64=0
88 if ap==1 && a[0]!=FJ_TRI_UNKNOWN && a[1]!=FJ_TRI_UNKNOWN && a[2]!=FJ_TRI_UNKNOWN{complete=1}
89 std_puts("{\"evaluator\":\"forge-release-evidence-v1\",\"fixture_sha256\":\"" as *u8)
90 let ah:i64=fje_hash(fixture,fje_len(fixture))
91 std_puts("\",\"response_sha256\":\"" as *u8);let bh:i64=fje_hash(response,fje_len(response))
92 std_puts("\",\"state\":\"" as *u8)
93 if ah!=1 || bh!=1{state="unavailable" as *u8;accepted=0}
94 std_puts(state);std_puts("\",\"accepted\":" as *u8)
95 if accepted==1{std_puts("true" as *u8)}else{std_puts("false" as *u8)}
96 std_puts(",\"fixtureEvidenceComplete\":" as *u8)
97 if complete==1{std_puts("true" as *u8)}else{std_puts("false" as *u8)}
98 std_putln(",\"releaseAuthorized\":false}" as *u8)
99 sys_munmap_direct(a as *u8,fields);sys_munmap_direct(b as *u8,fields)
100 if ap!=1 || bp<0 || ah!=1 || bh!=1{return 3};if accepted==1{return 0};return 1
101}