Skip to content

docs(adr): propose ADR-304 typed decision records, the adr/v1 contract - #559

Merged
aaronsb merged 18 commits into
mainfrom
docs/adr-304-typed-decision-records
Sep 27, 2026
Merged

aaronsb merged 18 commits into
mainfrom
docs/adr-304-typed-decision-records

Conversation

@aaronsb

@aaronsb aaronsb commented Sep 27, 2026

Copy link
Copy Markdown
Owner

Proposes ADR-304: a versioned record contract (adr/v1) declared in adr.yaml.

  • Two kinds, one number space: decision (append-only, the Agent Decision Record proper) and spec (living). Existing ADR-N code citations keep resolving.
  • Three disjoint vocabulary layers: record lifecycle (proposed, accepted, rejected, abandoned, superseded, archived), decision verbs (add, cut, change, retire, constrain), and derived product state (active/absent, present/gone, living/historical). adr lint checks adr.yaml for cross-layer reuse.
  • Capabilities are a closed vocabulary in adr.yaml. The ledger is derived from add and cut decisions.
  • Enactment: a cut or retire decision warns on remaining citations until enacted: <commit> is set, then fails.
  • Citation lint extends doclint: superseded targets warn and name the successor, and proposed targets prompt acceptance.
  • Migration: untyped records are adr/v0, linted as today, and move to v1 when touched.

Evidence comes from kg's triage of 108 ADRs (89 mix jobs, none is purely a capability) and this repo's 1,617 code citations (162 to Superseded or Deprecated ADRs).

The design was worked out with the knowledge-graph-system session over attend. kg prototypes the triage and the doclint extension before anything lands in adr-tool. Doc-only change; the pre-existing Makefile edit is not included.

Decision and spec kinds share the ADR-N number space. Three vocabulary layers
(record lifecycle, decision verbs, derived product state) share no word.
Capabilities are a closed vocabulary in adr.yaml, and the capability ledger
is derived from add and cut decisions. Cut and retire decisions carry an
enacted field that turns citation warnings into failures. Legacy records are
adr/v0 and migrate when touched. Designed with the kg session, which
prototypes the triage and doclint extension first.
Sub-parts are records of their own, and a bare ADR-N resolves to its family.
The number stays with the spec half on a split, and the decision half links
back with decided_by. The stem check covers the vocabulary layers only. The
ADR declares its own adr/v1 frontmatter. Inventory targets follow the
enactment rule. Capability-without-add warns during migration. The ADR adds
derived spec state, freezes every terminal state, requires reasons for reject
and abandon, and defines change against constrain *.
@aaronsb
aaronsb force-pushed the docs/adr-304-typed-decision-records branch from 2ff7263 to 5dcf496 Compare September 27, 2026 00:53
…endored projects

Re-vendoring the v1-capable tool is safe because it lints v0 records as the
legacy tool does. A project adopts adr/v1 only by declaring it in adr.yaml.
The ADR way's body stays contract-neutral, and its macro reads both axes to
disclose v0 or v1 guidance.
…s is the migration test

Record ADR's v1 expansion as Agent Decision Record, where an architecture
decision is one kind of agent decision.
…ions in an external basis

Kinds, their fields and their edge types live in the contract, so a new kind
is a contract change and needs no tool release. Every decision carries a basis
(operator, evidence, standard, upstream or precedent) whose chain must leave
the corpus. add, cut, retire and one-way decisions need an operator basis
before acceptance. The model draws on Beer's Viable System Model.
…e proof

The agent runs git and gh under the operator's identity, so reviews, merges
and record text cannot prove approval. An operator basis carries the
operator's quoted words and where they were said. Signed acceptance is
deferred to a later change decision.
…nce rejected as too brittle

An operator basis records what was said and via which channel: session,
issue, Slack or call. Written channels are quoted verbatim. Spoken ones are
marked as paraphrase. The basis is an audit trail the operator can dispute,
not a credential.
…nvolvement is a recorded level

Agents may accept any decision, add, cut and retire included, once the basis
chain leaves the corpus. An operator basis records a level: authored,
directed or guided. A guided decision is still the agent's. Involving the
operator is way guidance, and the tool does not enforce it.
… considered record, and operator-started decisions wait for the operator

Record the float, debate, propose, consider flow. The agent owes a decision
the operator can understand, and the operator owes one not accepted blindly.
A brief 'looks good' counts as full consideration. The rubber-stamp failure
mode is an accepted risk, mitigated by the one-way flag in the summary. The
ADR now opens with its own summary.
The VSM framing is corrected to loose inspiration: the operator is System 5
inside the system, evidence and standards are the environment, and peer repos
coordinate as System 2. Decisions record the agent (name, model), per the
kernel Assisted-by tag and AgDR. Partial supersession uses typed amends and
extends edges, since the untyped IETF Updates edge failed. The ADR states
fabrication risk and that merge accountability is unchanged. The Summary
gains labelled-confidence probes and an inversion. considered records which
probes an answer covered, and a bare 'looks good' is valid but scoped to
nothing. Research references are appended as the evidence basis.
…se a concern

A brief 'yep, looks good' is taken as given. The probes offer the operator's
judgement a foothold and do not test the operator. The agent may raise a
safety, logic or anything-seems-off concern at any stage, recorded as a
concern entry with the operator's answer beside it.
… probes check engagement

A concern names what would resolve it, cannot be silently withdrawn, and is
listed at acceptance without failing it. The agent challenges once and then
proceeds on the operator's answer. An optional canary probe, revealed right
after the answer and never kept in the record, calibrates how far the agent
leans on brief approvals. Research on trust calibration, the two-challenge
rule, andon response, sycophancy under pressure and alarm fatigue is added
to References.
…ole and rights

Sycophancy grows with session length, and ways already re-disclose on a
decay curve. The v1 ADR way gains a child that restates the agent's role and
rights on approval language, Summary and considered edits, and adr accept.
A reminder delivered after adr accept is enough, since acceptance is
incremental and easy to revisit. Canaries carry a little whimsy, in the
working-group Easter-egg tradition. The operator's consideration is recorded:
it covers no specific probe, and no canary was used.
@aaronsb
aaronsb merged commit 38f88e2 into main Sep 27, 2026
@aaronsb
aaronsb deleted the docs/adr-304-typed-decision-records branch September 27, 2026 02:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant