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}