Skip to main content

estafette

Can someone who was not involved get this running? Estafette answers that question mechanically.

Estafette makes public-sector proofs of concept transferable — and measurably so. It is a command-line tool that assesses a repository against a transfer manifest and produces a transferability report with a tier verdict. It orchestrates existing, trusted scanners rather than reinventing them.

  • Status: v1 complete — estafette assess produces a bronze verdict and a transferability report. See openspec/project.md for the plan.
  • Example report (SIDN Pioniers annex): estafette assessed on itself — reports/50a9e694a1a4/report.md (bronze, byte-reproducible for that commit).
  • Licence: EUPL-1.2 — public from day one.
  • Python: 3.12+
  • Package/runner: uv

The name estafette is Dutch for a relay race. A proof of concept is the baton: the point is whether it can be handed off cleanly to someone who wasn't there when it was built.

What it does

Given a repository and a transfer manifest, estafette runs a fixed set of mechanical checks and reports, per check:

  • the status (pass / fail),
  • an actionable gap for every failure (e.g. "dependency X is imported in code but not declared"), never a bare red cross, and
  • the evidence it used, so the verdict is auditable.

It then assigns a tier. In v1 the only implemented tier is bronze — the floor that makes reuse conversations possible.

Bronze tier

  1. REUSE-compliant (every file has licence + copyright info)
  2. Declared licence is consistent everywhere it appears
  3. No secrets detected
  4. SBOM generates cleanly and matches declared dependencies
  5. Transfer manifest present and valid
  6. Contact/owner field non-empty

Silver (builds reproducibly in an isolated harness) and gold (third-party deployable, data requirements satisfiable) are specified as roadmap in docs/tiers.md and not yet enforced. The build harness itself is built in v1, and its result is reported informationally ("would this pass silver: yes/no + gaps").

Design principles

Estafette orchestrates, it does not reinvent:

Concern Tool
Licence clarity REUSE
Software bill of materials syft
Secret detection gitleaks
Vulnerabilities trivy (v2)

Estafette's own code is the manifest schema, the build harness, the tier semantics, and the report — nothing else. Full invariants are in openspec/project.md; highlights:

  • Mechanical or it doesn't count — a tier is only ever the output of the engine on a specific commit.
  • Diagnose, don't just fail — the gap report is the product.
  • Untrusted code never runs ambient — the build harness runs in rootless podman with no network in the run stage and strict resource caps.
  • Deterministic and reproducible — same commit + same estafette version → byte-identical report body.
  • No LLM anywhere in the verdict path.

Usage (target)

uvx estafette assess <path-or-git-url> [--manifest path/to/manifest.yaml]

This produces report.json and a human-readable report.md under reports/.

The CLI is under construction. Track progress via the OpenSpec changes in openspec/changes/.

The transfer manifest

The transfer manifest is designed as an extension profile of publiccode.yml, not a competitor: field names align where overlap exists. See docs/manifest-spec.md.

Prerequisites

The static checks orchestrate three external scanners (invariant: orchestrate, don't reinvent). Install them and put them on your PATH:

Tool Used by Install
REUSE licence/copyright coverage shipped as a dev dependency; uv sync provides it
gitleaks secret detection download the release binary
syft SBOM generation curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b ~/.local/bin
podman (optional) build harness / silver preview rootless; absence degrades the silver preview gracefully

If a required scanner is missing, estafette assess exits with a clear error naming it — a missing scanner never reads as a pass. podman is optional: when it is absent or unusable, the informational silver preview reports not assessable and the bronze verdict is unaffected.

Security note: the harness run stage executes assessed code with no network, no host environment, resource caps, and a read-only root filesystem (invariant I4). The build stage currently permits network egress for dependency fetch — see docs/tiers.md.

Development

This project uses the OpenSpec workflow (propose → apply → archive). Proposed and in-progress work lives under openspec/changes/.

uv sync            # install dependencies (incl. reuse)
uv run pytest      # run tests (scanner-dependent tests skip if a tool is absent)
uv run ruff check  # lint

Licence

EUPL-1.2. Copyright the estafette contributors.

Metadata

Release files for estafette 0.1.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 estafette 0.1.0
File Size Uploaded
estafette-0.1.0.tar.gz 97.6 kB Details

Built distribution (wheel)

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

Total release size: 128.6 kB

Release files / estafette-0.1.0.tar.gz

Download URL estafette-0.1.0.tar.gz
Size 97.6 kB
Tags Source
SHA-256 checksum
How to use checksums
ae22ff3e9f0955b3f3ed1633ba5ec11fe374bcd0ca8c88c2527471957e91b52e
BLAKE2b-256 checksum
How to use checksums
522afa2a4cfaa78630adf2bd4010b3791a93e8bc7601911e38981b9de361eebb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / estafette-0.1.0-py3-none-any.whl

Download URL estafette-0.1.0-py3-none-any.whl
Size 30.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0c55128c4b664e6898148d5b96b223104d018c8cff300b84d8d5eb0fbc3b8a92
BLAKE2b-256 checksum
How to use checksums
136d65371082b8c843108d1da53cd8aecb023d2cb4a3d69566154cb55806d0f2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

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