Docs

This is the reference for the two command-line tools that produce this corpus. It documents what you type. What the resulting graph then knows — what a layer is, why staleness is computed rather than remembered, what an approval attaches to — is on the pipeline pages, where every figure is generated from the corpus rather than written down.

The division is not editorial. These pages describe commands, which change when the code changes; those pages describe a model, which changes when a decision changes. Keeping them apart is what stopped this section describing a system that no longer existed.

The two tools

scripts/pipeline.py is the pipeline. It reads pipeline/layers.yaml, works out what the layer you asked for still needs, runs each one, and appends a record to runs/<paper>/ledger.jsonl naming every input by path and content hash. It is the only thing that writes a ledger, which is what makes "is this result still current" a question about files rather than about anyone's memory.

elife-extract is a set of layer runners — one subcommand per node in the graph that a model or a script can execute. Each reads the paths its layer declares and writes the path its layer declares. You can run them directly; nothing then records that you did.

That asymmetry is the whole reason to prefer the first. There is no second path that produces the corpus.

python3 scripts/pipeline.py run gadeke-2026-guilt-insula claim-tree --dry-run
prepare          cd extract && python3 -m elife_extract.cli prepare --paper gadeke-2026-guilt-insula …
results-reader   cd extract && python3 -m elife_extract.cli results-reader --paper gadeke-2026-guilt-insula
caption-reader   …
structure-reader …
reconcile        …
external-review  …
edge-inference   …
claim-tree       …

Eight commands, in dependency order, none of them run. Every one of them is a layer with a page of its own.

Where to start

Coming from the old CLI

The command surface changed. If you have older notes or scripts:

If you used Use now
elife-extract extract --doi <doi> pipeline.py run <paper> claim-tree, or prepare then each reader
elife-extract run pipeline.py run <paper> claim-tree
write --draft out/draft-<slug>.json write --paper <slug>
write --review-mode external the external-review layer, which runs in the chain
write --review-mode interactive pipeline.py approve <paper> <layer> --by NAME, after the write
write --review-mode auto-approve nothing — there is no gate to bypass
coverage --doi <doi> --claims-dir <dir> coverage --paper <slug>
mark --doi <doi> … mark --paper <slug>
scripts/verify-references.py pipeline.py run <paper> reference-check

Elsewhere on this site

Papers the claim graphs themselves
Pipeline the layer graph, and which papers have been through each layer
Roles and relations what a claim can be, and what can hold between two
Methodology the procedure the corpus follows
Design note why the system is shaped this way