Method
MES — Sporomusa-style acetate biocathode
What it predicts
Acetate productivity and the acetate / H₂ / CH₄ Faradaic split for a poised CO₂-reducing biocathode — not power.
Governing relations
Each relation is transcribed from the implementation. Where the code cites no source, the source line says so.
Biofilm-enhanced cathode current Source: Tafel form with an UNCITED biofilm prefactor: the 0.05 mm optimum and 0.08 mm width have no source (flagged 2026-08-19 in mes.ts, pinned by biofilm-prefactor-provenance.test.ts).
The Gaussian thickness term is symmetric and uncited, and may double-count the CO₂ supply limit below.
Symbol Meaning Unit kinetic cathodic current density (magnitude) A/m² strain exchange current density (S. ovata 0.02) A/m² cathodic transfer coefficient, 0.5 1 driving force below the CO₂ → acetate floor V poised cathode potential vs SHE (default −0.6) V biofilm thickness, floor 0.005 mm Faraday constant 96 485, gas constant 8.314, temperature C/mol, J/(mol·K), K CO₂ availability Source: Unsourced engineering default in mes.ts (2026-10 citation audit).
The CO₂ Monod term scales the current; no biomass growth (μ_max) enters the calculation.
Symbol Meaning Unit dissolved CO₂ under sparging, fixed at 30 mM strain half-saturation constant for CO₂ (S. ovata 1.5) mM gas-liquid mass-transfer factor 1 CO₂ volumetric mass-transfer coefficient (default 20) h⁻¹ Faradaic split Source: FE ceiling informed by Nevin et al. 2010, mBio 1:e00103-10 (over 85 % of electrons recovered in products); penalty form is in-house. · doi:10.1128/mbio.00103-10
Symbol Meaning Unit Faradaic efficiency to acetate 1 strain acetate ceiling (S. ovata 0.92) 1 hydrogen-evolution penalty for an over-negative cathode 1 driving force below −0.28 V vs SHE V Worked example
These inputs, passed to the predictor, return the output below. A test re-runs the example on every change, so this number is the one the code produces.
input value unit temperatureC 30 °C ph 7 pH electrodeSpacingCm 2 cm hrtHours 24 h codMgL 1,000 mg/L workingElectrodePotentialVsSheV -0.6 V vs SHE Output · mes.feAcetate = 47.06 %, within ±0.1 %
By hand · S. ovata, η = −0.28 − (−0.6) = 0.32 V. j_kin = 0.02 × exp(0.5 × 96 485 × 0.32 / (8.314 × 303.15)) × 1 = 0.02 × e^6.125 = 9.145 A/m² (L = 0.05 mm puts the Gaussian at 1). r = 20 / (10 × 9.145/5) = 1.093, f_mt = 0.522. p_HER = 0.5 × 0.02 = 0.01. FE_ac = 0.92 × 0.522 − 0.01 = 0.4706, i.e. 47.06 %.
Reproduce · Pinned by libs/shared/electrochemistry/src/predictors/worked-examples.test.ts. Run it from the repository root:
pnpm exec jest -c libs/shared/electrochemistry/jest.config.js worked-examples.test.ts -t "mes.feAcetate"
Acetate productivity Source: Faraday's law with CO₂ → acetate stoichiometry.
Symbol Meaning Unit acetate productivity g/L/day cathode area (default 0.003) m² electrons per acetate: 2 CO₂ + 8 H⁺ + 8 e⁻ → CH₃COOH + 2 H₂O 1 molar mass of acetic acid, 60.05 g/mol chamber volume (default 100 mL) L
Assumptions and constants
- Sporomusa ovata as the canonical acetogen; μ_max ≈ ln(2)/24 h⁻¹ is assumed, informational only, and not verified against Nevin et al. 2010.
- Gas–liquid CO₂ transfer k_L·a = 20 h⁻¹ (range 5–50) — an unsourced engineering default.
- Dissolved CO₂ fixed at 30 mM (sparged, 1 atm, pH ~7).
- Thermodynamic floor −0.28 V vs SHE for CO₂ → acetate; at or above it the predictor returns zeros.
Corrections applied
- Methanogen contamination lowers FE_acetate (CH₄ branch).
Not modelled
- Chain elongation (acetate → butyrate → caproate via reverse β-oxidation); needs a follow-on predictor per Jourdin 2018.
- Bicarbonate buffer speciation (HCO₃⁻ / CO₃²⁻) at the cathode surface — pH-dependent CO₂ availability is approximated.
Literature anchors in the source
- Nevin et al. 2010, mBio 1:e00103-10 · doi:10.1128/mbio.00103-10
- Marshall et al. 2013, Environ. Sci. Technol. 47:6023
- Jourdin et al. 2018, Front. Energy Res. 6:7
Implementation
libs/shared/electrochemistry/src/predictors/mes.ts
Interval the predictor ships
heuristic_fixed_fraction — A fixed ±25 % placeholder band. It is NOT a calibrated interval; when served through /api/ml/predict it is replaced by the benchmark band below, or withheld. How served intervals are built
Calibration artifacts used when served
- Benchmark out-of-fold residual quantiles: bes-benchmark-v1 · gkf5 · generated 2026-09-09
- Split-conformal calibration: split-conformal · generated 2026-05-21
- Hierarchical-priors v2 trust snapshot: populated · generated 2026-05-16
Benchmark cells for this predictor’s systems
Each row is a stratum with n ≥ 30 residuals at nominal level 90%. Coverage is the cross-validated share of held-out points inside the band.
| target | stratum | n | papers | coverageCV |
|---|---|---|---|---|
| coulombic_efficiency | MES | 47 | 17 | 83.0% |
| coulombic_efficiency | MES|electrosynthesis | 36 | 10 | 75.0% |
| current_density_areal | MES | 34 | 17 | 82.4% |
Prior trust by served parameter
The state the lab badge shows for each served parameter and system, from the v2 priors fit.
| parameter | system | state | papers | prior |
|---|---|---|---|---|
| current_density_areal | MES | curated | 18 | weakly_informative |
| coulombic_efficiency | MES | modeled | 16 | literature |
| cod_removal | MES | curated | 11 | weakly_informative |
Scientific-rigor gates
pnpm verify:science runs these rules over the committed priors and validation artifacts in pre-commit. Known violations are baselined per rule and slug; a new one blocks the commit. Baseline from hierarchical-priors-v2.json@2026-10-26T00:10:47.721880+00:00.
| rule | baselined |
|---|---|
| gate-honestyNo parameter may pass a rounded-threshold gate read while converged=false | 1 |
| support-containmentBounded quantities must have ci95 inside physical support, width <= range | 3 |
| magnitude-sanityNo ci95 bound may exceed the plausibility ceiling (1.0e+6) | 0 |
| slug-uniquenessNo two slugs may share a spelling-independent identity; scale must agree | 2 |
| secondary-source-purityNo fitted prior may carry a REVIEW (secondary-source) stratum | 0 |
| artifact-pairingEach fit must have its own coverage evidence; the served fit must have some | 0 |
| coverage-sharpnessAny coverage figure must ship its interval width alongside | 0 |
| interval-calibrationHeld-out interval coverage per parameter may not newly degrade | 128 |
| effects-gap-completenesseffects.json is schema 2.0; every non-high effect has a gap per archetype; no gap is "high" | 0 |