wrangler deploy (via GitHub Actions on push to main)
DB migrations
Supabase CLI (supabase db push)
Smoke tests
curl health + message endpoints
Rollback
wrangler rollback
Deploy triggers
All three services follow the same infra → deploy dependency pattern:
deploy-*.yml — Two-job pipeline: infra (Terraform apply) → deploy (needs: [infra]). Terraform always runs before content is pushed. On subsequent runs where infra hasn’t changed, Terraform is a no-op (~10s).
terraform-*.yml — PR plan only + manual dispatch apply. No push-apply on main (that’s handled by the deploy workflow). This avoids race conditions where Terraform and deploy run in parallel.
Workflow
Trigger
Working Directory
Notes
deploy-marketing.yml
Push to main on envo-marketing/** or infra/marketing/**
Both
infra → deploy pipeline
terraform-marketing.yml
PR on infra/marketing/**, or manual dispatch
infra/marketing/
Plan on PR, apply on manual dispatch only
deploy-dashboard.yml
Push to main on envo-dashboard/** or infra/dashboard/**
Both
infra → deploy pipeline
terraform-dashboard.yml
PR on infra/dashboard/**, or manual dispatch
infra/dashboard/
Plan on PR, apply on manual dispatch only
deploy-brain.yml
Push to main on docs/** or infra/brain/**
Both
infra → deploy pipeline
terraform-brain.yml
PR on infra/brain/**, or manual dispatch
infra/brain/
Plan on PR, apply on manual dispatch only
Security Tooling
Tool
Purpose
Frequency
Trufflehog
Secret detection
Every PR
Semgrep
SAST / code analysis
Every PR
Trivy
Dependency scanning
Every PR
OWASP ZAP
DAST / web scanning
Weekly
pnpm audit
Dependency vulnerabilities
Every PR + Dependabot
Local Isolation Strategy
External services are stubbed for local development: