adr
Architecture Decision Records (ADRs) for any repository, built for coding agents. The plugin tells agents why code is the way it is, stops them from undoing deliberate decisions, and turns the important ones into checks. Nothing in it assumes a language or framework.
What it does
| Skill | Invoke as | Purpose |
|---|---|---|
adr | automatic | Standing rules: format, status lifecycle, when to write an ADR, how agents read them, known-debt log, rationale honesty. |
init | /adr:init | Create or adopt the ADR folder, template, index, known-debt.md, and the CLAUDE.md/AGENTS.md pointer. Idempotent. |
distill | /adr:distill | Recover implicit decisions from code and git history, rank them, and triage each as accept, accident/tech debt, reject, or skip. Resumable. |
new | /adr:new | Record a decision from the conversation or diff, with the user confirming the decision and the why. Handles superseding. |
review | /adr:review | Check a diff or branch against accepted ADRs. Report only. |
Plus scripts/validate-adrs.py, a dependency-free Python script for
structural validation, and an optional, off-by-default Stop hook that
suggests /adr:new (see hooks/README.md).
Install
/plugin marketplace add BipBop-Labs/bipbop-skills
/plugin install adr@bipbop
Codex CLI:
codex plugin marketplace add BipBop-Labs/bipbop-skills --ref main
codex plugin add adr@bipbop
Update
/plugin marketplace update bipbop
/plugin update adr@bipbop
/reload-plugins
Codex CLI:
codex plugin marketplace upgrade bipbop
Typical workflow
/adr:initin the target repository. It createsdocs/adr/withREADME.md(index),template.md,known-debt.md, adds a short block toCLAUDE.mdorAGENTS.md, and offers to wire the validator into pre-commit or CI. If ADRs already exist elsewhere, it adopts them./adr:distillon an existing codebase. Candidates arrive five at a time with evidence, a clearly labelled guess at the rationale, and the alternatives apparently avoided. You accept, mark as debt, reject, or skip. State lives indocs/adr/.distill-state.json, so later runs do not re-ask and new code can be distilled incrementally./adr:newwhenever a change hits a trigger (new dependency, boundary, data model, public interface, hard-to-reverse or questionable choice)./adr:reviewbefore merging, to see which accepted decisions a diff touches, which changes need an ADR, and which known-debt items it fixes.
ADR format
docs/adr/NNNN-slug.md with YAML frontmatter:
---
id: ADR-0003
title: Outbound HTTP goes through one client
status: accepted # proposed | accepted | superseded | deprecated | rejected
date: 2026-10-02
deciders: [maria]
tags: [http, dependencies]
paths: [src/net/**]
supersedes: []
superseded_by: []
---
Sections: Context, Decision, Options considered, Consequences, Rationale
status (confirmed or unknown), Evidence. Full template in
skills/adr/templates/adr-template.md.
Rules: to change an accepted ADR, edit it and add a line to its ## History.
A new ADR supersedes it only when a different decision replaces it whole. A
@decision ADR-NNNN comment in code means read that ADR before touching the
spot. known-debt.md lists things that look deliberate but are not; agents
may fix those.
Validation script
python3 "$CLAUDE_PLUGIN_ROOT/scripts/validate-adrs.py" [--root .] [--adr-dir docs/adr] [--strict] [--fail-on-proposed] [--json] [--no-code-scan]
python3 "$CLAUDE_PLUGIN_ROOT/scripts/validate-adrs.py" --print-setup # pre-commit and CI snippets
Checks: required frontmatter and allowed statuses; unique, sequential
numbers matching filenames; index in sync with the folder; supersede links
resolving both ways; referenced paths still existing (warning); @decision
tags pointing to existing, non-superseded ADRs. With --fail-on-proposed,
an ADR still proposed is an error. Exit codes: 0 clean, 1 errors (or
warnings with --strict), 2 no ADR folder or bad usage.
It does not judge whether code complies with a decision. That is
/adr:review and per-decision checks from
skills/adr/references/enforcement-by-stack.md.
For CI, copy the script into the repository (/adr:init offers to) so the
job does not depend on a plugin cache path, and run it with
--strict --fail-on-proposed so an ADR nobody has accepted or rejected does
not merge. Leave --fail-on-proposed out of pre-commit hooks: drafting a
proposed ADR locally is normal.
Design notes
RESEARCH.md covers the format choice, existing tooling, prior Claude Code art, the enforcement table, and the evidence, including what is not proven.