Skip to content

CI job independence#59

Merged
frostney merged 5 commits into
mainfrom
cursor/ci-job-independence-9f67
Mar 10, 2026
Merged

CI job independence#59
frostney merged 5 commits into
mainfrom
cursor/ci-job-independence-9f67

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Mar 10, 2026

Update CI workflows to ensure all jobs and matrix runs complete even if some fail.


Open in Web Open in Cursor 

Summary by CodeRabbit

  • Chores
    • CI updated to avoid failing fast across matrix jobs so all builds/tests complete before reporting failures.
    • Matrix adjusted to add Windows x86 coverage and selectively exclude Windows x64 in specific scenarios to better reflect supported variants.
    • Release packaging and artifact handling refined to include Windows x86 entries and gracefully skip missing x64 artifacts.

- Add fail-fast: false to all matrix strategies so one platform
  failure doesn't cancel other platforms
- Add if: !cancelled() to test, wasm-test, benchmark, and examples
  jobs so they run even if build had partial matrix failures
- Update artifacts and release jobs to explicitly check all upstream
  results via needs.*.result == 'success'
- Add if: !cancelled() to PR workflow downstream jobs (test, wasm-test,
  benchmark) for the same independence
- benchmark-comment requires benchmark success explicitly

Co-authored-by: Johannes Stein <frostney@users.noreply.github.com>
@cursor
Copy link
Copy Markdown

cursor Bot commented Mar 10, 2026

Cursor Agent can help with this pull request. Just @cursor in comments and I'll start working on changes in this branch.
Learn more about Cursor Agents

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 10, 2026

Warning

Rate limit exceeded

@cursor[bot] has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 6 minutes and 44 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: f87fca4d-9c1a-402d-877d-89eed2996208

📥 Commits

Reviewing files that changed from the base of the PR and between 1ee1067 and 6aac6f3.

📒 Files selected for processing (3)
  • .github/workflows/ci.yml
  • AGENTS.md
  • docs/build-system.md
📝 Walkthrough

Walkthrough

CI and PR GitHub Actions matrices were adjusted to disable fail-fast and reorganize Windows matrix entries from x64 as a primary OS to explicit x86 includes; packaging and artifact handling were updated accordingly to reference Windows x86 and skip missing x64 artifacts.

Changes

Cohort / File(s) Summary
CI workflow
.github/workflows/ci.yml
Added fail-fast: false to matrix strategies; reorganized platform matrices with exclude and include entries to remove Windows x64 from primary OS lists and add Windows x86 variants; updated packaging platform label from windows-latest-x64 to windows-latest-x86; expanded artifact include lists and added logic to skip missing Windows x64 artifacts.
PR workflow
.github/workflows/pr.yml
Added fail-fast: false to the strategy matrix for build and benchmark jobs so matrix cells do not short-circuit on failure.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 I hopped through YAML, tidy and spry,

Fail-fast off — let tests all try,
Windows swapped to x86 in the pack,
Missing x64? We just skip back.
A tiny thump for CI on the fly 🥕✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'CI job independence' directly describes the main change: enabling CI workflows to complete all matrix runs independently by setting fail-fast to false.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch cursor/ci-job-independence-9f67

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Mar 10, 2026

Benchmark Results

254 benchmarks (no baseline)

arraybuffer.js — 14 benchmarks
Benchmark Interpreted Bytecode
create ArrayBuffer(0) 423,440 142,791
create ArrayBuffer(64) 408,921 143,658
create ArrayBuffer(1024) 323,049 126,129
create ArrayBuffer(8192) 139,287 81,912
slice full buffer (64 bytes) 507,076 378,913
slice half buffer (512 of 1024 bytes) 432,202 332,382
slice with negative indices 441,417 366,257
slice empty range 506,292 376,393
byteLength access 1,472,982 1,061,736
Symbol.toStringTag access 1,150,621 541,265
ArrayBuffer.isView 721,744 468,504
clone ArrayBuffer(64) 393,886 313,789
clone ArrayBuffer(1024) 293,083 251,499
clone ArrayBuffer inside object 263,047 156,001
arrays.js — 19 benchmarks
Benchmark Interpreted Bytecode
Array.from length 100 13,407 13,053
Array.from 10 elements 222,882 160,356
Array.of 10 elements 311,453 221,393
spread into new array 331,907 548,248
map over 50 elements 27,396 22,224
filter over 50 elements 22,888 21,600
reduce sum 50 elements 26,240 19,052
forEach over 50 elements 22,982 21,796
find in 50 elements 34,856 27,842
sort 20 elements 11,684 3,365
flat nested array 115,034 274,951
flatMap 70,928 182,922
map inside map (5x5) 20,711 67,595
filter inside map (5x10) 15,501 13,370
reduce inside map (5x10) 18,787 13,696
forEach inside forEach (5x10) 15,613 14,893
find inside some (10x10) 13,158 10,778
map+filter chain nested (5x20) 5,173 4,408
reduce flatten (10x5) 37,569 4,924
async-await.js — 6 benchmarks
Benchmark Interpreted Bytecode
single await 330,316 245,787
multiple awaits 152,367 101,209
await non-Promise value 719,912 694,407
await with try/catch 322,943 234,601
await Promise.all 47,900 40,930
nested async function call 162,959 176,703
classes.js — 31 benchmarks
Benchmark Interpreted Bytecode
simple class new 112,182 335,457
class with defaults 89,816 236,197
50 instances via Array.from 5,495 6,241
instance method call 56,663 155,262
static method call 88,760 352,216
single-level inheritance 44,208 141,976
two-level inheritance 38,222 122,587
private field access 56,059 162,043
private methods 60,568 208,065
getter/setter access 63,278 169,029
class decorator (identity) 76,986 52,171
class decorator (wrapping) 45,108 36,194
identity method decorator 55,220 42,686
wrapping method decorator 46,117 39,109
stacked method decorators (x3) 32,636 27,713
identity field decorator 61,040 45,433
field initializer decorator 51,343 38,757
getter decorator (identity) 53,117 41,115
setter decorator (identity) 43,694 35,440
static method decorator 57,086 63,112
static field decorator 67,069 66,095
private method decorator 45,789 37,110
private field decorator 49,933 38,916
plain auto-accessor (no decorator) 87,255 53,293
auto-accessor with decorator 49,323 37,385
decorator writing metadata 41,165 42,391
static getter read 97,505 386,978
static getter/setter pair 75,322 205,524
inherited static getter 53,913 261,586
inherited static setter 58,386 206,275
inherited static getter with this binding 48,930 152,575
closures.js — 11 benchmarks
Benchmark Interpreted Bytecode
closure over single variable 118,292 572,105
closure over multiple variables 113,182 381,275
nested closures 110,993 509,464
function as argument 88,571 472,621
function returning function 110,410 552,458
compose two functions 64,978 333,508
fn.call 143,713 129,924
fn.apply 107,856 85,843
fn.bind 130,711 139,909
recursive sum to 50 11,414 37,766
recursive tree traversal 18,905 57,687
collections.js — 12 benchmarks
Benchmark Interpreted Bytecode
add 50 elements 7,325 5,912
has lookup (50 elements) 93,569 90,330
delete elements 49,038 38,244
forEach iteration 15,575 15,455
spread to array 29,422 31,333
deduplicate array 40,618 31,988
set 50 entries 5,318 5,657
get lookup (50 entries) 93,344 387,621
has check 138,890 161,909
delete entries 49,070 36,222
forEach iteration 15,395 15,907
keys/values/entries 7,811 8,717
destructuring.js — 22 benchmarks
Benchmark Interpreted Bytecode
simple array destructuring 373,382 612,165
with rest element 261,551 457,018
with defaults 393,398 657,195
skip elements 393,155 661,072
nested array destructuring 161,317 349,762
swap variables 475,877 945,482
simple object destructuring 286,600 512,553
with defaults 341,090 320,940
with renaming 289,956 554,942
nested object destructuring 133,341 249,972
rest properties 170,346 232,747
object parameter 84,253 185,243
array parameter 113,621 316,314
mixed destructuring in map 33,564 34,756
forEach with array destructuring 62,869 134,371
map with array destructuring 62,465 165,805
filter with array destructuring 65,408 188,513
reduce with array destructuring 70,189 164,490
map with object destructuring 71,824 68,118
map with nested destructuring 60,425 57,002
map with rest in destructuring 35,229 42,308
map with defaults in destructuring 54,133 37,032
fibonacci.js — 8 benchmarks
Benchmark Interpreted Bytecode
recursive fib(15) 307 1,085
recursive fib(20) 28 99
recursive fib(15) typed 310 1,432
recursive fib(20) typed 28 129
iterative fib(20) via reduce 11,455 18,450
iterator fib(20) 8,910 10,256
iterator fib(20) via Iterator.from + take 8,490 9,582
iterator fib(20) last value via reduce 7,239 7,479
for-of.js — 7 benchmarks
Benchmark Interpreted Bytecode
for...of with 10-element array 44,123
for...of with 100-element array 5,190
for...of with string (10 chars) 34,805
for...of with Set (10 elements) 46,891
for...of with Map entries (10 entries) 28,863 10,759
for...of with destructuring 39,300
for-await-of with sync array 42,766
iterators.js — 20 benchmarks
Benchmark Interpreted Bytecode
Iterator.from({next}).toArray() — 20 elements 10,989 10,633
Iterator.from({next}).toArray() — 50 elements 4,701
spread pre-wrapped iterator — 20 elements 10,927 10,615
Iterator.from({next}).forEach — 50 elements 3,453
Iterator.from({next}).reduce — 50 elements 3,417 3,764
wrap array iterator 55,356
wrap plain {next()} object 7,299 7,824
map + toArray (50 elements) 3,049 3,506
filter + toArray (50 elements) 3,206 3,489
take(10) + toArray (50 element source) 15,920 16,070
drop(40) + toArray (50 element source) 4,423 5,605
chained map + filter + take (100 element source) 5,236 6,271
some + every (50 elements) 1,975 2,273
find (50 elements) 4,293 5,279
array.values().map().filter().toArray() 3,617 4,563
array.values().take(5).toArray() 59,938 60,841
array.values().drop(45).toArray() 15,736 23,461
map.entries() chained helpers 5,731 2,627
set.values() chained helpers 8,730 11,039
string iterator map + toArray 6,939 10,069
json.js — 20 benchmarks
Benchmark Interpreted Bytecode
parse simple object 155,928
parse nested object 96,345
parse array of objects 51,140
parse large flat object 47,350
parse mixed types 70,622
stringify simple object 148,619
stringify nested object 77,656
stringify array of objects 39,107
stringify mixed types 67,897
reviver doubles numbers 42,002
reviver filters properties 37,274
reviver on nested object 50,225
reviver on array 28,794
replacer function doubles numbers 45,299
replacer function excludes properties 57,224
array replacer (allowlist) 102,951
stringify with 2-space indent 76,201
stringify with tab indent 79,837
parse then stringify 45,081
stringify then parse 27,708
jsx.jsx — 21 benchmarks
Benchmark Interpreted Bytecode
simple element 190,983
self-closing element 192,630
element with string attribute 156,066
element with multiple attributes 134,045
element with expression attribute 148,763
text child 178,712
expression child 173,252 525,509
mixed text and expression 169,474 467,070
nested elements (3 levels) 67,084 198,473
sibling children 49,939 157,200
component element 122,282 379,191
component with children 80,097 245,663
dotted component 109,220 323,970
empty fragment 181,952 638,478
fragment with children 49,187 182,341
spread attributes 97,722 110,967
spread with overrides 84,483 81,079
shorthand props 135,487 407,116
nav bar structure 23,710 77,992
card component tree 27,540 85,317
10 list items via Array.from 12,535 23,277
numbers.js — 11 benchmarks
Benchmark Interpreted Bytecode
integer arithmetic 513,437
floating point arithmetic 528,537
number coercion 177,652
toFixed 97,589
toString 144,017
valueOf 223,490
toPrecision 133,563
Number.isNaN 292,234
Number.isFinite 273,828
Number.isInteger 274,241
Number.parseInt and parseFloat 228,292
objects.js — 7 benchmarks
Benchmark Interpreted Bytecode
create simple object 397,294
create nested object 199,434
create 50 objects via Array.from 8,015
property read 557,828
Object.keys 262,080
Object.entries 88,656
spread operator 170,194
promises.js — 12 benchmarks
Benchmark Interpreted Bytecode
Promise.resolve(value) 447,678
new Promise(resolve => resolve(value)) 164,319
Promise.reject(reason) 447,577
resolve + then (1 handler) 139,247
resolve + then chain (3 deep) 55,979
resolve + then chain (10 deep) 18,273
reject + catch + then 75,651
resolve + finally + then 66,176
Promise.all (5 resolved) 26,305 22,729
Promise.race (5 resolved) 27,774 24,739
Promise.allSettled (5 mixed) 22,093 19,790
Promise.any (5 mixed) 25,188 22,385
strings.js — 11 benchmarks
Benchmark Interpreted Bytecode
string concatenation 354,687
template literal 386,755
string repeat 368,031
split and join 129,809
indexOf and includes 153,887
toUpperCase and toLowerCase 229,410
slice and substring 144,874
trim operations 166,515
replace and replaceAll 194,923
startsWith and endsWith 125,964
padStart and padEnd 185,732
typed-arrays.js — 22 benchmarks
Benchmark Interpreted Bytecode
new Int32Array(0) 268,047 120,426
new Int32Array(100) 243,820 116,076
new Int32Array(1000) 154,972 88,080
new Float64Array(100) 234,743 113,673
Int32Array.from([...]) 162,834 61,820
Int32Array.of(1, 2, 3, 4, 5) 274,698 231,738
sequential write 100 elements 3,345 6,283
sequential read 100 elements 3,329 6,041
Float64Array write 100 elements 3,021 6,226
fill(42) 45,328 43,702
slice() 184,369 186,657
map(x => x * 2) 7,260 7,758
filter(x => x > 50) 7,479 7,992
reduce (sum) 7,238 6,928
sort() 170,890 151,818
indexOf() 414,399 360,394
reverse() 313,574 275,089
create view over existing buffer 341,444 135,000
subarray() 410,454 355,608
set() from array 537,733 256,345
for-of loop 4,469 8,751
spread into array 15,843 20,879

Measured on ubuntu-latest x64. Changes within ±7% are considered insignificant.

Revert the overly-aggressive !cancelled() conditions added in the
previous commit. The build job must fully succeed before any downstream
job runs. The test/wasm-test/benchmark/examples jobs were already
independent of each other (they only depend on build, not on each
other). The fail-fast: false on matrix strategies is the key change
that ensures one platform failure within a job doesn't cancel siblings.

Co-authored-by: Johannes Stein <frostney@users.noreply.github.com>
@frostney frostney marked this pull request as ready for review March 10, 2026 09:30
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 315-317: The CI configuration lists platforms in the "Package
releases" job using "windows-latest-x86" which contradicts docs and
FPC_TARGET_CPU usage expecting x64; decide whether Windows should be x86 or x64
and make the change consistently: update the platforms array in the "Package
releases" job to use "windows-latest-x64" if you want 64-bit builds (or update
docs/docs/build-system.md and references to FPC_TARGET_CPU to x86 if you intend
32-bit), and ensure the platform string and any mentions of FPC_TARGET_CPU and
the documented matrix all match the chosen architecture.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 60359896-ffc7-4be2-a528-620892eeff17

📥 Commits

Reviewing files that changed from the base of the PR and between b78b6f9 and 0352055.

📒 Files selected for processing (2)
  • .github/workflows/ci.yml
  • .github/workflows/pr.yml

Comment thread .github/workflows/ci.yml
@cursor cursor Bot force-pushed the cursor/ci-job-independence-9f67 branch from 0352055 to 1ee1067 Compare March 10, 2026 09:37
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
.github/workflows/ci.yml (1)

273-286: Consider adding fail-fast: false for consistency.

The artifacts job matrix doesn't include fail-fast: false while the build, test, benchmark, and examples jobs all do. If one platform's artifact upload fails, it would stop other platforms from completing. This may be intentional if you want all-or-nothing artifact uploads, but for consistency with the PR objective, consider adding fail-fast: false here as well.

♻️ Suggested change
   artifacts:
     needs: [test, wasm-test, benchmark, examples]
     if: github.ref == 'refs/heads/main'
     strategy:
+      fail-fast: false
       matrix:
         os: [ubuntu-latest, macos-latest, windows-latest]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/ci.yml around lines 273 - 286, Add fail-fast: false to the
artifacts job's matrix strategy so matrix failures for one platform don't cancel
other platform runs; locate the artifacts job's strategy.matrix block (the
matrix with os/arch/exclude/include shown) and insert fail-fast: false at the
same level as matrix (matching how other jobs set fail-fast) to ensure each
platform runs to completion even if one fails.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In @.github/workflows/ci.yml:
- Around line 273-286: Add fail-fast: false to the artifacts job's matrix
strategy so matrix failures for one platform don't cancel other platform runs;
locate the artifacts job's strategy.matrix block (the matrix with
os/arch/exclude/include shown) and insert fail-fast: false at the same level as
matrix (matching how other jobs set fail-fast) to ensure each platform runs to
completion even if one fails.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: bca2bde8-6205-49de-b533-26207e524ac0

📥 Commits

Reviewing files that changed from the base of the PR and between 0352055 and 1ee1067.

📒 Files selected for processing (1)
  • .github/workflows/ci.yml

The Windows build runs on windows-latest (x64 runner) but FPC's
i386-win32 toolchain produces 32-bit binaries. Fix artifact and release
package names to say x86 instead of x64 using a conditional expression.
The matrix structure and runners are unchanged.

Update docs/build-system.md and AGENTS.md to reflect the x86 label,
document fail-fast: false, job independence, and the wasm-test job.

Co-authored-by: Johannes Stein <frostney@users.noreply.github.com>
@cursor cursor Bot force-pushed the cursor/ci-job-independence-9f67 branch from 1ee1067 to 6a4be74 Compare March 10, 2026 09:54
cursoragent and others added 2 commits March 10, 2026 09:56
Build must succeed on all platforms before downstream jobs run. Keeping
the default fail-fast: true so a build failure cancels sibling builds
early rather than wasting runner minutes.

Co-authored-by: Johannes Stein <frostney@users.noreply.github.com>
The wasm-test job now runs on all platforms (ubuntu x64/arm64,
macOS x64/arm64, windows x86) matching the test/benchmark/examples
jobs. FPC and Node.js are installed per-OS.

Co-authored-by: Johannes Stein <frostney@users.noreply.github.com>
@frostney frostney merged commit 337fd06 into main Mar 10, 2026
7 checks passed
@frostney frostney deleted the cursor/ci-job-independence-9f67 branch March 10, 2026 10:07
@frostney frostney added the internal Refactoring, CI, tooling, cleanup label Apr 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

internal Refactoring, CI, tooling, cleanup

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants