services.yaml is the customer-authoritative service catalog. Agents use it to know who owns each service, what tier it is, how it depends on other services, and where the runbook lives. Authoring it is optional — sureops will discover services from your telemetry without it — but agents are significantly more useful with it.
Minimum viable contract
Field reference
Core fields
Extended fields (optional, additive)
These fields give agents richer context for fix-PR generation and blast-radius analysis. Teams with the simpler flat schema above continue to parse correctly — unknown nested keys produce warnings, not errors.identifiers — cross-source aliases
Helps sureops match your contract entry with telemetry signals from different sources.
image — container image metadata
Used by the Fix-PR Agent to generate accurate rollback and redeployment actions.
source — source code metadata
Used by the Fix-PR Agent to locate the relevant code path.
owners — structured ownership
Richer ownership metadata for routing review requests.
deploy — deployment mechanism
Used to determine how to apply a fix (Helm rollback vs. Kustomize vs. ArgoCD).
Complete example
Owner auto-derivation from CODEOWNERS
If you omitowner for a service, sureops looks up the repository’s CODEOWNERS file and uses the team that owns the service’s source path.
File locations checked (first match wins): .github/CODEOWNERS, CODEOWNERS, docs/CODEOWNERS.
Match strategy (per service, in order):
src_pathyou declared on the service (most specific)- The service
nameas a directory hint src/<name>and<name>/variants- Catch-all (
*rule, if any)
owned_by edge in the service topology carries source: "explicit" (you declared it) or source: "codeowners" (derived), so the UI and agents can show which is which.
Backstage compatibility
All core field names are taken from the Backstage entity model. If you adopt Backstage later, you can wrap your existing entries in a Backstagekind: Component envelope. sureops also accepts the full Backstage shape directly:
catalog-info.yaml.
Conflict resolution with auto-discovery
sureops discovers services from your telemetry (OTel service names, Kubernetes labels) and merges that data with your contract. Your contract always wins for any field you declared. Auto-discovery only fills in fields you didn’t specify. Provenance ranking (highest wins):manual > customer_contract > telemetry > kubernetes_scan.
In practice: declare what you care about (ownership, runbook, tier). You don’t need to declare fields telemetry already provides (image tags, replica counts, namespace).
Validation rules
namemust match OTel service name format: lowercase letters, digits, and hyphens; must start with a letterrepomust be in<owner>/<repo>or full URL formatdependsOnreferences should resolve to other entries in the same file; unknown references produce a warning, not an errortiermust be one ofP1,P2,P3- Nested blocks (
identifiers,image,source,owners,deploy) must be mappings if present