A bill of lading for AI.
You already require a bill of lading for physical cargo and an SBOM for software. Ladex is the one for AI — it records what AI is aboard your codebase, from whom, and under what terms, captured at the moment the code is written rather than discovered after the fact.
Ladex is a shift-left AI governance tool for developers. When you write an AI-relevant line of code — importing an agent framework, loading a Hugging Face model, calling an inference API, provisioning a GPU node pool in Terraform — Ladex detects it and answers three questions:
- What is this? model / dataset / agent framework / vector store / inference API
- What does it obligate? EU AI Act Art. 50 disclosure, Annex III high-risk triggers
- What's auto-verifiable vs. what needs a human? CVEs and licenses resolve
automatically. Training-data provenance and consent basis can't be derived by any scanner —
they're flagged
UNDOCUMENTEDand require a signed human attestation, never a fake green checkmark.
The output is a CycloneDX ML-BOM committed to your repo, diffable in PRs, with signed attestations for the fields no tool can derive.
Ladex records what's aboard; it does not block attacks.
What it does
detect (Python + Terraform + Kubernetes)
→ enrich PyPI licenses · OSV CVEs · Hugging Face model cards (cached, offline-capable)
→ obligate EU AI Act (Art. 5 bans · Annex III/Art. 8-15 high-risk · Art. 50 · Art. 53 GPAI)
→ BOM deterministic CycloneDX ML-BOM that diffs cleanly in PRs
→ attest in-toto/DSSE signature fills an UNDOCUMENTED gap with a verifiable declaration
surfaces: CLI + VS Code (LSP) + GitHub PR check — one shared engine
Install — which one do you need?
Ladex has three surfaces. Install only the one(s) you'll use — they're independent, and none requires another.
| I want to… | Install this | How |
|---|---|---|
| Editor squiggles as I type | VS Code extension | Search "Ladex" in the Extensions panel. The engine is bundled — no pip needed. |
Run scan / write-bom / attest / verify / ci in a terminal |
the ladex CLI |
uv tool install ladex (or pipx install ladex) |
| Gate pull requests for my team | GitHub Action | Add the workflow (see On your pull requests) — nobody installs anything locally. |
The extension only shows AI inline (read-only). Producing the BOM, signing attestations, and running the gate are CLI actions — so if you want those, install the CLI.
Installing the CLI
uv tool install ladex # isolated + on your PATH (recommended)
ladex --version # -> ladex 0.1.4
Tip: install it as a tool (
uv tool/pipx), not with a plain globalpip install—pipcan drop the command in aScripts/dir that isn't on your PATH (a common Windows "command not found"), and it clutters your global environment. Tools are isolated and on PATH.pipx install ladexworks too; use a project virtualenv only if you specifically want it pinned per-project.
Quickstart
# See every AI component in a repo (silent on non-AI code)
ladex scan path/to/repo
# Add real facts: licenses, CVEs, model cards (cached; --offline works from cache)
ladex scan path/to/repo --enrich
# Declare your EU AI Act classification once (high-risk? GPAI provider? prohibited uses?)
ladex policy init path/to/repo # writes .ladex/project.yaml to fill in & commit
# What does it obligate under the EU AI Act? (reads .ladex/project.yaml; flags override)
ladex policy check path/to/repo --user-facing
# Produce the committable, deterministic ML-BOM
ladex scan path/to/repo --write-bom aibom.cdx.json
# Sign a human answer for a gap no scanner can fill, then verify it
ladex attest "sentence-transformers/all-MiniLM-L6-v2" \
--claim provenance --value "Curated public corpora, reviewed 2026-08"
ladex verify
# Gate it (exit non-zero on undocumented provenance / open obligations)
ladex ci path/to/repo --fail-on gaps
Example
app.py
7:10 inference_api openai.client openai.OpenAI (OpenAI)
12:9 model openai.model-id gpt-4o (OpenAI)
infra/main.tf
20:1 vector_store iac.tf.vector-store-unencrypted HIGH aws_opensearch_domain.vectors
- Vector store is not encrypted at rest
Summary: 3 detection(s) across 2 of 2 file(s) scanned.
Commands
| Command | What it does |
|---|---|
ladex --version |
Print the installed version. |
ladex scan [PATH] |
Detect AI components across a tree (Python + Terraform + Kubernetes). Silent on non-AI code. |
ladex scan PATH --enrich |
Add licenses (PyPI), CVEs (OSV), and model cards (HF). --offline uses the cache. |
ladex scan PATH --write-bom [FILE] |
Write the deterministic CycloneDX ML-BOM (default aibom.cdx.json). |
ladex scan PATH --json |
Machine-readable scan output. |
ladex detect FILE.py |
Detect AI in a single file. |
ladex policy init [PATH] |
Scaffold .ladex/project.yaml (declare your EU AI Act classification). |
ladex policy check [PATH] |
Show applicable EU AI Act obligations and open gaps (--json for machine output). |
ladex policy list |
List the loaded policy bundles and rules. |
ladex ci [PATH] |
Gate for CI/PRs: exit non-zero on open gaps. --fail-on none|gaps|strict, --format text|markdown|json|github. |
ladex attest SUBJECT --claim CLAIM --value TEXT |
Sign a human declaration — a model's provenance/consent_basis, or an obligation rule id with --claim satisfied. --attester WHO. |
ladex verify [PATH] |
Verify every stored attestation's signature. |
ladex taxonomy list · ladex taxonomy validate [PACK…] |
Inspect / validate the detection rules. |
ladex serve |
Run the LSP server over stdio (the VS Code extension launches this). |
Project-fact flags for policy check / ci override .ladex/project.yaml:
--user-facing/--not-user-facing, --synthetic-content/--no-synthetic-content.
On your pull requests
The GitHub Action runs the same engine as a merge gate: it detects AI added in a PR,
records its EU AI Act obligations, and fails the check on undocumented provenance — with a
sticky comment showing exactly which ladex attest command closes each gap.
# .github/workflows/ladex.yml
on: pull_request
permissions: { contents: read, pull-requests: write }
jobs:
ladex:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: aibhuyan/ladex/apps/github@v0.2.0
with: { fail-on: gaps }
See apps/github/README.md for all inputs. Locally, the same gate is
ladex ci [PATH] --fail-on gaps (exit non-zero on open gaps).
In your editor
The VS Code extension gives inline diagnostics as you type, nothing on non-AI code — and the
platform builds bundle the engine, so it's a single install with no separate pip install:
- From the Marketplace — search "Ladex" in the Extensions panel (or open the listing). VS Code automatically installs the build for your OS/CPU.
- From a
.vsix— download the one matching your platform from the Releases page (ladex-<version>-{win32-x64,darwin-arm64,linux-x64}.vsix) → Extensions panel → Install from VSIX….
Then open any Python file that uses an AI library. See
extensions/vscode/README.md for configuration and development.
Design principles
- One engine, three surfaces. The IDE, CLI, and GitHub PR check all call the same Python engine — the editor can never disagree with the gate.
- Ruthless silence. If a line isn't AI-relevant, Ladex says nothing.
- Honest gaps.
UNDOCUMENTEDis a valid, valuable output. A green checkmark only appears when something was actually verified — or signed by a named human. - Policy as versioned data. Taxonomy and EU AI Act rules are updatable bundles, not code.
Scope
Python + Terraform + Kubernetes detection. EU AI Act. Three surfaces — CLI, VS Code, and a GitHub PR check. The Postgres-backed evidence graph is the remaining v2 item.
Development
From source (requires uv and Python 3.12):
git clone https://github.com/aibhuyan/ladex
cd ladex
uv sync
uv run ladex --version # from a checkout, run via `uv run ladex …`
uv run ruff check .
uv run mypy
uv run pytest
Pre-commit (ruff + mypy) runs on every commit; run uv run pre-commit install once.
See RELEASING.md for how releases are cut and published.
License
MIT — see LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ladex-0.2.0.tar.gz.
File metadata
- Download URL: ladex-0.2.0.tar.gz
- Upload date:
- Size: 81.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
95f8f8bdea61c52ccac81c4214bee2909f846cc6254b05879321841d2fdf839a
|
|
| MD5 |
5d811d676aac3f7d88ef7500078a4a7f
|
|
| BLAKE2b-256 |
0c48a47c7fb746ed27f5d3d0917b4c63c9c6be1f2f262f356d6abfa038586c06
|
Provenance
The following attestation bundles were made for ladex-0.2.0.tar.gz:
Publisher:
release.yml on aibhuyan/ladex
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ladex-0.2.0.tar.gz -
Subject digest:
95f8f8bdea61c52ccac81c4214bee2909f846cc6254b05879321841d2fdf839a - Sigstore transparency entry: 2589739641
- Sigstore integration time:
-
Permalink:
aibhuyan/ladex@aa6fe16a0cebc418a60e195aa91117a62b9c9230 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/aibhuyan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@aa6fe16a0cebc418a60e195aa91117a62b9c9230 -
Trigger Event:
push
-
Statement type:
File details
Details for the file ladex-0.2.0-py3-none-any.whl.
File metadata
- Download URL: ladex-0.2.0-py3-none-any.whl
- Upload date:
- Size: 76.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aa22b63cc95f355dfb1d5bb59b00b29874af8b5e394a803734073aa276323219
|
|
| MD5 |
7b5044487301276c2b47bf3a22f7af68
|
|
| BLAKE2b-256 |
14f8a562d2cad8cfd44b074f15e6db2e659d44135186824fe2e3fc0bf799d318
|
Provenance
The following attestation bundles were made for ladex-0.2.0-py3-none-any.whl:
Publisher:
release.yml on aibhuyan/ladex
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ladex-0.2.0-py3-none-any.whl -
Subject digest:
aa22b63cc95f355dfb1d5bb59b00b29874af8b5e394a803734073aa276323219 - Sigstore transparency entry: 2589739718
- Sigstore integration time:
-
Permalink:
aibhuyan/ladex@aa6fe16a0cebc418a60e195aa91117a62b9c9230 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/aibhuyan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@aa6fe16a0cebc418a60e195aa91117a62b9c9230 -
Trigger Event:
push
-
Statement type: