How one repository describes the organization
The organization as files
The catalog is a git repository of small YAML files. Journeys, domains, contexts and products form its hierarchy, each a file named by its path, such as contexts/shop.store.ordering.yaml, and a product's file names the team that owns it. A team's file names its context, its lead and its members with their roles. A person's file holds a name, an email address, a status (active, pending or departed), the person's GitLab and Grafana usernames once they have accounts, and a profile: about, expertise, links and hours. The ownership rules, in the same repository, say who approves what. On every merge request the catalog's lint checks each file against its JSON Schema, and the references between files.
Changed by merge request
Nobody changes the organization in a tool's settings: a change is a merge request to the catalog, and the catalog's own ownership rules decide who must approve it. A team's file needs one of its team leads or of its context's leads; a person's own profile, that person, who approves the change or opens it with only their own commits; the rest of a person's file, a lead of one of their teams; and the structure, from the journeys to the rules themselves, two members of the platform team. The gate resolves each rule to people from the catalog's protected main, never from the change it judges, and the merge waits for its approval. Every change therefore has a reviewer, a history in git, and an undo: another merge request.
One source, many readers
Today these read it: the gate, for every approval it gives; landing-zone's groups root, for a Google group per team, per level's leads and per product's users, the audience the product's hostname admits behind single sign-on; control-plane's GitLab roots, for each person's group memberships and the list of who may merge on each product's main; operations' Grafana root, for the organization's members and a team per catalog team, with its folders, its contact point and its alert route; the folders root, for a folder per journey, domain and context; and the architecture catalog, for a page per team and per person, with the person's about, expertise and hours. The project factories let a team's group view its products' projects and their logs; the rest of what a product's entry derives is the story of self-service by merge request.
Nothing to keep in sync
When a person or a team changes, the readers follow on their next run, and a merge to the catalog starts it. The gate reads the catalog's main at every evaluation. The catalog's pipeline on main triggers the chain of reconcilers: landing-zone's pipeline, then operations', then control-plane's, then landing-zone's again, each running only the roots that read the catalog. The same pipeline publishes the catalog's pages to the architecture catalog. For what the readers derive, there is no second inventory and no sync job. Two things still sit outside the catalog: the group-wide approval policy names its approvers in security-policies, where only a merge request changes them, and a check after every catalog merge warns when that list and the catalog differ, while a daily run fails and keeps an issue open until they match; and the platform and break-glass groups are administered by hand.
The next automation is one more reader
An automation that needs to know who owns a product, who leads a domain or who is on a team reads the same files at the catalog's main, and inherits what they already carry: each fact was approved by its owners, has a history and can be undone. It needs no list, form or sync job of its own. A new Terraform root in landing-zone, operations or control-plane that reads the catalog says so in its pipeline, with the tf-apply component's reads_catalog input, and the chain runs it after every catalog merge.