Your provider retires a model.
The replacement is cheaper, but your JSON parser starts rejecting fenced output and classification quality drops.
See the model migration use case →Driftless watches your workflow’s dependencies in CI, repairs prompts when a model or dataset changes, validates through your real eval, and can open an evidence-backed PR when holdout passes.
The dependency problem
Models and eval data are dependencies of the prompt that works today. When either moves, Driftless re-tests the resolved workflow, repairs what is stale, and proposes the update—like Dependabot, but quality-gated.
The replacement is cheaper, but your JSON parser starts rejecting fenced output and classification quality drops.
See the model migration use case →Support changes its refund policy and updates gold labels. The model stays put, but the prompt now targets yesterday’s rules.
See the label-change use case →Automatic synchronization
Driftless closes the loop from a changed dependency to a reviewable update. Your eval decides what is better, and an untouched holdout decides what can ship.
Run current and target models through the same harness and dataset.
Cluster schema errors, wrong labels, refusals, and other recurring failures.
Generate candidate edits only inside the files you explicitly allow.
Choose on tuning data, then independently verify the winner on holdout.
Your contract
One versioned file tells Driftless how to run your app, where the eval lives, what repair may edit, and what “good enough” means.
Driftless shells out to your existing command. Your parsing, retrieval, tools, and post-processing stay intact.
Prompt files, examples, and config can be writable while schemas and product code remain read-only.
Use F1, schema error rate, pass rate, numeric scores, structured fields, or a calibrated LLM judge.
version: 1
workflows:
support_classifier:
run:
command: python evals/run_eval.py
input_path: evals/tickets.jsonl
model:
current: gpt-3.5-turbo
env_var: CLASSIFIER_MODEL
files:
editable:
- prompts/system.md
- prompts/examples.yml
readonly:
- schemas/ticket.schema.json
thresholds:
min_f1: 0.90
max_schema_error_rate: 0.02
migration:
holdout_required: true
Reviewable outcomes
The captured testbed run cleared holdout. Reviewers get its scoped prompt diff, score comparison, and attempt history.
If no candidate passes holdout, Driftless records what failed and opens an issue instead of creating a false-confidence PR.
FAIL min_f1 0.872 < 0.900
Best candidate retained as evidence
A captured testbed run with generated report, untouched holdout result, one prompt repair, and a separate model configuration update in the PR.
Open PR #4 on GitHub →
Common use cases
Migrate a classifier without breaking strict JSON or quality.
→ 02Label policy changeRefine the prompt while keeping the model pinned.
→ 03Cost reductionAdopt a cheaper model only when the same quality bar passes.
→ 04RAG and agentsTest the whole application while keeping retrieval and tools fixed.
→Try it locally
The bundled demo deterministically shows a model dependency change, the resulting quality regression, and a blocked key-free analysis. It is separate from public testbed PR #4 and does not ship a deterministic repair generator.
$ pip install driftless
$ driftless copy-example support-classifier --out-dir demo
$ cd demo
$ driftless validate -w support_classifier
$ driftless compare -w support_classifier --to gpt-4o-mini