Skip to content

👷 Announce releases on Bluesky#6959

Merged
dubzzz merged 14 commits into
mainfrom
claude/add-bluesky-release-action-bwFRU
Jun 15, 2026
Merged

👷 Announce releases on Bluesky#6959
dubzzz merged 14 commits into
mainfrom
claude/add-bluesky-release-action-bwFRU

Conversation

@dubzzz

@dubzzz dubzzz commented May 8, 2026

Copy link
Copy Markdown
Owner

Description

Adds a new GitHub Actions workflow that automatically publishes a short
Bluesky post each time a release is published, linking back to the
GitHub Release discussion that softprops/action-gh-release already
creates under the announcements category. The post text follows the
shape 🚀 New release: <label>\n\nRead the announcement and changelog: <url>,
with <label> derived from the git tag (v3.5.0fast-check v3.5.0,
vitest/v1.2.0@fast-check/vitest v1.2.0), so it works uniformly
for fast-check and the six sibling packages. The workflow skips when
the release has no linked discussion. Two new repository secrets are
required: BLUESKY_IDENTIFIER (the bot's Bluesky handle) and
BLUESKY_APP_PASSWORD (an App Password generated in Bluesky settings);
without them the job fails loudly so the issue surfaces in CI rather
than silently dropping announcements.

The workflow is a standalone file triggered on release: published
rather than an extra step appended to each of the seven
publish_package_* jobs in build-status.yml — this keeps the social
announcement decoupled from the publishing pipeline, fires exactly once
per release event, and reuses release.discussion_url straight from
the webhook payload (no extra GitHub API call). The post script lives
in .github/workflows/scripts/post-bluesky.mjs (ESM with top-level
await, matching the existing .cjs helpers in that folder) and uses
the official @atproto/api client (CredentialSession + Agent +
RichText) — RichText.detectFacets handles URL facet construction,
which is otherwise tricky because Bluesky requires UTF-8 byte offsets
rather than character offsets. @atproto/api is added to root
devDependencies so it's locked in pnpm-lock.yaml, and the workflow
runs pnpm install --frozen-lockfile before invoking the script,
matching the project's existing supply-chain hardening (frozen
lockfile, pinned action SHAs). Impact level: patch — CI-only addition,
no behavioral change to any published package. Scope is single-concern
(workflow + its supporting script + the new dev dependency it pulls
in). No automated tests are added: the surface is a thin glue script
against the Bluesky API and GitHub release events, neither of which is
practical to test in this repo's vitest suite; the script was instead
smoke-tested locally to confirm env-var validation, tag-to-label
formatting for all seven packages, ESM loading of @atproto/api, and
that the credential session reaches the AT Protocol endpoint.

Checklist

Don't delete this checklist and make sure you do the following before opening the PR

  • I have a full understanding of every line in this PR — whether the code was hand-written, AI-generated, copied from external sources or produced by any other tool
  • I flagged the impact of my change (minor / patch / major) either by running pnpm run bump or by following the instructions from the changeset bot
  • I kept this PR focused on a single concern and did not bundle unrelated changes
  • I followed the gitmoji specification for the name of the PR, including the package scope (e.g. 🐛(vitest) Something...) when the change targets a package other than fast-check
  • I added relevant tests and they would have failed without my PR (when applicable)

claude added 3 commits May 7, 2026 21:26
Add a workflow that triggers on `release: published` and posts a short
announcement on Bluesky linking to the GitHub Release discussion that
softprops/action-gh-release auto-creates under the `announcements`
category. Skips when the release has no linked discussion. Requires
`BLUESKY_IDENTIFIER` and `BLUESKY_APP_PASSWORD` repository secrets.

https://claude.ai/code/session_01586yR9jMEa8y3yT8RmkXcQ
Replace the hand-rolled `fetch` + manual UTF-8 byte-offset facet logic
with the official `@atproto/api` client. RichText.detectFacets handles
URL detection, and AtpAgent.login/post wrap the AT Protocol calls.

Adds `@atproto/api` to root devDependencies (locked in pnpm-lock.yaml)
and installs it in the workflow with `pnpm install --frozen-lockfile`.

https://claude.ai/code/session_01586yR9jMEa8y3yT8RmkXcQ
Address review feedback on the Bluesky announcer script:

- Convert from CommonJS (.cjs) to ESM (.mjs) and replace `main()` with
  top-level await — unhandled rejections naturally exit non-zero.
- Drop the unused `BLUESKY_SERVICE` env var, hard-code bsky.social.
- Build a friendly release label from the tag itself (`v3.5.0` →
  `fast-check v3.5.0`, `vitest/v1.2.0` → `@fast-check/vitest v1.2.0`)
  instead of picking between RELEASE_NAME and RELEASE_TAG.
- Use explicit `=== undefined || === ''` checks via a `requireEnv`
  helper rather than truthiness coercion.

https://claude.ai/code/session_01586yR9jMEa8y3yT8RmkXcQ
@changeset-bot

changeset-bot Bot commented May 8, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 0adec13

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

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

Click here to learn what changesets are, and how to add one.

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

@socket-security

socket-security Bot commented May 8, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Added@​atproto/​api@​0.19.199910010099100

View full report

@pkg-pr-new

pkg-pr-new Bot commented May 8, 2026

Copy link
Copy Markdown
@fast-check/ava

npm i https://pkg.pr.new/@fast-check/ava@6959

fast-check

npm i https://pkg.pr.new/fast-check@6959

@fast-check/jest

npm i https://pkg.pr.new/@fast-check/jest@6959

@fast-check/packaged

npm i https://pkg.pr.new/@fast-check/packaged@6959

@fast-check/poisoning

npm i https://pkg.pr.new/@fast-check/poisoning@6959

@fast-check/vitest

npm i https://pkg.pr.new/@fast-check/vitest@6959

@fast-check/worker

npm i https://pkg.pr.new/@fast-check/worker@6959

commit: 0adec13

claude added 2 commits May 11, 2026 21:51
Switch from `AtpAgent` + `agent.login()` to `CredentialSession` +
`new Agent(session)`. The README now flags `AtpAgent.login` as legacy
and points new code at the `SessionManager`-based pattern.

https://claude.ai/code/session_01586yR9jMEa8y3yT8RmkXcQ
- Drop the file-level header comment and the JSDoc blocks; the names
  and shape of the script speak for themselves.
- Move helper functions to the bottom of the file under a `// Helpers`
  banner, leaving the main flow as the first thing a reader sees.
  Function declarations hoist, so this works under top-level await.

https://claude.ai/code/session_01586yR9jMEa8y3yT8RmkXcQ
@codecov

codecov Bot commented May 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 94.89%. Comparing base (e38b6fb) to head (0adec13).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #6959   +/-   ##
=======================================
  Coverage   94.89%   94.89%           
=======================================
  Files         212      212           
  Lines        5951     5951           
  Branches     1564     1565    +1     
=======================================
  Hits         5647     5647           
  Misses        296      296           
  Partials        8        8           
Flag Coverage Δ
tests 94.89% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Comment thread .github/workflows/scripts/post-bluesky.mjs Outdated
Comment thread .github/workflows/scripts/post-bluesky.mjs
Comment thread .github/workflows/announce-release-bluesky.yml Fixed
@github-actions

github-actions Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

⏱️ Benchmark Results

Click to expand

 RUN  v4.1.8 /home/runner/work/fast-check/fast-check


 ✓  fast-check  test/bench/arbitraries.bench.ts > generate 26249ms
     name                                                      hz      min      max     mean      p75      p99     p995     p999      rme  samples
   · boolean()                                           9,239.99   0.0844   1.5416   0.1082   0.1263   0.2004   0.2181   0.4035   ±0.94%     4620  [0.94x] ⇓
     boolean()                                           9,831.21   0.0817   0.8494   0.1017   0.1103   0.1834   0.2047   0.5059   ±0.82%     4916  (baseline)
   · integer()                                          10,625.82   0.0878   0.6491   0.0941   0.0939   0.1125   0.1216   0.2668   ±0.38%     5313  [0.92x] ⇓
     integer()                                          11,611.61   0.0736   0.9927   0.0861   0.0814   0.1562   0.1669   0.1857   ±0.64%     5806  (baseline)
   · maxSafeInteger()                                    7,717.90   0.1233   0.5590   0.1296   0.1280   0.1751   0.1847   0.5131   ±0.41%     3859  [1.03x] ⇑
     maxSafeInteger()                                    7,475.37   0.1235   0.6268   0.1338   0.1294   0.1940   0.1979   0.4865   ±0.51%     3738  (baseline)
   · bigInt()                                            1,361.16   0.6924   1.1271   0.7347   0.7360   0.9807   0.9958   1.1271   ±0.41%      681  [1.04x] ⇑
     bigInt()                                            1,309.15   0.6919   1.4792   0.7639   0.7418   1.1768   1.2052   1.4792   ±1.06%      655  (baseline)
   · float()                                             5,672.51   0.1618   0.6777   0.1763   0.1818   0.2155   0.2383   0.5128   ±0.44%     2837  [1.01x] ⇑
     float()                                             5,622.23   0.1647   0.6951   0.1779   0.1830   0.2175   0.2324   0.5410   ±0.47%     2812  (baseline)
   · double()                                            1,859.29   0.4384   6.4403   0.5378   0.4691   5.2032   5.4266   6.4403   ±6.50%      936  [1.04x] ⇑
     double()                                            1,791.00   0.4531   6.4831   0.5583   0.4828   5.6987   5.8838   6.4831   ±6.76%      896  (baseline)
   · date()                                              3,710.57   0.2385   5.4664   0.2695   0.2526   0.2812   0.3081   5.4390   ±5.64%     1856  [1.04x] ⇑
     date()                                              3,569.77   0.2492   5.9978   0.2801   0.2631   0.3816   0.5004   5.6802   ±5.61%     1785  (baseline)
   · string()                                              891.35   0.8004  10.5789   1.1219   0.8889   8.6311   9.1531  10.5789  ±10.24%      451  [1.03x] ⇑
     string()                                              865.96   0.8234  10.6259   1.1548   0.9037   8.8360   9.4129  10.6259  ±10.80%      433  (baseline)
   · string({ maxLength: 100, size: 'max' })               166.69   5.0539   9.3165   5.9990   5.5658   9.3165   9.3165   9.3165   ±4.90%       84  [1.04x] ⇑
     string({ maxLength: 100, size: 'max' })               159.64   5.1616   9.9704   6.2640   5.7890   9.9704   9.9704   9.9704   ±5.33%       80  (baseline)
   · string({ unit: 'grapheme' })                          581.85   1.2750  14.2096   1.7187   1.3655  13.9670  14.0450  14.2096  ±12.86%      291  [1.02x] ⇑
     string({ unit: 'grapheme' })                          567.95   1.3030  14.7497   1.7607   1.3949  13.8878  13.9290  14.7497  ±13.16%      284  (baseline)
   · base64String()                                        879.26   0.8431  13.3367   1.1373   0.8900   8.4301   8.5404  13.3367  ±10.76%      443  [1.04x] ⇑
     base64String()                                        847.83   0.8846  12.1378   1.1795   0.9353   8.5735   8.9167  12.1378  ±10.44%      424  (baseline)
   · array(integer())                                    1,623.17   0.4401   7.7339   0.6161   0.4782   7.3205   7.4050   7.7339  ±10.14%      812  [1.05x] ⇑
     array(integer())                                    1,543.96   0.4589  11.7902   0.6477   0.5033   7.4643   7.5468  11.7902  ±10.80%      773  (baseline)
   · array(integer(), { maxLength: 100, size: 'max' })     311.19   2.5226   7.4310   3.2135   2.8071   7.3351   7.4310   7.4310   ±6.68%      157  [1.12x] ⇑
     array(integer(), { maxLength: 100, size: 'max' })     278.59   2.7722   8.7936   3.5895   3.3420   8.7517   8.7936   8.7936   ±7.15%      140  (baseline)
   · uniqueArray(integer())                              1,077.49   0.6554  11.7339   0.9281   0.7304   7.1804   9.5970  11.7339  ±10.19%      539  [0.99x] ⇓
     uniqueArray(integer())                              1,089.28   0.6739  22.5135   0.9180   0.7275   6.6324   7.4522  22.5135  ±12.14%      545  (baseline)
   · set(integer())                                        945.63   0.8292   7.1770   1.0575   0.8890   6.9744   7.0133   7.1770   ±8.81%      473  [0.98x] ⇓
     set(integer())                                        966.30   0.8446   6.0552   1.0349   0.9119   5.8824   5.9499   6.0552   ±6.84%      484  (baseline)
   · tuple(integer())                                    5,581.11   0.1641   0.7060   0.1792   0.1730   0.2911   0.5309   0.6399   ±0.80%     2792  [1.01x] ⇑
     tuple(integer())                                    5,532.34   0.1704   0.7755   0.1808   0.1777   0.2170   0.5663   0.6105   ±0.74%     2767  (baseline)
   · record({ a: integer() })                            1,393.74   0.3543  24.9305   0.7175   0.4050  16.0530  16.9979  24.9305  ±23.00%      701  [0.86x] ⇓
     record({ a: integer() })                            1,620.92   0.3664  14.5270   0.6169   0.3855  12.7374  12.8517  14.5270  ±18.00%      811  (baseline)
   · dictionary(string(), integer())                      79.2861   8.0327  33.1332  12.6126  12.7590  33.1332  33.1332  33.1332  ±17.40%       40  [0.95x] ⇓
     dictionary(string(), integer())                      83.5685   8.3700  32.4305  11.9662  14.6757  32.4305  32.4305  32.4305  ±14.65%       42  (baseline)
   · map(string(), integer())                              121.78   5.2818  20.4681   8.2116   5.7511  20.4681  20.4681  20.4681  ±17.19%       61  [1.01x] ⇑
     map(string(), integer())                              120.87   5.3772  21.6252   8.2733   6.4610  21.6252  21.6252  21.6252  ±15.25%       61  (baseline)
   · constant(1)                                        29,536.30   0.0321   0.4029   0.0339   0.0333   0.0464   0.0527   0.2817   ±0.51%    14769  [1.00x] ⇑
     constant(1)                                        29,400.73   0.0320   0.5351   0.0340   0.0335   0.0454   0.0508   0.3773   ±0.69%    14701  (baseline)
   · constantFrom(1, 2)                                 13,323.87   0.0713   0.5364   0.0751   0.0742   0.0884   0.0945   0.3674   ±0.40%     6662  [1.00x] ⇑
     constantFrom(1, 2)                                 13,303.62   0.0713   0.6231   0.0752   0.0741   0.0899   0.1011   0.4342   ±0.53%     6652  (baseline)
   · oneof(integer(), integer())                         5,585.72   0.1698   0.6486   0.1790   0.1782   0.2078   0.2205   0.5341   ±0.40%     2793  [1.04x] ⇑
     oneof(integer(), integer())                         5,361.74   0.1783   0.7716   0.1865   0.1851   0.2140   0.2297   0.5765   ±0.48%     2681  (baseline)
   · oneof({ weight, arbitrary }, ...)                   5,645.46   0.1669   0.6725   0.1771   0.1762   0.1965   0.2140   0.5177   ±0.41%     2823  [1.04x] ⇑
     oneof({ weight, arbitrary }, ...)                   5,440.65   0.1758   0.7437   0.1838   0.1822   0.2126   0.2499   0.5797   ±0.46%     2721  (baseline)
   · option(integer())                                   5,983.87   0.1583   0.5965   0.1671   0.1656   0.1883   0.2423   0.4923   ±0.44%     2992  [1.06x] ⇑
     option(integer())                                   5,630.92   0.1689   0.7400   0.1776   0.1757   0.2022   0.2190   0.6130   ±0.57%     2816  (baseline)
   · subarray([1, 2, 3, 4, 5])                           2,531.60   0.3649   0.7616   0.3950   0.3970   0.6352   0.6518   0.7599   ±0.48%     1266  [1.02x] ⇑
     subarray([1, 2, 3, 4, 5])                           2,473.80   0.3684   0.9770   0.4042   0.4041   0.7501   0.7832   0.8842   ±0.68%     1237  (baseline)
   · letrec(tree)                                          670.41   0.9140  14.2774   1.4916   1.0593  14.1351  14.2052  14.2774  ±17.10%      341  [1.00x] ⇓
     letrec(tree)                                          671.84   0.9196  14.9274   1.4885   1.0504  14.3650  14.6886  14.9274  ±17.38%      343  (baseline)
   · memo(tree)                                            702.62   0.8845  13.9966   1.4233   0.9877  13.6873  13.9641  13.9966  ±16.49%      352  [1.06x] ⇑
     memo(tree)                                            665.77   0.8706  14.5986   1.5020   1.0060  14.1450  14.1958  14.5986  ±17.31%      333  (baseline)
   · anything()                                           61.5128  11.2251  27.7879  16.2568  24.0624  27.7879  27.7879  27.7879  ±14.04%       31  [1.01x] ⇑
     anything()                                           61.1896  11.2587  38.3211  16.3426  23.9474  38.3211  38.3211  38.3211  ±15.41%       31  (baseline)
   · json()                                               59.9843  11.9523  25.7756  16.6710  24.3168  25.7756  25.7756  25.7756  ±12.72%       30  [1.05x] ⇑
     json()                                               57.1965  12.4281  27.3556  17.4836  25.5536  27.3556  27.3556  27.3556  ±12.79%       30  (baseline)
   · entityGraph(employee -> manager? and team)           10.3817  86.6925   117.30  96.3232   101.49   117.30   117.30   117.30   ±8.14%       10  [1.02x] ⇑
     entityGraph(employee -> manager? and team)           10.1351  86.4362   120.85  98.6668   107.13   120.85   120.85   120.85   ±8.63%       10  (baseline)
   · emailAddress()                                       69.0157  10.2380  22.9543  14.4895  21.3192  22.9543  22.9543  22.9543  ±12.74%       36  [1.01x] ⇑
     emailAddress()                                       68.6656  10.4411  22.4006  14.5633  21.8819  22.4006  22.4006  22.4006  ±12.93%       35  (baseline)
   · webUrl()                                              118.19   5.3777  21.0387   8.4609   5.6359  21.0387  21.0387  21.0387  ±16.61%       61  [0.97x] ⇓
     webUrl()                                              121.27   5.3718  19.4705   8.2459   5.6534  19.4705  19.4705  19.4705  ±16.39%       61  (baseline)
   · ipV4()                                              1,146.94   0.6466  12.7732   0.8719   0.6760  12.1001  12.1961  12.7732  ±14.05%      574  [1.05x] ⇑
     ipV4()                                              1,089.08   0.6631  13.4001   0.9182   0.6884  12.3547  12.6268  13.4001  ±14.05%      545  (baseline)
   · ipV6()                                                176.69   3.7038  19.1260   5.6596   3.9295  19.1260  19.1260  19.1260  ±14.73%       89  [0.99x] ⇓
     ipV6()                                                178.89   3.7644  15.7555   5.5902   3.9641  15.7555  15.7555  15.7555  ±13.87%       90  (baseline)
   · uuid()                                                552.89   1.2711  15.7920   1.8087   1.3029  15.7359  15.7757  15.7920  ±16.02%      277  [1.00x] ⇓
     uuid()                                                555.52   1.2843  18.1134   1.8001   1.3104  16.2949  16.3111  18.1134  ±17.52%      278  (baseline)
   · stringMatching(/^abc$/)                            27,793.15   0.0340   0.4666   0.0360   0.0353   0.0558   0.0603   0.2909   ±0.55%    13897  [1.06x] ⇑
     stringMatching(/^abc$/)                            26,182.93   0.0358   0.6168   0.0382   0.0375   0.0575   0.0632   0.3409   ±0.63%    13092  (baseline)
   · stringMatching(/^[a-zA-Z0-9]+$/)                      503.25   1.4390  12.7784   1.9871   1.5254  12.5495  12.6469  12.7784  ±14.01%      252  [1.04x] ⇑
     stringMatching(/^[a-zA-Z0-9]+$/)                      482.73   1.4746  14.3567   2.0715   1.5764  12.8437  13.6034  14.3567  ±14.33%      242  (baseline)
   · mixedCase(string())                                   511.26   1.6320   9.4645   1.9559   1.7139   6.5637   6.8012   9.4645   ±6.52%      256  [1.03x] ⇑
     mixedCase(string())                                   496.96   1.6469  13.3024   2.0122   1.7363   7.4082   7.4338  13.3024   ±7.93%      249  (baseline)
   · integer().map(value+1)                              8,014.88   0.1165   0.6784   0.1248   0.1248   0.1437   0.1542   0.5475   ±0.51%     4008  [1.15x] ⇑
     integer().map(value+1)                              6,959.88   0.1206   1.4445   0.1437   0.1317   0.3923   0.4123   0.6094   ±1.35%     3480  (baseline)
   · integer().chain(integer())                          3,834.08   0.2468   0.7712   0.2608   0.2619   0.3312   0.6378   0.7548   ±0.66%     1918  [1.03x] ⇑
     integer().chain(integer())                          3,711.36   0.2554   0.8826   0.2694   0.2705   0.4222   0.6848   0.8406   ±0.74%     1856  (baseline)
   · integer().filter(true)                              9,241.33   0.1008   0.7781   0.1082   0.1080   0.1274   0.1338   0.1604   ±0.47%     4621  [1.02x] ⇑
     integer().filter(true)                              9,061.49   0.1042   0.7289   0.1104   0.1099   0.1249   0.1360   0.1761   ±0.45%     4531  (baseline)

 ✓  fast-check  test/bench/runners.bench.ts > runner 2428ms
     name                                                     hz     min     max    mean     p75     p99    p995    p999     rme  samples
   · assert on sync predicate not returning anything   12,663.40  0.0762  0.3244  0.0790  0.0770  0.1341  0.1647  0.1964  ±0.34%     6332  [1.00x] ⇑
     assert on sync predicate not returning anything   12,605.58  0.0762  0.3163  0.0793  0.0774  0.1406  0.1831  0.2020  ±0.37%     6303  (baseline)
   · assert on sync predicate returning true           12,650.17  0.0760  0.3161  0.0791  0.0769  0.1509  0.1672  0.2517  ±0.39%     6326  [1.01x] ⇑
     assert on sync predicate returning true           12,561.06  0.0761  0.3409  0.0796  0.0773  0.1567  0.1887  0.2446  ±0.44%     6281  (baseline)
   · assert on async predicate not returning anything   8,494.52  0.1117  0.3339  0.1177  0.1142  0.1947  0.2004  0.2376  ±0.40%     4248  [0.99x] ⇓
     assert on async predicate not returning anything   8,549.91  0.1103  0.3377  0.1170  0.1136  0.1993  0.2058  0.2323  ±0.41%     4275  (baseline)
   · check on sync predicate not returning anything    12,679.37  0.0761  0.3168  0.0789  0.0770  0.1426  0.1618  0.2060  ±0.35%     6340  [1.01x] ⇑
     check on sync predicate not returning anything    12,603.73  0.0762  0.3553  0.0793  0.0773  0.1571  0.1748  0.2825  ±0.42%     6302  (baseline)

 BENCH  Summary

   fast-check  constant(1) - test/bench/arbitraries.bench.ts > generate
    1.06x faster than stringMatching(/^abc$/)
    2.22x faster than constantFrom(1, 2)
    2.78x faster than integer()
    3.20x faster than integer().filter(true)
    3.20x faster than boolean()
    3.69x faster than integer().map(value+1)
    3.83x faster than maxSafeInteger()
    4.94x faster than option(integer())
    5.21x faster than float()
    5.23x faster than oneof({ weight, arbitrary }, ...)
    5.29x faster than oneof(integer(), integer())
    5.29x faster than tuple(integer())
    7.70x faster than integer().chain(integer())
    7.96x faster than date()
    11.67x faster than subarray([1, 2, 3, 4, 5])
    15.89x faster than double()
    18.20x faster than array(integer())
    21.19x faster than record({ a: integer() })
    21.70x faster than bigInt()
    25.75x faster than ipV4()
    27.41x faster than uniqueArray(integer())
    31.23x faster than set(integer())
    33.14x faster than string()
    33.59x faster than base64String()
    42.04x faster than memo(tree)
    44.06x faster than letrec(tree)
    50.76x faster than string({ unit: 'grapheme' })
    53.42x faster than uuid()
    57.77x faster than mixedCase(string())
    58.69x faster than stringMatching(/^[a-zA-Z0-9]+$/)
    94.91x faster than array(integer(), { maxLength: 100, size: 'max' })
    167.16x faster than ipV6()
    177.19x faster than string({ maxLength: 100, size: 'max' })
    242.54x faster than map(string(), integer())
    249.90x faster than webUrl()
    372.53x faster than dictionary(string(), integer())
    427.97x faster than emailAddress()
    480.17x faster than anything()
    492.40x faster than json()
    2845.03x faster than entityGraph(employee -> manager? and team)

   fast-check  check on sync predicate not returning anything - test/bench/runners.bench.ts > runner
    1.00x faster than assert on sync predicate not returning anything
    1.00x faster than assert on sync predicate returning true
    1.49x faster than assert on async predicate not returning anything

Benchmark report written to /home/runner/work/fast-check/fast-check/benchmark.json

Commit: 0adec13 (merge: 6bf9a06)

Comment thread .github/workflows/announce-release-bluesky.yml Fixed
@dubzzz
dubzzz enabled auto-merge (squash) June 15, 2026 07:59
@dubzzz
dubzzz merged commit 904cdd5 into main Jun 15, 2026
52 checks passed
@dubzzz
dubzzz deleted the claude/add-bluesky-release-action-bwFRU branch June 15, 2026 08:05
dubzzz added a commit that referenced this pull request Jul 8, 2026
## Description

> AI-agent disclosure: this PR was authored by an automated agent
(Claude Code) and has not been line-by-line reviewed by a human before
submission.

Releases of fast-check and its sibling packages will now actually be
announced on Bluesky: the "Announce Release on Bluesky" workflow added
in #6959 has never fired once. The announcement now goes out when the
maintainer dispatches the Create Release workflow, right after the draft
release is created and the tag pushed, and the wording is adjusted to
match that timing — `🚀 New release on its way: fast-check v4.9.0`,
followed by a link to the release notes. The linked release page goes
live a few minutes later, once the publish pipeline flips the draft to
published. Dry runs of Create Release skip the post.

Why it never fired: the workflow listened to `release: published`, but
releases are flipped from draft to published by
`softprops/action-gh-release` inside the publish jobs using the default
`GITHUB_TOKEN`, and GitHub suppresses events created with that token
from triggering other workflows. Its `discussion_url != ''` guard was
dead too, since #6975 dropped discussion creation on releases.

Design: `announce-release-bluesky.yml` becomes a reusable
`workflow_call` taking the release tag, invoked from a new
`announce-release` job in `create-release.yml` — which now re-exports
the tag computed by its changelog-extract step as a job output.
Alternatives considered and rejected: publishing releases with a PAT so
`release: published` fires (a new long-lived secret to manage), or
wiring the announcement into the seven publish jobs of
`build-status.yml` (couples the social post to the publish pipeline).
Anchoring on the human-dispatched Create Release needs no new secret and
leaves `build-status.yml` untouched. The Bluesky secrets are declared
and passed explicitly to the called workflow rather than via `secrets:
inherit`, so only the three `BLUESKY_*` secrets are in its reach.

Impact level: patch, CI-only — no published package changes, hence no
changeset. The PR stays focused on a single concern: making the Bluesky
announcement flow fire. No automated tests were added: the change is
workflow glue around the existing, already smoke-tested
`post-bluesky.mjs`; YAML validity and the tag→URL/label mapping
(including slashed tags like `packaged/v0.7.1`) were verified locally.

<!-- Add any additional context here -->

## Checklist

— _Don't delete this checklist and make sure you do the following before
opening the PR_

- [ ] I have a full understanding of every line in this PR — whether the
code was hand-written, AI-generated, copied from external sources or
produced by any other tool
- [ ] I flagged the impact of my change (minor / patch / major) either
by running `pnpm run bump` or by following the instructions from the
changeset bot
- [ ] I kept this PR focused on a single concern and did not bundle
unrelated changes
- [ ] I followed the [gitmoji](https://gitmoji.dev/) specification for
the name of the PR, including the package scope (e.g. `🐛(vitest)
Something...`) when the change targets a package other than `fast-check`
- [ ] I added relevant tests and they would have failed without my PR
(when applicable)

<!-- PRs not checking all the boxes may take longer before being
reviewed -->
<!-- More about contributing at
https://github.com/dubzzz/fast-check/blob/main/CONTRIBUTING.md -->

---------

Co-authored-by: Claude <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants