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}