nx_remedy_test.nx source
↩ module page · 114 lines · 5281 B
1// nx_remedy_test.nx -- smoke for the formalized self-remediation cycle.
2// Verifies each phase independently + the full-cycle runner end-to-end.
3
4import "syscalls.nx"
5import "nx_remedy.nx"
6import "nx_estimator_diagnostics.nx"
7
8func main() -> i64 {
9 // === phase 1: detect =====================================
10 let report: *AnomalyReport = nx_anomaly_alloc()
11 // observed=100 vs baseline=50 with 100k ppb (0.01%) tolerance
12 // -> diff is 100% of baseline, vastly exceeds tolerance.
13 nx_remedy_detect(100, 50, 100000, 0, report, 7)
14 if report.kind != NX_ANOMALY_TOLERANCE_EXCEEDED { return 11 }
15 if report.cell_id != 7 { return 12 }
16
17 // observed=51 vs baseline=50, tolerance 50% (500000000 ppb) -- within tol.
18 let report2: *AnomalyReport = nx_anomaly_alloc()
19 nx_remedy_detect(51, 50, 500000000, 0, report2, 1)
20 if report2.kind != NX_ANOMALY_NONE { return 13 }
21
22 // regression detect: observed=120 vs prior=100 -> REGRESSION.
23 let report3: *AnomalyReport = nx_anomaly_alloc()
24 nx_remedy_detect(120, 100, 500000000, 100, report3, 1)
25 if report3.kind != NX_ANOMALY_REGRESSION { return 14 }
26
27 // === phase 2: diagnose ===================================
28 let diag: *DiagnosisReport = nx_diag_report_alloc()
29 nx_remedy_diagnose(report, NX_DIAG_VERDICT_HIGHER_BIAS_LOWER_VAR, diag)
30 if diag.rc_code != NX_RC_STALE_CALIBRATION { return 21 }
31
32 let diag2: *DiagnosisReport = nx_diag_report_alloc()
33 nx_remedy_diagnose(report, NX_DIAG_VERDICT_LOWER_BIAS_HIGHER_VAR, diag2)
34 if diag2.rc_code != NX_RC_SAMPLE_VARIANCE_TOO_HIGH { return 22 }
35
36 let diag3: *DiagnosisReport = nx_diag_report_alloc()
37 nx_remedy_diagnose(report, NX_DIAG_VERDICT_BOTH_WORSE, diag3)
38 if diag3.rc_code != NX_RC_ESTIMATOR_MISMATCH { return 23 }
39
40 // === phase 3: propose ====================================
41 let props: *FixProposal = (sys_mmap(96)) as *FixProposal
42 let n1: i64 = nx_remedy_propose(NX_RC_NUMERIC_OVERFLOW, props, 3)
43 if n1 != 3 { return 31 }
44 let p0: *FixProposal = nx_remedy_fp_at(props, 0)
45 if p0.fx_code != NX_FX_ESCALATE_TIER { return 32 }
46
47 let props2: *FixProposal = (sys_mmap(96)) as *FixProposal
48 let n2: i64 = nx_remedy_propose(NX_RC_STALE_CALIBRATION, props2, 3)
49 if n2 != 2 { return 33 }
50 let p2_0: *FixProposal = nx_remedy_fp_at(props2, 0)
51 if p2_0.fx_code != NX_FX_RECALIBRATE_TABLE { return 34 }
52
53 let props3: *FixProposal = (sys_mmap(96)) as *FixProposal
54 let n3: i64 = nx_remedy_propose(NX_RC_SAMPLE_VARIANCE_TOO_HIGH, props3, 3)
55 if n3 != 2 { return 35 }
56 let p3_0: *FixProposal = nx_remedy_fp_at(props3, 0)
57 if p3_0.fx_code != NX_FX_ENSEMBLE { return 36 }
58
59 // === phase 4: apply (plan emission) =====================
60 let plan: *ActionPlan = nx_plan_alloc()
61 nx_remedy_apply_plan(p0, plan)
62 if plan.fx_code != NX_FX_ESCALATE_TIER { return 41 }
63 if plan.payload_a != 2 { return 42 } // target N2 tier
64
65 // === phase 5: A/B verify ================================
66 let before: *EstimatorDiag = nx_diag_alloc()
67 before.mse = 1000
68 let after_worked: *EstimatorDiag = nx_diag_alloc()
69 after_worked.mse = 200 // 5x reduction
70 // improvement_thresh = 100M ppb (10%) means after must be < 900.
71 let v_w: i64 = nx_remedy_ab_verify(before, after_worked, 100000000, 100000000)
72 if v_w != NX_APPLY_WORKED { return 51 }
73
74 let after_regr: *EstimatorDiag = nx_diag_alloc()
75 after_regr.mse = 1500 // 50% worse
76 let v_r: i64 = nx_remedy_ab_verify(before, after_regr, 100000000, 100000000)
77 if v_r != NX_APPLY_REGRESSION { return 52 }
78
79 let after_same: *EstimatorDiag = nx_diag_alloc()
80 after_same.mse = 1000 // unchanged
81 let v_n: i64 = nx_remedy_ab_verify(before, after_same, 100000000, 100000000)
82 if v_n != NX_APPLY_NO_CHANGE { return 53 }
83
84 // === phase 6: generalize ================================
85 // Build 3 cells. Cell 0 & 2 IMPROVE, cell 1 REGRESSES.
86 let bef0: *EstimatorDiag = nx_diag_alloc(); bef0.mse = 1000
87 let bef1: *EstimatorDiag = nx_diag_alloc(); bef1.mse = 1000
88 let bef2: *EstimatorDiag = nx_diag_alloc(); bef2.mse = 1000
89 let aft0: *EstimatorDiag = nx_diag_alloc(); aft0.mse = 500
90 let aft1: *EstimatorDiag = nx_diag_alloc(); aft1.mse = 2000 // regress
91 let aft2: *EstimatorDiag = nx_diag_alloc(); aft2.mse = 800
92
93 let bef_arr: **EstimatorDiag = (sys_mmap(24)) as **EstimatorDiag
94 bef_arr[0] = bef0
95 bef_arr[1] = bef1
96 bef_arr[2] = bef2
97 let aft_arr: **EstimatorDiag = (sys_mmap(24)) as **EstimatorDiag
98 aft_arr[0] = aft0
99 aft_arr[1] = aft1
100 aft_arr[2] = aft2
101
102 let failed: *i64 = (sys_mmap(8)) as *i64
103 let gv: i64 = nx_remedy_generalize(bef_arr, aft_arr, 3, 100000000, failed)
104 if gv != NX_GEN_FAILS_AT_CELL { return 61 }
105 if failed[0] != 1 { return 62 }
106
107 // Same setup but cell 1 also improves -> PASSES.
108 aft1.mse = 600
109 let gv2: i64 = nx_remedy_generalize(bef_arr, aft_arr, 3, 100000000, failed)
110 if gv2 != NX_GEN_PASSES { return 63 }
111 if failed[0] != -1 { return 64 }
112
113 return 0
114}