Retirement of V5 Gateway, ascend-side-channel, ascend-context-worker
ADR-054 — Retirement of V5 Gateway, ascend-side-channel, ascend-context-worker
Status: Accepted 2026-05-16 Companion to: ADR-053 (lean stack)
Context
ADR-053 establishes Composio + Mem0 + Anthropic-direct-via-AI-Gateway as the canonical stack. That decision retires three Ascend-owned execution surfaces:
- V5 Gateway (
ascend-gateway-v5.ascendgtm.workers.dev) — 31 MCP tools, 44 cron triggers, Durable Objects for OAuth refresh, KV namespace for tokens + config, D1 for cold-path audit, R2 backup bucket. - ascend-side-channel (
side-channel/) — prebuilt CF Worker with 10 tools (llm_invoke, claude, web_fetch, perplexity, aws_ses, aws_bedrock, aws_textract, call_api, batch_execute, gamma). Never deployed. Bearer-auth MCP surface. Built to be a thinner V5 replacement before ADR-053 ruled the whole proxy plane unnecessary. - ascend-context-worker (
context-worker/) — separate CF Worker hostinggong-ingest+salesforce-ingestWorkflow classes, D1 tables (entities,facts,signal_evaluations), Vectorizeclient-knowledgeindex. Service-bound from V5.
This ADR defines the criteria and sequence for taking each one to zero.
Decision
Phase order
- V5 cron triggers stripped (Day 1). Empty
[triggers] crons = []in V5wrangler.toml. Deploy. Verifywrangler triggers list --name ascend-gateway-v5 --env ""returns empty. All 44 crons cancelled, not migrated. - ascend-context-worker decommissioned (Day 1). Export
entities/facts/signal_evaluationsD1 tables + Vectorizeclient-knowledgeindex to R2 archive (context-worker-archive-2026-05-16/). Delete worker. Delete D1. Delete Vectorize index. RemoveGATEWAY_SERVICEbinding from V5wrangler.toml. - Hermes rebuilt fresh (Day 1). Strip all V5 dependencies from
hermes-slack-listener/. Wire to Composio MCP + Anthropic-direct + Mem0 SDK. Deploy. End-to-end Slack verification. - V5 freeze (Day 2). Set KV
system_state:mode = "frozen". Add server-side gate returningFROZEN_GATEWAYerror on every MCP tool call. Deploy. This is the safety net: any forgotten consumer fails loud. - IDE config sweep (Day 2). Delete
ascend-gatewayMCP entry from.mcp.json,.cursor/mcp.json,.windsurf/mcp.json,.vscode/mcp.json,.codex/config.toml,~/Library/Application Support/Claude/claude_desktop_config.json. Composio is the only SaaS MCP that remains. - Repo sweep (Day 2). Delete
side-channel/,context-worker/,src/cron/(all 44 files). Delete SaaS-duplicate tools insrc/tools/that Composio now owns. Pre-commit must stay 16/16 green. - 7-day soak (Day 3–9). Daily check:
mcp__ascend-gateway__*call count = 0. Any unexpected call → identify the caller, migrate it, reset clock. - V5 delete (Day 10+). Archive KV
tokens:*+api_config:*+tenant_config:*→ R2gateway-v5-archive-2026-05-DD/. Delete worker. Delete D1ascend-gateway-v5-db. Delete DO namespaceTOKEN_MANAGER. Delete KV namespace. Delete R2 backup bucket. RevokeASCEND_GATEWAY_TOKEN.
Retirement criteria (per surface)
V5 Gateway — delete when ALL true:
system_state:mode = "frozen"deployed for ≥7 consecutive days.- CF analytics shows zero
/mcprequests withFROZEN_GATEWAYresponse code from any consumer for the full 7-day window. - All IDE configs no longer reference
ascend-gateway. - KV
tokens:*+api_config:*+tenant_config:*archived to R2.
ascend-side-channel — delete immediately: No deployment, no consumers, no soak required. Repo directory deleted. No KV/D1/R2/DO resources to archive.
ascend-context-worker — delete after data archive: No soak required (only consumer is V5, which is being retired in the same window). D1 tables + Vectorize index exported to R2 before worker delete.
Consequences
Positive:
- Single-vendor accountability for SaaS (Composio), memory (Mem0), and LLM observability (CF AI Gateway slug).
- No Ascend-owned data-path infrastructure to operate.
- Pre-commit gate (16 checks) shrinks scope dramatically — most checks target V5 internals.
Negative / Risks:
- Forgotten consumer scenario. Most likely root cause of a surprise V5 call during soak: a hardcoded URL in a script we haven’t grep’d. Mitigation: the
FROZEN_GATEWAYserver-side gate makes failures loud + immediate. - Data archive integrity. R2 exports must be verified before destructive deletes. Mitigation: each delete step includes a “rehydrate test” — write a small script that pulls from R2 and reconstructs the original structure.
Rollback
Within the 7-day soak: revert system_state:mode KV key + redeploy V5. Worker is intact.
After delete: rehydrate from R2 archives. Wrangler can re-create KV namespaces, D1 databases, DO bindings. Tokens themselves cannot be rehydrated — those re-flow via Composio OAuth.
Reference
- Plan doc:
.claude/memory/2026-05-16-session-end.md - Companion ADR:
ADR-053-lean-stack-composio-mem0-anthropic.md - Prior plan (now superseded, archived):
docs/archive/cutover-2026-05-19/plans/COMPOSIO-V6.md