Creates, scores, reviews, supersedes Architecture Decision Records with the pantheon-adr CLI. Use when recording an architectural decision, writing an ADR, documenting a technical choice, checking whether an ADR is finished, superseding a prior decision, bootstrapping an ADR log under docs/adr.
76
94%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Treat a record as a dated, immutable account of one decision and the forces that shaped it, not as living documentation. Write for a reader six months out who must understand why a choice was made without asking anyone. Never edit an accepted record to change its meaning. When the decision changes, write a new record and point the old one at it, preserving the chain of reasoning.
Read metadata from the frontmatter, which is the single source of truth. Status, author, branch, tags, supersede links and the full history of status transitions all live in the file's own frontmatter. Keep no separate index in step, so the metadata cannot contradict the prose. pantheon-adr index regenerates a browsable catalogue from that frontmatter, which makes the catalogue derived and safe to overwrite, never authored.
Name records by slug, never by number. Run pantheon-adr create on branch feat/adopt-otel and it writes docs/adr/adopt-otel.md, typing the record feat. Compute no max(existing) + 1 and no numbering to collide when two branches each add a decision.
Check completeness rather than judging it. Run pantheon-adr check <slug> to score the prose 0 to 100 against a fixed rubric; pantheon-adr review <slug> refuses to run below 80. Take the score as the definition of "finished" and write to satisfy the rubric rather than arguing with it. The point of the tool is that "is this ADR done?" has an answer a hook can enforce.
This skill drives the pantheon-adr CLI from the tekhne repository, and is
distributed by it (pantheon-adr skill install). Confirm the binary is on
PATH:
pantheon-adr --versionIt is not published to crates.io, so cargo install pantheon-adr will fail.
Install a tekhne release binary (cargo-dist), or build from a checkout:
cargo install --path crates/adr # from the tekhne repository rootThere is no self-contained fallback for these commands. The binary is
pantheon-adr, not adr: do not substitute another binary whose name looks
close, because a different tool will have an incompatible command set and record
format and will fail on the first command.
docs/adr.proposed and say in the prose that nothing is ratified.create writes the frontmatter the rest of the tooling reads.check is the gate. A record below 80 is unfinished, whatever it reads like.pantheon-adr init. The default directory is docs/adr, which is committable; --dir and the ADR_DIR variable override it. Verify: pantheon-adr list prints No ADRs found. or the existing records.pantheon-adr create -d "<one-line description>". The slug is the branch name with its feat/, fix/, docs/ or chore/ prefix stripped, and the type comes from that prefix. Pass an explicit slug (create <slug>) when not on a feature branch, and -t when the prefix is not the type you want. Verify: the printed path is docs/adr/<slug>.md and list shows it as proposed.pantheon-adr draft for the branch's commits, its changed-file totals, any earlier decisions over the same files, and the list of sections still unfilled. draft --bootstrap turns the same material into a numbered question set. This is optional, and faster than reconstructing the branch by hand.<!-- ... --> placeholder with real prose and keep every heading exactly as generated. The rubric needs 30 or more words under ### Context, 30 under ### Chosen Solution, 20 under ### Rationale, and one ## Impact Assessment entry whose value is not none. Stop if: you cannot name a real rejected alternative under Options Considered; that gap means the decision is not yet understood.pantheon-adr check <slug> and iterate until the score is at least 80, or 95 with --strict. Verify: exit code 0 and [complete] in the output.pantheon-adr review <slug> to move the status to review-requested. It re-runs the check and refuses below 80.pantheon-adr update <slug> -s accepted. The transition is appended to the record's history automatically.pantheon-adr index, then commit both. Do not hand-edit index.md.pantheon-adr update <old-slug> --superseded-by <new-slug>. The old record's status becomes superseded, the replacement gains a supersedes link back, and neither record's prose is touched. Verify: pantheon-adr list -s superseded shows the old slug.Sometimes step 4 isn't a blank page: the decision was already made and written down in a design doc, review, or planning note, and the task is to capture it rather than author it. The steps above still apply, but recognising that a document contains a binding decision, and linking the record back to it for provenance, takes more care than filling in a decision you just made yourself. See Deriving an ADR from an Existing Document.
# Bootstrap an ADR log under docs/adr.
pantheon-adr initExpected result: Initialised the ADR log for <project> at docs/adr.
# Create the record for the current branch.
pantheon-adr create -d "Adopt OpenTelemetry for tracing"Expected result: on branch feat/adopt-opentelemetry, prints Created docs/adr/adopt-opentelemetry.md with frontmatter branch_type: feat, status: proposed.
# Read the branch, or turn it into a question set.
pantheon-adr draft
pantheon-adr draft --bootstrapExpected result: branch, base, commit list, changed-file totals, earlier decisions over the same files, and the sections still to address.
# Score the record. The slug is required.
pantheon-adr check adopt-opentelemetryExpected result: Score: 100/100 [complete] and exit 0 at or above 80; below that, the failing rules with their weights and exit 1.
# Move through the lifecycle.
pantheon-adr review adopt-opentelemetry
pantheon-adr update adopt-opentelemetry -s accepted --tags tracing,observabilityExpected result: adopt-opentelemetry marked for review (score 100/100), then Updated adopt-opentelemetry: tags, status to accepted.
# Retire a decision in favour of a newer one (create the replacement first).
pantheon-adr update adopt-opentelemetry --superseded-by adopt-grafana-tempoExpected result: the old record becomes superseded and the replacement gains supersedes: adopt-opentelemetry.
# Inspect the log and regenerate the catalogue.
pantheon-adr list
pantheon-adr list -s accepted
pantheon-adr status --json
pantheon-adr indexExpected result: one line per record as <type> <slug> <date> <status> <description>; status --json emits {"total":N,"by_status":{...},"by_type":{...}} for CI gates.
# Wire the checks into the harness and into git.
pantheon-adr sync
pantheon-adr init --install-hooksExpected result: sync patches whichever agent harness configuration the project uses and is idempotent, leaving unrelated settings intact; --install-hooks adds a pre-push hook that blocks while any proposed record scores below 80.
# Find planning documents with a decision that no record points back at.
./scripts/check-undocumented-decisions.shExpected result: exit 0 with a confirmation line when everything is covered, or exit 2 with a list of undocumented files. See Deriving an ADR from an Existing Document.
create writes the YAML frontmatter that every other command reads. A file without it fails to parse, and because list reports a malformed record rather than skipping it, one hand-made file breaks the whole log.cat > docs/adr/adopt-grpc.md with a copied template.pantheon-adr create adopt-grpc -d "...", then editing the body it generated.list, status and check all fail with a parse error until someone finds the file you wrote.review and update append a timestamped entry to the record's history as they move the status. Editing status: directly skips that, so the audit trail silently claims the record went straight from proposed to accepted with nobody reviewing it.status: proposed to status: accepted.pantheon-adr review <slug> then pantheon-adr update <slug> -s accepted.use-rest-for-internal-services.md and replacing "We will use REST" with "We will use gRPC".adopt-grpc-for-internal-services, then pantheon-adr update use-rest-for-internal-services --superseded-by adopt-grpc-for-internal-services.check scores sections by heading name. Renaming ### Chosen Solution drops its 25 points and triggers a cap that holds the whole record at 60, which is below the review threshold.### Rationale with ### Why.review.<!-- ... --> placeholders in a record you are calling donereview refuses the record, and the reason ("15 unfilled placeholder(s) remain") reads as carelessness rather than judgement.### Options Considered followed by TBD.index.md is rendered from the records' frontmatter and carries a banner saying so. The next pantheon-adr index overwrites whatever you wrote.index.md.update), then re-run pantheon-adr index.choose-postgresql and adopt-self-hosted-runners.a1083f4
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.