Skip to content

Provider Drift

Provider Drift #12

name: Provider Drift
on:
workflow_dispatch:
inputs:
provider:
description: "Anchor provider to verify"
required: false
type: choice
default: all
options:
- all
- anthropic
- google
- openai
dry_run:
description: "Validate selection and guardrails without provider requests"
required: false
type: boolean
default: false
schedule:
- cron: "17 9 * * 2"
concurrency:
group: provider-drift-${{ github.ref }}
cancel-in-progress: false
permissions:
actions: read
contents: read
jobs:
verify:
name: Sparse live verification
runs-on: ubuntu-24.04
timeout-minutes: 15
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
steps:
- name: Checkout code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Setup Beam
uses: erlef/setup-beam@fc68ffb90438ef2936bbb3251622353b3dcb2f93 # v1.24.0
with:
otp-version: "29"
elixir-version: "1.20"
- name: Install dependencies
env:
MIX_ENV: test
run: mix deps.get
- name: Compile provider drift tooling
env:
MIX_ENV: test
run: mix compile --warnings-as-errors
- name: Run sparse provider drift verification
env:
MIX_ENV: test
DRIFT_PROVIDER: ${{ inputs.provider || 'all' }}
DRIFT_DRY_RUN: ${{ inputs.dry_run || false }}
run: |
set -euo pipefail
args=(--provider "$DRIFT_PROVIDER" --output-dir .artifacts/provider-drift)
if [ "$DRIFT_DRY_RUN" = "true" ]; then
args+=(--dry-run)
fi
mix req_llm.provider_drift "${args[@]}"
- name: Upload sanitized drift report
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: provider-drift-${{ github.run_id }}-${{ github.run_attempt }}
path: .artifacts/provider-drift
if-no-files-found: error
retention-days: 14