Service Scorecards and Maturity

Platform EngineeringSREMetricsDevOps
Share on LinkedIn Share on X Share on Reddit Share on HN Share on Bluesky

Leadership asked for a "service health dashboard." Platform built a spreadsheet. Teams gamed it by marking docs "complete" with a one-line README. Six months later nobody opened the spreadsheet. Scorecards work when metrics are automatically collected, tier-appropriate, and connected to help — not when they're manual checkbox audits updated quarterly.

Scorecard vs maturity model

Scorecard: point-in-time grades per service (api-checkout: B, legacy-batch: D).

Maturity model: defined levels (1–4) per capability area with criteria for advancement.

Service: api-checkout (Tier 1 — customer-facing)
├── Reliability:    Level 3  (SLO defined, error budget policy)
├── Security:       Level 4  (SAST, dependency scan, secrets scan pass)
├── Observability:  Level 3  (tracing, dashboards, runbook linked)
├── CI/CD:          Level 4  (automated deploy, canary, rollback tested)
└── Documentation:  Level 2  (API docs yes, on-call runbook stale)

Levels map to concrete checks — not subjective "feels mature."

Tier-based requirements

Not every service needs the same bar:

Tier Examples SLO required On-call Canary deploy
1 Checkout, auth Yes 24/7 Yes
2 Internal APIs Yes Business hours Recommended
3 Batch, analytics Best effort Next day No

Scorecard weights Tier 1 failures heavier. Failing "has README" on a Tier 3 cron matters less than missing SLO on checkout.

Automate data collection

Manual scorecards die. Wire sources:

# Scorecard check definitions (Backstage Scorecards plugin style)
checks:
  - id: has_slo
    name: SLO Defined
    type: json-rules
    successCondition: metadata.annotations['acme.com/slo-target'] != null

  - id: ci_passing
    name: CI Green
    type: github
    filter: 'state == "success" && branch == "main"'

  - id: vuln_critical_zero
    name: No Critical CVEs
    type: sonarqube
    successCondition: metrics.critical_vulnerabilities == 0

Backstage Scorecards, Cortex, or custom jobs querying Prometheus, PagerDuty, and GitHub APIs. Same data feeds service catalog and executive dashboards.

DORA metrics on scorecards

Four keys from Accelerate research:

Collect from CI/CD and incident tooling. Compare teams to themselves over time, not against Netflix on day one.

Low deployment frequency + low failure rate sometimes means fear, not quality — scorecards should flag "no deploys in 30 days" as amber for Tier 1 services.

Presenting results constructively

Team dashboards, not wall of shame. Show "3 services below Tier 1 observability threshold" with links to platform office hours.

Improvement campaigns. Quarter theme: "100% Tier 1 services have runbooks." Platform ships runbook template; scorecard tracks adoption.

Executive rollup. Percentage of Tier 1 services at Level 3+ per capability — trends over quarters.

Avoid tying scorecard grades to individual performance reviews. Gaming follows instantly.

Maturity advancement path

Define what Level N+1 requires and who helps:

Observability Level 2 → 3:
  Requires: distributed tracing on all HTTP handlers
  Platform provides: OpenTelemetry SDK bump in golden path template
  Team action: merge platform PR or adopt manually
  Deadline: none — tracked on scorecard

Platform owns making advancement easy. Product teams own prioritization against feature work — visibility creates negotiation data, not mandates.

Common failure modes

Too many checks. Start with 8–12 high-signal checks. Expand when adoption stabilizes.

Stale automated data. Broken GitHub integration shows all services failing CI — credibility gone.

Checks without owners. Each check maps to a team that fixes failures (platform for CI template, security for CVE scan).

Ignoring context. Legacy mainframe adapter won't have canary deploy — exclude or separate track.

Avoiding metric gaming

When scorecards tie to performance reviews, teams optimize metrics not systems — 100% doc coverage with empty stubs. Prefer automated technical checks over self-reported fields. Human review only for subjective maturity levels with calibration sessions across teams.

Operational notes

Integrate scorecard API with incident retros — repeated incidents on low-scoring services prioritize platform investment. Correlation beats guessing which teams need golden path upgrades.

Review scorecard weights annually — over-weighting documentation maturity starves reliability investment when teams optimize README length instead of SLO coverage.

Weight scorecard metrics by user pain — 100% test coverage matters less than deploy frequency if releases take two weeks.

Scorecard metrics that matter

Metric Target
Deploy frequency > 1/week per service
Lead time for changes < 1 day
MTTR < 1 hour
Change failure rate < 5%

DORA metrics per team, not vanity "100% doc coverage" — executives understand deployment frequency; they don't understand linter scores.

Weighting checks by service tier

Tier 1 checkout might weight: SLO 30%, security 25%, deploy automation 20%, observability 15%, docs 10%. Tier 3 batch flips docs weight near zero. Publish weight formula.

Scorecard-driven platform roadmap

When 60% of Tier 1 services fail distributed tracing enabled, platform ships OTel bump in golden path template rather than nagging 40 teams.

Historical trending

Store weekly score snapshots. Graph pct_tier1_level3_observability over quarters for exec reviews.

Integration with incident data

Join PagerDuty incident count per service with scorecard grade. Low observability plus high incidents prioritizes runbook work with incident commander endorsement.

Executive rollup without blame

Present quarterly: percent Tier-1 services at Level 3+ per capability domain, trend arrow, platform initiatives tied to lowest domain. Never rank individual engineers — rank capability gaps. "Observability lagging security" justifies OTel investment better than "Team X is D grade."

Automating doc freshness checks

Link runbook URL in catalog; weekly crawler asserts HTTP 200 and modified date within 90 days. Stale runbook fails scorecard check automatically — no self-reported checkbox.

Normalizing scores across org size

Raw DORA numbers unfairly compare 3-person team to 40-person product line. Normalize deployment frequency per engineer or per service. Scorecard shows service-level maturity, team rollup separate — exec sees portfolio trend, team sees actionable service list.

Custom checks without plugin hell

Not everything fits Backstage Scorecards plugin — custom cron job queries GitHub API for CODEOWNERS file existence, posts JSON to catalog annotation. Keep checks in Git as YAML either way; avoid spreadsheet side channel reappearing because one check was "too hard" to automate.

Linking scorecards to OKRs

Platform OKR "80% Tier-1 services with SLO" maps directly to scorecard check has_slo — executives see one number, engineers see per-service gap list. Misalignment when OKR uses manual survey while scorecard automated — pick one source of truth.

Scorecard API for CI gates

Tier-1 services below observability Level 3 block prod deploy in CI — pipeline queries catalog scorecard API, fails with link to platform office hours. Hard gate controversial but moved needle when soft nudge ignored for two quarters; start with warn then enforce after remediation sprint.

Closing notes

Scorecard checks should include runbook link HTTP 200 and on-call rotation configured in PagerDuty — operational readiness beyond green CI.

Additional guidance

Service tier metadata drives scorecard weights — checkout Tier-1 failing SLO check ranks above internal cron missing README. Automate tier assignment in catalog from domain tag or manual architect approval; stale tier defaults misallocate platform remediation effort toward low-impact services displaying red grades executives misinterpret as customer-facing risk.

Export scorecard pass rate to executive quarterly deck as trend line not snapshot — flat pass rate during headcount doubling indicates platform kept pace; declining pass rate triggers headcount or scope discussion with engineering leadership backed by data not anecdotal platform team frustration.

Treat scorecard regressions after template deprecation as platform bug — not team negligence — when eighty percent of services fail new check simultaneously.

Resources

Frequently asked questions

What should a service scorecard measure?

Production readiness signals: deployment frequency, lead time, change failure rate, MTTR (DORA), SLO compliance, on-call coverage, dependency freshness, security scan results, and documentation existence. Tailor weights by service tier — payments APIs score differently than internal cron jobs.

How do scorecards differ from service catalogs?

A catalog answers 'what exists and who owns it.' A scorecard answers 'how healthy and mature is it.' Catalogs are descriptive metadata; scorecards are evaluative metrics usually derived automatically from CI, observability, and incident systems.

How do you prevent scorecards from becoming a blame tool?

Frame as improvement tracking, not performance reviews. Publish team-level aggregates, not individual rankings. Pair low scores with platform support and golden path investments — if 80% of services fail a check, fix the template, not the teams.

Hiring a senior Android / Flutter engineer?

I architect and ship production mobile software — Kotlin, Jetpack Compose, Flutter — for robotics, EV infrastructure, fintech, and real-time systems. Open to remote roles in Europe and the US.

Get in touch →