Part of #1127. Depends on #1130.
Scope
Add slug as a first-class workflow identifier across the API.
Changes
- POST workflow: accept optional
slug field. If absent, derive from name (lowercase, spaces → -, strip URL-unsafe chars). On collision within a workspace, return an error that includes both the conflicting slug and the existing workflow's UUID so CLI scripts can recover.
- GET by slug:
GET /v1/workspaces/:workspaceId/workflows/slug/:slug (matches existing by-name path-param convention).
- Run by slug: trigger endpoint accepts the slug in the path in addition to UUID.
- PATCH workflow: allow changing
slug; enforce the same workspace-scoped uniqueness check.
- Shared slugify helper used by both the migration backfill and the API.
- Validation on user-supplied slugs (allowed characters, length). Reserved-words handling deferred.
Out of scope
UI, CLI, SDK, Terraform — covered in sibling issues.
Part of #1127. Depends on #1130.
Scope
Add slug as a first-class workflow identifier across the API.
Changes
slugfield. If absent, derive fromname(lowercase, spaces →-, strip URL-unsafe chars). On collision within a workspace, return an error that includes both the conflicting slug and the existing workflow's UUID so CLI scripts can recover.GET /v1/workspaces/:workspaceId/workflows/slug/:slug(matches existing by-name path-param convention).slug; enforce the same workspace-scoped uniqueness check.Out of scope
UI, CLI, SDK, Terraform — covered in sibling issues.