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 repairs 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: public alpha —
0.3.xrelease line on PyPI. Upgrading from 0.2.x? Version 0.3.0 rejects legacymigration.allow_*fields; follow the upgrade guide before updating.
Install
pip install driftless
Quickstart
Try Driftless without provider keys by copying the bundled support-classifier example:
driftless copy-example support-classifier --out-dir driftless-classifier-demo
cd driftless-classifier-demo
driftless validate -w support_classifier
driftless compare -w support_classifier --to gpt-4o-mini
The comparison intentionally fails:
F1 current 1.000 target 0.000
Total cost current 0.024 target 0.004
FAIL min_f1: 0.000 >= 0.9
Smoke-demo warning: this fixture has only 4 rows. It proves packaging, contract execution, metric gating, evidence rendering, and dry-run PR/issue behavior; it does not establish production quality, statistical confidence, provider behavior, or a successful repair. Use a representative eval and real provider credentials before making a shipping decision.
The target is cheaper, but it is not safe to ship because it fails the classifier's quality gate. Continue through the blocked migration path without provider keys:
driftless migrate -w support_classifier --to gpt-4o-mini --generator none
driftless report -w support_classifier
driftless open-pr -w support_classifier
migrate exits non-zero with BLOCKED, as intended. --generator none makes
no repair edits, report renders the saved evidence, and open-pr is a dry run
unless you explicitly pass --create.
Product proof
This is the actual output of the cold-install quickstart:
A deterministic offline migration was also run against the public
support-classifier-svc
testbed. It produced draft PR #4
with the generated scorecard, holdout evidence, prompt diff, and model update:
PR #4 used testbed-specific deterministic patch tooling that is not shipped as a Driftless CLI generator. It is genuine historical proof of the orchestration and review artifact, not a claim that the published CLI reproduces that exact repair without provider credentials.
Other bundled examples are available for retrieval QA and tool-using agents:
driftless copy-example rag-qa
driftless copy-example tool-agent
To adopt Driftless in an existing repository, follow the
guided existing-repository walkthrough.
It starts with scan and configure --apply, then gives a concrete
draft-to-contract example, exact editable-path rules, provider-cost guidance,
and safety checks before repair or CI. configure always saves a reviewable
draft; --apply also creates or safely appends the workflow to root
driftless.yml without rewriting existing comments.
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 |
|---|---|
copy-example |
Copy a bundled example project (support-classifier, rag-qa, tool-agent). |
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> |
Write .driftless/configure/<workflow>.yml; add --apply to create or safely merge root driftless.yml. |
calibrate -w <w> |
Measure the baseline and suggest starting thresholds. |
compare -w <w> --to <model> |
Baseline vs target scorecard; add --enforce for a failing CI exit code. |
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.3.3
with:
command: scan
Documentation
- Landing page — product overview and public-alpha proof.
- Hosted documentation — installation, adoption path, concepts, and reference.
- Run viewer — inspect optimization attempts, metrics, and diffs.
- Use-case guides — model migration, dataset refine, CI automation, cost, label audit, judges, RAG, and agents.
- Getting started — run the bundled classifier, RAG, and agent examples.
- Upgrading to 0.3 — replace legacy
migration.allow_*fields with exactfiles.editablepaths. - Command chooser — map common user situations to CLI commands.
- Known limits — current public-alpha boundaries.
- Cost and budget guidance — practical defaults for expensive eval loops.
- Launch check — latest local suite, packaging, and example command results.
- Visual proof inventory — genuine captures, provenance, and reproduction notes.
- Example review artifact — dry-run issue/report from a blocked migration.
- Example successful PR artifact — public testbed PR and separate saved fixture.
- RAG and agent workflows — contract patterns for retrieval QA, judge grading, and tool-using agents.
- User readiness plan — current adoption boundaries and wider-launch follow-up.
- 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.
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.3.3.tar.gz.
File metadata
- Download URL: driftless-0.3.3.tar.gz
- Upload date:
- Size: 3.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a9c44845cf6dfa70e31fa71cc02a4e854c1376f1723b7e2f07f4e1f0835b72b
|
|
| MD5 |
f3b5e2ee366b600ad87dd25023576ff8
|
|
| BLAKE2b-256 |
afb158f0107bd7554be2e4ecae5b05671d5dee556ccdd7af123ae4ab0aab8da5
|
Provenance
The following attestation bundles were made for driftless-0.3.3.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.3.3.tar.gz -
Subject digest:
2a9c44845cf6dfa70e31fa71cc02a4e854c1376f1723b7e2f07f4e1f0835b72b - Sigstore transparency entry: 2331828165
- Sigstore integration time:
-
Permalink:
driftless-dev/driftless@d5beec45c8b3e651749c3d49d478cd8eebcae34c -
Branch / Tag:
refs/tags/v0.3.3 - Owner: https://github.com/driftless-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d5beec45c8b3e651749c3d49d478cd8eebcae34c -
Trigger Event:
release
-
Statement type:
File details
Details for the file driftless-0.3.3-py3-none-any.whl.
File metadata
- Download URL: driftless-0.3.3-py3-none-any.whl
- Upload date:
- Size: 2.5 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3ce4a2ee129bd27d5cd0e94cf187a1d301148440c37bf315928715d1a2eb4a0b
|
|
| MD5 |
5d78dab9ce478e1269a072906dd4ff95
|
|
| BLAKE2b-256 |
45f44f39372a854f2f68d6cdfb81f36ab2a30ef31b4c9da3f343c1379bf8d016
|
Provenance
The following attestation bundles were made for driftless-0.3.3-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.3.3-py3-none-any.whl -
Subject digest:
3ce4a2ee129bd27d5cd0e94cf187a1d301148440c37bf315928715d1a2eb4a0b - Sigstore transparency entry: 2331828247
- Sigstore integration time:
-
Permalink:
driftless-dev/driftless@d5beec45c8b3e651749c3d49d478cd8eebcae34c -
Branch / Tag:
refs/tags/v0.3.3 - Owner: https://github.com/driftless-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d5beec45c8b3e651749c3d49d478cd8eebcae34c -
Trigger Event:
release
-
Statement type: