{"record":{"id":"2a397ee0e0aded59","repo":"santifer/career-ops","slug":"merge-tracker-concurrent-write-test-flaked-e-message","errorCode":null,"errorMessage":"merge-tracker concurrent write test flaked (${e.message}). Retrying once...","messagePattern":"merge-tracker concurrent write test flaked \\((.+?)\\)\\. Retrying once\\.\\.\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"test-all.mjs","lineNumber":13011,"sourceCode":"      const second = spawnMerge(additionsB, 0);\n      const [firstResult, secondResult] = await Promise.all([first.result, second.result]);\n\n      if (firstResult.code === 0 && secondResult.code === 0) {\n        pass('concurrent merge processes both exited successfully');\n      } else {\n        throw new Error(`concurrent merge process failed: first=${firstResult.code} second=${secondResult.code} stderr=${firstResult.stderr || secondResult.stderr}`);\n      }\n\n      const merged = readFileSync(join(mergeTmp, 'data', 'applications.md'), 'utf-8');\n      if (merged.includes('Alpha') && merged.includes('Beta')) {\n        pass('concurrent tracker merges preserve rows from both processes');\n      } else {\n        throw new Error(`concurrent tracker merge lost a row: ${merged}`);\n      }\n      break;\n    } catch (e) {\n      if (retries > 0) {\n        warn(`merge-tracker concurrent write test flaked (${e.message}). Retrying once...`);\n        retries -= 1;\n      } else {\n        fail(`merge-tracker concurrent write test crashed: ${e.message}`);\n        break;\n      }\n    } finally {\n      rmSync(mergeTmp, { recursive: true, force: true });\n    }\n  }\n} catch (e) {\n  fail(`merge-tracker concurrent write test crashed: ${e.message}`);\n}\n\n// ── 12. COLD-START TRIGGER ──────────────────────────────────────\n\nconsole.log('\\n12. Cold-start trigger (deterministic onboarding state)');\n\ntry {","sourceCodeStart":12993,"sourceCodeEnd":13029,"githubUrl":"https://github.com/santifer/career-ops/blob/e7abd431fce9348a95261acac9e0c14779c35df8/test-all.mjs#L12993-L13029","documentation":"test-all.mjs exercises merge-tracker.mjs under concurrent writes, asserting that no tracker row is lost when two merges race. The first transient failure (e.g. a lost row on a loaded machine) logs this warning and retries once; exhausting retries turns it into a hard failure for merge-tracker's write path.","triggerScenarios":"The merged tracker after two concurrent merge runs is missing a row (`concurrent tracker merge lost a row`) or the merge process crashes, on an attempt where retries > 0 — warning is emitted and retries decremented.","commonSituations":"Slow CI runners widening the race window between read-modify-write cycles, shared/network filesystems with unreliable locking, or a real bug in merge-tracker.mjs's locking or atomic-write implementation (fails every attempt).","solutions":["One warning then a pass is the intended tolerance for timing noise — no action needed.","If it fails both attempts, reproduce with two manual merges against the same tracker and inspect merge-tracker.mjs's lock acquisition and atomic rename.","Run on a local disk (not NFS/SMB) where file locking behaves predictably.","Check for stray concurrent test processes (parallel CI shards sharing a working tree) interfering with the lock file."],"exampleFix":"// before (merge-tracker write)\nfs.writeFileSync(trackerPath, content);\n// after\nconst lock = acquireLock(trackerPath);\ntry { fs.writeFileSync(tmpPath, content); fs.renameSync(tmpPath, trackerPath); } finally { lock.release(); }","handlingStrategy":"retry","validationCode":"// sanity: single-writer merge must succeed before testing concurrency\nif (run('node', ['merge-tracker.mjs']) === null) fail('merge-tracker broken; skip concurrency test');","typeGuard":null,"tryCatchPattern":"try { assertRowsPresent(merged, expectedRows); } catch (e) { if (retries-- > 0) warn(`flaked (${e.message}), retrying`); else fail(e.message); }","preventionTips":["Verify merge-tracker uses a lock file plus atomic rename for writes","Run tests on local disks; network mounts weaken locking","Avoid parallel CI jobs sharing the same repository checkout","Escalate to fail() only after retries are exhausted — one warning is expected noise"],"tags":["concurrency","flaky-test","file-locking","test-runner"],"backgroundTag":"flaky-concurrency-test","analyzedSha":"e7abd431fce9348a95261acac9e0c14779c35df8","analyzedAt":"2026-09-16T06:35:29.214Z","contentChangedAt":"2026-09-16T06:35:29.214Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}