0012 — Deployment is a separate CLI built on azure-bootstrap¶
Status: superseded by ADR-0013 · Date: 2026-08-14
Historical decision only. Deployment is now the second three-phase stage set in vibey's core lifecycle. See ADR-0013.
Context¶
The specification places automatic Azure deployment in a "post-phases" row, explicitly as a separate CLI library rather than a phase of the main loop.
An azure-bootstrap library (3.0.1) already exists in this workspace, published to
PyPI, providing an azbootstrap scaffold entry point, the App Configuration ↔
Key Vault ↔ Application Insights bootstrap, ten logging transports, and an AI
usage tracker with sliding-window cost caps.
Decision¶
vibey-deploy is a separate package, installable independently, that layers
target detection, IaC emission, environment promotion, and post-deploy
verification over azure-bootstrap.
It is invoked explicitly:
vibey deploy --confirm
Deployment never happens implicitly, and never as an automatic consequence of
reaching DONE.
Rationale¶
Why separate. Deployment has a different blast radius from everything else
vibey does. Phases 1–3 write to local branches in local worktrees; a mistake costs
a rebuild. Deployment touches infrastructure that costs money and can serve
traffic. Different blast radius, different release cadence, different dependency
set (azure-* SDKs are heavy), and different security posture — so a different
package, with its own gate.
Why build on azure-bootstrap. It already solves the cross-cutting layer
every Azure project re-implements, it is the house standard, and its AI usage
tracker is the reference implementation for vibey's own budget caps. Rewriting it
inside vibey would be duplication of exactly the kind ADR-0001 rejects.
Why --confirm. Vibey's default posture everywhere is that nothing leaves the
machine without an explicit human decision: no git push, no PR, no deploy. An
autonomous system that can provision cloud infrastructure while its operator
sleeps needs the gate to be a deliberate act, not a config default.
Scope¶
- Target detection — classify the built artifact using the
azure-services-catalogdecision ladder: App Service (modular monolith) → Container Apps (containerized default) → AKS (only when the full Kubernetes API is genuinely needed). - IaC emission — Bicep by default; Terraform behind
iac = "terraform". - Environment promotion —
dev → staging → produsing App Service deployment slots for near-instant, reversible swaps. - Post-deploy verification — health endpoint probe plus smoke test. On
failure, a
DEPLOY → REVIEWtransition carrying the failure as aFindingRaised, so a broken deployment re-enters the loop as a review finding rather than as a dead end.
Consequences¶
Good. Vibey core stays deployment-agnostic and dependency-light. The Azure
knowledge lives where the Azure library already is. A future vibey-deploy-aws
implements the same interface without touching core.
Bad. Two packages to version and release together when the interface changes.
Mitigated by keeping the interface narrow: detect(artifact) → Target,
emit(target) → IaC, apply(iac, env) → DeployResult, verify(env) → Findings.
Out of scope for v1. Non-Azure targets, multi-region topology, and blue-green beyond slot swaps.