macOS: Desktop hardened Node cannot load bundled unsigned skia.node

Resolved 💬 2 comments Opened Jul 29, 2026 by ninjai Closed Jul 29, 2026
💡 Likely answer: A maintainer (github-actions[bot], contributor) responded on this thread — see the highlighted reply below.

What version of the Codex App are you using (From “About Codex” dialog)?

ChatGPT/Codex desktop app 26.721.81911 (build 5973), bundled codex-cli 0.146.0-alpha.3.1

What subscription do you have?

ChatGPT paid plan

What platform is your computer?

Darwin 22.6.0 x86_64 i386 — macOS 13.7.8 (22H730), Intel

What issue are you seeing?

The Codex desktop app's hardened Node executable cannot load the skia.node
native addon shipped in the primary runtime's @oai/artifact-tool dependency.

The app bundle itself passes deep and strict code-signature verification.
However, importing @oai/artifact-tool with the app's
Contents/Resources/cua_node/bin/node fails with:

ERR_DLOPEN_FAILED
mapped file has no cdhash, completely unsigned?
Code has to be at least ad-hoc signed.

The same package imports successfully when executed with the Node binary in the
primary runtime.

Observed versions:

  • Primary runtime bundle: 26.727.11326
  • Manifest artifact-tool version: 2.8.31
  • Installed @oai/artifact-tool package version: 2.8.33
  • skia-canvas: 3.0.8
  • Both Node executables: v24.14.0

The runtime's skia.node is byte-for-byte identical to the official
skia-canvas v3.0.8 darwin-x64.gz release asset after decompression:

darwin-x64.gz SHA-256:
3301d9241b661f30dcaf73c413b91549d020d7c2faff4b13905007b93ff66736

skia.node SHA-256:
8178acf1a69814779d124675502c0ae08868eb190dcc28ea735d0294f8c45d38

Both the upstream file and the runtime copy report:

code object is not signed at all

The app's cua_node has Hardened Runtime enabled and does not have the
com.apple.security.cs.disable-library-validation entitlement. The runtime
Node does have that entitlement, which is consistent with the success/failure
boundary.

What steps can reproduce the bug?

No config changes or re-signing are required.

APP=/Applications/ChatGPT.app
RUNTIME="$HOME/.cache/codex-runtimes/codex-primary-runtime"
NODE_MODULES="$RUNTIME/dependencies/node/node_modules"
SKIA="$NODE_MODULES/@oai/artifact-tool/node_modules/skia-canvas/lib/skia.node"

codesign --verify --deep --strict --verbose=2 "$APP"
codesign --verify --strict --verbose=4 "$SKIA"

NODE_PATH="$NODE_MODULES" \
  "$APP/Contents/Resources/cua_node/bin/node" \
  -e 'const artifact = require("@oai/artifact-tool"); console.log(Object.keys(artifact).length)'

NODE_PATH="$NODE_MODULES" \
  "$RUNTIME/dependencies/node/bin/node" \
  -e 'const artifact = require("@oai/artifact-tool"); console.log(Object.keys(artifact).length)'

Actual results:

  1. The app signature is valid.
  2. skia.node is unsigned.
  3. The Desktop cua_node command exits with ERR_DLOPEN_FAILED.
  4. The runtime Node command succeeds and prints 1171.

What is the expected behavior?

The supported Desktop workspace-dependency/artifact path should import the
bundled @oai/artifact-tool and load its native dependencies without requiring
users to modify or locally re-sign managed runtime files.

If cua_node is not intended to host these native dependencies, Desktop should
consistently route artifact execution through the primary runtime Node and
expose the required workspace-dependency loader to fresh sessions.

Additional information

This is related to, but narrower than, #34853, #34270, and #34091. Those issues
primarily track the missing load_workspace_dependencies tool. This report
captures the underlying macOS native-module boundary that prevents the Desktop
Hardened Node from serving as a fallback when that loader is absent.

There is also a packaging metadata mismatch: runtime.json reports
artifact-tool 2.8.31, while the installed package identifies itself as
2.8.33. That mismatch does not appear to cause the signature failure, but may
be useful when auditing the runtime bundle.

No app, runtime, native module, entitlement, or signature was modified while
reproducing this issue.

View original on GitHub ↗

2 Comments

github-actions[bot] contributor · 29 days ago

Potential duplicates detected. Please review them and close your issue if it is a duplicate.

  • #35055

Powered by Codex Action

ninjai · 29 days ago

Closing as a duplicate of #35055. I added the newer Desktop/runtime, x86_64, upstream-hash, and runtime-Node comparison evidence to that issue.