Commit ca39fa8
workflow slug: backfill for existing rows + frontend surfacing
Migration backfill
------------------
The slug migration previously assumed `workflow_lineages` was empty
(`NOT NULL DEFAULT ''` then drop default). On any populated environment
that would either fail when adding the unique index, or collapse every
row to `slug = ''`.
Rewrote the in-place migration to:
1. Add `slug TEXT` (nullable).
2. Backfill in SQL: kebab-case the `name` column (lower, replace
`[^a-z0-9]+` with `-`, trim leading/trailing `-`). Rows whose name
normalizes to an empty string fall back to `workflow`.
3. Deduplicate within `group_id` using `row_number()` ordered by
`created_at, id` -- earliest creator keeps the bare slug, others
get `-2`, `-3`, ...
4. SET NOT NULL, then add the unique index `(group_id, slug)`.
Verified locally against synthetic rows: 3 collisions of
"Invoice Workflow" -> {invoice-workflow, invoice-workflow-2,
invoice-workflow-3}; "Invoice Workflow!!! (v2)" -> invoice-workflow-v2;
all-symbol name " --- " -> workflow.
Frontend slug surfacing
-----------------------
New shared chip component (Mantine):
src/components/workflow/SlugChip.tsx
`<SlugChip slug="..." />` renders the slug as a `<Code>` element
with a `CopyButton` tooltip ("Copy slug" -> "Copied" on click).
Surfaced in three places:
* WorkflowListPage: new "Slug" column between Name and Description.
* WorkflowEditPage: slug shown under the title (slugs are immutable
once a lineage exists, so it's read-only here -- only a copy
affordance, no edit).
* WorkflowPage (create): a small live "API handle (slug): <preview>"
description under the Name input. `previewSlug()` mirrors the
backend `slugifyName` so the user can anticipate what they'll
get; server still has the final say on dedup.
Type plumbing
-------------
`WorkflowInfo` (and the duplicate definition in
`features/benchmarking/hooks/useWorkflows.ts`) gain a `slug: string`
field to match the backend response shape.
Test summary
------------
- Frontend: tsc clean, biome clean, existing test suites unchanged.
- Backend: full Jest run -- 2065 tests pass, 0 regressions.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1 parent 2bcabd2 commit ca39fa8
7 files changed
Lines changed: 122 additions & 3 deletions
File tree
- apps
- frontend/src
- components/workflow
- data/hooks
- features/benchmarking/hooks
- pages
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
| 10 | + | |
9 | 11 | | |
10 | 12 | | |
11 | 13 | | |
| |||
Lines changed: 1 addition & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| 19 | + | |
19 | 20 | | |
20 | 21 | | |
21 | 22 | | |
| |||
334 | 335 | | |
335 | 336 | | |
336 | 337 | | |
337 | | - | |
| 338 | + | |
338 | 339 | | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
339 | 346 | | |
340 | 347 | | |
341 | 348 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| 19 | + | |
19 | 20 | | |
20 | 21 | | |
21 | 22 | | |
| |||
161 | 162 | | |
162 | 163 | | |
163 | 164 | | |
| 165 | + | |
164 | 166 | | |
165 | 167 | | |
166 | 168 | | |
| |||
175 | 177 | | |
176 | 178 | | |
177 | 179 | | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
178 | 183 | | |
179 | 184 | | |
180 | 185 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
4 | 5 | | |
5 | 6 | | |
6 | 7 | | |
| |||
20 | 21 | | |
21 | 22 | | |
22 | 23 | | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
23 | 39 | | |
24 | 40 | | |
25 | 41 | | |
| |||
272 | 288 | | |
273 | 289 | | |
274 | 290 | | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
275 | 304 | | |
276 | 305 | | |
277 | 306 | | |
| |||
Lines changed: 37 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
6 | | - | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
7 | 42 | | |
0 commit comments