Skip to content

chore: remove dead code, slop, over tests and comment noise before open source - #400

Merged
Brooooooklyn merged 127 commits into
mainfrom
chore/oss-cleanup
Oct 12, 2026
Merged

Brooooooklyn merged 127 commits into
mainfrom
chore/oss-cleanup

Conversation

@Brooooooklyn

@Brooooooklyn Brooooooklyn commented Oct 11, 2026 •

Copy link
Copy Markdown
Member

Problem

Before open source, a review of the SDK, framework and CLI packages (packages/*) found 737 cleanup issues of four kinds:

over tests      322   tests of repo tooling, tests for tests, duplicate tests
slop            241   needless defensive code, copies of helpers, pass-through wrappers, test-only seams
over comments   113   bug-fix history, essays, stale line references, comments that repeat the code
dead code        61   unused exports, branches, params, files

This PR removes them. It does not fix bugs or change behavior. The real bugs from the same review go in separate PRs.

What this PR changes

packages/*   620 files   +22.9k  −63.1k  (net −40k lines)
             ├─ tests    +15.3k  −43.7k
             └─ source    +7.6k  −19.5k

737 issues ──► 555 fixed
               117 partly fixed (the safe part only)
                56 skipped (public API, behavior change, or needs a new public export)
                 9 left for an owner decision

Larger items:

provision.ts      4,975 → 3,224 lines. A 440-line Proxy-safe redaction for a path that production
                  never used is now a small helper.
client.ts         2,479 → 1,918 lines. About 55 endpoints share one private request helper.
installer phases  11 get/set accessor pairs → one run-state object
config readers    duplicate Wrangler config readers and record guards → shared internal ones
tooling tests     10 SDK test files that tested repo scripts or test config → removed.
                  vp run check now typechecks root test/ and .github/scripts instead.

Decisions

Topic Decision
Behavior No reachable change. Return values, thrown errors and messages, CLI output, exit codes, files written and network calls stay the same.
Path patterns @void/edge matches header, revalidate and routing patterns with a small parser instead of a RegExp built from the pattern. Results stay the same for every pattern the old code could run. Patterns too large for V8 now match instead of failing, and catastrophic backtracking is gone.
User-visible text Kept as it is on main, even where the wording is out of date (for example void.json, "Wrangler"). Wording changes need their own PRs.
Public API Every published export and documented feature stays. The generated Pages client entry still exports router.
Deleted tests Each one either tested tooling or config, or another test still asserts the same behavior. Unique assertions moved into the kept test.
Shared helpers Only internal modules. No new public exports, and no packages/* import from platform/.

Rollout

main ── #399 (Cloudflare e2e fixes) ── this PR (cleanup)

Stacked on #399, because both PRs touch the same installer and deploy files. Merge #399 first.

Known limits

  • In one middle commit the typecheck fails until a later commit (test(cli): pass explicit access ...). This matters only for bisect, because the PR is squash-merged.
  • Independent review rounds found 35 places where the cleanup changed behavior or lost unique coverage. All 35 are restored here.
  • The removed tooling tests leave three scripts without tests: .github/scripts/production-baseline.ts, .github/scripts/schema-compat-tests.ts (CI only) and packages/platform/scripts/source-revision.mjs (build time, display only).

Testing

Check Result
vp run build:all + node test/check-playground-build-artifacts.mjs pass
vp run check (31 typecheck tasks) pass
vp lint, vp fmt --check . pass (2,477 files formatted)
vp test run (full suite) 685 files, 12,942 tests pass (1 file, 30 tests skipped)
vp run test --base <previous head> (latest restores) 13 files, 497 tests pass
Restored tests Each one fails when its code is broken on purpose

🤖 Generated with Claude Code

https://claude.ai/code/session_0123r5HnanmW2VUrZ7VWDufH

@Brooooooklyn
Brooooooklyn requested a review from a team as a code owner October 11, 2026 10:22
@Brooooooklyn
Brooooooklyn added this pull request to stack #401 October 11, 2026 10:22
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Oct 11, 2026 •

Copy link
Copy Markdown

🚀 Deploying Preview to Cloudflare 🚀

Preview URL: https://chore-oss-cleanup-void-cloud.voidzero-docs.workers.dev (commit 411a962)

This URL reflects your latest Preview deployment

Preview Deployments by commit

Status Deployment URL Commit Updated (UTC) See this deployment's details
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://16e713da-void-cloud.voidzero-docs.workers.dev 411a962 2026-10-12T08:40:34.492Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://6699e59a-void-cloud.voidzero-docs.workers.dev 772ed30 2026-10-12T06:23:36.905Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://9e533398-void-cloud.voidzero-docs.workers.dev d0af9ff 2026-10-12T04:22:21.830Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://b2f59691-void-cloud.voidzero-docs.workers.dev 0f1298d 2026-10-11T15:39:29.860Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://52b6b2d0-void-cloud.voidzero-docs.workers.dev 7064d81 2026-10-11T12:43:19.935Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://c7fc1b8c-void-cloud.voidzero-docs.workers.dev aee2c00 2026-10-11T11:56:11.608Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://e88aa5e2-void-cloud.voidzero-docs.workers.dev 26f93c1 2026-10-11T10:23:00.138Z Visit the dashboard ↗

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 11, 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-12T08:50:26.392863Z 411a962 New commits
ℹ️ 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: 7064d8160f

ℹ️ 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 thread packages/edge/src/pattern.ts Outdated
@Brooooooklyn
Brooooooklyn removed this pull request from stack #401 October 12, 2026 08:38
Base automatically changed from codex/platform-e2e-0261 to main October 12, 2026 08:38
Brooooooklyn and others added 20 commits October 12, 2026 16:38
- Route plain PlatformClient endpoints through one request, error and JSON helper
- Drop runLogin, saveToken, ensureCloudflaredToken, the password prompt wrapper and unused type aliases
- Remove unreachable trailing-slash, login-provider default and migration warning branches
- Accept only the options object in the PlatformClient constructor and default openBrowser's launcher
- Trim restating comments in the client, auth and GitHub OIDC modules

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Remove error, echo and retry cases already pinned by the permission table or sibling tests
- Share GitHub CLI fixtures and the browser-callback driver in test/helpers
- Use vi.stubEnv instead of hand-written env save/restore
- Trim history and restating comments, and review labels in test names

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- runPlatformLogin takes the origin directly and never reads the platform registry
- remove the temp registry, saved connections and VOID_API_URL holder

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- move dist/worker dir resolution to a leaf module so the plugin no longer imports deploy.ts
- keep only CLI-used re-exports in deploy.ts; tests import defining modules
- drop unused manifest options (vars, webSockets, duplicate workerMain), the unreachable framework live throw, metadataFetch, log.success and the needed Set
- pass streamDirectR2Deploy an options object and use getContentType directly
- require the provision module in scrubWranglerAuthCredentials; drift check uses buildEnv
- cut stale or repeated comments in deploy, package, transport and yarn-pnp

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- delete asset-hashing.test.ts; keep the BLAKE3 pin and v2 entry check in package.test.ts
- package and assemble-manifest tests: drop repeats of collectRevalidate, SPA fallback and pages cases; share one makeBindings
- deploy-auth: fold repeated OIDC, Cloudflare-target and Access-pair cases into one test each; drop duplicate PATH cases and long comments
- drop duplicate cases in deploy-project-setup, deploy-events, deploy-static-only and deploy-platform
- cut history comments in the git-metadata test

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- inline computeAssetHashes into collectAndHashAssets, its only caller
- make computeMd5 private to package.ts

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Cut long comments and measurement notes in the email runtime to short reasons
- Share one timeout race and bounded JSON reader for send, receipt and inbound
- Share env readers, base64 helpers, id maker and control-character scan
- Drop duplicate address-length checks, unreachable recipient checks and dead try/catch
- Remove the dev inbox plugin's unreachable in-process sink; reuse afterServerReady
- Point the BINDING_MISSING hint and the from JSDoc at void.config.ts

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Fold the scattered address-rule samples into one table per form and field
- Drop tests that repeat proxy, mime or own-account cases the area already pins
- Share one proxy send helper, route-table compiler and isolate reply runner
- Cut fix-history, review-label and measurement notes to short reasons
- Remove the 60 MB header child test that never reached the projection

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Name which deploy target uses email.from versus the platform noreply sender
- Restore the limit of the dev inbox capture cap for strings with no MIME footprint

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- scanRoutes now requires the resolved inventory; drop the async scan fallbacks
- routingPlugin requires getApplicationAnalysis; drop the output option and unreachable branches
- emit migration routes and trigger auth through one shared helper each
- merge the worker entry, queue and fetch client templates into one each
- keep one asset extension list, drop unused runtime seams and generated consts
- rename error renderer locals and cut long or wrong comments

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- drop compile tests that only match generated queue and trigger auth text
- merge c.redirect, c.rewrite and asset rewrite cases into it.each tables
- share an empty scan, compile helper and fake dev server across tests
- remove duplicate asset config, route type, export and filename tests
- cut bug-history and stale comments from routing tests

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- gen: build model columns and validator types from one table per dialect
- gen: drop an unreachable empty-journal guard and trim runMigration comments
- github: parse connect, update, status and disconnect flags with one helper
- github: drop step banners, shorten JSDoc, reuse PlatformApiError.code
- headers: shorten routing JSDoc and name void.config.ts instead of void.json

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- gen: drop cases that other tests already assert, share one journal fixture and exit helper, and trim history comments
- domain: check rollup diagnostics in the computeRollup table instead of separate render tests
- github and gen args: fold repeated parser cases into it.each tables
- headers: drop redirect cases covered by the merge-routing-rules tests and a lint case that cannot warn
- logs: share one stdout stub across the rendering tests

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Restore the args.branch short-circuit so connect --branch skips the git remote/rev-parse children
- Assert the empty-entries journal error keeps the void db generate hint

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- share provision-intent, ownership-marker and R2 fingerprint checks between plan and management
- pass one context to addNamedPlan and drop the dead proxy hostname branch
- remove VOID_PLATFORM_TIMINGS phase output and unreachable uninstall/status checks
- drop the runtime purge-client probe and file-local exports
- share the config auth/plans flag parser and the plan diff preview

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- add manifest, marker and zone helpers to the platform plan tests
- add an upgrade command helper to the platform upgrade tests
- merge the overlapping default uninstall and R2 purge tests
- drop discovery, args, plan and upgrade tests that other tests already cover

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Refuse --subdomain in the parser; delete resolveEmailDomainTarget and the renewal retarget
- Share one lost-answer reconcile helper between domain add and rotate-secret
- Reuse probeMx, emailConfigInputs and resolveProjectBySlug instead of local copies
- Write the email apply patch directly and keep addressesWithheld local
- Cut design-review essays and dead design-doc citations in the email CLI modules

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Fold the session-blocker cases into one table that pins the exact message and no extra reads
- Drop CLI email tests whose assertions the preflight and apply tests already make
- Reuse the ready-account fixtures instead of inline copies
- Trim the --backend, --subdomain and --project matrices to one shared code path each
- Remove parser assertions from help tests and bug-fix history comments

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Give non-add uses of --subdomain the short 'applies to domain add only' message again; only domain add gets the zone apex refusal
- Make the MX check comment say that a foreign MX stops domain add
- Drop the unused null from existingSendEmail and existingVars

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- drop the never-passed disposeOverride from the auth runtime API
- check the auth dialect and migration schema once in createVoidAuthRuntime
- share mysql/pg migration runner adapters between the worker and local runners
- drop unused createVoidAuth, option and type re-exports from dialect entries
- drop unused persistRoot/databaseId defaults and the unread image endpoint

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Brooooooklyn and others added 26 commits October 12, 2026 16:39
- share the @cloudflare/vite-plugin mock and getHookHandler across unit tests
- fold the default auth client into the client runtime table
- move the applied-migrations sort test next to the other runner cases
- drop sequential race tests, a repeated slug retry test and stale mocks
- stop reading .void/md.d.ts; @void/md/pages resolves to the package types
- point the terminal demos README at the current deploy modules

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- a project upgraded from an older release can still have .void/md.d.ts
- keep listing it in .void/tsconfig.json so the generated file stays the same
- restore the md.d.ts tests that cover that branch

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- include root test/*.ts and .github/scripts/*.ts in the void typecheck so vp run check covers them
- fix schema compat runner concurrency at 2 and drop its unused range check
- read process.env directly in the schema fixture script
- run scripts with no exports directly instead of behind a main-module guard

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- The only caller always passes a non-empty environment name.
- Drop the unreachable fallback and make the option required.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Import provision helpers statically; deploy already loads that module
- Share the config-override env and dotenv checks with operations
- Drop the unused argv root, queue-name union helper and runner env option
- Fix stale gate and bearer comments; fold duplicate plaintext-var tests
- Pass typed operations in runner tests instead of parsed argv

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Remove the sentence saying callers of the dotenv key scan avoid loading the provisioner
- The deploy transport fence now imports the provisioner directly, so the note was false

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- one clean-exit check, atomic writer, error message and relative time helper
- one drizzle-kit bin path, placeholder URL map and output rollback
- one own-version reader; db reuses the mysql query adapter
- use node:timers/promises where no test drives the sleep with fake timers

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- restore per-worker stage timings (VOID_PLATFORM_TIMINGS=1) in worker upload
- restore lifecycle phase timings in platform management commands
- restore the Wrangler wording of installer error messages
- cover dispatch serving the new domain and old alias after activation

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- keep the inbound forward/reply over-length address message without a colon
- keep the BINDING_MISSING send error naming void.json
- parse --subdomain as before (missing value, repeat) and refuse it in domain add after login and project lookup
- restore the dev send_email strip test with email.from unset
- restore the operator email domain verb routing test

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- wrangler sync replaces a missing or unparseable config again instead of throwing
- void.config.ts rewrite validates the existing generated file again
- rename-migrations re-reads the journal before rewriting and rolls back if it is gone
- migration handler error keeps the base build hint
- init workspace membership uses the base glob matcher again
- gen migration test checks the new snapshot comes from drizzle-kit

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- the custom migration test now fails if old snapshot tables leak into the new one

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- auth: cross-origin WebSocket upgrade through the middleware gets no user
- ai: parallel uses PARALLEL_API_KEY as x-api-key with no Authorization
- exports: pin types/import/require targets of the four client subpaths
- log: bring back the NO_COLOR and warning/error color subprocess checks
- vue, svelte: island imports from a page and its layout share one manifest

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The generated virtual:void-pages-client module in every adapter exported
the router, and any importer can resolve that module. Put the export back
as it was:

- React: keep the router returned by startReactPages and export it.
- Solid, Vue: export reactiveRouter as router.
- Svelte: rebuild reactiveRouter from createRouterFacade with the tracked
  route URL and params it reads, and export it as router.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The management token page now requires an explicit access option.
Pass access: false like the other default-plan cases and read the
runtime permissions through the shared helper.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The cleanup removed or narrowed these tests as duplicates. Each one
guarded a behavior that no remaining test checks:

- cf-build-output: `.woff2` files in a Worker bundle become `data`
  modules. The `.bin` case uses the same table but cannot catch a
  missing font entry, which is the bug the test was added for.
- email-inbound: parseEmail rejects an oversized message before it
  reads the stream. The test stream never closes, so a read before the
  size check makes the test time out.
- action-result: the public action() returns page validation errors
  as a 422 action result.
- env-prod-validation: a remote secret counts as present for a
  non-string schema (number) without running its validator.

Each test fails when its source behavior is broken on purpose.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Problem: every path matcher built a RegExp from user pattern text. V8
cannot run a pattern of about 32K units or more ("Regular expression
too large"). Routing rules ran exec() outside the try, so a 40,000-unit
redirect source threw on every request that reached it (HTTP 500).
Header and ISR patterns of that size never matched, and the app Worker
skipped them with a warning. The regexes also backtrack: '/' + 20 '*' +
'x' against a 15-unit path took 9.1 s, '/:p0*/.../:p9*/x' against 83
units took 10.7 s, and '/:a*:a*:a*:a*x' (it passes the one-splat config
check) against a 3K path ran past 60 s.

Fix: parse each pattern once into tokens (literal text, one segment, a
run that stops at line terminators, the same run with at least one
unit), cached per matcher as before. Matching fills a table over (step,
position) from right to left. Captures then walk left to right and give
each wildcard the longest span that still lets the rest match, which is
the span JS backtracking returns. A call costs at most steps x (path
length - pattern minimum + 1), with no recursion. The cases above now
take 0.002 to 0.02 ms; the worst shape at a 16 KB path (5,000 adjacent
names) takes about 0.3 s. Common rules cost a few tenths of a
microsecond more per call.

compilePattern keeps its signature and cache identity, and still throws
a SyntaxError for a repeated name or a name that starts with a digit.
Its regex field is now a deprecated getter that builds the old RegExp
on first read. Void no longer reads it: routing rules, the app Worker
middleware and the build-time Cache-Control stamp call compilePattern
only to reject malformed patterns, then matchPattern or
matchPatternCaptures.

Behavior: same booleans, captures, key order, paramNames and throws as
before for every pattern the old code could run. The one intended
change: a pattern too large for V8 is now evaluated like any other
instead of throwing or never matching. Two small fixes come with the
parser: U+E000/U+E001 typed in a revalidate pattern are plain text
(they were wildcards), and a match without names returns a
null-prototype object like a match with names, so ':constructor' in a
destination stays as written. Malformed-pattern errors have shorter
text.

Test: pattern tests use the matchers instead of .regex. New cases cover
line terminators, greedy captures, digit-led names, null-prototype
results, the deprecated regex view, a 40,000-unit pattern, slow
backtracking shapes and private-use characters, plus an oversized
routing source that no longer fails the request. Fuzz against the old
module: 500K random pattern/path pairs per matcher and 1.5M capture
checks through forced block rebuilds, 0 mismatches.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
buildVoidManifest must keep the key order of the revalidate map it is
given. Platform routing picks the first matching pattern, so a reorder
(for example sorting the keys) would change which TTL a path gets.
toEqual ignores key order, so compare Object.entries instead.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0123r5HnanmW2VUrZ7VWDufH
A void dev worker must reject a wrong x-void-dev-trigger value on
/__void/scheduled and /__void/queue, not only a missing one.

The queue resolver must pick the longest "-name" suffix whatever the
queue list order. The generated dispatch test now lists order-emails
before emails, so together with the wrapper test both orders are covered.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0123r5HnanmW2VUrZ7VWDufH
Recovery of an attempt that is still running without a fence must leave
its status at 'running', so a later failure is still recorded as
'failed' with its real error instead of an endless in-progress answer.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0123r5HnanmW2VUrZ7VWDufH
GET /__void/restarting must send a protocol-relative return value
(//evil.com) to / instead of off-site, and must keep the query string
of a same-origin return path (/foo?x=1) that the toast sends.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0123r5HnanmW2VUrZ7VWDufH
Send a KV entry from an older cache policy through handleIsr. It must
render live (MISS) instead of serving the entry as a shared HIT, so the
L2 read keeps its entry validation end to end.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0123r5HnanmW2VUrZ7VWDufH
Pair the operation and keyring rows so both trigger handlers run in a
real operation child with browser credentials. This guards that
`void domain remove` of the last domain sends the OAuth bearer, while
keeping the keyring false row and the same number of child runs.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0123r5HnanmW2VUrZ7VWDufH
Guards that extractScript in @void/md ignores a commented-out island
import in a Markdown <script> and keeps the comment and the code
around the real island import in the page's client code.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0123r5HnanmW2VUrZ7VWDufH
Guards that resolvePlatformCloudflareCredential() starts Cloudflare
browser login when the session is interactive and no Wrangler session
exists. Every platform command resolves credentials through this
wrapper, and no other test reaches its login path.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0123r5HnanmW2VUrZ7VWDufH
Check that a provision rejected for an account mismatch leaves the
config as it was: account_id stays pinned to the first account and its
D1 id is kept, so a retry under another account cannot pass the pin.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0123r5HnanmW2VUrZ7VWDufH
Assert the proxy URL that remote KV get/put/list, R2 get/put/delete/list
and D1 batch calls hit, so a renamed endpoint in the remote binding
clients fails the unit tests instead of only failing against a live
proxy in `void dev` remote mode.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0123r5HnanmW2VUrZ7VWDufH
@Brooooooklyn
Brooooooklyn merged commit 899ab89 into main Oct 12, 2026
20 checks passed
@Brooooooklyn
Brooooooklyn deleted the chore/oss-cleanup branch October 12, 2026 08:50
Brooooooklyn added a commit that referenced this pull request Oct 12, 2026
## Problem

The pre-open-source review of the SDK, framework and CLI packages
confirmed 17 high-severity bugs. Each one breaks a documented command or
a common setup:

```
database   void db reset / seed / export on MySQL 8 · db reset after `void db connect` · TS seeds
init       pnpm build approvals lost · Windows paths with spaces
deploy     pinned-secret Cloudflare deploys · custom binding names on managed deploys
runtime    remote D1 sessions · MySQL migration breakpoints · MySQL auth migrations
adapters   React SSR errors hang · Solid remounts on every update · Svelte island CSS
config     BOM-prefixed wrangler.jsonc · Astro dev ignores src/middleware.ts for good
```

## What this PR fixes

One commit per bug. Each commit message has `Bug`, `Repro`, `Cause`,
`Fix` and `Test` sections for review.

The review found 17 bugs; this PR has 16 fixes. The Vite+ starter fix
(pnpm pinned with no build policy) was dropped: `main` now installs
Vite+ projects through `vp` and keeps the project's package manager
(328c186), so the bug no longer occurs.

| Area | What a user hits today | After this PR |
| --- | --- | --- |
| `void db reset` / `seed` | After `void db connect`, drops every table
in the deployed PostgreSQL/MySQL database with no prompt | Asks first on
a non-local host (`--yes` skips; localhost skips) |
| `void db reset` (MySQL 8) | Drops nothing, still prints "Database
reset" | Drops all tables |
| `void db seed` (TS) | Crashes on `void gen model` barrels after the DB
is already wiped | Loads extensionless imports |
| `void db export` (MySQL 8) | `Table 'app.undefined' doesn't exist` |
Exports every table; restore runs with FK checks off |
| `void init` (pnpm) | Rewrites the user's `allowBuilds` /
`onlyBuiltDependencies` | Merges into the user's list |
| `void init` (Windows) | `node` spawned through a shell breaks on paths
with spaces | Spawns `node` without a shell |
| `void deploy --platform cloudflare` | Pinned-secret deploys reject
`limits` / `placement` / `cache` | Uploads limits, smart placement and
cache with the version |
| Managed `void deploy` | Ignores custom D1/KV/R2 binding names | Sends
them, as `docs/reference/config.md` says |
| Astro dev | Leaves `src/middleware.ts` in `.gitignore` for good | Adds
the line only while dev runs |
| Remote mode (`remote: true`) | `void/db` and auth crash: no
`withSession` | Remote D1 binding supports sessions |
| MySQL migrations | Sends `--> statement-breakpoint` lines to MySQL |
Splits on breakpoints |
| MySQL auth migrations | Re-runs fail on MySQL 8 (uppercase info-schema
keys) | Idempotent on MySQL 8 |
| React Pages SSR | A page error hangs the request | Rejects → 500 page
or dev overlay |
| Solid Pages | Remounts page and layouts on every navigation and
deferred update | Keeps layouts; GET navigation re-creates the page
(same as Vue) |
| Svelte islands | Production ships raw, unscoped `<style>` CSS (or the
build fails) | Bundles the compiled CSS |
| Root `wrangler.jsonc` with BOM | Read fails, file treated as missing |
BOM is stripped, as Wrangler does |

## How each fix was made

```
verify   reproduce on the #400 head (failing test or script)
fix      regression test first, then the smallest fix, one commit
test     independent tester: the test fails with the fix reverted, affected tests, typecheck
review   adversarial review of the commit → a verifier checks each claim → fix-up if needed
```

## Decisions

| Topic | Decision |
| --- | --- |
| Reset on a remote DB | `void db connect` still writes the URL to
`.env`. Only reset/seed ask before they drop tables on a non-local host.
|
| Managed custom binding names | Projects that already set custom names
get new resources under those names on the next deploy. The old
`DB`/`KV`/`STORAGE` resources stay. |
| Pinned-secret deploys | Targeted placement (`region`, `host`,
`hostname`) still fails, now before any API request: Cloudflare's
version endpoint can drop the target, and an `--atomic` upload is live
at once. The error names the key and says what to do: remove
`cloudflare.placement`, or set it to `{ mode: 'smart' }`. `logpush` and
`tail_consumers` are accepted but not sent. No Cloudflare version upload
applies them, with or without secrets (same as `observability`). With
secrets, `--atomic` deploys and the first deploy after `void secret put`
also keep the live values. Without secrets, those two paths apply them
through `cf deploy`. |
| React SSR errors | Errors before the shell is sent reject the render.
Errors after the shell keep React's default client-render fallback. |
| Solid navigation | Same as Vue: GET navigation re-creates the page;
mutations, `router.refresh()` and `preserveState` keep it. |

## Known limits (not in this PR)

- Astro: after a hard kill (SIGKILL, crash), or in apps that ran dev
with an older Void, the `src/middleware.ts` line stays in `.gitignore`
until you delete it by hand.
- `void db seed`: the database is reset before the seed file loads, so a
seed that fails to load leaves an empty database. Base has this too.
- Remote D1 sessions: `withSession()` ignores constraints and bookmarks
(#403).
- Svelte islands: CSS of child components that render only on the server
is still missing.
- MySQL migrations: a failed multi-statement migration cannot resume.
Base has this too.

## Rollout

```
main ── #399 (Cloudflare e2e fixes) ── #400 (cleanup) ── this PR (high-severity bugs)
```

Merge #399 and #400 first.

## Testing

| Check | Result |
| --- | --- |
| `vp run build:all` + `node test/check-playground-build-artifacts.mjs`
| pass |
| `vp run check` | pass |
| `vp run test --base <#400 head>` | pass (480 files, 10,261 tests) |
| Windows CI (`test: windows`) | pass |
| Regression tests | One per bug; each fails when its fix is reverted |

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_0123r5HnanmW2VUrZ7VWDufH

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
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