Art Studio UI: show what made an asset, and let a user remake it (#842) #848

Closed
opened 2026-07-25 20:22:24 +00:00 by spikerj · 1 comment
Owner

Clicking a card showed name, type, status, a viewer and a stage timeline — and nothing about how the asset was made. asset.prompt was rendered in exactly one place repo-wide, the moderation screen.

  • Recipe strip, INLINE in the detail card: source, prompt, preset, one chip per stage reading stage · model · seed. Clicking a card should show you this, not hand you another button.
  • Full per-run breakdown in a dialog, because a seven-stage asset with retries is ten-plus blocks and would bury the viewer.
  • Three tiers so every asset says something true: recorded params → the full list; no params but resolved provenance → which method/model won; neither → 'made before the studio started saving its settings'. Never an empty panel, never a disabled button with no reason.
  • Reproduce / Vary, with the confirm dialog appearing ONLY when re-running would actually discard downstream work.
  • Composer: text+image mode, and an advanced panel whose controls come from the selected method's declared capabilities (discrete steps for distilled models, no negative prompt for CFG-distilled ones). Hidden entirely until the server describes capabilities, so it could merge before the backend honoured it.
  • Use these settings loads a recorded recipe into the composer to edit.

Gotcha: the dialog renders in the CDK overlay, outside the routed component's injector, and artStudio.* lives in the lazily route-provided devTools scope — it must be opened with the shell's injector or every label renders as a raw key path. Pinned by a spec.

Clicking a card showed name, type, status, a viewer and a stage timeline — and nothing about how the asset was made. `asset.prompt` was rendered in exactly one place repo-wide, the moderation screen. - **Recipe strip, INLINE** in the detail card: source, prompt, preset, one chip per stage reading stage · model · seed. Clicking a card should show you this, not hand you another button. - **Full per-run breakdown in a dialog**, because a seven-stage asset with retries is ten-plus blocks and would bury the viewer. - **Three tiers** so every asset says something true: recorded params → the full list; no params but resolved provenance → which method/model won; neither → 'made before the studio started saving its settings'. Never an empty panel, never a disabled button with no reason. - **Reproduce / Vary**, with the confirm dialog appearing ONLY when re-running would actually discard downstream work. - **Composer**: text+image mode, and an advanced panel whose controls come from the selected method's declared capabilities (discrete steps for distilled models, no negative prompt for CFG-distilled ones). Hidden entirely until the server describes capabilities, so it could merge before the backend honoured it. - **Use these settings** loads a recorded recipe into the composer to edit. Gotcha: the dialog renders in the CDK overlay, outside the routed component's injector, and `artStudio.*` lives in the lazily route-provided `devTools` scope — it must be opened with the shell's injector or every label renders as a raw key path. Pinned by a spec.
Author
Owner

Resolved in spikersoft-angular (fd85fed1). Verified against origin/master — all six functional bullets present in libraries/features/art-studio:

  • Inline recipe strip — art-studio-shell.component.html:141-148.
  • Separate details dialog — art-generation-details-dialog.component.ts.
  • Three genuine tiers rather than one collapsed view — art-generation-details.component.html:146 / :223 / :241, plus the legacy-asset message at :67-74 (i18n emptyLegacy at devTools/en.json:3549, genuinely translated in es.json:4174 rather than left under _review).
  • Reproduce / vary, with the confirm gated on wouldDiscardDownstreamart-studio-shell.component.ts:914-917.
  • Capability-driven advanced panel that stays hidden until the server describes capabilities — art-prompt-composer.component.ts:209, .html:462-494.
  • "Use these settings" — art-studio-shell.component.ts:888-891.

One stated guard is not actually met. The ticket says the CDK-overlay injector gotcha is "pinned by a spec". Production code passes it correctly (art-studio-shell.component.ts:846, injector: this.injector), but the claimed spec at art-generation-details-dialog.component.spec.ts:63-73 uses TestBed.createComponent with the scope provided locally — it never calls MatDialog.open, never creates an overlay, and asserts only a negative string match. Deleting line 846 would fail nothing. Given this is the route-provided-Transloco-scope trap that has bitten this repo before, that's worth a real spec; filing it as follow-up work rather than holding this ticket, since the production behaviour is correct.

Design divergence, not a gap: the confirm gate recomputes discard-impact client-side, so the server's invalidatedStages (declared at art-studio.models.ts:565) is never read.

Closing on the functional scope.

Resolved in spikersoft-angular (`fd85fed1`). Verified against `origin/master` — all six functional bullets present in `libraries/features/art-studio`: - Inline recipe strip — `art-studio-shell.component.html:141-148`. - Separate details dialog — `art-generation-details-dialog.component.ts`. - Three genuine tiers rather than one collapsed view — `art-generation-details.component.html:146` / `:223` / `:241`, plus the legacy-asset message at `:67-74` (i18n `emptyLegacy` at `devTools/en.json:3549`, genuinely translated in `es.json:4174` rather than left under `_review`). - Reproduce / vary, with the confirm gated on `wouldDiscardDownstream` — `art-studio-shell.component.ts:914-917`. - Capability-driven advanced panel that stays hidden until the server describes capabilities — `art-prompt-composer.component.ts:209`, `.html:462-494`. - "Use these settings" — `art-studio-shell.component.ts:888-891`. **One stated guard is not actually met.** The ticket says the CDK-overlay injector gotcha is "pinned by a spec". Production code passes it correctly (`art-studio-shell.component.ts:846`, `injector: this.injector`), but the claimed spec at `art-generation-details-dialog.component.spec.ts:63-73` uses `TestBed.createComponent` with the scope provided locally — it never calls `MatDialog.open`, never creates an overlay, and asserts only a negative string match. **Deleting line 846 would fail nothing.** Given this is the route-provided-Transloco-scope trap that has bitten this repo before, that's worth a real spec; filing it as follow-up work rather than holding this ticket, since the production behaviour is correct. Design divergence, not a gap: the confirm gate recomputes discard-impact client-side, so the server's `invalidatedStages` (declared at `art-studio.models.ts:565`) is never read. Closing on the functional scope.
Sign in to join this conversation.