code wiki / _hdl_build / nx_domain_golive.nx
nx_domain_golive.nx source
↩ module page · 143 lines · 6650 B
1// nx_domain_golive.nx -- Orchestrate domain purchase and live activation on the sovereign edge through predefined, idempotent steps.
2import "nx_gate_gn.nx"
3import "nx_gate_base.nx"
4// nx_domain_golive.nx -- the DOMAIN GO-LIVE ORCHESTRATION state machine: buy a domain on Porkbun
5// and take it live on the sovereign edge, as ORDERED, PRECONDITIONED, IDEMPOTENT steps. The steps
6// are DATA (rule 11); the machine refuses skipping, refuses the SPEND step without BOTH a green
7// dry-run token AND the operator confirm, refuses edge mutation without the operator flag, and a
8// completed spend step can never run twice (no double-purchase by construction).
9// step 0 CHECK -- /domain/checkDomain: avail + quote (read-only)
10// step 1 DRYRUN -- /domain/create dryRun:true wouldSucceed (read-only, no charge)
11// step 2 REGISTER -- /domain/create (SPEND: needs dryrun-ok + confirm + quote<=cap)
12// step 3 DNS -- A records @ + www -> WAN (nx_porkbun_set_a / nx_porkbun_publish_a)
13// step 4 CERT -- ssl/retrieve bundle (0600) or nx_acme_issue DNS-01
14// step 5 EDGE -- SNI route + sites namespace on the NAS (OPERATOR-GATED: contended files)
15// step 6 VERIFY -- live 200 over sovereign TLS from the WAN side
16// Executors: nx_porkbun_domain (0-2,4), nx_acme_porkbun/nx_porkbun_publish_a (3), nx_acme_issue (4),
17// the mgmt/never-brick plane (5), nx_https/acme GET (6). This gate proves the DRIVER's laws.
18// license_tier: ORIGINAL expect_exit: 0
19import "nx_syscalls.nx"
20const GL_MAGIC_1108: i64 = 1108
21const GL_MAGIC_1500: i64 = 1500
22const GL_MAGIC_1600: i64 = 1600
23
24const GL_NSTEPS: i64 = 7
25const GL_CHECK: i64 = 0
26const GL_DRYRUN: i64 = 1
27const GL_REGISTER: i64 = 2
28const GL_DNS: i64 = 3
29const GL_CERT: i64 = 4
30const GL_EDGE: i64 = 5
31const GL_VERIFY: i64 = 6
32
33func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
34" as *u8); return ok }
35func gcheck(pass: i64, label: *u8, fails: *i64) -> i64 {
36 gw(" " as *u8); gw(label); gw(": " as *u8)
37 if pass==1 { gw("PASS\n" as *u8) } else { gw("FAIL\n" as *u8); fails[0]=fails[0]+1 }
38 return 0
39}
40
41// st: [0]=next-step [1]=dryrun_ok [2]=spend_done [3..9]=step done flags base
42// flags: [0]=operator_confirm_spend [1]=operator_edge_ack [2]=quote_cents [3]=cap_cents
43// advance codes: 1 ok; 2 already-done (idempotent no-op); -1 out-of-order; -2 spend w/o dryrun-ok;
44// -3 spend w/o operator confirm; -4 quote>cap; -5 double-spend refused; -6 edge w/o operator ack.
45func gl_advance(st: *i64, flags: *i64, step: i64, result_ok: i64) -> i64 {
46 let donebase: i64 = 3
47 if st[donebase+step]==1 {
48 if step==GL_REGISTER { return 0-5 }
49 return 2
50 }
51 if step != st[0] { return 0-1 }
52 if step==GL_REGISTER {
53 if st[1]!=1 { return 0-2 }
54 if flags[0]!=1 { return 0-3 }
55 if flags[2]<=0 { return 0-4 }
56 if flags[3]<=0 { return 0-4 }
57 if flags[2]>flags[3] { return 0-4 }
58 }
59 if step==GL_EDGE {
60 if flags[1]!=1 { return 0-6 }
61 }
62 if result_ok!=1 { return 0 }
63 st[donebase+step]=1
64 st[0]=step+1
65 if step==GL_DRYRUN { st[1]=1 }
66 if step==GL_REGISTER { st[2]=1 }
67 return 1
68}
69
70func main() -> i64 {
71 let fails: *i64 = sys_mmap(16) as *i64
72 fails[0]=0
73 gw("=== nx_domain_golive -- purchase->live orchestration: ordered, spend-safe, idempotent ===\n" as *u8)
74
75 let st: *i64 = sys_mmap(16*8) as *i64
76 let flags: *i64 = sys_mmap(8*8) as *i64
77 var i: i64=0
78 while i<16 { st[i]=0; i=i+1 }
79 flags[0]=0; flags[1]=0; flags[2]=GL_MAGIC_1108; flags[3]=GL_MAGIC_1500
80
81 // T1: skipping ahead is refused (REGISTER before CHECK/DRYRUN -> out-of-order)
82 let s1: i64 = gl_advance(st, flags, GL_REGISTER, 1)
83 var t1: i64=0; if s1==(0-1) { t1=1 }
84 gcheck(t1, "T1 out-of-order step refused (no register before check/dryrun)" as *u8, fails)
85
86 // T2: CHECK then DRYRUN advance in order
87 let s2a: i64 = gl_advance(st, flags, GL_CHECK, 1)
88 let s2b: i64 = gl_advance(st, flags, GL_DRYRUN, 1)
89 var t2: i64=0
90 if s2a==1 { if s2b==1 { if st[0]==GL_REGISTER { if st[1]==1 { t2=1 } } } }
91 gcheck(t2, "T2 check -> dryrun advance in order; dryrun-ok token recorded" as *u8, fails)
92
93 // T3: REGISTER without operator confirm refused even after green dryrun
94 let s3: i64 = gl_advance(st, flags, GL_REGISTER, 1)
95 var t3: i64=0; if s3==(0-3) { t3=1 }
96 gcheck(t3, "T3 spend without operator confirm refused (dryrun alone is not consent)" as *u8, fails)
97
98 // T4: over-cap refused; at-cap passes the wall
99 flags[0]=1
100 flags[2]=GL_MAGIC_1600
101 let s4a: i64 = gl_advance(st, flags, GL_REGISTER, 1)
102 flags[2]=GL_MAGIC_1108
103 let s4b: i64 = gl_advance(st, flags, GL_REGISTER, 1)
104 var t4: i64=0
105 if s4a==(0-4) { if s4b==1 { if st[2]==1 { t4=1 } } }
106 gcheck(t4, "T4 over-cap spend refused; in-cap spend completes once" as *u8, fails)
107
108 // T5: DOUBLE-SPEND structurally refused (completed register can never run again)
109 let s5: i64 = gl_advance(st, flags, GL_REGISTER, 1)
110 var t5: i64=0; if s5==(0-5) { t5=1 }
111 gcheck(t5, "T5 double-purchase refused by construction (register is once-only)" as *u8, fails)
112
113 // T6: DNS + CERT advance; EDGE refuses without the operator ack (contended NAS files)
114 gl_advance(st, flags, GL_DNS, 1)
115 gl_advance(st, flags, GL_CERT, 1)
116 let s6a: i64 = gl_advance(st, flags, GL_EDGE, 1)
117 flags[1]=1
118 let s6b: i64 = gl_advance(st, flags, GL_EDGE, 1)
119 let s6c: i64 = gl_advance(st, flags, GL_VERIFY, 1)
120 var t6: i64=0
121 if s6a==(0-6) { if s6b==1 { if s6c==1 { if st[0]==GL_NSTEPS { t6=1 } } } }
122 gcheck(t6, "T6 dns->cert->edge(operator-gated)->verify complete the pipeline" as *u8, fails)
123
124 // T7: re-running a DONE non-spend step is an idempotent no-op (rule 10)
125 let s7: i64 = gl_advance(st, flags, GL_DNS, 1)
126 var t7: i64=0; if s7==2 { t7=1 }
127 gcheck(t7, "T7 completed non-spend step re-run = idempotent no-op" as *u8, fails)
128
129 // T8: a FAILED step result does not advance state (fail-closed progression)
130 let st2: *i64 = sys_mmap(16*8) as *i64
131 var k: i64=0
132 while k<16 { st2[k]=0; k=k+1 }
133 let s8: i64 = gl_advance(st2, flags, GL_CHECK, 0)
134 var t8: i64=0
135 if s8==0 { if st2[0]==GL_CHECK { t8=1 } }
136 gcheck(t8, "T8 failed step result does not advance (fail-closed progression)" as *u8, fails)
137
138 gw(" fails=" as *u8); gn(fails[0]); gw("\n" as *u8)
139 if fails[0]==0 { gw("VERDICT: GREEN (go-live driver: ordered, dryrun-then-confirm spend, once-only purchase, operator-gated edge)\n" as *u8); sys_exit(0) }
140 gw("VERDICT: RED\n" as *u8)
141 sys_exit(1)
142 return 1
143}