Deployment record
The first release ran on 2026-09-13 following the first release runbook. Every
resource below was created by Terraform in the infra repository or by its release script; nothing was created in a
console. The record lists identifiers that are safe to publish; secrets and account-specific values live in the
ignored envs/dev.tfvars and in Secrets Manager.
The hosts answer and sign-in is configured through the identity provider (runbook step 7, a dedicated
trovensa-console registration). Every product still carries the status designed: what the console shows is the
designed workflow over illustrative seed data, not a validated product.
Environment
| Thing | Value |
|---|---|
| Region / environment | us-east-1 / dev (resource prefix trovensa-dev) |
| Terraform state | S3 bucket trovensa-tfstate-<account id> with DynamoDB lock table trovensa-tflock (terraform/bootstrap) |
| Stacks | terraform/dns (hosted zones, state key trovensa/dns/terraform.tfstate) and terraform (environment, state key trovensa/dev/terraform.tfstate); both plans read No changes. after the release |
| Cluster | EKS trovensa-dev, Kubernetes 1.35, two t3.medium nodes, load-balancer controller and external-dns via Helm, Pod Identity for the api and worker service accounts |
| Database | Aurora PostgreSQL 16.14 Serverless v2 (0.5 to 4 ACU), database trovensa, migration 0001 applied by the migrate Job |
| Registry | ECR repositories trovensa-api, trovensa-web, trovensa-agent (immutable tags, scan on push) |
| Zone | Route 53 trovensa.com (owned by the dns stack), delegated from the registrar on 2026-09-13 |
| Certificate | ACM console.trovensa.com with SAN api.trovensa.com, DNS-validated in the zone, pinned in k8s/overlays/dev/ingress-patch.yaml |
| Load balancer | one ALB trovensa-dev with host rules for console and api; external-dns publishes both names as ALIAS records |
| Static hosts | Amplify apps trovensa-site (apex and www) and trovensa-docs (docs); the apex A ALIAS, the www and docs CNAMEs and the certificate-verification CNAME are Terraform records (imported after the static host wrote them) |
| Agent runtime | Bedrock AgentCore runtime trovensa_agent version 1 from trovensa-agent:acc1bef (linux/arm64), pinned in the api config map with FEATURE_AGENT_RUNS: "true"; the model id is an environment value, never a literal |
Running images (short git shas)
| Workload | Image tag | Replicas |
|---|---|---|
trovensa-api | f6d75ff | 2 (HPA 2 to 4) |
trovensa-web | 6cc85c5 | 2 (HPA 2 to 4) |
trovensa-worker | f6d75ff (same image, python -m app.worker) | 1 |
| agent runtime | acc1bef | managed |
Verification on the day
curl -fsS https://api.trovensa.com/api/v1/health/ready # {"status":"ok","version":"0.1.0","env":"dev","database":"ok"}
curl -fsS https://console.trovensa.com/api/health # {"status":"ok","service":"trovensa-web",...}
curl -s -o /dev/null -w '%{http_code}\n' https://console.trovensa.com/auth/bridge # 200
curl -s -o /dev/null -w '%{http_code}\n' -X OPTIONS https://api.trovensa.com/api/v1/health -H 'Origin: https://console.trovensa.com' -H 'Access-Control-Request-Method: GET' # 200
for h in trovensa.com www.trovensa.com docs.trovensa.com; do curl -s -o /dev/null -w "%{http_code} $h\n" https://$h/; done # 200 200 200
terraform -chdir=terraform plan -var-file=envs/dev.tfvars | tail -1 # No changes.The unauthenticated GET /api/v1/me answers 401 as application/problem+json with a WWW-Authenticate: Bearer
header. TLS on the console host presents console.trovensa.com with the api.trovensa.com alternative name.
Things learned while executing
- The static host writes the zone records itself when the hosted zone is in the same account. Terraform then fails
to create them;
terraform importof the four records (apex A,www,docs, the verification CNAME) brings them under management and the next apply only normalises their TTL. - A machine that queried
api.trovensa.combefore external-dns published it keeps a negative answer in its resolver cache for a while;dig @8.8.8.8andcurl --resolvesee the record immediately. - The api pods can start before the migrate Job has created the tables on a first release; the pod restarts once and the readiness probe holds traffic until the seed succeeds.
Identity provider
Runbook step 7 ran on 2026-09-13 with a dedicated registration trovensa-console in the organisation’s tenant, created
with the Azure CLI: SPA redirect URIs for https://console.trovensa.com (root and /auth/bridge) and
http://localhost:3100 (root and /auth/bridge), Application ID URI api://<client id>, delegated scope
trovensa.access, v2 tokens. The web image is built with the client id and the tenant authority; the API pins the
tenant issuer, the client id as audience and the tenant JWKS (infra/k8s/overlays/dev/configmap-patch.yaml). The
first person who signs in from the tenant becomes organisation owner and owner of the default program.
What is not done
- Merge the eight
feat/phase-1-buildpull requests somaincarries what is deployed.
Source: infra/RUNBOOK-first-release.md, infra/terraform/envs/dev.tfvars.example, infra/k8s/overlays/dev/kustomization.yaml, infra/k8s/overlays/dev/ingress-patch.yaml, infra/k8s/overlays/dev/configmap-patch.yaml, PRODUCT-CONTRACT.md section 9