Skip to content

fix(release): the producer does not sign, and must not learn how - #453

Merged
stuffbucket merged 1 commit into
mainfrom
fix/producer-does-not-sign
Sep 2, 2026
Merged

fix(release): the producer does not sign, and must not learn how#453
stuffbucket merged 1 commit into
mainfrom
fix/producer-does-not-sign

Conversation

@stuffbucket

Copy link
Copy Markdown
Owner

This repository's producer is latently broken. It has not dispatched a build since macos-builder's producer isolation landed, so nothing has surfaced it here — but the next dispatch fails.

It was surfaced in stuffbucket/monimal, which carries a copy of this producer and hit it on its first real build (run 33566724936):

✖ Finalizing package [FAILED: No identity found for signing.]

Why

macos-builder now runs client build scripts with the signing keychain locked and SIGN_IDENTITY set to the ad-hoc identity "-". client/forge.config.ts gated osxSign on SIGN_IDENTITY being non-empty — and "-" is non-empty — so @electron/osx-sign resolves it through security find-identity, finds nothing, and dies.

What changes

Signing moves entirely to the builder. sign_walk = bun-runtime asks it to sign every nested code item deepest-first — the four Helper .apps and the Electron Framework included, each sealed as a bundle — then seal the outer bundle. sign_nested cannot express that: it takes regular files only.

The profile is still chosen by name, so this repo cannot widen what it is signed with, and clients/stuffbucket/maximal.policy already allows bun-runtime. No policy change.

  • client/forge.config.ts loses the whole osxSign block — deleted, not re-gated. Under this contract a packager configured to sign fails, and that failure is the point.
  • build.sh stops exporting MACOS_ENTITLEMENTS and no longer consumes SIGN_IDENTITY or ENTITLEMENTS_DIR.
  • Its signing assertions are replaced by their inverse: a Developer ID signature on a producer-built bundle now fails, because that would mean the builder's keychain isolation had regressed.

A second, independent bug

PATH put /opt/homebrew/bin ahead of everything, so Homebrew's node beat the Node actions/setup-node installs. Measured on a developer Mac: node -v reported 24.19.0 while the script saw 26.5.0. On the builder that silently builds releases on an unpinned major. It's appended now.

Verified

Not on this repo — it has no local deps checked out and its CI will cover the TypeScript. The identical change was verified end to end in monimal: real producer, exit 0, version stamped into Info.plist, and the resulting DMG passing spctl as Notarized Developer ID with every Helper app and framework validating under codesign --verify --deep --strict.

shellcheck clean on build.sh.

Worth a follow-up

This repo pins .bun-version but has no .nvmrc, so nothing declares which Node it expects and nothing can assert it. monimal gained a gate gate for exactly this; here there is nothing to gate against.

macos-builder's producer isolation runs client build scripts with the signing
keychain LOCKED and SIGN_IDENTITY set to the ad-hoc identity "-".
client/forge.config.ts gated osxSign on SIGN_IDENTITY being non-empty, and "-"
is non-empty, so @electron/osx-sign resolves it through `security find-identity`,
finds nothing, and the build dies with "No identity found for signing."

This repository has not dispatched a build since that landed, so the breakage is
latent rather than observed here. It was observed in stuffbucket/monimal, which
carries a copy of this producer and hit it on its first real build.

Signing moves entirely to the builder. `sign_walk = bun-runtime` asks it to sign
every nested code item deepest-first — the four Helper .apps and the Electron
Framework included, each sealed as a bundle, which sign_nested cannot express
because it takes regular files only — and then seal the outer bundle. The
profile is still chosen BY NAME, so this repo cannot widen what it is signed
with, and the existing policy already allows bun-runtime.

- client/forge.config.ts loses the whole osxSign block. Not gated differently:
  deleted. Under this contract a packager configured to sign fails, and that
  failure is the point.
- build.sh stops exporting MACOS_ENTITLEMENTS and no longer consumes
  SIGN_IDENTITY or ENTITLEMENTS_DIR.
- Its signing assertions are replaced by their inverse: a Developer ID signature
  on a bundle the producer built now fails the build, because it would mean the
  builder's keychain isolation had regressed.

Separately, PATH put /opt/homebrew/bin AHEAD of everything, shadowing the pinned
Node the builder installs with actions/setup-node with whatever major Homebrew
carries. Measured on a developer Mac: `node -v` reported 24.19.0 while the script
saw 26.5.0. It is appended now.

Note this repo pins .bun-version but has no .nvmrc, so nothing declares which
Node it expects and nothing can assert it. Worth adding.
@stuffbucket
stuffbucket merged commit 0385c71 into main Sep 2, 2026
6 checks passed
@stuffbucket
stuffbucket deleted the fix/producer-does-not-sign branch September 2, 2026 01:03
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