code wiki / _hdl_build / nx_seg_schema_gate.nx
nx_seg_schema_gate.nx source
↩ module page · 64 lines · 4242 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"
8import "nx_gate_verdict.nx"
9
10func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
11
12func main(argc: i64, argv: *i64) -> i64 {
13 gp("=== nx_seg_schema_gate (self-describing + mechanized evolution safety) ===\n" as *u8)
14 // v1 = { id:INT:req, name:STR:req }
15 let n1: *i64=sys_mmap(16) as *i64; n1[0]="id" as *u8 as i64; n1[1]="name" as *u8 as i64
16 let t1: *i64=sys_mmap(16) as *i64; t1[0]=SC_INT; t1[1]=SC_STR
17 let r1: *i64=sys_mmap(16) as *i64; r1[0]=SC_REQ; r1[1]=SC_REQ
18 var pass: i64=0; var fail: i64=0
19
20 // T1 self-describing round-trip
21 let enc: *u8=sys_mmap(256); sc_encode(2, n1, t1, r1, enc)
22 let dn: *i64=sys_mmap(16) as *i64; let dt: *i64=sys_mmap(16) as *i64; let dr: *i64=sys_mmap(16) as *i64
23 let dc: i64 = sc_decode(enc, dn, dt, dr)
24 var ok1: i64=0
25 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 } } } } }
26 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) }
27
28 // T2 add OPTIONAL email -> SAFE
29 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
30 let t2a: *i64=sys_mmap(24) as *i64; t2a[0]=SC_INT; t2a[1]=SC_STR; t2a[2]=SC_STR
31 let r2a: *i64=sys_mmap(24) as *i64; r2a[0]=SC_REQ; r2a[1]=SC_REQ; r2a[2]=SC_OPT
32 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) }
33
34 // T3 remove name -> BREAKING(removed)
35 let n2b: *i64=sys_mmap(8) as *i64; n2b[0]="id" as *u8 as i64
36 let t2b: *i64=sys_mmap(8) as *i64; t2b[0]=SC_INT
37 let r2b: *i64=sys_mmap(8) as *i64; r2b[0]=SC_REQ
38 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) }
39
40 // T4 retype id -> STR -> BREAKING(retyped)
41 let t2c: *i64=sys_mmap(16) as *i64; t2c[0]=SC_STR; t2c[1]=SC_STR
42 let r2c: *i64=sys_mmap(16) as *i64; r2c[0]=SC_REQ; r2c[1]=SC_REQ
43 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) }
44
45 // T5 add REQUIRED age -> BREAKING(new-required)
46 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
47 let t2d: *i64=sys_mmap(24) as *i64; t2d[0]=SC_INT; t2d[1]=SC_STR; t2d[2]=SC_INT
48 let r2d: *i64=sys_mmap(24) as *i64; r2d[0]=SC_REQ; r2d[1]=SC_REQ; r2d[2]=SC_REQ
49 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) }
50
51 // T6 identical -> SAFE
52 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) }
53
54 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
55 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
56 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
57 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
58 let ctr__dry: *i64 = gv_ctr()
59 ctr__dry[0] = pass
60 ctr__dry[1] = pass + fail
61 let rc__dry: i64 = gv_verdict("SEG-SCHEMA-GATE" as *u8, ctr__dry, "self-describing + evolution = API-contract-stability enforced)" as *u8)
62 sys_exit(rc__dry)
63 return rc__dry
64}