Open source · Data & Analytics

ETL Run Manifest

Record source files, transforms, versions and outputs for each ETL run.

v0.1.0 · Node.js 22+ · MIT

Browse the public repository · View releases

"Where did this table come from?" is usually answered from memory, and memory is not evidence. A run manifest turns the answer into something checkable: the digest of every input the run read, the identity and digest of the code it ran, the parameters and seed it was given, the digest of everything it produced, and the runs it descends from.

This walkthrough uses the tool's public README and checked-in example files. Run the command from a repository checkout with Node.js 22+; inspect the source before using it on your own files.

Run the checked-in example

# Record a manifest for the example run.
node bin/etl-run-manifest.mjs record \
  --root examples/nightly \
  --run examples/nightly/run.json \
  --out /tmp/nightly-manifest.json

# Verify the manifest committed beside that example.
node bin/etl-run-manifest.mjs verify \
  --root examples/nightly \
  --manifest examples/nightly/manifest.json          # exit 0

# The same tree after somebody edited one raw export.
node bin/etl-run-manifest.mjs verify \
  --root examples/changed-input \
  --manifest examples/changed-input/manifest.json    # exit 1

# Two runs of one deterministic transformation.
node bin/etl-run-manifest.mjs compare \
  --baseline examples/nightly/manifest.json \
  --candidate examples/repeat/manifest.json          # exit 0

# The same transformation, the same inputs, different output bytes.
node bin/etl-run-manifest.mjs compare \
  --baseline examples/nondeterministic/a/manifest.json \
  --candidate examples/nondeterministic/b/manifest.json   # exit 1

# A run one of whose inputs could not be read, compared with itself.
node bin/etl-run-manifest.mjs compare \
  --baseline examples/unresolved/manifest.json \
  --candidate examples/unresolved/manifest.json      # exit 2, not a match

Read the result

stdout carries the JSON report and nothing else. stderr carries a human summary; --quiet turns it off.

Where this check stops

Every bound is enforced before the work: a document's size comes from stat before its bytes are read, a file's size comes from stat before it is opened, and every count is checked against the parsed document before any file is opened. Exceeding one is an incomplete result naming the limit, never a silent truncation and never a pass.

Before adapting the command to your own workflow, review the accepted inputs, exit codes and safety boundaries in the README.

Compiled with AI assistance from checked-in public documentation and example scripts. Run the example and review the repository's current documentation before relying on its result.