{"id":"cc8e7e7f4b1ca84e","repo":"vitest-dev/vitest","slug":"projects-last-and-spec-project-name-have","errorCode":null,"errorMessage":"Projects \"${last}\" and \"${spec.project.name}\" have different 'maxWorkers' but same 'sequence.groupOrder'.\nProvide unique 'sequence.groupOrder' for them.","messagePattern":"Projects \"(.+?)\" and \"(.+?)\" have different 'maxWorkers' but same 'sequence\\.groupOrder'\\.\nProvide unique 'sequence\\.groupOrder' for them\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vitest/src/node/pool.ts","lineNumber":432,"sourceCode":"      return\n    }\n\n    const order = spec.project.config.sequence.groupOrder\n    const isolate = spec.project.config.isolate\n\n    // Files that have disabled parallelism and default groupOrder are set into their own group\n    if (isolate === true && order === 0 && spec.project.config.maxWorkers === 1) {\n      return sequential.specs.push([spec])\n    }\n\n    const maxWorkers = resolveMaxWorkers(spec.project)\n    groups[order] ||= { specs: [], maxWorkers }\n\n    // Multiple projects with different maxWorkers but same groupOrder\n    if (groups[order].maxWorkers !== maxWorkers) {\n      const last = groups[order].specs.at(-1)?.at(-1)?.project.name\n\n      throw new Error(`Projects \"${last}\" and \"${spec.project.name}\" have different 'maxWorkers' but same 'sequence.groupOrder'.\\nProvide unique 'sequence.groupOrder' for them.`)\n    }\n\n    // Non-isolated single worker can receive all files at once.\n    // vm pools are excluded: their `isolate: false` comes from config\n    // resolution rather than the user, because their isolation is a fresh VM\n    // context per run request — batching files into a single run request\n    // would share one context across all of them.\n    if (isolate === false && maxWorkers === 1 && spec.pool !== 'vmThreads' && spec.pool !== 'vmForks') {\n      const previous = groups[order].specs[0]?.[0]\n\n      if (previous && previous.project.name === spec.project.name && isEqualEnvironments(spec, previous)) {\n        return groups[order].specs[0].push(spec)\n      }\n    }\n\n    groups[order].specs.push([spec])\n  })\n","sourceCodeStart":414,"sourceCodeEnd":450,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/vitest/src/node/pool.ts#L414-L450","documentation":"Thrown during spec grouping when two projects share the same sequence.groupOrder value but resolve different maxWorkers. Vitest groups files by groupOrder to run them in the same parallel batch, and a single group must have one consistent maxWorkers limit, so conflicting limits for the same group order are ambiguous and rejected rather than silently picking one.","triggerScenarios":"Two workspace projects with the same config.sequence.groupOrder (default 0 is fine since those go through the sequential path, but a non-zero explicit value collides) but different config.maxWorkers / vitest.maxWorkers / CPU-based defaults, encountered in groupSpecs at packages/vitest/src/node/pool.ts:429-432.","commonSituations":"A monorepo where one project sets maxWorkers: 4 and another leaves it default but both set sequence.groupOrder: 1 to run tests in a specific phase; explicit groupOrder on projects with different CPU budgets.","solutions":["Give each project a unique sequence.groupOrder value so they land in separate groups.","Align maxWorkers across the colliding projects so the same group order is consistent.","Remove the explicit sequence.groupOrder overrides and rely on the default sequential/parallel grouping if you do not need phased execution."],"exampleFix":"// before: both projects share groupOrder 1\nexport default defineWorkspace([\n  { test: { name: 'a', maxWorkers: 2, sequence: { groupOrder: 1 } } },\n  { test: { name: 'b', maxWorkers: 4, sequence: { groupOrder: 1 } } },\n])\n\n// after: unique groupOrder per project\nexport default defineWorkspace([\n  { test: { name: 'a', maxWorkers: 2, sequence: { groupOrder: 1 } } },\n  { test: { name: 'b', maxWorkers: 4, sequence: { groupOrder: 2 } } },\n])","handlingStrategy":"validation","validationCode":"// Validate workspace projects: no two distinct maxWorkers share a groupOrder\nfunction validateGroupOrders(projects) {\n  const byOrder = new Map()\n  for (const p of projects) {\n    const order = p.test?.sequence?.groupOrder ?? 0\n    const workers = p.test?.maxWorkers ?? 'default'\n    const prev = byOrder.get(order)\n    if (prev !== undefined && prev !== workers) {\n      throw new Error(`Projects share groupOrder ${order} with different maxWorkers: ${prev} vs ${workers}`)\n    }\n    byOrder.set(order, workers)\n  }\n}\nvalidateGroupOrders(workspaceConfig.projects)","typeGuard":"function hasConsistentGroupOrders(projects) {\n  const seen = new Map()\n  for (const p of projects) {\n    const order = p.test?.sequence?.groupOrder ?? 0\n    const workers = JSON.stringify(p.test?.maxWorkers ?? null)\n    if (seen.has(order) && seen.get(order) !== workers) return false\n    seen.set(order, workers)\n  }\n  return true\n}","tryCatchPattern":null,"preventionTips":["Assign unique sequence.groupOrder values whenever projects set explicit maxWorkers.","Avoid setting groupOrder unless you need phased execution.","Document the groupOrder <-> maxWorkers constraint in your workspace config."],"tags":["config","workspace","scheduling","maxworkers"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}