Skip to content

ci: cut a PR push from ~15 min of CI to ~2.5 - #8101

Merged
saddlepaddle merged 36 commits into
mainfrom
saddlepaddle/ci-speedups
Oct 4, 2026
Merged

saddlepaddle merged 36 commits into
mainfrom
saddlepaddle/ci-speedups

Conversation

@saddlepaddle

@saddlepaddle saddlepaddle commented Oct 3, 2026 •

Copy link
Copy Markdown
Collaborator

Why

A PR push took about 15 minutes of CI (median of 40 runs): Build 14.4 min, Test 8.6 min, Typecheck 6.4 min, and preview deploys about 7 min. It now takes about 2.5 minutes, with the required checks done in about 1.5.

Timings on the last run

Check Before Now
Test (required) 8.6 min 1m18s
Typecheck (required) 6.4 min 1m29s
Lint (required) ~1m15s 1m02s
Desktop Build 14.4 min removed
Build CLI 4 targets linux-x64 on PRs, 1m39s
Preview deploys (whole run) ~7 min 2m35s
Sandbox Boot twice ~4 min 1m04s warm

What changes

CI

  • The desktop Build job is gone. In about 2,000 runs it failed alone twice, both out-of-memory exits. "Build" was removed from the main ruleset.
  • Test runs on a Blacksmith 8 vCPU runner, four turbo tasks at a time, with the terminal node-tests as a turbo task in the same step. Typecheck runs on Blacksmith 4 vCPU.
  • The CLI build runs on every PR (linux-x64 only); pushes to main build all four targets.
  • Sandbox Boot twice uses Blacksmith's persistent Docker layer cache.

Toolchain

  • Bun 1.4.2 with a regenerated lockfile, TypeScript 7.0.2 everywhere. Three desktop files that use the compiler API import @typescript/typescript6.
  • Every package's tests run with bun test --isolate.
  • Overrides pin happy-dom 20.11.2 and mdast-util-to-markdown 2.1.2; the metro patch covers the three resolved versions.

Tests

  • Deleted tests that slept on real timeouts (25 s, 35 s and 20 s cases), the generated adversarial and bug-hunt-2 suites, and git-watcher-lazy-registration.integration.test.ts, which died with exit 137 in 30 of 32 flaky runs for a reason we did not find.
  • trpc tests set env through a helper instead of mock.module; CLI tests drive the real notify function.
  • AGENTS.md has a Tests section with the rules this came from.

Deploys

  • Preview apps start after a small create-database job and no longer wait for migrations.
  • Preview and production Vercel deploys run on Blacksmith with the bun cache. Production writes the Next build cache; previews only read it.
  • Previews run on every PR, including desktop-only ones.
  • Vercel's "On-Demand Concurrent Builds" was switched to run all builds immediately.

Marketing

  • cacheComponents is on. Pages are prerendered for the default locale and the session buttons stream in; other locales and unlisted slugs render on first visit and are cached.
  • leaderboard, stats, starchart, fight, the-production-run and profile pages stay per request.
  • public/ video, GIFs and unused folders are excluded from the server functions.

Behaviour changes to know about

  • Unknown top-level marketing URLs return 200 with the not-found page and a noindex tag, where they returned 404. They are treated as profile handles, and the page shell is sent before the lookup. Unknown blog, changelog, compare, legal, team and theme URLs still return 404.
  • Previews go live before migrations finish. A failing migration shows as failed in the PR comment while the app links work against an unmigrated branch.
  • Production deploys depend on Blacksmith runners.
  • Fork PRs get failing deploy jobs on every push, because forks have no Vercel or Neon secrets.
  • Static marketing pages share a cached value for up to a minute, so a failed feature-flag or star-count read is served to everyone until the next refresh.
  • removeDirectoryTree also recovers on ENOTEMPTY; LocalGitCredentialProvider ignores EPIPE on git's stdin.

Verified

  • CI, previews and Sandbox green on the head commit; Test passed six runs in a row at four tasks (1m11s to 1m18s).
  • Marketing on the Vercel preview: prerendered pages, first-visit caching for other locales and slugs, 404s, OG images.
  • Desktop prebuild (electron-vite compile, native modules, runtime validation) passes locally on macOS arm64.
  • An independent review of the diff; its two findings (build cache size, cached API failures) are fixed.

Not verified

  • Desktop packaging and signing on the new toolchain. Needs a canary after merge.
  • macOS CLI builds with --ignore-scripts; they first run on push to main.
  • How well a production-built Next cache warms a preview build; nothing writes it until this merges.
  • The logged-in "Dashboard" button on marketing, and the now-static text routes (llms.txt, robots.txt, schemamap.xml, .well-known) against production.
  • A cold expo export with the metro patches.

After merge

  • Add the five deploy checks to the main ruleset.
  • Cost: about $290 to $390 a month on Blacksmith at last month's volume, plus roughly $95 on Vercel build minutes.

Summary by CodeRabbit

  • Improvements
    • Updated the marketing site’s page rendering and caching behavior, including dynamic data pages and profile listings.
    • Improved workspace cleanup reliability when directories cannot be removed on the first attempt.
    • Updated the minimum supported Bun version to 1.4.2.
  • Developer Experience
    • Updated development tooling and libraries, and improved test isolation and CI workflows.
    • Added guidance for writing reliable tests.

@coderabbitai

coderabbitai Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: d8e66a4c-a577-4eda-85cd-53abe129b2da
📥 Commits

Reviewing files that changed from the base of the PR and between 8d44e50 and 72a5db4.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
📒 Files selected for processing (122)
  • .bun-version
  • .github/workflows/build-cli.yml
  • .github/workflows/ci.yml
  • .github/workflows/deploy-preview.yml
  • .github/workflows/deploy-production.yml
  • .github/workflows/sandbox.yml
  • AGENTS.md
  • DEVELOPMENT.md
  • README.md
  • apps/admin/package.json
  • apps/api/package.json
  • apps/desktop/package.json
  • apps/desktop/scripts/validate-native-runtime.ts
  • apps/desktop/src/renderer/components/RendererLayout/renderer-safety.test.ts
  • apps/desktop/src/renderer/lib/persisted-keys/persisted-keys.test.ts
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/hooks/useHostReachability/useHostReachability.test.ts
  • apps/desktop/test-setup.ts
  • apps/discord-triage/Dockerfile
  • apps/discord-triage/package.json
  • apps/docs/package.json
  • apps/gate/package.json
  • apps/marketing/next.config.ts
  • apps/marketing/package.json
  • apps/marketing/src/app/[lang]/(legal)/[slug]/page.tsx
  • apps/marketing/src/app/[lang]/blog/[slug]/page.tsx
  • apps/marketing/src/app/[lang]/changelog/[slug]/page.tsx
  • apps/marketing/src/app/[lang]/compare/[slug]/page.tsx
  • apps/marketing/src/app/[lang]/components/CTAButtons/CTAButtons.tsx
  • apps/marketing/src/app/[lang]/components/Footer/Footer.tsx
  • apps/marketing/src/app/[lang]/fight/page.tsx
  • apps/marketing/src/app/[lang]/layout.tsx
  • apps/marketing/src/app/[lang]/leaderboard/page.tsx
  • apps/marketing/src/app/[lang]/marketplace/themes/[slug]/page.tsx
  • apps/marketing/src/app/[lang]/starchart/page.tsx
  • apps/marketing/src/app/[lang]/stats/page.tsx
  • apps/marketing/src/app/[lang]/team/[id]/page.tsx
  • apps/marketing/src/app/[lang]/the-production-run/page.tsx
  • apps/marketing/src/app/[lang]/user/[handle]/page.tsx
  • apps/marketing/src/app/[lang]/user/[handle]/utils/loadProfile/loadProfile.ts
  • apps/marketing/src/app/[lang]/utils/fetchLeaderboard/fetchLeaderboard.ts
  • apps/marketing/src/app/[lang]/utils/leaderboardClient/leaderboardClient.ts
  • apps/marketing/src/app/sitemap.ts
  • apps/marketing/src/lib/changelog.ts
  • apps/marketing/src/lib/compare.ts
  • apps/marketing/src/lib/content-utils.ts
  • apps/marketing/src/lib/marketplace.ts
  • apps/mobile/components/ui/context-menu.tsx
  • apps/mobile/components/ui/dropdown-menu.tsx
  • apps/mobile/metro-worklets-patch.test.ts
  • apps/mobile/package.json
  • apps/realtime/package.json
  • apps/relay/package.json
  • apps/usercontent/package.json
  • apps/web/package.json
  • package.json
  • packages/agent-setup/package.json
  • packages/auth/package.json
  • packages/chat-runtime/package.json
  • packages/chat-ui/package.json
  • packages/chat/package.json
  • packages/cli-framework/package.json
  • packages/cli-framework/src/index.ts
  • packages/cli/package.json
  • packages/cli/src/commands/scripts/add/command.test.ts
  • packages/cli/src/commands/scripts/manage.test.ts
  • packages/cli/src/lib/api-client.test.ts
  • packages/cloud-client/package.json
  • packages/db/package.json
  • packages/email/package.json
  • packages/host-client/package.json
  • packages/host-service/package.json
  • packages/host-service/src/providers/git/LocalGitCredentialProvider/LocalGitCredentialProvider.ts
  • packages/host-service/src/trpc/router/git/utils/git-status-partial/git-status-partial.adversarial.test.ts
  • packages/host-service/src/trpc/router/git/utils/git-status-partial/git-status-partial.adversarial2.test.ts
  • packages/host-service/src/trpc/router/git/utils/git-status-store/git-status-store.adversarial3.test.ts
  • packages/host-service/src/trpc/router/workspace-cleanup/remove-directory-tree.ts
  • packages/host-service/src/trpc/router/workspace-creation/utils/ai-workspace-names-process.test.ts
  • packages/host-service/src/tunnel/tunnel-client.integration.test.ts
  • packages/host-service/test/integration/bug-hunt-2.integration.test.ts
  • packages/host-service/test/integration/git-watcher-lazy-registration.integration.test.ts
  • packages/i18n/lingui.config.ts
  • packages/i18n/package.json
  • packages/local-db/package.json
  • packages/mcp/package.json
  • packages/panes/package.json
  • packages/port-scanner/package.json
  • packages/pty-daemon/package.json
  • packages/sandbox/package.json
  • packages/sdk/package.json
  • packages/shared/package.json
  • packages/trpc/package.json
  • packages/trpc/src/lib/account-purge/purgeAccount.test.ts
  • packages/trpc/src/lib/document-files/document-files.test.ts
  • packages/trpc/src/router/plugins/plugins.test.ts
  • packages/trpc/src/router/plugins/proxy/resolve-target.test.ts
  • packages/trpc/test/env.ts
  • packages/trpc/test/setup-env.ts
  • packages/ui/package.json
  • packages/workspace-client/package.json
  • packages/workspace-client/src/lib/eventBus.test.ts
  • packages/workspace-fs/package.json
  • patches/README.md
  • patches/metro@0.84.5.patch
  • patches/metro@0.84.6.patch
  • patches/metro@0.87.1.patch
  • readme/README.cs.md
  • readme/README.de.md
  • readme/README.es.md
  • readme/README.fr.md
  • readme/README.id.md
  • readme/README.it.md
  • readme/README.ja.md
  • readme/README.ko.md
  • readme/README.nl.md
  • readme/README.pl.md
  • readme/README.pt-BR.md
  • readme/README.ru.md
  • readme/README.tr.md
  • readme/README.vi.md
  • readme/README.zh-CN.md
  • readme/README.zh-TW.md
  • turbo.jsonc
 ___________________________________________
< Crossing the tensor streams to find bugs. >
 -------------------------------------------
  \
   \   (\__/)
       (•ㅅ•)
       /   づ
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · 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.

@expo

expo Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

No installed development build can load this pull request as an update: its native fingerprint is a6cd3c68ab46 and no development build has it. Add the mobile-build label to build one.

- Drop the desktop Build job. In ~2,000 runs it never failed on its own
  except two out-of-memory exits; it spent ~10 min packaging installers.
- Delete the slowest tests (real-socket and CLI timeouts, the generated
  adversarial/bug-hunt suites) and run host-service tests with --parallel.
- TypeScript 7 for typecheck. The three desktop files that use the
  compiler API import @typescript/typescript6.
- Bun 1.4.2, with a regenerated lockfile. Fixes it needed: zod pins to
  4.6.5, metro patched at every resolved version (Expo pins its own),
  removeDirectoryTree also recovers on ENOTEMPTY, and tests restore the
  native AbortController/AbortSignal.
- CLI: PRs build linux-x64 only, and only when a CLI dependency changed;
  macOS installs skip lifecycle scripts and share the bun cache.
- Marketing: remove generateStaticParams. Every route is dynamic (the nav
  reads the session), so the build tried and failed to prerender 3,171
  pages; the route table is unchanged.
- Vercel deploys: no second bun install before `vercel build`, and no
  Sentry sourcemap upload on previews.
- ci.yml takes a runner input; ci-blacksmith.yml runs the same jobs on
  Blacksmith runners (not required) so we can compare speed and cost.
Lingui finds sources with node:fs globSync and passes `exclude` through.
A bare `**/*.test.*` never matches the absolute paths that globSync
returns for absolute include patterns. Bun 1.3 matched it anyway; Bun
1.4.2 and Node do not, so extraction picked up a <Trans id="greeting" />
from a marketing test and check:i18n failed for every locale. Anchoring
the patterns at the repo root works on all three runtimes.

Also moves the Lingui packages to 6.8.0 so @lingui/conf has one version
(swc-plugin stays at 6.6.0: it is built against Next's SWC).

ci-blacksmith.yml grants pull-requests: read, which the nested
cli-changes job in ci.yml asks for.
@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

🧹 Preview Cleanup Complete

The following preview resources have been cleaned up:

  • ✅ Neon database branch

Thank you for your contribution! 🎉

Test files shared one module registry, so a mock.module in one file
replaced that module for every file after it. Which tests that broke
depended on file order, and Blacksmith's runners order files differently
from GitHub's: the CLI's notify tests, trpc's user tests and the API's
Linear webhook tests each failed there for this reason. --isolate gives
each file a fresh global object and module registry. The whole suite
goes from 92 s to 101 s locally.
With each test file isolated, the three trpc files that import
@superset/db/client without mocking it construct the real client, which
throws without DATABASE_URL. They passed locally because the repo's
gitignored .env supplies one; CI has none.
…estore

Trying both on previews to measure them. Each deploy job spent 23-31 s
restoring a 1.2 GB cache for the whole monorepo and 11-12 s on a global
npm install of the CLI before its build started.
Boot twice spent ~3 of its 4 minutes rebuilding the image from nothing;
the apt layer alone is 101 s and never depends on our code. A local build
now reads and writes a layer cache in GitHub's container registry when
SANDBOX_IMAGE_CACHE_REF is set. PRs from forks cannot write packages, so
they build without it.
Turbopack writes a sourcemap for every server chunk: 472 files and about
100 MB of marketing's 149 MB server output. Sentry is their only reader.
Preview builds have no Sentry token, so the maps were built, uploaded to
Vercel with the deployment and never used. Production keeps them.
The blog and changelog OG image routes read from public/ by a path built
at request time, so Next's tracer copied the whole folder, about 47 MB,
into the server functions on top of serving it as static files. Those
routes only read team avatars, changelog covers, the logo and the font.
Excluding video, GIFs and the folders they never touch takes the copy
from 49.5 MB to 12.2 MB.
Every marketing route rendered per request because the layout's
CTAButtons reads the session through headers(). With cacheComponents
on and a Suspense boundary around the buttons, pages are prerendered
and only the buttons stream in at request time.

- blog, changelog, compare, legal, themes and team prerender one
  sample per locale; other slugs are generated on first visit and
  cached. Unknown slugs still return 404.
- leaderboard, stats, starchart, fight, the-production-run and
  user/[handle] stay per request. Their `revalidate` exports never
  took effect and cacheComponents rejects them, so they are gone;
  profile and fighter lookups are cached for five minutes instead.
- The sitemap caches its handle list, so it is static again when the
  API is reachable at build and per request when it is not. The build
  never depends on the API.
- CTAButtons reads headers() outside its try block, which swallowed
  the signal Next uses to stop a prerender.

An unknown top-level URL is treated as a profile handle. It now
returns 200 with the not-found page and a noindex tag instead of 404,
because the shell is sent before the profile lookup runs.
Prerendering every page in all 17 locales took the Marketing preview
job from about 2 minutes to 4m35s: 740 pages on 3 workers (64 s) and a
305 MB upload. Only the default locale is prerendered now, 100 pages;
other locales are generated on first visit and cached, the same way
unlisted blog slugs already are.

A locale that is not prerendered goes through Next's static render on
first visit, where the profile page's `new Date()` is rejected, so the
page now declares itself request-time with connection().
Test is the slowest required check at about 2m25s on 4 vCPU. The turbo
test step is 79 s of that and its longest task, host-service, already
runs with --parallel, so it scales with cores.
They need Node's test runner and real PTYs, so they cannot join the bun
test process, but nothing made them wait for it. They are now a turbo
task in the same invocation as the bun suites instead of a 40 s step
after them.
The ghcr registry cache saved about 30 s of a 4 minute job: every layer
was a hit, but pulling them back and loading the 1.7 GB image took 96 s.
Blacksmith's builder keeps the layers on a disk attached to the runner,
so there is no cache to pull or push. This replaces the registry cache
and its code in image.ts.
The root test script caps turbo at two tasks, which suited 2-core
runners. On 8 vCPU the terminal node-tests took one of the two slots
for 40 s.
setup-docker-builder v2 requires cache-key; without it the action fell
back to an uncached local builder.
The CLI build was gated on a hand-kept list of the paths it depends on,
and previews skipped desktop-only PRs. Both run in under three minutes
now, so they run always: a stale path list or a skipped deploy can let
a broken build merge.
The rules come from what this branch had to remove or fix: tests that
slept on real timeouts, adversarial suites, mock.module leaks that only
failed in another file order, and a flaky suite nobody could explain.
- loadProfile cached a rate-limited answer for five minutes, so one
  refused read showed "unavailable" to everyone on that instance. It
  now caches that answer for seconds and a real profile for five
  minutes.
- fetchPublicHandles returned [] on any error and the sitemap cached
  it. It now throws, the cached read fails uncached, and the sitemap
  falls back to no profile URLs for that request only.
- Two comments still described ISR pages that are request-time now.
Each preview push saved five caches keyed by its merge SHA, about
3.9 GB, visible only to that PR. One PR took the repo past its 10 GB
Actions cache limit, and a new PR always built cold. Production
deploys on main now write the cache and previews only restore it, so
every PR starts from main's latest build and saves nothing.

Docs has no production deploy in this workflow, so its cache step is
gone.
Experiment: a cold web deploy spends 29 s in bun install and 66 s in
the Next compile on GitHub's 4-core runner.
Deploy Web went from 2m46s to 1m41s with a cold Next cache: bun install
inside vercel build 29 s -> 3 s with the dependency cache restored, and
the compile 66 s -> 34 s on the faster cores. The other four deploys
get the same runner and cache.
Previews moved to Blacksmith runners, whose actions/cache is a separate
store from GitHub's. Production has to write the Next build cache to
the same store for previews to read it, and it gets the same faster
install and compile.
@greptile-apps

greptile-apps Bot commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 4/5

[High risk] Upgrades build tooling and CI infrastructure.

The PR should not merge until preview apps are prevented from publishing against an unverified database schema.

Findings

  1. P1 Previews bypass migration verification ▶
  2. P2 Preview source maps lose authentication ▶
  3. P2 Long handshake coverage removed ▶
Fix with agent prompt
### Issue 1
.github/workflows/deploy-preview.yml:97
When a PR adds a migration, the preview API can be published as soon as the Neon branch is created, before the migration runs or its result is verified. If the migration fails, the preview links remain live against the old schema, and database-backed requests can fail. Marking the database as failed in the PR comment does not stop those deployments.

### Issue 2
.github/workflows/deploy-preview.yml:167
The preview build no longer receives `SENTRY_AUTH_TOKEN`, but the Next.js Sentry configuration reads that variable to authenticate source-map uploads. Preview errors will lose source-mapped stack traces, making failures harder to diagnose. The token is also removed from the other preview app builds.

### Issue 3
packages/host-service/src/tunnel/tunnel-client.integration.test.ts:107
Removing the long-handshake and stalled-upgrade socket tests leaves only a 4.5-second delayed socket case. That case cannot catch a regression that cancels a valid 25-second handshake too early or forwards a request after an upgrade stalls. Short tests with configurable time budgets would retain coverage without waiting for real timeouts.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Summary

The PR shortens CI by changing runners, task scheduling, CLI targets, and preview deployment ordering; it also updates the toolchain and enables component caching on marketing pages.

  • Preview deployments can become available before their database schema is verified.
  • Preview builds lose Sentry source-map upload credentials, and long-handshake socket regression coverage is removed.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  PR[PR push] --> Create[Create Neon branch]
  Create --> Migrate[Apply and verify migrations]
  Create --> Apps[Build and publish preview apps]
  Migrate --> Comment[Deployment status comment]
  Apps --> Comment
Loading

Reviews (1) · Last reviewed commit: "ci: run the production Vercel deploys on..."

runs-on: blacksmith-4vcpu-ubuntu-2404
environment: preview
needs: deploy-database
needs: create-database

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Previews bypass migration verification When a PR adds a migration, the preview API can be published as soon as the Neon branch is created, before the migration runs or its result is verified. If the migration fails, the preview links remain live against the old schema, and database-backed requests can fail. Marking the database as failed in the PR comment does not stop those deployments.

Knowledge Base Used: Make Production Migration Failures Visible

Prompt To Fix With AI
This is a comment left during a code review.
Path: .github/workflows/deploy-preview.yml
Line: 97

Comment:
**Previews bypass migration verification** When a PR adds a migration, the preview API can be published as soon as the Neon branch is created, before the migration runs or its result is verified. If the migration fails, the preview links remain live against the old schema, and database-backed requests can fail. Marking the database as failed in the PR comment does not stop those deployments.

**Knowledge Base Used:** [Make Production Migration Failures Visible](https://app.greptile.com/personal-org-6810/-/custom-context/knowledge-base/superset-sh/superset/-/reverts/incident-mitigation_7672-20260919-migration-reported-success-1bcf64a.md)

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

@@ -149,7 +165,6 @@ jobs:
GH_CLIENT_ID: ${{ secrets.GH_CLIENT_ID }}
GH_CLIENT_SECRET: ${{ secrets.GH_CLIENT_SECRET }}
NEXT_PUBLIC_SENTRY_DSN_API: ${{ secrets.NEXT_PUBLIC_SENTRY_DSN_API }}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Preview source maps lose authentication The preview build no longer receives SENTRY_AUTH_TOKEN, but the Next.js Sentry configuration reads that variable to authenticate source-map uploads. Preview errors will lose source-mapped stack traces, making failures harder to diagnose. The token is also removed from the other preview app builds.

Prompt To Fix With AI
This is a comment left during a code review.
Path: .github/workflows/deploy-preview.yml
Line: 167

Comment:
**Preview source maps lose authentication** The preview build no longer receives `SENTRY_AUTH_TOKEN`, but the Next.js Sentry configuration reads that variable to authenticate source-map uploads. Preview errors will lose source-mapped stack traces, making failures harder to diagnose. The token is also removed from the other preview app builds.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

expect(result.elapsedMs).toBeGreaterThanOrEqual(25_000);
}, 45_000);

test("real sockets recover from a rejected upgrade and a slow retry", async () => {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Long handshake coverage removed Removing the long-handshake and stalled-upgrade socket tests leaves only a 4.5-second delayed socket case. That case cannot catch a regression that cancels a valid 25-second handshake too early or forwards a request after an upgrade stalls. Short tests with configurable time budgets would retain coverage without waiting for real timeouts.

Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/host-service/src/tunnel/tunnel-client.integration.test.ts
Line: 107

Comment:
**Long handshake coverage removed** Removing the long-handshake and stalled-upgrade socket tests leaves only a 4.5-second delayed socket case. That case cannot catch a regression that cancels a valid 25-second handshake too early or forwards a request after an upgrade stalls. Short tests with configurable time budgets would retain coverage without waiting for real timeouts.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

This branch was previously deployed

1 inactive deployment
preview — 72a5db48 Deployed Oct 4, 2026 by saddlepaddle via Deploy API #10992
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