nx_maint_asset_test.nx source
↩ module page · 112 lines · 4895 B
1// nx_maint_asset_test.nx -- gate for the maintenance spine.
2//
3// Proves the PLATFORM THESIS measurably: one verdict engine + per-asset spec
4// DATA judges different assets correctly, and the SAME temperature trace gets
5// DIFFERENT correct verdicts under different specs (so the envelope is data,
6// not code). Also proves honest NOT_IMPLEMENTED for declared-but-unbuilt
7// kernels (never a fabricated verdict).
8//
9// Coverage:
10// - sealed-enum validity (class + kernel)
11// - A HVAC efficient recovery under the HVAC spec
12// - B KILLER: a water-heater recovery trace (120 mC/min) -> EFFICIENT under
13// the WATER_HEATER spec (normal for a slow tank) but DEGRADED under the
14// HVAC spec (too slow for forced air). Same bytes, two correct answers.
15// - C sediment-fouled water heater (60 mC/min) -> DEGRADED under its OWN spec
16// - D rotating-machine kernel (declared, unbuilt) -> NOT_IMPLEMENTED (honest)
17// - E invalid kernel -> BAD_SPEC
18//
19// expect_exit: 0
20//
21// license_tier: ORIGINAL
22
23import "nx_syscalls_x86_64.nx"
24import "nx_maint_asset.nx"
25
26func main() -> i64 {
27 if nx_maint_kernel_is_valid(NX_MAINT_KERNEL_THERMAL_RESPONSE) != 1 { return 1 }
28 if nx_maint_kernel_is_valid(NX_MAINT_KERNEL_N) != 0 { return 2 }
29 if nx_maint_class_is_valid(NX_MAINT_CLASS_WATER_HEATER) != 1 { return 3 }
30 if nx_maint_class_is_valid(-1) != 0 { return 4 }
31
32 let t: *i64 = sys_mmap(128) as *i64
33 let val: *i64 = sys_mmap(128) as *i64
34 let amb: *i64 = sys_mmap(128) as *i64
35 let on: *i64 = sys_mmap(128) as *i64
36 let out: *HvacEff = sys_mmap(128) as *HvacEff
37
38 // ---- HVAC asset spec (furnace envelope) ----
39 let hvac: *AssetSpec = sys_mmap(64) as *AssetSpec
40 hvac.asset_class = NX_MAINT_CLASS_HVAC
41 hvac.kernel = NX_MAINT_KERNEL_THERMAL_RESPONSE
42 hvac.target_mC = 21000
43 hvac.mode = NX_HVAC_MODE_HEAT
44 hvac.max_cph_x10 = 35
45 hvac.min_resp_mC_per_min = 150
46 hvac.max_overshoot_mC = 600
47
48 // ---- Water-heater asset spec (slow tank envelope = DIFFERENT data) ----
49 let wh: *AssetSpec = sys_mmap(64) as *AssetSpec
50 wh.asset_class = NX_MAINT_CLASS_WATER_HEATER
51 wh.kernel = NX_MAINT_KERNEL_THERMAL_RESPONSE
52 wh.target_mC = 49000 // ~120 F tank setpoint
53 wh.mode = NX_HVAC_MODE_HEAT
54 wh.max_cph_x10 = 200 // tanks cycle slowly -> lenient ceiling
55 wh.min_resp_mC_per_min = 100 // 0.1 degC/min floor (electric tanks ARE slow)
56 wh.max_overshoot_mC = 2000 // stratification tolerance
57
58 // ===== A: HVAC efficient recovery under the HVAC spec ===========
59 t[0]=0; val[0]=19000; amb[0]=5000; on[0]=1
60 t[1]=600; val[1]=21000; amb[1]=5000; on[1]=1
61 t[2]=660; val[2]=21100; amb[2]=5000; on[2]=0
62 t[3]=1800; val[3]=20300; amb[3]=5000; on[3]=0
63 nx_maint_analyze(hvac, t, val, amb, on, 4, out)
64 if out.verdict != NX_HVAC_EFFICIENT { return 10 }
65
66 // ===== B: KILLER -- same WH trace, two specs, two correct verdicts =
67 t[0]=0; val[0]=45000; amb[0]=20000; on[0]=1
68 t[1]=600; val[1]=46200; amb[1]=20000; on[1]=1
69 t[2]=1200; val[2]=47400; amb[2]=20000; on[2]=1
70 t[3]=1800; val[3]=48600; amb[3]=20000; on[3]=1
71 nx_maint_analyze(wh, t, val, amb, on, 4, out)
72 if out.verdict != NX_HVAC_EFFICIENT { return 20 } // normal for a tank
73 if out.resp_mC_per_min != 120 { return 21 }
74 nx_maint_analyze(hvac, t, val, amb, on, 4, out)
75 if out.verdict != NX_HVAC_DEGRADED_CAPACITY { return 22 } // too slow for HVAC
76 if out.resp_mC_per_min != 120 { return 23 }
77
78 // ===== C: sediment-fouled water heater (60 mC/min) under WH spec =
79 t[0]=0; val[0]=45000; amb[0]=20000; on[0]=1
80 t[1]=600; val[1]=45600; amb[1]=20000; on[1]=1
81 t[2]=1200; val[2]=46200; amb[2]=20000; on[2]=1
82 t[3]=1800; val[3]=46800; amb[3]=20000; on[3]=1
83 nx_maint_analyze(wh, t, val, amb, on, 4, out)
84 if out.verdict != NX_HVAC_DEGRADED_CAPACITY { return 30 }
85 if out.resp_mC_per_min != 60 { return 31 }
86
87 // ===== D: declared-but-unbuilt kernel -> NOT_IMPLEMENTED (honest) =
88 let rot: *AssetSpec = sys_mmap(64) as *AssetSpec
89 rot.asset_class = NX_MAINT_CLASS_TOOL
90 rot.kernel = NX_MAINT_KERNEL_ROTATING_MACHINE
91 rot.target_mC = 0
92 rot.mode = NX_HVAC_MODE_HEAT
93 rot.max_cph_x10 = 0
94 rot.min_resp_mC_per_min = 0
95 rot.max_overshoot_mC = 0
96 nx_maint_analyze(rot, t, val, amb, on, 4, out)
97 if out.verdict != NX_MAINT_NOT_IMPLEMENTED { return 40 }
98
99 // ===== E: invalid kernel -> BAD_SPEC ============================
100 let bad: *AssetSpec = sys_mmap(64) as *AssetSpec
101 bad.asset_class = NX_MAINT_CLASS_HVAC
102 bad.kernel = 99
103 bad.target_mC = 21000
104 bad.mode = NX_HVAC_MODE_HEAT
105 bad.max_cph_x10 = 35
106 bad.min_resp_mC_per_min = 150
107 bad.max_overshoot_mC = 600
108 nx_maint_analyze(bad, t, val, amb, on, 4, out)
109 if out.verdict != NX_MAINT_BAD_SPEC { return 50 }
110
111 return 0
112}