Expert Review — 30 Suggested Additions, Scored for ExpertGroup¶
2026-06-06 — derived from published guidance of 10 renowned developers/architects. Score = whether to implement for ExpertGroup (1–10), judged against team size, existing repos, ratified standards, effort vs payoff.
Status (2026-06-06): - Score 8+ IMPLEMENTED: 1, 5, 7, 8, 10, 11, 14, 23, 26 → new standards 10/11/12, ADR-001, ADR template, additions to 01/06/07, CLAUDE template. - Score-7 review complete: ACCEPTED 2 (C4), 4 (feature flags), 9 (steady state), 18 (postmortems), 27 (MSW), 28 (perf budgets, scoped: bundle budgets everywhere, Lighthouse CI on public pages); REJECTED 20 (MediatR/AutoMapper policy). - Piggy-backed: 29 (CWV p75 targets) and 30 (JS/image discipline) ACCEPTED with 28. - Remaining unreviewed (score 4–6): 3, 6, 12, 13, 15, 16, 17, 19, 21, 22, 24, 25.
| # | Author | Area | Suggestion | Explanation | Score | Why that score |
|---|---|---|---|---|---|---|
| 1 | Milanović | Architecture docs | Require in-repo ADRs | One Status/Context/Decision/Consequences file per significant decision. | 9 | Near-zero effort, the standards' DECISION items already need a home, and three of ten experts converge on it. |
| 2 | Milanović | Architecture docs | C4 + diagrams-as-code | Mermaid/Structurizr diagrams version-controlled beside ADRs. | 7 | Cheap and durable, but useful only after ADRs exist — second step, not first. |
| 3 | Milanović | Process | DORA + SPACE metrics only | Forbid single-metric productivity measures like LOC. | 4 | A small team has no metrics bureaucracy to defend against yet; one sentence in the plan is enough. |
| 4 | Fowler | Release | Feature toggles + removal rule | Flags decouple deploy from release; each flag gets owner and removal date. | 7 | Promotion branches will carry unfinished work, and flags are the safe way — but start light, no flag platform. |
| 5 | Fowler | Git | Document the branching deviation as ADR-001 | Write down why env-branches beat trunk-based for ExpertGroup. | 8 | One page, written once, ends a debate that will otherwise reopen with every new hire who reads Fowler. |
| 6 | Fowler | Code health | Continuous small-step refactoring rule | Behavior-preserving refactors backed by tests; cruft flagged in review. | 6 | Right principle but hard to enforce; worth one paragraph in 01, not a process. |
| 7 | Fowler | AI | AI-generated code reviewed like human code | No unreviewed "vibe code" reaches production repos. | 9 | ExpertGroup distributes CLAUDE.md org-wide, so the matching review rule is a one-line, high-impact guardrail. |
| 8 | Nygard | Resilience | Timeouts, circuit breakers, retries+backoff | Every integration call gets an explicit timeout; breakers on risky dependencies. | 10 | Biggest genuine gap: a RabbitMQ/GraphQL microservice ecosystem with zero resilience guidance, and Microsoft.Extensions.Resilience makes it cheap. |
| 9 | Nygard | Resilience | Steady State rule | Logs, caches, tables must not grow unboundedly; retention is part of design. | 7 | Cheap rule that prevents the most common slow-death production failure. |
| 10 | Nygard | Architecture docs | Adopt his exact ADR template | One file per decision, immutable once accepted. | 9 | Free if item 1 is accepted — it's the canonical format. |
| 11 | Newman | Architecture | Independent deployability + no shared DBs | Any service ships alone; integration via APIs/events only. | 8 | The ecosystem already mostly complies, so codifying costs nothing and blocks the shared-DB shortcut. |
| 12 | Newman | Testing | Consumer-driven contract tests | Pact or GraphQL schema-checks verify consumers against providers in CI. | 6 | Right idea, but with mostly first-party UIs a lightweight schema-diff gate gives 80% of the value at 20% of Pact's cost. |
| 13 | Newman | Migration | Strangler Fig for legacy | Extract incrementally; never big-bang rewrite. | 6 | Useful name for the PropertyTax migration, but it's one project, not an org-wide rule. |
| 14 | Majors | Observability | OpenTelemetry tracing + wide structured events | High-cardinality fields (tenant, user, build) on one event per request per service. | 8 | Multi-service GraphQL ecosystem with no correlation story; OTel in .NET is mature and mostly config. |
| 15 | Majors | Observability | Alert on SLOs/symptoms only | Delete cause-based alerts that page for non-emergencies. | 6 | Correct, but meaningless until item 14 exists — sequence it after. |
| 16 | Majors | CI/CD | Track deploy lead time | Measure merge→staging time as a health metric. | 4 | Nice-to-have; staging auto-deploy already enforces the behavior the metric would measure. |
| 17 | Orosz | Process | Lightweight RFC/design docs | Short written design reviewed before cross-team or >1-week work. | 5 | Valuable at scale, but for a small team a CLAUDE-assisted design note + PR description covers most of it. |
| 18 | Orosz | Process | Blameless postmortems | Incident write-ups with owned action items. | 7 | The package says nothing about incidents; a half-page template is cheap insurance. |
| 19 | Orosz | Database | Migration playbook (dual-write/shadow-read) | Incremental cutover, never big-bang, for schema/service migrations. | 6 | Worth three bullets in 05; full playbook ceremony exceeds current team size. |
| 20 | Bogard | .NET licensing | MediatR/AutoMapper license policy | Pay, pin to MIT versions (MediatR 12.x/AutoMapper 14.x), or prefer alternatives. | 7 | Repo survey found no current usage, but a one-line policy now prevents an accidental license liability later. |
| 21 | Bogard | .NET | Mapping guidance | Mappers only for trivially conventional mappings; else hand-map or Mapperly. | 6 | Low effort and from the author himself; mostly preventive given current codebase. |
| 22 | Bogard | Architecture | Allow vertical slices as alternative | Explicit yes/no on feature-folder organization vs layered .Bll/.Dal. | 5 | Worth a one-line ruling either way purely to prevent accidental fragmentation; no urgency. |
| 23 | Ardalis | .NET | Entity-design rules (DDD-lite) | Private setters, invariant-enforcing constructors, encapsulated collections, behavior over anemic bags. | 8 | Cheap rules that prevent the most common EF entity rot, fits the existing domain-model style. |
| 24 | Ardalis | .NET | Guard clauses | Guard.Against.* (or equivalent) for preconditions at entry points. | 5 | Mild readability win; adds a dependency for something ArgumentNullException.ThrowIfNull mostly covers now. |
| 25 | Ardalis | Database | Specification pattern | Encapsulate reusable EF query logic in specifications. | 4 | The existing .Apply() filter-context extensions already fill this niche; adding a second pattern would duplicate. |
| 26 | Dodds | Testing | Frontend Testing Trophy + Testing Library | Mostly integration tests, user-centric queries (getByRole), no implementation-detail tests. | 8 | 07 is entirely backend-shaped; this is the missing frontend half and the de facto industry standard. |
| 27 | Dodds | Testing | MSW for network mocking | Mock at the network boundary, not fetch/Apollo internals. | 7 | Direct frontend parallel of the ratified "real SQL, not InMemory" rule; same mocks serve tests and dev. |
| 28 | Osmani | Frontend perf | Performance budgets in CI | Lighthouse CI fails the build on JS-size/LCP regression. | 7 | Same ratchet philosophy as the coverage gate; start on KIPS/Transfera where map-heavy pages are at risk. |
| 29 | Osmani | Frontend perf | Core Web Vitals targets at p75 | LCP <2.5s, INP <200ms, CLS <0.1 as the published bar. | 6 | Free to state and measurable, but only meaningful once item 28 provides enforcement. |
| 30 | Osmani | Frontend perf | JS/image discipline | Route code-splitting, lazy-load below fold, import-on-interaction, AVIF/WebP. | 6 | Cheap bullets with real user impact; partially implied by Next.js/Angular defaults already. |
Suggested ratification batches¶
- Score 8–10 (do): 1, 5, 7, 8, 10, 11, 14, 23, 26 — two new docs (resilience, observability), ADRs, AI-review rule, deployability rule, entity rules, frontend testing.
- Score 6–7 (do selectively): 2, 4, 6, 9, 12, 13, 18, 19, 20, 21, 27, 28, 29, 30.
- Score 4–5 (skip or one-liner): 3, 15, 16, 17, 22, 24, 25. (15 rises to 7 once observability exists.)