v1.1.0
📣 Highlights
v1.1.0 makes mom-bot observable and hardens its infrastructure for the long run:
- Production observability — OpenTelemetry traces and logs now flow to Azure Application Insights, giving operators structured visibility into sidecar and bot activity for the first time.
- Managed-identity migrations — Postgres schema migrations now run as a dedicated UAMI Container Apps Job with Entra token auth, replacing the manual migration step and eliminating the need for password-based credentials.
- Bicep-provisioned secrets and infrastructure — Log Analytics, App Insights, non-credential Key Vault values, and environment parameterisation are now declared in Bicep and applied through the standard deploy pipeline; no more ad-hoc manual provisioning.
- Ingress rate-limiting —
/api/internal/*endpoints are now rate-limited before bearer auth, protecting the sidecar from unauthenticated flood traffic. - Dead stopgap removed — the SQLite-on-AzureFile interim plumbing (storage account, file share, volume mount) has been fully deleted; Postgres is the unambiguous production database.
- Documentation correctness sweep — runbooks, the README, the secrets inventory, and ADR/spec files updated to reflect the current production state.
Added
- OpenTelemetry / Azure Monitor observability — OTel SDK wired with Azure Monitor exporter; traces and logs from both the bot and sidecar now flow to Application Insights (#199, #267).
- Rate-limiting on
/api/internal/*— sidecar enforces a per-IP request rate limit on internal endpoints before bearer auth is checked, protecting against unauthenticated flood traffic (#209, #232). - UAMI Container Apps Job for Postgres migrations —
alembic upgrade headnow runs as a separate Container Apps Job using a User-Assigned Managed Identity and Entra token auth, replacing the manual migration step in the deploy pipeline (#256).
Changed
- README: audit for staleness — Status, Roadmap, Database/Migrations, Project Structure, References sections refreshed to reflect v1.0 ship + v1.1 in progress (#249, #250).
- Runbook + secrets-inventory: resolve stale TBDs and "Epic 1+" placeholders (#249, #251).
Fixed
- Postgres Entra token acquisition — token for Postgres auth is now obtained via
azure-identity(ManagedIdentityCredential), replacing a fragilecurl-based approach that failed in the Container App environment (#260). - ACA IP-deny vs app-auth response codes — day-role-sync runbook corrected to document the actual HTTP responses returned by ACA ingress IP-deny rules vs. application-level auth failures (#196, #270).
- OIDC federated credentials updated to repo's canonical name
rsl-mom-bot(wasmom-botpre-rename). Bothmom-bot-prandmom-bot-main-pushFICs now match GitHub's current OIDC subject claim; unblocks theBicep what-if previewworkflow on PR-triggered runs and the nextworkflow_dispatchofdeploy.yml(#248, #252).
Infrastructure
- Log Analytics + App Insights provisioned via Bicep — workspace and Application Insights instance declared in Bicep and wired to the Container App Environment (#239).
- Non-credential Key Vault values provisioned via Bicep — configuration secrets (non-credential KV entries) are now set through the Bicep deployment rather than applied manually (#121, #237).
MOM_BOT_ENV/ database-url parameterisation — environment name and derived database URL secret name now flow through Bicep parameters, removing hard-coded values (#230).- Resource group parameterised in CI —
AZURE_RESOURCE_GROUPenvironment variable drives the deploy workflow; no more hard-coded RG name (#263). - Dead AzureFile plumbing removed —
storage.bicep(storage account + file share), the CAEstorageBindingresource, and the/datavolume mount deleted. The SQLite-on-AzureFile stopgap (#92) has been fully superseded by Postgres (#240, #265).
Documentation
- UAMI Container Apps Job migration spec committed to
docs/specs/(#241, #254). - Postgres role-ownership cutover plan and runbook Step 5.5 added (#262).
- AAD runbook TBDs resolved; App Insights rows added to secrets inventory (#249, #251).
- FIC rename (
mom-bot→rsl-mom-bot) documented (#248, #252). - Runbook flip-sequence Step 0 pre-deployment sanity check inserted (#244).
- Preflight checklist corrected for stale role-name and KV-secret claims (#242).
- Stale SQLite-as-production framing removed from framework plan (#243, #245).
- Five completed plan files deleted per lifecycle policy (#246, #247).
CI
- Discord release announcement posted automatically on GitHub Release publication via
notify-discord-release.yml(#228). uv lock --checkadded to CI to fail fast onpyproject.toml↔uv.lockdivergence (#229).