ADR-0026 moved feature trees onto epic branches accepted in one behavior-level review, and carved out an exception:
Risk-tier exceptions — these keep dedicated small PRs with real human review: ledger/money-domain math and domain invariants, security-relevant changes, dependency updates, and anything touching the import idempotency or projection semantics.
The exception assumed those small PRs would actually be read closely. Six weeks of practice say otherwise, and the reason is structural: this project has exactly one reviewer, and ADR-0026 itself was written because that reviewer’s attention is the scarce resource. Carving the highest-risk changes into their own queue did not add review capacity; it produced a backlog of micro-PRs competing for the same attention that was already the bottleneck.
Sprint 3 made the cost concrete. The plan (sprint-plan-2026-08-01.md)
serialized three risk-tier items behind one reviewer and stated plainly that
“three risk-tier PRs plus one large cross-cutting batch do not review in
parallel through one person”. The owner then directed all lanes to run in
parallel and land as one PR, and the same again for the #619 follow-on and
for a dependency update that blocked CI — three deviations from the same
clause within two days. A rule deviated from every time it binds is not a
control; it is paperwork that makes the record less honest.
The owner’s own framing (2026-08-04): many small PRs simply do not get reviewed, so the choice is not between a carefully-read small PR and a skimmed large one. It is between an unread small PR and a large one whose risk-tier content is deliberately surfaced. With TDD-first discipline and the mandatory agentic review, a regression in money-domain code should be caught by a failing test and an adversarial reviewer, not by a human reading a diff they did not have time to read.
The risk-tier delivery exception is withdrawn. Ledger/money-domain math, security-relevant changes, dependency updates and import-idempotency / projection work ship inside the epic batch like everything else, on the same branch, in the same PR.
“Risk-tier” survives as an attention label, not a delivery mode. Marking a change risk-tier now means:
The compensating controls stop being aspirational. ADR-0026 listed them as things the workflow “leans on”; they are now the substitute for the withdrawn human read, and therefore blocking:
Decimal expectations where money is
involved.mix test, credo --strict, sobelow,
dialyzer, the migration and invariant meta-tests, the coverage ratchet,
and the dependency audits. Weakening a gate to make a batch pass remains a
review reject; that clause of ADR-0026 is reaffirmed, not relaxed.main, the retrospective must ask whether the mechanical controls or the
briefing failed, and this ADR is the thing to revisit.mix deps.audit,
mix hex.audit, npm audit --audit-level=high) remain blocking, and a
transitive major version bump must be named explicitly in the briefing
even when it arrives inside a lockfile-only change.mix hex.audit on an
advisory-aware Hex reported 15 advisories on main, five of them HIGH
(mint, hpax, cowlib, phoenix) — none of which either Elixir audit gate had
surfaced. mix hex.audit runs pinned to Hex 2.4.1 by deliberate design
(ci.yml: 2.5’s advisory gating has no ignore mechanism, so a permanently
unpatched upstream advisory would hard-fail CI with no recourse), which
makes that step retirement-only; and mix deps.audit’s database did not
carry the advisories, so the stated posture — “all HIGH/moderate Hex
advisories are cleared by upgrades, not by ignores” — had quietly stopped
being true. Eleven of the fifteen were closed by the dependency update in
this same batch, and the remaining HIGH (phoenix EEF-CVE-2026-56811) by
the Phoenix 1.8 upgrade that followed it in the same batch
(ADR-0037) — the tree is now down to two
advisories, neither HIGH, both without an upstream fix. The gate itself is
still weaker than this ADR’s reliance on it assumes, and after the upgrade
the reason is purely the tooling: mix hex.audit on Hex 2.5+ sees
advisories but has no ignore mechanism, so arming it would hard-fail on the
two unfixable cowlib entries, while mix deps.audit has the ignore list but
its database does not carry them. Until one of the two grows the missing
half, an advisory-aware step can be visible but not blocking. Closing this
properly remains the first follow-up this decision owes.npm test, npm run build) are added to CI
by this batch: AGENTS.md mandated them locally, but CI ran only the npm
audit, so an MCP-only change rested on an unverifiable local claim — not
acceptable once “every gate green” replaces the human read._bmad-output/implementation-artifacts/sprint-plan-2026-08-01.md — the
capacity statement that made the exception’s cost explicit