Ancora

Ancora links specs to tagged ExUnit tests and the production functions those tests call. It detects drift across git revisions without running the target project's code or tests.

Ancora is a successor inspired by spec_led_ex (Copyright (c) Mike Hostetler, MIT licensed).

Installation

Add Ancora to the development and test dependencies in mix.exs:

{:ancora, "~> 1.0.0-rc.1", only: [:dev, :test], runtime: false}

Then scaffold the spec workspace and inspect the next action:

mix deps.get
mix spec.init
mix spec.prime --base HEAD

Ancora requires Elixir 1.18 or later. The release candidate may change before 1.0.0, but the public parse API below will remain stable within the 1.x series.

Public API

Ancora's semver-stable public API has two functions:

Mix tasks are the supported command-line interface. Their --root option is an internal affordance for tooling and tests and is outside the semver commitment.

How checks work

Ancora reads source files and git objects. It loads bytecode from its own dependencies to look up exported functions. This is toolchain introspection, not project execution. Trusted dependencies may run their @on_load hooks when the tool loads them.

Tagged tests define which production functions belong to a subject. When those functions or calls change, edit the subject's requirements or scenarios in the same diff. Mechanical rewrites such as mix format --migrate still need an explicit acknowledgment when they change the derived call set.

CI

Run the gate against the target branch after fetching its remote ref:

spec:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: erlef/setup-beam@v1
- run: mix deps.get && mix spec.check --base origin/main

Migration

See docs/migration.md for the adoption checklist and the old-to-new finding code map.

License

MIT. Copyright (c) 2026 Manuel Zubieta. See LICENSE and NOTICE.