code wiki / (root) / nx_site_release_prepare_gate_t256.nx

nx_site_release_prepare_gate_t256.nx source

↩ module page · 88 lines · 7687 B

1// Private real-artifact qualification; requires a newly created scratch CWD. 2import "nx_site_publish_prepare_lib_t256.nx" 3import "nx_gate_verdict.nx" 4func rg_eq(path: *u8,b: *u8,n: i64) -> i64 {let got: *u8=sys_mmap(n+1);let size: i64=pb_read_bounded(path,got,n+1);let eq: i64=pb_same_bytes(got,size,b,n);sys_munmap(got,n+1);return eq} 5func rg_manifest(v: *i64) -> *u8 { 6 let b: *u8=sys_mmap(PB_CONFCAP);let p: *i64=sys_mmap(8) as *i64;p[0]=0 7 let keys: *i64=sys_mmap(RM_VALUES_BYTES) as *i64 8 keys[0]="schema" as *u8 as i64;keys[1]="site" as *u8 as i64;keys[2]="consumer_source" as *u8 as i64 9 keys[3]="consumer_path" as *u8 as i64;keys[4]="consumer_sha256" as *u8 as i64;keys[5]="consumer_bytes" as *u8 as i64 10 keys[6]="expected_live" as *u8 as i64;keys[7]="dependency_source" as *u8 as i64;keys[8]="dependency_path" as *u8 as i64 11 keys[9]="dependency_sha256" as *u8 as i64;keys[10]="dependency_bytes" as *u8 as i64;keys[11]="registration" as *u8 as i64 12 pb_app(b,p,"{");var i: i64=0;while i<RM_FIELDS{if i>0{pb_app(b,p,",")};pb_app(b,p,"\"");pb_app(b,p,keys[i] as *u8);pb_app(b,p,"\":\"");pb_app(b,p,v[i] as *u8);pb_app(b,p,"\"");i=i+1};pb_app(b,p,"}\n") 13 sys_munmap(keys as *u8,RM_VALUES_BYTES);sys_munmap(p as *u8,8);return b 14} 15func rg_call(v: *i64) -> i64 {let b: *u8=rg_manifest(v);let h: *u8=sys_mmap(PB_SHA_HEX+1);pb_hash(b,vw_slen(b),h);ss_writefile("release.json",b,vw_slen(b));let av: *i64=sys_mmap(5*8) as *i64;av[0]="nx_site_publish" as *u8 as i64;av[1]="prepare-release" as *u8 as i64;av[2]="release.json" as *u8 as i64;av[3]=h as i64;av[4]=0;let rc: i64=sp_main(4,av);sys_munmap(b,PB_CONFCAP);sys_munmap(h,PB_SHA_HEX+1);sys_munmap(av as *u8,40);return rc} 16func rg_parse_text(b: *u8) -> i64 {let v: *i64=sys_mmap(RM_VALUES_BYTES) as *i64;return rm_parse(b,vw_slen(b),v)} 17func main(argc:i64,argv:*i64)->i64{ 18 if argc!=4{return 2};if sys_chdir(argv[3] as *u8)!=0{return 3} 19 let body:*u8=sys_mmap(PB_CONFCAP+1);let n:i64=pb_read_bounded(argv[2] as *u8,body,PB_CONFCAP+1) 20 let v:*i64=sys_mmap(RM_VALUES_BYTES) as *i64 21 if n<=0||n>PB_CONFCAP||rm_parse(body,n,v)!=0{return 2} 22 let page:*i64=sys_mmap(16) as *i64;let dep:*i64=sys_mmap(16) as *i64 23 if rm_artifact(v[2] as *u8,v[5] as *u8,v[4] as *u8,page)!=0{return 3} 24 if rm_artifact(v[7] as *u8,v[10] as *u8,v[9] as *u8,dep)!=0{return 3} 25 if sys_mkdir(argv[1] as *u8,0x1ed)!=0||sys_chdir(argv[1] as *u8)!=0{return 2} 26 let preserved:i64=sys_openat_wr("gate-stdout-handle",FSX_MODE_RW);if preserved<0{return 4};if sys_dup3(1,preserved,0)<0{return 4} 27 let capture:i64=sys_openat_wr("gate-output.txt",FSX_MODE_RW);if capture<0{return 4};if sys_dup3(capture,1,0)<0{return 4} 28 let c:*i64=gv_ctr() 29 gv_check("JsonWriter derived ABI extent",RM_JSON_WRITER_BYTES==__size_of(JsonWriter)&&RM_JSON_WRITER_BYTES==__size_of(i64)+__size_of(i64)+__size_of(i64)+__size_of(*u8)+__size_of(*u8),c) 30 sys_mkdir("knowledge",0x1ed);sys_mkdir("sites",0x1ed);sys_mkdir("sites/gatesite",0x1ed);sys_mkdir("sites/gatesite/alpha",0x1ed);sys_mkdir("sites/gatesite/releases",0x1ed) 31 let conf:*u8="gatesite\tsites/gatesite\tknowledge/pub-\thttps://example.invalid\tGate\tprivate/\n" 32 ss_writefile("knowledge/pub_sites.conf",conf,vw_slen(conf)) 33 let seed:*i64=ss_begin_cap(ss_len("q:n")+1+16);ss_add(seed,1,"q:n","0",1);ss_commit("knowledge/pub-",seed,ss_next_segid("knowledge/pub-")) 34 pl_register_asset("knowledge/pub-","alpha/beach.html","read-only preparation fixture") 35 ss_writefile("page.html",page[0] as *u8,page[1]);ss_writefile("engine.wasm",dep[0] as *u8,dep[1]) 36 let old:*u8="retained-live-predecessor";ss_writefile("sites/gatesite/alpha/beach.html",old,vw_slen(old)) 37 v[1]="gatesite" as *u8 as i64;v[2]="page.html" as *u8 as i64;v[7]="engine.wasm" as *u8 as i64 38 v[11]="existing-only" as *u8 as i64 39 let names:*i64=sys_mmap(3*8) as *i64 40 names[0]="quote\"source.html" as *u8 as i64;names[1]="back\\slash.html" as *u8 as i64;names[2]="line\ncontrol\t.html" as *u8 as i64 41 var ni:i64=0 42 while ni<3{ 43 gv_check("filesystem adversarial source created",ss_writefile(names[ni] as *u8,page[0] as *u8,page[1])==0,c) 44 gv_check("filesystem adversarial source exact bytes",rg_eq(names[ni] as *u8,page[0] as *u8,page[1])==1,c) 45 let original:i64=v[2];v[2]=names[ni] 46 gv_check("manifest rejects unescaped filename boundary",rg_call(v)==PB_RC_USAGE,c) 47 gv_check("direct emitter escapes dynamic filename",rm_prepare_emit(v,v[4] as *u8,PR_MISSING)==PB_RC_CONFLICT,c) 48 v[2]=original;ni=ni+1 49 } 50 gv_check("escaped quote manifest refused",rg_parse_text("{\"schema\":\"site-release/v1\",\"site\":\"bad\\\"quote\"}")==PB_RC_USAGE,c) 51 gv_check("escaped slash manifest refused",rg_parse_text("{\"schema\":\"site-release/v1\",\"site\":\"bad\\\\slash\"}")==PB_RC_USAGE,c) 52 gv_check("escaped control manifest refused",rg_parse_text("{\"schema\":\"site-release/v1\",\"site\":\"bad\\nline\"}")==PB_RC_USAGE,c) 53 let generation:i64=ss_max_segid("knowledge/pub-") 54 gv_check("missing registry distinguished",pr_observe("knowledge/pub-",v[8] as *u8,v[9] as *u8)==PR_MISSING,c) 55 gv_check("legacy missing code retained",pr_check("knowledge/pub-",v[8] as *u8,v[9] as *u8)==PR_CONFLICT,c) 56 gv_check("existing-only actionable refusal",rg_call(v)==PB_RC_CONFLICT,c) 57 gv_check("preparation did not register",ss_max_segid("knowledge/pub-")==generation,c) 58 v[11]="allow" as *u8 as i64 59 gv_check("authorized missing preparation ready",rg_call(v)==0,c) 60 gv_check("allow preparation still does not register",ss_max_segid("knowledge/pub-")==generation,c) 61 gv_check("fixture registration",pr_register("knowledge/pub-",v[8] as *u8,v[9] as *u8)==PR_CREATED,c) 62 let registered:i64=ss_max_segid("knowledge/pub-") 63 v[11]="existing-only" as *u8 as i64 64 gv_check("matching registry observed",pr_observe("knowledge/pub-",v[8] as *u8,v[9] as *u8)==PR_OK,c) 65 gv_check("matching preparation ready",rg_call(v)==0,c) 66 gv_check("matching preparation repeat ready",rg_call(v)==0,c) 67 gv_check("matching preparation no writes",ss_max_segid("knowledge/pub-")==registered,c) 68 gv_check("conflict distinct from missing",pr_observe("knowledge/pub-",v[8] as *u8,v[4] as *u8)==PR_CONFLICT,c) 69 gv_check("missing plane is unavailable",pr_observe("unavailable-",v[8] as *u8,v[9] as *u8)==PR_IO,c) 70 let saved:i64=v[4];v[4]=v[9] 71 gv_check("wrong source hash refused",rg_call(v)==PB_RC_CONFLICT,c);v[4]=saved 72 gv_check("live predecessor unchanged",rg_eq("sites/gatesite/alpha/beach.html",old,vw_slen(old))==1,c) 73 let target:*u8=sys_mmap(PB_PATH);let pos:*i64=sys_mmap(8) as *i64;pos[0]=0;pb_app(target,pos,"sites/gatesite/");pb_app(target,pos,v[8] as *u8) 74 let stat:*u8=sys_mmap(160) 75 gv_check("dependency never published",sys_fstatat(target,stat)==(0-2),c) 76 gv_check("release journal never created",sys_fstatat("knowledge/gates",stat)==(0-2),c) 77 let docs:*u8=sys_mmap(PB_PATH);let idx:*u8=sys_mmap(PB_PATH) 78 ss_auxname("knowledge/pub-",registered,".docs",0,docs);ss_auxname("knowledge/pub-",registered,".idx",0,idx) 79 gv_check("fixture hides docs",sys_renameat(docs,"held.docs")==0,c) 80 gv_check("fixture hides index",sys_renameat(idx,"held.idx")==0,c) 81 gv_check("damaged store observation IO",pr_observe("knowledge/pub-",v[8] as *u8,v[9] as *u8)==PR_IO,c) 82 gv_check("damaged preparation refused",rg_call(v)!=0,c) 83 gv_check("damaged preparation no registry writes",ss_max_segid("knowledge/pub-")==registered,c) 84 let verdict:i64=gv_verdict("RELEASE-PREPARE",c,"real Beach bytes isolated registry; no publication or production mutation") 85 if sys_fsync(capture)!=0{return 4};if sys_dup3(preserved,1,0)<0{return 4};sys_close(capture);sys_close(preserved) 86 fsx_puts("Full evidence: ");fsx_puts(argv[1] as *u8);fsx_puts("/gate-output.txt\n") 87 return gv_verdict("RELEASE-PREPARE",c,"full output retained; no public publication") 88}