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}