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}