code wiki / (root) / nx_compare_preview_capture_t56.nx

nx_compare_preview_capture_t56.nx source

↩ module page · 123 lines · 6957 B

1// Test-only staged matrix capture. No source edits or index publication. 2// WARNING: matrix HTML rendering can refresh public reference assets via rp_publish. 3// Do not run against the real tree without accepting that existing emitter side effect. 4// args: <unique-output-stem> <capture-bytes> <timeout-ms> <html|json> [<target-basename> <domain> <scope-id>]. 5// Four arguments preserve the original fixed target/deploy behavior. Extended calls require a reviewed 6// Compare-owned scope row binding the exact target/domain/mode/SHA; html scope includes reference-asset refresh. 7// No arbitrary path, arbitrary argv, caller policy path, or publishing verb is accepted. 8import "nx_tool_run.nx" 9import "nx_estate_path.nx" 10import "nx_itoa_lib.nx" 11import "nx_compare_capture_scope_lib.nx" 12const CRM_I64_MAX: i64 = 9223372036854775807 13const CRM_PATH_CAP: i64 = 512 14func crm_out(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return sys_write(1, s, n) } 15func crm_equal(a: *u8, b: *u8) -> i64 { var i: i64 = 0; while a[i] != (0 as u8) { if a[i] != b[i] { return 0 }; i = i + 1 }; if b[i] != (0 as u8) { return 0 }; return 1 } 16func crm_decimal(s: *u8) -> i64 { 17 var n: i64 = 0; var i: i64 = 0 18 if s[0] == (0 as u8) { return 0 } 19 while s[i] != (0 as u8) { 20 let c: i64 = s[i] as i64 21 if c < 48 { return 0 }; if c > 57 { return 0 } 22 let d: i64 = c - 48 23 if n > (CRM_I64_MAX - d) / 10 { return 0 } 24 n = n * 10 + d; i = i + 1 25 } 26 return n 27} 28func crm_append(p: *u8, at: i64, s: *u8) -> i64 { 29 var i: i64 = 0; var o: i64 = at 30 while s[i] != (0 as u8) { p[o] = s[i]; o = o + 1; i = i + 1 } 31 p[o] = 0 as u8 32 return o 33} 34func main(argc: i64, argv: *i64) -> i64 { 35 if argc != 5 { if argc != 8 { crm_out("usage: nx_compare_ladder_capture <unique-output-stem> <capture-bytes> <timeout-ms> <html|json> [<target-basename> <domain> <scope-id>]\n" as *u8); return 2 } } 36 let capacity: i64 = crm_decimal(argv[2] as *u8) 37 let deadline: i64 = crm_decimal(argv[3] as *u8) 38 if capacity <= 0 { crm_out("REFUSED invalid capture bytes\n" as *u8); return 2 } 39 if deadline <= 0 { crm_out("REFUSED invalid timeout\n" as *u8); return 2 } 40 let path: *u8 = sys_mmap(CRM_PATH_CAP) 41 if (path as i64) <= 0 { return 3 } 42 let prefix_len: i64 = crm_append(path, 0, "knowledge/status/" as *u8) 43 let name: *u8 = argv[1] as *u8 44 var ni: i64 = 0 45 while name[ni] != (0 as u8) { 46 if prefix_len + ni + 6 >= CRM_PATH_CAP { crm_out("REFUSED output stem too long\n" as *u8); return 2 } 47 let c: i64 = name[ni] as i64 48 var ok: i64 = 0 49 if c >= 97 { if c <= 122 { ok = 1 } } 50 if c >= 48 { if c <= 57 { ok = 1 } } 51 if c == 95 { ok = 1 }; if c == 45 { ok = 1 } 52 if ok == 0 { crm_out("REFUSED invalid output stem\n" as *u8); return 2 } 53 ni = ni + 1 54 } 55 if ni == 0 { return 2 } 56 let no: i64 = crm_append(path, prefix_len, name) 57 let mode: *u8 = argv[4] as *u8 58 if crm_equal(mode, "html" as *u8) == 0 { if crm_equal(mode, "json" as *u8) == 0 { return 2 } } 59 if crm_equal(mode, "html" as *u8) == 1 { crm_append(path, no, ".html" as *u8) } else { crm_append(path, no, ".json" as *u8) } 60 var target: *u8="nx_swcompare_matrix_ladder_test_20260907" as *u8 61 var domain: *u8="deploy" as *u8 62 var scope: *u8="legacy-default" as *u8 63 if argc==8 { 64 target=argv[5] as *u8; domain=argv[6] as *u8; scope=argv[7] as *u8 65 if ccs_target(target)!=1 { crm_out("REFUSED target must be a Compare-family basename\n" as *u8); return 2 } 66 if ccs_identifier(domain,CRM_PATH_CAP-1)!=1 { crm_out("REFUSED invalid domain\n" as *u8); return 2 } 67 if ccs_identifier(scope,CRM_PATH_CAP-1)!=1 { crm_out("REFUSED invalid scope ID\n" as *u8); return 2 } 68 } 69 let executable: *u8=sys_mmap(CRM_PATH_CAP) 70 var ep: i64=crm_append(executable,0,"_build/" as *u8) 71 ep=crm_append(executable,ep,target); crm_append(executable,ep,".sov.elf" as *u8) 72 let digest: *u8=sys_mmap(CCS_HEX_BYTES+1) 73 if ep_anchor()<0 {return 3} 74 if sys_chdir("buildroot" as *u8) != 0 { crm_out("REFUSED cannot chdir buildroot\n" as *u8); return 3 } 75 if argc==8 { 76 if ccs_authorize(scope,target,domain,mode,executable,digest)!=1 { 77 crm_out("REFUSED missing, ambiguous, mismatched or hash-changed Compare capture scope\n" as *u8); return 7 78 } 79 } 80 crm_out("CAPTURE-SCOPE target=" as *u8); crm_out(target); crm_out(" domain=" as *u8); crm_out(domain) 81 crm_out(" mode=" as *u8); crm_out(mode); crm_out(" scope=" as *u8); crm_out(scope) 82 if argc==8 { crm_out(" sha256=" as *u8); crm_out(digest) } else { crm_out(" authority=legacy-fixed-target" as *u8) } 83 if crm_equal(mode,"html" as *u8)==1 { crm_out(" reference-assets=may-refresh" as *u8) } 84 else { crm_out(" reference-assets=not-requested-by-wrapper" as *u8) } 85 crm_out(" index-publish-invoked=0\n" as *u8) 86 let prior: i64 = sys_openat_rd(path) 87 if prior >= 0 { sys_close(prior); crm_out("REFUSED output already exists; choose a new test stem\n" as *u8); return 3 } 88 let output: *u8 = sys_mmap(capacity) 89 if (output as i64) <= 0 { crm_out("REFUSED capture allocation failed\n" as *u8); return 3 } 90 let av: *i64 = sys_mmap(32) as *i64 91 av[0] = executable as i64 92 av[1] = domain as i64; av[2] = mode as i64; av[3] = 0 93 let olen: *i64 = sys_mmap(16) as *i64 94 let cut: *i64 = sys_mmap(16) as *i64 95 let rc: i64 = tr_run_capture_tr(av[0] as *u8, av, output, capacity, olen, deadline, cut) 96 crm_out("CAPTURE child_rc=" as *u8); nxi_out(rc); crm_out(" bytes=" as *u8); nxi_out(olen[0]); crm_out(" truncated=" as *u8); nxi_out(cut[0]); crm_out("\n" as *u8) 97 if rc != 0 { return 4 } 98 if cut[0] != TR_FIT { return 4 } 99 if olen[0] <= 0 { return 4 } 100 if crm_equal(mode, "html" as *u8) == 1 { 101 if tr_contains(output, olen[0], "<html" as *u8) != 1 { return 4 } 102 if tr_contains(output, olen[0], "</html>" as *u8) != 1 { return 4 } 103 } else { if output[0] != (123 as u8) { return 4 } } 104 let ofd: i64 = sys_openat_wr(path, 384) 105 if ofd < 0 { crm_out("REFUSED cannot create test output\n" as *u8); return 5 } 106 var done: i64 = 0 107 while done < olen[0] { 108 let wrote: i64 = sys_write(ofd, (output as i64 + done) as *u8, olen[0] - done) 109 if wrote <= 0 { sys_close(ofd); crm_out("FAILED short write; partial test artifact retained\n" as *u8); return 5 } 110 done = done + wrote 111 } 112 if sys_close(ofd) != 0 { return 5 } 113 let vlen: *i64 = sys_mmap(16) as *i64 114 let verify: *u8 = sys_read_file(path, vlen) 115 if (verify as i64) == 0 { return 6 } 116 if vlen[0] != olen[0] { return 6 } 117 var vi: i64 = 0 118 while vi < olen[0] { if verify[vi] != output[vi] { return 6 }; vi = vi + 1 } 119 crm_out("CAPTURE-VERIFIED path=buildroot/" as *u8); crm_out(path); crm_out(" bytes=" as *u8); nxi_out(olen[0]); crm_out(" index-publish-invoked=0\n" as *u8) 120 return 0 121} 122 123