code wiki / (root) / nx_wflow_result_gate_t344.nx

nx_wflow_result_gate_t344.nx source

↩ module page · 112 lines · 9775 B

1// Native integration qualification of additive workflow result commands. 2import "nx_wflow_result_candidate_t344.nx" 3import "nx_tool_run.nx" 4static wrt_pass:i64 5static wrt_fail:i64 6static wrt_timeout:i64 7static wrt_elf:*u8 8func wrt_check(ok:i64,label:*u8)->i64{p("RESULT-GATE ");p(label);if ok==1{p(" PASS\n");wrt_pass=wrt_pass+1}else{p(" FAIL\n");wrt_fail=wrt_fail+1};return ok} 9func wrt_path(base:*u8,leaf:*u8)->*u8{let b:*u8=sys_mmap(slen(base)+slen(leaf)+2);var at:i64=wf_cat(b,0,base);b[at]=47;wf_cat(b,at+1,leaf);return b} 10func wrt_file(path:*u8,body:*u8)->i64{let fd:i64=sys_openat_exclusive(path,MODE_0600);if fd<0{return 0};let rc:i64=wfr_write_all(fd,body,slen(body));let sync:i64=sys_fsync(fd);sys_close(fd);return rc==0 && sync==0} 11func wrt_capture(args:*i64,rcp:*i64)->*WfOwnedText{ 12 let owned:*NxBufOwned=sys_mmap(__size_of(NxBufOwned)) as *NxBufOwned 13 let ev:*NxRunEvidence=sys_mmap(__size_of(NxRunEvidence)) as *NxRunEvidence 14 rcp[0]=tr_run_capture_owned_result(wrt_elf,args,owned,wrt_timeout,0,0 as *u8,ev) 15 let out:*WfOwnedText=wf_text_slice(owned.buf,0,owned.len);nx_bo_release(owned) 16 if ev.reaped!=1 || ev.capture_error!=0 || ev.signal!=0{rcp[0]=0-999} 17 return out 18} 19func wrt_result(ledger:*u8,log:*u8,filter:*u8,expected:i64,needle:*u8,label:*u8)->i64{ 20 let args:*i64=sys_mmap(__size_of(i64)*6) as *i64 21 args[0]=wrt_elf as i64;args[1]="result" as *u8 as i64;args[2]=ledger as i64;args[3]=log as i64;args[4]=filter as i64 22 let rc:*i64=sys_mmap(__size_of(i64)) as *i64;let out:*WfOwnedText=wrt_capture(args,rc) 23 if out==(0 as *WfOwnedText){return wrt_check(0,label)} 24 p("RESPONSE bytes=");pn(out.len);p(" ");p(out.data) 25 return wrt_check(rc[0]==expected && wf_has(out.data,needle)==1,label) 26} 27func wrt_fire(flows:*u8,steps:*u8,ledger:*u8,cat:*u8,event:*u8,log:*u8,expected:i64,needle:*u8,label:*u8)->i64{ 28 let args:*i64=sys_mmap(__size_of(i64)*9) as *i64 29 args[0]=wrt_elf as i64;args[1]="fire-result" as *u8 as i64;args[2]=flows as i64;args[3]=steps as i64;args[4]=ledger as i64;args[5]=cat as i64;args[6]=event as i64;args[7]=log as i64 30 let rc:*i64=sys_mmap(__size_of(i64)) as *i64;let out:*WfOwnedText=wrt_capture(args,rc) 31 if out==(0 as *WfOwnedText){return wrt_check(0,label)} 32 p("RESPONSE bytes=");pn(out.len);p(" ");p(out.data) 33 return wrt_check(rc[0]==expected && wf_has(out.data,needle)==1,label) 34} 35func main(argc:i64,argv:*i64)->i64{ 36 if argc!=4{p("gate needs exclusive scratch, candidate ELF and capture timeout ms\n");return 2} 37 let base:*u8=argv[1] as *u8;wrt_elf=argv[2] as *u8;wrt_timeout=wf_atoi(argv[3] as *u8) 38 if wrt_timeout<=0{return 2};if sys_mkdir(base,MODE_0755)!=0{return 2} 39 let log:*u8=wrt_path(base,"full.log");if wrt_file(log,"fixture full evidence; not publication\n")!=1{return 2} 40 let failed:*u8=wrt_path(base,"failed.ledger") 41 let failedtext:*u8="WFRUN rid=x.f flow=f step=0 status=START att=0\nWFRUN rid=x.f flow=f step=1 status=ATT att=1\nWFRUN rid=x.f flow=f step=1 status=FAILSTEP att=1\nWFRUN rid=x.f flow=f step=0 status=FAILED att=0\n" 42 if wrt_file(failed,failedtext)!=1{return 2} 43 wrt_result(failed,log,"x.f",1,"\"state\":\"FAILED\"","failed-not-started-success") 44 let parked:*u8=wrt_path(base,"parked.ledger") 45 if wrt_file(parked,"WFRUN rid=x.f flow=f step=0 status=START att=0\nWFRUN rid=x.f flow=f step=1 status=WAIT att=0\n")!=1{return 2} 46 wrt_result(parked,log,"x.f",0,"\"state\":\"waiting-decision\"","parked-is-waiting") 47 let uncertain:*u8=wrt_path(base,"uncertain.ledger") 48 if wrt_file(uncertain,"WFRUN rid=x.f flow=f step=0 status=START att=0\nWFRUN rid=x.f flow=f step=1 status=ATT att=1\n")!=1{return 2} 49 wrt_result(uncertain,log,"x.f",1,"\"state\":\"UNCERTAIN\"","uncertain-att-no-ok") 50 let truncated:*u8=wrt_path(base,"truncated.ledger") 51 if wrt_file(truncated,"WFRUN rid=x.f flow=f step=0 status=START att=0\nWFRUN rid=x.f flow=f step=0 status=DONE")!=1{return 2} 52 wrt_result(truncated,log,"x.f",2,"\"journal_state\":\"truncated-record\"","truncated-journal-not-done") 53 wrt_result(wrt_path(base,"missing.ledger"),log,"x.f",2,"\"journal_state\":\"missing\"","missing-journal-distinct") 54 wrt_result(failed,wrt_path(base,"missing.log"),"x.f",2,"\"state\":\"missing\"","missing-log-distinct") 55 let capped:*u8=wrt_path(base,"capped.log") 56 if wrt_file(capped,"diagnostics\n[NX-JOB CAPTURE-TRUNCATED cap=100]\n")!=1{return 2} 57 wrt_result(failed,capped,"x.f",2,"\"evidence_truncation_marker\":1","truncated-log-not-complete") 58 let malformed:*u8=wrt_path(base,"malformed.ledger") 59 if wrt_file(malformed,"WFRUN rid=x.f flow=f step=0 status=START att=0\nWFRUN rid=x.f flow=f step=0 status=DONE att=0\nWFRUN rid=x.f flow=f step=0 status=FAILED att=0\n")!=1{return 2} 60 wrt_result(malformed,log,"x.f",2,"\"journal_state\":\"malformed-record\"","conflicting-terminal-not-done") 61 let flows:*u8=wrt_path(base,"test.flows");let steps:*u8=wrt_path(base,"test.steps");let ledger:*u8=wrt_path(base,"native.ledger");let cat:*u8=wrt_path(base,"catalog") 62 if wrt_file(flows,"@version 1\nf|go|-\np|park|-\nb|bad|-\n")!=1{return 2} 63 if wrt_file(steps,"f|1|set-var|-|delivery_state=test-only-no-publication|1\np|1|approve|reviewer|test-decision|1\nb|1|exec-organ|failing|unknown|1\n")!=1{return 2} 64 let ct:*u8=sys_mmap(slen(wrt_elf)+slen("failing\t\tGREEN\n")+1);var co:i64=wf_cat(ct,0,"failing\t");co=wf_cat(ct,co,wrt_elf);wf_cat(ct,co,"\tGREEN\n") 65 if wrt_file(cat,ct)!=1{return 2} 66 let successlog:*u8=wrt_path(base,"success.log") 67 wrt_fire(flows,steps,ledger,cat,"go~id=first",successlog,0,"\"state\":\"DONE\"","native-fire-result-done") 68 wrt_fire(wrt_path(base,"missing.flows"),steps,ledger,cat,"go~id=first",wrt_path(base,"setup-failed.log"),2,"\"state\":\"needs-intervention\"","command-failure-not-hidden-by-prior-done") 69 let before:*WfrFile=wfr_read(ledger) 70 wrt_fire(flows,steps,ledger,cat,"go~id=second",successlog,2,"\"effects\":\"none\"","existing-evidence-refuses-before-effects") 71 let after:*WfrFile=wfr_read(ledger);wrt_check(seq(before.hash,after.hash)==1,"refusal-ledger-unchanged") 72 73 // Legacy negative control: distinct complete IDs share the truncated durable identity. 74 let longA:*u8=sys_mmap(slen("go~id=")+WF_EVENT_ID_CAP+2) 75 let longB:*u8=sys_mmap(slen("go~id=")+WF_EVENT_ID_CAP+2) 76 var la:i64=wf_cat(longA,0,"go~id=");var lb:i64=wf_cat(longB,0,"go~id=");var ix:i64=0 77 while ix<WF_EVENT_ID_CAP-1{longA[la+ix]=97;longB[lb+ix]=97;ix=ix+1} 78 longA[la+ix]=88;longB[lb+ix]=89 79 let legacy:*u8=wrt_path(base,"legacy-collision.ledger") 80 let first:i64=wf_fire_files(flows,steps,legacy,cat,longA) 81 let legacyBefore:*WfrFile=wfr_read(legacy) 82 let second:i64=wf_fire_files(flows,steps,legacy,cat,longB) 83 let legacyAfter:*WfrFile=wfr_read(legacy) 84 wrt_check(first==1 && second==(0-100) && seq(legacyBefore.hash,legacyAfter.hash)==1,"legacy-long-id-collision-reproduced") 85 let guardBefore:*WfrFile=wfr_read(ledger) 86 let longLogA:*u8=wrt_path(base,"long-a.log");let longLogB:*u8=wrt_path(base,"long-b.log") 87 wrt_fire(flows,steps,ledger,cat,longA,longLogA,2,"invalid-or-aliased-event-identity","long-colliding-id-a-refused") 88 wrt_fire(flows,steps,ledger,cat,longB,longLogB,2,"invalid-or-aliased-event-identity","long-colliding-id-b-refused") 89 wrt_fire(flows,steps,ledger,cat,"go~id=first~id=other",wrt_path(base,"duplicate-id.log"),2,"invalid-or-aliased-event-identity","duplicate-event-id-refused") 90 wrt_fire(flows,steps,ledger,cat,"go~id=two words",wrt_path(base,"space-id.log"),2,"invalid-or-aliased-event-identity","token-splitting-id-refused") 91 wrt_fire(flows,steps,ledger,cat,"go~id=",wrt_path(base,"empty-id.log"),2,"invalid-or-aliased-event-identity","empty-event-id-refused") 92 let guardAfter:*WfrFile=wfr_read(ledger) 93 let ga:*WfrFile=wfr_read(longLogA);let gb:*WfrFile=wfr_read(longLogB) 94 wrt_check(seq(guardBefore.hash,guardAfter.hash)==1 && ga.status==(0-2) && gb.status==(0-2),"identity-refusal-before-ledger-and-log-effects") 95 // Exactly the old engine's full representable event identity remains accepted. 96 longA[la+WF_EVENT_ID_CAP-1]=0 97 wrt_fire(flows,steps,ledger,cat,longA,wrt_path(base,"max-id.log"),0,"\"selected_runs\":1","max-representable-id-complete") 98 wrt_fire(flows,steps,ledger,cat,"go~id=first.child",wrt_path(base,"prefix-child.log"),0,"\"selected_runs\":1","distinct-dotted-event") 99 wrt_fire(flows,steps,ledger,cat,"go~id=first",wrt_path(base,"prefix-parent.log"),0,"\"selected_runs\":1","summary-does-not-include-prefix-sibling") 100 wrt_check(wfr_summary(ledger,successlog,"first.f",0,1,3)==2,"known-nonzero-summary-return-consistent") 101 102 wrt_fire(flows,steps,ledger,cat,"bad~id=failed",wrt_path(base,"failed.log"),1,"\"state\":\"FAILED\"","native-connector-failure-not-success") 103 wrt_fire(flows,steps,ledger,cat,"park~id=waiting",wrt_path(base,"waiting.log"),0,"\"state\":\"PARKED\"","native-approval-parked") 104 let args:*i64=sys_mmap(__size_of(i64)*8) as *i64 105 args[0]=wrt_elf as i64;args[1]="resume-result" as *u8 as i64;args[2]=flows as i64;args[3]=steps as i64;args[4]=ledger as i64;args[5]=cat as i64;args[6]=wrt_path(base,"resume.log") as i64 106 let rc:*i64=sys_mmap(__size_of(i64)) as *i64;let resumed:*WfOwnedText=wrt_capture(args,rc) 107 p("RESPONSE bytes=");pn(resumed.len);p(" ");p(resumed.data) 108 wrt_check(rc[0]==0 && wf_has(resumed.data,"\"selected_runs\":1")==1 && wf_has(resumed.data,"waiting.p")==1 && wf_has(resumed.data,"failed.b")==0,"resume-selects-eligible-only") 109 // Read-only representative real release. This never replays its connectors. 110 wrt_result("/volume1/homes/elderwesto/nishihost/knowledge/status/wflow_runs.log","/volume1/homes/elderwesto/nishihost/buildroot/knowledge/gates/alpha-person-workflow-run-t343.log","person-alpha-t343-75baa30cd054.component-alpha-experimental",0,"\"effects\":\"connector-receipts-required\"","real-release-ledger-read-only") 111 p("RESULT-GATE TOTAL pass=");pn(wrt_pass);p(" fail=");pn(wrt_fail);p("\n");if wrt_fail>0{return 1};return 0 112}