Dashboard › craft › Distillation
eff6e3ad-04b2-4c35-9860-aaa121219593["d059e4963e74a94fb30df5cb17da892c","a861ee9c23b1a466bfd93c5664198a30","af72267b06f88c89cb549424c66281ef","0f79f9104dd173a081fa4a1b1ceb4713","b33434bdb5c2679bb83ed310adfd4c95","f39ba1435ab0412718574694fdc0c4e4","6bce4f42e999eecfcb5fb38c99132e52","0c49c4f8918be9aa33dae2a7ff1b5971","7c2fb14d304d9809af7be7c13c4b7767","481a00ab39815dec814efff7f5534261","e62f3824a99c4915faad0b3fce2a3428","048031497dc6a245e178443e65c0dbea","bbd44fca79ae3451539c028b8c6e9a64","d872640072b82d76c87f9be5d53ec3ea","992fa2d6dbeac1a050926f65bb21bc4b","08629b817698f84fe1d5e5b3309676d3","fd5fbf12b6fa43272f252a6094ce49fb","8171ca1ff83e8742eda2888183c43c4e","26ea393bd1586236084753af7af009f4","e4e3aa5767dad18bbf6b995cb622f91e","764eaca2da40a1534ea62b962dc495ef","82cb2e2a8cc315653b9d38c7ae78507c","7d40ee6ba66b1ccdbb711598436ad920","09c9db05880fc4153dc7d3809477835f","93af5d0d0f062716b2d167614a2033b6","db222dfc69f1c3d4862f1db63808acff","3645f5bd03dc9f5c3c7a5727171dd641","fe68ca4e2dc9949418a0c5174e12c845","21fcd97c2780fc15a6a6c7eefd17bf96","83994ea656b1ba25282aafc0eda211f8","18d685e39e159ecd7d87ea11e91d0db3","60eca7af8fef91a2b74f27a37b4a3bf8","8120091ad4aa9243dfd8f0e165599db4","5c242c3c99820584df078391e576aba4","f2382da3a76a07ce856cc6366dfb8fa7","2b3df0bdf0b708ab2eaed55e056d066a","a68d2f5b0bbdf37601a42eb12ae22e34","8e34c375a12e796229404e31667314b2","f4fc6c75a349227a9d8601a4fd4b0d98","65c31eaefd4edba83d27b662c66f2130","28f7424af8adeaebcf89e2f62cd92dc2","b71c1a5047f719ab7c5aca16e60e5f79","0cb3067b3e5f3b24382a380cdf2f7372","25351052337d3462a8751c7f97c68711","b422ca5c25818cac3b913eaf8b5383f5","1259c82727b451c47d4be321d848626a","d3b9d16ca7a49ab7292801dafdd857c5","cdeca15468f710858fee89e3d8a28e54","0650fc0482e365e0f5f05e5537ec600c","b644636ad88103e7f964d981692199b1","9dcb5f97d232e477a008e2e5668c6bca","2ec4094f33d0eaa23c8427bf4213408d","dc619724f25ee66c134be8f422db18b4","139e6453381ed9036122a508a34d6904","bda14d5f60a7bf61e3c8b1dec546d2b5","d2e146e8de66a4e6104f441da4a31ffa","8348a455ff865c60d6c87ef01c68b7cc","d5d7e1835a83028c95c9b43ee0fa8e80","bf5fa321c59677ffc28cbdc28eaa0e58","40441ba7e5520fb766cb6f556330a1b0","55b0748c492250cdc2ae536ff53b6c30","5c3fee8b60c7103851eff50d3f1bbefc","69c842d96a6111d3a5d32c7823655eef","f5cb1d942bb969ac611dbdc8527cf7e4","cd79718e261629c818b8f663c73cdff5","dccf065e35492133539eb5304c2ea0b8","e32c17a4e305b5bf9ed1be39e75b73e7","8ae78250cc0e7067d0528f608f401bd2","4be4f765bf55ae7996c20d806365e5f9","19e802161a1da8da1406c4ef3f51bfb2","40f13d16c417d84837cca8ed5aea9018","e91ad3f9f5125d12ec88225afeada793","e784274999f4b448ad8452af11aba0da","42b68a51f41619fbeb4745948edb7371","190b9a085bdec53363493a5fc9d75340","97ed378b194430f51ecb4d2f51e46ca2","0cc43cc52a023aeb7ef4f8fb969e566e","3f2633486b6d78375e34a85763940306","ea0ade6ece569b29ee747eafb3a50e10","b517d0b35516ed5ff9be0fc3f389e5b0","5664b9a9c1de511cb4a125b14d104d16","f9627d1630b2c7080c1c6e08be517161","eb1acf1f1177216d2a0af9482c5f05f9","e055f2fdabf35b0297e21551e437976d","99bc6a1dc6b1f31fec84e39893619bdb","bd234a4e9e0873a2e5e0f90adb53d7a5","d1dc0f12e09662367bd9ba86f522f79b","59682fc3ad6a9763d0b1daf47b2083bc","9ff535b90efeef9023d73cefa5229910","c7935086315bd9be6ae96faff768015d","69e3be727e4121cef2ca1c5a9755a542","0e939cb0895d66966cd9b53f7211f7ad","f0249a615d7c862b8df1152a851c5e45","12aa45418b20b65bfc7667abbef45869","b3fe31664312510aeec5167fb89e679d","106c9be6fce88dfcbe0758cc3b4519a9","32e8dfb9d0bdcdbf4c6cbbec813c6243","2272f89df50cf2ad9ea4d7d1d5d461d7","5f4d60b206a8b99ecf53cf63d64ef6f6","d0b6522130a3a1f7a4ff1cc6db906be0","47c712b70cef9f2fa008b3f4d954a6e3","5ddafa12e2d4731ddfdc169e02648c33","c2baf3c21f194998e11cf9b36d3d28e5","ad6a8717effce8abf69dfa7677a9b32b","ed6578bff3984c0135aca564c0c597e7","b79b183ad16734e50441729f9addacba","356a6e91ac84c1b06bea43f73d0651b8","4cf70868152a331b75accc84bdf3a8f2","4a021d7415e15196a11b889987f32b7c","25fdbe802f3841692a028cf98d881fbf","84614d0a7ff1db0ddfd173e4268d0bc8","a18ccce6818a56ac0fe9f0cf5c652d93","34287866cf8c10b6ac51f8737fa82ff7","8e102c9c48b7e5667cbc72ff74bb78d2","ba96f2fc41e7ffcd4d5943199060bbd5","cd17c7154b8f9c6c773eac8361bcb9d8","7451f2cabebbd9e8221b3f715b3f4ff7","a721a58abdcac18cbaa41bf87d7d428a","3ecbbd480c20b94b76bb61d63b0a8f03","699ccded6d9596da58fcbe45a7cd930f","4b80851df88c633fd20bfadae0448202","15f66e09e2a5abba69cb1723224419b9","03da34c3ab65311d068d2226a32cba2a","15ba4435eb63242c0633b52135aa37a9","8786ee8a2c7b9474808ba000f44ecfaa","ffdbe8798c5920d9baa8e64d0b3f88bc","c48c24b645eb848ff3001b6b01941741","9a92032ea4eece8d86537181aa47509a","a891b95c629bded08bcf79c90ae0bc6b","2033644342c249b812f3c463a50e1be7","3d29f48ec135cf1dd300a7a839c5d8b1","093f16570594f49f4aad48e3b474b5aa","a69618be12a97dee5a6289cd17ada3aa","dd7b70ec84489d13ecbce9610111b970","f4f736e5acdf4969ae16c3dccb8bddd9","672cbb048666030621ab2c6675a0eed2","c0f42c75af9e9c808c4e3ea3409881fd","b9345a9faf24080bc2acde63847601ae","7517a23d1bc7ea5c4daa7b2bdbcee8e5","073b330e43db84d0d35c08f32b889deb","11b9a257519b5ebaf188036d4652c64a","4bcffc890d2f6e088561efa2ca3f6586","a4b8b5631b1f521594ca6be77819ea26","d344f72effbe894447dd8ec588bb41e5","403cdd7e0e7bb46c0f314762d74eb454","906d0716e0d0092f99076b89eb1093f6","e3bc92d4a888a9c36b18dac4b05a58c3","dc33aca954323acf0a6bc74fbd702a20","c8fac4959c5a604227aeb6397a3c5231","ed4a4e951bdc07cbb8ad18a0b638abf1","6968d99f2213490b7bc06dd86f8b0734","851b373be83b1648768f1a6919d7322e","e4f1281d7ba57254d5aa55258db8b06c","9380961975187c43a1f666415da4646f","c1fbf9cc2d00855b78a9c7d7489aee62","1ed7726ef3644ac05357bb198df8c501","e03a62a902251a7d3ce0bd874d2fd32a","f9780627d1d94781fbb9eb1a473f3cbf","d14485f489fd8ee2c4f6cdcdc29649a3","07044cf3e2983d14357aab453f129671","5b0f1c75f7ab9bd88559ea2675dcd36d","21dd71dc1208f00fd1e0594789e15603","cabf8e879cab59bb32f1331c08bf94b4","a2e3747cf40ce45341acd4af0d681537","283841dc6279b88bc8a61b0884bf8870","c5db9c4760c7da5ba536d6994da7d81e","0488ff5aaf815f4e02fade334ca7d31f","f89d89d363cb92b0d6a1bb9e217a35a1","efae7c3e0e761730318f63eca79e59e2","5cbb077911d2447bf8c379025fc430dd","ed007fe9a0a380819d432e0f1712216b","f717a573a00f0cb88f7427d911a675e2","72f7f93472f1e4d5400f0e74f9054e6c","2aebbcf4cf472d64cd646bb846c14668","b74f2814b8f81e22c8a4ff613b4ec55e","32b8afda24b43f20d02ced5584b75623","99b06b2ecc0b66e28f3f02f4b4fdd720","8ab77898462398625168f3dfbccac378","209b9b7d106657ddbc22f312ee013cda","a8b127a18c22b658af15114364d01121","1fad46ce7fa878c80fad0d612edb68f8","d006b0aef4ddacb3b117ff40eea76d06","8e7287fc36808c6d6f3e1d3ac0d84922","afceb408fafa8efb245b9de63cc1b877","4be5fac4178fa272908eabb58e7e81e1","5af1ba1a8d4091a0dc4a71dac6dff0d6","99a7891b720ddb9095577ea8c8ffeba4","c983cfb99f2c49d0d549b92f48de5f54","2f59fd85fd6cd1a4c347c914322fed37","18d8dd69b6b177d02b0787c12d4f3d95","5af7559d96615c91eca81b5e49dc7637","db84fe58ea3d4883395b10e7ff15e066","09c89692dc15d8dfd44a64120b166859","594f8117e942d3f9cf8f899628459808","3c15d9f31a56814e0988146e8e2bbcdc","18e1f8f22bb42f05ac36782ba10b7139","084236150c1e3c60d9db69972b045e56","8f384d5f5d667b6cd82da1f0a48df46a","4eca709d17fa3da955001ebbc23809cd","6a104de341dc72b2258567ae7221823c","f9631d5b59c45c5f59c7a6a82f7eb0a2","9fa18e78fb85011ad279f3264a70ab7e","0a015795723604a6156df5b0d8a77429","402197c5c8813c0783881c7b3cfef44b","f7ac038191f708445af136ec90abdeb4","2364dec72aabe820683f5fdd55d69bc9","bff7f4b10b89209e451e3f57ec4bac5c","b1e2ce1e99024bfb28a6585a8b98a3c4","de9c70e6c38d2f64399b4a0c2be2eae8","46ff2588f0a32681159ed2581b6c8b73","1f7fe71523f7a6696f0ae69d4f6581b7","a35fd8ece8810be16436bc20409a2b48","456a542cbbafb302930f6c0fdf99c6e1","8c2f711d8db90951b54123d290cd80e4","5480157a556127206a52af409349afc1","3146b4de8b3b56c6ba706aee969996bf","d5c3b0fe50d2b533dbf0a6768ad4fc1a","790c0c80255c8accb6d0e746a3beac22","825c420bdf8e3ae8e3f817f5a612f970","4610d7a2da3295af9723a8ff26477a78","4aa6498f3549ed3e3d04a6d1a54f9b71","58d7a90ff991c97b558050c26205024e","0475c278efdb2bd39b9d62d0e10879c1","c172aa78aa6f35a54dfa8482b894eaf2","51df883403bf1cc6867f8461da990a4e","bd707e7be13093ba4389ad07667ace91","aabcbf5df55b8f33c7697f3aa33fcfdc","86b5cff1d5146ee340ed821f95fa5c35","e4a4cf2f15a79b59f68be05b4dd34a11","1d846ded9905fe11a561b514ded75b7c","16dd88c6ea6ec2d089ae50c8bae49979","8d3e3e634d3c3d0ac5f4bce9efe02305","15e809ab23277053478e7c6724b56b0e","53c900fc088df5a4787fe9894eab40c2","8da7d11ba551b9bb88825b39dea1bbf7","b84c3f251340410877a2f5300090af5f","c34f34725704fe31cd6d561cedc8f7f4","415a84b8a292096669ee67afc431aecd","7475807e1038172efce6cd40da812a77","f710f9d8462b5ff31238d69e7bf9d874","172952222c3d6f56567ccb24d94aac84","fe42c9ba7ba3b2f7389d95c614006286","8b025193c9c98df7e780c419a2c5eaad","87e5503814f5d99cb1ba3e65a2787269","08e8deb55ddf1e4144494dd1592fa125","1534d56642cbaa38c29f15dc76b764e3","2e39e10e75d573014482e11f80ad2dbf","87b001ce2515d3d8d3845a712a9d90a5","099e4d9d75c4e191994946c675051956","1aeb971e89d67b6a404c0df6c6d30ec1","033a253b6c6d021b5846f1453f0000d6","9a2141daca5599cd4408fe1b097c486a","11b8565901804899697a2f9175cd4483","4953bc1e25eb34885fcb5cc99bb8ded7","93ddd2981582e6a2f938c9e01b31d639","e068f4f2b86226cf73854a1edfc2ee99","80356fc378d9e0c20e16293521b5b2ad","0eb09286980708099c82f039c4d211b4","a80896f27fa60d58dc8e12ad81df2bb9","8b6adcd4da33e576daff995c2cc591f5","0721df7873fd5377644881f57b328fe5","a248668eedbfc9e306537a640b0e1cf8","4264b52282958c60893c78b5204f7bb0","ce85be68dfa4921c9698b7fdc461fbcb","4269a5c65d85adc98753844e6306dbd1","eebee047772a64ec66fd0ab7911b1d68","986e47e82b4d744f95a804899f99989e","25583732258cb094996f06abccff2169","af44bf88709f68fc703e21bbf8187c1c","3419b75d8e4e3a7ce3c5416fdccf7132","f9836ec56a18dc7b3075cdc5e9d6d238","f74092130c06d1316c3c04e850ab60f7","c42c2cf6c762040250f5a10b64aaf09e"]
issue-864-vercel-target, Closes #864, created 2026-08-06T13:35:55Z). All work is done and verified; only the merge gate remains.51cab28) rather than dismissing the old review. The assistant is in the act of submitting that approving review on BYK's behalf via the GitHub API right now — this is the single outstanding action.51cab28 (pushed directly to issue-864-vercel-target from local branch byk/pr865-fixes). mergeable=MERGEABLE, mergeStateStatus=BLOCKED, state=OPEN. The BLOCKED status comes solely from the stale CHANGES_REQUESTED review (id 4883264134, by BYK, on commit 77b5ddb, submitted 2026-08-07T13:33:02Z).resolveReviewThread). Replies posted: comment IDs 3737026419 (project linking), 3737031923 (ready event), 3737031922 (docs paragraphs), 3737034665 (additional).51cab28 (25 checks pass, including dependency-review after three dependency overrides; Seer Code Review pass 2m43s, Cursor Bugbot pass 1m27s, image 5m13s, semgrep 5m19s, warden 8m21s)./tmp/opencode/pr865 on branch byk/pr865-fixes (tracks origin/issue-864-vercel-target), clean at 51cab28. Untracked leftovers .opencode/ and src/types/nvar.ts (contents: declare module 'nvar';) are from the accidental stash pop, deliberately not committed.project param); Cursor Bugbot HIGH "project linking never resolved" fixed; Js-yaml/path-to-regexp/tar-fs vulnerabilities all cleared via pnpm overrides.vercel CLI to Vercel REST API via @vercel/client — user (BYK) explicitly rejected the CLI-based approach ("Let's do it now" → HTTP path immediately) despite the author's cloudflare-parity argument. Result: no CLI binary, no Dockerfile pin, token never on argv. [rejected-approach] CLI-based vercel deploy --prod --yes --prebuilt design was superseded by commit 003a98a.project param, NOT name — per Vercel REST API docs (POST /v13/deployments): "When defined, this parameter overrides name". Passing VERCEL_PROJECT_ID as name fails/misroutes (previous name hack dropped in 77b5ddb). This fixes both Seer HIGH 15779507 and Cursor Bugbot "Project linking is never resolved".@vercel/client's DeploymentOptions type has no project field → deploymentOptions typed as Record<string, unknown> (pragmatic: SDK spreads unknown fields into the POST body via JSON.stringify({ ...deploymentOptions, files }); passes tsc). Rejected alternative: keep DeploymentOptions + cast only the project field. Tradeoff acknowledged: loses type safety on target/meta, but target: 'production' and meta: { release: version } still typecheck.overrides instead of dependency upgrades (for all three):
path-to-regexp-updated→6.3.0; both pathToRegexp and compile APIs stable across 6.x; 6.3.0 already in the lockfile via the alias.tar-stream@1.x dependency tree; @vercel/client only uses pack (never extract), so the vuln isn't even reachable, but CI gates on it anyway.issue-864-vercel-target) succeeded at 15:04 — fallback Option B (PR byk/pr865-fixes → issue-864-vercel-target) was not needed.byk/pr865-fixes (shallow, PR-only branch).git reset --hard 1726b49 to clear 72 staged + 5 deleted unrelated files + 7 conflict markers; stash@{0} "lore-churn-pre-rebase" LEFT in the stash list (belongs to fix/dependabot-security-alerts; dropping would lose data).@typescript-eslint/no-unused-vars warnings ("defined but never used") are NOT treated as real issues — all 7 are pre-existing on underscore-prefixed variables in files untouched by the PR..vercel/project.json — source-verified it NEVER reads that file.🔴 [assistant-commit] 3 commits by the assistant (all pushed to issue-864-vercel-target; author: Burak Yigit Kaya byk@sentry.io):
1726b49 "fix(vercel): link via project ID, fix js-yaml override, address review feedback" — 5 files, +82/−30 (vercel.md ±10, package.json ±3, pnpm-lock.yaml ±13, vercel.test.ts +54, vercel.ts ±32). Committed 2026-08-07T14:38:52Z.fca56e3 "fix(deps): override path-to-regexp to 6.3.0 to address GHSA-9wv6-86v2-598j" — 2 files, +5/−13. Pushed 15:22 (1726b49..fca56e3).51cab28 "fix(deps): override tar-fs to 1.16.6 to address GHSA-pq67-2wwv-3xjx and related advisories" — 2 files, +7/−5. Pushed 15:35 (fca56e3..51cab28).deploy() now passes project: vercelConfig.projectId in deploymentOptions when VERCEL_PROJECT_ID is set. VERCEL_ORG_ID → teamId in clientOptions. Verified end-to-end: @vercel/client deploy.js spreads deploymentOptions directly into the POST body (body: JSON.stringify({ ...deploymentOptions, files: preparedFiles }), deploy.js:53-54), so project IS transmitted.createDeployment event stream — resolves on 'alias-assigned', falls back to 'ready' payload URL if the stream ends without alias event, throws event payload on 'error', throws "Vercel deploy finished without a ready deployment" if neither occurred. (Deploy.js L151-157: if deployment is already ready+aliased at creation, SDK yields ready then alias-assigned synchronously — partially answers Bugbot's ready-vs-alias question; checkDeploymentStatus polling behavior for production remains the open tail of that investigation but CI/reviewers accepted the fix.)meta: { release: version } (BYK comment 3735799203, verbatim suggestion).@vercel/client createDeployment (${deployDir}) at deploy.js:242 — fixes BYK's "misleading message" (3735806399).craft publish..." release-gating paragraph is entirely removed from docs/src/content/docs/targets/vercel.md.release=<version>) for traceability.".vercel/project.json fallback claims deleted: env-var descriptions L24-25, note L28, workflow step L62). Final vercel.md is 60 lines: VERCEL_TOKEN required (L21, "Passed to the deploy API, never on the command line."), VERCEL_ORG_ID optional (L22, team ID, "An identifier, not a secret"), VERCEL_PROJECT_ID optional (L23, project identifier, "An identifier, not a secret"). Also documents that the target "does not use or require the vercel CLI"; prebuilt default true (uploads prebuilt .vercel/output, skips remote build); workingDir subdirectory deploy; workflow = build in CI with vercel build → vercel.zip → configure in .craft.yml → set token+ids.de72ac6 (resolves Bugbot "Foreign agent instructions replaced repository guidance" + BYK 3736099473/3736163898).extractZipArchive (import + call site), NOT extractZipArchiveWithFlattening — restores the 94f7049 fix that 003a98a had regressed (would turn .vercel/ into bare output/ breaking --prebuilt).🔴 [dependency-override] Root package.json pnpm overrides (identical in top-level overrides and pnpm.overrides, 17 entries, final order): fast-xml-parser ^5.8.0, minimatch ^10.2.6, brace-expansion ^5.0.8, ajv@<6.14.0 ^6.14.0, postcss ^8.5.18, rollup ^4.59.0, flatted ^3.4.2, picomatch@<3 ^2.3.2, uuid ^14.0.0, @tootallnate/once ^2.0.1, form-data@>=4 ^4.0.6, form-data@<3 ^2.5.6, vite ^7.3.5, @babel/core ^7.29.6, js-yaml ^4.3.0 (added), path-to-regexp@<6.3.0 ^6.3.0 (added), tar-fs@<1.16.4 1.16.6 (added). excludeLinksFromLockfile: false.
js-yaml vulnerability (dependency-review high; GHSA-52cp-r559-cp3m — YAML merge-key quadratic CPU; GHSA-5p4m-2wfm-xmqj / CVE-2026-59870 — !!omap quadratic CPU): chain = @vercel/client@18.2.5 → @vercel/build-utils@14.0.1 → @vercel/python-analysis@0.13.1 → js-yaml@4.1.1. Root already had direct dep js-yaml@4.3.0 (package.json L51). After override, ALL instances resolve to 4.3.0 (lockfile lines 22, 158, 4053, 5269); @vercel/python-analysis now depends js-yaml 4.3.0.
path-to-regexp vulnerability (GHSA-9wv6-86v2-598j, backtracking RegExp, high): @vercel/routing-utils@6.4.1 (latest published 6.4.1; versions 6.1.0–6.4.1) pins path-to-regexp@6.1.0 plus alias path-to-regexp-updated→6.3.0; only direct consumer is @vercel/routing-utils/dist/superstatic.js (uses pathToRegexp L49, compile L480/L499 — stable across 6.x). Lockfile had 6.1.0/6.2.1/6.3.0. After override ALL path-to-regexp → 6.3.0 (lockfile L23 override, L2789 entry, L5253/L5271 deps, L5272 alias, L6343 empty node). Note: @vercel/node separately uses path-to-regexp@6.2.1.
tar-fs vulnerability (3 HIGH: GHSA-pq67-2wwv-3xjx [= CVE-2024-12905, link following + path traversal, CWE-22, published 2025-03-27, updated 2025-11-03], GHSA-8cj5-5rvv-wf4v [extract outside dir], GHSA-vj76-c3g6-qr5v [symlink bypass]): @vercel/client pins tar-fs: 1.16.3 EXACT. Patched versions: 1.16.4 / 2.1.2 / 3.0.7; 1.16.4 and 1.16.6 verified "advisories: none" via npm audit API. @vercel/client usage (dist/utils/archive.js createTgzFiles) only calls tar-fs.pack — the vulns live in extract, and pack is only reached when prebuilt: false; still gated by CI. After override, lockfile resolves 1.16.6 (L24 override, L3072 + L6628 snapshots) and tar-stream stays at 1.6.2 (1.x tree preserved).
CI workflow facts: dependency-review uses fail-on-severity: high, no .github/dependency-review-config.yml. Current dependency diff adds @vercel/error-utils@2.2.1 (OpenSSF Scorecard 6.1) and path-to-regexp@6.3.0. Semver impact for PR: Minor. Node 20 deprecation warning appears in workflow (non-blocking).
vercel.ts final shape (256 lines): L39-40 ORG_ID_ENV_VAR='VERCEL_ORG_ID', PROJECT_ID_ENV_VAR='VERCEL_PROJECT_ID'. deploy() (L160-199): clientOptions = { token: VERCEL_TOKEN, path: deployDir, prebuilt: vercelConfig.prebuilt, teamId: vercelConfig.orgId, skipAutoDetectionConfirmation: true }; deploymentOptions = { target: 'production', meta: { release: version }, project? }. publish() (L207) calls getArtifactsForRevision(revision, { includeNames: DEFAULT_DEPLOY_ARCHIVE_REGEX }). Dry-run: local extractZipArchive still runs, createDeployment NEVER invoked in dry-run/worktree mode (function-level guard, originally L230-232).
@vercel/client@18.2.5 verified behavior: createDeployment(clientOptions, deploymentOptions) async generator; full event list: hashes-calculated, file-count, file-uploaded, all-files-uploaded, created, building, ready, alias-assigned, warning, error. target === 'preview' → cleared to undefined; any non-"production" target → moved to customEnvironmentSlugOrId. Query params: teamId, forceNew=1, withCache=1, skipAutoDetectionConfirmation=1, prebuilt=1. VERCEL_TEAM_ID env auto-appended as teamId query param. Semaphore serializes API requests. Static-file inlining: all-regular-files + only .html/.htm/.md + ≤10 files + ≤5MB → base64 inline instead of upload. Manual mode requires prebuilt=true. NEVER reads .vercel/project.json (source-verified in dist/deploy.js, 177 lines: name derives from deploymentOptions.name / clientOptions.defaultName / getDefaultName()).
Vercel REST API facts: POST /v13/deployments; body requires name; project (target project identifier) overrides name when both set; forceNew (0|1) bypasses dedup; skipAutoDetectionConfirmation (0|1) skips framework-autodetection 400s; teamId and slug both valid team query params; lifecycle QUEUED → INITIALIZING → BUILDING → READY|ERROR.
Test changes (src/targets/tests/vercel.test.ts, now 19 tests, all passing): updated "does not forward org/project IDs when unset" to assert teamId undefined AND 'name' absent (asserting project presence separately); added alias-assigned mock yielding ready+alias-assigned and a test that the alias-assigned URL is used with ready fallback retained. Existing coverage preserved: token as DEFAULT_SECRET_VALUE, path=TMP_DIR='/tmp/craft-vercel-test', prebuilt passthrough, ORG_ID='org_1234'→teamId, workingDir:'dist'→path=${TMP_DIR}/dist, rejections for 0 artifacts ("no artifacts found") and 2+ artifacts ("more than one Vercel archive"), error event → rejects /boom/, dry-run (extract runs, createDeployment NOT called). Test constants: revision='deadbeef', version='1.2.3', artifact={filename:'vercel.zip'}.
Verification results: vitest (v4.1.8): vercel.test.ts 19/19 pass (3.85s); full suite twice: 59/59 files, 1089 passed, 1 skipped (1090 total), 0 failures (53.75s at 14:40; 31.20s at 15:34). tsc --noEmit passes. ESLint: 7 warnings/0 errors, all pre-existing no-unused-vars in src/commands/publish.ts (441:14, 458:14, 474:16, 480:18, 486:16) and src/utils/git.ts (231:12, 239:12) — untouched by PR, not acted on. Prettier check passes. Build via node build.mjs: OK (version @sentry/craft@2.29.0-dev.0, "SENTRY_AUTH_TOKEN not found, skipping source map upload", TSC_OK); the jsonc-parser/esbuild CI failure was fixed by Jared's 65a54b0 (bundle jsonc-parser via ESM entry); binary smoke test craft --help runs. Docs build: 29 pages, Pagefind index, sitemap-index.xml, 1.64s (first attempt failed astro: not found until docs node_modules installed; sharp 0.35.0 present).
PR diff vs origin/master: exactly 8 files, +1276/−1 — build.mjs (±32), docs/src/content/docs/targets/index.md (+1), docs/src/content/docs/targets/vercel.md (+62), package.json (+1), pnpm-lock.yaml (+664), src/targets/tests/vercel.test.ts (+267), src/targets/index.ts (+2), src/targets/vercel.ts (+248). Merge-base: 0652969 "meta: Bump new development version". (A stale local master first produced a wrong 39-file/4372/1156 diff.) Tags 2.27.2 and 2.28.0 fetched.
PR branch commit history (newest→oldest): de72ac6 (revert AGENTS.md to master), 77b5ddb (fix: preserve .vercel layout, drop projectId name hack, align meta key, consume alias-assigned), 65a54b0 (fix: bundle jsonc-parser via ESM entry), 003a98a (refactor: deploy via Vercel API instead of CLI), 94f7049 (fix: preserve archive layout instead of flattening), da4c738 (feat: add vercel deploy target).
Aug 7, 2026 (all times)
vercel deploy --prod --yes --prebuilt --meta craftRelease=<version>; VERCEL_TOKEN only secret; ${ENV} guard; dry-run guard; Dockerfile pin vercel@58.7.1), user's "Let's do it now" switch to REST API via @vercel/client (commit 003a98a), and the three review findings: Cursor Bugbot HIGH "Project linking is never resolved" (BUGBOT_BUG_ID eeb41c3b-605d-43b5-b9dd-5b2896d63754), Seer HIGH "VERCEL_PROJECT_ID never passed to createDeployment" (BUG_PREDICTION 15779507/0, commit de72ac6), and the flattening regression (003a98a re-introduced extractZipArchiveWithFlattening). CI initially green then dependency-review noted failing.project (not name) is the correct linking param; @vercel/client never reads .vercel/project.json; Seer's finding matches code; jared-outpost's reply 3730406181 was wrong.project param fix; alias-assigned robustness; docs rewritten to final 60-line state; BYK docs paragraphs removed.M .lore.md, ?? .craft-issue-842-plan.md [not recovered], ?? .opencode/).byk/pr865-fixes (tracks origin/issue-864-vercel-target); all edits re-applied (package.json overrides, vercel.ts, docs, tests); commit made to persist, then verification: 19 tests pass, lint/prettier clean, exactly 5 files modified (no AGENTS.md churn).project to the POST body (deploy.js:53-54 spread).@vercel/client createDeployment).git stash pop (no arg) popped stash@{0} "lore-churn-pre-rebase" from fix/dependabot-security-alerts → 72 staged + 5 deleted unrelated files + 7 merge conflicts. Recovery: git reset --hard 1726b49; stash entry kept; untracked leftovers (.opencode/, src/types/nvar.ts) not committed.astro: not found), then pass after docs deps install (29 pages).de72ac6..1726b49 → issue-864-vercel-target. Dependabot alert #197 noted.1726b49..fca56e3).fca56e3..51cab28).isOutdated: true): 11 already resolved (Seer auto-resolved its/cursor/semgrep threads), 2 BYK docs threads resolved via GraphQL resolveReviewThread (succeeded despite outdated status, overturning the assumed constraint).gh api reply failures (HTTP 422: -f sends strings; in_reply_to must be integer + positioning params) → raw JSON body approach; replies posted successfully (3737026419, 3737031923, 3737031922, 3737034665).