Real carbonate chemistry
The saturation index from pH, total alkalinity, calcium hardness, cyanuric acid and water temperature, using the Plummer and Busenberg carbonate equilibria and Davies activity coefficients. Cyanuric acid is not quietly treated as zero: leaving it out moved a real sample by 0.18 and flipped its verdict from corrosive to balanced, so a missing reading suppresses the verdict instead.