Surfaces
Surface detection
A release tells your customers what shipped. Surface detection is the other direction: it flags candidate changes to declared endpoints, database fields, and environment variables, with the source diff attached for review. Confirmed changes can then be routed to the teams you configured. Turn it on per repo under Repos → [repo] → Surfaces. It watches pushes to your default branch, so it runs whether or not you tag releases.
1. Declare what you expose
Yanib never guesses at your architecture. You describe it once in a .yanib.yml committed to the repo, reviewed in a PR like any other config and versioned with the thing it describes.
version: 1
surfaces:
- name: api-routes
paths: ["app/api/**/route.ts"]
detect: new_file
owners: ["@acme/payments"] # who owns it
notify: ["#api-consumers"] # which integrations hear about it
docs: ["README.md"] # what goes stale when it growsdetect picks the primitive: new_file fires when a file is added under paths, pattern fires when your regex matches an added line (capture group 1 becomes the identifier), and prisma_schema reads added models and fields straight off the diff. A repo with no config still works; you just get the defaults.
2. What counts as a change
Detection reads the diff, not the commit message, and not a model's opinion about what looks important. Each candidate lands as one of ADDED, CHANGED, RENAMED, DEPRECATED or REMOVED. The detector applies explicit path, file status, added-line, and rename rules to narrow what needs review; it does not prove downstream impact on its own.
3. Who gets told
Owners resolve from the surface's owners: list first, and fall back to your CODEOWNERS file when it is absent, so most repos need no extra setup. Delivery goes to the integrations named in notify:, matched against the integration names you already set up in Integrations. When surface notifications are enabled, leaving notify: off uses every integration on the repo; naming channels narrows delivery to those integrations. A routed match is still a review candidate, not proof of impact.
4. Docs to review
A file listed under a surface's docs: becomes a review target when that surface matches and the commit did not update the file. With a separate opt-in, Yanib can open a pull request proposing an update. The PR never writes directly to your default branch and remains yours to edit, merge, or close.
5. You don't start from zero
When you connect a GitHub repo, Yanib reads a bounded slice of recent history (90 days by default) and imports structural matches as historical candidates before you have written a line of config. Those rows keep their original commit dates, are labeled as imported rather than human confirmed, and are never announced.