adr-kit

agent
Security Audit
Warn
Health Warn
  • License — License: MIT
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Low visibility — Only 5 GitHub stars
Code Pass
  • Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Pass
  • Permissions — No dangerous permissions requested

No AI report is available for this listing yet.

SUMMARY

Drop-in ADR toolkit for AI coding agents (Claude Code, Cursor, Copilot, Codex). Skill + agent + instructions + template. MIT.

README.md

adr-kit

License: MIT
Release

Architecture decisions your AI coding agents actually follow.

Coding agent? Installing ADR Kit: read
INSTALL-AGENT.md and stop there: it is the complete
client-neutral runbook. Working in a project that already has ADR Kit: the
agent contract is the whole brief.

Your codebase is full of decisions: the database you migrated to, the layer
nothing may bypass, the framework you committed to, the pattern you
standardized on. Almost none of it is visible in the code. It lives in the
heads of the people who were there, and a coding agent has no head. It is
fast, confident, and starts every session with total amnesia. Left alone it
reintroduces the driver you dropped, bypasses the repository layer, and makes
new architectural decisions without telling anyone.

adr-kit makes architecture decisions executable. Architecture Decision
Records stop being documentation nobody re-reads and become guardrails that
run: the decisions relevant to the current task are retrieved and injected
while the agent works, the governing decision is delivered before a file is
edited, every commit is checked against declarative rules with file:line
citations, and a guardian watches for decisions that have drifted out of date.
One toolkit covers the whole lifecycle (capture, enforce, maintain, retire)
across Claude Code, OpenAI Codex, the standalone GitHub Copilot CLI, and
OpenCode.

For the agent, it removes the guessing. Instead of reading every ADR, or
none, it queries a generated index and gets a ranked, explained shortlist for
the task in front of it. It receives the binding decision as context at the
moment it writes the file, not as a review comment three days later. And it
gets a deterministic pass/fail at commit time that no amount of confident
prose can talk its way around.

For you, writing a decision down finally pays off the same week. The ADR
you record on Monday blocks the violation on Thursday without you being in the
room. Half-formed intent becomes a real decision record through a guided
interview that asks one evidence-backed question at a time. The guardian tells
you which decisions have gone stale, which were made but never recorded, and
which are ready to retire, so the decision log stays worth reading instead of
becoming another folder of dead markdown.

The engines are deterministic, stdlib-only Python 3.10+: no build step, no
service, no API key on any default path. LLM passes exist, are opt-in, cost
nothing until you enable them, and never run in a hook hot path.

image

Pre-1.0: functional and in daily use, but conventions may still evolve before v1.0.0. Pin a tag if you need stability across upgrades.

Audit posture: the 2026-07-18 source audit drove fail-closed enforcement, exact staged-snapshot handling, transaction-safe lifecycle/state updates, and cross-platform packaging fixes. ADR Kit remains a development guardrail, not a sandbox, branch-protection replacement, or sole merge control.

Start here

You are Start at
A human setting this up Install, then the lifecycle. Claude Code users: four commands and you are done.
A human evaluating it Why, What's new, Comparison, ROADMAP.md.
A coding agent installing ADR Kit INSTALL-AGENT.md and stop there. It is the complete client-neutral runbook for detection, preview, installation, initialization, and verification. Do not read the rest of this README first.
A coding agent working in a project that already has ADR Kit The agent contract directly below.
A maintainer cutting a release docs/RELEASING.md and /release-adr-kit.

Agent contract

Three rules cover almost everything an agent needs in an ADR Kit project.
Full reference: docs/README.md.

1. Find the decisions for a task by querying the index, not by reading the
set.

python bin/adr-context --format json "<task description>"

It queries the generated docs/adr/ADR-INDEX.json instead of opening every
ADR, and returns explainable matches from lifecycle, scope, paths, components,
symbols, topics, and relationships. Open only the returned Markdown ADRs
before applying a constraint: the Markdown is the authority, the index is
the lookup. Regenerate with python bin/adr-index docs/adr and verify with
python bin/adr-index --check docs/adr. Never hand-edit either generated
index. See Selective ADR context.

2. Treat an injected decision as binding. When an [adr-inject] ADR-NNN ... governs <file> block arrives before an edit, the quoted Decision is a
constraint on that edit, not background reading. Accepted ADRs govern;
Proposed ADRs are advisory and labelled as such; historical ADRs are opt-in.

3. Never invent an ADR format. Run python bin/adr profiles --format json
and accept only a returned profile id with its returned template path. MADR
is the preferred default; nygard and canonical are the other shipped
profiles. Never synthesize an unregistered template.

What's new

These are the releases that change what ADR Kit does; full detail, including the
patch releases, is in CHANGELOG.md.

Version What landed Why it matters
0.54.0 Automatic interactive ADR grilling (ADR-041) hands one unfinished Proposed decision to the native grill workflow at the next user-visible prompt. /adr-kit:upgrade materializes grill.auto_start: true while preserving explicit opt-outs. Incomplete decisions reach the human while their implementation context is still available, without starting interviews in CI, pre-commit, background, or unattended lifecycle paths.
0.52.0 Native OpenCode support through a separate TypeScript plugin, backed by the shared deterministic engines and MCP server (ADR-039). The certified Claude Code, Codex, and Copilot CLI registry and release gate remain unchanged. OpenCode gets its documented native configuration, skills, commands, context, compaction, edit, shell, and MCP integration without weakening the existing certification boundary.
0.48.0 Retrieval is lexical scoring over the generated index plus one-hop graph neighbours, and the LLM judge runs on the CLI you are already signed in to (ADR-036): the vector subsystem, bin/adr-embed and the openrouter/ollama/openai backends are gone, and eight retired config keys now fail validation by name. The guardian records a verdict per ADR and prints it as the sweep lands (ADR-037). Two subsystems were carrying their own credentials, install paths and failure modes to answer questions the index already answers. A sweep is also long enough to be interrupted, so a per-sweep timestamp discarded everything it had established; per-ADR verdicts keep it.
0.44.0 /adr-kit:audit answers "are we still on course?" by linting the decisions and judging the code in one run, over a diff or the whole codebase (the init scanner is now bin/adr-discover). A local precomputed vector layer for retrieval (ADR-018, retired in 0.48.0 by ADR-036), adr relate writing a cross-reference on both sides at once, adr answer keeping a grilling question with its answer, a configurable signer, /adr-kit:settings, and a pre-PR branch guard. A clean judge over vague ADRs proves nothing, and a sharp ADR set nobody checks the code against is documentation rather than governance. Whole-codebase mode reaches files no recent diff touched, which is where a rule added after the code was written has never applied.
0.40.0 Index-first selective context: ADR-INDEX.json schema v2 is the local query database for the CLI, MCP, hooks, status, doctor, and guardian. ADRs can carry retrieval metadata (topics, aliases, components, symbols, scope) and a compact Must / Must Not / Exceptions / Verification Decision Contract. Project retrieval probes report expected inclusions and exclusions. Retrieval stops scaling with the size of your ADR set, and every match explains itself. Lifecycle context is now authority-aware: Accepted governs, Proposed is advisory, historical is opt-in.
0.39.0 packaging/version-sites.json declares every version-bearing file; scripts/bump-version.py X.Y.Z writes them all in one command (ADR-013). Releasing 0.38.0 took nine hand-edits over four discovery rounds. It is now one command plus a --check drift gate.
0.38.0 docs/RELEASING.md as the enforced runbook for all three marketplaces, a version-consistency gate, a tag-triggered publish workflow, and the repo-level /release-adr-kit command (ADR-012). One tag now publishes Claude Code, Codex, and Copilot consistently instead of drifting apart.
0.37.0 ADR Grilling across the full lifecycle: /adr-kit:grill completes Proposed ADRs one evidence-backed human question at a time and reconstructs decisions from PRs, ranges, chat logs, and documents. Deterministic bin/adr-readiness separates mechanical defects from unresolved human decisions (ADR-011). The gap between "we decided something" and "there is a usable ADR" was where decision logs died. Source material is evidence; it is never acceptance authority.
0.35.0-0.36.0 Native certification for all three CLI clients through one outcome contract and capability registry (ADR-010), the generated client support matrix, a normalized fail-open hook runtime with measured Windows latency, adr-doctor fast and deep modes, and quiet-by-default hooks across all three clients. The matrix distinguishes simulated contract coverage from native certification, per client and per OS, instead of claiming blanket support. Hooks stopped narrating themselves; only actionable output remains.
0.34.0 Selectable ADR formats: MADR default, Nygard and canonical selectable (ADR-005); the deterministic JSON ADR graph (ADR-007); Codex CLI integration and the multi-CLI installer; audit hardening. Tools map headings to shared semantic roles, so no existing ADR set has to be rewritten to be governed.
0.42.0 Single-pass repository scans in adr-lint and adr-retire with committed 2-second latency budgets and regression guards (tests/fixtures/cli/latency-corpus.json); nested checkouts (agent worktrees, vendored clones) are never scanned; a hardened SessionStart hook timeout; a daily maindev merge-back drift gate and a release payload path-leak gate. adr-retire was linear in ADR count (5.2 s at 100 ADRs, now 0.6 s flat). No deterministic user-facing path exceeds two seconds, and the budget is enforced by tests.
0.41.0 One shared status/enforcement reader across adr-index, adr-watch, adr-judge, adr-lint, adr-retire, and adr-status; snapshot caching and memoized format detection on the commit and index hot paths. Two forked regexes meant the same ADR could read Accepted to one tool and Unknown to another. One reader, one answer.

Upgrading from before 0.40.0: update ADR Kit, run
python bin/adr-index docs/adr, then add retrieval probes before enabling
strict index or strict completeness policy. Projects without retrieval
metadata keep working; completeness is advisory by default, and no ADR body
profile or lifecycle transition changed.

Why

ADRs are the established answer: short markdown files in your repo that record the problem, the decision, the alternatives rejected, and the consequences accepted. What was always missing is enforcement. A decision nobody re-reads is a decision nobody follows.

adr-kit closes that loop three times over:

  1. Before the agent edits: the decisions relevant to the task are ranked and injected as context.
  2. While the agent edits: a hook nudges it the moment a change touches files governed by a decision.
  3. When the work lands: declarative rules from each ADR are checked against the diff at commit time and in CI, deterministically and key-free.

And because decisions age, a periodic guardian flags drift between code and decisions, retirement candidates, and decisions that were made but never recorded.

One engine, three certified CLIs plus OpenCode

ADR Kit ships separate integration payloads for Claude Code CLI, OpenAI Codex
CLI, and the standalone GitHub Copilot CLI. All three carry the same 15
workflows, the same deterministic engines, the same key-free five-tool MCP
server, and English skill metadata; only the native event surface differs. A
separate native OpenCode plugin uses the same engines and adds OpenCode-native
config, skills, commands, hooks, compaction context, and MCP registration. The
generated client support matrix remains the
three-client certification view; OpenCode evidence and boundaries live in
docs/clients/opencode.md. Per-client detail lives
in docs/clients/.

Lifecycle behavior is quiet-by-default: routine successful hooks print
nothing, relevant ADR context still reaches the agent, and actionable warnings
stay visible. Where a client has no native pre-edit event, deterministic
pre-commit enforcement remains the backstop, so no client is silently less
governed than another.

Install

Coding agents should follow INSTALL-AGENT.md. The sections
below are the human-oriented quick reference.

Install every detected CLI

From a cloned checkout:

python scripts/install-agent-envs.py --detect-only
python scripts/install-agent-envs.py --project-root /path/to/project

The installer verifies real executable and version output for claude, codex,
and the standalone copilot CLI. It installs ADR Kit through every detected
client's native plugin API on Windows, macOS, and Linux. Before touching a
client, it validates the complete source and the Python 3.10+ interpreter that
is running the installer. It prepares a persistent user-local marketplace with
that exact interpreter embedded in the Codex and Copilot MCP configuration,
then completes a real MCP initialize/tools-list smoke test.
Use --clients codex,copilot, --dry-run, or --source /path/to/adr-kit for
explicit and automated installs. The post-install format scan is read-only:
it reports deterministic preview commands or guided migration steps and never
rewrites an ADR.

Register ADR Kit in a project

Preview and apply the shared project guidance separately from native plugin
registration. This is also the enforcement setup for OpenCode projects:

python scripts/setup-project.py --project-root /path/to/project --dry-run
python scripts/setup-project.py --project-root /path/to/project
python scripts/settings.py --project-root /path/to/project show

Setup writes generated .adr-kit/ADR-guide.md, adds independent owned blocks
to AGENTS.md, CLAUDE.md, and .github/copilot-instructions.md, and installs
the deterministic pre-commit gate by default. It preserves all bytes outside
the marker blocks. An existing generated guide is backed up before replacement;
project-specific guidance belongs in user-owned
.adr-kit/ADR-guide.local.md.

Settings use global defaults with per-project overrides. The effective output
shows the value and source of every option. Disable or re-enable pre-commit,
for example:

python scripts/settings.py --project-root /path/to/project set pre_commit.enabled false
python scripts/setup-project.py --project-root /path/to/project
python scripts/settings.py --project-root /path/to/project set pre_commit.enabled true
python scripts/setup-project.py --project-root /path/to/project

Settings also cover verified stable updates, trigger/frequency, offline and
pinned operation, per-client opt-outs, doctor repair/check-only policy, and
local versus paid/cloud judgment. No provider or model tag is a fallback
default. --probe-models performs a bounded local identity check without
invoking a model; zero or multiple candidates remain visibly unavailable or
ambiguous. Paid/cloud judgment remains explicit opt-in, and no model runs in a
hook hot path.

Claude Code

/plugin marketplace add rvdbreemen/adr-kit
/plugin install adr-kit@rvdbreemen-adr-kit
/reload-plugins
/adr-kit:init

The first three install the plugin. The fourth is the one-shot per-project
bootstrap: it wires a marker-owned pointer into CLAUDE.md (the shared guide
lands at .adr-kit/ADR-guide.md), audits your existing codebase for decisions
already in effect
(the database you chose, the framework you committed to,
the patterns you standardized on), walks you through recording them as
Accepted ADRs in batches, and installs the pre-commit enforcement hook.
Idempotent: safe to re-run.

That is the whole setup. From the next session on, your agent knows the decisions, gets nudged when it touches them, and receives a local check when it commits.

Prefer a lighter start? Run scripts/setup-project.py --dry-run, then apply
it. This installs the shared guide, three independent managed instruction
blocks, and (by default) pre-commit without running the architecture audit.
Disable pre-commit first through adr-kit:settings when guidance-only setup is
required.

The Claude integration keeps only its manifest under .claude-plugin/.
Plugin-root skills/, hooks/hooks.json, .mcp.json, agents, and bundled
executables provide 15 workflows, six bounded hooks, and the five-tool MCP
server.

OpenAI Codex

codex plugin marketplace add rvdbreemen/adr-kit
codex plugin add adr-kit@rvdbreemen-adr-kit-codex
codex mcp list

Codex does not use Claude's /adr-kit:... slash-command syntax. ADR Kit
workflows appear as namespaced skills: open /skills, or invoke
$adr-kit:context, $adr-kit:judge, $adr-kit:lint, and the other skills.
The separate codex/ distribution contains all 15 workflows and the key-free
five-tool MCP server. See the official Codex skills
and plugin contracts.

Standalone GitHub Copilot CLI

copilot plugin marketplace add rvdbreemen/adr-kit
copilot plugin install adr-kit@rvdbreemen-adr-kit-copilot
copilot plugin list
copilot mcp list

This targets @github/copilot invoked as copilot, not gh copilot or VS
Code agent mode. The separate copilot/ distribution follows GitHub's
Copilot plugin contract
and installs 15 skills plus the same key-free MCP server.
Open /skills inside Copilot CLI to discover ADR Kit workflows. Its lower-camel
hook package supplies proactive session/task context and PostToolUse; pre-commit
remains the edit-enforcement backstop.

If an older installation reports that adr-mcp is missing under the active
project (for example <project>/bin/adr-mcp), refresh both marketplace and
plugin, then reload MCP servers:

copilot plugin marketplace update rvdbreemen-adr-kit-copilot
copilot plugin update adr-kit
copilot mcp get adr-kit

In copilot mcp get adr-kit, the executable argument must be
${PLUGIN_ROOT}/bin/adr-mcp; cwd remains . so ADR Kit serves the active
project. Start a new Copilot session or run /mcp reload in the current one.
Agents should use these native update commands instead of editing the installed
.mcp.json or replacing ${PLUGIN_ROOT} with a machine-specific path.

OpenCode

OpenCode is supported through a separate native plugin package. It uses the
same deterministic Python engines and five-tool MCP server as the certified
clients, while adding OpenCode-native configuration, skills, commands, context,
compaction, edit, shell, and session hooks.

From the ADR Kit checkout, the repository-local opencode.json is already
configured:

{
  "$schema": "https://opencode.ai/config.json",
  "plugin": ["./"]
}

For another project, use the published package for v0.52.0:

{
  "$schema": "https://opencode.ai/config.json",
  "plugin": ["@rvdbreemen/[email protected]"]
}

Future versions are staged automatically by the release workflow
(.github/workflows/release-publish.yml) and require maintainer approval before
they become public. Until a future version is approved, point OpenCode at a
reviewed checkout:

{
  "$schema": "https://opencode.ai/config.json",
  "plugin": [
    ["/absolute/path/to/adr-kit", {"python": "/absolute/path/to/python"}]
  ]
}

The plugin adds only missing configuration entries and preserves user-owned
skills, instructions, commands, references, and MCP servers. It delegates hook
work to hooks/adr-hook.py; normal context is advisory and fail-open. The
deterministic pre-commit and CI judge remain the enforcement floor:

python scripts/setup-project.py --project-root /path/to/project

OpenCode is intentionally outside clients/capabilities.json, the generated
three-client support matrix, and the three-client native certification gate.
See OpenCode support for options, manual MCP
registration, and the tested support boundary.

Portable Agent Skills and MCP clients

INSTALL.md documents the native plugin layouts and portable
fallbacks.

On top of the native installs, any compatible local stdio MCP client can
connect to the bundled MCP server for enforcement
and context tools.

The CLI engines under bin/ require Python 3.10+, with no pip install. The
automatic installer embeds the absolute interpreter that launched it, so
Windows python.exe and Unix python3-only installations need no manual MCP
manifest edit. See INSTALL.md.

Upgrading

Three layers, each with a clear path:

  • The plugin itself: updates through the normal Claude Code plugin update flow. The engines (judge, guardian, context ranker) always resolve the newest installed version automatically, so hooks you installed earlier keep running current code without any action.
  • Copied artifacts (the git pre-commit wrapper, the project-scoped settings entry, the guide file): these freeze at install time by nature. Since v0.27.0 they carry version stamps, and the guardian tells you at session start when one lags the installed plugin (wrapper: ... STALE). Run /adr-kit:upgrade and they are refreshed idempotently; the same command still handles the legacy v0.11 to v0.12 footprint migration. You can inspect the state any time with bin/adr-guardian artifacts.
  • Existing ADR sets: MADR and Nygard are first-class selectable profiles,
    and the older adr-kit canonical profile remains valid without rewriting.
    bin/adr-migrate --plan docs/adr detects metadata/filename upgrades and
    common external formats without writing. It prints deterministic dry-run
    commands where safe and guided migration instructions otherwise. Preview
    retrieval metadata and Decision Contract candidates separately with
    bin/adr-migrate --suggest-retrieval --dry-run docs/adr; it never writes.

The lifecycle: capture, guard, maintain

Capture decisions (and stop rationalizing them away)

  • /adr-kit:adr loads the full authoring guide. Its two signature disciplines, borrowed and battle-tested from earlier skills (see Credits):
    • Anti-rationalization guards: a table of the excuses agents and humans use to skip writing an ADR ("it is obvious", "I will document it later", "the code speaks for itself"), each with a counter-argument. Fires before the decision goes unrecorded.
    • Four verification gates: Completeness, Evidence, Clarity, Consistency. An ADR cannot flip from Proposed to Accepted until it passes all four, and a reviewer can block on a single named gate ("fails Evidence, add measurements").
  • /adr-kit:grill turns incomplete knowledge into a useful decision record.
    It reads repository facts first, labels claims as observed, human-stated,
    inferred, or unknown, and asks one unresolved decision question at a time.
    It can complete an existing Proposed ADR, reconstruct a decision from a PR,
    git range, chat log, or document, and revalidate an older decision. Source
    material is evidence, never acceptance authority.
  • adr-audit readiness is the deterministic companion to grilling. It
    classifies a record, separates mechanical fixes from human decisions,
    resolves explicit implementation links, and emits stable human, JSON, or
    GitHub output without invoking a model or changing lifecycle state.
    See the ADR Grilling user guide for complete
    subject, reconstruction, resume, queue, acceptance, and CI examples.
  • adr-generator agent scaffolds the ADR for you: decision tree for "does this need an ADR?", a proposed ## Enforcement block when the decision has a code surface, and a post-write quality check.
  • /adr-kit:init's audit mines an existing codebase for decisions already in effect, so you start with a real decision log instead of an empty directory.
  • /adr-kit:review audits a finished branch or PR: it enforces the existing ADRs against the committed range diff and, crucially, hunts for new decisions the branch introduced but never recorded, reading both the diff and the stated intent (commit messages, PR description), because decisions are often confessed in prose while the diff looks like plumbing. Found candidates are deduped against your existing set and drafted as Proposed, never auto-accepted.
  • bin/adr-suggest (on by default) runs the same missing-decision detector per commit and prints a one-line nudge. It never blocks. Switch it off with suggest.enabled: false per project, or ADR_KIT_SUGGEST_DISABLE=1 for one run.

Guard the agent while it works

  • Context lookup (/adr-kit:context, bin/adr-context): give it a task plus optional paths, components, symbols, topics, status, and authority filters. The shared schema-v2 index engine returns a bounded, explainable shortlist without scanning every Markdown ADR. Historical records are excluded unless requested; governing Accepted and advisory Proposed records remain distinct. Open each returned source ADR before applying it. See Selective ADR context.

  • In-flight nudges (bin/adr-watch, v0.24.0+): a PostToolUse hook fires after every Edit/Write in Claude Code and checks the touched file against the Accepted ADRs (Enforcement path globs first, keyword relevance second):

    [adr-watch] ADR-007 (no direct DB calls outside repository layer) may apply to src/db/foo.py
    

    Deterministic, key-free, under 100ms, never blocks, and a per-session cooldown keeps it from nagging. This closes the gap between session-start context and commit-time enforcement: the agent is corrected while the file is still open.

  • Edit-tier injection (bin/adr-watch --pre-edit, v0.31.0+): a PreToolUse hook fires before every Edit/Write and injects the top-ranked governing ADR's ## Decision text (bounded to a token budget), so the agent honours the decision as it writes, not after. The PostToolUse nudge above stays as a confirmation backstop. Same deterministic matcher, key-free, exits 0. Formalised in ADR-004.

  • Decision indexes (bin/adr-index): generates two deterministic, timestamp-free views from the same format-aware records. docs/adr/ADR-INDEX.md is the compact one-row-per-ADR session map imported by CLAUDE.md; schema-v2 docs/adr/ADR-INDEX.json is the actual selective-context query database, with source fingerprints, retrieval metadata, decision contracts, and sorted relationship edges. Markdown ADRs remain authoritative.

  • Commit-time enforcement (bin/adr-judge + pre-commit hook): every ADR can carry a fenced JSON ## Enforcement block with declarative rules (forbid_pattern, forbid_import, require_pattern, each optionally scoped by path_glob). On every git commit the hook runs those rules against the staged diff with file:line citations. Fast, deterministic, no LLM, no API key. ADRs whose rules are too nuanced for regex get a model-reviewed pass as well: llm_judge defaults to true, so a block that says nothing about it opts in, and only an explicit false opts out. Cost is bounded by scope rather than by the flag — an ADR is judged only when the diff touches a file matching its rules' path_glob set, so a commit outside every scope makes no model call at all. A block with no rules, or a rule without a glob, has no boundary to narrow with and is judged on every commit; prefer marking such a decision as having no code surface. Upgrading an existing project? bin/adr-migrate --enable-llm-judge --dry-run shows exactly what would change, and /adr-kit:upgrade asks before applying it.

  • PR-time enforcement in CI: the same judge can run as a composite GitHub Action or through the pre-commit framework, giving local and CI workflows the same deterministic rule set. See CI integration and the audit notice above for current limitations.

  • Audited escape hatch: hotfix has to land despite a FAIL? ADR_KIT_OVERRIDE="ADR-003: hotfix for incident 42" git commit ... downgrades that one ADR's violations to loud warnings, refuses an empty reason, logs the override locally, and pairs with an ADR-Override: commit trailer convention you can reconcile later with adr-judge --audit-overrides. Guardrails with a paper trail instead of --no-verify folklore.

Maintain the decision log (decisions age; the kit notices)

  • The Guardian (bin/adr-guardian, /adr-kit:guardian): a session-start staleness detector with two tiers. The cheap tier (daily, free) checks for code drift against Enforcement rules, retirement candidates, lint health, and refreshes a bounded Proposed-ADR work queue. SessionStart reads only that local 24-hour cache and offers at most three next actions; it never scans or starts an interview in the hook. The LLM tier (bi-weekly, asks before spending) hunts for missing ADRs and runs the full model-reviewed audit. Findings get mixed responses by type: drift is surfaced loudly with file:line, missing decisions are offered for authoring, stale ADRs get a retirement draft for review. Never runs in the background, never spends without asking.
    • Team mode (v0.22.0+): a weekly CI cron sweep maintains a single "ADR guardian audit" tracking issue (created on findings, updated, closed when clean) so the whole team sees ADR health, not just whoever opened a session today. Copy templates/github-workflows/adr-guardian-audit.yml into your repo.
    • Trend history (v0.29.0+): every sweep appends to a 52-entry trend log, and the nudge shows the delta: trend: drift 2 -> 0, retire 1 -> 2, coverage 40% -> 45%. A KPI with memory, not a snapshot.
  • Health dashboard (adr-audit status): totals, status breakdown, average age, enforcement health, retirement candidates, retrieval probe results, Accepted-binding metadata completeness, and the Enforcement coverage percentage of your Accepted ADRs. JSON, markdown, or table.
  • Quality scoring (adr-audit quality): grades every ADR A to D across the four gates (Completeness 40%, Evidence 20%, Clarity 20%, Consistency 20%), with per-gate issue codes. Exits 1 below grade B, so you can gate CI on ADR quality.
  • Generated index refresh (bin/adr-index docs/adr/): atomically rebuilds the sentinel-owned docs/adr/README.md block plus ADR-INDEX.md and ADR-INDEX.json. --check exits non-zero when any generated view is missing or stale, or duplicate ADR ids exist. Use --format graph --adr-dir docs/adr to inspect the graph without writing.
  • Local doctor (adr-audit doctor): fast mode checks ADR/index state, retrieval probes and metadata completeness, settings, generated artifacts, managed guidance, Claude/Codex/Copilot identity, MCP launchers, and cached model health without login or model invocation. Probe failures block; metadata completeness is advisory unless configured strict. Default mode repairs only deterministic ADR Kit-owned drift; --check is read-only, --fix permits backed-up managed rewrites, and --deep adds bounded native, MCP, and local-model probes. See troubleshooting.
  • Lifecycle commands (bin/adr, v0.32.0+): local propose, accept, supersede, reject, and document commands update frontmatter, the Status section, append-only Status History, reciprocal supersession links, and then refresh the generated README index.
  • After-the-fact acceptance (bin/adr document + bin/adr accept --auto): mark already-shipped behavior with documents_shipped:true and local verified_in pointers, then verify strict lint, quality, and human readiness. The default assist mode reports eligibility without mutating; acceptance requires --confirm after the engineer reviews the packet. Existing projects that intentionally require the legacy automatic transition can explicitly configure lifecycle.auto_accept.mode: "auto".
  • Retirement audit (/adr-kit:retire, bin/adr-retire): ranks Accepted ADRs for retirement using four deterministic signals (status age, technology removal, supersession, policy drift). Read-only; a recommendation always needs a human.
  • Dependency graph (/adr-kit:related, bin/adr-related): who does ADR-007 point at, and who points back? Outbound and inbound edges per declared reference kind, with dangling links flagged. The same normalized edges are available repository-wide in ADR-INDEX.json.
  • Guided supersession (/adr-kit:supersede): replace a decision without rewriting history. The skill shows the dependency graph first, drafts the successor as Proposed, and asks before changing lifecycle state. The lifecycle CLI enforces legal transitions and all acceptance gates, rejects competing chains, and updates both records plus generated indexes in one rollback-safe transaction.
  • Team-safe numbering (bin/adr-renumber, v0.23.0+): two branches both claim ADR-043, both pass CI in isolation, the collision appears after merge. The lint gate fails the duplicate with both files named, and adr-renumber moves one to a free number, dry-run first, updating every cross-reference in the set (and never touching ADR-0430 when you renumber ADR-043).
  • Lint (/adr-kit:lint, bin/adr-lint): validates every ADR against the gates with file:line citations and three result tiers (PASS, ADVISORY, FAIL). Every run also emits read-only migration notices for supported legacy files, Y-Statements, Tyree/Akerman records, arc42 decision sections, hybrids, and unknown ADR shapes. It provides an exact deterministic preview when safe and guided review otherwise; it never migrates automatically. The CLI form is deterministic and CI-ready; --strict enables canonical frontmatter validation, local verified_in evidence resolution, reciprocal supersession checks, and binding gate lookup for CI. The skill form adds model judgement on the Evidence and Clarity gates.

MCP server: bin/adr-mcp

A deliberately thin MCP server (stdio, newline-delimited JSON-RPC 2.0, Python
stdlib only, zero dependencies) that exposes the guardrails to Claude Code,
OpenAI Codex, GitHub Copilot CLI, or another compatible local stdio MCP
client. Seven tools, all key-free:

Tool Arguments Wraps
adr_context query, limit?, paths?, components?, symbols?, topics?, statuses?, authorities?, history?, strict_index?, min_score? shared schema-v2 index query
adr_judge diff (string) adr-judge (declarative pass only)
adr_status none adr-status --format json
adr_quality adr_id? (string) adr-quality --format json per ADR
adr_readiness adr_id?, all_proposed?, changed_paths?, source_text?, today? shared read-only readiness model
adr_lint strict? (boolean) adr-lint --format json
adr_related adr_id (string) adr-related --format json
# Claude Code
claude mcp add adr-kit -- python /path/to/adr-kit/bin/adr-mcp --root "$(pwd)"

For another stdio client, place the following in its MCP configuration:

{
  "mcpServers": {
    "adr-kit": {
      "command": "python",
      "args": ["/path/to/adr-kit/bin/adr-mcp", "--root", "/path/to/your/project"]
    }
  }
}

Why only seven tools? Contrast is the feature: adr-kit ships the smallest
surface that carries the guardrails and readiness facts, and nothing that needs
an API key. ADR-040 records the admission criterion — read-only, deterministic
and key-free, agent-query-shaped, and covering a development-cycle step no
exposed tool already covers. Grilling itself stays in the client session so an
engineer or architect remains part of the decision.

Slash commands

/adr and /adr-kit:adr invoke the same skill; the prefix form is canonical.

Command Type Auto-invocable When to use
/adr [title] knowledge / guide yes Author or review an ADR: anti-rationalization guards, four gates, supersession workflow.
/adr-kit:grill [target] guided decision interview yes Complete a Proposed ADR, reconstruct one from a PR/range/source, or revalidate an existing decision; asks one evidence-backed question at a time.
/adr-kit:setup one entry point, four modes no Register (default): stub plus guide, idempotent. adopt: codebase audit to Accepted ADRs plus hooks. hooks: the pre-commit gate alone. upgrade: refresh copied artifacts.
/adr-kit:init mode alias no The adopt mode of /adr-kit:setup, kept as its own name.
/adr-kit:context [topic] read-only lookup yes Load the 3 to 5 most relevant ADRs before implementing; verify lifecycle status in the source ADR.
/adr-kit:judge deliberate check yes Interactively review a staged diff against the ADRs, including the LLM pass for llm_judge: true ADRs, with three resolution paths per violation.
/adr-kit:audit deliberate check yes Are we still on course? Lints the decisions and judges the code in one run, over a diff or the whole codebase. Separate exit codes for an ADR-quality failure and a code violation. Read-only.
/adr-kit:review [base-ref] deliberate check yes Audit a branch/PR range: enforce ADRs on the committed diff, then discover undocumented decisions from diff plus stated intent and draft them as Proposed.
/adr-kit:guardian [cheap|llm|all] health sweep yes Run the due guardian tier(s); LLM tier asks before spending unless project configuration explicitly enables autorun.
/adr-kit:lint [path] deliberate check no Validate ADRs against the four gates; PASS / ADVISORY / FAIL with citations. Read-only.
/adr-kit:related [ADR-NNN] deliberate check yes Dependency graph for one ADR: inbound and outbound edges, dangling refs flagged. Read-only.
/adr-kit:supersede [ADR-NNN] guided write no Replace a decision: graph first, Proposed draft, approval-gated status flip, verified chain.
/adr-kit:retire [path] deliberate check no Rank Accepted ADRs for retirement on four deterministic signals. Read-only.
/adr-kit:migrate [path] guided rewrite no Add invariant metadata or convert between MADR, Nygard, and canonical profiles. Preview, then confirm.
/adr-kit:settings guided write no One surface for every knob: shows each setting, its current value, and where that value came from (default, project file, machine-local file, or environment).
/adr-kit:install-hooks mode alias no The hooks mode of /adr-kit:setup: install or remove the pre-commit gate.
/adr-kit:upgrade mode alias no The upgrade mode of /adr-kit:setup: refresh stale copied artifacts; also the legacy v0.11 to v0.12 migration.

The Auto-invocable column reflects the shipped skill metadata. Mutating skills and several deliberate read-only commands set disable-model-invocation: true; judge, review, and guardian currently do not. Model invocation does not by itself authorize file mutation, and cost-bearing guardian work still follows its confirmation/configuration rules.

ADR conventions

  • Filename: ADR-XXX-kebab-case-title.md, 3-digit zero-padded, in docs/adr/.
  • Heading: # ADR-XXX Title.
  • Body profile: MADR is the default. Nygard and the legacy canonical
    adr-kit profile are selectable. Tools map their headings to shared semantic
    roles instead of assuming one spelling.
  • Status values: Proposed, Accepted, Deprecated, Superseded by ADR-YYY, Amended by ADR-YYY.
  • Status history: an append-only YAML block records every transition (date, status, changed_by, reason, changed_via); the lint audit gate validates chronology and agreement with ## Status.
  • Canonical frontmatter: bin/adr-migrate can add a local metadata block above legacy ADR prose without changing the body. The schema is schemas/adr-frontmatter.schema.json and carries the fields agents need for higher-quality local recall:
    • id, title, status, date: the stable identity and lifecycle state.
    • binding, gate: whether the decision constrains future work and which consuming-repo gate proves it.
    • documents_shipped, verified_in: evidence for after-the-fact ADRs that document already-shipped behavior.
    • supersedes, superseded_by: lifecycle links that tools can check for reciprocity.
    • format: optional per-file madr, nygard, or canonical
      discriminator; legacy files are detected by headings.

Create the next Proposed record with:

python bin/adr profiles
python bin/adr new "Short imperative title" --adr-dir docs/adr
python bin/adr new "Concise Nygard record" --profile nygard --adr-dir docs/adr

Then finish the decision deliberately:

/adr-kit:grill ADR-NNN

The grill loop records each answer, leaves unresolved items under
## Open Questions, and ends with an acceptance packet. Only an explicit
same-session yes authorizes the lifecycle command:

python bin/adr accept ADR-NNN --changed-by "<engineer>" --reason "<decision>"

If the session stops early, the valid Proposed ADR and
/adr-kit:grill ADR-NNN are the resumable state. A PR, commit, chat log, or
source document can supply evidence but can never imply acceptance.

The strict filename contract remains uppercase ADR- plus a three-digit
number. Existing canonical records remain valid. adr profiles is the
authoritative pre-made profile catalog: each entry includes its installed
template path and availability. If a user selects a non-default format, use
only an id from that catalog. A profile cannot be selected merely by adding an
arbitrarily named template file.

Choose a profile by how much authoring structure the team wants:

Profile Best fit Trade-off
madr (default) Agent-assisted decisions needing explicit drivers, options, outcome, confirmation, and pros/cons Most complete, but longer to author
nygard Compact human-written records centered on context, decision, and consequences Faster to scan, with adr-kit extension sections required for deterministic gates
canonical Existing adr-kit repositories and the pre-v0.34 section layout Maximum backward compatibility, with less explicit decision guidance than MADR

Why MADR is the default

MADR is the default because it is the most agent-friendly of the commonly used
lightweight ADR formats, not because adr-kit claims it has the largest global
usage. No authoritative format census exists. This is an agent-reliability
choice. In adr-kit's
weighted evaluation, MADR scored
4.52/5: its explicit problem, drivers, options, outcome, pros/cons, and
confirmation slots reduce how much an agent must infer from free-form prose.
Nygard remains selectable because it has the strongest concise-format and
public-tooling signal. The canonical profile remains selectable so existing
adr-kit repositories never need a forced rewrite. The complete rationale and
compatibility decision are recorded in
ADR-005.

All three retain the same lifecycle metadata, status history, relationships,
references, and Enforcement contract.

Configuration

All configuration lives in one optional file: docs/adr/.adr-kit.json (annotated sample: examples/.adr-kit.sample.json, schema: schemas/adr-kit-config.schema.json). Everything has safe defaults; you only add what you want to change.

Lint policy: strict on new, advisory on legacy

{
  "strict_from": "ADR-042",
  "ignore": ["ADR-001", "ADR-007"],
  "severity": {
    "completeness": "advisory_before_strict_from",
    "audit": "always_strict",
    "evidence": "advisory_before_strict_from",
    "clarity": "always_advisory",
    "consistency": "always_strict"
  },
  "template": {
    "profile": "madr"
  }
}
  • strict_from: first ADR id on which the gates are enforced strictly; older ADRs lint in advisory mode.
  • severity: per-gate override (always_strict, always_advisory, advisory_before_strict_from). Audit and consistency stay strict by default: broken status chains and duplicate numbers are real bugs regardless of age.
  • template.profile: operational creation default: madr (default),
    nygard, or canonical. These are the shipped profile catalog; --profile
    overrides one adr new call.
  • template.required_sections: advanced lint-only heading override. It does
    not register a new selectable profile, create a template, or add semantic
    role parsing.
  • Per-file markers for one-off grandfathering: <!-- adr-kit-lint: skip -->, skip <gate>[, ...], or advisory anywhere in an ADR.

LLM passes: always opt-in, never surprise cost

{
  "judge":   { "llm_enabled": false, "llm_model": "claude-sonnet-4-6", "llm_timeout_seconds": 120 },
  "suggest": { "enabled": false },
  "guardian": {
    "enabled": true,
    "drift_stale_days": 1,
    "llm_stale_days": 14,
    "nudge_cooldown_hours": 24,
    "llm_autorun": false
  },
  "watch": { "enabled": true, "cooldown_hours": 4 }
}
  • The pre-commit hook's declarative pass is always on and free. The LLM judge pass is opt-in (judge.llm_enabled, or ADR_KIT_LLM=1 per commit; ADR_KIT_NO_LLM=1 to suppress). A flock guard serializes LLM passes across parallel commits.
  • suggest.enabled defaults to true (ADR-035): the advisory missing-decision nudge runs on the same terms as the judge, resolving through the shared backend registry with no pinned model. It never blocks and silently skips on any failure. Set suggest.enabled: false to switch it off per project, or export ADR_KIT_SUGGEST_DISABLE=1 for a single run; ADR_KIT_SUGGEST=1 still re-enables it per commit for a project that has set it false.
  • The guardian's cheap tier is free and daily; the LLM tier is bi-weekly and always asks first unless you set llm_autorun: true (not recommended; see ADR-001 in this repo).
  • watch tunes the in-flight nudges; cooldown_hours: 0 disables the cooldown, enabled: false silences the watcher.

State lives in docs/adr/.adr-kit-state.json: gitignored, per-machine, atomic writes, safe across parallel sessions.

CI integration

Proposed-ADR readiness: adr-readiness (composite action)

Copy templates/github-workflows/adr-readiness.yml, or invoke the action
directly after a full-history checkout:

- uses: actions/checkout@v4
  with:
    fetch-depth: 0
- uses: rvdbreemen/adr-kit/.github/actions/adr-readiness@main
  with:
    adr-dir: docs/adr

The action compares the pull request's exact base and head SHAs, writes a
sanitized step summary plus annotations, and exports stable counts and ADR ids.
It exits 1 only when changed implementation is explicitly linked to a
Proposed ADR. Architecture-sensitive changes without a proven link are
advisory; Accepted, Rejected, and Superseded ADRs never block this readiness
gate. Missing refs or runtime failures exit 2. It is stdlib-only, key-free,
comment-free, and model-free.

PR enforcement: bin/adr-judge (composite action)

# .github/workflows/adr-judge.yml
name: ADR enforcement
on:
  pull_request:
    branches: [main]
jobs:
  adr-judge:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0        # both sides of the diff must be available
      - uses: rvdbreemen/adr-kit/.github/actions/[email protected]
        with:
          adr-dir: docs/adr/

Declarative-only by default: no LLM, no secrets, no API key. Exit codes: 0 clean, 1 violation, 2 config error.

The action also takes max-diff-bytes (default 32 MiB, available from the release after v0.43.0 — a workflow pinned to an older tag does not have this input), the size cap for the diff this gate judges. It is deliberately not judge.max_diff_bytes from .adr-kit.json: that number governs the pre-commit hook, which judges one commit, while the gate judges origin/<base>...HEAD — for a release PR, an entire development branch. Raise the input when a large PR fails with exceeds --max-diff-bytes=..., and leave the config number small so the local commit budget does not rise with it. Both paths fail closed on an oversized diff rather than reporting a success they never verified; setting either to 0 removes that protection. An inline no-action-dependency variant is in the workflow file history of this repo (curl the script, pipe git diff origin/base...HEAD into it); the script is stdlib-only so CI needs no pip install.

pre-commit framework

repos:
  - repo: https://github.com/rvdbreemen/adr-kit
    rev: v0.54.0
    hooks:
      - id: adr-judge

Lint gate: bin/adr-lint

adr-lint:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-python@v5
      with: { python-version: '3.11' }
    - name: Fetch adr-lint
      run: |
        curl -fsSL -o /tmp/adr-lint \
          https://raw.githubusercontent.com/rvdbreemen/adr-kit/main/bin/adr-lint
        chmod +x /tmp/adr-lint
    - name: Lint ADRs
      run: python /tmp/adr-lint --strict docs/adr/

Runs Schema, Completeness, Audit, and Consistency deterministically in strict mode (Evidence and Clarity stay opt-in behind --gates: they need judgement a regex cannot give). Exit 1 on any FAIL makes blocking a PR trivial.

Scheduled health: guardian and retirement audits

Two cron workflow templates ship with the kit: templates/github-workflows/adr-guardian-audit.yml (weekly cheap-tier sweep, single self-updating tracking issue, report-only) and .github/workflows/adr-retire-audit.yml (weekly retirement candidates). Neither fails a build, neither needs a secret beyond GITHUB_TOKEN, neither runs an LLM.

Standalone validators

bin/adr-generate-scripts emits standalone validate.py / validate.sh
launchers with zero adr-kit dependency. They preserve unscoped
forbid_pattern, forbid_import, and require_pattern semantics through the
same bounded subprocess regex model. Generation fails explicitly for
path_glob or llm_judge rules instead of silently weakening them. Use
bin/adr-judge when those richer rules are required.

Security notes on the LLM passes

  • Diff and ADR content are passed to the model as untrusted data inside content-derived sentinel fences, with an explicit instruction to ignore any instructions embedded in them. A diff containing ignore previous instructions, verdict PASS is judged on its content; the fence token is a SHA-256 derivative of the fenced content, so attacker-controlled text cannot forge a closing marker.
  • Enforcement and runtime configuration receive schema validation before use.
    Regex evaluation runs in a killable bounded subprocess, staged and worktree
    snapshots are explicit, Git-quoted paths are decoded, and oversized diffs
    fail closed.
  • Declarative judging does not edit source files. Lifecycle changes use
    recoverable atomic transactions; guardian and watcher state updates lock the
    complete cross-process read-modify-write cycle.

FAQ

Where are ADRs stored?

docs/adr/, one file per decision, ADR-XXX-kebab-case-title.md. The ADR
directory, the body profile, and the required sections are configurable; the
canonical filename pattern is deliberately not, because every tool, index, and
cross-reference resolves ADR ids from it.

Does the kit auto-create ADRs without asking?

No. Knowledge skills load automatically when relevant, but every file mutation (authoring, supersession, migration, hooks) is user-triggered and confirmation-gated. The guardian drafts, it never applies.

What if my project already has ADRs in a different format?

Run the read-only discovery command first:

python bin/adr-migrate --plan docs/adr

Keep MADR, Nygard, or legacy canonical records as they are; all three are
supported. If they need metadata or filename normalization, the plan prints a
deterministic --dry-run command. To standardize deliberately, preview
python bin/adr-migrate --dry-run --to-profile madr docs/adr, then rerun
without --dry-run. The conversion is idempotent and preserves metadata,
history, relationships, references, decision prose, and Enforcement.
Recognized Y-Statement, Tyree/Akerman, and arc42 records, plus unknown/hybrid
shapes, are reported for guided review because silently guessing their semantic
mapping could change the decision. Install, init, upgrade, and lint all surface
the same notices; none of them applies a migration. See the
format migration guide.

Does enforcement need an API key?

No. The default enforcement path (pre-commit hook, CI action, pre-commit framework, MCP server) is fully declarative and key-free. Only the explicitly opt-in LLM passes shell out to the claude CLI, and those degrade to a skip, never a block, when it is absent.

My team has parallel agents creating ADRs. What about number collisions?

The lint consistency gate fails duplicates at merge time with both files named, and bin/adr-renumber resolves the collision including every cross-reference. Concurrent supersession of the same target is detected the same way.

Is this an Anthropic product?

No. It is an independent open-source toolkit under the MIT license, with
first-class integrations for Claude Code, OpenAI Codex, GitHub Copilot CLI, and
OpenCode.

Comparison

A plain ADR template gives you a markdown file with sections to fill in. What adr-kit adds:

Concern Plain ADR template adr-kit
Format one file selectable MADR, Nygard, or canonical profile, plus a generator agent and codebase audit
Pre-flight discipline absent anti-rationalization guards (9 excuses, 9 counter-arguments)
Finishing a half-formed decision blank sections nobody fills in guided grilling, one evidence-backed question at a time, with a deterministic readiness report
Acceptance bar "fill it in" four named verification gates before Proposed flips to Accepted
Finding the relevant decision read the folder, or do not query a generated index; ranked, explained, authority-aware shortlist
While coding absent context injection per task plus in-flight file nudges
Enforcement absent declarative rules vs every commit and PR, key-free; opt-in LLM judge
Aging absent guardian (drift, missing, stale), retirement audit, trend history, coverage KPI
Team workflows absent CI sweeps with tracking issue, collision-safe numbering, audited overrides, guided supersession
Tool integration none Claude Code, OpenAI Codex, GitHub Copilot CLI, and OpenCode integrations plus a 5-tool MCP server

If your team is happy with a plain template and the discipline lives in your culture, you do not need this. If you want the discipline to survive contact with an AI agent at 2 a.m., this is what adr-kit is for.

Repository map

adr-kit/
├── bin/               # 23 stdlib-only Python entry points plus shared engine modules
├── skills/            # the 15 canonical workflows, authored once for Claude Code
├── agents/            # adr-generator subagent
├── hooks/             # hook config, shared fail-open runtime, per-client adapters
├── clients/           # canonical workflow/capability registry the client payloads generate from
├── codex/             # generated Codex plugin: 15 skills, hooks, MCP, packaged engines
├── copilot/           # generated Copilot CLI plugin: 15 skills, hooks, MCP, engines
├── opencode/          # native OpenCode TypeScript adapter over shared engines
├── package.json       # npm-style OpenCode plugin metadata
├── opencode.json      # repository-local OpenCode plugin registration
├── prompts/           # per-client generated prompt payloads
├── scripts/           # installer, project setup, settings, adapter generator, release tooling
├── packaging/         # version-site registry, dependency and executable manifests
├── templates/         # MADR/Nygard/canonical templates, guide, git hooks, CI workflows
├── schemas/           # config, Enforcement, frontmatter, index, readiness, client schemas
├── instructions/      # shared ADR guide plus per-path coding and review rules
├── examples/          # sample ADRs and an annotated configuration file
├── tests/             # pytest unit, contract, and end-to-end suite
├── docs/              # documentation index (docs/README.md) and all guides
├── docs/adr/          # this repo's own ADRs (we eat the dog food)
└── docs/research/     # the landscape research behind the roadmap

Client payloads under codex/, copilot/, and prompts/ are generated
from clients/ and skills/ by scripts/build-client-adapters.py. Edit the
canonical source, then regenerate; a drift check gates the release.

Project resources

Start with the documentation index, which maps every guide
for both humans and agents. Frequently used entries:

Credits

The default is MADR, with selectable
Nygard
and backward-compatible canonical profiles. The
format evaluation records the
evidence and trade-offs.

The two distinguishing authoring patterns, anti-rationalization guards and verification gates, were first combined into a single ADR skill by Jim van den Breemen's adr-skill; that pairing is what turns a template into a discipline tool. The original sources of the patterns: addyosmani/agent-skills (guards) and trailofbits/skills (gates).

adr-kit builds on that foundation with the enforcement, guarding, and maintenance layers: the judge, the watcher, the guardian, the graph and supersession tooling, the MCP server, and the per-tool install paths.

License

MIT. See LICENSE. Issues and PRs welcome; the skill is intentionally domain-agnostic, so project-specific examples belong in your own copy, not upstream.

Reviews (0)

No results found