nx_money_situation_gate.nx source
↩ module page · 60 lines · 3612 B
1// nx_money_situation_gate.nx -- proves the situation model + the priority router on three hand-computed personas:
2// A = healthy saver with debt -> priority ATTACK DEBT (2)
3// B = negative cash flow -> priority CRISIS/RELIEF (0)
4// C = debt-free, funded -> priority INVEST (3)
5// plus the derived metrics (surplus, DTI, net worth, emergency-fund months, max debt paydown). Exit 0 iff all pass.
6// license_tier: ORIGINAL
7import "nx_gate.nx"
8import "nx_money_situation.nx"
9
10func chk(name: *u8, got: i64, want: i64, st: *i64) -> i64 {
11 if got == want { st[0] = st[0] + 1; gw(" PASS " as *u8); gw(name); gw("\n" as *u8) }
12 else { st[1] = st[1] + 1; gw(" FAIL " as *u8); gw(name); gw(" got=" as *u8); gn(got); gw(" want=" as *u8); gn(want); gw("\n" as *u8) }
13 return 0
14}
15
16func main() -> i64 {
17 let st: *i64 = sys_mmap(16) as *i64
18 st[0] = 0; st[1] = 0
19
20 // -- Persona A: gross $6000, net $4800, essentials $2500, discretionary $800, cash $10000, target 3mo; one $5000 @ 6% min $100 debt --
21 let A: *i64 = sys_mmap(8 * SIT_FIELDS) as *i64
22 A[SIT_INCOME_GROSS] = 600000; A[SIT_INCOME_NET] = 480000; A[SIT_EXPENSES_ESSENTIAL] = 250000
23 A[SIT_SPEND_DISCRETIONARY] = 80000; A[SIT_CASH] = 1000000; A[SIT_EFUND_TARGET_MONTHS] = 3
24 let dA: *i64 = sys_mmap(8 * DS_FIELDS * 2) as *i64
25 dA[0] = 500000; dA[1] = 600; dA[2] = 10000
26
27 chk("A total debt = $5000" as *u8, sit_total_debt(dA, 1), 500000, st)
28 chk("A total minimums = $100" as *u8, sit_total_min(dA, 1), 10000, st)
29 chk("A net worth = $5000" as *u8, sit_net_worth(A, dA, 1), 500000, st)
30 chk("A monthly surplus = $1400" as *u8, sit_monthly_surplus(A, dA, 1), 140000, st)
31 chk("A max debt paydown = $2200" as *u8, sit_max_debt_paydown(A, dA, 1), 220000, st)
32 chk("A DTI = 166 bps (1.66%)" as *u8, sit_dti_bps(A, dA, 1), 166, st)
33 chk("A emergency fund = 400 (4.00 months)" as *u8, sit_efund_months_x100(A), 400, st)
34 chk("A DTI status = 0 (healthy)" as *u8, sit_dti_status(A, dA, 1), 0, st)
35 chk("A priority = 2 (ATTACK DEBT)" as *u8, sit_priority(A, dA, 1), 2, st)
36
37 // -- Persona B: net $2000, essentials $1800, discretionary $300, cash $200; one $10000 @ 25% min $400 -> negative surplus --
38 let B: *i64 = sys_mmap(8 * SIT_FIELDS) as *i64
39 B[SIT_INCOME_GROSS] = 250000; B[SIT_INCOME_NET] = 200000; B[SIT_EXPENSES_ESSENTIAL] = 180000
40 B[SIT_SPEND_DISCRETIONARY] = 30000; B[SIT_CASH] = 20000; B[SIT_EFUND_TARGET_MONTHS] = 3
41 let dB: *i64 = sys_mmap(8 * DS_FIELDS * 2) as *i64
42 dB[0] = 1000000; dB[1] = 2500; dB[2] = 40000
43
44 chk("B monthly surplus = -$500 (deficit)" as *u8, sit_monthly_surplus(B, dB, 1), 0 - 50000, st)
45 chk("B priority = 0 (CRISIS / RELIEF)" as *u8, sit_priority(B, dB, 1), 0, st)
46
47 // -- Persona C: net $5000, essentials $2000, discretionary $1000, cash $10000, no debt -> invest --
48 let C: *i64 = sys_mmap(8 * SIT_FIELDS) as *i64
49 C[SIT_INCOME_GROSS] = 600000; C[SIT_INCOME_NET] = 500000; C[SIT_EXPENSES_ESSENTIAL] = 200000
50 C[SIT_SPEND_DISCRETIONARY] = 100000; C[SIT_CASH] = 1000000; C[SIT_EFUND_TARGET_MONTHS] = 3
51 let dC: *i64 = sys_mmap(8 * DS_FIELDS * 2) as *i64
52
53 chk("C emergency fund = 500 (5.00 months)" as *u8, sit_efund_months_x100(C), 500, st)
54 chk("C priority = 3 (INVEST / GROW)" as *u8, sit_priority(C, dC, 0), 3, st)
55
56 gw("nx_money_situation_gate: PASS=" as *u8); gn(st[0]); gw(" FAIL=" as *u8); gn(st[1]); gw("\n" as *u8)
57 if st[1] == 0 { gw("nx_money_situation: GREEN (situation-aware priority router, hand-verified)\n" as *u8); return 0 }
58 gw("nx_money_situation: RED\n" as *u8)
59 return 1
60}