Skip to content

Scorecards

Scorecards score every entity against rules you define across four categories: documentation, manifest quality, ownership, and security. Each entity gets a letter grade (A+ to F) that updates automatically as metadata changes.

  1. Define categories and rules - What standards matter to your organization
  2. Automated evaluation - Shoehorn scores entities against rules automatically
  3. Grade assignment - Each entity receives a letter grade (A+ to F)
  4. Track improvement - Monitor scores over time

Shoehorn ships with four default scoring categories:

CategoryWeightDescription
Documentation25%README, descriptions, runbooks, changelogs
Manifest35%Service metadata completeness
Ownership20%Team assignment and relations
Security20%Security tooling and vulnerability status
RulePointsSeverityWhat It Checks
readme-exists10RequiredEntity has a README file
description-exists5RequiredEntity has a description
runbooks-exist5RecommendedRunbooks are defined
changelog-exists5RecommendedChangelog path is set
RulePointsSeverityWhat It Checks
service-name5RequiredService name is defined
service-type5RequiredService type is set
service-tier5RecommendedService tier is assigned
lifecycle-set5RequiredLifecycle stage is set
has-tags5RecommendedAt least one tag exists
has-links5RecommendedAt least one link exists
has-interfaces5RecommendedAPI interfaces are defined
RulePointsSeverityWhat It Checks
has-owner10RequiredAn owner team is assigned
team-topic5RecommendedRepository has team topic
has-relations5RecommendedRelations are defined
RulePointsSeverityWhat It Checks
dependabot-enabled5RecommendedDependabot is active on repo
codeql-enabled5RecommendedCodeQL scanning is enabled
secret-scanning5RecommendedSecret scanning is enabled
no-critical-vulns5RequiredNo critical/high vulnerabilities
GradeScore Range
A+97-100
A93-96
A-90-92
B+87-89
B83-86
B-80-82
C+77-79
C73-76
C-70-72
D+67-69
D63-66
D-60-62
F0-59

Rules use different check types to evaluate entities:

Check TypeDescriptionExample Config
existsChecks if something existstarget: "README.md"
manifest_fieldChecks a manifest field valuefield: "service.name"
patternPattern matchingpattern: "^[a-z0-9-]+$"
externalExternal data checksource: "repository_topics"
percentagePercentage-based thresholdsource: "coverage", value: 80

Navigate to any entity and click the Scorecard tab to see:

  • Overall score and grade
  • Category breakdown with individual rule results
  • Pass/fail status for each rule
  • Recommendations for improvement

The governance dashboard at Governance > Dashboard shows:

  • Organization-wide average score and grade
  • Score distribution across all entities
  • Top entities needing improvement
Terminal window
curl -X POST https://shoehorn.example.com/api/v1/scorecard/rules \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"id": "has-oncall",
"name": "On-Call Rotation",
"description": "Service must have an on-call rotation defined",
"category_id": "ownership",
"check_type": "manifest_field",
"config": {
"field": "extras",
"expected": "oncall"
},
"points": 10,
"severity": "recommended"
}'
Terminal window
curl -X POST https://shoehorn.example.com/api/v1/scorecard/categories \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "reliability",
"display_name": "Reliability",
"weight": 15,
"description": "Service reliability and SLA standards"
}'

Teams can override specific rules for their entities with justification:

Terminal window
curl -X POST https://shoehorn.example.com/api/v1/entities/<id>/scorecard/overrides \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"rule_id": "dependabot-enabled",
"disabled": true,
"reason": "Using Snyk instead of Dependabot",
"expires_at": "2027-06-30"
}'

Overrides can:

  • Disable a rule (with required justification)
  • Change points (custom point value)
  • Set expiration (auto-revert after date)

You can define scorecard configuration within your manifest for team-level customization:

.shoehorn/scorecard.yml
schemaVersion: 1
kind: TeamScorecard
metadata:
team: payments-team
description: "Custom scorecard for payments team"
extends: "global" # Inherit from global scorecard
categories:
reliability:
weight: 20
rules:
- id: has-slo
name: "SLO Defined"
description: "Service has an SLO target"
checkType: manifest_field
config:
field: "annotations.slo-target"
points: 10
severity: required