diff --git a/apps/web/src/components/OneLoopStudio.tsx b/apps/web/src/components/OneLoopStudio.tsx index f8e92fe98..cde52fb41 100644 --- a/apps/web/src/components/OneLoopStudio.tsx +++ b/apps/web/src/components/OneLoopStudio.tsx @@ -862,6 +862,7 @@ export default function OneLoopStudio() { busy: busy || selected?.status === 'processing', hasCompletedRun: selected != null && selected.status !== 'processing' && !busy, eventCount: 0, + hasTranscript: Boolean(selected?.transcript?.trim()), hasArchitecture: Boolean(packFormation.architecture), artifactCount: packFormation.artifacts.length, toolCount: packFormation.tools.length, diff --git a/apps/web/src/lib/__tests__/studio-pipeline-status.test.ts b/apps/web/src/lib/__tests__/studio-pipeline-status.test.ts index 0afe3e3de..3cc2934c4 100644 --- a/apps/web/src/lib/__tests__/studio-pipeline-status.test.ts +++ b/apps/web/src/lib/__tests__/studio-pipeline-status.test.ts @@ -200,6 +200,22 @@ describe('studio-pipeline-status', () => { ); }); + it('does not claim a transcript exists when a completed run only has pack identity', () => { + const emptyNoTranscript = studioEventsEmptyMessage({ + busy: false, + hasCompletedRun: true, + eventCount: 0, + hasArchitecture: false, + artifactCount: 0, + toolCount: 0, + hasTranscript: false, + }); + + expect(emptyNoTranscript.toLowerCase()).toMatch(/no extracted events/); + expect(emptyNoTranscript.toLowerCase()).not.toContain('transcript'); + expect(emptyNoTranscript.toLowerCase()).toContain('pack identity'); + }); + it('enables export from pack formation when events[] is empty', () => { expect( studioCanExport({ diff --git a/apps/web/src/lib/studio-pipeline-status.ts b/apps/web/src/lib/studio-pipeline-status.ts index 87db998c0..4a00769b7 100644 --- a/apps/web/src/lib/studio-pipeline-status.ts +++ b/apps/web/src/lib/studio-pipeline-status.ts @@ -90,6 +90,7 @@ export function studioEventsEmptyMessage(input: { busy: boolean; hasCompletedRun: boolean; eventCount: number; + hasTranscript?: boolean; hasArchitecture: boolean; artifactCount: number; toolCount: number; @@ -102,7 +103,10 @@ export function studioEventsEmptyMessage(input: { if (packReady) { return 'This pack has no extracted events. Architecture, artifacts, and stack from the video are below — export them from this page.'; } - return 'This run has no extracted events. Transcript and pack identity stay on this page.'; + if (input.hasTranscript) { + return 'This run has no extracted events. Transcript and pack identity stay on this page.'; + } + return 'This run has no extracted events. Pack identity stays on this page.'; } export function studioPromotePackWorkbench(input: {