
In a nutshell: A large pharma team came to us with a single-cell metadata curation pipeline that already existed, already ran, and had made their problem worse. The answers were already sitting in public human data. Thousands of single-cell studies are deposited in GEO, with more arriving every week. But every lab labels cell types, disease stage and donor metadata differently, so nothing compares across studies. Standardising one dataset takes a curator about a week. That is why teams reason over ten studies instead of two hundred.
We built an agentic AI pipeline that does it in about three hours, for roughly eleven dollars a dataset. Several agents read each study independently. One records only what is written, one reads the surrounding context, one challenges both. A reviewer scores every field for confidence and shows its evidence. Anything uncertain goes to your curator with the reasoning attached. Everything else is ready to use.
At a top-20 pharma, it exceeded 90% accuracy against their own ground truth and mapped 95% of cell types to their internal vocabulary.
You have a set of public single-cell datasets and one research question that needs all of them at once: Which cell populations shift in a diseased tissue, and does that shift hold across more than one cohort?
It is a reasonable question. Thousands of relevant studies sit in GEO already and the work stalls anyway, because public data is not comparable as deposited. One study records the “tissue” as “liver”, while another records “liver biopsy, segment IV”. A third leaves the field blank and states the tissue only in its methods section. One labels controls “healthy” whereas another labels them “non-tumor adjacent”.
None of those records are wrong. They simply cannot be placed side by side, and until they can, the atlas does not exist and neither does the analysis waiting behind it.
So you go looking for a partner. This is what we would want you to check, written from a rebuild we ran for a large pharma team after someone else's engagement had already failed.
It is expert work: Standardization means knowing the biology and the ontologies at once. Anatomy harmonizes to UBERON, disease to MONDO, cell type to the Cell Ontology, cell lines to Cellosaurus, organism to NCBITaxon. Somebody has to know that PBMC is blood, that HepG2 implies a human origin, and that a disease named in a study title has not been established for any sample in it.
It scales linearly: Forty datasets cost 40 times one dataset. Manual curation has no economies of scale, so the ambition of your atlas converts directly into curator months.
It gates trust, not just throughput: A target that came out of datasets nobody can vouch for will not survive internal review. The first question in that room is where the data came from.
The team we worked with had timed their own baseline honestly. About a week and a half per dataset, and the output was still not clean because cell-level curation drifted between curators.
Study this before you sign anything, because the pipeline our client had already bought was not obviously broken. It ran end to end, hosted and technically functional, but failed in three specific ways, and each is worth testing for.
Every dataset needed a hand-written configuration file specifying the accession, the barcode-to-sample mapping, the paper link, and the supplementary file paths.
That is the trap. A curator had to understand a dataset well enough to describe its structure before the pipeline could touch it. The expert time the pipeline was bought to save had simply moved to the front of the process. Setup effort did not fall as volume rose. It multiplied.
Extraction was fuzzy matching against a term list, scoring candidates on character similarity.
Consider a sample labelled adjacent normal tissue in a hepatocellular carcinoma study. Fuzzy matching sees the disease term in the study title and tags the sample as diseased. Or it sees normal and tags it a healthy control. Both are wrong. The sample is histologically normal tissue taken from a diseased liver, and which of the two errors you get depends on nothing more than which string happened to score higher.
Tumour-adjacent normal is not an edge case. It is one of the most common designs in cancer single-cell work, and getting it backwards contaminates both arms of every comparison built on it. The same system could not see a method described in prose, or an abbreviation a paper expands exactly once. It matched characters rather than reading biology.
Over 70 percent of values came back empty. Of the values that were filled, fewer than 40 percent were correct, and nothing marked which.
This is the failure that makes the other two unrecoverable. A confidence score exists so a curator can skip most of the output and concentrate on the rest. When the score carries no information, there is nothing to skip. The curator re-checks every field, which is slower than curating from scratch, because now they are verifying someone else's guesses as well as doing the work.
The client had never onboarded her team onto it. She did not trust it enough to ask them to use it.
The output used the cell barcode as its primary key. One row per cell. For a typical dataset that meant roughly 800,000 rows, with study and sample metadata duplicated down every one of them. Past about 700,000 cells the review interface stopped responding altogether.

Our approach comes from years of doing this and is almost boringly simple. Curate what is unique at each level, then propagate downward.
Cell type is where this matters most. A dataset with 800,000 cells might contain 50 distinct author labels. Fifty is the number of decisions. The other 799,950 rows are those same 50 decisions repeated.
The barcode is an output of curation, not a unit of it. Ask any prospective partner what a curator actually reviews, because no accuracy improvement rescues a queue a human cannot read.
With the structure fixed, the remaining difficulty is that evidence sits somewhere different every time: sometimes in the sample's characteristics fields, sometimes only in the series summary, the publication, or a supplementary table.
And when an attribute is genuinely not stated anywhere, the correct output is empty. Fill that gap with something plausible and you have produced an error nothing downstream can detect.
GSM3178782 is a sample in GSE115469, a public human liver atlas. Its GEO record is short. The title reads Patient 1 Total Liver Homogenate. The single characteristics field reads tissue: Total Liver Homogenate.
That field does not contain a tissue. Total Liver Homogenate is a preparation method, and no UBERON concept exists for it. Read into the free-text extraction protocol and the specimen turns out to be a resected caudate lobe, a real anatomical structure with a standard UBERON term. The correct answer was there all along, one field away from where anyone would look.
The assay chemistry sits in that same protocol block. The genome build sits in the data processing notes. Disease is not stated anywhere in the sample record at all. Three of those four answers were never in a structured field, in one record, from a careful lab running a well-regarded study.
One indexed evidence set, built before curation starts: The paper resolved automatically and converted to structured text, with introduction and references dropped. Supplementary files indexed by content rather than filename. Abbreviations expanded in place, so HCC becomes hepatocellular carcinoma before anything downstream interprets it. Curator input is a dataset identifier and a source with no configuration file.
Three readers under opposed mandates: All three read the identical evidence set, so any disagreement is about interpretation rather than about who opened which file.

That sceptic example is the tumour-adjacent normal case from earlier. A single model pass answers rather than deliberates, so the first plausible disease it meets becomes the answer. The step that asks whether the disease applies to this sample had to live outside the model.
Scoring computed outside the thing being scored: A referee resolves the three outputs into the best-supported value per field, then maps it into the client's internal vocabulary. The model supplies sub-scores and rationales, and deterministic code computes the weighted total and assigns the verdict. Agreement between opposed readers is evidence. Disagreement is a flag. A model rating its own confidence is grading its own work.

Evidence is ranked the way they would rank it: Sample metadata, then sample title, then supplementary tables, then Methods, then abstract, then study title.
Every field lands in one of five states: verified, borderline, unmapped, missing, or not applicable. Unmapped keeps the raw author term rather than rounding it to something wrong.
Review is by exception, with each flag arriving with alternatives and reasoning attached. Scores are conservative on purpose, because a score that flatters the pipeline teaches curators to ignore it. And the weak spots are named: tissue and disease are the least accurate fields, and the failure to watch for is a patient's systemic diagnosis being applied to healthy control tissue.

Success metrics were agreed before work started. The client selected the datasets, mixing easy, medium, and hard cases. Ground truth was curated by hand twice, by independent curators, with disagreements resolved before sign-off. Manual curation was timed as it happened, which is where the one-week baseline comes from. Accuracy measured against a pipeline's own output is not accuracy, so ask how any figure was established before you take it seriously.
For a dataset with 200 samples and 50 distinct cell types, hands-on curation moved from about a week to roughly eight hours, against a pipeline runtime near 30 minutes. Compute cost runs near one dollar for a base run with small per-sample increments, which is compute rather than the cost of an engagement, but it does mean the marginal cost of one more dataset is negligible.
Cell-type accuracy came in at 85 percent against a 90 percent target. We missed it. Cell-type harmonization is the hardest of the three levels, because author labels are free text with no convention behind them and the right Cell Ontology term is often a judgment call rather than a lookup. Low-confidence mappings route to review rather than passing through quietly, so the shortfall shows up as curator time instead of as a wrong value in your atlas.
Fix the unit of curation before fixing the model. Treat curation failure as an evidence-location problem. Record absence as absence. Compute confidence outside the thing being scored. None of it is specific to single-cell data, since scattered evidence, author-specific vocabulary, and unrecorded absence turn up wherever data has to be harmonized before it can be analyzed.
If your team is assembling atlases from public data, or carrying a curation backlog that gates everything downstream, we would be glad to give you a walk through of how this one was built. Connect with us.