Ownership
Compliance is only useful when it is attributable. "A team running these servers must run these modules" means nothing until every finding lands on exactly one accountable party. So ownership is part of the model, not a reporting dimension added afterwards.
Owners and Teams
An Owner is the lowest unit of management and belongs to exactly one Team. A Team is a group of Owners, child Teams, or both.
Teams form a strict tree: a Team has at most one parent. Telecraft rejects a Team with two parents, because every roll-up would then count it twice.
The hierarchy arrives through a seam, and Telecraft never owns it. The
first-party shape is a teams.yaml file in the estate repository, committed
and reviewed like everything else, with a users.yaml beside it that maps
signed-in identities to Owners. Group-claim mapping from an identity provider
fits behind the same resolution step.
Loading is strict and fails closed. An unknown field, a malformed document, a duplicate id, or an authored object with no owner is a load error that names the file. A finding that routes to nobody would mean the problem exists and nobody is paged, so Telecraft refuses to load that state.
Universal ownership
Every authored object carries an owner. The authored set is:
- Component
- Blueprint
- Tier
- Hop
- Path
- Service
- Requirement
- Exemption
Ownership is an attribute of each object, not a parallel hierarchy. That is finer-grained than "a team owns a collector". A gateway Tier (a position in the collection topology) run by the data-flow team can contain a redaction processor that the security team governs, and an exporter whose endpoint is the gateway team's concern even when it renders into a downstream team's artefact. The rendered artefact for any collector has many owners.
Collectors are not ownable
A Collector is derived and read-only. You never draw it on a canvas, never author it, and never own it directly. It connects, Telecraft matches it into a Tier by selector, and it inherits that Tier's owner, policy, and obligations.
When one subset of a Tier's collectors needs a different owner, split the Tier: the selector already expresses the difference. That keeps the authored graph at a handful of nodes however large the estate grows, and keeps Telecraft free of per-collector state.
Who acts: routing
A finding routes to the owner of the object the finding is about, never the owner of the file it renders into. A broken redaction processor pages the team that owns the processor. A dead exporter pages the team that owns the exporter. An unmet Service floor pages the Service's owner. A finding about a collector routes through the Tier the collector matched into.
Every failure to resolve is an error, never a silent drop. A finding about a collector that names no Tier, or about an object no estate authored, stops the roll-up rather than quietly falling out of the compliance ratios.
Roll-up
A Team's roll-up is the set of findings routed to owners anywhere in its subtree. That set is larger than the sum of its Services: it includes the delivery findings on Tiers the team owns and the component findings on Components it owns. A parent Team's view is bigger than its children's combined service verdicts.
Aggregation is ratio plus worst, per finding kind, never blended. For each kind you get:
- a passing-over-counted ratio, kept as an integer pair;
- a worst-grade badge;
- the waived count, always alongside.
There is no single blended number at any level of the tree, including the root. An exemption-heavy 100% cannot hide, because the waived total sits next to it and every waived finding keeps its diagnosis in the list.
Finding kinds
Telecraft scores each kind separately and never collapses one into another:
| Kind | What it carries |
|---|---|
service_conformance |
Requirement verdicts on a Service in an Environment |
delivery |
Delivery and population findings attached to a Tier |
component_health |
Findings about a Component |
expectation |
Claim failures from the Expectation engine |
Grades
Every finding carries a grade: pass, advisory, or violation. A breach is
graded, never blocked. advisory is worth surfacing; violation means the
floor is unmet. Population findings add a fourth weight of their own,
neutral, which is not a pass: no compliance ratio counts a neutral
finding, where a pass would count in one. See
Population floors.
A kind whose findings are all waived keeps a pass badge. The waived count beside it is what stops that from reading as clean.
Authorisation follows ownership
What a signed-in person can author is derived from the ownership tree, not from a separate role store. There is one source of truth: the ownership metadata in the estate repository.
Where the forge (your git host) supports review routing, Telecraft
generates the forge's code-ownership file from that metadata, and merge
rights stay with the forge. The generated file is a cache, never the source:
people edit teams.yaml and the owner field on objects, and the renderer
emits the file in the configured forge's dialect. Every line carries the
owners of the team plus its ancestors, so review reach comes from the tree
rather than from the directory layout, and the ancestors who govern a team
keep their say.
A forge declares its capabilities up front rather than failing at merge time, so if you run on plain git transport you can see exactly which forge-enforced review you have given up. The render gate (see enforcement points) still holds either way.