Rule as an interface. New architectural constraints (naming,
ownership, coverage, perf budgets) plug in without touching the engine —
the same extensibility as a linter.
Report aggregates per rule. CI output names which rule failed and
where, so the violation is actionable, not just "build red."
Deterministic traversal. Sorted iteration makes violations stable
across runs (reviewable diffs) — the book's determinism discipline.
Templates as deliverables. The ADR + design-review checklist
(steps/) are first-class artifacts: the architect's written tools, not
afterthoughts.
Fitness functions enforce the objective, not the wise. They catch
cycles and layering breaks; they can't judge whether a boundary is in
the right place. Use them to free reviews for judgment, not replace
judgment.
Too-strict rules get disabled. A fitness function that fires on
legitimate exceptions trains people to add //nolint. Allow scoped,
reviewed exceptions (with an ADR) rather than blanket suppression.
Consensus can't be automated. The hardest part of the role (aligning
teams) has no unit test; the templates + practices are the leverage.
ADRs rot if not maintained. Supersede (don't edit); link related
ADRs; keep them in the repo so they're versioned with the code.