Skip to content

fix(ci): unmask release build failures and fix the ui:lint synckit crash - #46

Merged
moosebay merged 4 commits into
mainfrom
fix-failing-ci-builds
Aug 9, 2026
Merged

fix(ci): unmask release build failures and fix the ui:lint synckit crash#46
moosebay merged 4 commits into
mainfrom
fix-failing-ci-builds

Conversation

@moosebay

@moosebay moosebay commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Fixes the two failing Windows release jobs from run 31281026143, the reason nobody noticed them, and the flake that has been reddening main.

1. Release runs reported green while builds failed

Both release workflows set continue-on-error: true on the matrix build job, forcing every row's conclusion to success even when the build died. cli@1.1.0 shipped that way — the two Windows rows failed on an unexpanded ${PLATFORM}, published nothing, and the run still showed a green check.

Dropped it, and added fail-fast: false in the same move. That pairing matters: fail-fast: false is what keeps rows independent once continue-on-error is gone. Without it the first failing target would cancel the healthy rows still in flight — including the ~20 minute darwin-x64 build — and strand the release half-published.

Applied to release-electron-builder.yaml too, which had the identical latent bug.

The underlying build bug is already fixed (454fd20f) and shipped as cli@1.1.1. Verified by downloading every published asset:

darwin-arm64      Mach-O 64-bit arm64
darwin-x64        Mach-O 64-bit x86_64
linux-arm64       ELF 64-bit ARM aarch64
linux-x64         ELF 64-bit x86-64
win32-ia32.exe    PE32 Intel 80386
win32-x64.exe     PE32+ x86-64

Correct architectures, not mislabeled x64 copies. This PR fixes the reporting, so the next partial release fails loudly instead of publishing quietly.

2. ui:lint crashing on main

Not a lint finding — a hard ESLint abort:

Internal error: Atomics.wait() failed: timed-out
Rule: "better-tailwindcss/enforce-canonical-classes"

eslint-plugin-better-tailwindcss resolves the Tailwind design system in a synckit worker and blocks on Atomics.wait(). Building that context for packages/ui/src/styles/index.css is a cold, CPU-bound compile capped at 30s. On a 4-vCPU runner with several lint targets in flight, that ceiling gets crossed and ESLint aborts, failing task lint (and --nxBail skips the rest of the run).

4.3.2 passed timeout: 30000 explicitly to createSyncFn, which overrides synckit's own default — so SYNCKIT_TIMEOUT was silently ignored and there was no way to raise it. 4.4.0 is the first release that reads the env var. Its recommended preset is otherwise unchanged: the two rules it adds are both recommended: false, so the effective rule set does not move.

Verified the plumbing by falsification — forcing SYNCKIT_TIMEOUT=1 reproduces the exact CI error locally, proving the var now reaches the plugin and controls that timeout.

3. Benchmark PR comments have never worked

The comment job guarded on github.com.event_name == 'pull_request'. There is no com property on the github context, so the expression evaluates to null, never matches, and the job has silently never run.

Fixing the guard alone would have made things worse: the workflow declares no permissions: block and this repo's default GITHUB_TOKEN is read-only, so the job went straight to 403 Resource not accessible by integrationobserved on the first push of this branch. Granting pull-requests: write at the job level fixes it; the job only reads and writes PR comments and never checks out the repo.

The performance-comparison comment on this PR is that job working for the first time.

4. Remaining actionlint findings

.github is now actionlint-clean. sql.yml still pinned actions/checkout@v3, whose runner GitHub no longer supports, and the three composite actions carried empty description fields.

Verification

  • task lint — green, 15 projects, lint + lint:format, including server:lint (golangci-lint, norawsql, notxread)
  • actionlint — clean across all workflows
  • prettier --check — clean on every changed file
  • Workflow YAML re-parsed to confirm matrix rows and steps are structurally unchanged (6 rows/5 steps go, 4 rows/8 steps electron)
  • Generic Benchmark CI green on this branch, with the comment job succeeding

Not addressed, deliberately

cli@1.1.0 remains published with 4 of 6 assets, and already carries a release note pointing Windows users at cli@1.1.1 (which is marked Latest and complete). Backfilling would mean uploading locally-built binaries with different provenance than the rest of the release, and re-cutting a shipped tag is worse. Left as an accurate historical record.

No visual surface — CI configuration and a dependency bump only.

Both release workflows set `continue-on-error: true` on the matrix build
job, which forces every row's conclusion to success even when the build
dies. cli@1.1.0 shipped that way: the two Windows rows failed on an
unexpanded `${PLATFORM}`, published nothing, and the run still reported a
green check, so the release sat with 4 of its 6 assets for hours.

Drop it, and add `fail-fast: false` in the same move. fail-fast is what
keeps the rows independent once continue-on-error is gone -- without it
the first failing target would cancel the healthy rows still in flight,
including the ~20 minute darwin-x64 build, and strand the release
half-published. The result is the behaviour that was intended all along:
every platform still gets its chance to build, and a platform that cannot
produce an asset now fails the run that publishes it.
`ui:lint` fails intermittently on main with

  Internal error: Atomics.wait() failed: timed-out
  Rule: "better-tailwindcss/enforce-canonical-classes"

eslint-plugin-better-tailwindcss resolves the Tailwind design system in a
synckit worker and blocks on Atomics.wait(). Building that context for
packages/ui/src/styles/index.css is a cold, CPU-bound compile, and the
plugin caps the wait at 30s. On a 4-vCPU runner with several lint targets
in flight that ceiling gets crossed and ESLint aborts outright -- a hard
crash, not a lint finding, so `task lint` fails and --nxBail skips the
rest of the run.

4.3.2 passes `timeout: 30000` explicitly to createSyncFn, which overrides
synckit's own default, so SYNCKIT_TIMEOUT was silently ignored and there
was no way to raise it. 4.4.0 is the first release that reads the env var;
its recommended preset is otherwise unchanged (the two rules it adds are
both `recommended: false`), so the effective rule set does not move.

Raise the ceiling to 120s for lint targets. It is a deadline, not a
budget: a healthy run never waits any longer than it does today.
Clears every remaining actionlint finding across .github.

The benchmark PR comment job guarded on `github.com.event_name ==
'pull_request'`. There is no `com` property on the github context, so the
expression evaluates to null, never equals 'pull_request', and the job has
silently never run. Use `github.event_name`.

sql.yml still pinned actions/checkout@v3, whose runner GitHub no longer
supports; every other workflow is already on v4.

The three composite actions carried empty `description` fields, which
actionlint reports against each workflow that uses them.
Repairing the `github.event_name` guard makes this job execute for the
first time. The workflow declares no `permissions:` block and the
repository default for GITHUB_TOKEN is read-only, so the job would have
run straight into a 403 on issues.createComment -- trading a silently
skipped job for a visibly failing one.

Grant `pull-requests: write` at the job level, which is all it needs: its
only step reads and writes PR comments, and it never checks out the repo.
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

📊 Performance Comparison

Generated on 2026-08-09 13:55:08 UTC

Detailed Results

Benchmark Old Ops/sec New Ops/sec Change Memory Change Status
CreateMockFlow_Large 85488 80539 -5.8% +0.0% ⚠️
CreateMockFlow_Medium 243128 237759 -2.2% +0.0% ⚠️
CreateMockFlow_Small 558601 553312 -0.9% +0.0% ⚠️
FlowExecution_Large 46 46 +0.0% -0.1% ⚠️
FlowExecution_Medium 135 135 +0.0% -0.0% ⚠️
FlowExecution_Small 369 367 -0.5% +0.0% ⚠️

📈 Summary Statistics

  • Total benchmarks compared: 6
  • Regressions: 0 🚨
  • Improvements: 0 ✅
  • Neutral: 6 ⚠️

Stable Performance: All benchmarks within acceptable range

@moosebay
moosebay merged commit e968d04 into main Aug 9, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant