LearnNewsExamplesServices
Frontmatter
id17684
title29 of 40 ADRs never left Proposed, and a critical gate cites one that reads Draft
stateClosed
labels
bugaiarchitectureagent-os
assigneesneo-opus-vega
createdAtAug 24, 2026, 10:03 AM
updatedAtAug 24, 2026, 4:48 PM
githubUrlhttps://github.com/neomjs/neo/issues/17684
authorneo-opus-vega
commentsCount2
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 24, 2026, 4:48 PM

29 of 40 ADRs never left Proposed, and a critical gate cites one that reads Draft

Closed Backlog/active-chunk-19 bugaiarchitectureagent-os
neo-opus-vega
neo-opus-vega commented on Aug 24, 2026, 10:03 AM

Context

Surfaced 2026-08-24 when the operator challenged ADR 0040 §2.7 on dev. Reading my own record to answer, I found its Status still reading "Proposed — 2026-08-22" despite the merge that accepts it having landed. Checking whether that was a one-off found a class.

The Problem

40 ADRs in learn/agentos/decisions/. 12 read Accepted. The other 28 read Proposed (25) or Draft (3), most carrying a transition condition satisfied long ago — ADR 0001 has said Proposed — 2026-04-22 for four months.

Census corrected 2026-08-24 by doing the work, and the correction is itself the strongest argument for AC-3. This ticket originally said 11 Accepted, 27.5% compliance. Both numbers came from grep '| **Status** |' — a table-row pattern. The corpus uses three syntaxes, and each successive attempt of mine missed a different record:

syntax count missed by
| **Status** | … (table row) 38 —
**Status**: … (colon outside bold) 1 — ADR 0010 the original grep
**Status:** … (colon inside bold) 1 — ADR 0031 the first correction

ADR 0010 is Accepted and was counted as stale; ADR 0031 is Proposed and was counted as having no status at all. A checker written against the shape its author happens to have open will report a confident wrong number — which is precisely the failure this ticket exists to end, reproduced by the ticket's own first measurement.

The transition is defined but manual. A typical status field reads:

Proposed — 2026-08-22 (transitions to Accepted only on approved, green PR merge at the human merge gate, per ADR 0005)

The condition is precise and checkable. Nothing checks it. grep across buildScripts/ and ai/scripts/lint/ finds no enforcement.

The consequence, which is not cosmetic

§critical_gates #10 reads: "No AiConfig work without reading ADR-0019 first — no exception, no approval signal, no CI-green substitute." ADR-0019's own Status field reads Draft.

The strongest rule in the turn-loaded substrate points at a record that advertises itself as unsettled. An agent satisfying that gate opens 0019, sees Draft, and has to decide whether a draft binds them — with the gate's own text insisting it does. Same shape for the records governing live work right now: ADR 0039 (Proposed, cited for instrument semantics) and ADR 0040 (Proposed, governing Epic #17500's extraction topology). I cited both as authority repeatedly this week without noticing either says it is not yet accepted.

A status field that is wrong in the safe-looking direction is worse than an absent one. Absent, a reader asks. Reading Proposed, a reader gets a confident wrong answer and may treat binding authority as advisory.

ADR 0005 predicted this exact failure and prescribed the remedy

learn/agentos/decisions/0005-adr-at-graduation-for-ideation-sandbox.md:169:

Compliance below 80%: route to mechanical-enforcement automation ticket (CI check verifying ADR Status:Accepted on PRs citing Decision Record: REQUIRED Discussions)

Measured compliance: 12/40 = 30%. The trigger fired long ago; the escalation it prescribes was never routed. This ticket is that routing, three years of ADRs late.

The Architectural Reality

  • learn/agentos/decisions/0005-*.md:169 — the compliance threshold and the prescribed remedy. This ticket executes an existing decision rather than proposing a new one.
  • learn/agentos/decisions/0005-*.md:26 — "ADR = authority target … immutable post-Accepted". Immutability is keyed on a status nothing maintains, so the immutability contract is unenforced for 29 records.
  • No lint, hook, or CI job reads the Status field. Verified by grep across buildScripts/ and ai/scripts/lint/.
  • Adjacent but not owning: #13652 (@neo-opus-grace) mechanizes behavioral prompt-machinery — no-hold, wakes, cadence — and cites ADR-0019's lint as the shape; #17481 covers ADR-0019's C1 rule having no enforcement. Neither covers decision-record status hygiene, and this should compose with both rather than widen either.

The Fix

Two halves, and the second is what stops it recurring.

  1. Reconcile the 29. Each record's status is a fact derivable from its own stated condition — the merge that resolved its Resolves #N. This is a census-and-correct pass, not a judgment call per record, except where a record's condition was genuinely never met, which must be recorded as still-Proposed with the outstanding condition named rather than swept.
  2. Mechanize the transition, per ADR 0005's prescription. A check that a merged PR citing an ADR leaves that ADR's status consistent with its own stated condition. The precedent shape is ADR-0019's lint: the check replaces the discipline, because the discipline demonstrably did not hold for 29 records across four months and multiple authors.

A recurring miss across independent authors indicts the template, not the authors. Every one of us wrote a precise, checkable transition condition and none of us went back. That is a generator defect.

Acceptance Criteria

  • Every ADR's Status is consistent with its own stated transition condition, verified against the merge that resolved its close target — not assumed from age.
  • Records whose condition was genuinely not met stay Proposed and name the outstanding condition; the pass must not convert unresolved into accepted for tidiness.
  • A mechanical check fails when a merged PR leaves a cited ADR's status inconsistent with its stated condition.
  • The check parses all three Status syntaxes present in the corpus, with one arm per syntax — table row, **Status**:, and **Status:**. Non-negotiable and separately asserted, because a status field the checker cannot read is indistinguishable from one it read and passed, and both of this ticket's own first two measurements failed exactly there.
  • Either the corpus converges on ONE syntax, or the checker's multi-syntax support is documented as permanent. Silently tolerating three while parsing one is the current state.
  • NON-VACUITY: the check is red on the current tree before the reconciliation lands — it must fail against today's 29, or it is not measuring what it claims.
  • §critical_gates #10's target (ADR-0019) no longer reads Draft, or its outstanding condition is named so the gate and the record stop contradicting each other.
  • The compliance figure is reproducible by command, so the next drift is measurable rather than rediscovered.

Out of Scope

  • Re-litigating any ADR's content. This is status-field accuracy only; a record that is wrong on the merits stays wrong and keeps its own successor path.
  • ADR 0040 §2.7's learn/agentos custody disposition — reopened separately at D#17489, different defect, same read.
  • ADR-0019's C1 enforcement (#17481) and behavioral prompt-machinery (#13652).
  • Changing the ADR template's status vocabulary or ADR 0005's process.

Avoided Traps

  • Bulk-flipping everything to Accepted. The 80% threshold is about accuracy, not about the field reading Accepted. A pass that marks unresolved records accepted would satisfy the count and destroy the signal.
  • Filing this as a docs chore. It is cited-authority accuracy: a critical gate currently points at a Draft.
  • Widening an existing epic. #13652 is the right philosophy and the wrong close target; composing beats absorbing.
  • Treating it as author negligence. 29 records, many authors, one shared template with a manual step — the generator is the defect.

Decision Record impact

aligned-with ADR 0005 — executes the mechanical-enforcement escalation its §169 already prescribes at a compliance threshold now measurably breached. No ADR content is amended.

Related

  • ADR 0005 — the threshold and the prescribed remedy
  • #13652 (@neo-opus-grace) — mechanical enforcement replaces prompt-machinery; same philosophy, behavioral scope
  • #17481 — ADR-0019 C1 has no enforcement; adjacent, rule-scoped
  • D#17489 — the ADR 0040 §2.7 reopening that surfaced this

Live latest-open sweep + semantic sweep + open-Discussion check run 2026-08-24T08:0xZ; #13652 and #17481 surfaced as adjacent and were read before filing — neither owns this scope.

Retrieval Hint: query_raw_memories("ADR status Proposed Accepted transition never flipped mechanical enforcement compliance 80%"), or grep -c "Status.*Accepted" learn/agentos/decisions/*.md.

tobiu referenced in commit ec20b9f - "fix(agentos): 27 decision records reach the status their own condition earned (#17694) on Aug 24, 2026, 4:48 PM
tobiu closed this issue on Aug 24, 2026, 4:48 PM