Acquia Demo-Day Risk Register¶
Author: [email protected] | Date: 2026-04-25 (T-28h) | Demo: Acquia HQ
Companion: RUNBOOK.md, PREFLIGHT-CHECKLIST.md, BACKUP-SCREENSHOTS-PLAN.md
L/M/H likelihood, low/med/high blast. "Recovery" = failure on stage.
R1 — Drupal LSP fatal; drush dies on bootstrap¶
- Break:
api_normalization+cedar_policyinterfaces extendContentEntityInterfacewhile classes extendConfigEntityBase. PHP refuses to compile. Seememory/project_drupal_lsp_blocker.md. - L: M | Blast: high (no drush = no demo)
- Detection:
drush statusexits non-zero; dblog showsDeclaration of ... must be compatible. - Mitigation: Confirm upstream MRs landed in api_normalization + cedar_policy repos. Verify with
composer show. Disable cedar_policy via core.extension if MR not merged (it's Tier-3, OUT in v2). Keep DB snapshot atdb/snapshots/preflight-2026-04-24.sql.gz. - Recovery: Switch to backup screenshots tab. Narrate over static images. Do NOT hot-fix on stage.
R2 — ContractPlane /authorize returns 5xx¶
- Break: ECA policy-gate call 500s; demo dead-ends before audit row.
- L: M | Blast: high
- Detection: Network tab 500; dblog
PolicyGateException. - Mitigation: Pre-seed
.agents/proposed-acquia/fixtures/contractplane_authorize.json. Setcontractplane.settings:fixture_mode = trueon stage; verify withdrush cget. - Recovery:
drush cset contractplane.settings fixture_mode true -y && drush cr(~8s). Else backup screenshots.
R3 — Acquia Cloud API auth fails (BLUEFLY_GATEWAY_TOKEN expired)¶
- Break: Expired-token pattern from prior session.
acquia_source401s. No content flows. - L: M | Blast: high
- Detection:
curl -H "Authorization: Bearer $BLUEFLY_GATEWAY_TOKEN" https://cloud.acquia.com/api/applications→ 401. - Mitigation: Refresh token via 1Password 4h before flight:
op item get "Acquia Cloud API" --field credential --reveal. Re-run.ddev/web-entrypoint.d/10-1password-secrets.sh. TTL > 24h. - Recovery:
drush cset acquia_source.settings fixture_mode true. Fixture:.agents/proposed-acquia/fixtures/acquia_inbox.json.
R4 — composer install on stage wipes node_modules; React bundle gone¶
- Break: Deploy script clears theme
node_modulesand possiblydist/. Studio-UI panel renders blank. - L: M | Blast: med
- Detection:
/contextcontrol/studioblank, console:Failed to load module script vendors.js. - Mitigation: Build artifacts pre-flight:
npm ci && npm run build. Commitdist/todemo-artifactsbranch. No re-deploy on demo day. - Recovery:
git checkout demo-artifacts -- dist/ && drush cr(~15s). Refresh.
R5 — Acquia office network blocks api.copaw.us¶
- Break: Guest WiFi blocks outbound. MCP gateway, ContractPlane, CC memory all on
*.copaw.us. - L: M | Blast: high
- Detection:
curl -v https://api.copaw.us/v1/healthhangs. - Mitigation: 5G hotspot. Pre-test on hotspot. Email host 24h ahead: allow-list
*.copaw.us,*.contextcontrol.ai. Pack Ethernet adapter. - Recovery: Tether mid-demo ("switching networks for the live API call"). 30s pause is fine; an opaque hang is not.
R6 — vendors.js fails to load React externals¶
- Break: Vite externalizes
react/react-dom. Ifesm.sh/react@18shim doesn't load first, mount throwsCannot read properties of undefined (reading 'createElement'). - L: L | Blast: med
- Detection: Console error; React mount div empty.
- Mitigation: Verify
contextcontrol_theme.libraries.ymldeclaresreact-shimas dep ofstudio-ui. Hard-refresh incognito 1h pre-demo. - Recovery: Skip React panel; pivot to Twig
cc-acquia-source-cardSDC (same data, no React).
R7 — ECA model acquia_source_ingest fails (TODO plugin IDs)¶
- Break: Generated model has
TODO_action_acquia_fetchplaceholders.Plugin not found. Ingestion never fires. - L: H | Blast: high
- Detection:
drush eca:listdoesn't show enabled, ORdrush eca:run-model acquia_source_ingest→PluginNotFoundException. - Mitigation: TODAY:
drush eca:export acquia_source_ingest | grep -i todo. Replace TODOs fromdrush eca:plugin:list action. If unfixable: do not enable; use imperative fallback. - Recovery:
drush scr .agents/proposed-acquia/fixtures/manual_ingest.phpwrites sameai_context_itemrows.
R8 — drush eca:run-model blocks 60s+; appears frozen¶
- Break: Sync ECA against live Acquia API takes 30-90s. Audience sees frozen spinner.
- L: H | Blast: med (perception)
- Detection: Stopwatch >10s with no output.
- Mitigation: Pre-warm: trigger model 5 min pre-demo to hot caches.
cc-trace-flow-vizshows loader animation. - Recovery: Narrate ("...policy gate evaluating six Cedar rules..."). >45s → Ctrl-C, fixture replay.
R9 — Group perms block demo user from compliance dashboard¶
- Break: Demo user in
acquia_demogroup; dashboard needsview compliance dashboardscoped tobluefly_internal. - L: M | Blast: high (audit is the punchline)
- Detection: URL → 403.
- Mitigation: TODAY: login as demo user, confirm 200. If 403, add to
bluefly_internalORdrush role:perm:addtoacquia_demo. - Recovery: Switch login to
admin(havedrush uliURL pre-staged). ~10s.
R10 — 14 stale Claude agent manifests fail validation¶
- Break: Root
.claude/agents/agent.ymluses legacyapiVersion: bluefly.io/v1alpha. Validator rejects → MCP tool surface empty. - L: L | Blast: med
- Detection:
drush ai:agents:listempty/errors; MCP list in studio empty. - Mitigation: move stale manifests to
Scratch/stale-manifests-backup/. Keep only 3 demo-critical:acquia-source-ingest,governance-gate,audit-trail.bluefly-validate agents→ exit 0. - Recovery: None mid-demo. Skip "show me the tools" beat; go straight to audit trail.
R11 — /api/contractplane/tenant route unresolved¶
- Break: Team D tenant-resolution in-flight. 404 → ECA
RouteNotFoundException→ policy gate skipped → audit row missing tenant. - L: M | Blast: high
- Detection:
curl -i http://stage/api/contractplane/tenant→ 404. - Mitigation: If still 404 by T-12h, hardcode
tenant_id = 'acquia-demo-001'in ECA model. Addrouting.ymlstub serving.agents/proposed-acquia/fixtures/tenant.json. - Recovery: Apply same hardcode live via
drush scrsnippet (~5s).
R12 — Cedar denies everything (deny-by-default + missing permits)¶
- Break:
cedar_policy.ai_data_sovereignty.ymldeny-by-default with no matching permit for Acquia ingest. Every request denied. - L: M | Blast: high
- Detection: Audit log 100% denies; UI shows "blocked by policy" everywhere.
- Mitigation: TODAY:
drush cedar:simulate '{"action":"acquia.ingest",...}'must return ALLOW. Verify all 6 demo actions ALLOW. - Recovery:
drush pmu cedar_policy -y && drush cr. Use pre-recorded overlay. Data flow is the punchline, not policy.
R13 — Demo URL hits IP allowlist; viewer can't load¶
- Break: Stage restricts to Bluefly office IPs. CDN 403s from Acquia HQ.
- L: L | Blast: high
- Detection: "Access Denied — IP not allowed".
- Mitigation: Request Acquia HQ public IP range from host; add to allowlist. Add hotspot IP. Fallback: unrestricted
*.contextcontrol-demo.aisubdomain pre-tested from cellular. - Recovery: Switch to unrestricted subdomain (bookmarked). Re-login via
drush uli.
R14 — "Show me the source code" — repo state is messy¶
- Break: Repo has
.agents/proposed-*/, deleted recipes, uncommitted submodules. Chaotic on screen. - L: M | Blast: low (cosmetic; credibility hit)
- Detection: Acquia engineer asks to see GitLab.
- Mitigation: Pre-curated branch
acquia-demo-clean: demo-critical modules only,.agents/gitignored, cleangit status. Push today. Bookmark. - Recovery: "Let me show you the demo branch" → tab to clean branch. Keep working dir off-screen.
14 risks. Highest L×blast: R1 (LSP), R3 (token), R7 (ECA TODOs), R12 (Cedar deny-all). Sign-off T-12h: every R# green OR fall-back exercised. Owner: [email protected].