What the GEM Autocurator computes at each stage, the reference data behind it and at which release, and what each result cannot support.
Everything runs in your browser. The model file is read by JavaScript in this tab, curated in memory, and written back out by the same tab. It is never uploaded, and there is no server that could store it. The one exception is described under network.
Each stage produces proposals, not edits. A proposal only reaches the exported model if you approve it. Approving a finding does one of three things, and the report says which for every finding:
Every metabolite and reaction is looked up in a structure-clustered reference built from MetaNetX MNXref, which groups compounds across BiGG, KEGG, ModelSEED, ChEBI, MetaCyc, Rhea and HMDB by InChIKey. A cluster that contains a BiGG identifier lends that identifier to the whole cluster. A cluster with no BiGG identifier is given one stable BiGG-style identifier, minted once and frozen, so the same compound gets the same identifier in every model that passes through this page.
Every proposal carries one evidence tier, strongest first:
How a cross-reference match is decided. Every cross-reference an entity carries is looked up. A full InChIKey settles the match, being the structure itself. A candidate whose heavy atoms contradict the model's own formula is excluded, and the entity's own name in the model has to corroborate the identifier it would be renamed to. Where the candidates still disagree the rename is withheld, and the row lists each candidate with the reference that supports it. A match that changes the recorded formula or charge is stated on the row and decided as its own class.
Each identifier is carried by at most one entity. Where a proposed identifier is already in use, the rename is withheld and reported, and both entities are kept.
Two identifiers for the same compound in the same compartment are proposed for merging. A compartment suffix is not a discrepancy: cytosolic and extracellular glucose are two entities and stay two entities. Two reactions are proposed for merging only when their stoichiometry matches. Two reactions with similar names but different chemistry are a conflict, listed for review and not merged.
Dead-end metabolites (produced but never consumed, or the reverse), reactions with no gene association, and reactions that cannot carry flux even with every exchange reaction opened. That last test is a flux-variability sweep over the internal reactions with every exchange open, so a reaction it returns is blocked by the network itself and not by the medium loaded.
Element and charge balance are judged at the model's own reference charge states, and are independent of pH. A reaction that balances at its reference charges is not a defect at any pH; the fractional net charge you would get by titrating it is proton buffering, not an error.
The pH control is an explorer: it recomputes metabolite charge states at the chosen pH from Henderson-Hasselbalch over ModelSEED pKa sites. It raises no findings.
Reaction directionality is compared against a directionality call assembled from more than one source, each database casting one vote on the reversible/irreversible class. A bound is only proposed when the model's own equation could be matched to the reference orientation and a signed ΔrG is available for the reaction as the model writes it; a reaction that crosses a membrane never qualifies, because the available free energies are computed without compartments. Everything else is review-only. Cycles that generate ATP or another energy carrier from nothing are detected by closing every uptake and asking the solver whether an energy carrier can still be made. A forced-open internal reaction, such as a maintenance reaction with a non-zero lower bound, makes that problem infeasible, so those bounds are relaxed for the duration of the test and the ones relaxed are named on the panel.
Your organism is resolved from the model name or an accession, looked up in GrowthDB, and simulated on the medium that experiment used, pulled from MediaDB. Measured and predicted growth rates are shown side by side. An exchange rate taken from an experiment is labelled measured; every other rate, including one derived from a medium recipe, is labelled a preset with no experimental backing. Each record states whether it is for the exact strain named in the model or for another strain of the same species.
Release and coverage of every reference in this build.
h_e and h_c are the same species and cancel. For a transporter or a chemiosmotic reaction the value that comes back therefore prices the same chemistry with the transport step deleted, and carries no proton-motive force or membrane-potential term: quoted for ATP synthase it reads as bare ATP synthesis, and says the physiological direction is uphill. Those values are withheld rather than shown, and no bound is proposed from one, so every transmembrane reaction on the Thermodynamics stage is review-only. A reaction is judged transmembrane on its BiGG equation where there is one (7,939 reactions) and on BiGG's transport-identifier grammar where the equation source has no entry for it (70 more). 2,368 of the 27,172 reactions in the reference are in neither position: their compartment span is not established, and they keep their ΔrG′. Your own model is checked separately and on its own compartments, so a reaction you write across a membrane is treated as transmembrane whatever the reference says.-v7.3 are not read. Those are HDF5 containers; re-save with -v7, or export to JSON. Level 5 .mat files, which COBRApy, scipy and the COBRA Toolbox write by default, are read. A file that is not a metabolic model is refused with a message naming what was missing..mat cannot carry every namespace. Every namespace on every metabolite, reaction and gene (BiGG, KEGG, ChEBI, MetaNetX, ModelSEED, BioCyc, HMDB, SABIO-RK, Reactome, LipidMaps, InChIKey, UniProt, SBO and anything else the file declares) is written into the JSON and the SBML, and a JSON model's annotation keys come back spelled as the file wrote them. The COBRA MATLAB convention names one column per namespace, so a namespace it does not name cannot be read back from a .mat. InChIKey is the case worth naming: the convention defines no column for it, this page writes metInChIKey, and COBRApy reads none of them.Your model does not. It is read from disk by this tab, held in memory, and written back to disk by this tab.
The single outbound request the application makes, beyond downloading its own code and reference files from this site, is organism resolution: if you paste a genome accession or a taxonomy identifier into the lab-validation search, that identifier string alone is sent to the NCBI Datasets API to look up the organism name. Nothing from your model is included in that request. A failed lookup is reported on the stage and falls back to the search box. If you never use accession lookup, no request is ever made.
The page loads no fonts, analytics, trackers or third-party scripts of any kind.
The code is MIT licensed. The page bundles GLPK, a GPL-3.0 linear programming solver compiled to WebAssembly, which is what solves every flux problem here. The reference data is derived from MetaNetX MNXref and the ModelSEED Biochemistry database, and is redistributed under their terms. The full statement, with the version, checksum and licence of every redistributed file, is in THIRD_PARTY.md, and the licence itself is in LICENSE. GLPK's own GPL-3.0 text is served beside the binary, at vendor/GLPK-LICENSE.
The page is set in IBM Plex Sans and IBM Plex Mono, copyright 2017 IBM Corp. with the reserved font name "Plex", under the SIL Open Font License 1.1. The latin subsets are served from this site at assets/fonts/ with the licence text beside them, at assets/fonts/OFL.txt. No font is fetched from a third-party origin.
If you use a curated model from this page in published work, cite the underlying resources as well: MetaNetX for the identifier reference, ModelSEED for the thermodynamic and pKa data, and BiGG for the identifier namespace. CITATION.cff has the machine-readable form.
The identifier reference is shared, so an incorrect cluster affects every model resolved against it. Report one as an issue on the repository, with the identifier and what you expected. Rejecting the proposal keeps it out of your own model.