Skip to content

fix: studio.deploy Origin vts → verified live URL - #1889

Merged
groupthinking merged 4 commits into
mainfrom
cursor/origin-vts-verified-live-url-eeb9
Sep 12, 2026
Merged

fix: studio.deploy Origin vts → verified live URL#1889
groupthinking merged 4 commits into
mainfrom
cursor/origin-vts-verified-live-url-eeb9

Conversation

@groupthinking

@groupthinking groupthinking commented Sep 12, 2026

Copy link
Copy Markdown
Owner

Canonical issue

Follow-on to #1887. Dogfood residual on dpl_3mKicmxjHttT1JznuaRp1tRx8tWS / XYMcBrFSJ4c: Origin video-to-software returned no verified live URL. Receipt er:gate:v1:wrun_01M2B1Q97XA9GHVSG1FZY92N19. UI confirmed Studio transcript reused. No Deploy completed / no live URL. AXIOM did not open Origin.

Outcome

EventRelay studio.deploy obtains a verified clickable https live URL from the Origin video-to-software handoff (parse + poll + receipt), or an honest HOLD that is not that residual and not prior cleared residuals.

Root cause

#1887 returns origin 202 immediately. After that:

  1. Kickoff/poll missed metadata.result.live_url and deployment.urls.vercel.
  2. Persist only read top-level live_url.
  3. GET /jobs/{id} never flattened data.live_url.
  4. First poll 404 was a terminal fail remapped to the origin-no-live HOLD.
  5. 524/timeout remap reused that same residual string.

Claim guard: never invent a live URL. No Origin invent / wasm LLM / forge/slingshot bounce. No Hayden secrets guessed.

Scope

  • Included: nested extract, persist/GET flatten, poll continue on 404, receipt emission via studioVerifiedLiveUrl, honest hostname HOLD (STUDIO_ORIGIN_NO_HOSTNAME_HOLD)
  • Explicitly excluded: Origin invent, CRM, YouTube cookies, inventing EVENTRELAY_API_KEY / VERCEL_TOKEN / Hayden secrets

How cleared residuals stay cleared

  • Reuse: ready transcript still hits origin vts, not /videos/process; 202 without 12s sync wait
  • Timeout abort: durable sleep('10s') poll; 408 continues
  • HTTP 524: still remapped, now to hostname HOLD — not raw 524, not origin-no-live
  • Bot / UNKNOWN / workflow-run / return-value / BACKEND_URL tests unchanged and passing

Hayden stop (not taken)

Parse/poll/receipt was a verified EventRelay-side gap. Did not invent VERCEL_TOKEN / EVENTRELAY_API_KEY. If post-merge AXIOM job error is missing VERCEL_TOKEN (or equivalent deploy credential only Hayden has), that is the Loop→CoS ask — not guessed here.

Risk

Verification

Head: dfbc24b13da1f02a72cb93db966a1ed78bd4959c

  • Focused Vitest: 5 files / 105 passed
  • Focused pytest: 202 reuse, persist flatten, GET flatten, YouTube skip
  • Required CI (Loop merges when core-green)
  • Review threads resolved

Production evidence

Cannot signed-in dogfood AXIOM here. Preview: branch cursor/origin-vts-verified-live-url-eeb9. Target residual: dpl_3mKicmxjHttT1JznuaRp1tRx8tWS / er:gate:v1:wrun_01M2B1Q97XA9GHVSG1FZY92N19.

Agent handoff

  • Sole writer on this envelope
  • Acceptance criteria covered in tests
  • Required checks pass on the current head
  • Human decision: production AXIOM / G.A.T.E. PASS on uvai.io only
Open in Web Open in Cursor 

#1887 returns origin 202 immediately so WDK can poll, but kickoff/poll
only read top-level live_url and treated first-job 404 as a terminal
origin-no-live HOLD. Extract backend-supplied https hostnames from
metadata.result and deployment.urls, flatten them on persist/GET, and
continue the poll until a verified URL or a specific non-cleared HOLD.
Never invent a live URL. Reuse, timeout abort, and HTTP 524 remaps stay.

Co-authored-by: Hayden <groupthinking@users.noreply.github.com>
@vercel

vercel Bot commented Sep 12, 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 Sep 12, 2026 3:11pm UTC

@github-actions github-actions Bot added documentation Improvements or additions to documentation javascript Pull requests that update javascript code python tests labels Sep 12, 2026
@github-actions

github-actions Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

🔍 PR Validation

⚠️ Large PR detected (677 lines changed)

Co-authored-by: Hayden <groupthinking@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Sep 12, 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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 163c048e-9e15-4af3-bab8-d690c9ed73f0


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: FAILURE DETECTED

Metric Value
Status 🔴 RED
Total Tests 6
Passed 11
Failed 6
Deployment https://v0-uvai-e98398l0j-garv1.vercel.app
Test Output
2m''�[39m�[33m;�[39m
    �[90m190|�[39m       �[34mexpect�[39m(ct)�[33m.�[39m�[34mtoContain�[39m(�[32m'text/event-stream'�[39m)�[33m;�[39m

�[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/6]⎯�[22m�[39m

�[41m�[1m FAIL �[22m�[49m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mSSE Pipeline Stream�[2m > �[22mSSE stream emits at least a pipeline_status:running event
�[31m�[1mAssertionError�[22m: expected 0 to be greater than or equal to 1�[39m
�[36m �[2m❯�[22m tests/e2e/pipeline.test.ts:�[2m208:29�[22m�[39m
    �[90m206|�[39m
    �[90m207|�[39m       �[90m// Must have at least 1 event�[39m
    �[90m208|�[39m       �[34mexpect�[39m(events�[33m.�[39mlength)�[33m.�[39m�[34mtoBeGreaterThanOrEqual�[39m(�[34m1�[39m)�[33m;�[39m
    �[90m   |�[39m                             �[31m^�[39m
    �[90m209|�[39m
    �[90m210|�[39m       �[90m// Must start with pipeline_status:running�[39m

�[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/6]⎯�[22m�[39m

�[41m�[1m FAIL �[22m�[49m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mmissing URL returns 400, not a hang
�[31m�[1mAssertionError�[22m: expected 401 to be 400 // Object.is equality�[39m

�[32m- Expected�[39m
�[31m+ Received�[39m

�[32m- 400�[39m
�[31m+ 401�[39m

�[36m �[2m❯�[22m tests/e2e/pipeline.test.ts:�[2m358:26�[22m�[39m
    �[90m356|�[39m
    �[90m357|�[39m       �[35mconst�[39m elapsed �[33m=�[39m �[33mDate�[39m�[33m.�[39m�[34mnow�[39m() �[33m-�[39m start�[33m;�[39m
    �[90m358|�[39m       �[34mexpect�[39m(res�[33m.�[39mstatus)�[33m.�[39m�[34mtoBe�[39m(�[34m400�[39m)�[33m;�[39m
    �[90m   |�[39m                          �[31m^�[39m
    �[90m359|�[39m       �[34mexpect�[39m(elapsed)�[33m.�[39m�[34mtoBeLessThan�[39m(�[34m5_000�[39m)�[33m;�[39m �[90m// Should respond instantly�[39m
    �[90m360|�[39m     })�[33m;�[39m

�[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/6]⎯�[22m�[39m

�[41m�[1m FAIL �[22m�[49m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mPOST /api/pipeline/stream with no body returns 400
�[31m�[1mAssertionError�[22m: expected [ 400, 500 ] to include 200�[39m
�[36m �[2m❯�[22m tests/e2e/pipeline.test.ts:�[2m441:26�[22m�[39m
    �[90m439|�[39m       )�[33m;�[39m
    �[90m440|�[39m       �[90m// Should handle gracefully — 400 or 500, but respond quickly�[39m
    �[90m441|�[39m       �[34mexpect�[39m([�[34m400�[39m�[33m,�[39m �[34m500�[39m])�[33m.�[39m�[34mtoContain�[39m(res�[33m.�[39mstatus)�[33m;�[39m
    �[90m   |�[39m                          �[31m^�[39m
    �[90m442|�[39m     })�[33m;�[39m
    �[90m443|�[39m   })�[33m;�[39m

�[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/6]⎯�[22m�[39m


�[2m Test Files �[22m �[1m�[31m1 failed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[1m�[31m6 failed�[39m�[22m�[2m | �[22m�[1m�[32m11 passed�[39m�[22m�[90m (17)�[39m
�[2m   Start at �[22m 15:07:54
�[2m   Duration �[22m 3.86s�[2m (transform 67ms, setup 0ms, import 81ms, tests 3.63s, environment 0ms)�[22m


CoS envelope: studio.deploy must PASS a backend https hostname or HOLD
with a reason that is not the origin-no-live residual and not cleared
reuse/timeout/524/bot/UNKNOWN/workflow-run/return-value/BACKEND_URL.
Receipt emission verifies https only. No invented live URL.

Co-authored-by: Hayden <groupthinking@users.noreply.github.com>
@cursor cursor Bot changed the title fix: extract nested origin live URL after ready-transcript 202 fix: studio.deploy Origin vts → verified live URL Sep 12, 2026
Co-authored-by: Hayden <groupthinking@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

🔴 E2E Test Results: FAILURE DETECTED

Metric Value
Status 🔴 RED
Total Tests 6
Passed 11
Failed 6
Deployment https://v0-uvai-kulhtashl-garv1.vercel.app
Test Output
2m''�[39m�[33m;�[39m
    �[90m190|�[39m       �[34mexpect�[39m(ct)�[33m.�[39m�[34mtoContain�[39m(�[32m'text/event-stream'�[39m)�[33m;�[39m

�[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/6]⎯�[22m�[39m

�[41m�[1m FAIL �[22m�[49m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mSSE Pipeline Stream�[2m > �[22mSSE stream emits at least a pipeline_status:running event
�[31m�[1mAssertionError�[22m: expected 0 to be greater than or equal to 1�[39m
�[36m �[2m❯�[22m tests/e2e/pipeline.test.ts:�[2m208:29�[22m�[39m
    �[90m206|�[39m
    �[90m207|�[39m       �[90m// Must have at least 1 event�[39m
    �[90m208|�[39m       �[34mexpect�[39m(events�[33m.�[39mlength)�[33m.�[39m�[34mtoBeGreaterThanOrEqual�[39m(�[34m1�[39m)�[33m;�[39m
    �[90m   |�[39m                             �[31m^�[39m
    �[90m209|�[39m
    �[90m210|�[39m       �[90m// Must start with pipeline_status:running�[39m

�[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/6]⎯�[22m�[39m

�[41m�[1m FAIL �[22m�[49m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mmissing URL returns 400, not a hang
�[31m�[1mAssertionError�[22m: expected 401 to be 400 // Object.is equality�[39m

�[32m- Expected�[39m
�[31m+ Received�[39m

�[32m- 400�[39m
�[31m+ 401�[39m

�[36m �[2m❯�[22m tests/e2e/pipeline.test.ts:�[2m358:26�[22m�[39m
    �[90m356|�[39m
    �[90m357|�[39m       �[35mconst�[39m elapsed �[33m=�[39m �[33mDate�[39m�[33m.�[39m�[34mnow�[39m() �[33m-�[39m start�[33m;�[39m
    �[90m358|�[39m       �[34mexpect�[39m(res�[33m.�[39mstatus)�[33m.�[39m�[34mtoBe�[39m(�[34m400�[39m)�[33m;�[39m
    �[90m   |�[39m                          �[31m^�[39m
    �[90m359|�[39m       �[34mexpect�[39m(elapsed)�[33m.�[39m�[34mtoBeLessThan�[39m(�[34m5_000�[39m)�[33m;�[39m �[90m// Should respond instantly�[39m
    �[90m360|�[39m     })�[33m;�[39m

�[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/6]⎯�[22m�[39m

�[41m�[1m FAIL �[22m�[49m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mPOST /api/pipeline/stream with no body returns 400
�[31m�[1mAssertionError�[22m: expected [ 400, 500 ] to include 200�[39m
�[36m �[2m❯�[22m tests/e2e/pipeline.test.ts:�[2m441:26�[22m�[39m
    �[90m439|�[39m       )�[33m;�[39m
    �[90m440|�[39m       �[90m// Should handle gracefully — 400 or 500, but respond quickly�[39m
    �[90m441|�[39m       �[34mexpect�[39m([�[34m400�[39m�[33m,�[39m �[34m500�[39m])�[33m.�[39m�[34mtoContain�[39m(res�[33m.�[39mstatus)�[33m;�[39m
    �[90m   |�[39m                          �[31m^�[39m
    �[90m442|�[39m     })�[33m;�[39m
    �[90m443|�[39m   })�[33m;�[39m

�[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/6]⎯�[22m�[39m


�[2m Test Files �[22m �[1m�[31m1 failed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[1m�[31m6 failed�[39m�[22m�[2m | �[22m�[1m�[32m11 passed�[39m�[22m�[90m (17)�[39m
�[2m   Start at �[22m 15:11:47
�[2m   Duration �[22m 5.66s�[2m (transform 56ms, setup 0ms, import 70ms, tests 5.47s, environment 0ms)�[22m


@github-actions

Copy link
Copy Markdown
Contributor

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Snapshot Warnings

⚠️: No snapshots were found for the head SHA dfbc24b.
Ensure that dependencies are being submitted on PR branches. Re-running this action after a short time may resolve the issue. See the documentation for more information and troubleshooting advice.

Scanned Files

None

@groupthinking
groupthinking merged commit ab752a7 into main Sep 12, 2026
40 of 42 checks passed
@groupthinking
groupthinking deleted the cursor/origin-vts-verified-live-url-eeb9 branch September 12, 2026 16:00
@linear-code

linear-code Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

GRV-538

kk-agent pushed a commit that referenced this pull request Sep 12, 2026
* fix: do not remap vts kickoff abort to hostname HOLD

#1889 remapped AbortSignal timeout / HTTP 524 to "Origin deploy
finished without a backend-supplied https hostname." Prod logs for
wrun_01M2B5SRA5W5S4WQP2M4ZHY040 show kickoff never returned a job id.
Keep hostname HOLD only for a terminal job, retry kickoff, and pass
through backend-supplied bare vercel.app hosts.

Co-authored-by: Hayden <groupthinking@users.noreply.github.com>

* docs: record kickoff-HOLD verification on #1891

Focused Vitest 107 and pytest 7 passed after the hostname HOLD remap
was replaced with a kickoff-no-job residual.

Co-authored-by: Hayden <groupthinking@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Hayden <groupthinking@users.noreply.github.com>
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 python tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants