Tests

python -m pytest tests (eis check) runs every generator in tools/, every check here, and fails if a generated file in spec/, figures/, annex/, data/, or README.md differs from the committed one. CI runs the same (.forgejo/workflows/checks.yml). Each test module covers one concern and names what failed.

Module What it checks What it does not do
test_model.py The document model (data/document.json) is consistent; every register row binds a role or an interface and names how it is verified; the identifiers match data/register.lock.json, never reused or resequenced, their text never changed silently; no tool types the identifier prefixes. It does not write the lock: python tools/model.py --lock does, deliberately.
test_generators.py Every generator listed in tools/eis.py validates its model and runs; the example claim files, row budget, and Property Exchange dump check; the generated files are committed. It does not set any model.
test_claims.py Claim files: product types and implied features, the power block per domain, PWR-A6 entries and a power converter. It does not validate a product's claim; eis claim FILE does.
test_pages.py Every relative link and #anchor resolves, every figure is referenced, every shall sentence carries an identifier, the prose keeps one voice (links.py); every figure card follows the house style (figures.py); every example names the edition in pyproject.toml (eis_edition.py); the site builds with no broken link.
test_sources.py HP, rack unit, and the 3U panel height match the published A-100 construction page (doepfer.py); the published Technical Details figures are quoted and the places EIS chose otherwise reported (doepfer_technical.py); every row of data/video_timings.json matches the hardware-verified timing contract, clock for clock (video_timings_contract.py, --yaml PATH checks a full one); the survey copy in data/survey/ is the eis-reference survey when that checkout is beside this one (Annex F itself is checked by the generator, tools/survey.py --check). None of these sets a model: a difference is reported, not applied.

The scripts links.py, figures.py, eis_edition.py, doepfer.py, doepfer_technical.py, and video_timings_contract.py also run on their own (python tests/links.py).

Construction page: Construction Details A-100, retrieved 2026-10-09. Signal page: Technical Details A-100, retrieved 2026-10-16. The comparison is summarized in Annex E. Where each normative number comes from is in the requirements register.