code wiki / _hdl_build / nx_seg_schema_gate.nx
nx_seg_schema_gate.nx source
↩ module page · 56 lines · 3853 B
1import "nx_gate_gn.nx"
2// nx_seg_schema_gate.nx -- exceed-gate for CAP-SEG-SCHEMA. Proves: self-describing encode->decode round-trip, and
3// mechanized evolution safety -- add-OPTIONAL is SAFE, remove/rename is BREAKING, retype is BREAKING, add-REQUIRED is
4// BREAKING (old records lack it), identical is SAFE. This IS the API-contract-stability rule, enforced by code.
5// Sovereign: nx_syscalls + nx_seg_schema. expect_exit: 0
6import "nx_syscalls.nx"
7import "nx_seg_schema.nx"
8
9func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
10
11func main(argc: i64, argv: *i64) -> i64 {
12 gp("=== nx_seg_schema_gate (self-describing + mechanized evolution safety) ===\n" as *u8)
13 // v1 = { id:INT:req, name:STR:req }
14 let n1: *i64=sys_mmap(16) as *i64; n1[0]="id" as *u8 as i64; n1[1]="name" as *u8 as i64
15 let t1: *i64=sys_mmap(16) as *i64; t1[0]=SC_INT; t1[1]=SC_STR
16 let r1: *i64=sys_mmap(16) as *i64; r1[0]=SC_REQ; r1[1]=SC_REQ
17 var pass: i64=0; var fail: i64=0
18
19 // T1 self-describing round-trip
20 let enc: *u8=sys_mmap(256); sc_encode(2, n1, t1, r1, enc)
21 let dn: *i64=sys_mmap(16) as *i64; let dt: *i64=sys_mmap(16) as *i64; let dr: *i64=sys_mmap(16) as *i64
22 let dc: i64 = sc_decode(enc, dn, dt, dr)
23 var ok1: i64=0
24 if dc==2 { if sc_streq((dn[0]) as *u8, "id" as *u8)==1 { if dt[0]==SC_INT { if sc_streq((dn[1]) as *u8, "name" as *u8)==1 { if dt[1]==SC_STR { ok1=1 } } } } }
25 if ok1==1 { pass=pass+1; gp(" T1 encode->decode round-trip (self-describing) PASS\n" as *u8) } else { fail=fail+1; gp(" T1 FAIL\n" as *u8) }
26
27 // T2 add OPTIONAL email -> SAFE
28 let n2a: *i64=sys_mmap(24) as *i64; n2a[0]="id" as *u8 as i64; n2a[1]="name" as *u8 as i64; n2a[2]="email" as *u8 as i64
29 let t2a: *i64=sys_mmap(24) as *i64; t2a[0]=SC_INT; t2a[1]=SC_STR; t2a[2]=SC_STR
30 let r2a: *i64=sys_mmap(24) as *i64; r2a[0]=SC_REQ; r2a[1]=SC_REQ; r2a[2]=SC_OPT
31 if sc_compat(2, n1, t1, 3, n2a, t2a, r2a)==SC_SAFE { pass=pass+1; gp(" T2 add OPTIONAL field -> SAFE PASS\n" as *u8) } else { fail=fail+1; gp(" T2 FAIL\n" as *u8) }
32
33 // T3 remove name -> BREAKING(removed)
34 let n2b: *i64=sys_mmap(8) as *i64; n2b[0]="id" as *u8 as i64
35 let t2b: *i64=sys_mmap(8) as *i64; t2b[0]=SC_INT
36 let r2b: *i64=sys_mmap(8) as *i64; r2b[0]=SC_REQ
37 if sc_compat(2, n1, t1, 1, n2b, t2b, r2b)==SC_REMOVED { pass=pass+1; gp(" T3 remove field -> BREAKING(removed) PASS\n" as *u8) } else { fail=fail+1; gp(" T3 FAIL\n" as *u8) }
38
39 // T4 retype id -> STR -> BREAKING(retyped)
40 let t2c: *i64=sys_mmap(16) as *i64; t2c[0]=SC_STR; t2c[1]=SC_STR
41 let r2c: *i64=sys_mmap(16) as *i64; r2c[0]=SC_REQ; r2c[1]=SC_REQ
42 if sc_compat(2, n1, t1, 2, n1, t2c, r2c)==SC_RETYPED { pass=pass+1; gp(" T4 retype field -> BREAKING(retyped) PASS\n" as *u8) } else { fail=fail+1; gp(" T4 FAIL\n" as *u8) }
43
44 // T5 add REQUIRED age -> BREAKING(new-required)
45 let n2d: *i64=sys_mmap(24) as *i64; n2d[0]="id" as *u8 as i64; n2d[1]="name" as *u8 as i64; n2d[2]="age" as *u8 as i64
46 let t2d: *i64=sys_mmap(24) as *i64; t2d[0]=SC_INT; t2d[1]=SC_STR; t2d[2]=SC_INT
47 let r2d: *i64=sys_mmap(24) as *i64; r2d[0]=SC_REQ; r2d[1]=SC_REQ; r2d[2]=SC_REQ
48 if sc_compat(2, n1, t1, 3, n2d, t2d, r2d)==SC_NEWREQ { pass=pass+1; gp(" T5 add REQUIRED field -> BREAKING(new-required) PASS\n" as *u8) } else { fail=fail+1; gp(" T5 FAIL\n" as *u8) }
49
50 // T6 identical -> SAFE
51 if sc_compat(2, n1, t1, 2, n1, t1, r1)==SC_SAFE { pass=pass+1; gp(" T6 identical -> SAFE PASS\n" as *u8) } else { fail=fail+1; gp(" T6 FAIL\n" as *u8) }
52
53 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
54 if fail == 0 { gp(" verdict=GREEN (self-describing + evolution = API-contract-stability enforced)\n" as *u8); sys_exit(0); return 0 }
55 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1
56}