The Ownership Record
Making the owner of a service retrievable at 3am by a stranger — the record, what it contains, how it decays, and how transfers actually work.
The question, the obvious approach, and why it breaks
Every lesson starts where the work starts: an operational problem, a first attempt that is entirely reasonable, and the way production disagrees with it.
Given that a service needs a named owner, where does that answer live so that someone who has never seen the service can find it under pressure?
Shared Ownership establishes that every production service needs a named owning team. That is the necessary half. The operational half is that the answer has to be retrievable — by an alerting system at 3am, by an engineer in another timezone, by a dependency team debugging a cascade — without asking a human who might be asleep.
Everyone knows which team owns which service. It is in the team charter, and if you are not sure you can ask in the engineering channel.
Asking in a channel works during working hours in one timezone and fails in exactly the situation that matters. The first ten minutes of a cross-team incident go to routing rather than diagnosis.
- Asking in a channel works during working hours in one timezone and fails in exactly the situation that matters. The first ten minutes of a cross-team incident go to routing rather than diagnosis.
- Knowledge that lives only in people leaves with them. The reorg that dissolved a team does not update anyone's memory of what that team owned.
- Alert routing is configured separately from the ownership record, so the two drift. Pages route to a rotation that no longer exists and nobody notices until an alert fires on a quiet weekend.
- A dependency team debugging a cascade needs to reach whoever owns the failing downstream service. Without a record, they escalate to a manager, who escalates further, and the incident acquires a phone tree (Cascading Failure: When the Response to Failure Causes More Failure).
- Orphans are invisible. A service whose owning team dissolved keeps running and keeps being depended on, and nobody discovers it is unowned until it fails.
What is actually happening
Underneath the tooling, which is the part that survives a change of tool.
- The record is a routing table for questions, and its consumers are mostly machines: the alerting system deciding where to page, the deploy pipeline deciding who approves, the dashboard generator deciding what to build, the dependency graph deciding who to notify about a breaking change.
- Because the consumers are machines, the record has to be structured and it has to be the single source. An ownership field that exists in three places has three different answers within a quarter.
- The decay mechanism is specific and worth naming: ownership records go stale silently. Nothing fails when a record is wrong. It fails later, once, at high cost, in a way that looks like an alerting problem rather than a data problem.
- The countermeasure is derivation. If alert routing, dashboard links and escalation paths are *generated* from the record, then the record being wrong causes visible everyday friction rather than a single invisible failure. Systems that are read constantly stay true; systems that are read once a year do not.
- Ownership is also distinct from operational context, and both are needed. Knowing which team owns a service is not enough at 3am; you also need the escalation path, the tier, the dependencies and the runbook. In practice these live together, which is why the record is usually a service catalogue rather than a field.
What the record has to contain
The test for each field is whether someone needs it during an incident, or whether a system needs it to route correctly. Fields that meet neither test are catalogue decoration and will not be maintained.
Note the reviewed field. It is the only defence against silent decay: nothing else in this record fails visibly when it becomes wrong.
1service: checkout-api2tier: 1 # customer-facing, handles payment3owner:4 team: payments # a team, never a person5 rotation: payments-oncall # resolves to a human at page time6 escalation: payments-lead # when the rotation does not respond7 slack: "#team-payments"8links:9 repo: github.com/acme/checkout-api10 dashboard: grafana/d/checkout-overview11 runbook: runbooks/checkout-api.md12 slo: slo/checkout-availability.yaml13depends_on: # what our failure needs, and who to tell14 - payments-provider-gateway15 - postgres-checkout16 - feature-flag-service17depended_on_by: # who to notify before a breaking change18 - web-storefront19 - mobile-bff20reviewed: 2026-06-14 # staleness is the failure modeThe two dependency directions carry different weight. depends_on is for the operator asking what could be causing this. depended_on_by is for the owner asking who to warn before a breaking change — and it is the field most often missing, because nothing forces you to fill it in until you have already broken someone.
Transfer as a procedure
Ownership changes are common — reorgs, team splits, a service outliving the project that produced it. They are also where ownership records most often become wrong, because the field edit takes ten seconds and the actual handover takes weeks.
The asymmetry is the whole problem: after the edit, the pager routes to a team that cannot yet operate the service. The record is correct and the situation is worse than before it was updated.
- 1Agree
Both teams and their managers accept the transfer, including the operational load it carries.
fails by Assigned in a reorg document with neither team consulted.
evidence An explicit acceptance, not an org chart implying it.
- 2Assess
Run a readiness review against the current state, so the receiving team learns what they are inheriting (Production Readiness Review).
fails by Skipped, so gaps become the new owner's surprise during their first incident.
evidence Status per dimension, and an agreed list of what is missing.
- 3Teach
Walk the receiving team through architecture, dependencies, known failure modes and the runbook.
fails by A single handover meeting and a document link.
evidence The new team can answer "what breaks most often and what do you do about it?".
- 4Shadow
New team takes the pager with the old team as escalation, for a defined period.
fails by Hard cutover on a date, usually the last day of a quarter.
evidence The new team has handled at least one real alert with support available.
- 5Cut over
Record updated; derived routing, dashboards and approvers follow automatically.
fails by Record updated in one place while alert routing keeps the old value.
evidence A test alert routes to the new rotation.
- 6Retire the escalation
Old team removed from the escalation path once the new team is operating independently.
fails by Left in place indefinitely, so the previous owners keep getting called and the transfer never completes.
evidence A dated decision, made after the shadow period rather than instead of it.
The shadow period is the step that gets cut when a reorg has a date. It is also the only step that produces the evidence the transfer worked.
How the record goes wrong
Each of these produces a record that looks correct. That is what makes them expensive: a missing entry is visible and gets fixed, while a plausible wrong entry survives until an alert tests it.
| Trigger | Symptom | Cause | Response |
|---|---|---|---|
| Team dissolved in a reorg | Alert routes into a rotation with no members | The record names a team that no longer exists; nothing validated it | Resolve owners against the current team directory on a schedule; empty rotation is a production defect |
| Individual named as owner | Page goes to someone on holiday, or someone who left | A person in a field that should hold a team | Name teams; let the rotation resolve to a person at page time (On-Call Is Production Ownership) |
| Alert routing configured separately | Catalogue and pager disagree; both look authoritative | Two sources of truth for the same fact | Generate routing from the record so drift is impossible rather than merely discouraged |
| Service transferred by field edit | New owners paged for a system they have never operated | Record updated without a handover | Treat transfer as a procedure with a shadow period |
| Shared library or pipeline with no owner | Everyone depends on it; nobody upgrades or patches it | Shared components fall outside per-service ownership | Owning shared infrastructure is a funded commitment, not a label (The Internal Developer Platform) |
| Decommissioned service still listed | Catalogue is large and partly fictional; people stop trusting it | No lifecycle state, so nothing is ever removed | Give records a lifecycle and prune; a catalogue people distrust is not consulted at 3am |
How to do it properly
Most important first.
- Keep the record in version control alongside the service, so ownership changes go through review and have a history you can read.
- Include, at minimum: owning team, escalation path, tier, repository, dashboard, runbook, on-call rotation, and the dependencies both ways.
- Derive everything downstream from it — alert routing, dashboard ownership labels, deploy approvers, the service catalogue page. Derivation is what keeps it honest.
- Add a
revieweddate and treat a stale one as a defect on the owning team's board, in the same way an expiring certificate is. - Detect orphans actively: any service whose owning team does not resolve to a current team, or whose rotation has no members, is a production defect (Access Review).
- Treat transfer as an event with a procedure, not as a field edit. The handover is the work; updating the record is the last step of it, not the whole of it.
- Make it cheap to register a service. A record that requires a ticket and an approval will simply not be created for the service someone stood up on Friday.
How much can this affect
Every production change has a blast radius. Stated as a scale so it is comparable between changes rather than adjectival — and paired with what actually contains it, because a wide scope with a real containment mechanism is a different situation from a wide scope with none.
Contained to services whose record is wrong — but a wrong record on a shared dependency turns one team's incident into everyone's.
What can go wrong
- The record maintained separately from alert routing, so both exist and disagree.
- A "temporary" owner assigned during a reorg, which becomes permanent by inertia and is discovered during an incident by a team who did not know they owned it.
- An individual named as owner rather than a team, which fails the moment that person is on holiday and permanently when they leave.
- A shared platform component recorded as owned by "Platform" where Platform has neither the capacity nor the authority to change it — an orphan with a label (Platform Engineering).
- A catalogue that becomes an ownership museum: every service ever created, no lifecycle, no way to tell running from decommissioned.
- Transfer performed as a field edit with no handover, so the new owners hold the pager for a system they cannot operate.
- "We have a spreadsheet, so we have an ownership record." A spreadsheet nothing reads from is documentation. The property that matters is that something downstream breaks visibly when it is wrong.
- "The record should name a person so there is real accountability." Individuals go on holiday and leave. Name a team, and let the rotation resolve to a person at the moment of paging (On-Call Is Production Ownership).
- "Ownership means the owning team writes all the code." It means they are accountable for it running. Other teams contributing through review is normal and healthy.
- "If it is in the catalogue it is owned." A catalogue entry pointing at a dissolved team is an orphan that looks owned, which is worse than an obvious gap.
Operating it
Evidence is the signal, not the intention. Rollback is sometimes 'you cannot, and that is the point'.
- Every alerting rule resolves to a rotation with at least one current member.
- A stranger can get from an alert to an owning team, a dashboard and a runbook in under a minute, without asking anyone.
- The record is generated-from rather than duplicated: changing it changes where pages go.
- Orphan detection runs and finds nothing, or finds something and it gets fixed.
- The last ownership transfer has a written handover attached to it.
- An ownership transfer is reversible during the overlap period and much less so afterwards, which is the argument for the overlap. Keep the previous owners on the escalation path for a defined period rather than cutting over on a date.
- If a service was assigned to a team that cannot operate it, reversing quickly is much cheaper than waiting for the incident that proves it. The record being wrong is a smaller problem than a rotation that will not respond.
- Automate derivation: alert routing, dashboards, catalogue pages and deploy approvers generated from one record (Policy as Code).
- Automate orphan and staleness detection — unresolvable teams, empty rotations, records not reviewed within a period.
- Automate the registration path so it is faster than not registering.
- Do not automate the assignment of ownership. Who *should* own something is an organisational decision with real consequences for the people who will carry the pager, and a heuristic based on commit history will produce answers that are technically defensible and socially wrong.
- A catalogue is infrastructure with its own maintenance cost, and it is the kind that quietly stops being maintained. Deriving things from it is what makes the maintenance self-enforcing, and that integration work is not free.
- Structured records make ownership legible, which makes it negotiable. Teams will argue about entries in a way they never argued about tacit understanding, and some of those arguments are worth having.
- Strict registration requirements slow down standing up a new service, which is precisely when people are least inclined to tolerate ceremony.
Where this applies
This domain is unusually tool- and organisation-dependent. These labels say what each claim is specific to, and what a different platform, provider or organisation does instead.
- ORG-SPECIFICTeam structure, escalation conventions and what a "service" even is are organisational. A single-team company needs no record; a company where teams reorganise annually needs derivation, because manual maintenance loses to reorg velocity.
- SCALE-SPECIFICThe cost of a missing record scales with the number of services and the number of teams, not with traffic. Under about ten services and two teams, memory genuinely works. Over about thirty, it demonstrably does not.
Where the depth lives
This domain teaches delivery and operation, and hands the mechanism off to the domain that owns it.
- — System Design — service boundaries as the thing ownership records follow, and what happens when the boundaries and the teams disagree.