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.
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.
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.
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.
Clicking a card showed name, type, status, a viewer and a stage timeline — and nothing about how the asset was made.
asset.promptwas rendered in exactly one place repo-wide, the moderation screen.Gotcha: the dialog renders in the CDK overlay, outside the routed component's injector, and
artStudio.*lives in the lazily route-provideddevToolsscope — it must be opened with the shell's injector or every label renders as a raw key path. Pinned by a spec.Resolved in spikersoft-angular (
fd85fed1). Verified againstorigin/master— all six functional bullets present inlibraries/features/art-studio:art-studio-shell.component.html:141-148.art-generation-details-dialog.component.ts.art-generation-details.component.html:146/:223/:241, plus the legacy-asset message at:67-74(i18nemptyLegacyatdevTools/en.json:3549, genuinely translated ines.json:4174rather than left under_review).wouldDiscardDownstream—art-studio-shell.component.ts:914-917.art-prompt-composer.component.ts:209,.html:462-494.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 atart-generation-details-dialog.component.spec.ts:63-73usesTestBed.createComponentwith the scope provided locally — it never callsMatDialog.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 atart-studio.models.ts:565) is never read.Closing on the functional scope.