Methods

Method

MES — Sporomusa-style acetate biocathode

mes-sporomusa-biocathode-v1 · cathodic_reduction · MES

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.

  1. Biofilm-enhanced cathode current
    jkin=j0 exp⁡ ⁣(αcFηRT)exp⁡ ⁣[−(L−0.050.08)2],η=max⁡(0, −0.28−EWE)j_{kin} = j_0\,\exp\!\left(\frac{\alpha_c F \eta}{RT}\right) \exp\!\left[-\left(\frac{L - 0.05}{0.08}\right)^{2}\right], \qquad \eta = \max\left(0,\ -0.28 - E_{WE}\right)

    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.

    SymbolMeaningUnit
    jkinj_{kin}kinetic cathodic current density (magnitude)A/m²
    j0j_0strain exchange current density (S. ovata 0.02)A/m²
    αc\alpha_ccathodic transfer coefficient, 0.51
    η\etadriving force below the CO₂ → acetate floorV
    EWEE_{WE}poised cathode potential vs SHE (default −0.6)V
    LLbiofilm thickness, floor 0.005mm
    F,R,TF, R, TFaraday constant 96 485, gas constant 8.314, temperatureC/mol, J/(mol·K), K
  2. CO₂ availability
    j=jkin CKs+C fmt,fmt=r1+r,r=kLa10 max⁡(1, jkin/5)j = j_{kin}\,\frac{C}{K_s + C}\, f_{mt}, \qquad f_{mt} = \frac{r}{1+r}, \quad r = \frac{k_La}{10\,\max\left(1,\ j_{kin}/5\right)}

    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.

    SymbolMeaningUnit
    CCdissolved CO₂ under sparging, fixed at 30mM
    KsK_sstrain half-saturation constant for CO₂ (S. ovata 1.5)mM
    fmtf_{mt}gas-liquid mass-transfer factor1
    kLak_LaCO₂ volumetric mass-transfer coefficient (default 20)h⁻¹
  3. Faradaic split
    FEac=max⁡(0, FEmaxfmt−pHER),pHER=min⁡(0.2, 0.5max⁡(0, η−0.3))FE_{ac} = \max\left(0,\ FE_{max} f_{mt} - p_{HER}\right), \qquad p_{HER} = \min\left(0.2,\ 0.5\max(0,\ \eta - 0.3)\right)

    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

    SymbolMeaningUnit
    FEacFE_{ac}Faradaic efficiency to acetate1
    FEmaxFE_{max}strain acetate ceiling (S. ovata 0.92)1
    pHERp_{HER}hydrogen-evolution penalty for an over-negative cathode1
    η\etadriving force below −0.28 V vs SHEV

    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.

    inputvalueunit
    temperatureC30°C
    ph7pH
    electrodeSpacingCm2cm
    hrtHours24h
    codMgL1,000mg/L
    workingElectrodePotentialVsSheV-0.6V 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"
  4. Acetate productivity
    rac=j A FEac8F⋅86 400⋅MacVr_{ac} = \frac{j\,A\,FE_{ac}}{8F} \cdot 86\,400 \cdot \frac{M_{ac}}{V}

    Source: Faraday's law with CO₂ → acetate stoichiometry.

    SymbolMeaningUnit
    racr_{ac}acetate productivityg/L/day
    AAcathode area (default 0.003)m²
    88electrons per acetate: 2 CO₂ + 8 H⁺ + 8 e⁻ → CH₃COOH + 2 H₂O1
    MacM_{ac}molar mass of acetic acid, 60.05g/mol
    VVchamber 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.

targetstratumnpaperscoverageCV
coulombic_efficiencyMES471783.0%
coulombic_efficiencyMES|electrosynthesis361075.0%
current_density_arealMES341782.4%

Prior trust by served parameter

The state the lab badge shows for each served parameter and system, from the v2 priors fit.

parametersystemstatepapersprior
current_density_arealMEScurated18weakly_informative
coulombic_efficiencyMESmodeled16literature
cod_removalMEScurated11weakly_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.

rulebaselined
gate-honestyNo parameter may pass a rounded-threshold gate read while converged=false1
support-containmentBounded quantities must have ci95 inside physical support, width <= range3
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 agree2
secondary-source-purityNo fitted prior may carry a REVIEW (secondary-source) stratum0
artifact-pairingEach fit must have its own coverage evidence; the served fit must have some0
coverage-sharpnessAny coverage figure must ship its interval width alongside0
interval-calibrationHeld-out interval coverage per parameter may not newly degrade128
effects-gap-completenesseffects.json is schema 2.0; every non-high effect has a gap per archetype; no gap is "high"0