nx_ferment_kinetics_test.nx source
↩ module page · 52 lines · 2408 B
1// nx_ferment_kinetics_test.nx -- smoke for nx_ferment_kinetics (R3).
2//
3// Proves the predictive science, MEASURED not asserted:
4// - temperature factor is monotone in T (1-4)
5// - the ferment sets within the horizon (5-6)
6// - WARMER SETS FASTER: set(43) < set(30) < set(20) (7-8) -- the Q10 claim
7// - science -> safety link: 43 C acidifies inside the 48 h window (9)
8// while 15 C does NOT (10), and R0 agrees on both batches (11-12)
9// Exit code = failed assertion number; 0 = all pass.
10
11import "nx_ferment_safety.nx"
12import "nx_ferment_kinetics.nx"
13
14func main() -> i64 {
15 // --- temperature factor monotone (Q10) ---
16 let f43: i64 = nx_ferment_kinetics_temp_factor_q10(43)
17 let f30: i64 = nx_ferment_kinetics_temp_factor_q10(30)
18 let f20: i64 = nx_ferment_kinetics_temp_factor_q10(20)
19 if f43 <= 1024 { return 1 } // warmer than ref -> faster
20 if f20 >= 1024 { return 2 } // cooler than ref -> slower
21 if f43 <= f30 { return 3 }
22 if f30 <= f20 { return 4 }
23
24 // --- predicted set-times ---
25 let s43: i64 = nx_ferment_kinetics_set_time(43)
26 let s30: i64 = nx_ferment_kinetics_set_time(30)
27 let s20: i64 = nx_ferment_kinetics_set_time(20)
28 if s43 <= 0 { return 5 } // it sets
29 if s20 <= 0 { return 6 } // even cool sets within the horizon
30 if s43 >= s30 { return 7 } // WARMER SETS FASTER
31 if s30 >= s20 { return 8 }
32
33 // --- science -> safety: 43 C makes the 48 h window, 15 C does not ---
34 if s43 >= 48 { return 9 }
35 let s15: i64 = nx_ferment_kinetics_set_time(15)
36 if s15 <= 48 { return 10 } // too cold -> misses the window
37
38 // --- R0 agrees: predicted 43 C batch is SAFE ---
39 let env: *NxFermentSafetyEnvelope = nx_ferment_safety_envelope_default(1)
40 let nolog: *NxFermentReadingLog = (0) as *NxFermentReadingLog
41 let ph43: i64 = nx_ferment_kinetics_ph_at(43, 48)
42 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_ANAEROBIC,
43 43000, ph43 as nx_size, 0, 48, 0, nolog, 48) != NX_FS_OK { return 11 }
44
45 // --- R0 agrees: predicted 15 C anaerobic batch is UNSAFE (botulism:
46 // never acidified within the window) ---
47 let ph15: i64 = nx_ferment_kinetics_ph_at(15, 48)
48 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_ANAEROBIC,
49 15000, ph15 as nx_size, 0, 48, 0, nolog, 48) != NX_FS_REFUSED_BOTULISM_PH { return 12 }
50
51 return 0
52}