Record evidence for
AI-assisted development

evidtrail records scoped evidence, declared autonomy, and repository change signals— with assumptions and limits kept visible.

npm install -g @evidtrail/cli
View on GitHub
Terminal
$ evidtrail init
+ .evidtrail.json                  created — no prior
+ commit hook                installed
+ package.json prepare        created — evidtrail install-hooks --if-git
+ .github/workflows/evidtrail.yml  created — PR comment, minimal permissions
$ evidtrail doctor
✓ clone depth                 full history
✓ commit hook (this clone)  AI-Mode trailer will be stamped
Ready: every check passed.
$ evidtrail --since 90d
Collected 77 commits · coverage 100.0% (agent 52, automated 25, unknown 0)
Trend: fewer than two mature periods (30d window) — no comparison yet
Reports written to ./evidtrail-output/

Real output from this project's own repository. A young window says "no comparison yet" instead of inventing one.

Core Metrics

📊

Repository Change Signals

How often eligible files are touched again within fixed horizons. Too-recent files stay visible and outside the denominator; retouch is not presented as a defect.

⏱️

Quality Over Time

The repo compared with its own past — the comparator that still works once AI touches nearly every commit. Every period measured through the same window; periods too recent to judge are never compared.

⚖️

Autonomy, not the binary

Two orthogonal axes: what level of AI participated (autocomplete / assisted / agent) and how we know. Cohort tables render only where real evidence backs them — an assumption never becomes a table.

🎯

Declared provenance

The commit hook stamps a mode when EVIDTRAIL_MODE, a supported agent environment, or a team-configured default determines it. When evidtrail cannot know, it writes nothing — unknown remains honest.

💬

PR Comments

Post evidtrail reports directly on pull requests and merge requests. GitHub Actions and GitLab CI are supported; comments are explicit network operations that require a token.

🚀

CI/CD Ready

Use the documented workflow with full Git history and scoped token permissions. It runs on every PR and updates its own comment automatically.

Get Started

1

Install globally

npm install -g @evidtrail/cli
2

Navigate to your Git repo

cd /path/to/your/repo
3

Run analysis

evidtrail collect --since 30d && evidtrail analyze && evidtrail report

Supported AI Tools

Known tool and trailer signals can establish AI involvement. They do not, by themselves, prove an autonomy mode; absent evidence remains visible as unknown.

Claude Code
GitHub Copilot
ChatGPT
Cursor
Windsurf
Gemini
Codeium
+ Custom tools via .evidtrail.json

CI/CD Integration

One step in your workflow. The action runs evidtrail doctor first, so a shallow checkout is refused before it can produce a confidently wrong report.

.github/workflows/evidtrail.yml
name: evidtrail Analysis
on: [pull_request]
permissions:
  contents: read
  pull-requests: write
 
jobs:
  evidtrail:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
        with:
          fetch-depth: 0
      - uses: ceccode/evidtrail@v1
        with:
          comment: true
evidtrail PR comment on GitHub: one verdict line, every commit in this change set carries provenance, with a collapsed Details fold
What lands on the pull request when every commit carries provenance: one line, details folded. When commits lack provenance the line turns to ⚠️ and names them, with the one-line repair.

What evidtrail is — and is not

evidtrail does not infer productivity, defects, deployment, causality, capitalization, or developer performance from git history. It records what git can actually establish, with the limits kept visible.

Does evidtrail measure developer productivity or the ROI of AI coding tools?
No. It records provenance — who or what wrote a commit, and how that is known — and change signals — how often files are touched again within a fixed horizon. Nothing in git history can establish productivity or value, so evidtrail does not claim it.
How does it know a commit came from an AI agent, without anyone labelling commits?
A prepare-commit-msg hook, installed once per clone or automatically through a package.json prepare script, detects agent sessions (Claude Code, Cursor) from their environment and stamps an AI-Mode trailer. Tool co-author trailers are read as well. A commit with no signal stays unknown — it is never assumed to be human.
Why does it sometimes refuse to show a comparison?
Because the comparison would describe an assumption, not the repository. Cohort tables appear only where at least one commit carries real evidence. A configured prior can place commits in a cohort, but it never creates a table on its own, never raises coverage, and is always labelled assumed.
Why is the most recent month left out of the trend?
A period that ended yesterday has had one day to be reworked; one from last year has had a year. Compared raw, every report would find quality declining. Every period is measured through the same observation window, and only periods that have been over for the full window are compared.
Does it send code or commit data anywhere?
Collection, analysis and reporting are local and offline. Two commands use the network, both opt-in: fetch-prs reads pull request outcomes from the forge API, comment posts the report to a PR. Author identities can be redacted.
Wasn't this called AIDA Metrics?
Yes, until 1.1. The name collided with the marketing funnel and an opera, and its expansion — "AI Development Accounting" — promised the cost-and-value reading the tool refuses to make. Same tool, same numbers: @aida-dev/*, .aida.json, AIDA_MODE and the aida command keep working for one release and point at their new names.

Ready to make AI evidence auditable?

Start with the repository signals Git can support — and keep their limits visible.