{"record":{"id":"48640576f7837f18","repo":"stablyai/orca","slug":"verify-linux-glibc-floor-offenders-length-bun","errorCode":null,"errorMessage":"[verify-linux-glibc-floor] ${offenders.length} bundled native binar${offenders.length === 1 ? 'y' : 'ies'} will not load on ${FLOOR_LABEL}, so the app will crash on startup there:\n${detail}\nSee docs/reference/linux-glibc-compatibility.md — rebuild the offending module against an older toolchain or pin the relocated symbols (as config/patches/node-pty@1.1.0.patch does).","messagePattern":"\\[verify-linux-glibc-floor\\] (.+?) bundled native binar(.+?) will not load on (.+?), so the app will crash on startup there:\n(.+?)\nSee docs/reference/linux-glibc-compatibility\\.md — rebuild the offending module against an older toolchain or pin the relocated symbols \\(as config/patches/node-pty@1\\.1\\.0\\.patch does\\)\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"config/scripts/verify-linux-glibc-floor.cjs","lineNumber":363,"sourceCode":"\n  if (offenders.length > 0) {\n    const detail = offenders\n      .map(({ filePath, floorViolations, providerViolations }) => {\n        const reasons = []\n        if (floorViolations.length > 0) {\n          const nodes = [...new Set(floorViolations.map((v) => v.name))].sort()\n          const libraries = [...new Set(floorViolations.map((v) => v.library).filter(Boolean))]\n          reasons.push(\n            `needs ${nodes.join(', ')}${libraries.length > 0 ? ` (from ${libraries.join(', ')})` : ''}`\n          )\n        }\n        for (const { symbol, library } of providerViolations) {\n          reasons.push(`imports ${symbol} but ${library} is not in DT_NEEDED`)\n        }\n        return `  ${relative(rootDir, filePath) || filePath} ${reasons.join('; ')}`\n      })\n      .join('\\n')\n    throw new Error(\n      `[verify-linux-glibc-floor] ${offenders.length} bundled native binar${offenders.length === 1 ? 'y' : 'ies'} ` +\n        `will not load on ${FLOOR_LABEL}, so the app will crash on startup there:\\n${detail}\\n` +\n        'See docs/reference/linux-glibc-compatibility.md — rebuild the offending module against an older ' +\n        'toolchain or pin the relocated symbols (as config/patches/node-pty@1.1.0.patch does).'\n    )\n  }\n\n  console.log(\n    `[verify-linux-glibc-floor] OK — ${binaries.length} bundled native binaries all load on ${FLOOR_LABEL}`\n  )\n}\n\nmodule.exports = {\n  MIN_GLIBC,\n  VERSION_FLOORS,\n  FLOOR_LABEL,\n  RELOCATED_SYMBOL_PROVIDERS,\n  parseGlibcVersion,","sourceCodeStart":345,"sourceCodeEnd":381,"githubUrl":"https://github.com/stablyai/orca/blob/1136503c6a231a16dce8f921f6fadb63d181e8db/config/scripts/verify-linux-glibc-floor.cjs#L345-L381","documentation":"The most severe outcome: one or more bundled native binaries require a glibc (GLIBC_/GLIBCXX_/CXXABI_) symbol version newer than the Ubuntu 20.04 floor, or import a relocated symbol whose provider isn't in DT_NEEDED. Such a binary will fail to load — and crash the app on startup — on the floor OS. This gate exists precisely because v1.4.150 shipped a node-pty that needed GLIBC_2.34 and crashed on glibc 2.31. The message lists each offender with the symbols/libraries it needs and points at the compatibility doc and the node-pty patch as the fix template.","triggerScenarios":"offenders.length > 0 after iterating all bundled binaries through findFloorViolations and findMissingProviderDeps, at line 346/363. Triggered when a native dependency was built against a newer toolchain (newer glibc/libstdc++ headers) than Ubuntu 20.04 provides, or when symbols like openpty/forkpty were relocated into libc without adding the provider to DT_NEEDED.","commonSituations":"A GitHub Actions runner image silently bumped its glibc; a prebuilt manylinux wheel/native module compiled on a newer distro; rebuilding node-pty on Ubuntu 22.04 instead of 20.04.","solutions":["Rebuild the offending native module against the floor toolchain (Ubuntu 20.04 / glibc 2.31) so its symbol versions stay at or below the floor.","If the symbol was relocated (e.g. openpty/forkpty moved from libutil to libc in glibc 2.34), apply a patch like config/patches/node-pty@1.1.0.patch to pin the provider into DT_NEEDED.","Read docs/reference/linux-glibc-compatibility.md for the full diagnosis workflow before re-running the gate.","Do not lower MIN_GLIBC or exempt the binary unless it loads lazily and never at launch (the sherpa-onnx speech exemption is the precedent)."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Build native modules on the floor OS (Ubuntu 20.04) so symbol versions never exceed glibc 2.31 / GLIBCXX_3.4.28.","Pin runner images by digest, not by rolling tag, to detect silent glibc bumps.","Apply patches like config/patches/node-pty@1.1.0.patch for relocated-symbol issues rather than exempting.","Run verify-linux-glibc-floor in every Linux release CI job."],"tags":["linux","packaging","glibc","native-modules","crash","compatibility","release-gate"],"backgroundTag":null,"analyzedSha":"1136503c6a231a16dce8f921f6fadb63d181e8db","analyzedAt":"2026-08-12T23:15:58.167Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}