Set up a service production readiness scorecard
If you signed up for Port on or after May 1, 2026, this scorecard is already set up in your portal. You can follow this guide to customize the checks and thresholds to match your organization's standards.
Scorecards let you define maturity levels for your services, giving platform engineers and R&D managers a clear view of which services meet your organization's readiness standards and which need attention. This guide demonstrates how to set up a service production readiness scorecard using data from GitHub, GitLab, or Azure DevOps integrations, evaluating services against progressive maturity levels: Bronze, Silver, and Gold.
Common use cases
- Define clear, enforceable standards for service ownership and documentation.
- Identify unmaintained or undocumented services before they become incidents.
- Gate deployments or trigger alerts when services drop below a minimum readiness level.
- Give developers a self-service view of exactly what their service is missing.
Prerequisites
This guide assumes the following:
- You have a Port account and have completed the onboarding process.
- You have completed the Create foundational Engineering Intelligence data model guide, which provisions the core Organization, Team, and Service blueprints (with team ownership on services) for GitHub, GitLab, and Azure DevOps.
- You have installed a GitHub (Ocean), GitLab, or Azure DevOps integration.
- You have verified that the
serviceblueprint has values for the repository metadata used in this scorecard. The required properties depend on your integration:
- GitHub (Ocean)
- GitLab
- Azure DevOps
Verify that the service blueprint has values for:
github_url, github_readme, github_gitignore, github_language, github_pr_template, github_visibility, and github_codeowners.
Verify that the service blueprint has values for:
gitlab_url, gitlab_readme, gitlab_language, gitlab_codeowners, gitlab_last_activity, and gitlab_repository_freshness.
Verify that the service blueprint has values for:
ado_url, ado_readme, ado_codeowners, ado_minimumApproverCount, ado_last_activity, and ado_pipeline_builds_30d.
The azureDevopsRepository relation must exist on the service blueprint. It is created automatically when you install the Azure DevOps integration.
All core rules in this scorecard use repository metadata that your git integration can supply. Depending on your provider and mapping, you might need to map some properties to service first. The extend with additional integrations section describes how to enrich the scorecard with data from other tools once you have them installed.
Maturity levels
Port scorecards use four fixed maturity levels. An entity must pass all rules at a given level (and all levels below it) to achieve that level.
| Level | Order | Description |
|---|---|---|
| Basic | 0 (default) | Entity exists but meets no scorecard criteria |
| Bronze | 1 | Foundational hygiene: ownership and documentation present |
| Silver | 2 | Good practices: actively maintained, metadata complete |
| Gold | 3 | Excellence: strict governance and high activity |
Create the scorecard
Blueprint: Service
All rules in the core scorecard use repository metadata on the service blueprint that should be populated from your GitHub, GitLab, or Azure DevOps integration mapping.
- GitHub (Ocean)
- GitLab
- Azure DevOps
| # | Rule | Level | Property | Condition | Requires |
|---|---|---|---|---|---|
| 1 | Has repository URL | Bronze | github_url | is not empty | Git integration |
| 2 | Has README | Bronze | github_readme | is not empty | Git integration |
| 3 | Has team assigned | Bronze | $team | is not empty AND does not contain "default-team" | Port native ownership |
| 4 | Has .gitignore | Bronze | github_gitignore | is not empty | Git integration |
| 5 | Has language defined | Bronze | github_language | is not empty | Git integration |
| 6 | Has PR template | Silver | github_pr_template | is not empty | Git integration |
| 7 | Private repository visibility | Silver | github_visibility | = "private" | Git integration |
| 8 | Has criticality defined | Silver | criticality | is not empty | Git integration |
| 9 | Active repo (pushed in last 30 days) | Silver | github_days_since_last_push | < 30 | Git integration |
| 10 | Has CODEOWNERS | Gold | github_codeowners | is not empty | Git integration |
| 11 | Active repo (pushed in last 7 days) | Gold | github_days_since_last_push | < 7 | Git integration |
Steps
-
Go to the Builder page of your portal.
-
Search for the Service blueprint and select it.
-
Click on the Scorecards tab.
-
If the
production_readinessscorecard does not exist, click + New Scorecard. If it already exists, open it instead. -
Click on the
{...} Edit JSONbutton in the top right corner. -
Paste the following JSON configuration:
Service Production Readiness scorecard - GitHub (click to expand)
{"identifier": "production_readiness","title": "Production Readiness","levels": [{"color": "paleBlue","title": "Basic"},{"color": "bronze","title": "Bronze"},{"color": "silver","title": "Silver"},{"color": "gold","title": "Gold"}],"rules": [{"identifier": "github_has_url","title": "Has repository URL","description": "Service has a repository URL set, confirming it is linked to source control.","level": "Bronze","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "github_url"}]}},{"identifier": "github_has_readme","title": "Has README","description": "Service has a README file in the repository, providing basic documentation.","level": "Bronze","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "github_readme"}]}},{"identifier": "github_has_team","title": "Has team assigned","description": "Service must have a dedicated owning team - default team does not count","level": "Bronze","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "$team"},{"operator": "doesNotContains","property": "$team","value": "default-team"}]}},{"identifier": "github_has_gitignore","title": "Has .gitignore","description": "Repository has a .gitignore file, preventing accidental commits of build artifacts or secrets.","level": "Bronze","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "github_gitignore"}]}},{"identifier": "github_has_language","title": "Has language defined","description": "Repository has a detected primary language, useful for routing and tooling decisions.","level": "Bronze","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "github_language"}]}},{"identifier": "github_has_pr_template","title": "Has PR template","description": "Repository includes a pull request template to guide contributors.","level": "Silver","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "github_pr_template"}]}},{"identifier": "github_private_visibility","title": "Private repository visibility","description": "Repository visibility is private, reducing exposure of internal code.","level": "Silver","query": {"combinator": "and","conditions": [{"operator": "=","property": "github_visibility","value": "private"}]}},{"identifier": "github_has_criticality","title": "Has criticality defined","description": "Service has a criticality level set, enabling incident routing and risk prioritization.","level": "Silver","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "criticality"}]}},{"identifier": "github_active_repo_30d","title": "Active repo (pushed in last 30 days)","description": "Repository has been pushed to within the last 30 days, indicating it is actively maintained.","level": "Silver","query": {"combinator": "and","conditions": [{"operator": "<","property": "github_days_since_last_push","value": 30}]}},{"identifier": "github_has_codeowners","title": "Has CODEOWNERS","description": "Repository has a CODEOWNERS file, enforcing mandatory code review by designated owners.","level": "Gold","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "github_codeowners"}]}},{"identifier": "github_active_repo_7d","title": "Active repo (pushed in last 7 days)","description": "Repository has been pushed to within the last 7 days - elite activity level.","level": "Gold","query": {"combinator": "and","conditions": [{"operator": "<","property": "github_days_since_last_push","value": 7}]}}]} -
Click Save to create the scorecard.
github_days_since_last_push is a calculated property on service and requires last_push to be populated. Properties like github_codeowners, github_pr_template, github_gitignore, and github_visibility come from your git integration mapping. criticality is typically set by your team as service metadata. Newly ingested services might show Basic until the integration completes its first sync and your mappings populate these fields.
| # | Rule | Level | Property | Condition | Requires |
|---|---|---|---|---|---|
| 1 | Has repository URL | Bronze | gitlab_url | is not empty | GitLab integration |
| 2 | Has README | Bronze | gitlab_readme | is not empty | GitLab integration |
| 3 | Has team assigned | Bronze | $team | is not empty AND does not contain "default-team" | Port native ownership |
| 4 | Has language defined | Bronze | gitlab_language | is not empty | GitLab integration |
| 5 | Has criticality defined | Silver | criticality | is not empty | Service metadata |
| 6 | Active repo (last 30 days) | Silver | gitlab_repository_freshness | < 30 (days since last push) | GitLab integration |
| 7 | Has CODEOWNERS | Gold | gitlab_codeowners | is not empty | GitLab integration |
| 8 | Active repo (last 7 days) | Gold | gitlab_repository_freshness | < 7 (days since last push) | GitLab integration |
Steps
-
Go to the Builder page of your portal.
-
Search for the Service blueprint and select it.
-
Click on the Scorecards tab.
-
Open the existing
production_readinessscorecard. -
Click on the
{...} Edit JSONbutton in the top right corner. -
Append the following rules to the
rulesarray in the existing scorecard JSON:GitLab rules to append to the production_readiness scorecard (click to expand)
[{"identifier": "gitlab_has_url","title": "Has repository URL","description": "Service has a repository URL set, confirming it is linked to source control.","level": "Bronze","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "gitlab_url"}]}},{"identifier": "gitlab_has_readme","title": "Has README","description": "Service has a README file in the repository, providing basic documentation.","level": "Bronze","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "gitlab_readme"}]}},{"identifier": "gitlab_has_team","title": "Has team assigned","description": "Service has a team assigned in Port, ensuring clear ownership.","level": "Bronze","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "$team"},{"operator": "doesNotContains","property": "$team","value": "default-team"}]}},{"identifier": "gitlab_has_language","title": "Has language defined","description": "Repository has a detected primary language, useful for routing and tooling decisions.","level": "Bronze","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "gitlab_language"}]}},{"identifier": "gitlab_has_criticality","title": "Has criticality defined","description": "Service has a criticality level set, enabling incident routing and risk prioritization.","level": "Silver","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "criticality"}]}},{"identifier": "gitlab_active_repo_30d","title": "Active repo (last 30 days)","description": "Repository has been pushed to within the last 30 days, indicating it is actively maintained.","level": "Silver","query": {"combinator": "and","conditions": [{"operator": "<","property": "gitlab_repository_freshness","value": 30}]}},{"identifier": "gitlab_has_codeowners","title": "Has CODEOWNERS","description": "Repository has a CODEOWNERS file, enforcing mandatory code review by designated owners.","level": "Gold","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "gitlab_codeowners"}]}},{"identifier": "gitlab_active_repo_7d","title": "Active repo (last 7 days)","description": "Repository has been pushed to within the last 7 days - elite activity level.","level": "Gold","query": {"combinator": "and","conditions": [{"operator": "<","property": "gitlab_repository_freshness","value": 7}]}}] -
Click Save to update the scorecard.
gitlab_repository_freshness is a calculationProperty on the service blueprint that computes the number of days since the last push from the gitlab_last_activity property. The active_repo_30d and active_repo_7d rules use < 30 and < 7 respectively to check how recently the repository was updated. criticality is typically set by your team as service metadata. Newly ingested services might show Basic until the integration completes its first sync and your mappings populate these fields.
| # | Rule | Level | Property | Condition |
|---|---|---|---|---|
| 1 | Has repository linked | Bronze | relation: azureDevopsRepository | is not empty |
| 2 | Has README | Bronze | ado_readme | is not empty |
| 3 | Has team assigned | Bronze | $team | is not empty AND does not contain "default-team" |
| 4 | Has criticality defined | Silver | criticality | is not empty |
| 5 | Has CI builds | Silver | ado_pipeline_builds_30d | > 0 |
| 6 | Minimum approver count >= 1 | Silver | ado_minimumApproverCount | >= 1 |
| 7 | Minimum approver count >= 2 | Gold | ado_minimumApproverCount | >= 2 |
Steps
-
Go to the Builder page of your portal.
-
Search for the Service blueprint and select it.
-
Click on the Scorecards tab.
-
Open the existing
production_readinessscorecard. -
Click on the
{...} Edit JSONbutton in the top right corner. -
Append the following rules to the
rulesarray in the existing scorecard JSON:Azure DevOps rules to append to the production_readiness scorecard (click to expand)
[{"identifier": "ado_has_repository","title": "Has repository linked","description": "Service is linked to an Azure Repos repository.","level": "Bronze","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","relation": "azureDevopsRepository"}]}},{"identifier": "ado_has_readme","title": "Has README","description": "Service has a README file in the repository, providing basic documentation.","level": "Bronze","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "ado_readme"}]}},{"identifier": "ado_has_team","title": "Has team assigned","description": "Service has a dedicated owning team - default team does not count.","level": "Bronze","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "$team"},{"operator": "doesNotContains","property": "$team","value": "default-team"}]}},{"identifier": "ado_has_criticality","title": "Has criticality defined","description": "Service has a criticality level set, enabling incident routing and risk prioritization.","level": "Silver","query": {"combinator": "and","conditions": [{"operator": "isNotEmpty","property": "criticality"}]}},{"identifier": "ado_has_ci_pipeline","title": "Has CI builds","description": "Service has at least one pipeline build in the last 30 days, confirming CI/CD is active.","level": "Silver","query": {"combinator": "and","conditions": [{"operator": ">","property": "ado_pipeline_builds_30d","value": 0}]}},{"identifier": "ado_min_approver_count_1","title": "Minimum approver count >= 1","description": "Branch policy requires at least one approver before merging.","level": "Silver","query": {"combinator": "and","conditions": [{"operator": ">=","property": "ado_minimumApproverCount","value": 1}]}},{"identifier": "ado_min_approver_count_2","title": "Minimum approver count >= 2","description": "Branch policy requires at least two approvers - enforcing rigorous code review.","level": "Gold","query": {"combinator": "and","conditions": [{"operator": ">=","property": "ado_minimumApproverCount","value": 2}]}}] -
Click Save to update the scorecard.
ado_readme, ado_codeowners, and ado_url are mirror properties on service populated from the azureDevopsRepository relation. ado_minimumApproverCount is populated from the branch policy mapping in your Azure DevOps integration configuration. ado_pipeline_builds_30d is an aggregation property that counts Azure DevOps pipeline builds in the last 30 days. criticality is typically set by your team as service metadata. Newly ingested services might show Basic until the integration completes its first sync and your mappings populate these fields.
Extend with additional integrations
The core scorecard covers everything a git integration provides. Once you install other tools, you can append additional rules to the rules array to capture signals from those systems. Some examples:
- PagerDuty: check that each service has an active on-call assignment (
pagerduty_oncallis not empty). Useful as a Gold-level requirement for production services. - SonarQube: enforce minimum code coverage, cap the number of open code smells, or require a passing security rating.
- Snyk: gate Silver or Gold on having zero critical vulnerabilities or a clean dependency audit.
- Datadog / New Relic: require that services have APM monitoring configured as a Gold-level requirement.
- CI coverage by provider: optionally add a CI rule using your provider-specific property (for example,
workflow_countfor GitHub orpipeline_countfor GitLab) after you verify the property exists onservice.
To add a rule, go to the Service blueprint in the Builder, open the Scorecards tab, click Service Production Readiness - Edit JSON, and append the new rule object to the rules array.
Visualize scorecard results
Once the scorecard is in place, create a dashboard to monitor production readiness across all services.
Create the dashboard
- Navigate to your software catalog.
- Click on the
+button in the left sidebar. - Select New folder.
- Name the folder Engineering Intelligence and click Create.
- Inside the Engineering Intelligence folder, click
+again. - Select New dashboard.
- Name the dashboard Service Production Readiness Scorecards and click Create.
Add widgets
You can populate the dashboard using either an API script or by manually creating each widget through the UI.
- API script
- Manual setup
The fastest way to set up the dashboard is by using Port's API to create all widgets at once.
Get your Port API token
-
In your Port portal, click on your profile picture in the top right corner.
-
Select Credentials.
-
Click Generate API token.
-
Copy the generated token and store it as an environment variable:
export PORT_ACCESS_TOKEN="YOUR_GENERATED_TOKEN"EU regionIf your portal is hosted in the EU region, replace
api.port.iowithapi.port-eu.ioin the dashboard creation command below.
Create the dashboard with widgets
Save the following JSON to a file named pr_scorecards_dashboard.json. Choose the tab that matches your git provider:
- GitHub (Ocean)
- GitLab
- Azure DevOps
Dashboard JSON payload - GitHub (click to expand)
{
"identifier": "production_readiness_scorecards",
"title": "Service Production Readiness Scorecards",
"icon": "Shield",
"type": "dashboard",
"parent": "engineering_intelligence",
"widgets": [
{
"id": "prScorecardsDashboardWidget",
"type": "dashboard-widget",
"layout": [
{
"height": 400,
"columns": [
{"id": "serviceLevelDistribution", "size": 6},
{"id": "servicesBelowBronze", "size": 6}
]
},
{
"height": 400,
"columns": [
{"id": "serviceReadinessTable", "size": 12}
]
}
],
"widgets": [
{
"id": "serviceLevelDistribution",
"type": "entities-pie-chart",
"title": "Service Production Readiness Level Distribution",
"icon": "Pie",
"description": "Distribution of production readiness scorecard levels across services",
"blueprint": "service",
"property": "scorecard#production_readiness",
"dataset": {
"combinator": "and",
"rules": []
}
},
{
"id": "servicesBelowBronze",
"type": "entities-number-chart",
"title": "Services Below Bronze",
"icon": "Alert",
"description": "Number of services that have not reached Bronze readiness level",
"blueprint": "service",
"chartType": "countEntities",
"calculationBy": "entities",
"func": "count",
"unit": "none",
"dataset": {
"combinator": "and",
"rules": [
{
"operator": "=",
"property": "scorecard#production_readiness",
"value": "Basic"
}
]
}
},
{
"id": "serviceReadinessTable",
"type": "table-entities-explorer",
"displayMode": "widget",
"title": "Service Production Readiness Overview",
"icon": "Table",
"description": "Services with their production readiness scorecard level and key hygiene indicators",
"blueprint": "service",
"dataset": {"combinator": "and", "rules": []},
"excludedFields": [],
"blueprintConfig": {
"service": {
"groupSettings": {"groupBy": ["$team"]},
"propertiesSettings": {
"order": ["$title", "$team", "scorecard-property#production_readiness", "github_readme", "github_codeowners", "criticality", "github_visibility", "github_days_since_last_push", "github_language"],
"shown": ["$title", "$team", "scorecard-property#production_readiness", "github_readme", "github_codeowners", "criticality", "github_visibility", "github_days_since_last_push", "github_language"]
},
"filterSettings": {"filterBy": {"combinator": "and", "rules": []}},
"sortSettings": {"sortBy": []}
}
}
}
]
}
]
}
Dashboard JSON payload - GitLab (click to expand)
{
"identifier": "production_readiness_scorecards",
"title": "Service Production Readiness Scorecards",
"icon": "Shield",
"type": "dashboard",
"parent": "engineering_intelligence",
"widgets": [
{
"id": "prScorecardsDashboardWidget",
"type": "dashboard-widget",
"layout": [
{
"height": 400,
"columns": [
{"id": "serviceLevelDistribution", "size": 6},
{"id": "servicesBelowBronze", "size": 6}
]
},
{
"height": 400,
"columns": [
{"id": "serviceReadinessTable", "size": 12}
]
}
],
"widgets": [
{
"id": "serviceLevelDistribution",
"type": "entities-pie-chart",
"title": "Service Production Readiness Level Distribution",
"icon": "Pie",
"description": "Distribution of production readiness scorecard levels across services",
"blueprint": "service",
"property": "scorecard#production_readiness",
"dataset": {
"combinator": "and",
"rules": []
}
},
{
"id": "servicesBelowBronze",
"type": "entities-number-chart",
"title": "Services Below Bronze",
"icon": "Alert",
"description": "Number of services that have not reached Bronze readiness level",
"blueprint": "service",
"chartType": "countEntities",
"calculationBy": "entities",
"func": "count",
"unit": "none",
"dataset": {
"combinator": "and",
"rules": [
{
"operator": "=",
"property": "scorecard#production_readiness",
"value": "Basic"
}
]
}
},
{
"id": "serviceReadinessTable",
"type": "table-entities-explorer",
"displayMode": "widget",
"title": "Service Production Readiness Overview",
"icon": "Table",
"description": "Services with their production readiness scorecard level and key hygiene indicators",
"blueprint": "service",
"dataset": {"combinator": "and", "rules": []},
"excludedFields": [],
"blueprintConfig": {
"service": {
"groupSettings": {"groupBy": ["$team"]},
"propertiesSettings": {
"order": ["$title", "$team", "scorecard-property#production_readiness", "gitlab_readme", "gitlab_codeowners", "criticality", "gitlab_repository_freshness", "gitlab_last_activity", "gitlab_language"],
"shown": ["$title", "$team", "scorecard-property#production_readiness", "gitlab_readme", "gitlab_codeowners", "criticality", "gitlab_repository_freshness", "gitlab_last_activity", "gitlab_language"]
},
"filterSettings": {"filterBy": {"combinator": "and", "rules": []}},
"sortSettings": {"sortBy": []}
}
}
}
]
}
]
}
Dashboard JSON payload - Azure DevOps (click to expand)
{
"identifier": "production_readiness_scorecards",
"title": "Service Production Readiness Scorecards",
"icon": "Shield",
"type": "dashboard",
"parent": "engineering_intelligence",
"widgets": [
{
"id": "prScorecardsDashboardWidget",
"type": "dashboard-widget",
"layout": [
{
"height": 400,
"columns": [
{"id": "serviceLevelDistribution", "size": 6},
{"id": "servicesBelowBronze", "size": 6}
]
},
{
"height": 400,
"columns": [
{"id": "serviceReadinessTable", "size": 12}
]
}
],
"widgets": [
{
"id": "serviceLevelDistribution",
"type": "entities-pie-chart",
"title": "Service Production Readiness Level Distribution",
"icon": "Pie",
"description": "Distribution of production readiness scorecard levels across services",
"blueprint": "service",
"property": "scorecard#production_readiness",
"dataset": {
"combinator": "and",
"rules": []
}
},
{
"id": "servicesBelowBronze",
"type": "entities-number-chart",
"title": "Services Below Bronze",
"icon": "Alert",
"description": "Number of services that have not reached Bronze readiness level",
"blueprint": "service",
"chartType": "countEntities",
"calculationBy": "entities",
"func": "count",
"unit": "none",
"dataset": {
"combinator": "and",
"rules": [
{
"operator": "=",
"property": "scorecard#production_readiness",
"value": "Basic"
}
]
}
},
{
"id": "serviceReadinessTable",
"type": "table-entities-explorer",
"displayMode": "widget",
"title": "Service Production Readiness Overview",
"icon": "Table",
"description": "Services with their production readiness scorecard level and key hygiene indicators",
"blueprint": "service",
"dataset": {"combinator": "and", "rules": []},
"excludedFields": [],
"blueprintConfig": {
"service": {
"groupSettings": {"groupBy": ["$team"]},
"propertiesSettings": {
"order": ["$title", "$team", "scorecard-property#production_readiness", "ado_readme", "ado_codeowners", "ado_minimumApproverCount", "ado_pipeline_builds_30d", "criticality"],
"shown": ["$title", "$team", "scorecard-property#production_readiness", "ado_readme", "ado_codeowners", "ado_minimumApproverCount", "ado_pipeline_builds_30d", "criticality"]
},
"filterSettings": {"filterBy": {"combinator": "and", "rules": []}},
"sortSettings": {"sortBy": []}
}
}
}
]
}
]
}
Then run the following command to create the dashboard with all widgets:
curl -s -X POST "https://api.port.io/v1/pages" \
-H "Authorization: Bearer $PORT_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d @pr_scorecards_dashboard.json | python3 -m json.tool
The script assumes an engineering_intelligence folder already exists in your catalog. If you haven't created it yet, follow steps 1-4 in the Create the dashboard section first.
Scorecard level distribution
Production readiness level distribution pie chart (click to expand)
- Click
+ Widgetand select Pie Chart. - Title:
Service Production Readiness Level Distribution. - Description:
Distribution of production readiness scorecard levels across services. - Choose Service as the Blueprint.
- Select
Service Production Readinessfrom the Breakdown by property dropdown (this is thescorecard#production_readinessproperty). - Click Save.
Attention metrics
Services below bronze number chart (click to expand)
-
Click
+ Widgetand select Number Chart. -
Title:
Services Below Bronze. -
Description:
Number of services that have not reached Bronze readiness level. -
Select
Count EntitiesChart type and choose Service as the Blueprint. -
Add this JSON to the Additional filters editor:
{"combinator": "and","rules": [{"operator": "=","property": "scorecard#production_readiness","value": "Basic"}]} -
Click Save.
Scorecard table
Service production readiness overview table (click to expand)
- Click
+ Widgetand select Table. - Title:
Service Production Readiness Overview. - Description:
Services with their production readiness scorecard level and key hygiene indicators. - Choose Service as the Blueprint.
- Group by Team.
- Configure the displayed columns to show: title, team, production readiness level, README, CODEOWNERS, criticality, repository freshness or visibility, last activity, and language.
- Click Save.
Next steps
- Add automations: Use Port automations to notify teams via Slack when their service drops below Bronze, or create Jira tickets for services missing ownership.
- Customize thresholds: The activity rules use date-based or numeric thresholds. Adjust these values to match your team's release cadence.
- Combine with delivery metrics: Combine this scorecard with the Measure PR delivery metrics guide to get both hygiene and velocity signals in one dashboard.
Related guides
- Measure PR delivery metrics : Configure the delivery metrics properties that complement this readiness scorecard.
- Ensure production readiness : A broader guide covering PagerDuty on-call mapping and deployment gating.