# Claude Design Demand-Side API Audit — Corrected

Scope: read-only correction of `/home/wrb/cd-demand-audit.md`, using CD demand from `/home/wrb/cd-build-latest/extracted`, contract/mock supply from `packages/api-contracts` and `packages/api-mocks`, and real backend route registrations in `/home/wrb/jrni/code/voyage/workers/**`.

Correction: the prior audit used `GAP = no api-contracts operation`, which conflated missing hot-swap facade work with missing backend implementation. That was wrong. This report reclassifies demand APIs into:

- **READY**: api-contracts operation + api-mocks handler + real backend route exist.
- **NEEDS-CONTRACT+MOCK-ONLY**: real backend route exists, but the CD hot-swap layer is missing or incomplete. This is the common case.
- **NEEDS-BACKEND-BUILD**: no real backend route exists anywhere in `workers/**` for that demand.

## Corrected Coverage

Normalized demand API count remains **122** from the prior audit's demand table.

| State | Count | Percent | Meaning |
|---|---:|---:|---|
| READY | 9 | 7.4% | Contract + mock + real backend route already line up. |
| NEEDS-CONTRACT+MOCK-ONLY | 106 | 86.9% | Backend route already exists; add/register contract, generated/stateful mock, and facade mapping. |
| NEEDS-BACKEND-BUILD | 7 | 5.7% | No matching backend route found; needs real worker implementation before facade work. |

The corrected genuinely-missing-backend count is **7**, not the prior audit's 105 "GAP" items. Most work is contract/mock/facade over existing backend routes.

## Contract/Mock Baseline

The only current hot-swap registry coverage is:

- Events CRUD: `GET/POST/PATCH/DELETE /v1/admin/events` and `GET /v1/admin/events/{eventId}` in `packages/api-contracts/src/operations.ts:94`, with generated mocks in `packages/api-mocks/generated/events.handlers.ts:14`.
- Locations list/create/update/delete and archive contract: `packages/api-contracts/src/operations.ts:31`; generated location mocks cover list/detail/create/update/delete but not archive in `packages/api-mocks/generated/locations.handlers.ts:14`.
- Public service booking journey operations in `packages/api-contracts/src/operations.ts:151`, but these are service/appointment-shaped, not CD public event registration-shaped.

Important nuance: `getLocation` has contract+mock, but I found no real `GET /v1/admin/settings/locations/:locationId` route. The real settings worker has list/create/patch/archive/delete only.

## Backend Route Inventory Used

Primary mounted demand surfaces:

- Events worker mounts CD-relevant admin/public routes in `workers/events/src/index.ts:618` through `:700`.
- Catalog worker mounts service/staff/resource/ticket/question routes in `workers/catalog/src/index.ts:20`.
- Notifications worker mounts campaigns/templates/flows/delivery/notifications in `workers/notifications/src/index.ts:29`.
- Reporting worker mounts reports and audit in `workers/reporting/src/index.ts:31`.
- Integrations worker mounts catalog/connections/provider detail routes in `workers/integrations/src/index.ts:101`.
- Booking, queue, identity, auth, availability, payments, and staff-feed provide the remaining real backend surfaces cited below.

## Classification Table

### Events, Calendar, Dashboard

| Demand API | State | Real backend evidence |
|---|---|---|
| `GET /v1/admin/events` | READY | Contract `listEvents`; mock `events.handlers.ts`; route `workers/events/src/routes/events.ts:20`, mounted `workers/events/src/index.ts:637`. |
| `GET /v1/admin/events/{id}` | READY | Contract `getEvent`; mock detail handler; route `workers/events/src/routes/events.ts:23`, mounted `workers/events/src/index.ts:637`. |
| `POST /v1/admin/events` | READY | Contract `createEvent`; mock create handler; route `workers/events/src/routes/events.ts:22`, mounted `workers/events/src/index.ts:637`. |
| `PATCH /v1/admin/events/{id}` | READY | Contract `updateEvent`; mock update handler; route `workers/events/src/routes/events.ts:24`, mounted `workers/events/src/index.ts:637`. |
| `DELETE /v1/admin/events/{id}` | READY | Contract `deleteEvent`; mock remove handler; route `workers/events/src/routes/events.ts:25`, mounted `workers/events/src/index.ts:637`. |
| Public preview/event detail, public landing read | NEEDS-CONTRACT+MOCK-ONLY | `GET /v1/public/events/:eventId` in `workers/events/src/index.ts:620`; public landing surfaces `workers/events/src/routes/publish-surfaces.ts:521`. |
| Duplicate event | NEEDS-CONTRACT+MOCK-ONLY | `POST /v1/admin/catalog/events/:eventId/duplicate` via `workers/events/src/routes/studio-catalog.ts:251`, mounted `workers/events/src/index.ts:657`; CD path can alias this. |
| Event overlay guests/tickets/share subresources | NEEDS-CONTRACT+MOCK-ONLY | Admin event get exists; event registrations `workers/events/src/index.ts:627`; guests `workers/events/src/index.ts:679`; live messages `workers/events/src/routes/live-messages.ts:237`. |
| Event export | NEEDS-CONTRACT+MOCK-ONLY | `GET /v1/admin/events/export` in `workers/events/src/routes/events.ts:21`. Prior demanded POST; backend exists with GET/export semantics. |
| Bulk archive/cancel/delete draft | NEEDS-CONTRACT+MOCK-ONLY | Cancel/discard routes `workers/events/src/routes/events.ts:27`; delete route `workers/events/src/routes/events.ts:25`. Bulk can be facade iteration unless a batch route is desired. |
| Calendar week/month/day | NEEDS-CONTRACT+MOCK-ONLY | `GET /v1/admin/calendar`, `/agenda`, `/day`, `/months` in `workers/events/src/routes/studio-calendar.ts:163`; booking calendar range also exists in `workers/booking/src/routes/calendar.ts:359`. |
| Dashboard summary/KPIs | NEEDS-CONTRACT+MOCK-ONLY | `GET /v1/admin/dashboard/summary` in `workers/events/src/routes/studio-dashboard.ts:92`. |

### Event Creation, Publishing, Templates, Landing

| Demand API | State | Real backend evidence |
|---|---|---|
| Event draft aggregate create/update/get | NEEDS-CONTRACT+MOCK-ONLY | Generic event create/get/patch routes exist in `workers/events/src/routes/events.ts:22` through `:24`; schema already persists registration/landing/waitlist fields in `workers/events/src/routes/studio-events.ts`. |
| Publish/schedule/take offline | NEEDS-CONTRACT+MOCK-ONLY | Event status update route exists `PATCH /v1/admin/events/:id`; landing publish routes exist in `workers/events/src/routes/publish-surfaces.ts:444` and canvas publish/schedule in `workers/events/src/routes/canvas.ts:2430`. |
| Brand review before publish | NEEDS-CONTRACT+MOCK-ONLY | Branding/settings and design-token routes exist: `workers/events/src/routes/studio-settings.ts:297`, `workers/events/src/routes/design-tokens.ts:695`. Needs contractized validation facade. |
| Approval submit from publish | NEEDS-CONTRACT+MOCK-ONLY | `POST /v1/admin/events/:eventId/approvals/submit` in `workers/events/src/routes/studio-event-approvals.ts:617`, mounted `workers/events/src/index.ts:634`. |
| Save as template/from event | NEEDS-CONTRACT+MOCK-ONLY | Event templates CRUD exists in `workers/events/src/routes/studio-event-templates.ts:225`; duplicate exists `:229`. |
| Landing editor save/preview/publish | NEEDS-CONTRACT+MOCK-ONLY | Landing surfaces `workers/events/src/routes/publish-surfaces.ts:276`, `:416`, `:444`; canvas pages `workers/events/src/routes/canvas.ts:2104`, `:2179`, `:2430`. |

### Public Event Registration

| Demand API | State | Real backend evidence |
|---|---|---|
| `GET /v1/public/events/{eventIdOrSlug}` | NEEDS-CONTRACT+MOCK-ONLY | `GET /v1/public/events/:eventId` in `workers/events/src/index.ts:620`; public journey by slug `workers/events/src/routes/journey-surfaces.ts:1940`. |
| Registration load | NEEDS-CONTRACT+MOCK-ONLY | Public event get plus public journey catalog/availability routes `workers/events/src/routes/journey-surfaces.ts:1950`, `:1960`; registration read route `workers/events/src/index.ts:623`. |
| Complete event registration / waitlist | NEEDS-CONTRACT+MOCK-ONLY | `POST /v1/public/events/:eventId/register` in `workers/events/src/index.ts:622`; public landing register `workers/events/src/routes/publish-surfaces.ts:545`; journey register `workers/events/src/routes/journey-surfaces.ts:2225`. |
| Read/cancel registration | NEEDS-CONTRACT+MOCK-ONLY | `GET /v1/public/events/:eventId/registrations/:ref` and cancel in `workers/events/src/index.ts:623`. |
| Calendar invite `.ics` | NEEDS-BACKEND-BUILD | Calendar URL helper exists in `workers/events/src/calendar-links.ts:113`, but I found no registered route for `/v1/public/events/:eventId/calendar.ics`. |

### Locations and Settings

| Demand API | State | Real backend evidence |
|---|---|---|
| `GET /v1/admin/settings/locations` | READY | Contract `listLocations`; mock list handler; route `workers/events/src/routes/studio-settings.ts:292`, mounted `workers/events/src/index.ts:662`. |
| `POST /v1/admin/settings/locations` | READY | Contract `createLocation`; mock create handler; route `workers/events/src/routes/studio-settings.ts:293`. |
| `PATCH /v1/admin/settings/locations/{id}` | READY | Contract `updateLocation`; mock update handler; route `workers/events/src/routes/studio-settings.ts:294`. |
| `DELETE /v1/admin/settings/locations/{id}` | READY | Contract `deleteLocation`; mock remove handler; route `workers/events/src/routes/studio-settings.ts:296`. |
| `PATCH /v1/admin/settings/locations/{id}/archive` | NEEDS-CONTRACT+MOCK-ONLY | Contract and real route exist, but generated mock lacks archive: `workers/events/src/routes/studio-settings.ts:295`. |
| `GET /v1/admin/settings/locations/{id}` | NEEDS-BACKEND-BUILD | Contract+mock exist, but no real `studioSettings.get('/locations/:locationId')` route was found; only list/create/patch/archive/delete are registered in `workers/events/src/routes/studio-settings.ts:292`. |
| Duplicate location | NEEDS-BACKEND-BUILD | No `locations/:id/duplicate` route found. |
| Location presence staff/resources | NEEDS-CONTRACT+MOCK-ONLY | Similar backend data exists via queue staff overview `workers/queue/src/routes/staff-overview.ts:44`, mounted `workers/queue/src/index.ts:28`; contract should decide whether to expose this under settings presence. |

### Audit, Compliance, Security, Billing

| Demand API | State | Real backend evidence |
|---|---|---|
| Audit log list/search/filter | NEEDS-CONTRACT+MOCK-ONLY | Reporting audit `GET /v1/admin/audit` in `workers/reporting/src/routes/audit.ts:76`; events audit also mounted `workers/events/src/index.ts:685`; staff-feed audit `workers/staff-feed/src/routes/transition.ts:88`. |
| Audit export | NEEDS-CONTRACT+MOCK-ONLY | `GET /v1/admin/audit/export` in `workers/reporting/src/routes/audit.ts:161`; prior POST demand should map or add alias. |
| Security/compliance overview | NEEDS-CONTRACT+MOCK-ONLY | `GET /v1/admin/security` in `workers/events/src/routes/studio-security.ts:223`, mounted `workers/events/src/index.ts:648`. |
| Compliance document downloads | NEEDS-BACKEND-BUILD | No compliance document/signed download route found. |
| Billing summary/invoices/download | NEEDS-CONTRACT+MOCK-ONLY | `GET /v1/admin/billing`, `/invoices`, `/invoices/:id/pdf` in `workers/events/src/routes/studio-billing.ts:121`. |
| Billing portal session | NEEDS-BACKEND-BUILD | No `portal-session` or equivalent billing portal route found. |

### Approvals

| Demand API | State | Real backend evidence |
|---|---|---|
| Approval settings get/update | NEEDS-CONTRACT+MOCK-ONLY | `GET/PUT /v1/admin/events/approvals/settings` in `workers/events/src/routes/studio-event-approval-processes.ts:426`, mounted `workers/events/src/index.ts:633`. |
| Approval process CRUD | NEEDS-CONTRACT+MOCK-ONLY | `GET/POST/GET/:id/PUT/:id/DELETE/:id` in `workers/events/src/routes/studio-event-approval-processes.ts:413`, mounted `workers/events/src/index.ts:632`. |
| Approval process duplicate | NEEDS-BACKEND-BUILD | No `approval-processes/:id/duplicate` route found. |
| Approval queue/inbox | NEEDS-CONTRACT+MOCK-ONLY | `GET /v1/admin/events/approvals/queue` in `workers/events/src/routes/studio-event-approvals.ts:630`. |
| Submit/review/decision/reset | NEEDS-CONTRACT+MOCK-ONLY | `submit`, `review`, `decide`, `reset` in `workers/events/src/routes/studio-event-approvals.ts:617`. |

### Team, Roles, Account, Identity

| Demand API | State | Real backend evidence |
|---|---|---|
| Team members list/invite/update/remove | NEEDS-CONTRACT+MOCK-ONLY | Identity tenant routes `GET/POST/PATCH/DELETE /t/:tenantSlug/admin/team/members` in `workers/identity/src/routes/admin-team.ts:757`, mounted `workers/identity/src/index.ts:70`. |
| Roles list/create/update/delete | NEEDS-CONTRACT+MOCK-ONLY | `GET/POST/PATCH/DELETE /t/:tenantSlug/admin/team/roles` in `workers/identity/src/routes/admin-team.ts:669`. |
| Sign in/session/whoami/workspaces | NEEDS-CONTRACT+MOCK-ONLY | Auth worker login/session/user routes in `workers/auth/src/index.ts:86`; identity auth routes include `whoami` and `my-tenants` in `workers/identity/src/routes/auth.ts:1132`. |
| Account details/security/sessions | NEEDS-CONTRACT+MOCK-ONLY | Auth worker `/users/me`, `/users/me/sessions`, password/MFA routes in `workers/auth/src/index.ts:94`. |

### Branding, Calendar Settings, General Settings, Imports

| Demand API | State | Real backend evidence |
|---|---|---|
| Branding get/update/reset | NEEDS-CONTRACT+MOCK-ONLY | Settings index/update/reset routes in `workers/events/src/routes/studio-settings.ts:291`, `:297`, `:298`; public branding mounted `workers/events/src/index.ts:665`. |
| Logo upload/delete/serve | NEEDS-CONTRACT+MOCK-ONLY | `POST/DELETE/GET /v1/admin/settings/logo` routes in `workers/events/src/routes/studio-settings.ts:299`. |
| Calendar categories get/update | NEEDS-CONTRACT+MOCK-ONLY | `GET/PUT /v1/admin/settings/calendar-categories` in `workers/events/src/routes/studio-settings.ts:305`. |
| Closed days / closures CRUD | NEEDS-CONTRACT+MOCK-ONLY | `GET/POST/PUT/PATCH/DELETE /v1/admin/closures` in `workers/events/src/routes/studio-closures.ts:94`; availability also has facility closures in `workers/availability/src/routes/facility-closures.ts:68`. |
| Bulk importer/status | NEEDS-CONTRACT+MOCK-ONLY | `GET /v1/admin/imports`, `POST /bulk`, status routes in `workers/events/src/routes/studio-imports.ts:217`, mounted `workers/events/src/index.ts:650`. |
| General settings get/update | NEEDS-CONTRACT+MOCK-ONLY | `GET/PATCH /v1/admin/settings/general` in `workers/events/src/routes/studio-settings.ts:302`. |

### Integrations

| Demand API | State | Real backend evidence |
|---|---|---|
| Integration catalog/list | NEEDS-CONTRACT+MOCK-ONLY | `GET /v1/admin/integrations/catalog` in `workers/integrations/src/routes/catalog.ts:559`, mounted `workers/integrations/src/index.ts:101`; connection list also `workers/integrations/src/routes/connections.ts:143`. |
| Connect/disconnect | NEEDS-CONTRACT+MOCK-ONLY | Generic connections `POST/PATCH/DELETE` in `workers/integrations/src/routes/connections.ts:200`; provider routes for Salesforce/Slack/HubSpot/Mailchimp/GA4 disconnect/config exist in their files. |
| Refresh/sync/test | NEEDS-CONTRACT+MOCK-ONLY | Provider verification `workers/integrations/src/routes/verify.ts:343`; Salesforce `test-sync` `workers/integrations/src/routes/salesforce-oauth.ts:329`; setup/status validation routes across provider files. |
| Integration detail/config/log-like status | NEEDS-CONTRACT+MOCK-ONLY | Detail/config `workers/integrations/src/routes/detail.ts:413`; provider-specific status/setup routes in `workers/integrations/src/index.ts:105`. |

### Services, Staff, Resources, Queues, Appointments

| Demand API | State | Real backend evidence |
|---|---|---|
| Admin services CRUD/duplicate | NEEDS-CONTRACT+MOCK-ONLY | Events studio catalog services `workers/events/src/routes/studio-catalog.ts:238`; catalog worker services `workers/catalog/src/routes/services.ts:91`. |
| Service categories CRUD/reorder | NEEDS-CONTRACT+MOCK-ONLY | Events catalog categories `workers/events/src/routes/studio-catalog-categories.ts:46`; catalog categories `workers/catalog/src/routes/categories.ts:39`. |
| Service packages CRUD/duplicate | NEEDS-CONTRACT+MOCK-ONLY | `workers/events/src/routes/studio-catalog-packages.ts:56`, duplicate `:62`. |
| Staff library/editor/groups | NEEDS-CONTRACT+MOCK-ONLY | Events staff list/groups `workers/events/src/routes/studio-staff.ts:40`; catalog staff CRUD `workers/catalog/src/routes/staff.ts:46`. |
| Resources library/editor/groups | NEEDS-CONTRACT+MOCK-ONLY | Catalog resources CRUD/duplicate `workers/catalog/src/routes/resources.ts:197`; resource groups `workers/catalog/src/routes/resource-groups.ts:74`. |
| Queue module/status/actions | NEEDS-CONTRACT+MOCK-ONLY | Queue routes `workers/queue/src/routes/queues.ts:491`; entries/actions `workers/queue/src/routes/entries.ts:678`; metrics `workers/queue/src/routes/metrics.ts:6`. |
| Appointment/calendar module | NEEDS-CONTRACT+MOCK-ONLY | Booking calendar `workers/booking/src/routes/calendar.ts:359`; events appointment calendar `workers/events/src/index.ts:639`. |

### Questions, Tickets, Promos, Templates, Flows

| Demand API | State | Real backend evidence |
|---|---|---|
| Questions CRUD | NEEDS-CONTRACT+MOCK-ONLY | Events questions `workers/events/src/routes/studio-questions.ts:102`; booking/catalog question routes also exist in `workers/booking/src/routes/booking-questions.ts:43` and `workers/catalog/src/routes/booking-questions.ts:99`. |
| Question groups CRUD | NEEDS-CONTRACT+MOCK-ONLY | `workers/events/src/routes/studio-questions.ts:97`. |
| Ticket groups CRUD/duplicate | NEEDS-CONTRACT+MOCK-ONLY | `workers/catalog/src/routes/ticket-groups.ts:101`, duplicate `:295`. |
| Ticket types CRUD/duplicate | NEEDS-CONTRACT+MOCK-ONLY | `workers/catalog/src/routes/ticket-types.ts:92`, duplicate `:298`. |
| Promos/discounts CRUD/pause/duplicate | NEEDS-CONTRACT+MOCK-ONLY | Events promos `workers/events/src/routes/studio-promos.ts:11`; payment discount codes `workers/payments/src/routes/discounts.ts:44`. |
| Event templates CRUD/duplicate | NEEDS-CONTRACT+MOCK-ONLY | `workers/events/src/routes/studio-event-templates.ts:225`. |
| Messaging flows CRUD | NEEDS-CONTRACT+MOCK-ONLY | Notifications flows `workers/notifications/src/routes/flows.ts:156`, mounted `workers/notifications/src/index.ts:40`. |

### Guests, Segments, Waitlist, Inbox, Notifications

| Demand API | State | Real backend evidence |
|---|---|---|
| Guests list/profile/create/update/delete/export/import | NEEDS-CONTRACT+MOCK-ONLY | `workers/events/src/routes/studio-guests.ts:196`, mounted `workers/events/src/index.ts:668`; event guests mounted `workers/events/src/index.ts:679`. |
| Guest message/invite | NEEDS-CONTRACT+MOCK-ONLY | Invites `workers/events/src/routes/studio-segments.ts:138`; event live messages `workers/events/src/routes/live-messages.ts:237`; guest invitation handlers in `workers/events/src/routes/studio-admin-guests.ts`. |
| Segments CRUD/archive | NEEDS-CONTRACT+MOCK-ONLY | `workers/events/src/routes/studio-segments.ts:128`, mounted `workers/events/src/index.ts:655`. |
| Waitlist views/actions | NEEDS-CONTRACT+MOCK-ONLY | Report waitlist route `workers/reporting/src/routes/reports.ts:666`; event guests support waitlist statuses in `workers/events/src/routes/studio-admin-guests.ts`. |
| Notifications list/mark/dismiss | NEEDS-CONTRACT+MOCK-ONLY | Events notifications `workers/events/src/routes/studio-notifications.ts:104`; notifications worker also has admin notifications `workers/notifications/src/routes/notifications.ts:296`. |
| Inbox reply/archive/read/flag | NEEDS-CONTRACT+MOCK-ONLY | `workers/events/src/routes/studio-inbox.ts:123`, mounted `workers/events/src/index.ts:643`. |
| Booking responses | NEEDS-CONTRACT+MOCK-ONLY | `workers/events/src/routes/studio-booking-responses.ts:82`, mounted `workers/events/src/index.ts:656`. |
| VIP confirmations | NEEDS-CONTRACT+MOCK-ONLY | `workers/events/src/routes/studio-vip-confirmations.ts:68`, mounted `workers/events/src/index.ts:645`. |

### Campaigns, Messaging, Delivery

| Demand API | State | Real backend evidence |
|---|---|---|
| Campaigns list/create/update/approve/reject/send/archive | NEEDS-CONTRACT+MOCK-ONLY | Events campaigns `workers/events/src/routes/studio-campaigns.ts:141`; notifications campaigns `workers/notifications/src/routes/campaigns.ts:88`. |
| Email/SMS composer save/send/schedule/test | NEEDS-CONTRACT+MOCK-ONLY | Events campaigns send `workers/events/src/routes/studio-campaigns.ts:146`; notifications SMS campaigns `workers/notifications/src/routes/sms-campaigns.ts`; email designs/test-send `workers/events/src/routes/canvas.ts:2664`. |
| Notification templates CRUD/archive | NEEDS-CONTRACT+MOCK-ONLY | Events templates `workers/events/src/routes/studio-campaigns.ts:149`; notifications templates `workers/notifications/src/routes/templates.ts:14`. |
| Delivery log/detail/retry-equivalent | NEEDS-CONTRACT+MOCK-ONLY | Delivery list/detail `workers/notifications/src/routes/delivery.ts:26`; outbox/admin notifications routes exist in `workers/notifications/src/routes/notifications.ts:331`. |
| Live message guests | NEEDS-CONTRACT+MOCK-ONLY | `POST /v1/admin/events/:eventId/live-messages` in `workers/events/src/routes/live-messages.ts:237`. |

### Reports and Analytics

| Demand API | State | Real backend evidence |
|---|---|---|
| Reports overview/event/guest/campaign/revenue | NEEDS-CONTRACT+MOCK-ONLY | Studio reports `workers/events/src/routes/studio-reports.ts:396`; reporting worker reports `workers/reporting/src/routes/reports.ts:435`. |
| Report export/jobs/downloads | NEEDS-CONTRACT+MOCK-ONLY | Reporting jobs/export/download routes `workers/reporting/src/routes/reports.ts:469`, `:591`, `:2142`; event report jobs `workers/reporting/src/routes/event-reports.ts:60`. |
| Goals get/update | NEEDS-CONTRACT+MOCK-ONLY | `GET/PUT /v1/admin/reports/goals` in `workers/events/src/routes/studio-reports.ts:414`. |
| Reports library/detail | NEEDS-CONTRACT+MOCK-ONLY | `GET /v1/admin/reports/library` and `/:reportId` in `workers/events/src/routes/studio-reports.ts:397`. |
| Drilldowns | NEEDS-CONTRACT+MOCK-ONLY | Studio drilldowns in `workers/events/src/routes/studio-reports.ts:402`; reporting worker has many report drilldowns in `workers/reporting/src/routes/reports.ts`. |

### Hub, Landing Pages, Public Hubs, Help

| Demand API | State | Real backend evidence |
|---|---|---|
| Landing pages index/editor/publish | NEEDS-CONTRACT+MOCK-ONLY | Canvas pages `workers/events/src/routes/canvas.ts:2104`; landing surfaces `workers/events/src/routes/publish-surfaces.ts:276`; mounted `workers/events/src/index.ts:697`. |
| Hub pages index/editor/publish | NEEDS-CONTRACT+MOCK-ONLY | Hub surfaces `workers/events/src/routes/publish-surfaces.ts:467`; studio hubs redirect/index `workers/events/src/routes/studio-hubs.ts:61`; journey surfaces also cover hubs. |
| Public location/group/workspace hubs | NEEDS-CONTRACT+MOCK-ONLY | `GET /v1/hubs/public/:slug` in `workers/events/src/routes/publish-surfaces.ts:634`, mounted `workers/events/src/index.ts:596`. |
| Public hub subscribe/get notified | NEEDS-CONTRACT+MOCK-ONLY | Public hub visit exists `workers/events/src/routes/publish-surfaces.ts:643`; public journey join/register routes exist `workers/events/src/routes/journey-surfaces.ts:2107`, `:2225`. |
| Help articles/search | NEEDS-BACKEND-BUILD | No help/article/CMS route found in workers. This can stay static, but if CD expects API-backed help content it needs a backend. |

## Corrected Roadmap

### Phase 0 — Route/Contract Reconciliation

This is the highest-leverage phase. Build a demand API manifest that maps CD demand paths to existing real worker routes. Do not create backend work tickets for domains that already have routes.

Deliverables:

- Register contracts for existing backend domains in batches: events extended lifecycle/public registration, settings/branding/calendar, approvals/audit, catalog libraries, people/guests, messaging, reports, integrations, pages/hubs.
- Generate or add stateful mocks for every registered operation.
- Add facade adapters for path/name differences, such as `settings/closures` -> `/v1/admin/closures`, `approval-submissions` -> `/v1/admin/events/approvals`, and CD integration list -> integration catalog/connections.

### Phase 1 — Fast Hot-Swap Coverage Over Existing Backends

Most of the demand audit lands here. Suggested order:

1. Events/public registration/landing/calendar/dashboard.
2. Settings: locations archive mock, branding/logo, calendar categories, closures, general settings, imports.
3. Approvals, audit, security, billing read/invoice.
4. Catalog libraries: services, categories, packages, staff, resources, questions, tickets, promos, templates.
5. Guests, segments, waitlist, inbox, notifications, VIP confirmations, booking responses.
6. Campaigns, messaging flows, delivery, notification templates, live messages.
7. Reports/goals/library/drilldowns/exports.
8. Integrations catalog/connections/provider config.
9. Landing pages, hubs, public hubs.

Acceptance per domain:

- Operation registered in `OPERATIONS_REGISTRY` with stable callId/operationId.
- Request/response schemas reflect the CD shape or a clearly documented client adapter shape.
- Generated/stateful mock validates responses and supports mutation round-trips.
- Facade method can run against mock and live backend without UI code changes.

### Phase 2 — Small Genuine Backend Builds

Only these need backend work based on this audit:

| Backend build | Why |
|---|---|
| `GET /v1/admin/settings/locations/{id}` | Contract/mock exist, but the real route is missing. |
| `POST /v1/admin/settings/locations/{id}/duplicate` | CD has duplicate affordance; no route found. |
| `GET /v1/public/events/{id}/calendar.ics` | Helper exists, route missing. |
| Compliance document signed-download route | Security overview exists; document download route missing. |
| Billing portal session route | Billing summary/invoice routes exist; portal session route missing. |
| Approval process duplicate route | Process CRUD exists; duplicate route missing. |
| Help article/search API | No help route found; optional if help remains static. |

### Phase 3 — Verification

For each domain, prove the hot-swap invariant:

- CD-demand facade method works against api-mocks.
- Same method works against live/deployed worker route.
- Mutation round-trip reflects in subsequent list/get.
- No UI code changes are required to switch mock to real.

## Bottom Line

The prior audit overstated backend work by treating "not in api-contracts" as "not implemented." Correct classification shows that the backend is already broad: audit, approvals, settings, catalog, guests, messaging, reports, integrations, landing/hubs, billing, security, and public registration all have real worker routes. The main project is now a contract/mock/facade completion effort over existing backends, with only seven small backend gaps called out separately.
