Public alpha · Dependabot-style automation for LLM workflows

Keep models, prompts, and eval data in sync.

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.

For teams with an existing eval harness. Comparison and safety gating work key-free; automated LLM repair requires provider credentials.

compare / support-classifier 4-row smoke demo
$ driftless compare -w support_classifier --to gpt-4o-mini
FROMgpt-4
TOgpt-4o-mini
Same prompt, same eval harness DRIFT FOUND
Macro F1
current1.000
target0.000
Total cost
current0.024
target0.004
Contract checks1 pass  1 fail
max_cost_increase −83.3%
× min_f1 0.000 < 0.900

The dependency problem

Your prompt is the lockfile for a moving system.

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.

Model changed Provider lifecycle
External drift

Your provider retires a model.

The replacement is cheaper, but your JSON parser starts rejecting fenced output and classification quality drops.

  • What changedOld model is deprecated or expensive
  • What breaksParser rejects output; eval quality drops
  • Driftless decisionBlock until repair passes holdout
Model migration use case
Labels changed Policy and gold data
Internal drift

Your team redefines “correct.”

Support changes its refund policy and updates gold labels. The model stays put, but the prompt now targets yesterday’s rules.

  • What changedGold labels encode a new policy
  • What breaksPrompt still optimizes for yesterday’s rules
  • Driftless decisionRefine prompt with model pinned
Label-change use case

Automatic synchronization

Watch, repair, validate, propose.

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.

  1. 01
    Compare

    Run current and target models through the same harness and dataset.

    baseline
  2. 02
    Diagnose

    Cluster schema errors, wrong labels, refusals, and other recurring failures.

    context
  3. 03
    Repair

    Generate candidate edits only inside the files you explicitly allow.

    candidates
  4. 04
    Validate

    Choose on tuning data, then independently verify the winner on holdout.

    gate
DRIFTLESS repair
engine
workflow active
failures
patches
scores
final gateHOLDOUT

Your contract

You keep control of the workflow and the quality bar.

One versioned file tells Driftless how to run your app, where the eval lives, what repair may edit, and what “good enough” means.

  • 01
    Bring your own harness

    Driftless shells out to your existing command. Your parsing, retrieval, tools, and post-processing stay intact.

  • 02
    Set a hard edit boundary

    Prompt files, examples, and config can be writable while schemas and product code remain read-only.

  • 03
    Define the merge bar

    Use F1, schema error rate, pass rate, numeric scores, structured fields, or a calibrated LLM judge.

Explore the contract schema
driftless.yml project / driftless.yml
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

Every run ends with evidence, not optimism.

--generator noneREPRODUCIBLE BLOCK

Cheaper is not shippable

The bundled four-row demo fails the quality gate. Driftless records the blocker and previews an issue instead of a false-confidence PR.

support_classifier → gpt-4o-mini FAIL min_f1 0.000 < 0.900 No prompt files committed
--generator fixtureREPRODUCIBLE PASS

The published CLI can pass

The same example applies a known-good bundled patch, still without provider keys. Reviewers get the prompt diff, scorecard, and holdout checks.

Target Macro F10.000 → 1.000
Holdout min_f1PASS
Prompt files changed1 in scope
HISTORICAL TESTBED PROOF · PR #4 A larger captured run

Public draft PR from a 290-label testbed: generated report, untouched holdout, one prompt repair, and a model configuration update. Separate from the four-row demo above.

Reproduction details

The published CLI reproduces the four-row pass with --generator fixture. Regenerating PR #4’s exact patch still needs the testbed harness plus --generator llm (or the testbed simulator) and may differ.

Open PR #4 on GitHub →
Public GitHub draft PR created from a passing Driftless migration

Try it locally

See the synchronization loop in under a minute.

The bundled demo shows a cheaper target failing the quality gate, a blocked analysis with --generator none, and a passing repair with --generator fixture. No provider key is required. It is separate from public testbed PR #4.

Four-row smoke demo: this proves installation, contract execution, gating, and a key-free pass/block loop. It does not establish production quality, statistical confidence, or provider behavior. Use representative data and --generator llm before shipping a real workflow.

Adopting an existing repository? driftless configure <workflow> --apply writes a reviewable draft and safely creates or appends root driftless.yml. Review the inferred contract, resolve any remaining placeholders, then run validate or init-ci. Follow the adoption guide →

✓ No API key ✓ Reproducible fixture ✓ Python 3.10+
Terminal
$ 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 $ driftless migrate -w support_classifier --to gpt-4o-mini --generator none # Expected: BLOCKED with a non-zero exit; continue below. $ driftless migrate -w support_classifier --to gpt-4o-mini --generator fixture # Expected: PASS — bundled known-good patch, still no API key. $ driftless report -w support_classifier $ driftless open-pr -w support_classifier # Dry run: no PR or issue is created without --create.

--generator none exits non-zero because the cheaper target fails the quality gate. --generator fixture applies the bundled known-good patch and can pass. Both save evidence for report and the dry-run open-pr preview.