Making Theories FAIR by Version control, CFF citation files & Semantic Versioning
2025-10-17
Git is a tool from software development that solves two major challenges:
Tell other users how your theory should be cited, what the current version is, and more meta-data. This can be stored in a file called CITATION.cff in the top level folder of your repository:
cff-version: 1.2.0
title: 'AST: Action selection theory'
message: >-
  If you refer to this theory, please cite it using the
  metadata from this file. This theory has not been peer reviewed yet.
type: report
authors:
  - given-names: Felix
    family-names: Schönbrodt
    email: felix.schoenbrodt@psy.lmu.de
    orcid: 'https://orcid.org/0000-0002-8282-3910'
    affiliation: Ludwig-Maximilians-Universität München
repository-code: 'https://github.com/nicebread/AST'
abstract: >-
  A theoretical model that explains how a donkey solves the
  approach-approach conflict of hunger and thirst when the
  two sources are separated.
keywords:
  - approach-approach conflict
  - action selection
  - motivation
license: CC-BY-4.0
version: 0.2.5
date-released: '2023-10-30'
Create an initial version of your CITATION.cff file with the cffinit tool
The tool currently only knows “software” and “data set” as types. Create it with type software and update the message field:
message: >-
  If you refer to this theory, please cite it using the metadata from this file.
type: software 
Save the CITATION.cff file in the top level folder of your repository.
Both Github and Zenodo (and probably more repositories) parse an existing CITATION.cff and display the citation information:
message field, e.g.:
2.1.0: “The last peer-reviewed version was 1.0.4”1.0.2 is published at doi …”isReviewedBy annotation of an identifier..
├── README.md (this should link to any associated Google docs, if applicable)
├── CITATION.cff
├── VAST_display.drawio
├── simulation/
│   ├── README.md
│   ├── raw_data/ (a subfolder with empirical raw data, if applicable)
│   │   └── dat.csv
│   ├── functions.R (or any other name)
│   └── ...
└── manuscript/
    ├── manuscript.qmd  
    └── ...
Version numbers have three numbers: MAJOR.MINOR.PATCH.
Increment the:
The numbers are plain integers! For example, after 9 comes 10:
0.9.0 → 0.10.0 → 0.11.0 → 1.0.0 → 1.1.0
See https://semver.org and Van Lissa et al. (2025, October 4). To be FAIR: Theory Specification Needs an Update. https://doi.org/10.31234/osf.io/t53np_v3
0.1.01.0.00.1.00.1.10.2.0
0.3.0 → 0.4.0 → ... → 0.12.60.12.6 → 1.0.01.4.0), we made a huge change that makes the product incompatible to version 1: 2.0.0So what changes warrant what kind of version increments? For theories it makes sense to think in terms of predictions.
The version number is recorded in two places:
CITATION.cff fileIs every commit a new version? That would be very tedious, especially if you are currently developing the theory and have frequent commits. We recommend:
dev developer branch for ongoing development. It is not necessary to update the version number in each development step.CITATION.cff fileCHANGELOG.mdmain branchCreate a tag or a release whenever a major or minor version is released:
0.x.x version probably is not properly tested yet).(of course more complicated setups with multiple branches, e.g. feature branches, are possible).
CHANGELOG.md into the release notes.CITATION.cff file to include the new DOI
These slides are part of the course Formal modeling in psychology at LMU Munich