Kinds and components
The vocabulary: abstract kinds, concrete products, and the order a property value is resolved in.
A kind is an abstract category with typed properties. A component is a concrete product
implementing exactly one kind. Nothing in either of them is display text: names and descriptions
live in locales/, keyed by id, so the documents stay language-neutral.
Kind
A kind answers "what is a queue?" — not "which queue".
schemaVersion: "1" type: "kind" id: "queue" category: "messaging" properties: delivery: type: "enum" values: ["at-most-once", "at-least-once", "exactly-once"] required: true ordering: type: "enum" values: ["none", "per-key", "global"] default: "none" deadLetterQueue: type: "boolean" default: false
| Field | Required | Meaning |
|---|---|---|
category | yes | One of messaging, compute, data, edge, external, client, ops, security, custom. Rules may select by category. |
properties | yes | Property name to property definition. May be empty. |
external is for services outside your control, such as a payment provider. custom holds only
the custom kind, the untyped escape hatch.
Property definitions
| Field | Required | Meaning |
|---|---|---|
type | yes | boolean, integer, string, enum or ref |
values | for enum | The allowed string values |
default | no | The value assumed when neither the component nor the node sets one |
required | no | A node must resolve a value from somewhere. Default false |
refKind | for ref | The kind the referenced node must have; the value is another node's id |
A property with neither default nor required is optional and may be absent. That absence is
usually deliberate: it is what lets a rule catch it.
Component
A component answers "what is SQS?" — one file per product.
schemaVersion: "1" type: "component" id: "sqs" kind: "queue" provider: "aws" docs: "https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html" defaults: managed: true delivery: "at-least-once" ordering: "none" replay: false retentionDays: 4 properties: fifo: type: "boolean" default: false visibilityTimeoutSeconds: type: "integer" default: 30
| Field | Required | Meaning |
|---|---|---|
kind | yes | The id of exactly one kind |
provider | yes | The vendor that owns the product; the file lives in components/<provider>/ |
defaults | no | Values for kind properties that this product really changes. Every key must exist on the kind |
properties | no | Properties specific to this product. Must not redefine a kind property |
docs | no | The official documentation page for the product |
A defaults entry states the product's actual default behaviour, not a recommended
configuration. SQS really does retain for four days; that is why the number is there.
Providers
Provider is ownership, not hosting. postgres is default even when it runs on RDS; aurora is
aws because Amazon owns it. default covers open source, in-house generic components, and
independent SaaS such as Stripe or Datadog.
| Provider | Components | Share |
|---|---|---|
| default | 1,062 | 44.9% |
| aws | 304 | 12.8% |
| gcp | 237 | 10.0% |
| azure | 203 | 8.6% |
| oci | 175 | 7.4% |
| alibabacloud | 113 | 4.8% |
| cloudflare | 100 | 4.2% |
| ibm | 84 | 3.6% |
| digitalocean | 27 | 1.1% |
| openstack | 27 | 1.1% |
| k8s | 19 | 0.8% |
| outscale | 15 | 0.6% |
A cloud provider's managed offering of an open-source product is its own component, not a flag on the original, because it is the resource a designer actually places and it carries its own defaults: backup retention, zone redundancy, encryption.
Property resolution order
For a node in a design, the effective value of a property is the first of these that exists:
- The node's own
props - The component's
defaults - The property definition's
default— on the kind, or on the component for a component-specific property - Absent
Absent is a real answer, not an error. Rules test for it with exists: false.
nodes: - id: "orders-queue" component: "sqs" props: { deadLetterQueue: true }
deadLetterQueue resolves to true from the node. delivery resolves to "at-least-once" from
the component's defaults. ordering resolves to "none", which the component happens to pin to
the same value the kind defaults to. retentionDays is 4, from the component. backoff has no
default anywhere and no node value, so it is absent, and
retry-without-backoff can say so.
A node may only set properties that exist on its component's kind or on the component itself. Setting an unknown property is a structural error.
Which kinds exist
Every kind has a reference page listing its properties, the rules that read them, and every component that implements it, grouped by provider.