Methods

Method

MBES — Michaelis-Menten sensor with first-order drift

mbes-mm-drift-v1 · sensor · MBES

What it predicts

Limit of detection, linear range, t₉₀ response time and weekly drift for a whole-cell or enzyme sensor.

Governing relations

Each relation is transcribed from the implementation. Where the code cites no source, the source line says so.

  1. Hill signal with competitive inhibition
    i=imax ShKapph+Sh,Kapp=KM(1+IKi)i = \frac{i_{max}\, S^{h}}{K_{app}^{h} + S^{h}}, \qquad K_{app} = K_M\left(1 + \frac{I}{K_i}\right)

    Source: Unsourced engineering default in mbes.ts (2026-10 citation audit).

    The per-analyte constants are unsourced; the table they were attributed to does not exist.

    SymbolMeaningUnit
    iisteady-state signal current densityA/m²
    imaxi_{max}saturating signal (BOD 0.8)A/m²
    SSanalyte concentration (default 50)mg/L
    hhHill coefficient (BOD 1.2)1
    KMK_Mhalf-saturation constant (BOD 100)mg/L
    I,KiI, K_iinterferent concentration and its inhibition constantmg/L
  2. Limit of detection
    LOD=Kapp(3σblankimax−3σblank)1/h\mathrm{LOD} = K_{app}\left(\frac{3\sigma_{blank}}{i_{max} - 3\sigma_{blank}}\right)^{1/h}

    Source: The 3σ-of-blank detection rule, inverted through the Hill curve; constants unsourced (mbes.ts).

    SymbolMeaningUnit
    LOD\mathrm{LOD}concentration whose signal equals three blank standard deviationsmg/L
    σblank\sigma_{blank}blank-current noise (BOD 8×10⁻⁴)A/m²

    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
    temperatureC25°C
    ph7pH
    electrodeSpacingCm2cm
    hrtHours24h
    codMgL1,000mg/L

    Output · mbes.limitOfDetectionMgPerL = 0.792 mg/L, within ±0.1 %

    By hand · Default analyte BOD, no interferent: K_app = 100 mg/L, h = 1.2, i_max = 0.8 A/m², 3σ = 0.0024 A/m². LOD = 100 × (0.0024 / 0.7976)^(1/1.2) = 100 × 0.003 009^0.8333 = 0.7919 mg/L.

    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 "mbes.limitOfDetectionMgPerL"
  3. Linear range
    S∈[LOD, c Kapp],c=3 (h=1), 1.5 (h>1)S \in \left[\mathrm{LOD},\ c\,K_{app}\right], \qquad c = 3\ (h = 1),\ 1.5\ (h > 1)

    Source: Unsourced engineering default in mbes.ts (2026-10 citation audit).

    A rule of thumb, not a fitted linearity criterion.

    SymbolMeaningUnit
    ccupper-end multiple of K_app1
  4. Response time
    t90=2.303 L2Defft_{90} = 2.303\,\frac{L^{2}}{D_{eff}}

    Source: Diffusion time scale; mbes.ts cites no source for it.

    SymbolMeaningUnit
    t90t_{90}time to 90 % of the steady-state signals
    LLbiofilm thickness (default 0.05 mm)m
    DeffD_{eff}effective analyte diffusivity in the biofilm (BOD 5×10⁻¹⁰)m²/s
    2.3032.303−ln(0.1) = 2.302 6, truncated to four figures in the code1
  5. First-order drift
    S(t)=S0 e−kdrift tS(t) = S_0\, e^{-k_{drift}\, t}

    Source: Unsourced engineering default in mbes.ts (2026-10 citation audit).

    SymbolMeaningUnit
    kdriftk_{drift}first-order fade rate (BOD 0.10)week⁻¹
    ttsensor ageweek

Assumptions and constants

  • Anode current from the shared Butler-Volmer biofilm kinetics in predict.ts (Geobacter on acetate), with the same Arrhenius, substrate, pH and ohmic corrections as the MFC predictor.
  • Linear range from LOD to ≈ 3 · K_M (1.5 · K_M for a cooperative Hill response).
  • Effective analyte diffusivity through the biofilm D_eff ≈ 10⁻⁹–10⁻¹⁰ m²/s.
  • Drift follows first-order decay of the biofilm / enzyme signal.

Corrections applied

  • Interferents raise apparent K_M (poorer LOD, narrower range).

Not modelled

  • Sensor recalibration / two-point standardisation.
  • Diffusional broadening in flow injection — steady state assumed.
  • Temperature / pH compensation — fixed K_M / V_max for the stated analyte.

Literature anchors in the source

  • Modin & Wilén 2012, Water Res 46:6113
  • Karube et al. 1977, Biotechnol Bioeng 19:1535

Implementation

libs/shared/electrochemistry/src/predictors/mbes.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
No data (n = 0)

No benchmark cell reaches the minimum n for these systems — intervals are withheld.

Prior trust by served parameter

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

parametersystemstatepapersprior
No data (n = 0)

No v2 prior row for these systems.

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