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}