Skip to content

Every number should know where it came from ​

A result travels. It leaves an analysis script, lands on a lab-meeting slide, gets copied onto a poster, then into a paper, then into the grant renewal. Every hop is a copy, and copies drift: a digit gets transposed, a slide keeps the number from before the last QC pass, and six months later nobody can say which version is right.

When Nature surveyed 1,500 scientists about reproducibility [1], the conversation was about whole experiments. It starts smaller than that, with a number typed twice.

This post and its deck are two printouts of one project. Every number on both comes from a single file, and every one of them can tell you where it came from.

Click the number ​

We analyzed 12,453 participants after QC. The primary comparison came out at an effect size of 0.34, with p = 8.7e-3.

Click any of those three numbers. A panel slides in with the file the value was read from, the command that produced it, and the date it was last updated. Nothing is executed when the page builds. The panel is a record, kept next to the value, of how the value was made.

Sandve et al. [2] put reproducible computational research as ten rules. The first is to keep track of how every result was produced, and the ninth is to connect textual statements to underlying results. A <DataValue> is the ninth rule as a component: the sentence and the result it reports are the same object, so they can't drift apart.

The effect size is Cohen's d, the difference in group means scaled by the pooled standard deviation:

d=x¯1−x¯2sp,sp=(n1−1)s12+(n2−1)s22n1+n2−2

The math is rendered to SVG when the site builds, so it needs no JavaScript in the browser and it prints cleanly.

Change it once ​

Each number is typed exactly once, in manifest.yaml:

yaml
variables:
  num_samples:
    value: 12453
    format: ","
    description: "Participants after QC filtering"
    source: "data/results.csv"
    command: "python scripts/qc.py data/raw/ --out data/results.csv"
    updated: "2026-09-30"

That one line feeds this post, the deck, the PDF handout and the PowerPoint export. When the second batch of samples cleared QC, the count went from 11,982 to 12,453. That took one edit and one rebuild, with no find-and-replace across slide decks.

Edit once, and every printout follows. The same rendered video plays full-screen in the deck.

Old talks keep their numbers ​

Talks get given more than once. In this project, a new version is a folder, forked from the last one:

bash
presentation-sanity new kickoff/v2 --from kickoff/v1

The new folder records where it came from, and the project's index page shows that lineage. When a number changes between versions, it gets a new key rather than an edit. The March talk keeps reporting 11,982, with its March provenance attached, and nothing it said changes behind its back.

A minimum standard ​

Peng [3] argues that when full independent replication isn't possible, reproducibility can serve as a minimum standard for judging a scientific claim. A talk makes claims too. Making each number traceable to its source is the cheapest part of meeting that standard, and with one source it costs nothing extra to keep.

Start yours ​

  • On GitHub: "Use this template" on presentation-sanity-template, then run python init.py.
  • Without git: presentation-sanity init my-talk in any folder. The template's README has the one-line uvx version, which needs nothing installed.
  • With an agent: the project ships a /presentation-sanity skill for Claude Code, and the same skill in .agents/skills/ for other agents.

The short version of this post is the deck.

References

  1. [1]Baker, M. (2016). 1,500 scientists lift the lid on reproducibility. Nature 533(7604), 452–454. doi:10.1038/533452a
  2. [2]Sandve, G. K., Nekrutenko, A., Taylor, J. & Hovig, E. (2013). Ten Simple Rules for Reproducible Computational Research. PLoS Computational Biology 9(10), e1003285. doi:10.1371/journal.pcbi.1003285
  3. [3]Peng, R. D. (2011). Reproducible Research in Computational Science. Science 334(6060), 1226–1227. doi:10.1126/science.1213847

Last updated:

Your Name