sources/*.yml. Each direct child directory under
pipelines/ defines one pipeline.
sources/*.yml files are discovered. Pipeline, source, and model names share one
project-wide namespace and must be unique.
Managed Kafka source
Projects with multiple Kafka sources can set their shared broker once:offsets, timestamp, and landed_at. JSONAsString is currently the
only supported Kafka format. StreamBuild owns these source objects and blocks incompatible source
drift rather than silently recreating them.
broker_list may be declared on the source or inherited from [defaults].kafka_broker_list in
streambuild_project.toml. A source-level value takes precedence. One of the two is required for
every managed Kafka source.
ttl is an optional ClickHouse expression applied to the managed raw__order_events landing
table. It overrides [defaults].managed_source_ttl from streambuild_project.toml. Use
_replay_landed_at for ingestion-age retention, for example
_replay_landed_at + INTERVAL 30 DAY. If the source and project default both omit TTL,
StreamBuild creates the landing table without a TTL clause.
format defaults to JSONAsString. When consumer_group is omitted, the effective ClickHouse
group is streambuild_<source>_<source>_<database>. Hyphens in the database suffix are normalized
to underscores so each target database receives an isolated consumer group.
Adopted stream table
Adopt an existing table without transferring ownership:ttl is rejected on stream_table sources.
Integer roles must use ClickHouse integer types. Timestamp roles must use
DateTime or
DateTime64. Adopted sources do not support landed_at.
Pipeline directories
The direct child directory name is the pipeline name. It must start withpl__ by default. Nested
directories organize models but do not change pipeline identity. Each model name is its SQL filename
stem.
StreamBuild follows table-model __source(...) and untyped __ref(...) dependencies to infer the
pipeline source. A pipeline with table models must resolve to one registered source. View-only
pipelines may be source-less. Empty pipelines, multiple source roots, and duplicate logical names
are rejected.
The rule is one source per table pipeline, not one pipeline per source. Independent pipelines may
consume the same source and share its managed landing tables.
Both direct pipelines infer the same source independently and may have a same-mode relationship
between their models. Their directory names remain the pipeline identities even if the SQL files
are nested more deeply. An edge from either direct pipeline into the virtual reporting pipeline is
rejected because relationships cannot cross the mode boundary.
Configure the prefix or enforce a project-specific naming rule in streambuild_project.toml:
pipeline.toml may set virtual-environment replay policy for every model in that
pipeline:
[naming] values.
Pipelines that need no pipeline-wide override omit pipeline.toml entirely.
mode overrides [defaults].pipeline_mode for that pipeline. Relationships between direct and
virtual pipelines are rejected symmetrically during graph validation. Same-mode cross-pipeline
relationships remain valid, as do shared sources.
Protected pipelines
Add a protection gate when replacing a pipeline has operational impact:CONFIRM_-prefixed sanitized name
otherwise, so an empty [protection] block is valid.
Confirmation values are shell-safe tokens: they must start with a letter or number and may contain
only letters, numbers, ., _, :, and -.
Protection is available only for direct pipelines. When a build closure contains protected
pipelines, StreamBuild requires every exact confirmation value. This is independent of ordinary plan
approval: --auto-approve, --json, and --events never bypass protection. Repeat --confirm for
multiple protected pipelines. The Plan view shows one confirmation input for each pipeline.
