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}