Clicking Art Studio in the menu should land in Eric's ArtPipe Pipeline view, and the whole tool should match his UI/UX (running reference: http://127.0.0.1:5050/; source read-only at /Volumes/art_pipe/art_pipe/src/artpipe). Today our Art Studio is Angular Material and composer-first — it looks nothing like his.
Approach (decided: re-skin + re-IA)
Restructure the art-studio entry into his 4-view shell and restyle our EXISTING, already-backend-wired Angular components to his look — do not rebuild from scratch. Keep all data wiring (services, SignalR, MediatR-backed endpoints); change the shell/IA and the skin.
Source of truth
IA / top nav:Pipeline (default landing) · Library · Metrics · Builder, + KPI strip, pipeline controls (Pause/Resume/Stop/Restart + idle status), System panel (Activity/Workers/Watcher), slide-out Generate drawer.
Phased plan (one shippable, lint+build-verified Angular PR per phase)
P1 — Shell + theme foundation + Pipeline landing. New ArtPipe-style shell: brand + 4-tab nav + KPI strip + his GitHub-dark theme tokens (scoped to the feature). Route navigateToTool('art-studio') → Pipeline. Existing components slotted into tabs (un-restyled inner content OK this phase). This is the keystone; delivers "click Art Studio → land in his Pipeline with his chrome."
P2 — Pipeline view fidelity. Generate drawer, pipeline controls (Pause/Resume/Stop/Restart), Now-Running board, live console, queue-status — match his layout/interactions.
P3 — Library re-skin to his card grid + filter-chips.
P4 — Metrics re-skin (his stat cards / charts styling).
P5 — Builder re-skin + System panel (Activity/Workers/Watcher) fidelity.
P6 — polish pass: side-by-side diff vs :5050, close visual deltas.
Constraints
Angular; run pnpm run lint:fix + pnpm run lint:styles:fix + build before each PR. Keep transloco keys. Reuse backend wiring; no backend changes expected.
Tracking issue; per-phase PRs will reference this. Starting P1.
Child issues (per-repo, auto-close on merge)
No open child issues were produced by the migration — either this epic's
work was already complete, or its scope needs to be broken down into
per-repo issues before it can progress.
Checklist generated by the umbrella-tracker migration, 2026-08-07 — Opus 5 Agent
## Goal
Clicking **Art Studio** in the menu should land in Eric's ArtPipe **Pipeline** view, and the whole tool should match his UI/UX (running reference: `http://127.0.0.1:5050/`; source read-only at `/Volumes/art_pipe/art_pipe/src/artpipe`). Today our Art Studio is Angular Material and composer-first — it looks nothing like his.
## Approach (decided: **re-skin + re-IA**)
Restructure the `art-studio` entry into his **4-view shell** and restyle our EXISTING, already-backend-wired Angular components to his look — do **not** rebuild from scratch. Keep all data wiring (services, SignalR, MediatR-backed endpoints); change the shell/IA and the skin.
## Source of truth
- **IA / top nav:** `Pipeline` (default landing) · `Library` · `Metrics` · `Builder`, + KPI strip, pipeline controls (Pause/Resume/Stop/Restart + `idle` status), System panel (Activity/Workers/Watcher), slide-out **Generate drawer**.
- **Theme tokens (GitHub-dark, exact):** `--bg:#0d1117` · `--surface:#161b22` · `--surface-2` · `--border:#30363d` · `--text:#e6edf3` · `--text-2` · `--accent:#58a6ff` · `--ok:#3fb950` · `--warn:#d29922` · `--err:#f85149` · `--purple:#bc8cff` · `--radius:6px` · `--radius-lg:8px` · font `-apple-system…`, mono `ui-monospace…`. Primitives captured: `.nav-*`, `.nav-kpi-chip.{accent,ok,warn,err}`, `.filter-chip`, `.card-*`, `.drawer`.
## View mapping (his view → our components to re-skin)
| ArtPipe view | Our existing components (reuse + restyle) |
|---|---|
| **Pipeline** (landing) | `ArtStudioShell` frame + `ArtPromptComposer` (→ Generate drawer), `ArtStageTimeline`/`ArtStageConsole`, `ArtAssetCard`/`ArtActivityPanel` (Now-Running/queue), controls |
| **Library** | `ArtGallery` / `ArtAssetLibrary` / `ArtAssetCard` |
| **Metrics** | `ArtMetricsDashboard` + `art-chart` |
| **Builder** | `ArtPipelineBuilder` |
| **System** panel | `ArtActivityPanel` / `ArtActivityLauncher` (Activity/Workers/Watcher tabs) |
## Phased plan (one shippable, lint+build-verified Angular PR per phase)
- **P1 — Shell + theme foundation + Pipeline landing.** New ArtPipe-style shell: brand + 4-tab nav + KPI strip + his GitHub-dark theme tokens (scoped to the feature). Route `navigateToTool('art-studio')` → Pipeline. Existing components slotted into tabs (un-restyled inner content OK this phase). *This is the keystone; delivers "click Art Studio → land in his Pipeline with his chrome."*
- **P2 — Pipeline view fidelity.** Generate drawer, pipeline controls (Pause/Resume/Stop/Restart), Now-Running board, live console, queue-status — match his layout/interactions.
- **P3 — Library** re-skin to his card grid + filter-chips.
- **P4 — Metrics** re-skin (his stat cards / charts styling).
- **P5 — Builder** re-skin + **System panel** (Activity/Workers/Watcher) fidelity.
- **P6 — polish pass**: side-by-side diff vs `:5050`, close visual deltas.
## Constraints
- Angular; run `pnpm run lint:fix` + `pnpm run lint:styles:fix` + build before each PR. Keep transloco keys. Reuse backend wiring; no backend changes expected.
Tracking issue; per-phase PRs will reference this. Starting P1.
<!-- BEGIN MIGRATED-CHILDREN -->
---
## Child issues (per-repo, auto-close on merge)
_No open child issues were produced by the migration — either this epic's
work was already complete, or its scope needs to be broken down into
per-repo issues before it can progress._
<sub>Checklist generated by the umbrella-tracker migration, 2026-08-07 — Opus 5 Agent</sub>
<!-- END MIGRATED-CHILDREN -->
Mapping caveat: his Pause/Resume/Stop control a local runner process. Our model is per-asset stage-runs + a global activity feed with no whole-pipeline pause. Decision for P2: surface what we actually have — the continuous-wave Stop (we already have continuousRunning/stop in the shell), per-asset Cancel/Restart (existing), and a live status pill — and omit Pause/Resume until/unless a runner-control backend exists. Don't render dead buttons.
2. Now-Running / queue board — card-body/card-tags/card-tag/card-actions/card-dismiss tiles + queue-status. Map to our ArtActivityPanel (queue/now-running) + ArtAssetCard, restyled to his card CSS.
3. Generate drawer — #drawerOverlay + .drawer (right slide-out, 420px, from his CSS) + #drawerQueue. Wrap our ArtPromptComposer in this drawer, opened by a Generate button in the control bar. His .drawer/.drawer-overlay CSS already captured.
4. KPI strip (nav right side, deferred from P1): real chips from our activity/usage — e.g. Queued / Running counts + health — no fabricated numbers.
Approach: build a lib-artpipe-pipeline-view that composes the above from our existing services (ArtStudioService, ART_ASSET_PROGRESS_SOURCE, activity), and swap the shell's pipeline@case from <lib-art-studio-shell/> to it. Reuse all data wiring. His .btn-primary/.btn-muted/.btn-danger/.card-*/.drawer classes → .artpipe-* tokens from P1.
Building this as its own PR once #142 (P1) merges (keeps the stack shallow for review).
## P2 build spec — Pipeline view fidelity (grounded in his actual markup at :5050)
Extracted his Pipeline view DOM so P2 mirrors it faithfully. Structure:
**1. Runner control bar** — buttons with state-driven visibility (`display:none` until applicable):
- `Pause` (`.btn-muted`, `runnerAction('pause')`), `Resume` (`.btn-primary`, `runnerAction('resume')`), `Stop` (`.btn-danger`, `runnerAction('stop')`), `Restart` (`.btn-muted`, `restartServer()`), `Stop` continuous (`#btnStopContinuous`, `stopContinuous()`), + an `idle`/running status label.
- **Mapping caveat:** his Pause/Resume/Stop control a *local runner process*. Our model is per-asset stage-runs + a global activity feed with no whole-pipeline pause. **Decision for P2:** surface what we actually have — the **continuous-wave Stop** (we already have `continuousRunning`/stop in the shell), per-asset **Cancel/Restart** (existing), and a live **status pill** — and omit Pause/Resume until/unless a runner-control backend exists. Don't render dead buttons.
**2. Now-Running / queue board** — `card-body`/`card-tags`/`card-tag`/`card-actions`/`card-dismiss` tiles + `queue-status`. Map to our `ArtActivityPanel` (queue/now-running) + `ArtAssetCard`, restyled to his card CSS.
**3. Generate drawer** — `#drawerOverlay` + `.drawer` (right slide-out, 420px, from his CSS) + `#drawerQueue`. Wrap our `ArtPromptComposer` in this drawer, opened by a **Generate** button in the control bar. His `.drawer`/`.drawer-overlay` CSS already captured.
**4. KPI strip** (nav right side, deferred from P1): real chips from our activity/usage — e.g. Queued / Running counts + health — no fabricated numbers.
**Approach:** build a `lib-artpipe-pipeline-view` that composes the above from our existing services (`ArtStudioService`, `ART_ASSET_PROGRESS_SOURCE`, activity), and swap the shell's `pipeline` `@case` from `<lib-art-studio-shell/>` to it. Reuse all data wiring. His `.btn-primary/.btn-muted/.btn-danger/.card-*/.drawer` classes → `.artpipe-*` tokens from P1.
Building this as its own PR once **#142 (P1)** merges (keeps the stack shallow for review).
P2 progress + an architectural gate on the runner control bar
Shipped: P2a nav KPI chips — PR #143 (stacked on #142). Live Active/Running pills polled from the staff getActivity snapshot, ArtPipe GitHub-dark styling, staff-only + degrades silently. build + lint + stylelint green.
Also folded into #142 (shell chrome scope): nav System-activity launcher (#390) and the doubled-header fix (ArtStudioShell gained a chromeless input; Pipeline view passes it; staff review link relocated to nav-right).
Gate found — runner control bar is NOT a frontend-only slice. Eric's Pipeline centers on a runner control bar (Pause / Resume / Stop / Restart + idle/running state) that drives a global continuous runner. Our backend has no equivalent — ArtStudioController exposes only per-asset actions (submit, {id}/cancel, {id}/restart/{stage}, DELETE {id}) plus queries/gallery. There is no pause/resume/stop-runner/restart-runner endpoint, and our processing model is per-asset submissions, not a controllable continuous runner.
So faithful control-bar fidelity needs a decision + backend work, not a re-skin:
Option A — adapt the bar to our model: surface what we actually have (per-asset cancel/restart-stage, the existing continuous-run stop) in his control-bar styling, and show idle/running from the activity snapshot. Frontend-only, honest, ships now — but it's his look over our semantics, not his controls.
Option B — add real runner controls: new backend endpoints + a runner-state concept (pause/resume/stop/restart the pipeline globally), then wire his bar 1:1. Cross-repo, larger, a go-live-scope decision.
Recommendation: ship Option A as P2b (safe, faithful-looking, no backend), and track Option B separately if you want true global runner control. The remaining P2 pieces (Now-Running board, Generate drawer, stage console styling) are frontend-only re-skins and remain clean once #142/#143 merge.
Ask: merge the #142→#143 stack when you get a chance (both fully verified) so P2b lands on clean master instead of deepening the stack; and pick A vs B for the control bar.
## P2 progress + an architectural gate on the runner control bar
**Shipped:** P2a nav KPI chips — **PR #143** (stacked on #142). Live Active/Running pills polled from the staff `getActivity` snapshot, ArtPipe GitHub-dark styling, staff-only + degrades silently. build + lint + stylelint green.
Also folded into #142 (shell chrome scope): nav System-activity launcher (#390) and the doubled-header fix (`ArtStudioShell` gained a `chromeless` input; Pipeline view passes it; staff review link relocated to nav-right).
**Gate found — runner control bar is NOT a frontend-only slice.** Eric's Pipeline centers on a **runner control bar** (Pause / Resume / Stop / Restart + idle/running state) that drives a *global continuous runner*. Our backend has **no equivalent** — `ArtStudioController` exposes only **per-asset** actions (`submit`, `{id}/cancel`, `{id}/restart/{stage}`, `DELETE {id}`) plus queries/gallery. There is no pause/resume/stop-runner/restart-runner endpoint, and our processing model is per-asset submissions, not a controllable continuous runner.
So faithful control-bar fidelity needs a **decision + backend work**, not a re-skin:
- **Option A — adapt the bar to our model:** surface what we actually have (per-asset cancel/restart-stage, the existing continuous-run stop) in his control-bar *styling*, and show idle/running from the activity snapshot. Frontend-only, honest, ships now — but it's his *look* over our *semantics*, not his controls.
- **Option B — add real runner controls:** new backend endpoints + a runner-state concept (pause/resume/stop/restart the pipeline globally), then wire his bar 1:1. Cross-repo, larger, a go-live-scope decision.
**Recommendation:** ship **Option A** as P2b (safe, faithful-looking, no backend), and track Option B separately if you want true global runner control. The remaining P2 pieces (Now-Running board, Generate drawer, stage console styling) are frontend-only re-skins and remain clean once #142/#143 merge.
**Ask:** merge the #142→#143 stack when you get a chance (both fully verified) so P2b lands on clean master instead of deepening the stack; and pick A vs B for the control bar.
P1+P2a merged ✅ — and a design-system fork for the Pipeline re-skin
Merged to master (e04fcea):#142 (P1 shell + theme + landing + System affordance + double-header fix) and #143 (P2a KPI chips + Now-Running board + WAI-ARIA tabs + specs + i18n a11y). Local branches cleaned up.
Key discovery before re-skinning the Pipeline content: the studio content is not un-themed — libraries/spikersoft-theme/src/lib/_art-studio.scss is a deliberate theme layer that already maps Eric's exact ArtPipe palette (accent #58a6ff → --color-primary, ok #3fb950 → --color-success, …) but intentionally re-expresses his flat panels as glass washes — "never his raw hex" — and inherits light/dark from the app theme via semantic tokens.
So "make the Pipeline match :5050" is a design-language decision, not a mechanical re-skin — and it collides with a documented team convention. Two ways:
Option A — Eric-flat fidelity (literal :5050): override the surface/bg/text tokens scoped to .artpipe-shell to Eric's flat GitHub-dark (#0d1117 / #161b22 / #21262d, hard borders, no glass). Because the studio-shell + children all theme off these tokens, the whole ArtPipe content (all 4 views) re-skins via one scoped token block — clean, low-code-risk, reviewable. Matches your "everything should be exactly the same as his." Consistent with my P1 chrome (which already uses his flat hex). Downside: overrides the theme authors' deliberate "glass, never raw hex" decision inside the ArtPipe surface (rest of app untouched).
Option B — preserve our glass design system: keep the deliberate glass re-expression; just ensure the ArtPipe surface renders in the dark theme scope so the content sits correctly in the frame. More consistent with the rest of our app; less literal to Eric (glass panels, not his flat ones).
My read: your repeated "honor every aspect / exactly the same as his" points to A, and A is a clean scoped token override I can ship as a reviewable PR (you eyeball it vs :5050). But overriding another dev's documented design convention is your call, not mine — hence flagging rather than shipping. Which do you want?
## P1+P2a merged ✅ — and a design-system fork for the Pipeline re-skin
**Merged to master (`e04fcea`):** #142 (P1 shell + theme + landing + System affordance + double-header fix) and #143 (P2a KPI chips + Now-Running board + WAI-ARIA tabs + specs + i18n a11y). Local branches cleaned up.
**Key discovery before re-skinning the Pipeline content:** the studio content is **not** un-themed — `libraries/spikersoft-theme/src/lib/_art-studio.scss` is a deliberate theme layer that already maps Eric's exact ArtPipe palette (`accent #58a6ff → --color-primary`, `ok #3fb950 → --color-success`, …) but **intentionally re-expresses his flat panels as glass washes — "never his raw hex"** — and inherits light/dark from the app theme via semantic tokens.
So "make the Pipeline match :5050" is a **design-language decision**, not a mechanical re-skin — and it collides with a documented team convention. Two ways:
- **Option A — Eric-flat fidelity (literal :5050):** override the surface/bg/text tokens *scoped to `.artpipe-shell`* to Eric's flat GitHub-dark (`#0d1117 / #161b22 / #21262d`, hard borders, no glass). Because the studio-shell + children all theme off these tokens, the whole ArtPipe content (all 4 views) re-skins via one scoped token block — clean, low-code-risk, reviewable. Matches your "everything should be exactly the same as his." Consistent with my P1 chrome (which already uses his flat hex). **Downside:** overrides the theme authors' deliberate "glass, never raw hex" decision *inside the ArtPipe surface* (rest of app untouched).
- **Option B — preserve our glass design system:** keep the deliberate glass re-expression; just ensure the ArtPipe surface renders in the **dark** theme scope so the content sits correctly in the frame. More consistent with the rest of our app; less literal to Eric (glass panels, not his flat ones).
**My read:** your repeated "honor every aspect / exactly the same as his" points to **A**, and A is a clean scoped token override I can ship as a reviewable PR (you eyeball it vs :5050). But overriding another dev's documented design convention is your call, not mine — hence flagging rather than shipping. Which do you want?
Dissolved into per-repo issues as part of the umbrella-tracker breakup. This epic held
implementation work that could never auto-close from a merge; it now lives where the code is:
Angular: spikerj/spikersoft-angular#710 — decision: ArtPipe design language — Eric-flat scoped tokens vs our documented glass theme layer (blocks the four re-skin issues below)
Angular: spikerj/spikersoft-angular#711 — P2 remainder: re-skin the Pipeline view content (ArtStudioShell, ArtAssetCard, stage timeline/console) to his .card-*/.btn-* primitives
Angular: spikerj/spikersoft-angular#715 — P5b: System panel Activity/Workers/Watcher tabs (incl. deciding the Workers data source and whether Watcher survives)
Backend: spikerj/spikersoft-backend#611 — decision: whether Art Studio gets a global runner-state concept + pause/resume/stop/restart endpoints (Option B from the gate comment below)
Already shipped, no issue filed — P1 and all of P2a/b/c are live in production.
Verified 2026-08-07 against spikersoft-angular@8e5a4048:
The ArtPipe 4-view shell exists and is the art-studio landing — libraries/features/art-studio/src/lib/art-pipe-shell/art-pipe-shell.component.ts:46
(Pipeline / Library / Metrics / Builder, plus our own fifth view Photo Stack; defaults
to pipeline; full WAI-ARIA tabs with roving focus), routed at projects/spikersoft/src/routes.ts:441.
His GitHub-dark tokens are ported verbatim and scoped to the shell — art-pipe-shell.component.scss:5-24 (--ap-bg:#0d1117, --ap-surface:#161b22, --ap-surface-2:#21262d, --ap-border:#30363d, --ap-text:#e6edf3, --ap-accent:#58a6ff, --ap-ok:#3fb950, --ap-warn:#d29922, --ap-err:#f85149, --ap-purple:#bc8cff, --ap-radius:6px/8px, -apple-system…).
Nav KPI strip (Active + Review), idle/running runner badge, and the inline Now-Running
board all ship — 526fe105, 4226ab6b, 44ecc5d1, 7218b291.
The Generate drawer wrapping ArtPromptComposer ships — f2ee9225
(art-studio-shell.component.html:48-86), plus the doubled-header fix via the chromeless input (63223ecc).
Live probe:https://learn.spikersoft.com/ → main-KZKZUOSX.js routes art-studio
→ chunk-BERDK-Hs.js, which contains artpipe-shell, artpipe-tab-, artpipe-kpi-active, artpipe-runner-badge, artpipe-nr-, studio-drawer-overlay, photostack and the literal 0d1117.
Why nothing has moved since: the two open questions from this epic's own comments were
never answered, and both are now real, closeable decision issues rather than being buried
in an epic —
The design-language fork (#710). libraries/spikersoft-theme/src/lib/_art-studio.scss
is a deliberate theme layer (#384) that maps Eric's exact palette onto our semantic
tokens but re-expresses his flat panels as glass — its header says "never his raw hex".
Making the content literally match :5050 overrides another dev's documented convention.
Every remaining re-skin issue depends on this answer.
The runner control bar (spikersoft-backend#611). Re-verified today: SpikerSoft.Api/Domain/ArtStudio/ArtStudioController.cs has 33 routes, all per-asset
(submit:204, {id}/cancel:728, {id}/restart/{stage}:762, DELETE {id}:813)
or read-side — still no runner-state concept and no pause/resume/stop/restart endpoint.
Option A (adapt the bar to our semantics) shipped; Option B is undecided.
P6 ("polish pass — side-by-side diff vs :5050") is not filed as its own ticket; each
per-view issue carries the instruction to diff against the reference and close its own
visual deltas, so there is no orphan work item.
The unit is tracked by the shared [ArtStudio UI] title prefix and by sibling cross-links in
each issue. Closing here — the umbrella tracker is being emptied.
— Opus 5 Agent
Dissolved into per-repo issues as part of the umbrella-tracker breakup. This epic held
implementation work that could never auto-close from a merge; it now lives where the code is:
- Angular: spikerj/spikersoft-angular#710 — **decision:** ArtPipe design language — Eric-flat scoped tokens vs our documented glass theme layer (blocks the four re-skin issues below)
- Angular: spikerj/spikersoft-angular#711 — P2 remainder: re-skin the Pipeline view *content* (`ArtStudioShell`, `ArtAssetCard`, stage timeline/console) to his `.card-*`/`.btn-*` primitives
- Angular: spikerj/spikersoft-angular#712 — P3: Library view → his card grid + `.filter-chip`
- Angular: spikerj/spikersoft-angular#713 — P4: Metrics view → his stat cards + chart palette
- Angular: spikerj/spikersoft-angular#714 — P5a: Builder view re-skin
- Angular: spikerj/spikersoft-angular#715 — P5b: System panel Activity/Workers/Watcher tabs (incl. deciding the Workers data source and whether Watcher survives)
- Backend: spikerj/spikersoft-backend#611 — **decision:** whether Art Studio gets a global runner-state concept + pause/resume/stop/restart endpoints (Option B from the gate comment below)
**Already shipped, no issue filed — P1 and all of P2a/b/c are live in production.**
Verified 2026-08-07 against `spikersoft-angular@8e5a4048`:
- The ArtPipe 4-view shell exists and is the `art-studio` landing —
`libraries/features/art-studio/src/lib/art-pipe-shell/art-pipe-shell.component.ts:46`
(Pipeline / Library / Metrics / Builder, plus our own fifth view Photo Stack; defaults
to `pipeline`; full WAI-ARIA tabs with roving focus), routed at
`projects/spikersoft/src/routes.ts:441`.
- His GitHub-dark tokens are ported verbatim and scoped to the shell —
`art-pipe-shell.component.scss:5-24` (`--ap-bg:#0d1117`, `--ap-surface:#161b22`,
`--ap-surface-2:#21262d`, `--ap-border:#30363d`, `--ap-text:#e6edf3`,
`--ap-accent:#58a6ff`, `--ap-ok:#3fb950`, `--ap-warn:#d29922`, `--ap-err:#f85149`,
`--ap-purple:#bc8cff`, `--ap-radius:6px`/`8px`, `-apple-system…`).
- Nav KPI strip (Active + Review), idle/running runner badge, and the inline Now-Running
board all ship — `526fe105`, `4226ab6b`, `44ecc5d1`, `7218b291`.
- The Generate drawer wrapping `ArtPromptComposer` ships — `f2ee9225`
(`art-studio-shell.component.html:48-86`), plus the doubled-header fix via the
`chromeless` input (`63223ecc`).
- **Live probe:** `https://learn.spikersoft.com/` → `main-KZKZUOSX.js` routes `art-studio`
→ `chunk-BERDK-Hs.js`, which contains `artpipe-shell`, `artpipe-tab-`,
`artpipe-kpi-active`, `artpipe-runner-badge`, `artpipe-nr-`, `studio-drawer-overlay`,
`photostack` and the literal `0d1117`.
**Why nothing has moved since:** the two open questions from this epic's own comments were
never answered, and both are now real, closeable decision issues rather than being buried
in an epic —
1. The **design-language fork** (#710). `libraries/spikersoft-theme/src/lib/_art-studio.scss`
is a deliberate theme layer (#384) that maps Eric's exact palette onto our semantic
tokens but re-expresses his flat panels as glass — its header says *"never his raw hex"*.
Making the content literally match `:5050` overrides another dev's documented convention.
Every remaining re-skin issue depends on this answer.
2. The **runner control bar** (spikersoft-backend#611). Re-verified today:
`SpikerSoft.Api/Domain/ArtStudio/ArtStudioController.cs` has 33 routes, all per-asset
(`submit` `:204`, `{id}/cancel` `:728`, `{id}/restart/{stage}` `:762`, `DELETE {id}` `:813`)
or read-side — still no runner-state concept and no pause/resume/stop/restart endpoint.
Option A (adapt the bar to our semantics) shipped; Option B is undecided.
P6 ("polish pass — side-by-side diff vs `:5050`") is not filed as its own ticket; each
per-view issue carries the instruction to diff against the reference and close its own
visual deltas, so there is no orphan work item.
The unit is tracked by the shared `[ArtStudio UI]` title prefix and by sibling cross-links in
each issue. Closing here — the umbrella tracker is being emptied.
— Opus 5 Agent
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Goal
Clicking Art Studio in the menu should land in Eric's ArtPipe Pipeline view, and the whole tool should match his UI/UX (running reference:
http://127.0.0.1:5050/; source read-only at/Volumes/art_pipe/art_pipe/src/artpipe). Today our Art Studio is Angular Material and composer-first — it looks nothing like his.Approach (decided: re-skin + re-IA)
Restructure the
art-studioentry into his 4-view shell and restyle our EXISTING, already-backend-wired Angular components to his look — do not rebuild from scratch. Keep all data wiring (services, SignalR, MediatR-backed endpoints); change the shell/IA and the skin.Source of truth
Pipeline(default landing) ·Library·Metrics·Builder, + KPI strip, pipeline controls (Pause/Resume/Stop/Restart +idlestatus), System panel (Activity/Workers/Watcher), slide-out Generate drawer.--bg:#0d1117·--surface:#161b22·--surface-2·--border:#30363d·--text:#e6edf3·--text-2·--accent:#58a6ff·--ok:#3fb950·--warn:#d29922·--err:#f85149·--purple:#bc8cff·--radius:6px·--radius-lg:8px· font-apple-system…, monoui-monospace…. Primitives captured:.nav-*,.nav-kpi-chip.{accent,ok,warn,err},.filter-chip,.card-*,.drawer.View mapping (his view → our components to re-skin)
ArtStudioShellframe +ArtPromptComposer(→ Generate drawer),ArtStageTimeline/ArtStageConsole,ArtAssetCard/ArtActivityPanel(Now-Running/queue), controlsArtGallery/ArtAssetLibrary/ArtAssetCardArtMetricsDashboard+art-chartArtPipelineBuilderArtActivityPanel/ArtActivityLauncher(Activity/Workers/Watcher tabs)Phased plan (one shippable, lint+build-verified Angular PR per phase)
navigateToTool('art-studio')→ Pipeline. Existing components slotted into tabs (un-restyled inner content OK this phase). This is the keystone; delivers "click Art Studio → land in his Pipeline with his chrome.":5050, close visual deltas.Constraints
pnpm run lint:fix+pnpm run lint:styles:fix+ build before each PR. Keep transloco keys. Reuse backend wiring; no backend changes expected.Tracking issue; per-phase PRs will reference this. Starting P1.
Child issues (per-repo, auto-close on merge)
No open child issues were produced by the migration — either this epic's
work was already complete, or its scope needs to be broken down into
per-repo issues before it can progress.
Checklist generated by the umbrella-tracker migration, 2026-08-07 — Opus 5 Agent
P2 build spec — Pipeline view fidelity (grounded in his actual markup at :5050)
Extracted his Pipeline view DOM so P2 mirrors it faithfully. Structure:
1. Runner control bar — buttons with state-driven visibility (
display:noneuntil applicable):Pause(.btn-muted,runnerAction('pause')),Resume(.btn-primary,runnerAction('resume')),Stop(.btn-danger,runnerAction('stop')),Restart(.btn-muted,restartServer()),Stopcontinuous (#btnStopContinuous,stopContinuous()), + anidle/running status label.continuousRunning/stop in the shell), per-asset Cancel/Restart (existing), and a live status pill — and omit Pause/Resume until/unless a runner-control backend exists. Don't render dead buttons.2. Now-Running / queue board —
card-body/card-tags/card-tag/card-actions/card-dismisstiles +queue-status. Map to ourArtActivityPanel(queue/now-running) +ArtAssetCard, restyled to his card CSS.3. Generate drawer —
#drawerOverlay+.drawer(right slide-out, 420px, from his CSS) +#drawerQueue. Wrap ourArtPromptComposerin this drawer, opened by a Generate button in the control bar. His.drawer/.drawer-overlayCSS already captured.4. KPI strip (nav right side, deferred from P1): real chips from our activity/usage — e.g. Queued / Running counts + health — no fabricated numbers.
Approach: build a
lib-artpipe-pipeline-viewthat composes the above from our existing services (ArtStudioService,ART_ASSET_PROGRESS_SOURCE, activity), and swap the shell'spipeline@casefrom<lib-art-studio-shell/>to it. Reuse all data wiring. His.btn-primary/.btn-muted/.btn-danger/.card-*/.drawerclasses →.artpipe-*tokens from P1.Building this as its own PR once #142 (P1) merges (keeps the stack shallow for review).
P2 progress + an architectural gate on the runner control bar
Shipped: P2a nav KPI chips — PR #143 (stacked on #142). Live Active/Running pills polled from the staff
getActivitysnapshot, ArtPipe GitHub-dark styling, staff-only + degrades silently. build + lint + stylelint green.Also folded into #142 (shell chrome scope): nav System-activity launcher (#390) and the doubled-header fix (
ArtStudioShellgained achromelessinput; Pipeline view passes it; staff review link relocated to nav-right).Gate found — runner control bar is NOT a frontend-only slice. Eric's Pipeline centers on a runner control bar (Pause / Resume / Stop / Restart + idle/running state) that drives a global continuous runner. Our backend has no equivalent —
ArtStudioControllerexposes only per-asset actions (submit,{id}/cancel,{id}/restart/{stage},DELETE {id}) plus queries/gallery. There is no pause/resume/stop-runner/restart-runner endpoint, and our processing model is per-asset submissions, not a controllable continuous runner.So faithful control-bar fidelity needs a decision + backend work, not a re-skin:
Recommendation: ship Option A as P2b (safe, faithful-looking, no backend), and track Option B separately if you want true global runner control. The remaining P2 pieces (Now-Running board, Generate drawer, stage console styling) are frontend-only re-skins and remain clean once #142/#143 merge.
Ask: merge the #142→#143 stack when you get a chance (both fully verified) so P2b lands on clean master instead of deepening the stack; and pick A vs B for the control bar.
P1+P2a merged ✅ — and a design-system fork for the Pipeline re-skin
Merged to master (
e04fcea): #142 (P1 shell + theme + landing + System affordance + double-header fix) and #143 (P2a KPI chips + Now-Running board + WAI-ARIA tabs + specs + i18n a11y). Local branches cleaned up.Key discovery before re-skinning the Pipeline content: the studio content is not un-themed —
libraries/spikersoft-theme/src/lib/_art-studio.scssis a deliberate theme layer that already maps Eric's exact ArtPipe palette (accent #58a6ff → --color-primary,ok #3fb950 → --color-success, …) but intentionally re-expresses his flat panels as glass washes — "never his raw hex" — and inherits light/dark from the app theme via semantic tokens.So "make the Pipeline match :5050" is a design-language decision, not a mechanical re-skin — and it collides with a documented team convention. Two ways:
.artpipe-shellto Eric's flat GitHub-dark (#0d1117 / #161b22 / #21262d, hard borders, no glass). Because the studio-shell + children all theme off these tokens, the whole ArtPipe content (all 4 views) re-skins via one scoped token block — clean, low-code-risk, reviewable. Matches your "everything should be exactly the same as his." Consistent with my P1 chrome (which already uses his flat hex). Downside: overrides the theme authors' deliberate "glass, never raw hex" decision inside the ArtPipe surface (rest of app untouched).My read: your repeated "honor every aspect / exactly the same as his" points to A, and A is a clean scoped token override I can ship as a reviewable PR (you eyeball it vs :5050). But overriding another dev's documented design convention is your call, not mine — hence flagging rather than shipping. Which do you want?
Dissolved into per-repo issues as part of the umbrella-tracker breakup. This epic held
implementation work that could never auto-close from a merge; it now lives where the code is:
ArtStudioShell,ArtAssetCard, stage timeline/console) to his.card-*/.btn-*primitives.filter-chipAlready shipped, no issue filed — P1 and all of P2a/b/c are live in production.
Verified 2026-08-07 against
spikersoft-angular@8e5a4048:art-studiolanding —libraries/features/art-studio/src/lib/art-pipe-shell/art-pipe-shell.component.ts:46(Pipeline / Library / Metrics / Builder, plus our own fifth view Photo Stack; defaults
to
pipeline; full WAI-ARIA tabs with roving focus), routed atprojects/spikersoft/src/routes.ts:441.art-pipe-shell.component.scss:5-24(--ap-bg:#0d1117,--ap-surface:#161b22,--ap-surface-2:#21262d,--ap-border:#30363d,--ap-text:#e6edf3,--ap-accent:#58a6ff,--ap-ok:#3fb950,--ap-warn:#d29922,--ap-err:#f85149,--ap-purple:#bc8cff,--ap-radius:6px/8px,-apple-system…).board all ship —
526fe105,4226ab6b,44ecc5d1,7218b291.ArtPromptComposerships —f2ee9225(
art-studio-shell.component.html:48-86), plus the doubled-header fix via thechromelessinput (63223ecc).https://learn.spikersoft.com/→main-KZKZUOSX.jsroutesart-studio→
chunk-BERDK-Hs.js, which containsartpipe-shell,artpipe-tab-,artpipe-kpi-active,artpipe-runner-badge,artpipe-nr-,studio-drawer-overlay,photostackand the literal0d1117.Why nothing has moved since: the two open questions from this epic's own comments were
never answered, and both are now real, closeable decision issues rather than being buried
in an epic —
libraries/spikersoft-theme/src/lib/_art-studio.scssis a deliberate theme layer (#384) that maps Eric's exact palette onto our semantic
tokens but re-expresses his flat panels as glass — its header says "never his raw hex".
Making the content literally match
:5050overrides another dev's documented convention.Every remaining re-skin issue depends on this answer.
SpikerSoft.Api/Domain/ArtStudio/ArtStudioController.cshas 33 routes, all per-asset(
submit:204,{id}/cancel:728,{id}/restart/{stage}:762,DELETE {id}:813)or read-side — still no runner-state concept and no pause/resume/stop/restart endpoint.
Option A (adapt the bar to our semantics) shipped; Option B is undecided.
P6 ("polish pass — side-by-side diff vs
:5050") is not filed as its own ticket; eachper-view issue carries the instruction to diff against the reference and close its own
visual deltas, so there is no orphan work item.
The unit is tracked by the shared
[ArtStudio UI]title prefix and by sibling cross-links ineach issue. Closing here — the umbrella tracker is being emptied.
— Opus 5 Agent