Opt-in staged builds, inventory, readiness assessment, promotion, and lifecycle operations.
Virtual environments preserve StreamBuild’s versioned deployment workflow. Use virtual mode as the
project default:
[defaults]pipeline_mode = "virtual"
Alternatively, set mode = "virtual" in an individual pipeline.toml.The lifecycle is:Planning and building do not affect the published graph. Inspection and a deployment audit inform
the operator, but the resulting readiness assessment is advisory rather than a promotion lock.
Promotion binds the stable views to the staged deployment; rollback can later bind the complete
graph to a retained prior publication.In this workflow, audit is the operation and assessment is its overall result. The deployment
audit combines staged-versus-active comparisons, replay coverage, and applicable SQL data-quality
audits into a ready, caution, or not_ready assessment.
Build prints the generated ID. You can also reconstruct inventory from authoritative warehouse
evidence:
stb deployment liststb deployment show 20260729T120000Z_ab12cd
Inventory distinguishes active, staged, superseded, incomplete, metadata-missing, and
physical-missing deployments. List and show are read-only.The development UI exposes the same inventory and deployment detail, including scoped lineage,
staged-versus-live changes, promotion preview, resumable partial promotion, and retained rollback
guidance. Cleanup is also available from the deployment list. Audit and rollback remain explicit CLI
operations.Compare the active graph with a retained deployment, or compare two explicit endpoints:
Diff reports added, removed, changed, unchanged, and physically missing model relations using model
presence, schemas, physical availability, and current row counts. Either explicit endpoint may be
active.
stb deployment audit compares staged and active data, checks replay coverage, runs applicable SQL
audits, and reports an overall assessment:
ready means the available evidence satisfies the configured freshness and row-count checks and
no error-severity SQL audit failed.
caution means the evidence is incomplete or warrants review, such as unavailable freshness
evidence, missing replay partitions, or a staged row count below the configured ratio.
not_ready means a stronger negative signal was found, such as lag beyond the configured limit,
an empty staged relation replacing a populated active relation, or a failed error-severity SQL
audit.
Warning-severity SQL audit failures appear in the results but do not by themselves change the
overall assessment.Configure the advisory replay thresholds in committed project configuration:
Promotion creates or replaces stable views such as tbl__orders to read from the selected deployment
table. ClickHouse replaces each relation atomically, but the complete graph is not graph-atomic:
bindings are switched one relation at a time and StreamBuild reports that capability in output.Before promotion, consumers reach deployment A through the unsuffixed stable view and deployment B
remains staged. Promotion replaces that view definition so it reads deployment B. The replacement
is atomic for this one relation only; a multi-model graph can be partly switched if promotion stops,
and retry applies the remaining bindings.Before confirmation, the CLI and UI show additions, replacements, removals, and orphaned live
relations. If promotion stops after switching only part of the graph, the deployment remains
retryable and the next promotion applies only the remaining changes.Show, audit, and promote require explicit positional IDs. There is no automatic sole-candidate or
latest-candidate selection.
Rollback requires confirmation unless --auto-approve is supplied. JSON mode also requires
--auto-approve. StreamBuild rejects staged, unpublished, already-active, missing, and drifted
targets rather than guessing from partial state.
Rollback restores a prior publication’s definitions and bindings, not a historical data snapshot.
Retained streaming graphs remain live and may have received newer rows since publication.
doctor diagnoses stable-view and deployment-reference problems.
repair active-view points one broken logical view at a known deployment.
reconcile previews or records a compatible live metadata baseline.
janitor previews or removes stale deployment objects while protecting active and
rollback-retained state.
Promotion, rollback, repair, reconciliation, and janitor operations must not overlap against the
same target database.These commands are virtual-environment-only. There is no automatic mode conversion or direct-mode
equivalent.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"StreamBuild","description":"Declarative streaming data pipelines for ClickHouse.","colors":{"primary":"#087E8B","light":"#0EA5A8","dark":"#0D9488"},"logo":{"light":"https://mintcdn.com/streambuild-docs/sEAbSxu5HagfR-Tx/streambuild_logo_light_cropped.png?fit=max\u0026auto=format\u0026n=sEAbSxu5HagfR-Tx\u0026q=85\u0026s=e5e126d1d3fccd286c7e7d80c5bbf549","dark":"https://mintcdn.com/streambuild-docs/sEAbSxu5HagfR-Tx/streambuild_logo_dark_cropped.png?fit=max\u0026auto=format\u0026n=sEAbSxu5HagfR-Tx\u0026q=85\u0026s=dfed7390ff171390d161d5274e94c7d5"},"favicon":"https://mintcdn.com/streambuild-docs/sEAbSxu5HagfR-Tx/streambuild_favicon.png?fit=max\u0026auto=format\u0026n=sEAbSxu5HagfR-Tx\u0026q=85\u0026s=1781550ef425821ca4a54062f21421e6","navbar":{"links":[{"href":"https://github.com/sqlstack-io/streambuild","label":"GitHub","type":"github"}]},"footer":{"socials":{"github":"https://github.com/sqlstack-io/streambuild"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"streambuild-docs","hasAudioNarration":false,"actualSubdomain":"streambuild-docs","customDomains":["docs.streambuild.dev"],"gitSource":{"type":"github","owner":"sqlstack-io","repo":"streambuild-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ae2f876934e514db0a518f0","collectionId":"e2b7774c-904a-4d94-85d2-70bd617ee8d8","liveDeploymentHistoryId":"6ae2f876934e514db0a518f0","schemaVersion":"v3"},"entitlements":{},"buildId":"6ae2f876934e514db0a518f0","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"Core Concepts","count":15},{"language":"default","tag":"CLI Reference","count":13},{"language":"default","tag":"Development UI","count":9},{"language":"default","tag":"Getting Started","count":2},{"language":"default","tag":"Examples","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"concepts/deployments","slug":"/concepts/deployments","pageMetadata":{"title":"Virtual Environments","description":"Opt-in staged builds, inventory, readiness assessment, promotion, and lifecycle operations.","href":"/concepts/deployments"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Opt-in staged builds, inventory, readiness assessment, promotion, and lifecycle operations.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Mermaid,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Virtual environments preserve StreamBuild’s versioned deployment workflow. Use virtual mode as the\nproject default:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`toml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`toml`,children:_jsxs(_components.code,{language:`toml`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`defaults`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`pipeline_mode`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"virtual\"`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Alternatively, set `,_jsx(_components.code,{children:`mode = \"virtual\"`}),` in an individual `,_jsx(_components.code,{children:`pipeline.toml`}),`.`]}),`\n`,_jsx(_components.p,{children:`The lifecycle is:`}),`\n`,_jsx(Mermaid,{chart:`flowchart LR\n plan[\"Plan\"] --> build[\"Build staged deployment\"]\n build --> inspect[\"List, show, and diff\"]\n inspect --> audit[\"Run deployment audit\"]\n audit -. \"advisory assessment\" .-> promote[\"Promote\"]\n promote --> published[\"Published stable views\"]\n published --> rollback[\"Roll back to a retained publication\"]`}),`\n`,_jsx(_components.p,{children:`Planning and building do not affect the published graph. Inspection and a deployment audit inform\nthe operator, but the resulting readiness assessment is advisory rather than a promotion lock.\nPromotion binds the stable views to the staged deployment; rollback can later bind the complete\ngraph to a retained prior publication.`}),`\n`,_jsxs(_components.p,{children:[`In this workflow, `,_jsx(_components.strong,{children:`audit`}),` is the operation and `,_jsx(_components.strong,{children:`assessment`}),` is its overall result. The deployment\naudit combines staged-versus-active comparisons, replay coverage, and applicable SQL data-quality\naudits into a `,_jsx(_components.code,{children:`ready`}),`, `,_jsx(_components.code,{children:`caution`}),`, or `,_jsx(_components.code,{children:`not_ready`}),` assessment.`]}),`\n`,_jsx(Heading,{level:`2`,id:`build`,children:`Build`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` build`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --auto-approve`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` build`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --select`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` orders`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --full-refresh`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --auto-approve`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` build`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --select`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` orders`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --start-time`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 2026-07-01T00:00:00Z`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --auto-approve`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Build creates deployment-specific model objects while the active stable views remain unchanged:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`tbl__orders__20260729T120000Z_ab12cd`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`mv__orders__20260729T120000Z_ab12cd`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The deployment ID is generated as `,_jsx(_components.code,{children:`YYYYMMDDTHHMMSSZ_\u003csix-hex>`}),` unless supplied with\n`,_jsx(_components.code,{children:`--deployment-id`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`discover-and-inspect`,children:`Discover and inspect`}),`\n`,_jsx(_components.p,{children:`Build prints the generated ID. You can also reconstruct inventory from authoritative warehouse\nevidence:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` deployment`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` list`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` deployment`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` show`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 20260729T120000Z_ab12cd`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Inventory distinguishes active, staged, superseded, incomplete, metadata-missing, and\nphysical-missing deployments. List and show are read-only.`}),`\n`,_jsx(_components.p,{children:`The development UI exposes the same inventory and deployment detail, including scoped lineage,\nstaged-versus-live changes, promotion preview, resumable partial promotion, and retained rollback\nguidance. Cleanup is also available from the deployment list. Audit and rollback remain explicit CLI\noperations.`}),`\n`,_jsx(_components.p,{children:`Compare the active graph with a retained deployment, or compare two explicit endpoints:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` deployment`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` diff`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 20260729T120000Z_ab12cd`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` deployment`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` diff`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 20260729T120000Z_ab12cd:20260730T120000Z_cd34ef`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Diff reports added, removed, changed, unchanged, and physically missing model relations using model\npresence, schemas, physical availability, and current row counts. Either explicit endpoint may be\n`,_jsx(_components.code,{children:`active`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`audit-staged-data`,children:`Audit staged data`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` deployment`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` audit`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 20260729T120000Z_ab12cd`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`stb deployment audit`}),` compares staged and active data, checks replay coverage, runs applicable SQL\naudits, and reports an overall assessment:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`ready`}),` means the available evidence satisfies the configured freshness and row-count checks and\nno error-severity SQL audit failed.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`caution`}),` means the evidence is incomplete or warrants review, such as unavailable freshness\nevidence, missing replay partitions, or a staged row count below the configured ratio.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`not_ready`}),` means a stronger negative signal was found, such as lag beyond the configured limit,\nan empty staged relation replacing a populated active relation, or a failed error-severity SQL\naudit.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Warning-severity SQL audit failures appear in the results but do not by themselves change the\noverall assessment.`}),`\n`,_jsx(_components.p,{children:`Configure the advisory replay thresholds in committed project configuration:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`toml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`toml`,children:_jsxs(_components.code,{language:`toml`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`defaults`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`deployment_readiness`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`maximum_lag`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"30s\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`minimum_staged_row_ratio`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0.5`})]}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`The assessment is an operator safety signal, not an enforced promotion lock. `,_jsx(_components.code,{children:`deployment promote`}),`\ndoes not require a previously persisted `,_jsx(_components.code,{children:`ready`}),` result.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`promote`,children:`Promote`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` deployment`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` promote`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 20260729T120000Z_ab12cd`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Promotion creates or replaces stable views such as `,_jsx(_components.code,{children:`tbl__orders`}),` to read from the selected deployment\ntable. ClickHouse replaces each relation atomically, but the complete graph is `,_jsx(_components.strong,{children:`not graph-atomic`}),`:\nbindings are switched one relation at a time and StreamBuild reports that capability in output.`]}),`\n`,_jsx(Mermaid,{chart:`flowchart LR\n consumer[\"Consumer query\"] --> stable[\"tbl__orders\u003cbr/>stable view\"]\n stable --> active[\"tbl__orders__deployment_A\u003cbr/>current published table\"]\n staged[\"tbl__orders__deployment_B\u003cbr/>staged table\"] -. \"promotion rebinds the stable view\" .-> stable`}),`\n`,_jsx(_components.p,{children:`Before promotion, consumers reach deployment A through the unsuffixed stable view and deployment B\nremains staged. Promotion replaces that view definition so it reads deployment B. The replacement\nis atomic for this one relation only; a multi-model graph can be partly switched if promotion stops,\nand retry applies the remaining bindings.`}),`\n`,_jsx(_components.p,{children:`Before confirmation, the CLI and UI show additions, replacements, removals, and orphaned live\nrelations. If promotion stops after switching only part of the graph, the deployment remains\nretryable and the next promotion applies only the remaining changes.`}),`\n`,_jsx(_components.p,{children:`Show, audit, and promote require explicit positional IDs. There is no automatic sole-candidate or\nlatest-candidate selection.`}),`\n`,_jsx(Heading,{level:`2`,id:`roll-back`,children:`Roll back`}),`\n`,_jsx(_components.p,{children:`Roll back the complete stable graph to the immediately preceding distinct publication or an explicit\npreviously published deployment:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` deployment`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` rollback`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --previous`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` deployment`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` rollback`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 20260729T120000Z_ab12cd`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Rollback requires confirmation unless `,_jsx(_components.code,{children:`--auto-approve`}),` is supplied. JSON mode also requires\n`,_jsx(_components.code,{children:`--auto-approve`}),`. StreamBuild rejects staged, unpublished, already-active, missing, and drifted\ntargets rather than guessing from partial state.`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Rollback restores a prior publication’s definitions and bindings, not a historical data snapshot.\nRetained streaming graphs remain live and may have received newer rows since publication.`})}),`\n`,_jsx(Heading,{level:`2`,id:`operational-commands`,children:`Operational commands`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` doctor`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`DEPLOYMENT_ID`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"replace-with-deployment-id\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` repair`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` active-view`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --table`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` tbl__orders`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --deployment-id`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$DEPLOYMENT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` reconcile`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` reconcile`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --apply`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` janitor`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`stb`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` janitor`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --retention-days`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 30`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --apply`})]}),`\n`]})})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/cli/doctor`,children:_jsx(_components.code,{children:`doctor`})}),` diagnoses stable-view and deployment-reference problems.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/cli/repair`,children:_jsx(_components.code,{children:`repair active-view`})}),` points one broken logical view at a known deployment.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/cli/reconcile`,children:_jsx(_components.code,{children:`reconcile`})}),` previews or records a compatible live metadata baseline.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/cli/janitor`,children:_jsx(_components.code,{children:`janitor`})}),` previews or removes stale deployment objects while protecting active and\nrollback-retained state.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Promotion, rollback, repair, reconciliation, and janitor operations must not overlap against the\nsame target database.`}),`\n`,_jsx(_components.p,{children:`These commands are virtual-environment-only. There is no automatic mode conversion or direct-mode\nequivalent.`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Virtual Environments","description":"Opt-in staged builds, inventory, readiness assessment, promotion, and lifecycle operations.","href":"/concepts/deployments"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Build","slug":"build","depth":2,"children":[]},{"title":"Discover and inspect","slug":"discover-and-inspect","depth":2,"children":[]},{"title":"Audit staged data","slug":"audit-staged-data","depth":2,"children":[]},{"title":"Promote","slug":"promote","depth":2,"children":[]},{"title":"Roll back","slug":"roll-back","depth":2,"children":[]},{"title":"Operational commands","slug":"operational-commands","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"streambuild-docs","siteName":"StreamBuild","title":"Virtual Environments - StreamBuild","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-04T08:49:05.717Z","originalFileLocation":"concepts/deployments.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Opt-in staged builds, inventory, readiness assessment, promotion, and lifecycle operations.\">\u003cmeta data-mint-head name=\"application-name\" content=\"StreamBuild\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/streambuild-docs/taYM1CtLL2TnsjTr/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/streambuild-docs/taYM1CtLL2TnsjTr/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/streambuild-docs/taYM1CtLL2TnsjTr/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/streambuild-docs/taYM1CtLL2TnsjTr/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/streambuild-docs/taYM1CtLL2TnsjTr/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/streambuild-docs/taYM1CtLL2TnsjTr/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/streambuild-docs/taYM1CtLL2TnsjTr/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/streambuild-docs/taYM1CtLL2TnsjTr/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/streambuild-docs/taYM1CtLL2TnsjTr/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Virtual Environments - StreamBuild\">\u003cmeta data-mint-head property=\"og:description\" content=\"Opt-in staged builds, inventory, readiness assessment, promotion, and lifecycle operations.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"StreamBuild\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.streambuild.dev/concepts/deployments\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://streambuild-docs.mintlify.app/_mintlify/api/og/v2?division=Core+Concepts\u0026amp;title=Virtual+Environments\u0026amp;description=Opt-in+staged+builds%2C+inventory%2C+readiness+assessment%2C+promotion%2C+and+lifecycle+operations.\u0026amp;theme=6f6706f30e98968413bdef00\u0026amp;signature=4ebf16e972d9592e7a29ee10a96dc01e897ef068e77c4da4ddbe2b926583a23b\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Virtual Environments - StreamBuild\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Opt-in staged builds, inventory, readiness assessment, promotion, and lifecycle operations.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://streambuild-docs.mintlify.app/_mintlify/api/og/v2?division=Core+Concepts\u0026amp;title=Virtual+Environments\u0026amp;description=Opt-in+staged+builds%2C+inventory%2C+readiness+assessment%2C+promotion%2C+and+lifecycle+operations.\u0026amp;theme=6f6706f30e98968413bdef00\u0026amp;signature=4ebf16e972d9592e7a29ee10a96dc01e897ef068e77c4da4ddbe2b926583a23b\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/streambuild-docs/taYM1CtLL2TnsjTr/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"StreamBuild\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#087E8B\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.streambuild.dev/concepts/deployments\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/concepts/deployments.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.streambuild.dev/#organization\",\"name\":\"StreamBuild\",\"url\":\"https://docs.streambuild.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/streambuild-docs/sEAbSxu5HagfR-Tx/streambuild_logo_light_cropped.png?fit=max\u0026auto=format\u0026n=sEAbSxu5HagfR-Tx\u0026q=85\u0026s=e5e126d1d3fccd286c7e7d80c5bbf549\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.streambuild.dev#website\",\"name\":\"StreamBuild\",\"url\":\"https://docs.streambuild.dev\",\"publisher\":{\"@id\":\"https://docs.streambuild.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.streambuild.dev/concepts/deployments#webpage\",\"url\":\"https://docs.streambuild.dev/concepts/deployments\",\"name\":\"Virtual Environments\",\"description\":\"Opt-in staged builds, inventory, readiness assessment, promotion, and lifecycle operations.\",\"dateModified\":\"2026-09-04T08:49:05.717Z\",\"isPartOf\":{\"@id\":\"https://docs.streambuild.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.streambuild.dev/concepts/deployments#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.streambuild.dev/concepts/deployments#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Core Concepts\",\"item\":\"https://docs.streambuild.dev/concepts/project-configuration\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Virtual Environments\",\"item\":\"https://docs.streambuild.dev/concepts/deployments\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.streambuild.dev/concepts/deployments#article\",\"headline\":\"Virtual Environments\",\"name\":\"Virtual Environments\",\"description\":\"Opt-in staged builds, inventory, readiness assessment, promotion, and lifecycle operations.\",\"url\":\"https://docs.streambuild.dev/concepts/deployments\",\"mainEntityOfPage\":{\"@id\":\"https://docs.streambuild.dev/concepts/deployments#webpage\"},\"dateModified\":\"2026-09-04T08:49:05.717Z\",\"publisher\":{\"@id\":\"https://docs.streambuild.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.streambuild.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"StreamBuild\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"StreamBuild","nav":{"global":null,"groups":[{"group":"Getting Started","pages":[{"title":"Introduction","href":"/index"},{"title":"Direct-mode Quickstart","href":"/quickstart"}]},{"group":"Core Concepts","pages":[{"title":"Project Configuration","href":"/concepts/project-configuration"},{"title":"Authentication","href":"/concepts/authentication-and-access"},{"title":"Access Control","href":"/concepts/access-control"},{"title":"Sensors","href":"/concepts/sensors"},{"title":"Providers","href":"/concepts/providers"},{"title":"Sources and Pipelines","href":"/concepts/pipelines"},{"title":"Models","href":"/concepts/models"},{"title":"Direct Mode","description":"The default rebuild workflow without staged views or a publish step.","href":"/concepts/direct-mode"},{"title":"Virtual Environments","href":"/concepts/deployments"},{"title":"Destructive Operations","description":"Destroy deployed pipelines or reset a target with frozen impact plans and recorded confirmation.","href":"/concepts/destructive-operations"},{"title":"Replay and Lineage","href":"/concepts/replay-lineage"},{"title":"ClickHouse Architecture","href":"/concepts/architecture"},{"title":"SQL Testing","href":"/concepts/testing"},{"title":"Python Macros","href":"/concepts/macros"},{"title":"Audits","href":"/concepts/audits"}]},{"group":"Development UI","pages":[{"title":"Development UI","href":"/ui/overview"},{"title":"Pipelines","href":"/ui/pipelines"},{"title":"Warehouse Health","href":"/ui/warehouse-health"},{"title":"Sources","href":"/ui/sources"},{"title":"Topics","href":"/ui/topics"},{"title":"Messages","href":"/ui/messages"},{"title":"Plans","href":"/ui/plans"},{"title":"Runs","href":"/ui/runs"},{"title":"Quality","href":"/ui/quality"}]},{"group":"CLI Reference","pages":[{"title":"stb discover","href":"/cli/discover"},{"title":"stb compile","href":"/cli/compile"},{"title":"stb plan","href":"/cli/plan"},{"title":"stb build","href":"/cli/build"},{"title":"stb dev","href":"/cli/dev"},{"title":"stb audit","href":"/cli/audit"},{"title":"stb deployment","href":"/cli/deployment"},{"title":"stb test","href":"/cli/test"},{"title":"stb doctor","href":"/cli/doctor"},{"title":"stb repair active-view","href":"/cli/repair"},{"title":"stb reconcile","href":"/cli/reconcile"},{"title":"stb janitor","href":"/cli/janitor"},{"title":"stb destroy and reset-target","href":"/cli/destruction"}]},{"group":"Examples","pages":[{"title":"Commerce Events Demo","href":"/examples/orders-demo"}]}]},"title":"Virtual Environments - StreamBuild","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":[],"chunks":[]}