Skip to content

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:

  1. 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.
  2. 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.
  3. ascend-context-worker (context-worker/) — separate CF Worker hosting gong-ingest + salesforce-ingest Workflow classes, D1 tables (entities, facts, signal_evaluations), Vectorize client-knowledge index. Service-bound from V5.

This ADR defines the criteria and sequence for taking each one to zero.

Decision

Phase order

  1. V5 cron triggers stripped (Day 1). Empty [triggers] crons = [] in V5 wrangler.toml. Deploy. Verify wrangler triggers list --name ascend-gateway-v5 --env "" returns empty. All 44 crons cancelled, not migrated.
  2. ascend-context-worker decommissioned (Day 1). Export entities / facts / signal_evaluations D1 tables + Vectorize client-knowledge index to R2 archive (context-worker-archive-2026-05-16/). Delete worker. Delete D1. Delete Vectorize index. Remove GATEWAY_SERVICE binding from V5 wrangler.toml.
  3. 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.
  4. V5 freeze (Day 2). Set KV system_state:mode = "frozen". Add server-side gate returning FROZEN_GATEWAY error on every MCP tool call. Deploy. This is the safety net: any forgotten consumer fails loud.
  5. IDE config sweep (Day 2). Delete ascend-gateway MCP 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.
  6. Repo sweep (Day 2). Delete side-channel/, context-worker/, src/cron/ (all 44 files). Delete SaaS-duplicate tools in src/tools/ that Composio now owns. Pre-commit must stay 16/16 green.
  7. 7-day soak (Day 3–9). Daily check: mcp__ascend-gateway__* call count = 0. Any unexpected call → identify the caller, migrate it, reset clock.
  8. V5 delete (Day 10+). Archive KV tokens:* + api_config:* + tenant_config:* → R2 gateway-v5-archive-2026-05-DD/. Delete worker. Delete D1 ascend-gateway-v5-db. Delete DO namespace TOKEN_MANAGER. Delete KV namespace. Delete R2 backup bucket. Revoke ASCEND_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 /mcp requests with FROZEN_GATEWAY response 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_GATEWAY server-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