Allow-list and Grant file formats
The Catalogue lists what exists. An Allow-list lists what a Team can use.
Together with Grants, the two files answer one question: can team T use
component X?
Both files sit at the estate root beside teams.yaml, and both are optional.
Without them, every team can use the whole active Catalogue.
allow-lists.yaml # every team's declared list
grants.yaml # every Grant
To print a team's answer, run telecraft palette:
telecraft palette -team data-flow -estate ESTATE_DIR -catalogue ARTEFACT
allow-lists.yaml
One document with a single allow_lists key holding a list.
| Field | Type | Required | Description |
|---|---|---|---|
team |
string | yes | The Team this list applies to. Must be in the team tree. |
owner |
string | yes | The accountable party. Must be in the team tree. |
allow |
list of strings | yes | Entries, at least one. |
allow_lists:
- team: platform
owner: platform-observability
allow:
- receiver/otlp
- processor/*
- exporter/otlphttp
- extension/health_check
- team: data-flow
owner: gateway-owners
allow:
- receiver/otlp
- processor/memory_limiter
- processor/batch
- exporter/otlphttp
Each Team can declare at most one list. A second list for the same Team is a load error.
grants.yaml
One document with a single grants key holding a list.
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | yes | Unique. telecraft palette reports this id as the reason a granted component is allowed. |
owner |
string | yes | The author. Their Team must be a proper ancestor of team. |
team |
string | yes | The target: the Team, and its subtree, that this Grant widens. |
adds |
list of strings | yes | Entries, at least one. |
grants:
- id: gateway-kafka-2026-q3
owner: platform-observability
team: data-flow
adds:
- exporter/kafka
A parent team writes a Grant. The author is the owner's Team, and it must sit strictly above the target. A Team can't grant to itself, because a Team can only ever narrow its own palette.
Entry syntax
Each entry is a pattern of the form class/type-pattern. It selects Catalogue
components by their (class, type) key.
The class side is exact and must be one of receiver, processor,
exporter, connector, or extension.
The type side is a pattern with a small vocabulary:
| Token | Matches |
|---|---|
* |
Any run of characters, including none. |
? |
Exactly one character. |
| anything else | Itself. |
| Entry | Selects |
|---|---|
receiver/otlp |
One component. |
exporter/kafka* |
A family. |
processor/* |
A whole class. |
Character classes and escapes are rejected: an entry containing [, ], \,
or a second / is a load error.
Telecraft tries a pattern against a component's canonical type and against its
deprecated_type alias, so an entry written against a historical name keeps
selecting the same component.
Resolution
Telecraft computes a team's effective palette by walking the team chain from the root down to the team. At each team in the chain, in this order:
- If that team declares a list, intersect: a component the list doesn't match is removed.
- Then apply every Grant targeting that team: a component a Grant matches is added back.
Two consequences follow from that order.
- A Grant overrides its own target's declared list
- The Grant applies after the intersection at the same team, so a Grant
targeting team
Tre-admits a component thatT's own list excludes. - Lists below the target still narrow it away
- The walk continues downward, and a descendant's list runs after the Grant. A Grant widens the palette from its target downward, and a list lower in the chain can narrow it again.
If no team on the chain declares a list, the effective palette is the whole active Catalogue.
Provenance
Every entry in an effective palette carries the reason it's there. telecraft palette prints it in the last column.
| Origin | Means |
|---|---|
default-allow |
No team on the chain declares an Allow-list. |
allow-list |
The component survived every declared list on the chain. |
grant |
A named Grant admitted it; the lists alone would exclude it. |
A grant entry also names the Grant id, the granting team (the Grant owner's
team), and the target team. Every component a team can use traces back to the
declared lists, the default, or a named Grant.
Enforcement
The Allow-list check is the one policy rule that blocks a render. If a
Blueprint uses a Catalogue type outside the owning team's effective palette,
telecraft render refuses. There's no override: to add the component, ask
for a Grant.
Everything else the render notices, such as a Stability floor breach or a binding pinned off head, is a finding routed to an owner. Findings never block.
Load errors
Loading fails closed and returns nothing. Each message names the file. The load refuses on:
- an unknown or misspelled field in either file
- a malformed document, an empty file, or more than one YAML document in the file
- a present
allow-lists.yamlholding noallow_lists, or a presentgrants.yamlholding nogrants: declare one or delete the file - an Allow-list with an empty
allowlist. To inherit the parent's effective list unchanged, declare no list at all. An empty list isn't supported as a way to ban everything. - a Grant with an empty
addslist: a Grant exists to widen a palette - a missing
teamorowner, or one the team tree doesn't know - a Grant with no
id, or aniddefined twice - one Team declaring two allow-lists
- a Grant whose owner's team isn't a proper ancestor of the target team
- a duplicated entry in one list
- a malformed entry: not
class/type-pattern, an unknown class, or a pattern containing a rejected character - an entry that selects nothing in the active Catalogue. This usually means an unknown component type or a typo in the pattern, so it fails the load rather than silently allowing nothing.
The last rule ties a loaded policy to the Catalogue version it was validated against. If you activate a different Catalogue, Telecraft validates the policy again, so an entry can't silently match nothing.