code wiki / _hdl_build / nx_supply_case.nx

nx_supply_case.nx source

↩ module page · 190 lines · 9932 B

1// nx_supply_case.nx -- CLI for nx_supplychain_case: the DOMESTIC supply-chain security + good-jobs 2// business case, for presenting a reshoring plan to city/state/federal government. 3// WHY THIS EXISTS: nx_supplychain_case already carried sc_domestic_permil / sc_weighted_risk / 4// sc_payroll / sc_benefits / sc_home_afford and had NO main(), so a gate could exercise it but NO 5// CALLER COULD EVER REACH IT. That is an ADOPTION GAP, not a missing primitive -- the maths was 6// bought and never wired. This organ adds ONLY composition + arg parsing; it reimplements NOTHING. 7// nx_supply_case case <jobs> <annual_wage_c> <benefit_pct> <median_home_c> <n> [<origin> <energy_risk> <single_source> <value_c>]xN 8// nx_supply_case selftest 9// origin: 0 domestic | 1 allied | 2 adversary. energy_risk 0-100. single_source 0|1. 10// ENVELOPE (declared): home affordability is an INTEGER income multiple straight from the lib, so 11// 4.2x and 4.9x both read 4 -- do NOT read it finer than a whole multiple. Per-corridor FOB and the 12// incentive layer are NOT modelled here; this organ prices SECURITY and JOBS, never landed cost. 13// Pair it with nx_landed_cost, which prices the border and knows nothing about jobs. 14// exit: 0 ok | 2 usage | 3 selftest-fail 15// license_tier: ORIGINAL expect_exit: 0 16import "nx_supplychain_case.nx" 17import "nx_syscalls.nx" 18const SC_MAGIC_7000000: i64 = 7000000 19const SC_MAGIC_4200000000: i64 = 4200000000 20const SC_MAGIC_28000000: i64 = 28000000 21 22const SC_MAXN: i64 = 64 23const SC_STRONG: i64 = 700 24const SC_PARTIAL: i64 = 400 25const SC_RISK_OK: i64 = 15 26const SC_AFFORD_OK: i64 = 4 27 28func w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 29func we(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(2,s,n); return 0 } 30func wn(v: i64) -> i64 { var m: i64=v; if m<0{w("-" as *u8);m=0-m} let t:*u8=sys_mmap(28); var k:i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i:i64=0; let o:*u8=sys_mmap(28); while i<k{o[i]=t[k-1-i];i=i+1} sys_write(1,o,k); sys_munmap(t,28); sys_munmap(o,28); return 0 } 31func q() -> i64 { let c: *u8 = sys_mmap(8); c[0] = 34 as u8; sys_write(1,c,1); sys_munmap(c,8); return 0 } 32func kv(k: *u8) -> i64 { q(); w(k); q(); w(":" as *u8); return 0 } 33 34func sc_streq(a: *u8, b: *u8) -> i64 { 35 var i: i64 = 0 36 var r: i64 = 2 37 while r == 2 { 38 if a[i] != b[i] { r = 0 } else { if a[i] == (0 as u8) { r = 1 } else { i = i + 1 } } 39 } 40 return r 41} 42 43func sc_atoi(s: *u8) -> i64 { 44 var v: i64 = 0 45 var i: i64 = 0 46 var neg: i64 = 0 47 if s[0] == (45 as u8) { neg = 1; i = 1 } 48 while s[i] != (0 as u8) { 49 let c: i64 = s[i] 50 if c >= 48 { if c <= 57 { v = v * 10 + (c - 48) } } 51 i = i + 1 52 } 53 if neg == 1 { return 0 - v } 54 return v 55} 56 57func sc_usage() -> i64 { 58 we("usage: nx_supply_case case <jobs> <annual_wage_c> <benefit_pct> <median_home_c> <n> [<origin> <energy_risk> <single_source> <value_c>]xN\n" as *u8) 59 we(" nx_supply_case selftest\n" as *u8) 60 we(" origin: 0 domestic | 1 allied | 2 adversary\n" as *u8) 61 return 0 62} 63 64// ---- SELFTEST: every tooth paired with its OPPOSITE, so a constant-return stub cannot pass ---- 65func sc_selftest() -> i64 { 66 w("=== nx_supply_case selftest (each tooth carries its opposite) ===\n" as *u8) 67 var pass: i64 = 0 68 var total: i64 = 0 69 let o: *i64 = sys_mmap(SC_MAXN*8) as *i64 70 let e: *i64 = sys_mmap(SC_MAXN*8) as *i64 71 let s: *i64 = sys_mmap(SC_MAXN*8) as *i64 72 let v: *i64 = sys_mmap(SC_MAXN*8) as *i64 73 74 // T1/T2 domestic content: all-domestic must be 1000, all-adversary must be 0 75 o[0]=0; e[0]=0; s[0]=0; v[0]=100 76 o[1]=0; e[1]=0; s[1]=0; v[1]=100 77 let d_all: i64 = sc_domestic_permil(o, v, 2) 78 total=total+1; if d_all==1000 { pass=pass+1; w(" [PASS] " as *u8) } else { w(" [FAIL] " as *u8) } 79 w("T1 all-domestic = " as *u8); wn(d_all); w(" permil (want 1000)\n" as *u8) 80 o[0]=2; o[1]=2 81 let d_none: i64 = sc_domestic_permil(o, v, 2) 82 total=total+1; if d_none==0 { pass=pass+1; w(" [PASS] " as *u8) } else { w(" [FAIL] " as *u8) } 83 w("T2 all-adversary = " as *u8); wn(d_none); w(" permil (want 0) -- OPPOSITE of T1\n" as *u8) 84 85 // T3 weighting is BY VALUE, not by COUNT: 1 domestic part worth 900 vs 9 foreign worth 100 total 86 o[0]=0; v[0]=900 87 var i: i64 = 1 88 while i < 10 { o[i]=2; e[i]=0; s[i]=0; v[i]=vinit(); i=i+1 } 89 let d_w: i64 = sc_domestic_permil(o, v, 10) 90 total=total+1; if d_w==900 { pass=pass+1; w(" [PASS] " as *u8) } else { w(" [FAIL] " as *u8) } 91 w("T3 value-weighted (1 dom @900 vs 9 foreign @100 total) = " as *u8); wn(d_w); w(" permil (want 900, NOT the 100 a count-weighted impl gives)\n" as *u8) 92 93 // T4/T5 risk floor and ceiling 94 o[0]=0; e[0]=0; s[0]=0; v[0]=100 95 let r_lo: i64 = sc_weighted_risk(o, e, s, v, 1) 96 total=total+1; if r_lo==0 { pass=pass+1; w(" [PASS] " as *u8) } else { w(" [FAIL] " as *u8) } 97 w("T4 risk floor (domestic, no single-source, zero energy) = " as *u8); wn(r_lo); w(" (want 0)\n" as *u8) 98 o[0]=2; e[0]=100; s[0]=1 99 let r_hi: i64 = sc_weighted_risk(o, e, s, v, 1) 100 total=total+1; if r_hi==60 { pass=pass+1; w(" [PASS] " as *u8) } else { w(" [FAIL] " as *u8) } 101 w("T5 risk ceiling (adversary 30 + single-source 20 + energy 100/10) = " as *u8); wn(r_hi); w(" (want 60) -- OPPOSITE of T4\n" as *u8) 102 103 // T6 payroll + benefits compose 104 let pay: i64 = sc_payroll(600, SC_MAGIC_7000000) 105 let ben: i64 = sc_benefits(pay, 40) 106 total=total+1; if pay==SC_MAGIC_4200000000 { pass=pass+1; w(" [PASS] " as *u8) } else { w(" [FAIL] " as *u8) } 107 w("T6 payroll 600 jobs x 70000_00c = " as *u8); wn(pay); w("c, benefits@40pct = " as *u8); wn(ben); w("c\n" as *u8) 108 109 // T7/T8 affordability: a real multiple, and FAIL-CLOSED on zero wage 110 let af: i64 = sc_home_afford(SC_MAGIC_28000000, SC_MAGIC_7000000) 111 total=total+1; if af==4 { pass=pass+1; w(" [PASS] " as *u8) } else { w(" [FAIL] " as *u8) } 112 w("T7 home affordability 280k/70k = " as *u8); wn(af); w("x (want 4)\n" as *u8) 113 let af0: i64 = sc_home_afford(SC_MAGIC_28000000, 0) 114 total=total+1; if af0==(0-1) { pass=pass+1; w(" [PASS] " as *u8) } else { w(" [FAIL] " as *u8) } 115 w("T8 zero wage FAILS CLOSED = " as *u8); wn(af0); w(" (want -1, never a divide-by-zero) -- OPPOSITE of T7\n" as *u8) 116 117 // T9 empty component set must not crash and must not claim domesticity 118 let d_empty: i64 = sc_domestic_permil(o, v, 0) 119 total=total+1; if d_empty==0 { pass=pass+1; w(" [PASS] " as *u8) } else { w(" [FAIL] " as *u8) } 120 w("T9 empty set = " as *u8); wn(d_empty); w(" permil (want 0, no claim from no data)\n" as *u8) 121 122 w("NX-SUPPLY-CASE selftest " as *u8); wn(pass); w("/" as *u8); wn(total) 123 if pass == total { w(" verdict=GREEN\n" as *u8); return 0 } 124 w(" verdict=RED\n" as *u8) 125 sys_exit(3) 126 return 3 127} 128 129func vinit() -> i64 { return 11 } 130 131func main(argc: i64, argv: *i64) -> i64 { 132 if argc < 2 { sc_usage(); sys_exit(2); return 2 } 133 let verb: *u8 = argv[1] as *u8 134 if sc_streq(verb, "selftest" as *u8) == 1 { return sc_selftest() } 135 if sc_streq(verb, "case" as *u8) == 0 { sc_usage(); sys_exit(2); return 2 } 136 if argc < 7 { sc_usage(); sys_exit(2); return 2 } 137 138 let jobs: i64 = sc_atoi(argv[2] as *u8) 139 let wage: i64 = sc_atoi(argv[3] as *u8) 140 let benpct: i64 = sc_atoi(argv[4] as *u8) 141 let home: i64 = sc_atoi(argv[5] as *u8) 142 let n: i64 = sc_atoi(argv[6] as *u8) 143 144 if n < 0 { we("NX-SUPPLY-CASE REFUSED: negative component count\n" as *u8); sys_exit(2); return 2 } 145 if n > SC_MAXN { we("NX-SUPPLY-CASE REFUSED: component count exceeds SC_MAXN -- raise it DELIBERATELY, never silently truncate\n" as *u8); sys_exit(2); return 2 } 146 if argc < 7 + 4*n { we("NX-SUPPLY-CASE REFUSED: need 4 fields per component (origin energy single value); a short row would silently zero a part\n" as *u8); sys_exit(2); return 2 } 147 148 let o: *i64 = sys_mmap(SC_MAXN*8) as *i64 149 let e: *i64 = sys_mmap(SC_MAXN*8) as *i64 150 let s: *i64 = sys_mmap(SC_MAXN*8) as *i64 151 let v: *i64 = sys_mmap(SC_MAXN*8) as *i64 152 var i: i64 = 0 153 while i < n { 154 o[i] = sc_atoi(argv[7 + 4*i] as *u8) 155 e[i] = sc_atoi(argv[8 + 4*i] as *u8) 156 s[i] = sc_atoi(argv[9 + 4*i] as *u8) 157 v[i] = sc_atoi(argv[10 + 4*i] as *u8) 158 i = i + 1 159 } 160 161 let dom: i64 = sc_domestic_permil(o, v, n) 162 let risk: i64 = sc_weighted_risk(o, e, s, v, n) 163 let pay: i64 = sc_payroll(jobs, wage) 164 let ben: i64 = sc_benefits(pay, benpct) 165 let afford: i64 = sc_home_afford(home, wage) 166 167 w("{" as *u8) 168 kv("organ" as *u8); q(); w("nx_supply_case" as *u8); q(); w("," as *u8) 169 kv("components" as *u8); wn(n); w("," as *u8) 170 kv("domestic_permil" as *u8); wn(dom); w("," as *u8) 171 kv("weighted_risk" as *u8); wn(risk); w("," as *u8) 172 kv("jobs" as *u8); wn(jobs); w("," as *u8) 173 kv("annual_wage_c" as *u8); wn(wage); w("," as *u8) 174 kv("payroll_c" as *u8); wn(pay); w("," as *u8) 175 kv("benefits_c" as *u8); wn(ben); w("," as *u8) 176 kv("total_comp_c" as *u8); wn(pay + ben); w("," as *u8) 177 kv("home_afford_x" as *u8); wn(afford); w("," as *u8) 178 kv("content_band" as *u8); q() 179 if dom >= SC_STRONG { w("strong" as *u8) } else { if dom >= SC_PARTIAL { w("partial" as *u8) } else { w("exposed" as *u8) } } 180 q(); w("," as *u8) 181 kv("risk_band" as *u8); q() 182 if risk <= SC_RISK_OK { w("low" as *u8) } else { w("elevated" as *u8) } 183 q(); w("," as *u8) 184 kv("afford_band" as *u8); q() 185 if afford < 0 { w("unknown" as *u8) } else { if afford <= SC_AFFORD_OK { w("strong-middle-class" as *u8) } else { w("strained" as *u8) } } 186 q(); w("," as *u8) 187 kv("envelope" as *u8); q(); w("security+jobs only; prices NO landed cost (pair with nx_landed_cost). home_afford_x is a whole income multiple." as *u8); q() 188 w("}\n" as *u8) 189 return 0 190}