Skip to content

fix(web): rewire Studio playflow B–G into the IDE - #2436

Open
kk-agent wants to merge 2 commits into
mainfrom
cursor/studio-playflow-ide-rewire-b008
Open

kk-agent wants to merge 2 commits into
mainfrom
cursor/studio-playflow-ide-rewire-b008

Conversation

@kk-agent

@kk-agent kk-agent commented Oct 17, 2026 •

Copy link
Copy Markdown
Collaborator

Canonical issue

Fixes #2440.

Hayden / AXIOM dogfood URL: https://uvai.io/studio?video=https://www.youtube.com/watch?v=pBsT6v-ciO8

Related leftover after #2437 merged: honest empty Events + pack workbench also land here.

Outcome

Rebased onto main after #2437 (Ship this). Then pointed the required closer at the still-open leftover issue.

After Run on a pack like pBsT6v-ciO8 (transcript + architecture + artifacts + stack.tools, no events field):

  • B Status line keeps stage + ETA. Retry transcript appears on fail or a stuck ~90s poll.
  • C Player overlay still covers load; error shows Retry player + Open on YouTube (no silent 0:00).
  • D Ship this still toasts success/fail with filename (feat(web): restore Studio Ship this playflow #2437).
  • E Intent cards for review_action say Review this result / Needs review and show Act on this run. The same CTA is in the toolbar and is not gated by agent-workflow-ui.
  • F Tools tab labels SeaDance / Cluely Unknown — UVAI cannot run this check. Build live / Ship this are not held by those checks. Deploy/preflight stays deleted (no G.A.T.E.).
  • G Pricing Core no longer says “Durable workflow run history” / “Review-only action preparation”. It says workflow run history and proposed work from a Video Pack.
  • Events tab is labeled Events, never INSIGHTs, and uses honest empty copy plus the pack workbench.

Scope

  • Included:
  • Explicitly excluded:
    • Origin G.A.T.E. / Check preflight restore
    • Fake events from keyframes/concepts
    • ClipToAction

Risk

  • Risk level: low
  • Failure mode: Empty-events copy or stack-check labels look wrong; Act re-runs the same URL and may send anonymous users to login when the API returns 401/403.
  • Rollback: revert this PR.

Verification

Head SHA: c7a09a175762cfd6981c65c812b22e24c38b7519

  • Focused tests: cd apps/web && npx vitest run src/lib/__tests__/studio-pipeline-status.test.ts src/lib/__tests__/official-templates.test.ts src/lib/__tests__/uvai-surface-unification.test.ts src/lib/__tests__/home-sell-surface.test.ts src/components/__tests__/OneLoopStudio.three-panel.test.tsx src/components/studio/__tests__/StudioIdeOutput.playflow.test.tsx → 6 files, 62 passed
  • Required CI
  • Review threads resolved

Production evidence

Live GET https://uvai.io/api/video/pack?url=https://www.youtube.com/watch?v=pBsT6v-ciO8 returned 200: transcript present; architecture present; artifacts 2; stack.tools = SeaDance 2.5, Claude Fable 5, Character.ai, Cluely Desktop; no events field. UI Events tab must match that (empty Events, not INSIGHTs).

UI-only. Preview on Vercel v0-uvai after CI. Do not treat the live GET as a production Studio E2E.

Agent handoff

  • One canonical issue is linked (Fixes #2440)
  • No competing open PR implements this leftover
  • Acceptance criteria are satisfied in source + focused tests
  • Required checks pass on the current head
  • Human decision is requested only for product, security, irreversible infrastructure, or production approval

QA on pBsT6v-ciO8

  1. Open /studio?video=https://www.youtube.com/watch?v=pBsT6v-ciO8.
  2. While working: status shows named stage + ~45s ETA. On fail/stuck: Retry transcript.
  3. Events tab: Events (not INSIGHTs) + “This pack has no extracted events…” + From this pack architecture/artifacts.
  4. Tools tab: SeaDance / Cluely Unknown — UVAI cannot run this check. Ship this / Build live still enabled.
  5. Toolbar shows Act on this run even when agent-workflow-ui is off.
  6. /pricing Core lists workflow run history and proposed work from a Video Pack.
Open in Web Open in Cursor 

@vercel

vercel Bot commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
v0-uvai Ready Ready Preview, v0 Oct 17, 2026 4:49pm UTC

@github-actions github-actions Bot added documentation Improvements or additions to documentation javascript Pull requests that update javascript code tests labels Oct 17, 2026
@coderabbitai

coderabbitai Bot commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: Repository: groupthinking/EventRelay/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: bcb2e093-ce41-4328-b588-dd6dc7e39f81
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

✅ E2E Test Results: ALL TESTS PASSED

Metric Value
Status 🟢 GREEN
Total Tests
Passed 16
Failed
Deployment https://v0-uvai-cnsm6zn3e-garv1.vercel.app
Test Output
s on every request without persisting it�[32m 1�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mhomepage returns 200 with HTML�[32m 118�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mfeatures page contains template/workflow markup�[32m 176�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mfeatures page surfaces at least 5 workflow/template indicators�[32m 119�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mPOST /api/video/pack accepts a YouTube URL without hanging�[33m 1951�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mGET /api/video/pack resolves to a ready pack with evidence lineage�[33m 640�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mmissing URL returns 400, not a hang�[32m 67�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22minvalid URL returns 400 quickly, not a hang�[32m 53�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mPOST /api/video/pack with no body returns 400�[32m 54�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard returns 200�[32m 189�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard contains agent or pipeline visualization markup�[32m 110�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mGET /api returns a response (not 404)�[32m 261�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mretired /api/pipeline routes are gone (no pipeline served)�[32m 32�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22mhomepage has proper meta tags�[32m 72�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22m/features page returns 200�[32m 85�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m1 passed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[1m�[32m16 passed�[39m�[22m�[90m (16)�[39m
�[2m   Start at �[22m 16:38:03
�[2m   Duration �[22m 5.53s�[2m (transform 55ms, setup 0ms, import 70ms, tests 5.33s, environment 0ms)�[22m


Surface retry, honest empty Events, skip/unknown stack checks, and
review_action cards after the IDE restyle. Keep Events labeling.

Co-authored-by: KK <kk-agent@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ E2E Test Results: ALL TESTS PASSED

Metric Value
Status 🟢 GREEN
Total Tests
Passed 16
Failed
Deployment https://v0-uvai-m58c06fok-garv1.vercel.app
Test Output
 every request without persisting it�[32m 1�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mhomepage returns 200 with HTML�[32m 162�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mfeatures page contains template/workflow markup�[32m 207�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mfeatures page surfaces at least 5 workflow/template indicators�[32m 181�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mPOST /api/video/pack accepts a YouTube URL without hanging�[33m 2060�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mGET /api/video/pack resolves to a ready pack with evidence lineage�[33m 726�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mmissing URL returns 400, not a hang�[32m 112�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22minvalid URL returns 400 quickly, not a hang�[32m 106�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mPOST /api/video/pack with no body returns 400�[32m 99�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard returns 200�[32m 219�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard contains agent or pipeline visualization markup�[32m 201�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mGET /api returns a response (not 404)�[32m 261�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mretired /api/pipeline routes are gone (no pipeline served)�[32m 63�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22mhomepage has proper meta tags�[32m 140�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22m/features page returns 200�[32m 146�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m1 passed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[1m�[32m16 passed�[39m�[22m�[90m (16)�[39m
�[2m   Start at �[22m 16:46:59
�[2m   Duration �[22m 6.32s�[2m (transform 33ms, setup 0ms, import 42ms, tests 6.20s, environment 0ms)�[22m


Keep honest empty Events after the #2437 rebase, and finish leftover
#2440 so the required closer can target an open issue.

Co-authored-by: KK <kk-agent@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ E2E Test Results: ALL TESTS PASSED

Metric Value
Status 🟢 GREEN
Total Tests
Passed 16
Failed
Deployment https://v0-uvai-9onwae4yw-garv1.vercel.app
Test Output
very request without persisting it�[32m 1�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mhomepage returns 200 with HTML�[33m 313�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mfeatures page contains template/workflow markup�[32m 246�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mTemplate Gallery�[2m > �[22mfeatures page surfaces at least 5 workflow/template indicators�[32m 233�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mPOST /api/video/pack accepts a YouTube URL without hanging�[33m 2132�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mVideo Pack Pipeline�[2m > �[22mGET /api/video/pack resolves to a ready pack with evidence lineage�[33m 856�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mmissing URL returns 400, not a hang�[32m 207�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22minvalid URL returns 400 quickly, not a hang�[32m 204�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mPOST /api/video/pack with no body returns 400�[32m 192�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard returns 200�[32m 262�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard contains agent or pipeline visualization markup�[32m 231�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mGET /api returns a response (not 404)�[33m 387�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mretired /api/pipeline routes are gone (no pipeline served)�[32m 111�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22mhomepage has proper meta tags�[32m 216�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22m/features page returns 200�[32m 227�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m1 passed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[1m�[32m16 passed�[39m�[22m�[90m (16)�[39m
�[2m   Start at �[22m 16:49:26
�[2m   Duration �[22m 7.51s�[2m (transform 32ms, setup 0ms, import 40ms, tests 7.39s, environment 0ms)�[22m


@kk-agent
kk-agent marked this pull request as ready for review October 17, 2026 20:32
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-17T20:40:21.940966Z c7a09a1 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c7a09a1757

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +1057 to +1061
<button
type="button"
data-testid="studio-act-button"
onClick={() => void act()}
disabled={actBusy || !canAct}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep Act behind the workflow feature flag

When agent-workflow-ui is false (the default in src/flags.ts), this button still renders and invokes startVideoToActions; the new Intent CTA and returned tool results likewise ignore showAgentWorkflowUi. This exposes the durable agent workflow to cohorts for which it is explicitly disabled, so gate the triggers and results with the existing flag.

AGENTS.md reference: AGENTS.md:L64-L68

Useful? React with 👍 / 👎.

const canAttemptBuildLive = Boolean(
getYouTubeId(url || selected?.url || '') && (selected || url.trim()),
);
const canAct = Boolean(getYouTubeId(url || selected?.url || ''));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Bind Act to the URL that the button validates

When a stored pack is selected and the user types a different valid URL without first clicking Run, canAct validates the typed URL via url || selected?.url, but act() processes selected?.url || url. The enabled CTA therefore starts the workflow for the old selected video while the input and player show the new one; resolve the source once or disable Act until the typed URL is associated with the selection.

Useful? React with 👍 / 👎.

Comment on lines +1182 to +1184
onAct={() => void act()}
actBusy={actBusy}
canAct={canAct}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Scope Act results to the selected pack

After Act completes for one video, selecting another stored pack does not clear or associate the component-level workflowActions state, so the second pack's Intent tab displays the first video's review cards and exporting the second pack can include those stale actions. Clear Act state on selectedVideoId changes or store the originating selection ID and render/export results only when it matches.

Useful? React with 👍 / 👎.

Comment on lines +1059 to +1060
data-testid="studio-act-button"
onClick={() => void act()}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Reuse the completed workflow instead of starting it again

In the normal flow, Run already calls startVideoToActions through processVideo and waits for it to complete, but this new CTA calls act(), which posts to the same workflow again. videoToActionsWorkflow unconditionally repeats transcript acquisition and Gemini analysis before using the supplied transcript, so every Act click—and every click from a review card—duplicates the costly analysis and may produce a different second result; persist and expose the first run's actions or use a preview endpoint that skips acquisition and analysis.

Useful? React with 👍 / 👎.

Comment on lines +1187 to +1190
<PackWorkbench
architecture={packFormation.architecture}
artifacts={packFormation.artifacts}
onExport={() => void exportPkg()}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Pass stack tools into the promoted pack workbench

For a pack with no events and only stack.tools, studioPromotePackWorkbench returns true and the empty-state message says the stack is shown below, but this JSX passes only architecture and artifacts to PackWorkbench, which renders neither the tools nor any other pack detail in that case. The Events tab therefore shows an effectively empty card despite claiming the stack is present; pass the tools through or direct the message to the Tools tab.

AGENTS.md reference: AGENTS.md:L34-L39

Useful? React with 👍 / 👎.

Comment on lines +268 to +273
{card.kind === 'review' && onAct ? (
<button
type="button"
data-testid="studio-review-act-button"
onClick={onAct}
disabled={actBusy || !canAct}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Match the review CTA to the actions the workflow produces

Real Act previews return registered tool names such as create_workflow_task with status pending because videoToActionsWorkflow calls runActionAgent with executeTools: false; no production producer emits a tool named review_action. Since this button is restricted to card.kind === 'review', normal proposed actions render as ordinary cards labelled pending with no review CTA, making the newly wired confirmation path unreachable. Render the CTA based on the preview status or return explicit review metadata from the workflow.

Useful? React with 👍 / 👎.

This branch was successfully deployed

1 active deployment
Preview — c7a09a17 Deployed Oct 17, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation javascript Pull requests that update javascript code tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Soften Studio pricing copy and surface Act CTA on review cards

2 participants