{"record":{"id":"9e2e1f6d771974f0","repo":"mochajs/mocha","slug":"err-mocha-fatal","errorCode":"ERR_MOCHA_FATAL","errorMessage":"Object missing ID received in event data","messagePattern":"Object missing ID received in event data","errorType":"exception","errorClass":"FatalError","httpStatus":null,"severity":"critical","filePath":"lib/nodejs/parallel-buffered-runner.cjs","lineNumber":158,"sourceCode":"     * Given an event, recursively find any objects in its data that have ID's, and create object references to already-seen objects.\n     * @param {Object} event - Event having `eventName`, maybe `data` and maybe `error`\n     */\n    const linkEvent = (event) => {\n      const stack = [{ parent: event, prop: \"data\" }];\n      while (stack.length) {\n        const { parent, prop } = stack.pop();\n        const obj = parent[prop];\n        let newObj;\n        if (obj && typeof obj === \"object\") {\n          if (obj[MOCHA_ID_PROP_NAME]) {\n            const id = obj[MOCHA_ID_PROP_NAME];\n            newObj = this._linkedObjectMap.has(id)\n              ? Object.assign(this._linkedObjectMap.get(id), obj)\n              : obj;\n            this._linkedObjectMap.set(id, newObj);\n            parent[prop] = newObj;\n          } else {\n            throw createFatalError(\n              \"Object missing ID received in event data\",\n              obj,\n            );\n          }\n        }\n        Object.keys(newObj).forEach((key) => {\n          const value = obj[key];\n          if (value && typeof value === \"object\" && value[MOCHA_ID_PROP_NAME]) {\n            stack.push({ obj: value, parent: newObj, prop: key });\n          }\n        });\n      }\n    };\n\n    return async (file) => {\n      debug(\"run(): enqueueing test file %s\", file);\n      try {\n        const { failureCount, events } = await pool.run(file, options);","sourceCodeStart":140,"sourceCodeEnd":176,"githubUrl":"https://github.com/mochajs/mocha/blob/6bcbee4fd9a95351cedf0fdcb14c7d696486bc5a/lib/nodejs/parallel-buffered-runner.cjs#L140-L176","documentation":"ParallelBufferedRunner.linkEvent() re-hydrates serialized test objects (suites/tests/hooks) from worker events by linking them to known objects via an id. If a data object that should carry an ID lacks one, the runner cannot link it and throws a fatal ERR_MOCHA_ERROR.","triggerScenarios":"A worker emits a BufferedEvent whose object payload lacks an id property during deserialization in linkEvent(); typically indicates an internal serialization/protocol mismatch.","commonSituations":"Version mismatch between the mocha main process and worker code (stale install or mixed versions); custom reporters/plugins in parallel mode mutating event payloads; a genuine mocha bug in event serialization.","solutions":["Reinstall/align mocha so main and worker use the same version (npm ci)","Remove or update custom reporters/plugins affecting parallel event payloads","Reproduce with a minimal parallel run and file a mocha bug if it persists"],"exampleFix":"// before\n// mixed mocha versions: node_modules/mocha (old) vs global mocha (new)\n// after\nnpm ci\nnpx mocha --parallel --jobs 2","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  await runnerPromise;\n} catch (err) {\n  if (String(err.message).includes('Object missing ID')) {\n    console.error('Parallel event deserialization failed; check mocha version alignment and reporters');\n    process.exitCode = 1;\n  } else {\n    throw err;\n  }\n}","preventionTips":["Keep the exact same mocha version in main process and workers (npm ci)","Test custom reporters under --parallel before shipping","Avoid mutating event payloads between worker and main process","Pin/lock mocha versions in CI to prevent mixed-version drift"],"tags":["mocha","parallel","serialization","internal-error"],"backgroundTag":"missing-object-id-in-event","analyzedSha":"6bcbee4fd9a95351cedf0fdcb14c7d696486bc5a","analyzedAt":"2026-09-01T03:41:47.182Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}