Skip to content

ci(repo): gate api-changes detect on turbo cache-hit signal - #8723

Merged
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache
Jun 3, 2026
Merged

ci(repo): gate api-changes detect on turbo cache-hit signal#8723
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache

Conversation

@jacekradko

Copy link
Copy Markdown
Contributor

break-check's API Extractor pass runs over all 19 tracked packages on every PR the paths filter catches, including ones that only touched tests, docs, or impl with no public .d.ts change. This builds declarations with --summarize first and skips the snapshot/detect (and the baseline worktree rebuild) when every tracked package's #build was a turbo cache HIT.

Worth a close look: the gate keys on #build, not #build:declarations. The latter is going away as packages move declaration emission into the bundler (shared already has none, via tsdown), and a #build HIT already implies unchanged declarations since build:declarations dependsOn build. Keying on build:declarations would silently skip-blind those packages.

On a HIT we post nothing rather than a "no API changes" comment, since a HIT is an inference that nothing changed, not an actual run, and a clearance would overclaim (a revert to an older still-cached state HITs the cache but differs from base). That same gap means a recent revert can be silently skipped, acceptable here since the job is informational and we no longer emit a false green; comments are stamped with the head SHA they ran on so an unrefreshed one reads as stale. HIT/MISS only exists with the remote cache on Blacksmith, so the first run here is the real test.

Skip the break-check snapshot/detect work (and the baseline worktree
rebuild) when every tracked package's #build was a turbo cache HIT, since
identical build inputs mean the emitted declarations are unchanged. A MISS,
or any uncertainty (missing summary, cold cache, parse error), still runs
detect as before.
Keys on #build rather than #build:declarations so the gate stays correct as
packages migrate declaration emission into the bundler (e.g. shared via
tsdown has no build:declarations task); build:declarations dependsOn build,
so a #build HIT already implies unchanged declarations for every package.
On a cache-hit skip, post no comment. A turbo HIT is an inference that
nothing changed, not a break-check run, so a "no breaking changes" clearance
would overclaim (a revert to an older still-cached state HITs the cache yet
differs from base). The "no API changes" comment is only posted when detect
actually ran and found nothing, and break-check comments are now stamped with
the head SHA they ran on, so a comment left unrefreshed by a later skipped
push is recognizable as stale.
@changeset-bot

changeset-botBot commented Jun 2, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0313d87

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 2, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 3, 2026 1:53am

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jun 2, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8723

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8723

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8723

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8723

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8723

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8723

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8723

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8723

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8723

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8723

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8723

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8723

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8723

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8723

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8723

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8723

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8723

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8723

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8723

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8723

commit: 0313d87

@coderabbitai

coderabbitaiBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 1a209a51-746b-4f31-8156-9878e4025375

📥 Commits

Reviewing files that changed from the base of the PR and between afe20f5 and 0313d87.

📒 Files selected for processing (1)
  • .github/workflows/api-changes.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/api-changes.yml

📝 Walkthrough

Walkthrough

The workflow's check-api job now fetches the PR base commit earlier and adds a "Determine API surface changed" Node gate that compares turbo build:declarations task hashes between the PR head and a detached baseline worktree. If the gate reports no change, expensive baseline snapshot, install, build, and break-check detect steps are skipped. When detect runs, the PR comment step now receives HEAD_SHA, computes a short SHA, and appends a “Last ran on …” note; inline docs clarify skip vs detect-run behavior.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • clerk/javascript#8621: Both PRs modify .github/workflows/api-changes.yml to change how baseline declarations/snapshots are built and cached and when detect/reporting run.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately describes the main change: gating the api-changes workflow on turbo cache-hit signals for the #build task.
Description check✅ PassedThe description is directly related to the changeset, explaining the rationale and implementation details of the turbo cache-gating mechanism.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

@github-actions

github-actionsBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-06-03T01:56:20.740Z

Summary

MetricCount
Packages analyzed19
Packages with changes2
🔴 Breaking changes0
🟡 Non-breaking changes4
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.

Note
Break Check could not snapshot 3 subpaths; the diff below excludes them.

  • @clerk/astro ./env: Internal Error: Unable to determine module for: /home/runner/_work/javascript/javascript/packages/astro/env.d.ts You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/shared ./cookie: Internal Error: Unable to follow symbol for "Cookies" You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/testing ./cypress: Symbol not found for identifier: Cypress

@clerk/astro

Current version: 3.3.2
Recommended bump: MINOR → 3.4.0

Subpath ./client

🟡 Non-breaking Changes (3)

Modified: $authStore
 $authStore: nanostores.ReadableAtom<{
userId: string | null | undefined;
- user: _clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined;+ user: _clerk_shared_index_DcX8l9gl.ps | null | undefined;
sessionId: string | null | undefined;
- session: _clerk_shared__chunks_index_dZ_J_o0Z.Qo | null | undefined;+ session: _clerk_shared_index_DcX8l9gl.Qo | null | undefined;
sessionStatus: "active" | "pending" | undefined;
- sessionClaims: _clerk_shared__chunks_index_dZ_J_o0Z.to | null | undefined;- organization: _clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined;+ sessionClaims: _clerk_shared_index_DcX8l9gl.to | null | undefined;+ organization: _clerk_shared_index_DcX8l9gl.xo | null | undefined;
orgId: string | null | undefined;
orgRole: string | null | undefined;
orgSlug: string | null | undefined;
- orgPermissions: _clerk_shared__chunks_index_dZ_J_o0Z.gm<_clerk_shared__chunks_index_dZ_J_o0Z.co>[] | null | undefined;- actor: _clerk_shared__chunks_index_dZ_J_o0Z.Xa | null | undefined;+ orgPermissions: _clerk_shared_index_DcX8l9gl.gm<_clerk_shared_index_DcX8l9gl.co>[] | null | undefined;+ actor: _clerk_shared_index_DcX8l9gl.Xa | null | undefined;
factorVerificationAge: [number, number] | null;
}>

Static analyzer: Breaking change in variable $authStore: Type changed: $authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:!_clerk_shared__chunks_index_dZ_J_o0Z.p…$authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:import("@clerk/shared").UserResource|nu…

🤖 AI review (reclassified as non-breaking) (92%): The only change is the internal chunk alias used for the same @clerk/shared types (e.g. _clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps); the shorthand aliases (ps, Qo, to, xo, gm, co, Xa) map to the same underlying @clerk/shared public types (UserResource, SessionResource, etc.), so the resolved structural shape is identical and no consumer code is affected.

Modified: $organizationStore
- $organizationStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined>+ $organizationStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.xo | null | undefined>

Static analyzer: Breaking change in variable $organizationStore: Type changed: $organizationStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.xo:type|null|undefined>$organizationStore:import("nanostores").ReadableAtom<import("@clerk/shared").OrganizationResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same OrganizationResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.xo_clerk_shared_index_DcX8l9gl.xo) with no structural change.

Modified: $userStore
- $userStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined>+ $userStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.ps | null | undefined>

Static analyzer: Breaking change in variable $userStore: Type changed: $userStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.ps:type|null|undefined>$userStore:import("nanostores").ReadableAtom<import("@clerk/shared").UserResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same UserResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps) with no structural change.


@clerk/shared

Current version: 4.14.0
Recommended bump: MINOR → 4.15.0

Subpath ./apiUrlFromPublishableKey

🟡 Non-breaking Changes (1)

Modified: apiUrlFromPublishableKey
- apiUrlFromPublishableKey: (publishableKey: string) => "https://api.lclclerk.com" | "https://api.clerkstage.dev" | "https://api.clerk.com"+ apiUrlFromPublishableKey: (publishableKey: string) => "https://api.clerk.com" | "https://api.lclclerk.com" | "https://api.clerkstage.dev"

Static analyzer: Breaking change in function apiUrlFromPublishableKey: Return type changed: "https://api.lclclerk.com"|"https://api.clerkstage.dev"|"https://api.clerk.com""https://api.clerk.com"|"https://api.lclclerk.com"|"https://api.clerkstage.dev"

🤖 AI review (reclassified as non-breaking) (99%): The union members are identical; only their order changed, and TypeScript union types are unordered — the resolved set of possible values is exactly the same, so no well-typed consumer code is affected.


Report generated by Break Check

Last ran on 0313d87. Pushes that change no tracked declarations (no API surface change vs. base) are skipped and don't update this comment.

@jacekradko
jacekradkoforce-pushed the jacek/gate-api-changes-turbo-cache branch from afe20f5 to 0313d87CompareJune 3, 2026 01:52
@jacekradko
jacekradko merged commit acc327d into mainJun 3, 2026
45 checks passed
@jacekradko
jacekradko deleted the jacek/gate-api-changes-turbo-cache branch June 3, 2026 02:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jacekradko@wobsoriano
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
ci(repo): gate api-changes detect on turbo cache-hit signal by jacekradko · Pull Request #8723 · clerk/javascript · GitHub
Skip to content

ci(repo): gate api-changes detect on turbo cache-hit signal - #8723

Merged
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache
Jun 3, 2026
Merged

ci(repo): gate api-changes detect on turbo cache-hit signal#8723
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache

Conversation

@jacekradko

Copy link
Copy Markdown
Contributor

break-check's API Extractor pass runs over all 19 tracked packages on every PR the paths filter catches, including ones that only touched tests, docs, or impl with no public .d.ts change. This builds declarations with --summarize first and skips the snapshot/detect (and the baseline worktree rebuild) when every tracked package's #build was a turbo cache HIT.

Worth a close look: the gate keys on #build, not #build:declarations. The latter is going away as packages move declaration emission into the bundler (shared already has none, via tsdown), and a #build HIT already implies unchanged declarations since build:declarations dependsOn build. Keying on build:declarations would silently skip-blind those packages.

On a HIT we post nothing rather than a "no API changes" comment, since a HIT is an inference that nothing changed, not an actual run, and a clearance would overclaim (a revert to an older still-cached state HITs the cache but differs from base). That same gap means a recent revert can be silently skipped, acceptable here since the job is informational and we no longer emit a false green; comments are stamped with the head SHA they ran on so an unrefreshed one reads as stale. HIT/MISS only exists with the remote cache on Blacksmith, so the first run here is the real test.

Skip the break-check snapshot/detect work (and the baseline worktree
rebuild) when every tracked package's #build was a turbo cache HIT, since
identical build inputs mean the emitted declarations are unchanged. A MISS,
or any uncertainty (missing summary, cold cache, parse error), still runs
detect as before.
Keys on #build rather than #build:declarations so the gate stays correct as
packages migrate declaration emission into the bundler (e.g. shared via
tsdown has no build:declarations task); build:declarations dependsOn build,
so a #build HIT already implies unchanged declarations for every package.
On a cache-hit skip, post no comment. A turbo HIT is an inference that
nothing changed, not a break-check run, so a "no breaking changes" clearance
would overclaim (a revert to an older still-cached state HITs the cache yet
differs from base). The "no API changes" comment is only posted when detect
actually ran and found nothing, and break-check comments are now stamped with
the head SHA they ran on, so a comment left unrefreshed by a later skipped
push is recognizable as stale.
@changeset-bot

changeset-botBot commented Jun 2, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0313d87

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 2, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 3, 2026 1:53am

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jun 2, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8723

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8723

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8723

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8723

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8723

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8723

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8723

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8723

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8723

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8723

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8723

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8723

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8723

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8723

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8723

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8723

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8723

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8723

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8723

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8723

commit: 0313d87

@coderabbitai

coderabbitaiBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 1a209a51-746b-4f31-8156-9878e4025375

📥 Commits

Reviewing files that changed from the base of the PR and between afe20f5 and 0313d87.

📒 Files selected for processing (1)
  • .github/workflows/api-changes.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/api-changes.yml

📝 Walkthrough

Walkthrough

The workflow's check-api job now fetches the PR base commit earlier and adds a "Determine API surface changed" Node gate that compares turbo build:declarations task hashes between the PR head and a detached baseline worktree. If the gate reports no change, expensive baseline snapshot, install, build, and break-check detect steps are skipped. When detect runs, the PR comment step now receives HEAD_SHA, computes a short SHA, and appends a “Last ran on …” note; inline docs clarify skip vs detect-run behavior.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • clerk/javascript#8621: Both PRs modify .github/workflows/api-changes.yml to change how baseline declarations/snapshots are built and cached and when detect/reporting run.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately describes the main change: gating the api-changes workflow on turbo cache-hit signals for the #build task.
Description check✅ PassedThe description is directly related to the changeset, explaining the rationale and implementation details of the turbo cache-gating mechanism.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

@github-actions

github-actionsBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-06-03T01:56:20.740Z

Summary

MetricCount
Packages analyzed19
Packages with changes2
🔴 Breaking changes0
🟡 Non-breaking changes4
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.

Note
Break Check could not snapshot 3 subpaths; the diff below excludes them.

  • @clerk/astro ./env: Internal Error: Unable to determine module for: /home/runner/_work/javascript/javascript/packages/astro/env.d.ts You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/shared ./cookie: Internal Error: Unable to follow symbol for "Cookies" You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/testing ./cypress: Symbol not found for identifier: Cypress

@clerk/astro

Current version: 3.3.2
Recommended bump: MINOR → 3.4.0

Subpath ./client

🟡 Non-breaking Changes (3)

Modified: $authStore
 $authStore: nanostores.ReadableAtom<{
userId: string | null | undefined;
- user: _clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined;+ user: _clerk_shared_index_DcX8l9gl.ps | null | undefined;
sessionId: string | null | undefined;
- session: _clerk_shared__chunks_index_dZ_J_o0Z.Qo | null | undefined;+ session: _clerk_shared_index_DcX8l9gl.Qo | null | undefined;
sessionStatus: "active" | "pending" | undefined;
- sessionClaims: _clerk_shared__chunks_index_dZ_J_o0Z.to | null | undefined;- organization: _clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined;+ sessionClaims: _clerk_shared_index_DcX8l9gl.to | null | undefined;+ organization: _clerk_shared_index_DcX8l9gl.xo | null | undefined;
orgId: string | null | undefined;
orgRole: string | null | undefined;
orgSlug: string | null | undefined;
- orgPermissions: _clerk_shared__chunks_index_dZ_J_o0Z.gm<_clerk_shared__chunks_index_dZ_J_o0Z.co>[] | null | undefined;- actor: _clerk_shared__chunks_index_dZ_J_o0Z.Xa | null | undefined;+ orgPermissions: _clerk_shared_index_DcX8l9gl.gm<_clerk_shared_index_DcX8l9gl.co>[] | null | undefined;+ actor: _clerk_shared_index_DcX8l9gl.Xa | null | undefined;
factorVerificationAge: [number, number] | null;
}>

Static analyzer: Breaking change in variable $authStore: Type changed: $authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:!_clerk_shared__chunks_index_dZ_J_o0Z.p…$authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:import("@clerk/shared").UserResource|nu…

🤖 AI review (reclassified as non-breaking) (92%): The only change is the internal chunk alias used for the same @clerk/shared types (e.g. _clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps); the shorthand aliases (ps, Qo, to, xo, gm, co, Xa) map to the same underlying @clerk/shared public types (UserResource, SessionResource, etc.), so the resolved structural shape is identical and no consumer code is affected.

Modified: $organizationStore
- $organizationStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined>+ $organizationStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.xo | null | undefined>

Static analyzer: Breaking change in variable $organizationStore: Type changed: $organizationStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.xo:type|null|undefined>$organizationStore:import("nanostores").ReadableAtom<import("@clerk/shared").OrganizationResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same OrganizationResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.xo_clerk_shared_index_DcX8l9gl.xo) with no structural change.

Modified: $userStore
- $userStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined>+ $userStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.ps | null | undefined>

Static analyzer: Breaking change in variable $userStore: Type changed: $userStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.ps:type|null|undefined>$userStore:import("nanostores").ReadableAtom<import("@clerk/shared").UserResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same UserResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps) with no structural change.


@clerk/shared

Current version: 4.14.0
Recommended bump: MINOR → 4.15.0

Subpath ./apiUrlFromPublishableKey

🟡 Non-breaking Changes (1)

Modified: apiUrlFromPublishableKey
- apiUrlFromPublishableKey: (publishableKey: string) => "https://api.lclclerk.com" | "https://api.clerkstage.dev" | "https://api.clerk.com"+ apiUrlFromPublishableKey: (publishableKey: string) => "https://api.clerk.com" | "https://api.lclclerk.com" | "https://api.clerkstage.dev"

Static analyzer: Breaking change in function apiUrlFromPublishableKey: Return type changed: "https://api.lclclerk.com"|"https://api.clerkstage.dev"|"https://api.clerk.com""https://api.clerk.com"|"https://api.lclclerk.com"|"https://api.clerkstage.dev"

🤖 AI review (reclassified as non-breaking) (99%): The union members are identical; only their order changed, and TypeScript union types are unordered — the resolved set of possible values is exactly the same, so no well-typed consumer code is affected.


Report generated by Break Check

Last ran on 0313d87. Pushes that change no tracked declarations (no API surface change vs. base) are skipped and don't update this comment.

@jacekradko
jacekradkoforce-pushed the jacek/gate-api-changes-turbo-cache branch from afe20f5 to 0313d87CompareJune 3, 2026 01:52
@jacekradko
jacekradko merged commit acc327d into mainJun 3, 2026
45 checks passed
@jacekradko
jacekradko deleted the jacek/gate-api-changes-turbo-cache branch June 3, 2026 02:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jacekradko@wobsoriano
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ci(repo): gate api-changes detect on turbo cache-hit signal by jacekradko · Pull Request #8723 · clerk/javascript · GitHub
Skip to content

ci(repo): gate api-changes detect on turbo cache-hit signal - #8723

Merged
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache
Jun 3, 2026
Merged

ci(repo): gate api-changes detect on turbo cache-hit signal#8723
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache

Conversation

@jacekradko

Copy link
Copy Markdown
Contributor

break-check's API Extractor pass runs over all 19 tracked packages on every PR the paths filter catches, including ones that only touched tests, docs, or impl with no public .d.ts change. This builds declarations with --summarize first and skips the snapshot/detect (and the baseline worktree rebuild) when every tracked package's #build was a turbo cache HIT.

Worth a close look: the gate keys on #build, not #build:declarations. The latter is going away as packages move declaration emission into the bundler (shared already has none, via tsdown), and a #build HIT already implies unchanged declarations since build:declarations dependsOn build. Keying on build:declarations would silently skip-blind those packages.

On a HIT we post nothing rather than a "no API changes" comment, since a HIT is an inference that nothing changed, not an actual run, and a clearance would overclaim (a revert to an older still-cached state HITs the cache but differs from base). That same gap means a recent revert can be silently skipped, acceptable here since the job is informational and we no longer emit a false green; comments are stamped with the head SHA they ran on so an unrefreshed one reads as stale. HIT/MISS only exists with the remote cache on Blacksmith, so the first run here is the real test.

Skip the break-check snapshot/detect work (and the baseline worktree
rebuild) when every tracked package's #build was a turbo cache HIT, since
identical build inputs mean the emitted declarations are unchanged. A MISS,
or any uncertainty (missing summary, cold cache, parse error), still runs
detect as before.
Keys on #build rather than #build:declarations so the gate stays correct as
packages migrate declaration emission into the bundler (e.g. shared via
tsdown has no build:declarations task); build:declarations dependsOn build,
so a #build HIT already implies unchanged declarations for every package.
On a cache-hit skip, post no comment. A turbo HIT is an inference that
nothing changed, not a break-check run, so a "no breaking changes" clearance
would overclaim (a revert to an older still-cached state HITs the cache yet
differs from base). The "no API changes" comment is only posted when detect
actually ran and found nothing, and break-check comments are now stamped with
the head SHA they ran on, so a comment left unrefreshed by a later skipped
push is recognizable as stale.
@changeset-bot

changeset-botBot commented Jun 2, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0313d87

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 2, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 3, 2026 1:53am

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jun 2, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8723

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8723

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8723

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8723

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8723

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8723

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8723

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8723

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8723

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8723

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8723

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8723

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8723

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8723

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8723

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8723

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8723

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8723

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8723

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8723

commit: 0313d87

@coderabbitai

coderabbitaiBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 1a209a51-746b-4f31-8156-9878e4025375

📥 Commits

Reviewing files that changed from the base of the PR and between afe20f5 and 0313d87.

📒 Files selected for processing (1)
  • .github/workflows/api-changes.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/api-changes.yml

📝 Walkthrough

Walkthrough

The workflow's check-api job now fetches the PR base commit earlier and adds a "Determine API surface changed" Node gate that compares turbo build:declarations task hashes between the PR head and a detached baseline worktree. If the gate reports no change, expensive baseline snapshot, install, build, and break-check detect steps are skipped. When detect runs, the PR comment step now receives HEAD_SHA, computes a short SHA, and appends a “Last ran on …” note; inline docs clarify skip vs detect-run behavior.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • clerk/javascript#8621: Both PRs modify .github/workflows/api-changes.yml to change how baseline declarations/snapshots are built and cached and when detect/reporting run.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately describes the main change: gating the api-changes workflow on turbo cache-hit signals for the #build task.
Description check✅ PassedThe description is directly related to the changeset, explaining the rationale and implementation details of the turbo cache-gating mechanism.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

@github-actions

github-actionsBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-06-03T01:56:20.740Z

Summary

MetricCount
Packages analyzed19
Packages with changes2
🔴 Breaking changes0
🟡 Non-breaking changes4
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.

Note
Break Check could not snapshot 3 subpaths; the diff below excludes them.

  • @clerk/astro ./env: Internal Error: Unable to determine module for: /home/runner/_work/javascript/javascript/packages/astro/env.d.ts You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/shared ./cookie: Internal Error: Unable to follow symbol for "Cookies" You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/testing ./cypress: Symbol not found for identifier: Cypress

@clerk/astro

Current version: 3.3.2
Recommended bump: MINOR → 3.4.0

Subpath ./client

🟡 Non-breaking Changes (3)

Modified: $authStore
 $authStore: nanostores.ReadableAtom<{
userId: string | null | undefined;
- user: _clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined;+ user: _clerk_shared_index_DcX8l9gl.ps | null | undefined;
sessionId: string | null | undefined;
- session: _clerk_shared__chunks_index_dZ_J_o0Z.Qo | null | undefined;+ session: _clerk_shared_index_DcX8l9gl.Qo | null | undefined;
sessionStatus: "active" | "pending" | undefined;
- sessionClaims: _clerk_shared__chunks_index_dZ_J_o0Z.to | null | undefined;- organization: _clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined;+ sessionClaims: _clerk_shared_index_DcX8l9gl.to | null | undefined;+ organization: _clerk_shared_index_DcX8l9gl.xo | null | undefined;
orgId: string | null | undefined;
orgRole: string | null | undefined;
orgSlug: string | null | undefined;
- orgPermissions: _clerk_shared__chunks_index_dZ_J_o0Z.gm<_clerk_shared__chunks_index_dZ_J_o0Z.co>[] | null | undefined;- actor: _clerk_shared__chunks_index_dZ_J_o0Z.Xa | null | undefined;+ orgPermissions: _clerk_shared_index_DcX8l9gl.gm<_clerk_shared_index_DcX8l9gl.co>[] | null | undefined;+ actor: _clerk_shared_index_DcX8l9gl.Xa | null | undefined;
factorVerificationAge: [number, number] | null;
}>

Static analyzer: Breaking change in variable $authStore: Type changed: $authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:!_clerk_shared__chunks_index_dZ_J_o0Z.p…$authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:import("@clerk/shared").UserResource|nu…

🤖 AI review (reclassified as non-breaking) (92%): The only change is the internal chunk alias used for the same @clerk/shared types (e.g. _clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps); the shorthand aliases (ps, Qo, to, xo, gm, co, Xa) map to the same underlying @clerk/shared public types (UserResource, SessionResource, etc.), so the resolved structural shape is identical and no consumer code is affected.

Modified: $organizationStore
- $organizationStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined>+ $organizationStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.xo | null | undefined>

Static analyzer: Breaking change in variable $organizationStore: Type changed: $organizationStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.xo:type|null|undefined>$organizationStore:import("nanostores").ReadableAtom<import("@clerk/shared").OrganizationResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same OrganizationResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.xo_clerk_shared_index_DcX8l9gl.xo) with no structural change.

Modified: $userStore
- $userStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined>+ $userStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.ps | null | undefined>

Static analyzer: Breaking change in variable $userStore: Type changed: $userStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.ps:type|null|undefined>$userStore:import("nanostores").ReadableAtom<import("@clerk/shared").UserResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same UserResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps) with no structural change.


@clerk/shared

Current version: 4.14.0
Recommended bump: MINOR → 4.15.0

Subpath ./apiUrlFromPublishableKey

🟡 Non-breaking Changes (1)

Modified: apiUrlFromPublishableKey
- apiUrlFromPublishableKey: (publishableKey: string) => "https://api.lclclerk.com" | "https://api.clerkstage.dev" | "https://api.clerk.com"+ apiUrlFromPublishableKey: (publishableKey: string) => "https://api.clerk.com" | "https://api.lclclerk.com" | "https://api.clerkstage.dev"

Static analyzer: Breaking change in function apiUrlFromPublishableKey: Return type changed: "https://api.lclclerk.com"|"https://api.clerkstage.dev"|"https://api.clerk.com""https://api.clerk.com"|"https://api.lclclerk.com"|"https://api.clerkstage.dev"

🤖 AI review (reclassified as non-breaking) (99%): The union members are identical; only their order changed, and TypeScript union types are unordered — the resolved set of possible values is exactly the same, so no well-typed consumer code is affected.


Report generated by Break Check

Last ran on 0313d87. Pushes that change no tracked declarations (no API surface change vs. base) are skipped and don't update this comment.

@jacekradko
jacekradkoforce-pushed the jacek/gate-api-changes-turbo-cache branch from afe20f5 to 0313d87CompareJune 3, 2026 01:52
@jacekradko
jacekradko merged commit acc327d into mainJun 3, 2026
45 checks passed
@jacekradko
jacekradko deleted the jacek/gate-api-changes-turbo-cache branch June 3, 2026 02:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jacekradko@wobsoriano
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ci(repo): gate api-changes detect on turbo cache-hit signal by jacekradko · Pull Request #8723 · clerk/javascript · GitHub
Skip to content

ci(repo): gate api-changes detect on turbo cache-hit signal - #8723

Merged
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache
Jun 3, 2026
Merged

ci(repo): gate api-changes detect on turbo cache-hit signal#8723
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache

Conversation

@jacekradko

Copy link
Copy Markdown
Contributor

break-check's API Extractor pass runs over all 19 tracked packages on every PR the paths filter catches, including ones that only touched tests, docs, or impl with no public .d.ts change. This builds declarations with --summarize first and skips the snapshot/detect (and the baseline worktree rebuild) when every tracked package's #build was a turbo cache HIT.

Worth a close look: the gate keys on #build, not #build:declarations. The latter is going away as packages move declaration emission into the bundler (shared already has none, via tsdown), and a #build HIT already implies unchanged declarations since build:declarations dependsOn build. Keying on build:declarations would silently skip-blind those packages.

On a HIT we post nothing rather than a "no API changes" comment, since a HIT is an inference that nothing changed, not an actual run, and a clearance would overclaim (a revert to an older still-cached state HITs the cache but differs from base). That same gap means a recent revert can be silently skipped, acceptable here since the job is informational and we no longer emit a false green; comments are stamped with the head SHA they ran on so an unrefreshed one reads as stale. HIT/MISS only exists with the remote cache on Blacksmith, so the first run here is the real test.

Skip the break-check snapshot/detect work (and the baseline worktree
rebuild) when every tracked package's #build was a turbo cache HIT, since
identical build inputs mean the emitted declarations are unchanged. A MISS,
or any uncertainty (missing summary, cold cache, parse error), still runs
detect as before.
Keys on #build rather than #build:declarations so the gate stays correct as
packages migrate declaration emission into the bundler (e.g. shared via
tsdown has no build:declarations task); build:declarations dependsOn build,
so a #build HIT already implies unchanged declarations for every package.
On a cache-hit skip, post no comment. A turbo HIT is an inference that
nothing changed, not a break-check run, so a "no breaking changes" clearance
would overclaim (a revert to an older still-cached state HITs the cache yet
differs from base). The "no API changes" comment is only posted when detect
actually ran and found nothing, and break-check comments are now stamped with
the head SHA they ran on, so a comment left unrefreshed by a later skipped
push is recognizable as stale.
@changeset-bot

changeset-botBot commented Jun 2, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0313d87

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 2, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 3, 2026 1:53am

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jun 2, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8723

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8723

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8723

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8723

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8723

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8723

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8723

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8723

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8723

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8723

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8723

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8723

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8723

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8723

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8723

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8723

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8723

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8723

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8723

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8723

commit: 0313d87

@coderabbitai

coderabbitaiBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 1a209a51-746b-4f31-8156-9878e4025375

📥 Commits

Reviewing files that changed from the base of the PR and between afe20f5 and 0313d87.

📒 Files selected for processing (1)
  • .github/workflows/api-changes.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/api-changes.yml

📝 Walkthrough

Walkthrough

The workflow's check-api job now fetches the PR base commit earlier and adds a "Determine API surface changed" Node gate that compares turbo build:declarations task hashes between the PR head and a detached baseline worktree. If the gate reports no change, expensive baseline snapshot, install, build, and break-check detect steps are skipped. When detect runs, the PR comment step now receives HEAD_SHA, computes a short SHA, and appends a “Last ran on …” note; inline docs clarify skip vs detect-run behavior.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • clerk/javascript#8621: Both PRs modify .github/workflows/api-changes.yml to change how baseline declarations/snapshots are built and cached and when detect/reporting run.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately describes the main change: gating the api-changes workflow on turbo cache-hit signals for the #build task.
Description check✅ PassedThe description is directly related to the changeset, explaining the rationale and implementation details of the turbo cache-gating mechanism.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

@github-actions

github-actionsBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-06-03T01:56:20.740Z

Summary

MetricCount
Packages analyzed19
Packages with changes2
🔴 Breaking changes0
🟡 Non-breaking changes4
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.

Note
Break Check could not snapshot 3 subpaths; the diff below excludes them.

  • @clerk/astro ./env: Internal Error: Unable to determine module for: /home/runner/_work/javascript/javascript/packages/astro/env.d.ts You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/shared ./cookie: Internal Error: Unable to follow symbol for "Cookies" You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/testing ./cypress: Symbol not found for identifier: Cypress

@clerk/astro

Current version: 3.3.2
Recommended bump: MINOR → 3.4.0

Subpath ./client

🟡 Non-breaking Changes (3)

Modified: $authStore
 $authStore: nanostores.ReadableAtom<{
userId: string | null | undefined;
- user: _clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined;+ user: _clerk_shared_index_DcX8l9gl.ps | null | undefined;
sessionId: string | null | undefined;
- session: _clerk_shared__chunks_index_dZ_J_o0Z.Qo | null | undefined;+ session: _clerk_shared_index_DcX8l9gl.Qo | null | undefined;
sessionStatus: "active" | "pending" | undefined;
- sessionClaims: _clerk_shared__chunks_index_dZ_J_o0Z.to | null | undefined;- organization: _clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined;+ sessionClaims: _clerk_shared_index_DcX8l9gl.to | null | undefined;+ organization: _clerk_shared_index_DcX8l9gl.xo | null | undefined;
orgId: string | null | undefined;
orgRole: string | null | undefined;
orgSlug: string | null | undefined;
- orgPermissions: _clerk_shared__chunks_index_dZ_J_o0Z.gm<_clerk_shared__chunks_index_dZ_J_o0Z.co>[] | null | undefined;- actor: _clerk_shared__chunks_index_dZ_J_o0Z.Xa | null | undefined;+ orgPermissions: _clerk_shared_index_DcX8l9gl.gm<_clerk_shared_index_DcX8l9gl.co>[] | null | undefined;+ actor: _clerk_shared_index_DcX8l9gl.Xa | null | undefined;
factorVerificationAge: [number, number] | null;
}>

Static analyzer: Breaking change in variable $authStore: Type changed: $authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:!_clerk_shared__chunks_index_dZ_J_o0Z.p…$authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:import("@clerk/shared").UserResource|nu…

🤖 AI review (reclassified as non-breaking) (92%): The only change is the internal chunk alias used for the same @clerk/shared types (e.g. _clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps); the shorthand aliases (ps, Qo, to, xo, gm, co, Xa) map to the same underlying @clerk/shared public types (UserResource, SessionResource, etc.), so the resolved structural shape is identical and no consumer code is affected.

Modified: $organizationStore
- $organizationStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined>+ $organizationStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.xo | null | undefined>

Static analyzer: Breaking change in variable $organizationStore: Type changed: $organizationStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.xo:type|null|undefined>$organizationStore:import("nanostores").ReadableAtom<import("@clerk/shared").OrganizationResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same OrganizationResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.xo_clerk_shared_index_DcX8l9gl.xo) with no structural change.

Modified: $userStore
- $userStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined>+ $userStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.ps | null | undefined>

Static analyzer: Breaking change in variable $userStore: Type changed: $userStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.ps:type|null|undefined>$userStore:import("nanostores").ReadableAtom<import("@clerk/shared").UserResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same UserResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps) with no structural change.


@clerk/shared

Current version: 4.14.0
Recommended bump: MINOR → 4.15.0

Subpath ./apiUrlFromPublishableKey

🟡 Non-breaking Changes (1)

Modified: apiUrlFromPublishableKey
- apiUrlFromPublishableKey: (publishableKey: string) => "https://api.lclclerk.com" | "https://api.clerkstage.dev" | "https://api.clerk.com"+ apiUrlFromPublishableKey: (publishableKey: string) => "https://api.clerk.com" | "https://api.lclclerk.com" | "https://api.clerkstage.dev"

Static analyzer: Breaking change in function apiUrlFromPublishableKey: Return type changed: "https://api.lclclerk.com"|"https://api.clerkstage.dev"|"https://api.clerk.com""https://api.clerk.com"|"https://api.lclclerk.com"|"https://api.clerkstage.dev"

🤖 AI review (reclassified as non-breaking) (99%): The union members are identical; only their order changed, and TypeScript union types are unordered — the resolved set of possible values is exactly the same, so no well-typed consumer code is affected.


Report generated by Break Check

Last ran on 0313d87. Pushes that change no tracked declarations (no API surface change vs. base) are skipped and don't update this comment.

@jacekradko
jacekradkoforce-pushed the jacek/gate-api-changes-turbo-cache branch from afe20f5 to 0313d87CompareJune 3, 2026 01:52
@jacekradko
jacekradko merged commit acc327d into mainJun 3, 2026
45 checks passed
@jacekradko
jacekradko deleted the jacek/gate-api-changes-turbo-cache branch June 3, 2026 02:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jacekradko@wobsoriano
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' ci(repo): gate api-changes detect on turbo cache-hit signal by jacekradko · Pull Request #8723 · clerk/javascript · GitHub
Skip to content

ci(repo): gate api-changes detect on turbo cache-hit signal - #8723

Merged
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache
Jun 3, 2026
Merged

ci(repo): gate api-changes detect on turbo cache-hit signal#8723
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache

Conversation

@jacekradko

Copy link
Copy Markdown
Contributor

break-check's API Extractor pass runs over all 19 tracked packages on every PR the paths filter catches, including ones that only touched tests, docs, or impl with no public .d.ts change. This builds declarations with --summarize first and skips the snapshot/detect (and the baseline worktree rebuild) when every tracked package's #build was a turbo cache HIT.

Worth a close look: the gate keys on #build, not #build:declarations. The latter is going away as packages move declaration emission into the bundler (shared already has none, via tsdown), and a #build HIT already implies unchanged declarations since build:declarations dependsOn build. Keying on build:declarations would silently skip-blind those packages.

On a HIT we post nothing rather than a "no API changes" comment, since a HIT is an inference that nothing changed, not an actual run, and a clearance would overclaim (a revert to an older still-cached state HITs the cache but differs from base). That same gap means a recent revert can be silently skipped, acceptable here since the job is informational and we no longer emit a false green; comments are stamped with the head SHA they ran on so an unrefreshed one reads as stale. HIT/MISS only exists with the remote cache on Blacksmith, so the first run here is the real test.

Skip the break-check snapshot/detect work (and the baseline worktree
rebuild) when every tracked package's #build was a turbo cache HIT, since
identical build inputs mean the emitted declarations are unchanged. A MISS,
or any uncertainty (missing summary, cold cache, parse error), still runs
detect as before.
Keys on #build rather than #build:declarations so the gate stays correct as
packages migrate declaration emission into the bundler (e.g. shared via
tsdown has no build:declarations task); build:declarations dependsOn build,
so a #build HIT already implies unchanged declarations for every package.
On a cache-hit skip, post no comment. A turbo HIT is an inference that
nothing changed, not a break-check run, so a "no breaking changes" clearance
would overclaim (a revert to an older still-cached state HITs the cache yet
differs from base). The "no API changes" comment is only posted when detect
actually ran and found nothing, and break-check comments are now stamped with
the head SHA they ran on, so a comment left unrefreshed by a later skipped
push is recognizable as stale.
@changeset-bot

changeset-botBot commented Jun 2, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0313d87

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 2, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 3, 2026 1:53am

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jun 2, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8723

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8723

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8723

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8723

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8723

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8723

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8723

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8723

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8723

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8723

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8723

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8723

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8723

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8723

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8723

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8723

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8723

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8723

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8723

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8723

commit: 0313d87

@coderabbitai

coderabbitaiBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 1a209a51-746b-4f31-8156-9878e4025375

📥 Commits

Reviewing files that changed from the base of the PR and between afe20f5 and 0313d87.

📒 Files selected for processing (1)
  • .github/workflows/api-changes.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/api-changes.yml

📝 Walkthrough

Walkthrough

The workflow's check-api job now fetches the PR base commit earlier and adds a "Determine API surface changed" Node gate that compares turbo build:declarations task hashes between the PR head and a detached baseline worktree. If the gate reports no change, expensive baseline snapshot, install, build, and break-check detect steps are skipped. When detect runs, the PR comment step now receives HEAD_SHA, computes a short SHA, and appends a “Last ran on …” note; inline docs clarify skip vs detect-run behavior.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • clerk/javascript#8621: Both PRs modify .github/workflows/api-changes.yml to change how baseline declarations/snapshots are built and cached and when detect/reporting run.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately describes the main change: gating the api-changes workflow on turbo cache-hit signals for the #build task.
Description check✅ PassedThe description is directly related to the changeset, explaining the rationale and implementation details of the turbo cache-gating mechanism.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

@github-actions

github-actionsBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-06-03T01:56:20.740Z

Summary

MetricCount
Packages analyzed19
Packages with changes2
🔴 Breaking changes0
🟡 Non-breaking changes4
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.

Note
Break Check could not snapshot 3 subpaths; the diff below excludes them.

  • @clerk/astro ./env: Internal Error: Unable to determine module for: /home/runner/_work/javascript/javascript/packages/astro/env.d.ts You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/shared ./cookie: Internal Error: Unable to follow symbol for "Cookies" You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/testing ./cypress: Symbol not found for identifier: Cypress

@clerk/astro

Current version: 3.3.2
Recommended bump: MINOR → 3.4.0

Subpath ./client

🟡 Non-breaking Changes (3)

Modified: $authStore
 $authStore: nanostores.ReadableAtom<{
userId: string | null | undefined;
- user: _clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined;+ user: _clerk_shared_index_DcX8l9gl.ps | null | undefined;
sessionId: string | null | undefined;
- session: _clerk_shared__chunks_index_dZ_J_o0Z.Qo | null | undefined;+ session: _clerk_shared_index_DcX8l9gl.Qo | null | undefined;
sessionStatus: "active" | "pending" | undefined;
- sessionClaims: _clerk_shared__chunks_index_dZ_J_o0Z.to | null | undefined;- organization: _clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined;+ sessionClaims: _clerk_shared_index_DcX8l9gl.to | null | undefined;+ organization: _clerk_shared_index_DcX8l9gl.xo | null | undefined;
orgId: string | null | undefined;
orgRole: string | null | undefined;
orgSlug: string | null | undefined;
- orgPermissions: _clerk_shared__chunks_index_dZ_J_o0Z.gm<_clerk_shared__chunks_index_dZ_J_o0Z.co>[] | null | undefined;- actor: _clerk_shared__chunks_index_dZ_J_o0Z.Xa | null | undefined;+ orgPermissions: _clerk_shared_index_DcX8l9gl.gm<_clerk_shared_index_DcX8l9gl.co>[] | null | undefined;+ actor: _clerk_shared_index_DcX8l9gl.Xa | null | undefined;
factorVerificationAge: [number, number] | null;
}>

Static analyzer: Breaking change in variable $authStore: Type changed: $authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:!_clerk_shared__chunks_index_dZ_J_o0Z.p…$authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:import("@clerk/shared").UserResource|nu…

🤖 AI review (reclassified as non-breaking) (92%): The only change is the internal chunk alias used for the same @clerk/shared types (e.g. _clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps); the shorthand aliases (ps, Qo, to, xo, gm, co, Xa) map to the same underlying @clerk/shared public types (UserResource, SessionResource, etc.), so the resolved structural shape is identical and no consumer code is affected.

Modified: $organizationStore
- $organizationStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined>+ $organizationStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.xo | null | undefined>

Static analyzer: Breaking change in variable $organizationStore: Type changed: $organizationStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.xo:type|null|undefined>$organizationStore:import("nanostores").ReadableAtom<import("@clerk/shared").OrganizationResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same OrganizationResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.xo_clerk_shared_index_DcX8l9gl.xo) with no structural change.

Modified: $userStore
- $userStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined>+ $userStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.ps | null | undefined>

Static analyzer: Breaking change in variable $userStore: Type changed: $userStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.ps:type|null|undefined>$userStore:import("nanostores").ReadableAtom<import("@clerk/shared").UserResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same UserResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps) with no structural change.


@clerk/shared

Current version: 4.14.0
Recommended bump: MINOR → 4.15.0

Subpath ./apiUrlFromPublishableKey

🟡 Non-breaking Changes (1)

Modified: apiUrlFromPublishableKey
- apiUrlFromPublishableKey: (publishableKey: string) => "https://api.lclclerk.com" | "https://api.clerkstage.dev" | "https://api.clerk.com"+ apiUrlFromPublishableKey: (publishableKey: string) => "https://api.clerk.com" | "https://api.lclclerk.com" | "https://api.clerkstage.dev"

Static analyzer: Breaking change in function apiUrlFromPublishableKey: Return type changed: "https://api.lclclerk.com"|"https://api.clerkstage.dev"|"https://api.clerk.com""https://api.clerk.com"|"https://api.lclclerk.com"|"https://api.clerkstage.dev"

🤖 AI review (reclassified as non-breaking) (99%): The union members are identical; only their order changed, and TypeScript union types are unordered — the resolved set of possible values is exactly the same, so no well-typed consumer code is affected.


Report generated by Break Check

Last ran on 0313d87. Pushes that change no tracked declarations (no API surface change vs. base) are skipped and don't update this comment.

@jacekradko
jacekradkoforce-pushed the jacek/gate-api-changes-turbo-cache branch from afe20f5 to 0313d87CompareJune 3, 2026 01:52
@jacekradko
jacekradko merged commit acc327d into mainJun 3, 2026
45 checks passed
@jacekradko
jacekradko deleted the jacek/gate-api-changes-turbo-cache branch June 3, 2026 02:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jacekradko@wobsoriano
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ci(repo): gate api-changes detect on turbo cache-hit signal by jacekradko · Pull Request #8723 · clerk/javascript · GitHub
Skip to content

ci(repo): gate api-changes detect on turbo cache-hit signal - #8723

Merged
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache
Jun 3, 2026
Merged

ci(repo): gate api-changes detect on turbo cache-hit signal#8723
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache

Conversation

@jacekradko

Copy link
Copy Markdown
Contributor

break-check's API Extractor pass runs over all 19 tracked packages on every PR the paths filter catches, including ones that only touched tests, docs, or impl with no public .d.ts change. This builds declarations with --summarize first and skips the snapshot/detect (and the baseline worktree rebuild) when every tracked package's #build was a turbo cache HIT.

Worth a close look: the gate keys on #build, not #build:declarations. The latter is going away as packages move declaration emission into the bundler (shared already has none, via tsdown), and a #build HIT already implies unchanged declarations since build:declarations dependsOn build. Keying on build:declarations would silently skip-blind those packages.

On a HIT we post nothing rather than a "no API changes" comment, since a HIT is an inference that nothing changed, not an actual run, and a clearance would overclaim (a revert to an older still-cached state HITs the cache but differs from base). That same gap means a recent revert can be silently skipped, acceptable here since the job is informational and we no longer emit a false green; comments are stamped with the head SHA they ran on so an unrefreshed one reads as stale. HIT/MISS only exists with the remote cache on Blacksmith, so the first run here is the real test.

Skip the break-check snapshot/detect work (and the baseline worktree
rebuild) when every tracked package's #build was a turbo cache HIT, since
identical build inputs mean the emitted declarations are unchanged. A MISS,
or any uncertainty (missing summary, cold cache, parse error), still runs
detect as before.
Keys on #build rather than #build:declarations so the gate stays correct as
packages migrate declaration emission into the bundler (e.g. shared via
tsdown has no build:declarations task); build:declarations dependsOn build,
so a #build HIT already implies unchanged declarations for every package.
On a cache-hit skip, post no comment. A turbo HIT is an inference that
nothing changed, not a break-check run, so a "no breaking changes" clearance
would overclaim (a revert to an older still-cached state HITs the cache yet
differs from base). The "no API changes" comment is only posted when detect
actually ran and found nothing, and break-check comments are now stamped with
the head SHA they ran on, so a comment left unrefreshed by a later skipped
push is recognizable as stale.
@changeset-bot

changeset-botBot commented Jun 2, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0313d87

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 2, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 3, 2026 1:53am

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jun 2, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8723

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8723

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8723

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8723

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8723

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8723

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8723

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8723

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8723

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8723

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8723

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8723

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8723

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8723

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8723

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8723

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8723

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8723

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8723

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8723

commit: 0313d87

@coderabbitai

coderabbitaiBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 1a209a51-746b-4f31-8156-9878e4025375

📥 Commits

Reviewing files that changed from the base of the PR and between afe20f5 and 0313d87.

📒 Files selected for processing (1)
  • .github/workflows/api-changes.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/api-changes.yml

📝 Walkthrough

Walkthrough

The workflow's check-api job now fetches the PR base commit earlier and adds a "Determine API surface changed" Node gate that compares turbo build:declarations task hashes between the PR head and a detached baseline worktree. If the gate reports no change, expensive baseline snapshot, install, build, and break-check detect steps are skipped. When detect runs, the PR comment step now receives HEAD_SHA, computes a short SHA, and appends a “Last ran on …” note; inline docs clarify skip vs detect-run behavior.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • clerk/javascript#8621: Both PRs modify .github/workflows/api-changes.yml to change how baseline declarations/snapshots are built and cached and when detect/reporting run.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately describes the main change: gating the api-changes workflow on turbo cache-hit signals for the #build task.
Description check✅ PassedThe description is directly related to the changeset, explaining the rationale and implementation details of the turbo cache-gating mechanism.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

@github-actions

github-actionsBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-06-03T01:56:20.740Z

Summary

MetricCount
Packages analyzed19
Packages with changes2
🔴 Breaking changes0
🟡 Non-breaking changes4
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.

Note
Break Check could not snapshot 3 subpaths; the diff below excludes them.

  • @clerk/astro ./env: Internal Error: Unable to determine module for: /home/runner/_work/javascript/javascript/packages/astro/env.d.ts You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/shared ./cookie: Internal Error: Unable to follow symbol for "Cookies" You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/testing ./cypress: Symbol not found for identifier: Cypress

@clerk/astro

Current version: 3.3.2
Recommended bump: MINOR → 3.4.0

Subpath ./client

🟡 Non-breaking Changes (3)

Modified: $authStore
 $authStore: nanostores.ReadableAtom<{
userId: string | null | undefined;
- user: _clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined;+ user: _clerk_shared_index_DcX8l9gl.ps | null | undefined;
sessionId: string | null | undefined;
- session: _clerk_shared__chunks_index_dZ_J_o0Z.Qo | null | undefined;+ session: _clerk_shared_index_DcX8l9gl.Qo | null | undefined;
sessionStatus: "active" | "pending" | undefined;
- sessionClaims: _clerk_shared__chunks_index_dZ_J_o0Z.to | null | undefined;- organization: _clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined;+ sessionClaims: _clerk_shared_index_DcX8l9gl.to | null | undefined;+ organization: _clerk_shared_index_DcX8l9gl.xo | null | undefined;
orgId: string | null | undefined;
orgRole: string | null | undefined;
orgSlug: string | null | undefined;
- orgPermissions: _clerk_shared__chunks_index_dZ_J_o0Z.gm<_clerk_shared__chunks_index_dZ_J_o0Z.co>[] | null | undefined;- actor: _clerk_shared__chunks_index_dZ_J_o0Z.Xa | null | undefined;+ orgPermissions: _clerk_shared_index_DcX8l9gl.gm<_clerk_shared_index_DcX8l9gl.co>[] | null | undefined;+ actor: _clerk_shared_index_DcX8l9gl.Xa | null | undefined;
factorVerificationAge: [number, number] | null;
}>

Static analyzer: Breaking change in variable $authStore: Type changed: $authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:!_clerk_shared__chunks_index_dZ_J_o0Z.p…$authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:import("@clerk/shared").UserResource|nu…

🤖 AI review (reclassified as non-breaking) (92%): The only change is the internal chunk alias used for the same @clerk/shared types (e.g. _clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps); the shorthand aliases (ps, Qo, to, xo, gm, co, Xa) map to the same underlying @clerk/shared public types (UserResource, SessionResource, etc.), so the resolved structural shape is identical and no consumer code is affected.

Modified: $organizationStore
- $organizationStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined>+ $organizationStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.xo | null | undefined>

Static analyzer: Breaking change in variable $organizationStore: Type changed: $organizationStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.xo:type|null|undefined>$organizationStore:import("nanostores").ReadableAtom<import("@clerk/shared").OrganizationResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same OrganizationResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.xo_clerk_shared_index_DcX8l9gl.xo) with no structural change.

Modified: $userStore
- $userStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined>+ $userStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.ps | null | undefined>

Static analyzer: Breaking change in variable $userStore: Type changed: $userStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.ps:type|null|undefined>$userStore:import("nanostores").ReadableAtom<import("@clerk/shared").UserResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same UserResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps) with no structural change.


@clerk/shared

Current version: 4.14.0
Recommended bump: MINOR → 4.15.0

Subpath ./apiUrlFromPublishableKey

🟡 Non-breaking Changes (1)

Modified: apiUrlFromPublishableKey
- apiUrlFromPublishableKey: (publishableKey: string) => "https://api.lclclerk.com" | "https://api.clerkstage.dev" | "https://api.clerk.com"+ apiUrlFromPublishableKey: (publishableKey: string) => "https://api.clerk.com" | "https://api.lclclerk.com" | "https://api.clerkstage.dev"

Static analyzer: Breaking change in function apiUrlFromPublishableKey: Return type changed: "https://api.lclclerk.com"|"https://api.clerkstage.dev"|"https://api.clerk.com""https://api.clerk.com"|"https://api.lclclerk.com"|"https://api.clerkstage.dev"

🤖 AI review (reclassified as non-breaking) (99%): The union members are identical; only their order changed, and TypeScript union types are unordered — the resolved set of possible values is exactly the same, so no well-typed consumer code is affected.


Report generated by Break Check

Last ran on 0313d87. Pushes that change no tracked declarations (no API surface change vs. base) are skipped and don't update this comment.

@jacekradko
jacekradkoforce-pushed the jacek/gate-api-changes-turbo-cache branch from afe20f5 to 0313d87CompareJune 3, 2026 01:52
@jacekradko
jacekradko merged commit acc327d into mainJun 3, 2026
45 checks passed
@jacekradko
jacekradko deleted the jacek/gate-api-changes-turbo-cache branch June 3, 2026 02:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jacekradko@wobsoriano
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ci(repo): gate api-changes detect on turbo cache-hit signal by jacekradko · Pull Request #8723 · clerk/javascript · GitHub
Skip to content

ci(repo): gate api-changes detect on turbo cache-hit signal - #8723

Merged
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache
Jun 3, 2026
Merged

ci(repo): gate api-changes detect on turbo cache-hit signal#8723
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache

Conversation

@jacekradko

Copy link
Copy Markdown
Contributor

break-check's API Extractor pass runs over all 19 tracked packages on every PR the paths filter catches, including ones that only touched tests, docs, or impl with no public .d.ts change. This builds declarations with --summarize first and skips the snapshot/detect (and the baseline worktree rebuild) when every tracked package's #build was a turbo cache HIT.

Worth a close look: the gate keys on #build, not #build:declarations. The latter is going away as packages move declaration emission into the bundler (shared already has none, via tsdown), and a #build HIT already implies unchanged declarations since build:declarations dependsOn build. Keying on build:declarations would silently skip-blind those packages.

On a HIT we post nothing rather than a "no API changes" comment, since a HIT is an inference that nothing changed, not an actual run, and a clearance would overclaim (a revert to an older still-cached state HITs the cache but differs from base). That same gap means a recent revert can be silently skipped, acceptable here since the job is informational and we no longer emit a false green; comments are stamped with the head SHA they ran on so an unrefreshed one reads as stale. HIT/MISS only exists with the remote cache on Blacksmith, so the first run here is the real test.

Skip the break-check snapshot/detect work (and the baseline worktree
rebuild) when every tracked package's #build was a turbo cache HIT, since
identical build inputs mean the emitted declarations are unchanged. A MISS,
or any uncertainty (missing summary, cold cache, parse error), still runs
detect as before.
Keys on #build rather than #build:declarations so the gate stays correct as
packages migrate declaration emission into the bundler (e.g. shared via
tsdown has no build:declarations task); build:declarations dependsOn build,
so a #build HIT already implies unchanged declarations for every package.
On a cache-hit skip, post no comment. A turbo HIT is an inference that
nothing changed, not a break-check run, so a "no breaking changes" clearance
would overclaim (a revert to an older still-cached state HITs the cache yet
differs from base). The "no API changes" comment is only posted when detect
actually ran and found nothing, and break-check comments are now stamped with
the head SHA they ran on, so a comment left unrefreshed by a later skipped
push is recognizable as stale.
@changeset-bot

changeset-botBot commented Jun 2, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0313d87

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 2, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 3, 2026 1:53am

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jun 2, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8723

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8723

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8723

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8723

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8723

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8723

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8723

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8723

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8723

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8723

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8723

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8723

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8723

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8723

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8723

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8723

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8723

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8723

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8723

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8723

commit: 0313d87

@coderabbitai

coderabbitaiBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 1a209a51-746b-4f31-8156-9878e4025375

📥 Commits

Reviewing files that changed from the base of the PR and between afe20f5 and 0313d87.

📒 Files selected for processing (1)
  • .github/workflows/api-changes.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/api-changes.yml

📝 Walkthrough

Walkthrough

The workflow's check-api job now fetches the PR base commit earlier and adds a "Determine API surface changed" Node gate that compares turbo build:declarations task hashes between the PR head and a detached baseline worktree. If the gate reports no change, expensive baseline snapshot, install, build, and break-check detect steps are skipped. When detect runs, the PR comment step now receives HEAD_SHA, computes a short SHA, and appends a “Last ran on …” note; inline docs clarify skip vs detect-run behavior.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • clerk/javascript#8621: Both PRs modify .github/workflows/api-changes.yml to change how baseline declarations/snapshots are built and cached and when detect/reporting run.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately describes the main change: gating the api-changes workflow on turbo cache-hit signals for the #build task.
Description check✅ PassedThe description is directly related to the changeset, explaining the rationale and implementation details of the turbo cache-gating mechanism.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

@github-actions

github-actionsBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-06-03T01:56:20.740Z

Summary

MetricCount
Packages analyzed19
Packages with changes2
🔴 Breaking changes0
🟡 Non-breaking changes4
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.

Note
Break Check could not snapshot 3 subpaths; the diff below excludes them.

  • @clerk/astro ./env: Internal Error: Unable to determine module for: /home/runner/_work/javascript/javascript/packages/astro/env.d.ts You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/shared ./cookie: Internal Error: Unable to follow symbol for "Cookies" You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/testing ./cypress: Symbol not found for identifier: Cypress

@clerk/astro

Current version: 3.3.2
Recommended bump: MINOR → 3.4.0

Subpath ./client

🟡 Non-breaking Changes (3)

Modified: $authStore
 $authStore: nanostores.ReadableAtom<{
userId: string | null | undefined;
- user: _clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined;+ user: _clerk_shared_index_DcX8l9gl.ps | null | undefined;
sessionId: string | null | undefined;
- session: _clerk_shared__chunks_index_dZ_J_o0Z.Qo | null | undefined;+ session: _clerk_shared_index_DcX8l9gl.Qo | null | undefined;
sessionStatus: "active" | "pending" | undefined;
- sessionClaims: _clerk_shared__chunks_index_dZ_J_o0Z.to | null | undefined;- organization: _clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined;+ sessionClaims: _clerk_shared_index_DcX8l9gl.to | null | undefined;+ organization: _clerk_shared_index_DcX8l9gl.xo | null | undefined;
orgId: string | null | undefined;
orgRole: string | null | undefined;
orgSlug: string | null | undefined;
- orgPermissions: _clerk_shared__chunks_index_dZ_J_o0Z.gm<_clerk_shared__chunks_index_dZ_J_o0Z.co>[] | null | undefined;- actor: _clerk_shared__chunks_index_dZ_J_o0Z.Xa | null | undefined;+ orgPermissions: _clerk_shared_index_DcX8l9gl.gm<_clerk_shared_index_DcX8l9gl.co>[] | null | undefined;+ actor: _clerk_shared_index_DcX8l9gl.Xa | null | undefined;
factorVerificationAge: [number, number] | null;
}>

Static analyzer: Breaking change in variable $authStore: Type changed: $authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:!_clerk_shared__chunks_index_dZ_J_o0Z.p…$authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:import("@clerk/shared").UserResource|nu…

🤖 AI review (reclassified as non-breaking) (92%): The only change is the internal chunk alias used for the same @clerk/shared types (e.g. _clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps); the shorthand aliases (ps, Qo, to, xo, gm, co, Xa) map to the same underlying @clerk/shared public types (UserResource, SessionResource, etc.), so the resolved structural shape is identical and no consumer code is affected.

Modified: $organizationStore
- $organizationStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined>+ $organizationStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.xo | null | undefined>

Static analyzer: Breaking change in variable $organizationStore: Type changed: $organizationStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.xo:type|null|undefined>$organizationStore:import("nanostores").ReadableAtom<import("@clerk/shared").OrganizationResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same OrganizationResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.xo_clerk_shared_index_DcX8l9gl.xo) with no structural change.

Modified: $userStore
- $userStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined>+ $userStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.ps | null | undefined>

Static analyzer: Breaking change in variable $userStore: Type changed: $userStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.ps:type|null|undefined>$userStore:import("nanostores").ReadableAtom<import("@clerk/shared").UserResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same UserResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps) with no structural change.


@clerk/shared

Current version: 4.14.0
Recommended bump: MINOR → 4.15.0

Subpath ./apiUrlFromPublishableKey

🟡 Non-breaking Changes (1)

Modified: apiUrlFromPublishableKey
- apiUrlFromPublishableKey: (publishableKey: string) => "https://api.lclclerk.com" | "https://api.clerkstage.dev" | "https://api.clerk.com"+ apiUrlFromPublishableKey: (publishableKey: string) => "https://api.clerk.com" | "https://api.lclclerk.com" | "https://api.clerkstage.dev"

Static analyzer: Breaking change in function apiUrlFromPublishableKey: Return type changed: "https://api.lclclerk.com"|"https://api.clerkstage.dev"|"https://api.clerk.com""https://api.clerk.com"|"https://api.lclclerk.com"|"https://api.clerkstage.dev"

🤖 AI review (reclassified as non-breaking) (99%): The union members are identical; only their order changed, and TypeScript union types are unordered — the resolved set of possible values is exactly the same, so no well-typed consumer code is affected.


Report generated by Break Check

Last ran on 0313d87. Pushes that change no tracked declarations (no API surface change vs. base) are skipped and don't update this comment.

@jacekradko
jacekradkoforce-pushed the jacek/gate-api-changes-turbo-cache branch from afe20f5 to 0313d87CompareJune 3, 2026 01:52
@jacekradko
jacekradko merged commit acc327d into mainJun 3, 2026
45 checks passed
@jacekradko
jacekradko deleted the jacek/gate-api-changes-turbo-cache branch June 3, 2026 02:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jacekradko@wobsoriano
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); ci(repo): gate api-changes detect on turbo cache-hit signal by jacekradko · Pull Request #8723 · clerk/javascript · GitHub
Skip to content

ci(repo): gate api-changes detect on turbo cache-hit signal - #8723

Merged
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache
Jun 3, 2026
Merged

ci(repo): gate api-changes detect on turbo cache-hit signal#8723
jacekradko merged 3 commits into
mainfrom
jacek/gate-api-changes-turbo-cache

Conversation

@jacekradko

Copy link
Copy Markdown
Contributor

break-check's API Extractor pass runs over all 19 tracked packages on every PR the paths filter catches, including ones that only touched tests, docs, or impl with no public .d.ts change. This builds declarations with --summarize first and skips the snapshot/detect (and the baseline worktree rebuild) when every tracked package's #build was a turbo cache HIT.

Worth a close look: the gate keys on #build, not #build:declarations. The latter is going away as packages move declaration emission into the bundler (shared already has none, via tsdown), and a #build HIT already implies unchanged declarations since build:declarations dependsOn build. Keying on build:declarations would silently skip-blind those packages.

On a HIT we post nothing rather than a "no API changes" comment, since a HIT is an inference that nothing changed, not an actual run, and a clearance would overclaim (a revert to an older still-cached state HITs the cache but differs from base). That same gap means a recent revert can be silently skipped, acceptable here since the job is informational and we no longer emit a false green; comments are stamped with the head SHA they ran on so an unrefreshed one reads as stale. HIT/MISS only exists with the remote cache on Blacksmith, so the first run here is the real test.

Skip the break-check snapshot/detect work (and the baseline worktree
rebuild) when every tracked package's #build was a turbo cache HIT, since
identical build inputs mean the emitted declarations are unchanged. A MISS,
or any uncertainty (missing summary, cold cache, parse error), still runs
detect as before.
Keys on #build rather than #build:declarations so the gate stays correct as
packages migrate declaration emission into the bundler (e.g. shared via
tsdown has no build:declarations task); build:declarations dependsOn build,
so a #build HIT already implies unchanged declarations for every package.
On a cache-hit skip, post no comment. A turbo HIT is an inference that
nothing changed, not a break-check run, so a "no breaking changes" clearance
would overclaim (a revert to an older still-cached state HITs the cache yet
differs from base). The "no API changes" comment is only posted when detect
actually ran and found nothing, and break-check comments are now stamped with
the head SHA they ran on, so a comment left unrefreshed by a later skipped
push is recognizable as stale.
@changeset-bot

changeset-botBot commented Jun 2, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0313d87

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 2, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 3, 2026 1:53am

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jun 2, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8723

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8723

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8723

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8723

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8723

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8723

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8723

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8723

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8723

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8723

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8723

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8723

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8723

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8723

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8723

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8723

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8723

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8723

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8723

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8723

commit: 0313d87

@coderabbitai

coderabbitaiBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: 1a209a51-746b-4f31-8156-9878e4025375

📥 Commits

Reviewing files that changed from the base of the PR and between afe20f5 and 0313d87.

📒 Files selected for processing (1)
  • .github/workflows/api-changes.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/api-changes.yml

📝 Walkthrough

Walkthrough

The workflow's check-api job now fetches the PR base commit earlier and adds a "Determine API surface changed" Node gate that compares turbo build:declarations task hashes between the PR head and a detached baseline worktree. If the gate reports no change, expensive baseline snapshot, install, build, and break-check detect steps are skipped. When detect runs, the PR comment step now receives HEAD_SHA, computes a short SHA, and appends a “Last ran on …” note; inline docs clarify skip vs detect-run behavior.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • clerk/javascript#8621: Both PRs modify .github/workflows/api-changes.yml to change how baseline declarations/snapshots are built and cached and when detect/reporting run.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately describes the main change: gating the api-changes workflow on turbo cache-hit signals for the #build task.
Description check✅ PassedThe description is directly related to the changeset, explaining the rationale and implementation details of the turbo cache-gating mechanism.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

@github-actions

github-actionsBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-06-03T01:56:20.740Z

Summary

MetricCount
Packages analyzed19
Packages with changes2
🔴 Breaking changes0
🟡 Non-breaking changes4
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.

Note
Break Check could not snapshot 3 subpaths; the diff below excludes them.

  • @clerk/astro ./env: Internal Error: Unable to determine module for: /home/runner/_work/javascript/javascript/packages/astro/env.d.ts You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/shared ./cookie: Internal Error: Unable to follow symbol for "Cookies" You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/testing ./cypress: Symbol not found for identifier: Cypress

@clerk/astro

Current version: 3.3.2
Recommended bump: MINOR → 3.4.0

Subpath ./client

🟡 Non-breaking Changes (3)

Modified: $authStore
 $authStore: nanostores.ReadableAtom<{
userId: string | null | undefined;
- user: _clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined;+ user: _clerk_shared_index_DcX8l9gl.ps | null | undefined;
sessionId: string | null | undefined;
- session: _clerk_shared__chunks_index_dZ_J_o0Z.Qo | null | undefined;+ session: _clerk_shared_index_DcX8l9gl.Qo | null | undefined;
sessionStatus: "active" | "pending" | undefined;
- sessionClaims: _clerk_shared__chunks_index_dZ_J_o0Z.to | null | undefined;- organization: _clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined;+ sessionClaims: _clerk_shared_index_DcX8l9gl.to | null | undefined;+ organization: _clerk_shared_index_DcX8l9gl.xo | null | undefined;
orgId: string | null | undefined;
orgRole: string | null | undefined;
orgSlug: string | null | undefined;
- orgPermissions: _clerk_shared__chunks_index_dZ_J_o0Z.gm<_clerk_shared__chunks_index_dZ_J_o0Z.co>[] | null | undefined;- actor: _clerk_shared__chunks_index_dZ_J_o0Z.Xa | null | undefined;+ orgPermissions: _clerk_shared_index_DcX8l9gl.gm<_clerk_shared_index_DcX8l9gl.co>[] | null | undefined;+ actor: _clerk_shared_index_DcX8l9gl.Xa | null | undefined;
factorVerificationAge: [number, number] | null;
}>

Static analyzer: Breaking change in variable $authStore: Type changed: $authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:!_clerk_shared__chunks_index_dZ_J_o0Z.p…$authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:import("@clerk/shared").UserResource|nu…

🤖 AI review (reclassified as non-breaking) (92%): The only change is the internal chunk alias used for the same @clerk/shared types (e.g. _clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps); the shorthand aliases (ps, Qo, to, xo, gm, co, Xa) map to the same underlying @clerk/shared public types (UserResource, SessionResource, etc.), so the resolved structural shape is identical and no consumer code is affected.

Modified: $organizationStore
- $organizationStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.xo | null | undefined>+ $organizationStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.xo | null | undefined>

Static analyzer: Breaking change in variable $organizationStore: Type changed: $organizationStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.xo:type|null|undefined>$organizationStore:import("nanostores").ReadableAtom<import("@clerk/shared").OrganizationResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same OrganizationResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.xo_clerk_shared_index_DcX8l9gl.xo) with no structural change.

Modified: $userStore
- $userStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_dZ_J_o0Z.ps | null | undefined>+ $userStore: nanostores.ReadableAtom<_clerk_shared_index_DcX8l9gl.ps | null | undefined>

Static analyzer: Breaking change in variable $userStore: Type changed: $userStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_dZ_J_o0Z.ps:type|null|undefined>$userStore:import("nanostores").ReadableAtom<import("@clerk/shared").UserResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The type parameter of the ReadableAtom resolves to the same UserResource from @clerk/shared; the difference is purely an internal chunk path alias rename (_clerk_shared__chunks_index_dZ_J_o0Z.ps_clerk_shared_index_DcX8l9gl.ps) with no structural change.


@clerk/shared

Current version: 4.14.0
Recommended bump: MINOR → 4.15.0

Subpath ./apiUrlFromPublishableKey

🟡 Non-breaking Changes (1)

Modified: apiUrlFromPublishableKey
- apiUrlFromPublishableKey: (publishableKey: string) => "https://api.lclclerk.com" | "https://api.clerkstage.dev" | "https://api.clerk.com"+ apiUrlFromPublishableKey: (publishableKey: string) => "https://api.clerk.com" | "https://api.lclclerk.com" | "https://api.clerkstage.dev"

Static analyzer: Breaking change in function apiUrlFromPublishableKey: Return type changed: "https://api.lclclerk.com"|"https://api.clerkstage.dev"|"https://api.clerk.com""https://api.clerk.com"|"https://api.lclclerk.com"|"https://api.clerkstage.dev"

🤖 AI review (reclassified as non-breaking) (99%): The union members are identical; only their order changed, and TypeScript union types are unordered — the resolved set of possible values is exactly the same, so no well-typed consumer code is affected.


Report generated by Break Check

Last ran on 0313d87. Pushes that change no tracked declarations (no API surface change vs. base) are skipped and don't update this comment.

@jacekradko
jacekradkoforce-pushed the jacek/gate-api-changes-turbo-cache branch from afe20f5 to 0313d87CompareJune 3, 2026 01:52
@jacekradko
jacekradko merged commit acc327d into mainJun 3, 2026
45 checks passed
@jacekradko
jacekradko deleted the jacek/gate-api-changes-turbo-cache branch June 3, 2026 02:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jacekradko@wobsoriano