code wiki / _hdl_build / nx_safety_gate.nx
nx_safety_gate.nx source
↩ module page · 75 lines · 3435 B
1// nx_safety_gate.nx -- GATE for nx_safety (the SafetyEnvelope native type). Flagged by the HONESTY SYSTEM
2// 2026-07-16 as THE #1 untested load-bearer: reach=614 organs declare envelopes through it with ZERO direct
3// validation -- the safety layer itself was unproven. Gate proves: enum families well-formed + distinct,
4// a valid envelope validates (1), and CORRUPT envelopes are REJECTED (0) -- negative controls on every
5// enum field. license_tier: ORIGINAL expect_exit:0
6import "nx_syscalls.nx"
7import "nx_safety.nx"
8
9func sw2(s: *u8) -> i64 { var n:i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
10func sn2(v: i64) -> i64 { let b:*u8=sys_mmap(24); var m:i64=v; if m<0{sys_write(1,"-" as *u8,1);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 j:i64=0; while j<k{b[j]=t[k-1-j];j=j+1} sys_write(1,b,k); return 0 }
11
12// build a KNOWN-GOOD envelope in mmap'd memory
13func mk_env() -> *SafetyEnvelope {
14 let e: *SafetyEnvelope = sys_mmap(256) as *SafetyEnvelope
15 let ev: *i64 = sys_mmap(32) as *i64
16 ev[0] = EVID_NO_FP
17 let hz: *i64 = sys_mmap(32) as *i64
18 hz[0] = 1
19 e.sil_target = SIL_2
20 e.asil_target = ASIL_QM
21 e.dal_target = DAL_B
22 e.iec_62304_class = IEC_62304_NONE
23 e.n_evidence_ids = 1
24 e.evidence_ids = ev
25 e.n_hazard_ids = 1
26 e.hazard_ids = hz
27 e.residual_risk_len = 4
28 e.residual_risk = "none" as *u8
29 e.verdict = NX_VERDICT_NOT_YET_EVALUATED
30 return e
31}
32
33func main() -> i64 {
34 var pass: i64 = 0
35
36 // T1: enum families are well-formed (ordered, distinct anchors)
37 var ok1: i64 = 1
38 if SIL_NONE != 0 { ok1 = 0 }
39 if SIL_4 != 4 { ok1 = 0 }
40 if ASIL_QM != 0 { ok1 = 0 }
41 if ASIL_D != 4 { ok1 = 0 }
42 if DAL_A != 5 { ok1 = 0 }
43 if IEC_62304_C != 3 { ok1 = 0 }
44 if NX_VERDICT_PASS == NX_VERDICT_FAIL { ok1 = 0 }
45 if ok1 == 1 { pass = pass + 1; sw2("T1 enums PASS\n" as *u8) } else { sw2("T1 FAIL enum anchors\n" as *u8) }
46
47 // T2: a known-good envelope VALIDATES
48 let e: *SafetyEnvelope = mk_env()
49 if nx_safety_envelope_is_valid(e) == 1 { pass = pass + 1; sw2("T2 valid-env PASS\n" as *u8) } else { sw2("T2 FAIL valid env rejected\n" as *u8) }
50
51 // T3 (NEG): corrupt sil_target -> REJECTED
52 let e3: *SafetyEnvelope = mk_env()
53 e3.sil_target = 99
54 if nx_safety_envelope_is_valid(e3) == 0 { pass = pass + 1; sw2("T3 neg-sil PASS\n" as *u8) } else { sw2("T3 FAIL corrupt sil accepted\n" as *u8) }
55
56 // T4 (NEG): corrupt asil -> REJECTED
57 let e4: *SafetyEnvelope = mk_env()
58 e4.asil_target = 0 - 1
59 if nx_safety_envelope_is_valid(e4) == 0 { pass = pass + 1; sw2("T4 neg-asil PASS\n" as *u8) } else { sw2("T4 FAIL corrupt asil accepted\n" as *u8) }
60
61 // T5 (NEG): corrupt dal -> REJECTED
62 let e5: *SafetyEnvelope = mk_env()
63 e5.dal_target = 77
64 if nx_safety_envelope_is_valid(e5) == 0 { pass = pass + 1; sw2("T5 neg-dal PASS\n" as *u8) } else { sw2("T5 FAIL corrupt dal accepted\n" as *u8) }
65
66 // T6 (NEG): corrupt verdict -> REJECTED
67 let e6: *SafetyEnvelope = mk_env()
68 e6.verdict = 55
69 if nx_safety_envelope_is_valid(e6) == 0 { pass = pass + 1; sw2("T6 neg-verdict PASS\n" as *u8) } else { sw2("T6 FAIL corrupt verdict accepted\n" as *u8) }
70
71 sw2("NX-SAFETY GATE " as *u8); sn2(pass); sw2("/6" as *u8)
72 if pass == 6 { sw2(" GREEN\n" as *u8); return 0 }
73 sw2(" RED\n" as *u8)
74 return 1
75}