Skip to main content

ineedvalidation

Declare which physical case, kind of evidence and response quantity a test exercises; collect the declarations across repositories into an evidence ledger; lint and render a validation hierarchy from node notes plus that ledger.

The vocabulary follows Oberkampf and Roy, Verification and Validation in Scientific Computing (2010): a validation hierarchy of unit, benchmark, subsystem and system cases, and a strict separation between verification (the code solves the equations correctly) and validation (the equations describe the measured world).

Marking a test

import ineedvalidation as vv

@vv.case("free-space-propagation", "code-verification", srq="on-axis intensity")
def test_matches_closed_form():
    ...

@vv.case("free-space-propagation", "solution-verification", refined_parameter="grid-spacing")
def test_second_order_in_the_step():
    ...

@vv.case("free-space-propagation", "cross-code-benchmark", reference_code="other-code")
def test_matches_independent_code():
    ...

@vv.case("detector-frame", "validation", referent="lab-flat-field-2026")
def test_matches_measured_frames():
    ...

@vv.seam("optics", "detector", case="detector-frame")
def test_photon_scale_anchor():
    ...

@vv.regression
def test_frozen_output():
    ...

Evidence kinds: code-verification, solution-verification, cross-code-benchmark, validation (measured data only) and uncertainty-quantification. They are spelled out rather than lettered so a marked test reads without a key. reference_code= belongs to a cross-code benchmark, refined_parameter= to solution verification and referent= to validation; each raises when used with another kind, so a mislabelled test fails at import. Regression tests claim no kind of evidence.

The markers register through a pytest plugin entry point, so installing the package is the only setup a repository needs.

Tagging by path

A table in pyproject.toml assigns a case and evidence kind by test path, so the tagging cost is per file or directory rather than per test. The longest matching prefix wins, and an explicit marker overrides the table.

[tool.pytest.ini_options]
testpaths = ["tests"]

[tool.ineedvalidation]
library = "mylib"

[tool.ineedvalidation.defaults]
"tests/test_kernel.py" = { case = "free-space-propagation", evidence = "code-verification" }
"tests/benchmark/" = { case = "free-space-propagation", evidence = "cross-code-benchmark" }

Paths are matched relative to the pytest rootdir. A [tool.pytest.ini_options] table in the same pyproject.toml pins the rootdir to the repository; without one, pytest can settle on a directory above it and no default matches.

Collecting the evidence

$ pytest --vv-evidence evidence/mylib.json

One JSON file per repository lists every marked or defaulted test with its case, kind of evidence, response quantity, seam and the outcome it reached, stamped with the commit. The library name comes from --vv-library NAME, else [tool.ineedvalidation] library, else the rootdir name.

Linting, scaffolding and rendering a hierarchy

$ ineedvalidation lint hierarchy/ --library-map libraries.md
$ ineedvalidation scaffold hierarchy/
$ ineedvalidation render hierarchy/

The hierarchy is a directory holding nodes/ (one Markdown note with YAML frontmatter per node, listing the cases it owns under cases:), evidence/ (the ledgers) and optionally views/; --nodes and --evidence point elsewhere. The lint checks the notes for internal consistency and checks them against the collected tests in both directions: a case no node owns, a node with no tests, a response quantity a node does not list, or a validation level claimed without a passing test that supports it. scaffold writes a stub note for every case a test names that no node owns. The renderer draws the levelled figure through d2, with named views (--view, --all-views), a single branch (--root) and optional hand-edited overrides for figures that have to look right in a talk.

Status

Pre-alpha. The markers, the evidence collector, the hierarchy lint, the scaffolder and the renderer work; the API is not yet stable.

Metadata

Release files for ineedvalidation 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ineedvalidation 1.0.0
File Size Uploaded Provenance Actions
ineedvalidation-1.0.0.tar.gz 24.2 kB With provenance Details for ineedvalidation-1.0.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for ineedvalidation 1.0.0
File Interpreter ABI Platform Actions
ineedvalidation-1.0.0-py3-none-any.whl Python 3 none any Details for ineedvalidation-1.0.0-py3-none-any.whl

Total release size: 47.4 kB

Release files / ineedvalidation-1.0.0.tar.gz

Download URL ineedvalidation-1.0.0.tar.gz
Size 24.2 kB
Tags Source
SHA-256 checksum
How to use checksums
5d1f2a86d035aebac57bce7d9ab20de72446dcd6fed1cd6f578447e6d691c81d
BLAKE2b-256 checksum
How to use checksums
eb4db700d915a8ac1fce3187470144bdc37889f335a4c2738303aede1c9bceae
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 16, 2026.

Transparency log

Release files / ineedvalidation-1.0.0-py3-none-any.whl

Download URL ineedvalidation-1.0.0-py3-none-any.whl
Size 23.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bb75a8d09434c6b7d281708095e3bd6e2aa942b9728531552a8095ed628ba5ed
BLAKE2b-256 checksum
How to use checksums
47060695e7543bdfeb57f90813b37640430cac7c7763363275978fa3337cf06a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 16, 2026.

Transparency log

Security for ineedvalidation 1.0.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for ineedvalidation-1.0.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 16, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page