---
id: w5/m15/t004
title: Create via createService → redirect to the service page with deploy progress
worker: worker5
status: todo
estimate: 40m
depends_on: [w5/m15/t003]
---

## Objective

Submit the wizard: call the existing GraphQL `createService` mutation with the assembled input, then redirect to the new service's page where the existing phase/deploy-history UI shows the build progressing to Running — Render's "watch it deploy on the Events page" beat.

## Context

- `createService` already exists (w2/m4-verified create surface; upsert semantics — creating an existing name updates it, so warn on name collision if the services list already has it).
- Service page already renders phase + deploy history (w5/m5, w2/m5 UI) — no new progress UI, just land there.
- Server-side errors (invalid plan, bad repo, 503 store) must surface on the form, not vanish into a toast.

## Steps

1. Mutation document + codegen (extend input fields only if the schema already carries them; gaps → file follow-ups, don't add backend scope here).
2. Submit handler: loading state, error mapping onto fields, success → `router.navigate` to `/services/$id`.
3. Duplicate-name guard using the already-loaded services list.

## Files

- `dashboard/src/features/services/create/` (submit) + GraphQL documents

## Acceptance criteria

- [ ] Happy path lands on the service page and the deploy is visible
- [ ] Server errors render on the form; duplicate name warns before upserting

## Out of scope

- Backend mutation changes (file follow-ups)
