code wiki / _hdl_build / nx_job_handler_canonical_gate_t182.nx
nx_job_handler_canonical_gate_t182.nx source
↩ module page · 67 lines · 4903 B
1// nx_job_handler_canonical_gate_t182.nx -- Manages asynchronous and synchronous job execution for worker processes in the Nishi ecosystem.
2import "nx_tools_api.nx"
3import "nx_gate_verdict.nx"
4func jt_call(async:i64,out:*u8)->i64{
5 let cap:*u8=sys_mmap(1024);let cn:i64=capt_issue(TA_CAP_SECRET,ta_slen(TA_CAP_SECRET),"worker",6,sys_now_realtime_sec()+600,42,cap,1024)
6 let body:*u8=sys_mmap(4096);var n:i64=ta_cat(body,0,"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"worker\",\"_cap\":\"")
7 n=ta_catb(body,n,cap,cn);n=ta_cat(body,n,"\"")
8 if async==1{n=ta_cat(body,n,",\"_async\":\"1\"")}
9 n=ta_cat(body,n,",\"arguments\":{\"argv\":[]}}}")
10 let req:*u8=sys_mmap(8192);var rn:i64=ta_cat(req,0,"POST /mcp HTTP/1.1\r\nHost: test\r\nConnection: close\r\n\r\n")
11 rn=ta_catb(req,rn,body,n);return ta_handle_pfx("fixture-reg-",req,rn,out)
12}
13func jt_setup(root:*u8,name:*u8,blocked:i64,promote:i64)->i64{
14 let dir:*u8=sys_mmap(JR_PATH);let n:i64=ta_cat(dir,ta_cat(dir,ta_cat(dir,0,root),"/"),name);dir[n]=0
15 if sys_mkdir(dir,MODE_0755)!=0{return 0};if sys_chdir(dir)!=0{return 0}
16 let allow:*u8="worker\t/volume1/homes/elderwesto/nishihost/buildroot/_build/nx_job_worker_fixture_t182.sov.elf\tGREEN\n"
17 if ta_job_put("tool_allowlist.conf",allow,ta_slen(allow))!=0{return 0}
18 if blocked==1{if ta_job_put("_jobs","not-a-directory\n",16)!=0{return 0}}else{if sys_mkdir("_jobs",MODE_0755)!=0{return 0}}
19 if promote==1{sys_mkdir("knowledge",MODE_0755);let conf:*u8="edge_window_ms=1010\nreply_reserve_ms=1000\n";if ta_job_put(TEA_WINDOW_CONF,conf,ta_slen(conf))!=0{return 0}}
20 return 1
21}
22func jt_file_has(path:*u8,pat:*u8)->i64{
23 let sz:*i64=sys_mmap(16) as *i64;let b:*u8=sys_read_file(path,sz);if (b as i64)==0{return 0};return jr_has(b,sz[0],pat)
24}
25func main()->i64{
26 let c:*i64=gv_ctr();gv_head("Actual tools API candidate ownership before execution")
27 let root:*u8=sys_mmap(JR_PATH);let n:i64=ta_catn(root,ta_cat(root,0,"/tmp/nishi-job-handler-t182-"),sys_now_ms());root[n]=0
28 if sys_mkdir(root,MODE_0755)!=0{return 3}
29 let out:*u8=sys_mmap(1048576);let jid:*i64=sys_mmap(16) as *i64;let path:*u8=sys_mmap(JR_PATH)
30 if jt_setup(root,"async",0,0)!=1{return 3}
31 let base:i64=sys_now_realtime_sec();var i:i64=0
32 while i<180{jr_mkpath(path,JR_PATH,JR_JOBS,base+i,JR_EXT_CLAIM);let mark:*u8="state=CLAIMED owner=fixture\n";if ta_job_put(path,mark,ta_slen(mark))!=0{return 3};i=i+1}
33 let ab:i64=sys_now_ms();let an:i64=jt_call(1,out);let ad:i64=sys_now_ms()-ab
34 gv_check("async returns started with owned ID beyond180 occupied",jx_get_int(out,an,0,"job",jid)>=0 && jid[0]>=base+180 && jr_has(out,an,"JOB-STARTED")==1,c)
35 sys_sleep_ms(300)
36 jr_mkpath(path,JR_PATH,JR_JOBS,jid[0],JR_EXT_CLAIM)
37 gv_check("async owned claim completes",jt_file_has(path,"state=DONE")==1,c)
38 jr_mkpath(path,JR_PATH,JR_JOBS,jid[0],JR_EXT_OUT)
39 gv_check("async owned output belongs to worker",jt_file_has(path,"WORKER-COMPLETE")==1,c)
40 jr_mkpath(path,JR_PATH,JR_JOBS,base+99,JR_EXT_CLAIM)
41 gv_check("async preserves old claim",jt_file_has(path,"owner=fixture")==1,c)
42 if jt_setup(root,"inline",0,0)!=1{return 3}
43 let sb:i64=sys_now_ms();let sn:i64=jt_call(0,out);let sd:i64=sys_now_ms()-sb
44 gv_check("sync returns actual worker output",jr_has(out,sn,"WORKER-COMPLETE")==1 && jr_has(out,sn,"JOB-STARTED")==0,c)
45 gv_check("sync returns completed ownership evidence",jx_get_int(out,sn,0,"job",jid)>=0 && jr_has(out,sn,"\"publication_verified\":true")==1,c)
46 jr_mkpath(path,JR_PATH,JR_JOBS,jid[0],JR_EXT_CLAIM)
47 gv_check("inline claim finalized",jt_file_has(path,"state=DONE")==1,c)
48 if jt_setup(root,"promote",0,1)!=1{return 3}
49 let pn:i64=jt_call(0,out)
50 gv_check("sync promotion keeps preowned ID",jx_get_int(out,pn,0,"job",jid)>=0 && jr_has(out,pn,"\"promoted\":1")==1,c)
51 sys_sleep_ms(300)
52 jr_mkpath(path,JR_PATH,JR_JOBS,jid[0],JR_EXT_CLAIM)
53 gv_check("promoted claim completes",jt_file_has(path,"state=DONE")==1,c)
54 jr_mkpath(path,JR_PATH,JR_JOBS,jid[0],JR_EXT_OUT)
55 gv_check("promoted result preserved",jt_file_has(path,"WORKER-COMPLETE")==1,c)
56 if jt_setup(root,"blocked-sync",1,0)!=1{return 3}
57 let bn:i64=jt_call(0,out)
58 gv_check("sync resource refusal states unexecuted",jr_has(out,bn,"\"executed\":false")==1 && jr_has(out,bn,"\"reservation_errno\":-20")==1,c)
59 gv_check("sync refused before worker side effect",sys_openat_rd("worker.executed")<0,c)
60 if jt_setup(root,"blocked-async",1,0)!=1{return 3}
61 let cn:i64=jt_call(1,out)
62 gv_check("async resource refusal states unexecuted",jr_has(out,cn,"\"executed\":false")==1 && jr_has(out,cn,"JOB-STARTED")==0,c)
63 sys_sleep_ms(150)
64 gv_check("async refused before worker side effect",sys_openat_rd("worker.executed")<0,c)
65 gv_puts("async_response_ms=");gv_num(ad);gv_puts(" sync_including100ms_worker_ms=");gv_num(sd);gv_puts("\n")
66 return gv_verdict("job-handler-ownership",c,"Actual handler and actual isolated native worker; no live deployment")
67}