Caitlyn — Ephemeral Review App Environments
Deploy a fully functional, isolated Caitlyn environment for each open merge request. This requires the application to self-provision its own resources (DynamoDB tables with Streams, Bedrock Knowledge Bases) so that ephemeral environments can be spun up and torn down without Terraform.
Prerequisite: &105 (Separate Staging and Production Infrastructure) establishes the `TABLE_NAME_PREFIX` mechanism and decoupled ingestion triggers that make per-MR environments possible.
### Dependency order
```
── Self-provisioning (app owns resource lifecycle) ──────────────────
custom-d/labs/demos/caitlyn#1743 Migration creates KB Files table with Streams
└── custom-d/caitlyn/services/caitlyn-data-ingestion#175 Remove KB Files table from TF
custom-d/labs/demos/caitlyn#1744 App handles Bedrock KB creation
└── custom-d/caitlyn/services/caitlyn-data-ingestion#176 Remove Bedrock KB from TF
── Review app deployment ────────────────────────────────────────────
custom-d/labs/demos/caitlyn#1733 MR container builds
└── custom-d/labs/demos/caitlyn#1745 Deploy ephemeral review app per MR
└── custom-d/labs/demos/caitlyn#1746 Review app lifecycle & teardown
```
epic