code wiki / _hdl_build / nx_toolchain_session_gate_20260910.nx

nx_toolchain_session_gate_20260910.nx source

↩ module page · 119 lines · 9455 B

1// Private scratch-only toolchain session qualification. No production path is a fixture. 2import "nx_mgmt_api_toolchain_session_20260910.nx" 3import "nx_gate_verdict.nx" 4func sg_file(path:*u8,text:*u8)->i64 { 5 let fd:i64=sys_openat_exclusive(path,MODE_0600);if fd<0 { return fd } 6 let w:*NxFileWriteResult=sys_mmap(__size_of(NxFileWriteResult)) as *NxFileWriteResult 7 return fio_write_sync_fd(fd,text,fi_len(text),w) 8} 9func sg_path(root:*u8,name:*u8)->*u8 { 10 let a:i64=fi_len(root);let b:i64=fi_len(name);let p:*u8=sys_mmap(a+b+2) 11 fi_copy(p,root,a);p[a]=47 as u8;fi_copy(p+a+1,name,b+1);return p 12} 13func sg_same(path:*u8,digest:*u8)->i64 { 14 let scratch:*u8=sys_mmap(3);return (fio_verify_sha256(path,digest,scratch,3)==0) as i64 15} 16func sg_hash(path:*u8,budget:i64,out:*u8)->i64 { 17 let p:*NxFileInstallPlan=sys_mmap(__size_of(NxFileInstallPlan)) as *NxFileInstallPlan 18 fi_plan_init(p);let rc:i64=fi_plan_read(path,budget,p) 19 if rc==0 { sha256_digest(p.bytes,p.length,out) };fi_plan_close(p);return rc 20} 21 22func tg_app(out:*u8,at:i64,text:*u8)->i64 { let n:i64=fi_len(text);fi_copy(out+at,text,n);return at+n } 23func tg_hex(out:*u8,at:i64,d:*u8)->i64 { let h:*u8="0123456789abcdef";var i:i64=0;while i<32 { let b:i64=d[i] as i64;out[at+i*2]=h[b>>4];out[at+i*2+1]=h[b&15];i=i+1 };return at+64 } 24func tg_request(intent:*u8,ih:*u8,reverse:*u8,rh:*u8)->*u8 { 25 let req:*u8=sys_mmap(8192);var n:i64=0;n=tg_app(req,n,"POST /api/v2/promote_toolchain HTTP/1.1\r\n\r\ntarget=nx_sov_build_run.elf&confirm=yes&intent=");n=tg_app(req,n,intent);n=tg_app(req,n,"&expect_intent_sha256=");n=tg_hex(req,n,ih);n=tg_app(req,n,"&reverse_intent=");n=tg_app(req,n,reverse);n=tg_app(req,n,"&expect_reverse_sha256=");n=tg_hex(req,n,rh);req[n]=0 as u8;return req 26} 27func tg_case(root:*u8,name:*u8,program:*u8,mode:i64,c:*i64)->i64 { 28 let dir:*u8=sg_path(root,name);if sys_mkdir(dir,0x1c0)!=0 { return 3 } 29 let live:*u8=sg_path(dir,"live");let source:*u8=sg_path(dir,"source");let candidate:*u8=sg_path(dir,"candidate");let backup:*u8=sg_path(dir,"backup") 30 let intent:*u8=sg_path(dir,"intent");let reverse:*u8=sg_path(dir,"reverse");let rcandidate:*u8=sg_path(dir,"reverse-candidate");let rbackup:*u8=sg_path(dir,"rejected") 31 let registry:*u8=sg_path(dir,"registry") 32 let old:*u8="OLD";let fresh:*u8="NEW";let oh:*u8=sys_mmap(32);let nh:*u8=sys_mmap(32) 33 sha256_digest(old,3,oh);sha256_digest(fresh,3,nh) 34 if sg_file(live,old)!=0 || sg_file(source,fresh)!=0 { return 3 } 35 let budget:i64=8192;let w:*NxFileWriteResult=sys_mmap(__size_of(NxFileWriteResult)) as *NxFileWriteResult 36 if fi_plan_create(intent,source,live,candidate,backup,MODE_0600,nh,oh,budget,w)!=0 { return 3 } 37 if fi_plan_create(reverse,backup,live,rcandidate,rbackup,MODE_0600,oh,nh,budget,w)!=0 { return 3 } 38 let ih:*u8=sys_mmap(32);let rh:*u8=sys_mmap(32);if sg_hash(intent,budget,ih)!=0 || sg_hash(reverse,budget,rh)!=0 { return 3 } 39 let row:*u8=sys_mmap(8192);var at:i64=0 40 at=tg_app(row,at,"nx_sov_build_run.elf toolchain ");at=tg_app(row,at,source);at=tg_app(row,at," deploy health rollback ");at=tg_app(row,at,live);at=tg_app(row,at," process\n");row[at]=0 as u8 41 if sg_file(registry,row)!=0 { return 3 } 42 let args:*i64=sys_mmap(48) as *i64;args[0]=program as i64;args[1]="--canary" as i64;args[2]=name as i64;args[3]=live as i64;args[4]=0 43 let out:*NxToolchainSessionResult=sys_mmap(__size_of(NxToolchainSessionResult)) as *NxToolchainSessionResult;md_tc_session_init(out) 44 let scratch:*u8=sys_mmap(3);let capture:*u8=sys_mmap(64) 45 var approved:*u8=rh;if mode==4 { approved=ih } 46 var deadline:i64=1000;if mode==2 { deadline=25 } 47 let req:*u8=tg_request(intent,ih,reverse,approved);let parsed:*NxToolchainRequestV2=sys_mmap(__size_of(NxToolchainRequestV2)) as *NxToolchainRequestV2 48 if mode==0 { 49 gv_check("unauthenticated-before-mutation",ma_tc_v2_dispatch(req,fi_len(req),0-1,registry,8192,budget,program,args,deadline,scratch,3,capture,64,parsed,out)==401 && sg_same(live,oh)==1 && out.session.held==0,c);ma_tc_request_v2_close(parsed) 50 gv_check("unauthorized-before-mutation",ma_tc_v2_dispatch(req,fi_len(req),0,registry,8192,budget,program,args,deadline,scratch,3,capture,64,parsed,out)==403 && sg_same(live,oh)==1,c);ma_tc_request_v2_close(parsed) 51 let bad:*u8=sys_mmap(8192);fi_copy(bad,req,fi_len(req));let bn:i64=tg_app(bad,fi_len(req),"&canary=/tmp/injected");bad[bn]=0 as u8 52 gv_check("caller-cannot-select-canary",ma_tc_v2_dispatch(bad,bn,MA_LVL_ACT,registry,8192,budget,program,args,deadline,scratch,3,capture,64,parsed,out)==400 && sg_same(live,oh)==1,c);ma_tc_request_v2_close(parsed) 53 fi_copy(bad,req,fi_len(req));let dn:i64=tg_app(bad,fi_len(req),"&target=nxasm_x86_main.elf");bad[dn]=0 as u8 54 gv_check("duplicate-target-refused",ma_tc_v2_dispatch(bad,dn,MA_LVL_ACT,registry,8192,budget,program,args,deadline,scratch,3,capture,64,parsed,out)==400 && sg_same(live,oh)==1,c);ma_tc_request_v2_close(parsed) 55 } 56 let status:i64=ma_tc_v2_dispatch(req,fi_len(req),MA_LVL_ACT,registry,8192,budget,program,args,deadline,scratch,3,capture,64,parsed,out) 57 var result:i64=status;if status==200 { result=0 };ma_tc_request_v2_close(parsed) 58 if mode==0 { 59 gv_check("success-published-with-lock-and-canary",result==0 && out.canary_attempted==1 && out.canary_exit==0 && out.session.held==1 && sg_same(live,nh)==1,c) 60 gv_check("success-prepared-recovery-before-release",sg_same(rcandidate,oh)==1 && sg_same(rbackup,nh)==1 && sg_same(backup,oh)==1,c) 61 gv_check("active-result-reentry-preserves-owner",md_tc_session_run(registry,8192,"nx_sov_build_run.elf",intent,ih,reverse,rh,budget,program,args,1000,scratch,3,capture,64,out)==FIO_EEXIST && out.session.held==1,c) 62 } else { 63 if mode==4 { gv_check("bad-reverse-refused-before-publication",result!=0 && out.canary_attempted==0 && out.publication.replacement.publication.visible==0 && sg_same(live,oh)==1,c) } 64 else { 65 gv_check(name,result!=0 && out.canary_attempted==1 && out.rollback_attempted==1 && out.rollback.code==0 && sg_same(live,oh)==1 && sg_same(rbackup,nh)==1 && out.session.held==1,c) 66 if mode==1 { gv_check("actual-nonzero-canary-retained",out.canary_exit==23,c) } 67 if mode==2 { gv_check("actual-deadline-refusal-retained",out.canary_exit!=0,c) } 68 if mode==3 { gv_check("actual-truncated-capture-refused",out.canary_truncated==1,c) } 69 } 70 } 71 let lock:*NxFileTargetLock=sys_mmap(__size_of(NxFileTargetLock)) as *NxFileTargetLock;fio_target_lock_init(lock) 72 gv_check("lock-held-through-result-review",fio_target_lock_acquire(live,lock)!=0,c);fio_target_lock_release(lock) 73 gv_check("explicit-close-releases-for-next-writer",md_tc_session_close(out)==0 && fio_target_lock_acquire(live,lock)==0,c);fio_target_lock_release(lock) 74 return 0 75} 76 77func tg_identity(path:*u8)->i64 { 78 let link:*u8=sys_mmap(4096);let stat:*i64=sys_mmap(144) as *i64 79 let lr:i64=sys_readlinkat(path,link,4095);if lr>=0 { link[lr]=0 as u8 } else { link[0]=0 as u8 } 80 let sr:i64=sys_fstatat(path,stat as *u8) 81 let w:*NxInstallReceiptWriter=sys_mmap(__size_of(NxInstallReceiptWriter)) as *NxInstallReceiptWriter 82 w.bytes=sys_mmap(8192);w.capacity=8192;w.count=0;w.code=0 83 ma_ir_text(w,"{");ma_ir_named_string(w,"path",path);ma_ir_text(w,",");ma_ir_named_number(w,"readlink_rc",lr);ma_ir_text(w,",");ma_ir_named_string(w,"link",link);ma_ir_text(w,",");ma_ir_named_number(w,"stat_rc",sr);ma_ir_text(w,",\"raw_stat_words\":[") 84 var i:i64=0;while i<18 { if i>0 { ma_ir_text(w,",") };ma_ir_number(w,stat[i]);i=i+1 };ma_ir_text(w,"]}\n") 85 if w.code!=0 { return w.code };sys_write(1,w.bytes,w.count);return 0 86} 87func main(argc:i64,argv:*i64)->i64 { 88 if argc==2 && md_streq(argv[1] as *u8,"--identity")==1 { 89 tg_identity("/volume1/homes/elderwesto/nishihost") 90 tg_identity("/volume1/homes/elderwesto/nishihost/_offc") 91 tg_identity("/volume1/homes/elderwesto/nishihost/buildroot") 92 tg_identity("/volume1/homes/elderwesto/nishihost/buildroot/_offc") 93 tg_identity("/volume1/homes/elderwesto/nishihost/nx_sov_build_run.elf") 94 tg_identity("/volume1/homes/elderwesto/nishihost/_offc/nx_sov_build_run.elf") 95 tg_identity("/volume1/homes/elderwesto/nishihost/buildroot/_offc/nx_sov_build_run.elf") 96 return 0 97 } 98 99 if argc==4 && md_streq(argv[1] as *u8,"--canary")==1 { 100 let mode:*u8=argv[2] as *u8 101 let lock:*NxFileTargetLock=sys_mmap(__size_of(NxFileTargetLock)) as *NxFileTargetLock;fio_target_lock_init(lock) 102 let rc:i64=fio_target_lock_acquire(argv[3] as *u8,lock);fio_target_lock_release(lock) 103 if rc==0 { return 31 } 104 if md_streq(mode,"nonzero")==1 { return 23 } 105 if md_streq(mode,"timeout")==1 { sys_sleep_ms(500);return 0 } 106 if md_streq(mode,"truncated")==1 { sys_write(1,"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",128);return 0 } 107 return 0 108 } 109 if argc!=2 { return 2 };let root:*u8=argv[1] as *u8;if fi_path_valid(root)==0 || sys_mkdir(root,0x1c0)!=0 { return 2 } 110 var program:*u8=argv[0] as *u8 111 if fi_path_valid(program)==0 { let cwd:*u8=sys_mmap(4096);if sys_getcwd(cwd,4096)<0 { return 3 };program=sg_path(cwd,program) } 112 let c:*i64=gv_ctr() 113 if tg_case(root,"success",program,0,c)!=0 { return 3 } 114 if tg_case(root,"nonzero",program,1,c)!=0 { return 3 } 115 if tg_case(root,"timeout",program,2,c)!=0 { return 3 } 116 if tg_case(root,"truncated",program,3,c)!=0 { return 3 } 117 if tg_case(root,"bad-reverse",program,4,c)!=0 { return 3 } 118 return gv_verdict("TOOLCHAIN-INSTALL-SESSION",c,"real child canaries and scratch-file rollback; no HTTP adoption or production alias proof") 119}