code wiki / (root) / nx_twinreport.nx

nx_twinreport.nx source

↩ module page · 54 lines · 3063 B

1// nx_twinreport.nx -- CLI over nx_twinreport_lib (aesthetictwin AT42, 2026-09-17): from a card, or from a seed range, to 2// rendered images plus the board's result rows, in one call. The next nx_compare_results publish shows them. 3// nx_twinreport fit <slug> <target-file> <outdir> <href-prefix> <results-file> 4// nx_twinreport seeds <seed_lo> <seed_hi> <outdir> <href-prefix> <results-file> 5// href-prefix is the site-absolute path of outdir with a trailing slash (/compare/<dom>/results/img/). 6// exit: 0 reported | 2 usage | 3 the target file carries no axis this organ knows | 4 a render refused | 5 the results 7// file refused the append | 6 empty seed range 8// license_tier: ORIGINAL No hw writes (Rule 26). 9import "nx_syscalls.nx" 10import "nx_twinreport_lib.nx" 11 12const TRC_EXIT_USAGE: i64 = 2 13const TRC_ARGC: i64 = 7 14const TRC_A_VERB: i64 = 1 15const TRC_A_ONE: i64 = 2 16const TRC_A_TWO: i64 = 3 17const TRC_A_OUTDIR: i64 = 4 18const TRC_A_HREF: i64 = 5 19const TRC_A_RESULTS: i64 = 6 20 21func trc_usage() -> i64 { 22 ri_puts("usage: nx_twinreport fit <slug> <target-file> <outdir> <href-prefix> <results-file> | seeds <seed_lo> <seed_hi> <outdir> <href-prefix> <results-file>\n" as *u8) 23 return TRC_EXIT_USAGE 24} 25func trc_verdict(code: i64) -> *u8 { 26 if code == TWR_E_NOTARGET { return "REFUSED-NO-TARGET-AXIS" as *u8 } 27 if code == TWR_E_RENDER { return "REFUSED-RENDER" as *u8 } 28 if code == TWR_E_APPEND { return "REFUSED-RESULTS-APPEND" as *u8 } 29 if code == TWR_E_RANGE { return "REFUSED-EMPTY-SEED-RANGE" as *u8 } 30 return "REPORTED" as *u8 31} 32func main(argc: i64, argv: **u8) -> i64 { 33 if argc < TRC_ARGC { return trc_usage() } 34 let base: i64 = sys_mmap(sdf_bytes()) as i64 35 let rep: *i64 = sys_mmap(TWR_R_N * TW_I64) as *i64 36 var code: i64 = 0 37 var known: i64 = 0 38 if ri_streq(argv[TRC_A_VERB], "fit" as *u8) == 1 { 39 known = 1 40 code = twr_fit_report(base, argv[TRC_A_ONE], argv[TRC_A_TWO], argv[TRC_A_OUTDIR], argv[TRC_A_HREF], argv[TRC_A_RESULTS], rep) 41 } 42 if ri_streq(argv[TRC_A_VERB], "seeds" as *u8) == 1 { 43 known = 1 44 code = twr_seed_report(base, tw_atoi(argv[TRC_A_ONE]), tw_atoi(argv[TRC_A_TWO]), argv[TRC_A_OUTDIR], argv[TRC_A_HREF], argv[TRC_A_RESULTS], rep) 45 } 46 if known == 0 { return trc_usage() } 47 ri_puts("TWINREPORT verb=" as *u8); ri_puts(argv[TRC_A_VERB]); ri_puts(" subject=" as *u8); ri_puts(argv[TRC_A_ONE]) 48 tw_kv(" evals=" as *u8, rep[TWR_R_EVALS]); tw_kv(" reached=" as *u8, rep[TWR_R_REACHED]); tw_kv(" unreached=" as *u8, rep[TWR_R_UNREACHED]) 49 tw_kv(" unstated=" as *u8, rep[TWR_R_UNSTATED]); tw_kv(" surface_confirmed=" as *u8, rep[TWR_R_CONFIRMED]); tw_kv(" renders=" as *u8, rep[TWR_R_RENDERS]) 50 tw_kv(" rows_appended=" as *u8, rep[TWR_R_ROWS]); tw_kv(" rows_unchanged=" as *u8, rep[TWR_R_UNCHANGED]); tw_kv(" row_bytes=" as *u8, rep[TWR_R_ROW_BYTES]); tw_kv(" png_bytes=" as *u8, rep[TWR_R_PNG_BYTES]) 51 ri_puts(" verdict=" as *u8); ri_puts(trc_verdict(code)); ri_puts("\n" as *u8) 52 if code < 0 { return 0 - code } 53 return 0 54}