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}