Keep prompts in sync when model or eval data changes — Poetry-style lock regeneration, Dependabot-style PRs.
Project description
driftless
Poetry-style lock regeneration for prompts — delivered Dependabot-style.
A prompt is pinned to a model and an eval dataset (like pyproject.toml
declares deps and poetry.lock pins what works). When either moves, the prompt
goes stale. driftless re-derives it through your real eval, validates on holdout,
and opens a PR with evidence.
Also described as Dependabot for LLM models — same automation shape, different core insight: prompts are lockfiles, not just config files.
Status: early development —
0.1.0on PyPI.
Install (dev)
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
Quickstart
driftless init # scaffold a driftless.yml
driftless init-policy # scaffold .driftless/policy.yml
driftless init-ci # scaffold GitHub Actions workflows
driftless validate -w support_classifier # contract parses + harness runs
How it works
You describe your model-dependent workflow once in driftless.yml: how to
run it, how to override the model, which files may be edited, and what quality
thresholds must hold. driftless orchestrates your workflow under
different models, compares results, repairs allowed files, validates on
holdout, and opens a PR with the evidence.
The customer owns the workflow. The tool orchestrates it.
Not a classifier? Choose a grading mode that fits the task — the same loop then optimizes against it, with your team owning the definition of "good":
eval.score_field/eval.pass_field— your command emits a numeric score or a pass/fail per record (works for any task: summarization, codegen, agents).eval.fields— structured extraction, scored per field with precision/recall/F1 against the gold record.eval.judge— an LLM judge grades each free-form output against a rubric (with an optional human-scored calibration set for a judge-agreement check). Rundriftless judge-check -w <workflow>before optimizing; setmax_mae/min_correlationin the contract to gatemigrate/compare.
CLI
| Command | Purpose |
|---|---|
init |
Scaffold a driftless.yml. |
init-policy |
Scaffold a .driftless/policy.yml (when to migrate). |
init-ci |
Scaffold .github/workflows/ for scan, migrate, refine, poll, plan, label audit, and judge check. |
scan |
Find probable LLM usage and at-risk models. |
plan |
Discover at-risk workflows and apply the migration policy (CI triage). |
plan --act |
Migrate + open a PR/issue for every actionable trigger (close the loop). |
configure <workflow> |
Turn a detected workflow into a migration-ready contract. |
calibrate -w <w> |
Measure the baseline and suggest starting thresholds. |
compare -w <w> --to <model> |
Baseline vs target scorecard. |
migrate -w <w> --to <model> |
Repair + validate + produce migrated files. |
--strict-label-audit warns/blocks on duplicate-label conflicts. |
|
refine -w <w> |
Re-optimize the prompt for a changed eval dataset (model pinned). |
poll [--act] |
Detect external eval-dataset changes and refine on a meaningful change. |
validate -w <w> |
Check the contract parses and the harness runs. |
judge-check -w <w> |
Measure judge↔human agreement on a calibration set (--enforce to gate). |
audit-labels -w <w> |
Find duplicate inputs with disagreeing gold labels (--fail for CI). |
report |
Render the latest migration report. |
view |
Open the optimization run viewer (charts + attempt log). |
open-pr -w <w> |
Open a PR (or issue) from the latest migration result. |
Configuring when to migrate
plan reads an optional .driftless/policy.yml — the "dependabot.yml" layer.
Scaffold it with driftless init-policy; every field matches a default, so an
empty file behaves like no file. It controls which triggers are enabled
(deprecation is on and forced; cost/quality/new_model are opportunistic),
the thresholds a candidate must clear (min_savings_pct, min_gain), a
cooldown_days to skip freshly-released models, candidate allow/deny globs,
and an ignore list to snooze specific models or moves. The engine still decides
whether a candidate actually passes your eval — policy only decides whether to
propose it.
GitHub-native usage
A composite GitHub Action (action.yml) wraps the CLI so scans and migrations
can run in CI. See .github/workflows/ for a scheduled deprecation scan, weekly
plan --act triage, and manually-triggered migration workflows.
- uses: driftless-dev/driftless@v0.2.15
with:
command: scan
Documentation
- Release process — changelog, tagging, GitHub Releases, PyPI.
- Changelog — version history.
- Repair prompts & custom generators — customize the LLM repair prompt or plug in your own patch generator.
- Run viewer — inspect optimization attempts, metrics, and diffs.
Project details
Release history Release notifications | RSS feed
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 driftless-0.2.15.tar.gz.
File metadata
- Download URL: driftless-0.2.15.tar.gz
- Upload date:
- Size: 1.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6979be90e2e8522ffb86302bc8688ef7ee782f56e1f37eda572545925d1bdd33
|
|
| MD5 |
2d9fd801957d4e46699f85197f68e05e
|
|
| BLAKE2b-256 |
38e99f1438a5b10123ed6242f84a8a58b467152439b709479a06125a6195e3ac
|
Provenance
The following attestation bundles were made for driftless-0.2.15.tar.gz:
Publisher:
publish.yml on driftless-dev/driftless
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
driftless-0.2.15.tar.gz -
Subject digest:
6979be90e2e8522ffb86302bc8688ef7ee782f56e1f37eda572545925d1bdd33 - Sigstore transparency entry: 2040620879
- Sigstore integration time:
-
Permalink:
driftless-dev/driftless@3dc3b31f1752a36ee164390ef095c4df16f5d2cc -
Branch / Tag:
refs/tags/v0.2.15 - Owner: https://github.com/driftless-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3dc3b31f1752a36ee164390ef095c4df16f5d2cc -
Trigger Event:
release
-
Statement type:
File details
Details for the file driftless-0.2.15-py3-none-any.whl.
File metadata
- Download URL: driftless-0.2.15-py3-none-any.whl
- Upload date:
- Size: 1.5 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a543bdb40afa977bf12d31bd3fe58af4adf67b3a79560320b0d1ac0348d0fef
|
|
| MD5 |
9f60b46a5644d65dd4934c87971f1011
|
|
| BLAKE2b-256 |
828df5a8ce92651a0c957cd1aca3ea6c0f4ad8b80de03764b819488434405408
|
Provenance
The following attestation bundles were made for driftless-0.2.15-py3-none-any.whl:
Publisher:
publish.yml on driftless-dev/driftless
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
driftless-0.2.15-py3-none-any.whl -
Subject digest:
3a543bdb40afa977bf12d31bd3fe58af4adf67b3a79560320b0d1ac0348d0fef - Sigstore transparency entry: 2040621240
- Sigstore integration time:
-
Permalink:
driftless-dev/driftless@3dc3b31f1752a36ee164390ef095c4df16f5d2cc -
Branch / Tag:
refs/tags/v0.2.15 - Owner: https://github.com/driftless-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3dc3b31f1752a36ee164390ef095c4df16f5d2cc -
Trigger Event:
release
-
Statement type: