This is the policy document. For the operational walkthrough of the change pipeline (PR gates, CI/CD, deploy pipeline), see Change management.
Purpose
No change reaches production without:- Review — at least one independent reviewer.
- Automated verification — tests + lint + security scans pass.
- Traceability — every change is linked to an issue / ticket and an approving reviewer.
- Rollback capability — every deploy can be rolled back quickly.
- Audit record — the change history is preserved for 7 years.
Scope
All changes to:- Application source code (backend, frontend, E2E).
- Infrastructure-as-code (Terraform).
- CI/CD pipeline configuration.
- Security tooling configuration (Brakeman, gitleaks, WAF rules, Cloud Armor policies).
- Database schema.
- Policies and documented procedures (this Trust Center).
Change categories
| Category | Examples | Approval needed | Deploy window |
|---|---|---|---|
| Standard | Feature work, refactors, bug fixes, dependency patches | 1 reviewer (author ≠ reviewer) | Business hours |
| Security-sensitive | Auth, encryption, policies, PHI handling, Pundit changes | 2 reviewers, one must be CTO or Security Officer | Business hours |
| High-risk | Database migrations, prod secret rotation, WAF changes, IAM bindings | 2 reviewers + CTO sign-off; deploy planned + announced | Low-traffic window |
| Emergency | Patch for active vulnerability, incident response fix | 1 reviewer (post-hoc OK for Sev-1), Security Officer notified | Immediately |
Controls for every change
Automated checks (blocking)
- Linting (RuboCop, ESLint, terraform fmt + validate)
- Backend tests (rspec with 90% coverage)
- Frontend tests (Vitest with 80% coverage)
- E2E smoke tests (Playwright)
- SAST: Brakeman, Trivy (Terraform), gitleaks
- Dependency scans: bundler-audit, npm audit, license_finder
- TypeScript type check
- OpenAPI freshness (if API changed)
Merge
Squash-merge preferred to keep master history linear. Merge commit includes the PR description.
Deploy
Automated build + push + deploy pipeline runs via Workload Identity Federation. Cloud Run rolls out with health-check gating.
Monitor
Sentry + Cloud Monitoring watch for error-rate anomalies. First 15 minutes post-deploy have elevated attention.
Protected branch rules
master is protected:
- No direct pushes (enforced by GitHub).
- Required status checks before merge (listed above).
- Required reviews from code owners for security-sensitive paths.
- Signed commits required for anyone with write access (as of Q2 2026).
- Force-push disabled.
Database migrations
strong_migrationsgem enforces safe-migration patterns at development time.- Migrations must be reversible unless explicitly flagged and reviewed.
- Backfills separated from schema changes (two PRs or two migrations).
- Concurrent index creation for tables > 10k rows.
- No column drops without
safety_assuredblock + compatibility window. - Migrations run in the Cloud Run migration job, not in the runtime.
Emergency changes
For Sev-1 incidents or actively exploited vulnerabilities:Ship the fix
Minimum viable fix, reviewed by any one qualified engineer. Skip secondary gates that aren’t relevant.
Notify
Security Officer + CTO informed in real time (incident Slack channel + status page if customer-impacting).
Post-hoc review
Full PR review completed within 1 business day after the fire is out, including any tests that should have caught this.
Post-mortem
Within 5 business days — covered under Incident response.
Infrastructure changes
Terraform changes follow the same PR flow with added gates:terraform fmt -check -recursive(blocking)terraform validate(blocking)terraform planoutput attached to the PR for review- Trivy config scan (blocking on MEDIUM+)
- Apply happens via CI after merge, under the deploy service account
- Apply output is archived with the commit
- IAM binding changes
- KMS or Secret Manager changes
- VPC / firewall changes
- Cloud Armor / WAF rule changes
- Org-level policy changes
Segregation of duties
- Author ≠ reviewer — enforced.
- Deploy runs under CI service account — no human holds production deploy credentials.
- Break-glass access for prod data is separate from code deploy — different approval path.
- Security Officer independence — security changes are reviewed by Security Officer, who is not an operational owner of the code being changed where practical.
Customer-visible communications
Changes that affect customers visibly are communicated via:- Status page — for outages, planned maintenance.
- In-app changelog — for product changes.
- Email notifications — for security-material changes (new subprocessor, policy update).
- Trust Center (this site) — for any change to security or compliance commitments.
Records retained
| Record | Retention |
|---|---|
| PR history | Permanent (GitHub) |
| CI/CD run logs | 2 years (GitHub Actions retention + extended archive) |
| Deploy logs | 1 year (GCP Cloud Logging) |
| Emergency change log | 7 years |
| Terraform plan outputs | 1 year |
| Post-mortem records | 6 years |
Review
This policy is reviewed annually by the Security Officer and CTO, and whenever a material change is made to the CI/CD pipeline.Related
- Change management — implementation detail (pipeline, gates, pipeline stages)
- Vulnerability management — SLAs for fix deployment
- Incident response — emergency change coordination