Background · Chapter 3October 13, 20267 min read

Same input, different answer

Small, often silent changes moved results on identical inputs. Each case says what changed, by how much, how anyone noticed, and what it asks of a tool that answers questions about brain data.

In short · case study

Every case has the same shape. A result depended on something that was not in the question: a default, a reference release, an identifier or the platform. The change was rarely announced, and in the clearest case the setting that explained it was already recorded in a field nobody read. A tool has to surface those inputs next to the answer.

Atlas voxels relabelled, 2016 → 2017
27.8%
11.4% to an unrelated structure
Identical segmentations, two Linux versions
12.7%
of 2,250; same binaries, same scans
Enriched terms missed with old annotations
74%
2010 vs 2016 releases
Default changes found with no release note
3
MapMyCells, AllenSDK, Seurat

Each case below has the same shape. Someone ran the same analysis on the same input and got a different result. The cause was something the input did not contain: a default parameter, a reference release, a gene identifier or the operating system. In most cases nothing in the release notes said the change was coming.

Each case comes with its primary source. The two numbers marked as computed come from analyses of files Allen publishes, run for this project.

Fig. 1The cases in this chapter over time. Hover a mark for what changed.

Six cases

Allen's cell-type mapper changed a default, and the same file got different confidence scores

In December 2024, one commit changed MapMyCells' default bootstrap_factor from 0.9 to 0.5. It shipped in cell_type_mapper v1.4.0, whose release notes list four new features and do not mention the change (commit).

In March 2025 a user resubmitted the same file to the hosted service and got a very different distribution of confidence scores. They posted on the Allen forum under the title "Has MMC changed? Completely different results on identical datasets" (thread).

The maintainer replied within minutes:

  • The old default "is so large that even cells with a poor quality mapping received bootstrapping_probability ~ 1.0".
  • Under the new one, a score of 0.6 means about 60% correct.
  • The share of cells assigned to the correct type had "almost no" change.

So the labels held, but anything filtered by confidence did not. The settings had been recorded all along, under a config key in the output file. Nobody had read them.

Asks of the design: pin algorithm parameters, and show them next to the answer instead of filing them in metadata (R-2, R-3).

Allen's SDK switched its default atlas, and over a quarter of the brain was relabelled

In October 2017 a commit to AllenSDK changed CCF_VERSION_DEFAULT from ccf_2016 to ccf_2017. The changelog for that release, 0.14.3, does not mention it (commit). Any code that relied on the default got different labels after upgrading.

An analysis run for this project on Allen's published 100 µm annotation volumes finds that 27.8% of voxels carry a different label in 2017 than in 2016. About half of those are refinements into finer structures. But 11.4% of all voxels moved to an unrelated structure: the subiculum became CA1, and the corpus callosum became optic radiation. Between 2015 and 2016, 10.3% changed. Almost all of that was redrawn motor-cortex borders.

A further 10 µm release from 2022 exists on Allen's download server. It is not on the documentation page, and AllenSDK has no key for it. In that release, 105 of 1,327 structures differ and one nucleus goes from 9,484 voxels to none (forum).

Asks of the design: never inherit an SDK default. Pin the annotation and resolution, and say both in every answer (R-4).

Spreadsheets turned genes into dates, the genes were renamed, and the atlas still uses the old names

Excel's default settings turn SEPT2 into "2-Sep" and MARCH1 into "1-Mar". A 2016 survey found the resulting errors in 19.6% of papers with Excel gene lists in the journals it covered (Ziemann et al.). A 2021 follow-up of papers from 2014 to 2020 found them in 30.9%, with no improvement over the period (Abeysooriya et al.). In 2020 the gene nomenclature committee renamed every symbol that converted to a date: SEPT1 became SEPTIN1, and MARCH1 became MARCHF1 (Bruford et al.).

The fix for one kind of drift created another. Checked against Ensembl release 116 for this project, the Allen Brain Cell Atlas gene table (release 20231215) still uses Sept4 and March1. In total:

  • 2,400 of its 32,285 symbols differ from the current names.
  • 609 of its ids no longer exist in Ensembl.
  • 15 old symbols now belong to a different gene in the same table. Ugt3a1 and Ugt3a2 have swapped.

A join on symbols misses genes and, worse, can quietly join the wrong one.

Asks of the design: key genes on stable id plus annotation release, and resolve old symbols with the rename shown (R-5).

The same brain scans gave different segmentations on two Linux versions

Glatard and colleagues ran the same binaries on the same data under two Linux distributions. Only the system libraries differed. For FSL FIRST, "only 12.7% of the classifications are identical", and agreement fell to a Dice coefficient of 0.59 for small structures such as the amygdala. Resting state ICA differed in a third of subjects. They traced the first divergence to a one-bit difference in the C library's expf(), amplified by a long pipeline (Glatard et al. 2015).

An earlier study found that FreeSurfer volumes changed by 8.8% on average, and up to 64%, between software versions. Repeated runs on one machine were identical (Gronenschild et al. 2012). Being deterministic on one machine proves nothing across machines.

Asks of the design: record the environment a computed answer ran in. R-13 was added to the requirements because of this case.

A single-cell toolkit changed two defaults, and marker gene sets moved

Between Seurat 4.4.0 and 5.0.0, the defaults of FindMarkers changed: logfc.threshold went from 0.25 to 0.1 and min.pct from 0.1 to 0.01. The 5.0.0 release notes mention neither (v4.4.0, v5.0.0).

A systematic comparison found "sizeable differences in sets of significant marker genes" between the two versions, driven by how log fold change is computed. It found the difference between Seurat and Scanpy comparable to the variability from sequencing fewer than 5% of the reads (Rich et al., Cell Systems 2026).

10x's Cell Ranger 7 started counting intronic reads by default. Its own aggregation step refuses to combine samples run with different settings. That is the right pattern.

Asks of the design: record the effective value of every threshold, and refuse to combine results whose settings disagree (R-2, R-1).

Old pathway annotations missed three-quarters of the findings

Wadi and colleagues tested the same gene lists against 2010-era and 2016 pathway annotations. With the old annotations, "74% of enriched 2016 terms were missed on average". Mostly that was because existing pathways had been updated. In 2015, 67% of about 3,900 surveyed papers cited tools with outdated annotations (Wadi et al. 2016).

Asks of the design: treat the reference release as an input, exactly like the data, and carry it with every answer (R-1, R-5).

The two computed numbers

Fig. 2Top: share of atlas voxels that changed label between releases, at 100 µm. Bottom: the atlas gene table against Ensembl 116. Both were computed for this project from files Allen publishes.

The pattern, and its counter-example

CaseWhat changedAnnounced?What the design does
MapMyCellsa default parameterno; recorded in output metadatapin and show parameters
AllenSDKthe default atlas releasenopin annotation and resolution
Atlas gene tablegene names, upstreamn/a; the table follows an older annotationstable ids plus release, with history
Linux / glibcthe platformn/arecord the environment
Seurat 5two thresholdsnorecord effective values; refuse to mix
Pathway toolsthe annotation releasen/athe release travels with the answer

Defaults can be changed well. scikit-learn announced its change to n_estimators, from 10 to 100, two releases ahead. It raised a warning whenever code relied on the old default (changelog). A library cannot make upstream projects do that. It can refuse to inherit a default silently and say in every answer what it used.

Fig. 3All the drift cases, with the requirement each one motivates. Click a row for the source.