duckadrift
ADR drift detection

The rubber duck that talks back.

GPU water live Warming up the water…

Sea floor

Start with what can be proven.

Tier 0 runs in GitHub Actions with no model and no API key. Turn on evidence-cited semantic checks when you're ready.

Add duckadrift to your workflow
name: duckadrift
on: [pull_request]

jobs:
  drift:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: Stephen551/duckadrift@v0

fetch-depth: 0 gives pull-request checks the history they need to find the merge base and enforce governed-path changes.

Install duckadrift Read the source

Below the waterline

Your architecture decisions are written down.

Is the code still keeping them?

A decision can stay written long after it stops being true.

The link breaks. The status changes. Governed code moves without the record. A premise disappears.

duckadrift reads the decision, then checks the repository it describes.

Tier 0 · deterministic

Facts can fail the build.

Seven checks catch drift that can be proven from the repository itself.

Broken references. Conflicting states. Stale records. Index drift. Governed code changed without an ADR-ACK.

No model. No API key. No network calls.

Tier 1 · semantic

Judgment shows its work.

Some drift isn't a missing file or a broken link.

Contradictions. Code that outgrew the decision. Decisions nobody recorded. The same argument returning under new names. Premises that no longer exist.

Every semantic finding must quote the documents it relies on. A finding that can't cite its source is discarded, and the discard is counted.

Public calibration corpus · human label: true

Four decisions. Four different subjects. One problem nobody solved.

S4 · Recurring revision

Four Accepted ADRs, each about something different: connector kerning, placement, height normalization, eye-body placement.

All four keep circling the same unresolved primitive: no build-time measure separates a connector bridge from a weld. Every one parks it. None resolves it.

Public calibration corpus · human label: true

One appliance. Two incompatible decisions.

S1 · Inter-record contradiction

ADR-0001 makes the product self-contained: all persistence in an embedded SQLite file, nothing listening on any port, no outbound connections.

ADR-0003, accepted three months later, makes an external PostgreSQL cluster the system of record.

Both are Accepted. Neither supersedes the other. A box that opens no connections cannot depend on a database cluster it connects to.

Calibration

Authority is measured, not assumed.

Every semantic finding routes through a published calibration built from human-labeled results. Each severity has its own precision floor.

calibrationloading…

The gate is already live. Channels open through data. No release, no hand-typed threshold.