Skip to content

Fix browser-local Project V2 cloud miss - #19

Merged
svg8bit merged 1 commit into
mainfrom
codex/drops-studio-production-404-hotfix
Jul 31, 2026
Merged

Fix browser-local Project V2 cloud miss#19
svg8bit merged 1 commit into
mainfrom
codex/drops-studio-production-404-hotfix

Conversation

@svg8bit

@svg8bit svg8bit commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Summary

  • return an expected empty receipt for browser-local Project V2 projects instead of a noisy 404
  • keep the sync client compatible with both legacy 404 and the new empty receipt
  • accept the user-approved current Storybook visual baselines for canonical CI and local system Chromium

Validation

  • npm run lint
  • npm run typecheck
  • npm audit --omit=dev --audit-level=high
  • node --test tests/vercel-sandbox-runtime-cleanup.test.mjs
  • VISUAL_BASELINE_APPROVED=1 npm run test:storybook:visual -- --update-snapshots (42 passed)

Summary by CodeRabbit

  • Bug Fixes

    • Project data requests now return a clear “not found” response instead of a browser error when no cloud snapshot exists.
    • Existing project snapshots continue to load normally.
    • Improved handling of projects that have not yet been saved to the cloud.
  • Tests

    • Added coverage to verify the updated response for missing project data.

@vercel

vercel Bot commented Jul 31, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
drops-studio Building Building Preview Jul 31, 2026 2:57pm

Request Review

@svg8bit
svg8bit merged commit 8aa4b8f into main Jul 31, 2026
1 of 4 checks passed
@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 627ef1f1-1420-4dfe-89d1-f49878699fac

📥 Commits

Reviewing files that changed from the base of the PR and between e534add and ded65ea.

⛔ Files ignored due to path filters (84)
  • storybook-e2e/visual.spec.ts-snapshots/action-engine-desktop-chromium-1024-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/action-engine-desktop-chromium-1024-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/action-engine-desktop-chromium-1440-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/action-engine-desktop-chromium-1440-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/action-engine-desktop-chromium-390-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/action-engine-desktop-chromium-390-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/alpha-channel-disconnected-chromium-1024-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/alpha-channel-disconnected-chromium-1024-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/alpha-channel-disconnected-chromium-1440-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/alpha-channel-disconnected-chromium-1440-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/alpha-channel-disconnected-chromium-390-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/alpha-channel-disconnected-chromium-390-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-aggregator-connected-chromium-1024-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-aggregator-connected-chromium-1024-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-aggregator-connected-chromium-1440-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-aggregator-connected-chromium-1440-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-aggregator-connected-chromium-390-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-aggregator-connected-chromium-390-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-game-desktop-chromium-1024-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-game-desktop-chromium-1024-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-game-desktop-chromium-1440-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-game-desktop-chromium-1440-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-game-desktop-chromium-390-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-game-desktop-chromium-390-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-product-hunt-empty-chromium-1024-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-product-hunt-empty-chromium-1024-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-product-hunt-empty-chromium-1440-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-product-hunt-empty-chromium-1440-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-product-hunt-empty-chromium-390-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-product-hunt-empty-chromium-390-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-radio-playing-chromium-1024-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-radio-playing-chromium-1024-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-radio-playing-chromium-1440-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-radio-playing-chromium-1440-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-radio-playing-chromium-390-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-radio-playing-chromium-390-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-siri-mobile-chromium-1024-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-siri-mobile-chromium-1024-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-siri-mobile-chromium-1440-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-siri-mobile-chromium-1440-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-siri-mobile-chromium-390-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/crypto-siri-mobile-chromium-390-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/loading-product-plan-chromium-1024-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/loading-product-plan-chromium-1024-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/loading-product-plan-chromium-1440-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/loading-product-plan-chromium-1440-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/loading-product-plan-chromium-390-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/loading-product-plan-chromium-390-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/morning-alpha-data-error-chromium-1024-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/morning-alpha-data-error-chromium-1024-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/morning-alpha-data-error-chromium-1440-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/morning-alpha-data-error-chromium-1440-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/morning-alpha-data-error-chromium-390-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/morning-alpha-data-error-chromium-390-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/morning-alpha-populated-chromium-1024-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/morning-alpha-populated-chromium-1024-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/morning-alpha-populated-chromium-1440-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/morning-alpha-populated-chromium-1440-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/morning-alpha-populated-chromium-390-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/morning-alpha-populated-chromium-390-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/personal-companion-mobile-chromium-1024-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/personal-companion-mobile-chromium-1024-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/personal-companion-mobile-chromium-1440-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/personal-companion-mobile-chromium-1440-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/personal-companion-mobile-chromium-390-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/personal-companion-mobile-chromium-390-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/portfolio-tamagotchi-empty-chromium-1024-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/portfolio-tamagotchi-empty-chromium-1024-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/portfolio-tamagotchi-empty-chromium-1440-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/portfolio-tamagotchi-empty-chromium-1440-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/portfolio-tamagotchi-empty-chromium-390-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/portfolio-tamagotchi-empty-chromium-390-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/prediction-impact-desktop-chromium-1024-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/prediction-impact-desktop-chromium-1024-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/prediction-impact-desktop-chromium-1440-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/prediction-impact-desktop-chromium-1440-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/prediction-impact-desktop-chromium-390-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/prediction-impact-desktop-chromium-390-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/smart-money-copy-empty-chromium-1024-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/smart-money-copy-empty-chromium-1024-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/smart-money-copy-empty-chromium-1440-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/smart-money-copy-empty-chromium-1440-linux.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/smart-money-copy-empty-chromium-390-linux-system.png is excluded by !**/*.png
  • storybook-e2e/visual.spec.ts-snapshots/smart-money-copy-empty-chromium-390-linux.png is excluded by !**/*.png
📒 Files selected for processing (3)
  • app/api/projects/v2/route.ts
  • lib/project-v2-sync-client.ts
  • tests/vercel-sandbox-runtime-cleanup.test.mjs

📝 Walkthrough

Walkthrough

The Project V2 API now returns a successful empty response when no cloud snapshot exists. The sync client maps this response to null. A test verifies the HTTP 200 response and { found: false } payload.

Changes

Project V2 missing snapshot handling

Layer / File(s) Summary
Missing snapshot response and client handling
app/api/projects/v2/route.ts, lib/project-v2-sync-client.ts, tests/vercel-sandbox-runtime-cleanup.test.mjs
The GET route returns HTTP 200 with { found: false } when no snapshot exists. The cloud client returns null for this response. The test verifies the empty response.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

  • svg8bit/drops-studio#13: This PR also changes app/api/projects/v2/route.ts, but it modifies same-origin validation instead of missing-snapshot responses.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/drops-studio-production-404-hotfix

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant