code wiki / _hdl_build / nx_deploy_marker_gate.nx

nx_deploy_marker_gate.nx source

↩ module page · 50 lines · 2916 B

1import "nx_gate_gn.nx" 2// nx_deploy_marker_gate.nx -- hermetic gate for CAP-DEPLOY-MARKER (the self-safe deferred-restart primitive). 3// Proves: a deploy can request a restart WITHOUT restarting in-request; the supervisor consumes it EXACTLY ONCE 4// (so one request never loops); an absent marker means nothing pending; and a fresh request re-arms cleanly. 5// T1 request -> pending T2 consume -> restart-now (1) T3 second consume -> 0 (no loop) + not pending 6// T4 (NEG) no marker -> 0 T5 re-request re-arms -> consume 1 again 7// Sovereign: nx_syscalls + nx_deploy_marker. license_tier: ORIGINAL expect_exit: 0 8import "nx_syscalls.nx" 9import "nx_deploy_marker.nx" 10 11func gp(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 12 13func main(argc: i64, argv: *i64) -> i64 { 14 gp("=== nx_deploy_marker_gate (self-safe deploy: stage+request, supervisor consumes once) ===\n" as *u8) 15 let DIR: *u8 = "/tmp" as *u8 16 let SVC: *u8 = "gate_mgmt_api" as *u8 17 let NONE: *u8 = "gate_no_such_svc_zzz" as *u8 18 var pass: i64 = 0; var fail: i64 = 0 19 20 // ensure a clean slate: consume any stale marker from a prior run 21 dm_check_and_consume(DIR, SVC) 22 23 // T1 request -> pending 24 let r1: i64 = dm_request_restart(DIR, SVC) 25 let p1: i64 = dm_is_pending(DIR, SVC) 26 if r1 == 1 { if p1 == 1 { pass=pass+1; gp(" T1 deploy requests restart -> pending PASS\n" as *u8) } else { fail=fail+1; gp(" T1 FAIL not pending\n" as *u8) } } else { fail=fail+1; gp(" T1 FAIL request\n" as *u8) } 27 28 // T2 consume -> restart now 29 let c1: i64 = dm_check_and_consume(DIR, SVC) 30 if c1 == 1 { pass=pass+1; gp(" T2 supervisor consumes -> restart-now(1) PASS\n" as *u8) } else { fail=fail+1; gp(" T2 FAIL\n" as *u8) } 31 32 // T3 second consume -> 0 (no loop) + no longer pending 33 let c2: i64 = dm_check_and_consume(DIR, SVC) 34 let p2: i64 = dm_is_pending(DIR, SVC) 35 if c2 == 0 { if p2 == 0 { pass=pass+1; gp(" T3 consumed exactly once -> 0, not pending (NO restart loop) PASS\n" as *u8) } else { fail=fail+1; gp(" T3 FAIL still pending\n" as *u8) } } else { fail=fail+1; gp(" T3 FAIL looped\n" as *u8) } 36 37 // T4 (NEG) absent marker -> 0 38 let c3: i64 = dm_check_and_consume(DIR, NONE) 39 if c3 == 0 { pass=pass+1; gp(" T4 no marker -> 0 (nothing pending) PASS\n" as *u8) } else { fail=fail+1; gp(" T4 FAIL\n" as *u8) } 40 41 // T5 re-request re-arms 42 dm_request_restart(DIR, SVC) 43 let c4: i64 = dm_check_and_consume(DIR, SVC) 44 if c4 == 1 { pass=pass+1; gp(" T5 a fresh deploy re-arms -> consume 1 again PASS\n" as *u8) } else { fail=fail+1; gp(" T5 FAIL\n" as *u8) } 45 dm_check_and_consume(DIR, SVC) // leave clean 46 47 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail) 48 if fail == 0 { gp(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 } 49 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1 50}