MESSAI collab · units and normalisation · ledger opened 19 Oct 2026
Which unit each quantity is stored and served in, and why
MESSAI converts every extracted value to one canonical unit per physical quantity before it can feed a model, and it now serves each quantity in one unit everywhere. Some of these choices were made by the maintainer, some only restate what every part of the platform already did, and some are still open. None has been checked by a scientist outside MESSAI. This ledger lists each one with its evidence so that you can tell us where we are wrong.
What we ask
Read each decision, check it against the evidence and your own practice, and tell us whether it holds.
- Sign in and comment below, starting your comment with the decision id (for example
D4). A comment is enough; there is no form. - Say “verified” or “contested”, and why. For a contested decision, name what you would do instead and, where you can, a paper or standard that does it.
- We record your verdict in the ledger with your name and the date. A contested decision is re-opened, and nothing it changed is promoted to production until it is settled.
The ledger
“Stored” is the unit a value has in the database after normalisation; “served” is the unit every page, API response and export shows it in. A dash means the decision is not about a single unit.
| Id | Quantity | Stored | Served | State | Your verdict |
|---|---|---|---|---|---|
| D1 | Power density, areal | W/m² | mW/m² | Decided | Awaiting review |
| D2 | Power density, volumetric | W/m³ | W/m³ | Agreed by all consumers | Awaiting review |
| D3 | Current density | A/m², A/m³ | A/m², A/m³ | Decided | Awaiting review |
| D4 | Efficiencies and removals | fraction | % | Decided | Awaiting review |
| D5 | Temperature, time, volume, concentration, flow | C, h, L, mg/L, L/h | C, h, L, mg/L, L/h | Agreed by all consumers | Awaiting review |
| D6 | Biofilm thickness | m | open | Open | Awaiting review |
| D7 | Reference-electrode offsets | — | — | Open | Awaiting review |
| D8 | Physical constants | — | — | Decided | Awaiting review |
| D9 | Resistance | ohm | ohm | Fixed | Awaiting review |
| D10 | Legacy normalisation | — | — | Prepared, not applied | Awaiting review |
| D11 | Unit spellings | — | — | Open | Awaiting review |
| C1 | Parameter catalogue ranges | — | — | Open | Awaiting review |
Decision by decision
What was decided, the evidence for it, and the question we need you to answer.
D1 · Areal power density is served in mW/m²
Decided by the maintainer, Oct 19, 2026 · Awaiting reviewDecidedStored in W/m², served in mW/m² on every page and API. The parameter sweep, which served mW/cm², now serves mW/m² and names its units in each response. mW/m² is what most MES papers report and what the predictors already returned. 3,488 stored values from 443 papers, median 0.11 W/m² (staging, 19 Oct 2026). Volumetric power (W/m³) is a different quantity and is never pooled with it.
Our question: Is mW/m² the unit you would read areal power in for MFCs, MECs and MES alike, or should some systems be served in W/m²?
D2 · Volumetric power density stays W/m³
Already served this way everywhere, Oct 19, 2026 · Awaiting reviewAgreed by all consumersStored and served in W/m³, kept apart from areal power by unit, and held out of the areal models. 764 stored values from 130 papers (staging, 19 Oct 2026). Every part of the platform already used W/m³.
Our question: Is reactor liquid volume the basis you expect for W/m³, or do you report against total or anode-chamber volume?
D3 · Areal current density is served in A/m²
Decided by the maintainer, Oct 19, 2026 · Awaiting reviewDecidedStored and served in A/m² (volumetric: A/m³). The parameter sweep, which served mA/cm², now serves A/m². 2,225 stored values from 356 papers, median 0.46 A/m² (staging, 19 Oct 2026). The predictors and the benchmark export already used A/m².
Our question: Is A/m² your reading unit for current density, or is mA/cm² still more natural for electrode work?
D4 · A value with no unit above 1.5 is read as a percentage
Decided by the maintainer, Oct 19, 2026 · Awaiting reviewDecidedEfficiencies and removal ratios are stored as a fraction from 0 to 1 and served in %. A value with no unit, or tagged “fraction”, “dimensionless” or “ratio”, is read as a percentage when it is above 1.5 and as a fraction at or below it. Every tool now uses this one rule; before, six used their own. On staging (19 Oct 2026) 90 stored efficiency values have no unit: 40 at or below 1, 50 between 2 and 100, none between 1 and 2.
Our question: Is 1.5 the right threshold? A coulombic efficiency of 1.2 % is rare but possible in some MES; would you rather a value between 1 and 1.5 with no unit were refused than read as a fraction above 1?
D5 · The other quantities are served in the unit they are stored in
Already served this way everywhere, Oct 19, 2026 · Awaiting reviewAgreed by all consumersTemperature in °C, time in h, volume in L, concentration in mg/L and flow in L/h, as stored. Kelvin is the one offset; molar concentrations are not converted, because that needs a molar mass the row does not have. Every consumer already used these units.
Our question: Should any of these be served differently, for example hydraulic retention time in days or substrate concentration as g COD/L?
D6 · Biofilm thickness: µm on screen, still undecided
Not decided · Awaiting reviewOpenStored in m like every length. The lab keeps its own state in mm; we propose µm on screen. Two bugs are fixed: the loss waterfall now passes the thickness to the anode model in µm, not mm. Biofilms are typically 10 to 200 µm. Some panels still label the mm value as µm.
Our question: Is µm the unit you would expect for biofilm thickness everywhere, including in the reactor designer?
D7 · One table of reference-electrode offsets, values from you
Not decided · Awaiting reviewOpenNot decided. Electrode potentials not stated on the SHE scale are held out of the models and not converted until there is one agreed table of offsets. Five tables disagree: Hg/HgO in 1 M KOH is 0.098 V in three of them and 0.110 V in one; the RHE slope is 0.0591 or 0.05916 V per pH unit; Ag/AgCl with an unstated filling solution is read as saturated in one and as a 0.216 ± 0.019 V midpoint in another. Potentials such as the redox potential with a “V vs Ag/AgCl” unit are stored without an offset and still feed the models.
Our question: Which offsets should the table hold (Hg/HgO 1 M KOH: 0.098 or 0.110 V; Ag/AgCl 3 M KCl: 0.210 or 0.222 V), should they be adjusted for temperature, and may an Ag/AgCl potential with no stated filling solution be used at all?
D8 · One set of constants; the molar gas volume names its condition
Decided by the maintainer, Oct 19, 2026 · Awaiting reviewDecidedThe Faraday and gas constants are the exact CODATA values everywhere. The molar gas volume is kept at both 0 °C and 25 °C (1 atm), and every use says which. The two volumes differ by 9 %. The MEC predictor and the hunter use 0 °C (STP); the cross-row physics check uses 25 °C as the more permissive bound. So the same Faraday law for hydrogen is checked against two different limits.
Our question: At what condition do MEC papers report hydrogen volumes, and should the Faraday-law hydrogen check use 0 °C, 25 °C, or the condition each paper states?
D9 · MΩ is read as megaohm
Decided by the maintainer, Oct 19, 2026 · Awaiting reviewFixedFixed. The unit clean-up lower-cased every unit, so “MΩ” became milliohm, a factor of 10⁹ off. MΩ and MW are now spelled out as megaohm and megawatt first; megawatt has no factor, so such a value is held out. On staging one modelled value was affected (6.97 MΩ, stored as 0.00697 Ω); the fix was applied there on 19 Oct 2026 and the value now reads 6,970,000 Ω. Four megawatt values from a review are held out.
Our question: Have you seen “MΩ” used to mean milliohm in an MES paper? If so, we need a rule beyond the letter case.
D10 · Values left by the first canonicaliser are archived
Decided by the maintainer, Oct 19, 2026 · Awaiting reviewPrepared, not appliedPrepared, not applied. The first canonicaliser (retired in March 2026) left units the normaliser never writes, such as raw unit strings and words. Its values are moved to legacy fields, not deleted. 16,155 stored values on staging (19 Oct 2026), with 1,426 distinct unit strings; none feeds a model. 1,243 others carry a normaliser unit but no parameter name, and 214 of those are marked usable for modelling.
Our question: For information. Tell us if you rely on any value from before March 2026 that carries no parameter name.
D11 · Units written without a space are not yet converted
Not decided · Awaiting reviewOpenOpen. “mWm−2”, “Wm−3” and “mAm-2” are not converted, because the clean-up only rewrites the spaced form (“mW m−2”). 115 stored values on staging have no converted value for this reason alone (19 Oct 2026).
Our question: Can these be read exactly like the spaced form, or have you seen a spelling where that would change the meaning?
C1 · The catalogue’s power-density ranges need a scientist
Not decided · Awaiting reviewOpenOpen. The catalogue entries for power density label their unit mW/cm², but one writes its ranges in W/m³ and another gives a typical range of 1 to 20 mW/cm² (10 to 200 W/m²), above what MES reactors reach. Relabelling the unit would leave the numbers wrong. The open-source package’s observation file stamps the definition’s unit on every value, so values on the mW/m² scale (median 185) appear as mW/cm².
Our question: What are typical and plausible ranges for areal and volumetric power density in MES, and from which reviews should we take them?
Where to check
The files each decision rests on, in the MESSAI repository. The full engineering record, with every part of the platform a decision touches, is docs/harmonization/unit-decision-table-2026-10.md.
| Id | Files |
|---|---|
| D1 | scripts/quality/normalize-to-si.py · apps/api/src/app/api/sweep/run/route.ts · docs/harmonization/unit-decision-table-2026-10.md |
| D2 | scripts/quality/normalize-to-si.py · scripts/derived/lib/benchmark-basis.ts |
| D3 | scripts/quality/normalize-to-si.py · apps/api/src/app/api/sweep/run/route.ts |
| D4 | scripts/quality/normalize-to-si.py · scripts/hunter/build_hunter_jsons.py · services/ml-engine/gp_scm/unit_normalizer.py |
| D5 | scripts/quality/normalize-to-si.py |
| D6 | apps/lab/src/app/lab/demo-state.ts · apps/lab/src/app/lab/components/mechanistic-inputs.ts · apps/lab/src/app/lab/components/redesign/parameter-content.ts |
| D7 | libs/shared/electrochemistry/src/reference-electrode.ts · services/ml-engine/physics/constraints.py · services/ml-engine/canonicalize/figure_units.py · docs/collab/2026-10-12-auditable-workspaces-plan.md |
| D8 | scripts/quality/normalize-to-si.py · libs/shared/electrochemistry/src/predictors/mec.ts · scripts/lib/cross-row-physics.ts · scripts/hunter/build_hunter_jsons.py |
| D9 | scripts/quality/normalize-to-si.py · scripts/quality/fixtures/unit-cleanup-examples.json · docs/harmonization/2026-10-19-unit-table-fixes.md |
| D10 | scripts/quality/archive-legacy-canonical-si.py · archive/2026-10-canonicalize-v1/ARCHIVE_NOTE.md |
| D11 | scripts/quality/normalize-to-si.py |
| C1 | open-source/mess-parameters/data/parameter-definitions-rich.json · apps/web/public/data/parameters/power_density.json |