Skip to main content

The ROI of Naming Things: How a 3-Segment Key Eliminated Cross-Team Confusion

· 5 min read
Platform Engineering Team

Naming things is famously the hardest problem in computer science. It is also, quietly, one of the most expensive. When four different teams name their namespaces four different ways, the cost shows up in incidents that take longer to diagnose, in onboarding sessions that turn into tribal knowledge transfers, and in a platform team that spends its weeks translating between systems instead of building.

This post is about how a single naming convention — three segments, one key — unified Kubernetes, ArgoCD, Backstage, and Crossplane. And why the return on investment was measured in days saved per week.

The cost of naming drift

Before the convention, every team had its own style:

  • Team A named namespaces payments-api-prod
  • Team B used prod-orders-backend
  • Team C went with frontend_staging

None of these are wrong. All of them are incompatible. When an incident hit payments-api-prod, the first question was always: "What ArgoCD application manages this?" Nobody knew without digging. The answer lived in someone's head, or in a spreadsheet last updated three months ago.

The real cost was not the naming itself — it was the manual mapping required every time a human or a tool needed to cross-reference systems:

QuestionWithout conventionWith convention
Which ArgoCD app manages this namespace?Ask someone, check spreadsheetRead the argocd/app label
Which team owns this?Check JIRA, Slack, or git blameRead the team label
What pods belong to this service across all envs?Manual kubectl on each clusterkubectl get ns -l backstage.io/component=gateway-api
Is this service healthy in prod?Open Grafana, ArgoCD, kubectl separatelyOpen one Backstage Component page

Each of these questions cost 5–15 minutes per occurrence. Multiply by the number of engineers asking them daily, and naming drift was consuming hours per week across the organization.

The semantic key

The convention is simple. Every resource in the platform is addressed by three segments:

{project}-{env}-{service}

payments-prod-api
SegmentWhat it meansWhere it appears
projectOwnership boundary (domain)Backstage Domain, ArgoCD AppProject, namespace prefix
envDeployment targetCluster label, namespace middle segment
serviceIndividual workloadNamespace suffix, Backstage Component suffix

The key insight is that this is not just a naming pattern — it is a contract. When the naming is consistent, tools can talk to each other without a human in the middle.

How one key connects four systems

Here is the full mapping for a single service:

Backstage Domain: payments ← project
ArgoCD AppProject: payments ← project
Backstage System: gateway ← logical grouping
ArgoCD ApplicationSet: gateway ← logical grouping
Backstage Component: gateway-api ← system + service
ArgoCD Application: gateway-api-prod ← system + service + env
Kubernetes Namespace: payments-prod-api ← project + env + service

When a developer opens the Backstage Component page for gateway-api, the Kubernetes plugin finds pods across all clusters using a single label selector: project=payments,service=api. No configuration per environment. No manual registration of each cluster's namespace. The label does the work.

The ArgoCD plugin surfaces sync status per environment using the same label approach. The dependency graph shows which databases and queues this service connects to.

One name, one query, one page, one source of truth.

The 9 labels that make it work

Every namespace in the platform carries 9 required labels:

labels:
project: payments # domain
env: prod # environment
service: api # workload
team: team-payments # owning team
backstage.io/domain: payments # → Backstage Domain
backstage.io/system: gateway # → Backstage System
backstage.io/component: gateway-api # → Backstage Component
argocd/app: gateway-api-prod # → ArgoCD Application
argocd/app-set: gateway # → ArgoCD ApplicationSet

Missing any of these labels fails the PR in CI. There is no exception path. This is not enforced by documentation — it is enforced by code.

The business impact

After rolling out the convention to the first domain team:

MetricBeforeAfter
Time to answer "who owns this namespace?"5–15 min (ask around)0 sec (read label)
Incident cross-referencing between toolsManual, error-proneAutomatic via labels
New service bootstrapping8–15 manual steps1 template, 2 PRs
Namespaces with all required labels< 20%100% (new services)

The convention is the cheapest thing we built and the highest ROI investment in the entire platform. Every tool integration, every automation, every dashboard depends on it. Without consistent naming, the platform is just a collection of tools. With it, the platform is a product.

The lesson

Invest in naming before investing in tooling. A perfect ArgoCD setup with inconsistent namespace names is worse than a basic setup with consistent ones. The naming convention is not a document to write after the architecture is done — it is the foundation the architecture is built on.

Every hour we spent getting the three-segment key right saved ten hours of debugging tool integrations later.


The full naming convention and cross-system mapping are documented in the Platform Convention. The business goals and success metrics are in the Platform PRD.