code wiki / _hdl_build / nx_maturity_registry_gate.nx
nx_maturity_registry_gate.nx source
↩ module page · 144 lines · 10606 B
1import "nx_gate_gn.nx"
2// nx_maturity_registry_gate.nx -- hermetic gate for the HUB maturity-flag registry + router.
3// Builds a fixture registry + roles in memory and proves the load-bearing properties:
4// T1 production artifact at / -> SERVE (public, no session)
5// T2 beta artifact at /beta/ -> SERVE (public testing)
6// T3 alpha artifact at /alpha/ -> SERVE (public testing)
7// T4 hub artifact (member) + member -> SERVE (granted 2 >= required 2)
8// T5 (NEG) hub artifact (member) + viewer-> DENY (granted 1 < required 2, no escalation)
9// T6 (NEG) hub artifact (member) + none -> DENY (no session reaches nothing gated)
10// T7 hub artifact (operator) + operator -> SERVE
11// T8 (NEG) hub artifact (operator)+member-> DENY (no escalation to operator)
12// T9 (NEG) hub artifact at PUBLIC ROOT url, even as operator -> TIER_MISMATCH [the no-leak property]
13// T10 (NEG) hub artifact via /beta/ zone -> TIER_MISMATCH [one artifact, one URL]
14// T11 (NEG) unknown path in /hub/ -> NOTFOUND [no fabricated artifact]
15// T12 promote beta->production (ONE append): /newgame -> SERVE AND /beta/newgame -> TIER_MISMATCH
16// T13 retire (tombstone is_current=0, ONE append): /hub/secret -> NOTFOUND [additive demote]
17// T14 sub-resource inherits the base artifact's tier: /tictactoe/index.html -> SERVE (target carried)
18// T15 mr_put smoke: a real atomic append to a fresh /tmp registry returns bytes>0
19// Sovereign: nx_syscalls + nx_maturity_registry. license_tier: ORIGINAL
20import "nx_syscalls.nx"
21import "nx_maturity_registry.nx"
22
23func gp(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
24func g_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
25func g_app(buf: *u8, off: i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { buf[off + i] = s[i]; i = i + 1 } return off + i }
26func g_row2(buf: *u8, off: i64, a: *u8, b: *u8) -> i64 {
27 var o: i64 = g_app(buf, off, a); buf[o] = 9 as u8; o = o + 1
28 o = g_app(buf, o, b); buf[o] = 10 as u8; o = o + 1
29 return o
30}
31func g_row7(buf: *u8, off: i64, a: *u8, b: *u8, c: *u8, d: *u8, e: *u8, f: *u8, g: *u8) -> i64 {
32 var o: i64 = g_app(buf, off, a); buf[o] = 9 as u8; o = o + 1
33 o = g_app(buf, o, b); buf[o] = 9 as u8; o = o + 1
34 o = g_app(buf, o, c); buf[o] = 9 as u8; o = o + 1
35 o = g_app(buf, o, d); buf[o] = 9 as u8; o = o + 1
36 o = g_app(buf, o, e); buf[o] = 9 as u8; o = o + 1
37 o = g_app(buf, o, f); buf[o] = 9 as u8; o = o + 1
38 o = g_app(buf, o, g); buf[o] = 10 as u8; o = o + 1
39 return o
40}
41func act_name(a: i64) -> i64 {
42 if a == 1 { gp("SERVE" as *u8); return 0 }
43 if a == 0 { gp("DENY" as *u8); return 0 }
44 if a == (0 - 1) { gp("NOTFOUND" as *u8); return 0 }
45 gp("MISMATCH" as *u8); return 0
46}
47
48func main(argc: i64, argv: *i64) -> i64 {
49 gp("=== nx_maturity_registry_gate (WHERE=maturity zone, WHO=access level; fail-closed by construction) ===\n" as *u8)
50 // fixture registry (load_date ascending; additive history)
51 let reg: *u8 = sys_mmap(16384); var rn: i64 = 0
52 rn = g_row7(reg, rn, "tictactoe" as *u8, "production" as *u8, "public" as *u8, "tictactoe" as *u8, "Tic-Tac-Toe" as *u8, "10" as *u8, "1" as *u8)
53 rn = g_row7(reg, rn, "newgame" as *u8, "beta" as *u8, "public" as *u8, "newgame" as *u8, "New Game" as *u8, "11" as *u8, "1" as *u8)
54 rn = g_row7(reg, rn, "labx" as *u8, "alpha" as *u8, "public" as *u8, "labx" as *u8, "Lab X" as *u8, "12" as *u8, "1" as *u8)
55 rn = g_row7(reg, rn, "notes" as *u8, "hub" as *u8, "member" as *u8, "notes" as *u8, "Family Notes" as *u8, "13" as *u8, "1" as *u8)
56 rn = g_row7(reg, rn, "gallery" as *u8, "hub" as *u8, "operator" as *u8, "gallery" as *u8, "Gallery" as *u8, "14" as *u8, "1" as *u8)
57 rn = g_row7(reg, rn, "secret" as *u8, "private" as *u8, "operator" as *u8, "secret" as *u8, "Secret" as *u8, "15" as *u8, "1" as *u8)
58 // fixture roles: operator=3, member=2, viewer=1; unlisted=0
59 let roles: *u8 = sys_mmap(2048); var roln: i64 = 0
60 roln = g_row2(roles, roln, "operator_h" as *u8, "3" as *u8)
61 roln = g_row2(roles, roln, "member_h" as *u8, "2" as *u8)
62 roln = g_row2(roles, roln, "viewer_h" as *u8, "1" as *u8)
63
64 let tgt: *u8 = sys_mmap(512); let req: *i64 = sys_mmap(8); let grant: *i64 = sys_mmap(8)
65 let op: *u8 = "operator_h" as *u8; let mem: *u8 = "member_h" as *u8; let vw: *u8 = "viewer_h" as *u8
66 var pass: i64 = 0; var fail: i64 = 0
67 var a: i64 = 0
68
69 let u1: *u8 = "/tictactoe" as *u8
70 a = mr_route(reg, rn, roles, roln, u1, g_slen(u1), "none" as *u8, 0, tgt, 512, req, grant)
71 if a == 1 { pass = pass + 1; gp(" T1 production@root->SERVE PASS\n" as *u8) } else { fail = fail + 1; gp(" T1 FAIL got " as *u8); act_name(a); gp("\n" as *u8) }
72
73 let u2: *u8 = "/beta/newgame" as *u8
74 a = mr_route(reg, rn, roles, roln, u2, g_slen(u2), "none" as *u8, 0, tgt, 512, req, grant)
75 if a == 1 { pass = pass + 1; gp(" T2 beta@/beta->SERVE PASS\n" as *u8) } else { fail = fail + 1; gp(" T2 FAIL got " as *u8); act_name(a); gp("\n" as *u8) }
76
77 let u3: *u8 = "/alpha/labx" as *u8
78 a = mr_route(reg, rn, roles, roln, u3, g_slen(u3), "none" as *u8, 0, tgt, 512, req, grant)
79 if a == 1 { pass = pass + 1; gp(" T3 alpha@/alpha->SERVE PASS\n" as *u8) } else { fail = fail + 1; gp(" T3 FAIL got " as *u8); act_name(a); gp("\n" as *u8) }
80
81 let u4: *u8 = "/hub/notes" as *u8
82 a = mr_route(reg, rn, roles, roln, u4, g_slen(u4), mem, g_slen(mem), tgt, 512, req, grant)
83 if a == 1 { if req[0] == 2 { if grant[0] == 2 { pass = pass + 1; gp(" T4 hub(member)+member->SERVE PASS\n" as *u8) } } }
84 if a != 1 { fail = fail + 1; gp(" T4 FAIL got " as *u8); act_name(a); gp("\n" as *u8) }
85
86 a = mr_route(reg, rn, roles, roln, u4, g_slen(u4), vw, g_slen(vw), tgt, 512, req, grant)
87 if a == 0 { if req[0] == 2 { if grant[0] == 1 { pass = pass + 1; gp(" T5 (NEG) hub(member)+viewer->DENY PASS\n" as *u8) } } }
88 if a != 0 { fail = fail + 1; gp(" T5 FAIL escalation got " as *u8); act_name(a); gp("\n" as *u8) }
89
90 a = mr_route(reg, rn, roles, roln, u4, g_slen(u4), "none" as *u8, 0, tgt, 512, req, grant)
91 if a == 0 { pass = pass + 1; gp(" T6 (NEG) hub+no-session->DENY PASS\n" as *u8) } else { fail = fail + 1; gp(" T6 FAIL got " as *u8); act_name(a); gp("\n" as *u8) }
92
93 let u7: *u8 = "/hub/gallery" as *u8
94 a = mr_route(reg, rn, roles, roln, u7, g_slen(u7), op, g_slen(op), tgt, 512, req, grant)
95 if a == 1 { if req[0] == 3 { pass = pass + 1; gp(" T7 hub(operator)+operator->SERVE PASS\n" as *u8) } }
96 if a != 1 { fail = fail + 1; gp(" T7 FAIL got " as *u8); act_name(a); gp("\n" as *u8) }
97
98 a = mr_route(reg, rn, roles, roln, u7, g_slen(u7), mem, g_slen(mem), tgt, 512, req, grant)
99 if a == 0 { pass = pass + 1; gp(" T8 (NEG) hub(operator)+member->DENY PASS\n" as *u8) } else { fail = fail + 1; gp(" T8 FAIL escalation got " as *u8); act_name(a); gp("\n" as *u8) }
100
101 // T9 -- THE NO-LEAK PROPERTY: a hub artifact at its public-root URL is NEVER served, even to operator.
102 let u9: *u8 = "/notes" as *u8
103 a = mr_route(reg, rn, roles, roln, u9, g_slen(u9), op, g_slen(op), tgt, 512, req, grant)
104 if a == (0 - 2) { pass = pass + 1; gp(" T9 (NEG) hub-artifact@public-root->TIER_MISMATCH (no leak) PASS\n" as *u8) } else { fail = fail + 1; gp(" T9 FAIL LEAK got " as *u8); act_name(a); gp("\n" as *u8) }
105
106 let u10: *u8 = "/beta/notes" as *u8
107 a = mr_route(reg, rn, roles, roln, u10, g_slen(u10), op, g_slen(op), tgt, 512, req, grant)
108 if a == (0 - 2) { pass = pass + 1; gp(" T10 (NEG) hub-artifact@/beta->TIER_MISMATCH PASS\n" as *u8) } else { fail = fail + 1; gp(" T10 FAIL got " as *u8); act_name(a); gp("\n" as *u8) }
109
110 let u11: *u8 = "/hub/doesnotexist" as *u8
111 a = mr_route(reg, rn, roles, roln, u11, g_slen(u11), op, g_slen(op), tgt, 512, req, grant)
112 if a == (0 - 1) { pass = pass + 1; gp(" T11 (NEG) unknown->NOTFOUND PASS\n" as *u8) } else { fail = fail + 1; gp(" T11 FAIL got " as *u8); act_name(a); gp("\n" as *u8) }
113
114 // T12 -- PROMOTE beta->production with ONE additive append (higher load_date wins)
115 rn = g_row7(reg, rn, "newgame" as *u8, "production" as *u8, "public" as *u8, "newgame" as *u8, "New Game" as *u8, "20" as *u8, "1" as *u8)
116 let u12a: *u8 = "/newgame" as *u8
117 a = mr_route(reg, rn, roles, roln, u12a, g_slen(u12a), "none" as *u8, 0, tgt, 512, req, grant)
118 var t12: i64 = 0
119 if a == 1 { t12 = t12 + 1 }
120 a = mr_route(reg, rn, roles, roln, u2, g_slen(u2), "none" as *u8, 0, tgt, 512, req, grant) // /beta/newgame now stale
121 if a == (0 - 2) { t12 = t12 + 1 }
122 if t12 == 2 { pass = pass + 1; gp(" T12 promote(1 append): /newgame SERVE + /beta/newgame MISMATCH PASS\n" as *u8) } else { fail = fail + 1; gp(" T12 FAIL t12=" as *u8); gn(t12); gp("\n" as *u8) }
123
124 // T13 -- RETIRE via tombstone (is_current=0), ONE additive append
125 rn = g_row7(reg, rn, "secret" as *u8, "private" as *u8, "operator" as *u8, "secret" as *u8, "Secret" as *u8, "21" as *u8, "0" as *u8)
126 let u13: *u8 = "/hub/secret" as *u8
127 a = mr_route(reg, rn, roles, roln, u13, g_slen(u13), op, g_slen(op), tgt, 512, req, grant)
128 if a == (0 - 1) { pass = pass + 1; gp(" T13 retire(tombstone)->NOTFOUND PASS\n" as *u8) } else { fail = fail + 1; gp(" T13 FAIL got " as *u8); act_name(a); gp("\n" as *u8) }
129
130 // T14 -- sub-resource inherits the base artifact's tier; target carries the full rest path
131 let u14: *u8 = "/tictactoe/index.html" as *u8
132 a = mr_route(reg, rn, roles, roln, u14, g_slen(u14), "none" as *u8, 0, tgt, 512, req, grant)
133 if a == 1 { if slk_eq(tgt, g_slen(tgt), "tictactoe/index.html" as *u8, 20) == 1 { pass = pass + 1; gp(" T14 sub-resource->SERVE target=tictactoe/index.html PASS\n" as *u8) } }
134 if a != 1 { fail = fail + 1; gp(" T14 FAIL got " as *u8); act_name(a); gp("\n" as *u8) }
135
136 // T15 -- mr_put real atomic append to a fresh /tmp registry returns bytes>0 (the store write path)
137 let rp: *u8 = "/tmp/nx_mr_gate_test.reg" as *u8
138 let wr: i64 = mr_put(rp, "smoke" as *u8, "hub" as *u8, "member" as *u8, "smoke" as *u8, "Smoke" as *u8, 99, 1)
139 if wr > 0 { pass = pass + 1; gp(" T15 mr_put atomic-append bytes=" as *u8); gn(wr); gp(" PASS\n" as *u8) } else { fail = fail + 1; gp(" T15 FAIL wr=" as *u8); gn(wr); gp("\n" as *u8) }
140
141 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
142 if fail == 0 { gp(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
143 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1
144}