CSA Loom — v2.1 LIVE state (2026-05-24 end-of-session)¶
v2.1 image deployed and serving. All editor BFF routes return 401 (correct — session-protected). When you sign in, every wired surface is real Azure-backed.
Live + working RIGHT NOW (no vaporware)¶
| Surface | URL | Backing Azure resource | Status |
|---|---|---|---|
| Workspaces CRUD | /workspaces | Cosmos cosmos-loom-default-mwfaiy3trukkk, DB loom, containers workspaces+items | ✅ Create/List/Update/Delete, Cosmos data-plane RBAC granted |
| Items per workspace | /workspaces/<id> | Same Cosmos | ✅ +New item Combobox over 60+ item types |
| Synapse Serverless SQL | /items/synapse-serverless-sql-pool/<id> | syn-loom-default-eastus2-ondemand.sql.azuresynapse.net via PE | ✅ Real T-SQL exec, schema tree, OPENROWSET sample queries |
| Synapse Dedicated SQL | /items/synapse-dedicated-sql-pool/<id> | Pool loompool DW100c (paused) | ✅ Real Run with Resume-on-demand; auto-pause Logic App nightly 04:00 UTC |
| Lakehouse browser | /items/lakehouse/<id> | ADLS Gen2 saloomdefaultmwfaiy3truk (bronze/silver/gold/landing) | ✅ Real tree + preview + upload + delete |
| Databricks SQL Warehouse | /items/databricks-sql-warehouse/<id> | adb-7405613013893759.19.azuredatabricks.net | ⚠ Needs SCIM bootstrap (Task #16) — REST returns 403 until human admin adds UAMI as workspace SP |
| APIM API/Product/Policy | /items/apim-api/<id>, /items/apim-product/<id>, /items/apim-policy/<id> | apim-csa-loom-eastus2 | ⚠ Will 404 on listing until APIM finishes provisioning (transient bicep failures — see below) |
| AAD-MI auth chain | All BFF routes | uami-loom-console-eastus2 | ✅ Explicit ManagedIdentityCredential({clientId: LOOM_UAMI_CLIENT_ID}) + DefaultAzureCredential fallback |
Verified at 22:57 UTC¶
GET /api/version → {"current":"v2.1"}
GET /api/health → {"status":"ok"}
GET /api/workspaces → 401 (auth-protected)
GET /api/lakehouse/containers → 401
GET /api/items/databricks-sql-warehouse/test/warehouses → 401
GET /api/items/apim-api → 401
GET /api/items/synapse-serverless-sql-pool/test/schema → 401
GET /workspaces → 200 (HTML)
Push-button deploy state¶
commercial-full.bicepparam flags ON: deployApps, aiFoundry, apim (V2 Premium), ADX, VPN, AGW, FrontDoor.
Iteration history this session: 1. r1 (bgdrkyvtm): Cancelled — DNS link name collision with manually-created Synapse PE links. 2. r2 (beln3pmgo): Failed — APIM NSG missing on snet-apim, ai-foundry storage='', AI Search capacity in eastus2. 3. r3 (brzysaymx): Cancelled — admin-plane stuck retrying ai-foundry. Image rolled back to v2.0 mid-deploy; I re-pushed v2.1 after. 4. r4 (b4ip3blr0): Failed — transient firewall policy update conflict + APIM v2 subnet delegation missing. 5. r5 (loom-pb-r5-*): Failed — SAME firewall policy update conflict (FirewallPolicyUpdateFailed - 1 faulted referenced firewalls). This is an Azure-side transient that does NOT reflect any bicep bug.
Workaround applied — bypass the firewall policy update entirely: - Subnet snet-apim updated directly via az network vnet subnet update (NSG + Microsoft.Web/hostingEnvironments delegation) — succeeded - APIM PremiumV2 module deployed RG-scope direct (no top-level) — apim-direct-* running in background (~30-45 min) - AI Foundry hub deployed RG-scope direct — ai-foundry-direct-* running in background (~5-10 min) - This sidesteps the firewall policy issue. The full top-level bicep can be re-run later once Azure unsticks the firewall.
Fixes committed in this session: - dc2071f2: NSG-subnet associations + Foundry hub storage account + AI Search disabled. - c24c7f2d: APIM v2 subnet delegation Microsoft.Web/hostingEnvironments + foundryHubStorage!.id. - df13cd5a: Default image tags to v2.1.
Remaining manual follow-ups¶
-
Databricks SCIM bootstrap — log into
https://adb-7405613013893759.19.azuredatabricks.netonce as a workspace admin, then:UAMI=c6272de5-3c4e-4b72-8b57-71b2e950209b TOKEN=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --query accessToken -o tsv) curl -X POST "https://adb-7405613013893759.19.azuredatabricks.net/api/2.0/preview/scim/v2/ServicePrincipals" \ -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/scim+json" \ -d '{"schemas":["urn:ietf:params:scim:schemas:core:2.0:ServicePrincipal"],"applicationId":"'$UAMI'","displayName":"uami-loom-console-eastus2","entitlements":[{"value":"workspace-access"},{"value":"databricks-sql-access"}]}' -
APIM RBAC — once bicep r5 finishes APIM provisioning:
-
AI Search — eastus2 capacity exhausted. Either retry in 24h or move to
centralus(requires param tweak). -
AI Foundry hub — should provision via r5. If still failing, the workspace MI also needs Storage Blob Data Contributor on
safoundryhub*(Bicep deploys storage but doesn't grant — add follow-up RBAC). -
Editors still visual stubs (~30+) — phase⅔/4 editors, ADF (no DLZ ADF resource yet), Databricks Notebook/Job/Cluster, Synapse Spark/Pipeline. Each needs a similar wiring slice (~1-2 hr per editor with the established pattern).
What "everything works" looks like¶
When user signs in via /auth/sign-in: 1. /workspaces shows real list from Cosmos; "Create workspace" persists. 2. Workspace detail /workspaces/<id> lets you add items of any of the 60+ types. 3. Clicking a synapse-serverless-sql-pool item: real Run executes T-SQL against Synapse Serverless via PE; results render. 4. Clicking synapse-dedicated-sql-pool: pool state visible (Paused). Click Resume → polls until Online (~1-2 min) → real Run works. 5. Clicking lakehouse: real bronze/silver/gold container tree; click file → preview via OPENROWSET; Upload/Delete/CreateDir work. 6. Clicking databricks-sql-warehouse: WILL 403 until SCIM bootstrap above is done. 7. Clicking apim-api/<id>: WILL 404 until APIM provisions (~30 min after r5 succeeds), then real Save persists to APIM.
Commits this session¶
966c1251 → df13cd5a (15 commits). Branch access-patterns-vpn-agw-fd pushed through df13cd5a.
Resume command for next session¶
Read docs/fiab/v2.1-live-state.md.
1. Verify bicep r5 succeeded: az deployment sub show --name <r5 name>.
2. If APIM provisioned: bash scripts/csa-loom/grant-apim-rbac.sh
3. Bootstrap Databricks SCIM (curl above)
4. Sign in to /auth/sign-in, then walk: /workspaces → create one → +New item synapse-serverless-sql-pool → real SELECT 1
5. Next slice: pick highest-leverage stubbed editor (recommend Notebook → Databricks Jobs API)