{
  "title": "Dados reproduzíveis — npm vs pnpm vs Yarn vs Bun",
  "generatedAt": "2026-08-31T02:08:27.966Z",
  "license": "CC BY 4.0 para texto e dados; MIT para código da fixture e harness.",
  "note": "O bundle inclui todas as amostras, resumo, ambiente sem hostname e o código-fonte necessário para repetir as duas provas.",
  "benchmark": {
    "metadata": {
      "generatedAt": "2026-08-31T01:46:47.187Z",
      "fixturePackageJson": {
        "name": "codeinit-package-manager-fixture",
        "version": "1.0.0",
        "private": true,
        "type": "module",
        "scripts": {
          "build": "tsc -p tsconfig.json",
          "test": "node --test dist/tests/app.test.js",
          "verify": "tsc -p tsconfig.json && node --test dist/tests/app.test.js"
        },
        "dependencies": {
          "@fastify/cors": "11.3.0",
          "@fastify/helmet": "13.1.1",
          "@fastify/rate-limit": "11.2.0",
          "@fastify/sensible": "6.0.5",
          "ajv": "8.20.0",
          "date-fns": "4.4.0",
          "dotenv": "17.4.2",
          "fastify": "5.12.1",
          "jose": "6.2.10",
          "nanoid": "6.0.1",
          "pino": "10.3.1",
          "undici": "8.10.0",
          "zod": "4.5.4"
        },
        "devDependencies": {
          "@types/node": "26.4.0",
          "eslint": "10.9.1",
          "prettier": "3.9.6",
          "tsx": "4.23.13",
          "typescript": "7.0.2",
          "vitest": "4.1.11"
        }
      },
      "environment": {
        "platform": "darwin",
        "release": "25.5.0",
        "totalMemoryBytes": 17179869184,
        "node": "v22.23.0",
        "architecture": "arm64",
        "os": "ProductName:\t\tmacOS\nProductVersion:\t\t26.5.2\nBuildVersion:\t\t25F84",
        "cpu": "Apple M2",
        "registry": "https://registry.npmjs.org/"
      },
      "versions": {
        "npm-hoisted": "12.0.2",
        "pnpm-isolated": "11.24.0",
        "yarn-pnp": "4.18.0",
        "yarn-node-modules": "4.18.0",
        "bun-hoisted": "1.4.0"
      },
      "verification": {
        "npm-hoisted": {
          "passed": true,
          "elapsedMs": 1810.7
        },
        "pnpm-isolated": {
          "passed": true,
          "elapsedMs": 1992.92
        },
        "yarn-pnp": {
          "passed": false,
          "error": "Falha (2): /private/tmp/codeinit-pm-tools/node_modules/.bin/yarn run verify\nsrc/app.ts(1,21): error TS2307: Cannot find module 'fastify' or its corresponding type declarations.\nsrc/app.ts(2,18): error TS2307: Cannot find module '@fastify/cors' or its corresponding type declarations.\nsrc/app.ts(3,20): error TS2307: Cannot find module '@fastify/helmet' or its corresponding type declarations.\nsrc/app.ts(4,23): error TS2307: Cannot find module '@fastify/rate-limit' or its corresponding type declarations.\nsrc/app.ts(5,22): error TS2307: Cannot find module '@fastify/sensible' or its corresponding type declarations.\nsrc/app.ts(6,27): error TS2307: Cannot find module 'date-fns' or its corresponding type declarations.\nsrc/app.ts(7,25): error TS2307: Cannot find module 'jose' or its corresponding type declarations.\nsrc/app.ts(8,24): error TS2307: Cannot find module 'nanoid' or its corresponding type declarations.\nsrc/app.ts(9,25): error TS2307: Cannot find module 'undici' or its corresponding type declarations.\nsrc/app.ts(10,19): error TS2307: Cannot find module 'zod' or its corresponding type declarations.\nsrc/app.ts(22,28): error TS7006: Parameter 'request' implicitly has an 'any' type.\ntests/app.test.ts(1,20): error TS2591: Cannot find name 'node:assert/strict'. Do you need to install type definitions for node? Try `npm i --save-dev @types/node` and then add 'node' to the types field in your tsconfig.\ntests/app.test.ts(2,18): error TS2591: Cannot find name 'node:test'. Do you need to install type definitions for node? Try `npm i --save-dev @types/node` and then add 'node' to the types field in your tsconfig.\n\n"
        },
        "yarn-node-modules": {
          "passed": true,
          "elapsedMs": 1781.62
        },
        "bun-hoisted": {
          "passed": true,
          "elapsedMs": 1788.97
        }
      },
      "protocol": {
        "coldRuns": 5,
        "warmRuns": 10,
        "lifecycleScripts": "desativados igualmente para isolar resolução, download e materialização",
        "cold": "lockfile presente, cache vazio e rede habilitada",
        "warm": "lockfile presente, cache aquecido, artefato de instalação removido e rede desabilitada; Yarn usa YARN_ENABLE_NETWORK=false",
        "order": "ordem em rotação determinística; com cinco cenários, cada um ocupa cada posição uma vez nas rodadas frias e duas vezes nas quentes",
        "statistics": "mediana, mínimo e máximo; a amostra é pequena demais para estimar cauda/p95 com honestidade",
        "dependencyTrees": "as 19 versões diretas são exatas; cada resolver produz sua própria árvore transitiva, cuja equivalência não foi presumida",
        "validation": "cada cenário tentou executar TypeScript build e node:test após instalação imutável; falhas ficam registradas, não são descartadas"
      }
    },
    "summary": [
      {
        "manager": "npm-hoisted",
        "label": "npm (hoisted)",
        "version": "12.0.2",
        "mode": "cold",
        "runs": 5,
        "medianMs": 2004.63,
        "minMs": 1824.58,
        "maxMs": 2641.94,
        "projectKiBMedian": 155184,
        "cacheKiBFinal": null
      },
      {
        "manager": "npm-hoisted",
        "label": "npm (hoisted)",
        "version": "12.0.2",
        "mode": "warm",
        "runs": 10,
        "medianMs": 1537.92,
        "minMs": 1471.79,
        "maxMs": 1632.47,
        "projectKiBMedian": 155184,
        "cacheKiBFinal": 202420
      },
      {
        "manager": "pnpm-isolated",
        "label": "pnpm (isolated)",
        "version": "11.24.0",
        "mode": "cold",
        "runs": 5,
        "medianMs": 2715.15,
        "minMs": 2038.63,
        "maxMs": 4428.7,
        "projectKiBMedian": 154920,
        "cacheKiBFinal": null
      },
      {
        "manager": "pnpm-isolated",
        "label": "pnpm (isolated)",
        "version": "11.24.0",
        "mode": "warm",
        "runs": 10,
        "medianMs": 1326.99,
        "minMs": 1252.78,
        "maxMs": 1417.28,
        "projectKiBMedian": 154920,
        "cacheKiBFinal": 147784
      },
      {
        "manager": "yarn-pnp",
        "label": "Yarn moderno (PnP)",
        "version": "4.18.0",
        "mode": "cold",
        "runs": 5,
        "medianMs": 2108.85,
        "minMs": 1484.21,
        "maxMs": 2665.89,
        "projectKiBMedian": 78736,
        "cacheKiBFinal": null
      },
      {
        "manager": "yarn-pnp",
        "label": "Yarn moderno (PnP)",
        "version": "4.18.0",
        "mode": "warm",
        "runs": 10,
        "medianMs": 555.3,
        "minMs": 518.86,
        "maxMs": 716.71,
        "projectKiBMedian": 78736,
        "cacheKiBFinal": 148772
      },
      {
        "manager": "yarn-node-modules",
        "label": "Yarn moderno (node-modules)",
        "version": "4.18.0",
        "mode": "cold",
        "runs": 5,
        "medianMs": 3729.96,
        "minMs": 2540.32,
        "maxMs": 5300.83,
        "projectKiBMedian": 161352,
        "cacheKiBFinal": null
      },
      {
        "manager": "yarn-node-modules",
        "label": "Yarn moderno (node-modules)",
        "version": "4.18.0",
        "mode": "warm",
        "runs": 10,
        "medianMs": 1472.68,
        "minMs": 1359.18,
        "maxMs": 2058.03,
        "projectKiBMedian": 161352,
        "cacheKiBFinal": 148772
      },
      {
        "manager": "bun-hoisted",
        "label": "Bun (hoisted)",
        "version": "1.4.0",
        "mode": "cold",
        "runs": 5,
        "medianMs": 1337.59,
        "minMs": 1214.38,
        "maxMs": 1529.11,
        "projectKiBMedian": 154956,
        "cacheKiBFinal": null
      },
      {
        "manager": "bun-hoisted",
        "label": "Bun (hoisted)",
        "version": "1.4.0",
        "mode": "warm",
        "runs": 10,
        "medianMs": 194.13,
        "minMs": 183.48,
        "maxMs": 373.23,
        "projectKiBMedian": 154956,
        "cacheKiBFinal": 166752
      }
    ],
    "runs": [
      {
        "manager": "npm-hoisted",
        "mode": "cold",
        "run": 1,
        "orderPosition": 1,
        "network": "enabled",
        "elapsedMs": 2027.53,
        "projectKiB": 155184,
        "cacheKiB": 37820,
        "installArtifactPresent": true
      },
      {
        "manager": "pnpm-isolated",
        "mode": "cold",
        "run": 1,
        "orderPosition": 2,
        "network": "enabled",
        "elapsedMs": 4025.45,
        "projectKiB": 154920,
        "cacheKiB": 147788,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-pnp",
        "mode": "cold",
        "run": 1,
        "orderPosition": 3,
        "network": "enabled",
        "elapsedMs": 2472.75,
        "projectKiB": 78736,
        "cacheKiB": 132692,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-node-modules",
        "mode": "cold",
        "run": 1,
        "orderPosition": 4,
        "network": "enabled",
        "elapsedMs": 3729.96,
        "projectKiB": 161352,
        "cacheKiB": 132692,
        "installArtifactPresent": true
      },
      {
        "manager": "bun-hoisted",
        "mode": "cold",
        "run": 1,
        "orderPosition": 5,
        "network": "enabled",
        "elapsedMs": 1337.59,
        "projectKiB": 154956,
        "cacheKiB": 154504,
        "installArtifactPresent": true
      },
      {
        "manager": "pnpm-isolated",
        "mode": "cold",
        "run": 2,
        "orderPosition": 1,
        "network": "enabled",
        "elapsedMs": 4428.7,
        "projectKiB": 154920,
        "cacheKiB": 147784,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-pnp",
        "mode": "cold",
        "run": 2,
        "orderPosition": 2,
        "network": "enabled",
        "elapsedMs": 2665.89,
        "projectKiB": 78736,
        "cacheKiB": 132692,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-node-modules",
        "mode": "cold",
        "run": 2,
        "orderPosition": 3,
        "network": "enabled",
        "elapsedMs": 4759.63,
        "projectKiB": 161352,
        "cacheKiB": 132692,
        "installArtifactPresent": true
      },
      {
        "manager": "bun-hoisted",
        "mode": "cold",
        "run": 2,
        "orderPosition": 4,
        "network": "enabled",
        "elapsedMs": 1529.11,
        "projectKiB": 154956,
        "cacheKiB": 154504,
        "installArtifactPresent": true
      },
      {
        "manager": "npm-hoisted",
        "mode": "cold",
        "run": 2,
        "orderPosition": 5,
        "network": "enabled",
        "elapsedMs": 2641.94,
        "projectKiB": 155184,
        "cacheKiB": 38408,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-pnp",
        "mode": "cold",
        "run": 3,
        "orderPosition": 1,
        "network": "enabled",
        "elapsedMs": 2108.85,
        "projectKiB": 78736,
        "cacheKiB": 132692,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-node-modules",
        "mode": "cold",
        "run": 3,
        "orderPosition": 2,
        "network": "enabled",
        "elapsedMs": 3186.29,
        "projectKiB": 161352,
        "cacheKiB": 132692,
        "installArtifactPresent": true
      },
      {
        "manager": "bun-hoisted",
        "mode": "cold",
        "run": 3,
        "orderPosition": 3,
        "network": "enabled",
        "elapsedMs": 1243.6,
        "projectKiB": 154956,
        "cacheKiB": 154504,
        "installArtifactPresent": true
      },
      {
        "manager": "npm-hoisted",
        "mode": "cold",
        "run": 3,
        "orderPosition": 4,
        "network": "enabled",
        "elapsedMs": 2004.63,
        "projectKiB": 155184,
        "cacheKiB": 37820,
        "installArtifactPresent": true
      },
      {
        "manager": "pnpm-isolated",
        "mode": "cold",
        "run": 3,
        "orderPosition": 5,
        "network": "enabled",
        "elapsedMs": 2715.15,
        "projectKiB": 154920,
        "cacheKiB": 147792,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-node-modules",
        "mode": "cold",
        "run": 4,
        "orderPosition": 1,
        "network": "enabled",
        "elapsedMs": 2540.32,
        "projectKiB": 161352,
        "cacheKiB": 132692,
        "installArtifactPresent": true
      },
      {
        "manager": "bun-hoisted",
        "mode": "cold",
        "run": 4,
        "orderPosition": 2,
        "network": "enabled",
        "elapsedMs": 1214.38,
        "projectKiB": 154956,
        "cacheKiB": 154504,
        "installArtifactPresent": true
      },
      {
        "manager": "npm-hoisted",
        "mode": "cold",
        "run": 4,
        "orderPosition": 3,
        "network": "enabled",
        "elapsedMs": 1824.58,
        "projectKiB": 155184,
        "cacheKiB": 37820,
        "installArtifactPresent": true
      },
      {
        "manager": "pnpm-isolated",
        "mode": "cold",
        "run": 4,
        "orderPosition": 4,
        "network": "enabled",
        "elapsedMs": 2038.63,
        "projectKiB": 154920,
        "cacheKiB": 147792,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-pnp",
        "mode": "cold",
        "run": 4,
        "orderPosition": 5,
        "network": "enabled",
        "elapsedMs": 1484.21,
        "projectKiB": 78736,
        "cacheKiB": 132692,
        "installArtifactPresent": true
      },
      {
        "manager": "bun-hoisted",
        "mode": "cold",
        "run": 5,
        "orderPosition": 1,
        "network": "enabled",
        "elapsedMs": 1386.98,
        "projectKiB": 154956,
        "cacheKiB": 154504,
        "installArtifactPresent": true
      },
      {
        "manager": "npm-hoisted",
        "mode": "cold",
        "run": 5,
        "orderPosition": 2,
        "network": "enabled",
        "elapsedMs": 1992.61,
        "projectKiB": 155184,
        "cacheKiB": 38524,
        "installArtifactPresent": true
      },
      {
        "manager": "pnpm-isolated",
        "mode": "cold",
        "run": 5,
        "orderPosition": 3,
        "network": "enabled",
        "elapsedMs": 2204.91,
        "projectKiB": 154920,
        "cacheKiB": 147784,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-pnp",
        "mode": "cold",
        "run": 5,
        "orderPosition": 4,
        "network": "enabled",
        "elapsedMs": 1922.98,
        "projectKiB": 78736,
        "cacheKiB": 132692,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-node-modules",
        "mode": "cold",
        "run": 5,
        "orderPosition": 5,
        "network": "enabled",
        "elapsedMs": 5300.83,
        "projectKiB": 161352,
        "cacheKiB": 132692,
        "installArtifactPresent": true
      },
      {
        "manager": "npm-hoisted",
        "mode": "warm",
        "run": 1,
        "orderPosition": 1,
        "network": "disabled",
        "elapsedMs": 1505.83,
        "projectKiB": 155184,
        "cacheKiB": 202132,
        "installArtifactPresent": true
      },
      {
        "manager": "pnpm-isolated",
        "mode": "warm",
        "run": 1,
        "orderPosition": 2,
        "network": "disabled",
        "elapsedMs": 1345.43,
        "projectKiB": 154920,
        "cacheKiB": 147784,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-pnp",
        "mode": "warm",
        "run": 1,
        "orderPosition": 3,
        "network": "disabled",
        "elapsedMs": 539.62,
        "projectKiB": 78736,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-node-modules",
        "mode": "warm",
        "run": 1,
        "orderPosition": 4,
        "network": "disabled",
        "elapsedMs": 1371.8,
        "projectKiB": 161352,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "bun-hoisted",
        "mode": "warm",
        "run": 1,
        "orderPosition": 5,
        "network": "disabled",
        "elapsedMs": 373.23,
        "projectKiB": 154956,
        "cacheKiB": 166752,
        "installArtifactPresent": true
      },
      {
        "manager": "pnpm-isolated",
        "mode": "warm",
        "run": 2,
        "orderPosition": 1,
        "network": "disabled",
        "elapsedMs": 1252.78,
        "projectKiB": 154920,
        "cacheKiB": 147784,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-pnp",
        "mode": "warm",
        "run": 2,
        "orderPosition": 2,
        "network": "disabled",
        "elapsedMs": 518.86,
        "projectKiB": 78736,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-node-modules",
        "mode": "warm",
        "run": 2,
        "orderPosition": 3,
        "network": "disabled",
        "elapsedMs": 1452.2,
        "projectKiB": 161352,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "bun-hoisted",
        "mode": "warm",
        "run": 2,
        "orderPosition": 4,
        "network": "disabled",
        "elapsedMs": 192.48,
        "projectKiB": 154956,
        "cacheKiB": 166752,
        "installArtifactPresent": true
      },
      {
        "manager": "npm-hoisted",
        "mode": "warm",
        "run": 2,
        "orderPosition": 5,
        "network": "disabled",
        "elapsedMs": 1471.79,
        "projectKiB": 155184,
        "cacheKiB": 202164,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-pnp",
        "mode": "warm",
        "run": 3,
        "orderPosition": 1,
        "network": "disabled",
        "elapsedMs": 535.6,
        "projectKiB": 78736,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-node-modules",
        "mode": "warm",
        "run": 3,
        "orderPosition": 2,
        "network": "disabled",
        "elapsedMs": 1359.18,
        "projectKiB": 161352,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "bun-hoisted",
        "mode": "warm",
        "run": 3,
        "orderPosition": 3,
        "network": "disabled",
        "elapsedMs": 189.64,
        "projectKiB": 154956,
        "cacheKiB": 166752,
        "installArtifactPresent": true
      },
      {
        "manager": "npm-hoisted",
        "mode": "warm",
        "run": 3,
        "orderPosition": 4,
        "network": "disabled",
        "elapsedMs": 1484.2,
        "projectKiB": 155184,
        "cacheKiB": 202196,
        "installArtifactPresent": true
      },
      {
        "manager": "pnpm-isolated",
        "mode": "warm",
        "run": 3,
        "orderPosition": 5,
        "network": "disabled",
        "elapsedMs": 1275.47,
        "projectKiB": 154920,
        "cacheKiB": 147784,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-node-modules",
        "mode": "warm",
        "run": 4,
        "orderPosition": 1,
        "network": "disabled",
        "elapsedMs": 1680.81,
        "projectKiB": 161352,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "bun-hoisted",
        "mode": "warm",
        "run": 4,
        "orderPosition": 2,
        "network": "disabled",
        "elapsedMs": 196.97,
        "projectKiB": 154956,
        "cacheKiB": 166752,
        "installArtifactPresent": true
      },
      {
        "manager": "npm-hoisted",
        "mode": "warm",
        "run": 4,
        "orderPosition": 3,
        "network": "disabled",
        "elapsedMs": 1562.65,
        "projectKiB": 155184,
        "cacheKiB": 202228,
        "installArtifactPresent": true
      },
      {
        "manager": "pnpm-isolated",
        "mode": "warm",
        "run": 4,
        "orderPosition": 4,
        "network": "disabled",
        "elapsedMs": 1417.28,
        "projectKiB": 154920,
        "cacheKiB": 147784,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-pnp",
        "mode": "warm",
        "run": 4,
        "orderPosition": 5,
        "network": "disabled",
        "elapsedMs": 580.18,
        "projectKiB": 78736,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "bun-hoisted",
        "mode": "warm",
        "run": 5,
        "orderPosition": 1,
        "network": "disabled",
        "elapsedMs": 185.58,
        "projectKiB": 154956,
        "cacheKiB": 166752,
        "installArtifactPresent": true
      },
      {
        "manager": "npm-hoisted",
        "mode": "warm",
        "run": 5,
        "orderPosition": 2,
        "network": "disabled",
        "elapsedMs": 1515.63,
        "projectKiB": 155184,
        "cacheKiB": 202260,
        "installArtifactPresent": true
      },
      {
        "manager": "pnpm-isolated",
        "mode": "warm",
        "run": 5,
        "orderPosition": 3,
        "network": "disabled",
        "elapsedMs": 1284.45,
        "projectKiB": 154920,
        "cacheKiB": 147784,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-pnp",
        "mode": "warm",
        "run": 5,
        "orderPosition": 4,
        "network": "disabled",
        "elapsedMs": 575.36,
        "projectKiB": 78736,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-node-modules",
        "mode": "warm",
        "run": 5,
        "orderPosition": 5,
        "network": "disabled",
        "elapsedMs": 1497.19,
        "projectKiB": 161352,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "npm-hoisted",
        "mode": "warm",
        "run": 6,
        "orderPosition": 1,
        "network": "disabled",
        "elapsedMs": 1632.47,
        "projectKiB": 155184,
        "cacheKiB": 202292,
        "installArtifactPresent": true
      },
      {
        "manager": "pnpm-isolated",
        "mode": "warm",
        "run": 6,
        "orderPosition": 2,
        "network": "disabled",
        "elapsedMs": 1342.88,
        "projectKiB": 154920,
        "cacheKiB": 147784,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-pnp",
        "mode": "warm",
        "run": 6,
        "orderPosition": 3,
        "network": "disabled",
        "elapsedMs": 558.85,
        "projectKiB": 78736,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-node-modules",
        "mode": "warm",
        "run": 6,
        "orderPosition": 4,
        "network": "disabled",
        "elapsedMs": 1678.47,
        "projectKiB": 161352,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "bun-hoisted",
        "mode": "warm",
        "run": 6,
        "orderPosition": 5,
        "network": "disabled",
        "elapsedMs": 213.79,
        "projectKiB": 154956,
        "cacheKiB": 166752,
        "installArtifactPresent": true
      },
      {
        "manager": "pnpm-isolated",
        "mode": "warm",
        "run": 7,
        "orderPosition": 1,
        "network": "disabled",
        "elapsedMs": 1349.72,
        "projectKiB": 154920,
        "cacheKiB": 147784,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-pnp",
        "mode": "warm",
        "run": 7,
        "orderPosition": 2,
        "network": "disabled",
        "elapsedMs": 716.71,
        "projectKiB": 78736,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-node-modules",
        "mode": "warm",
        "run": 7,
        "orderPosition": 3,
        "network": "disabled",
        "elapsedMs": 2058.03,
        "projectKiB": 161352,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "bun-hoisted",
        "mode": "warm",
        "run": 7,
        "orderPosition": 4,
        "network": "disabled",
        "elapsedMs": 187.34,
        "projectKiB": 154956,
        "cacheKiB": 166752,
        "installArtifactPresent": true
      },
      {
        "manager": "npm-hoisted",
        "mode": "warm",
        "run": 7,
        "orderPosition": 5,
        "network": "disabled",
        "elapsedMs": 1595.58,
        "projectKiB": 155184,
        "cacheKiB": 202324,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-pnp",
        "mode": "warm",
        "run": 8,
        "orderPosition": 1,
        "network": "disabled",
        "elapsedMs": 525.6,
        "projectKiB": 78736,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-node-modules",
        "mode": "warm",
        "run": 8,
        "orderPosition": 2,
        "network": "disabled",
        "elapsedMs": 1415.27,
        "projectKiB": 161352,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "bun-hoisted",
        "mode": "warm",
        "run": 8,
        "orderPosition": 3,
        "network": "disabled",
        "elapsedMs": 224.02,
        "projectKiB": 154956,
        "cacheKiB": 166752,
        "installArtifactPresent": true
      },
      {
        "manager": "npm-hoisted",
        "mode": "warm",
        "run": 8,
        "orderPosition": 4,
        "network": "disabled",
        "elapsedMs": 1476.65,
        "projectKiB": 155184,
        "cacheKiB": 202356,
        "installArtifactPresent": true
      },
      {
        "manager": "pnpm-isolated",
        "mode": "warm",
        "run": 8,
        "orderPosition": 5,
        "network": "disabled",
        "elapsedMs": 1373.26,
        "projectKiB": 154920,
        "cacheKiB": 147784,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-node-modules",
        "mode": "warm",
        "run": 9,
        "orderPosition": 1,
        "network": "disabled",
        "elapsedMs": 1493.17,
        "projectKiB": 161352,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "bun-hoisted",
        "mode": "warm",
        "run": 9,
        "orderPosition": 2,
        "network": "disabled",
        "elapsedMs": 195.79,
        "projectKiB": 154956,
        "cacheKiB": 166752,
        "installArtifactPresent": true
      },
      {
        "manager": "npm-hoisted",
        "mode": "warm",
        "run": 9,
        "orderPosition": 3,
        "network": "disabled",
        "elapsedMs": 1569.75,
        "projectKiB": 155184,
        "cacheKiB": 202388,
        "installArtifactPresent": true
      },
      {
        "manager": "pnpm-isolated",
        "mode": "warm",
        "run": 9,
        "orderPosition": 4,
        "network": "disabled",
        "elapsedMs": 1311.11,
        "projectKiB": 154920,
        "cacheKiB": 147784,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-pnp",
        "mode": "warm",
        "run": 9,
        "orderPosition": 5,
        "network": "disabled",
        "elapsedMs": 552.48,
        "projectKiB": 78736,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "bun-hoisted",
        "mode": "warm",
        "run": 10,
        "orderPosition": 1,
        "network": "disabled",
        "elapsedMs": 183.48,
        "projectKiB": 154956,
        "cacheKiB": 166752,
        "installArtifactPresent": true
      },
      {
        "manager": "npm-hoisted",
        "mode": "warm",
        "run": 10,
        "orderPosition": 2,
        "network": "disabled",
        "elapsedMs": 1560.21,
        "projectKiB": 155184,
        "cacheKiB": 202420,
        "installArtifactPresent": true
      },
      {
        "manager": "pnpm-isolated",
        "mode": "warm",
        "run": 10,
        "orderPosition": 3,
        "network": "disabled",
        "elapsedMs": 1279.59,
        "projectKiB": 154920,
        "cacheKiB": 147784,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-pnp",
        "mode": "warm",
        "run": 10,
        "orderPosition": 4,
        "network": "disabled",
        "elapsedMs": 558.12,
        "projectKiB": 78736,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      },
      {
        "manager": "yarn-node-modules",
        "mode": "warm",
        "run": 10,
        "orderPosition": 5,
        "network": "disabled",
        "elapsedMs": 1384.9,
        "projectKiB": 161352,
        "cacheKiB": 148772,
        "installArtifactPresent": true
      }
    ],
    "source": {
      "README.md": "# Benchmark reproduzível — npm, pnpm, Yarn e Bun\n\nEste diretório mede instalação de dependências; não mede o desempenho da\naplicação em produção. A fixture é uma API Fastify/TypeScript com 19 dependências\ndiretas em versões exatas. Cada gerenciador resolve suas próprias dependências\ntransitivas; o protocolo não presume que essas árvores sejam idênticas. Depois de\ncada cenário, o harness compila a fixture e\nexecuta um teste HTTP real com o runtime Node.js.\n\n## Versões comparadas no recorte de 30/08/2026\n\n- npm 12.0.2, linker padrão `hoisted`;\n- pnpm 11.24.0, dist-tag `latest`, linker padrão `isolated`;\n- Yarn 4.18.0 em PnP e, como controle de compatibilidade, em `node-modules`;\n- Bun 1.4.0, linker padrão `hoisted` para pacote único.\n\npnpm 12.1.0 já existia no canal `next-12`, mas não era o dist-tag `latest`. Para\nnão misturar a troca de gerenciador com a adoção de uma reescrita recém-lançada,\no comparativo principal usa pnpm 11.24.0.\n\n## Protocolo\n\n- **Frio:** lockfile já gerado, cache isolado vazio, rede habilitada.\n- **Quente:** mesmo lockfile, cache aquecido, artefato do projeto removido e rede\n  desabilitada por uma opção explícita de cada CLI. No Yarn, o harness também\n  define `YARN_ENABLE_NETWORK=false`.\n- Scripts de lifecycle ficam desativados em todos os gerenciadores. Isso evita\n  comparar políticas de segurança diferentes como se fossem velocidade.\n- São cinco execuções frias e dez quentes por padrão. A ordem gira de forma\n  determinística: cada cenário ocupa cada posição uma vez no frio e duas no\n  quente.\n- O resumo publica mediana, mínimo e máximo. Com amostras tão pequenas, o p95\n  seria apenas o maior valor e daria uma falsa impressão de precisão de cauda.\n- Uso do projeto e do cache é registrado separadamente em KiB alocados por `du`.\n  O número de `node_modules` sozinho não deve ser chamado de “disco total”.\n- O Yarn PnP não cria `node_modules`; seu cache faz parte do custo e aparece numa\n  coluna separada. O cenário `node-modules` impede que uma falha específica do\n  linker seja atribuída incorretamente ao Yarn inteiro.\n- Projeto e cache/store são reportados separadamente. Somar as duas travessias\n  pode contar os mesmos blocos mais de uma vez quando o filesystem usa hardlinks\n  ou clone-on-write; um total físico exige medição deduplicada por inode/bloco.\n\nOs testes frios incluem rede pública e, portanto, são uma fotografia desta\nmáquina e deste horário. O resultado quente isola melhor resolução e\nmaterialização, mas continua dependente do filesystem e do sistema operacional.\n\n## Como repetir\n\nInstale CLIs exatas fora do projeto:\n\n```sh\nnpm install --prefix /private/tmp/codeinit-pm-tools --no-audit --no-fund \\\n  npm@12.0.2 pnpm@11.24.0 @yarnpkg/cli-dist@4.18.0 bun@1.4.0\n```\n\nExecute:\n\n```sh\nnode run.mjs\n```\n\nPara mudar quantidade de amostras ou caminhos:\n\n```sh\nCODEINIT_PM_COLD_RUNS=5 \\\nCODEINIT_PM_WARM_RUNS=10 \\\nCODEINIT_PM_TOOLS=/caminho/para/node_modules/.bin \\\nCODEINIT_PM_BENCH_WORK=/private/tmp/meu-benchmark \\\nnode run.mjs\n```\n\nOs arquivos gerados ficam em `resultados/raw.json`, `summary.json` e\n`summary.csv`. Não rode dois benchmarks simultâneos no mesmo `WORK`.\n\nConfira contagem, rotação, bloqueio de rede, estatísticas e build/teste:\n\n```sh\nnode derive-summary.mjs\nnode export-public.mjs\nnode validate.mjs\n```\n\n`derive-summary.mjs` recalcula o resumo a partir das amostras sem repetir as\ninstalações. A mediana de uma quantidade par é a média dos dois valores centrais.\nO validador também cruza o resumo com a tabela do artigo e o bundle público.\n\nPara gerar o bundle público que acompanha o artigo — dados, código da bancada e\nprova de migração — execute `node export-public.mjs`. A saída fica em\n`99-website-code/public/dados/package-managers-2026.json`.\n\n## O que estes dados não provam\n\n- Não provam que um gerenciador será o mais rápido em outro projeto.\n- Não comparam runtime Node.js e runtime Bun.\n- Não medem addons nativos nem scripts de instalação.\n- Não substituem teste de CI, Docker e plataforma de produção do leitor.\n- Não transformam diferenças de milissegundos em justificativa automática para\n  migrar um repositório estável.\n",
      "run.mjs": "import { execFileSync, spawnSync } from 'node:child_process'\nimport { cpSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { platform, release, totalmem } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { performance } from 'node:perf_hooks'\n\nconst here = dirname(fileURLToPath(import.meta.url))\nconst fixture = join(here, 'fixture')\nconst resultsDir = join(here, 'resultados')\nconst workRoot = process.env.CODEINIT_PM_BENCH_WORK || '/private/tmp/codeinit-pm-benchmark'\nconst toolsRoot = process.env.CODEINIT_PM_TOOLS || '/private/tmp/codeinit-pm-tools/node_modules/.bin'\nconst coldRuns = Number(process.env.CODEINIT_PM_COLD_RUNS || 5)\nconst warmRuns = Number(process.env.CODEINIT_PM_WARM_RUNS || 10)\n\nconst tool = name => join(toolsRoot, name)\nconst managers = [\n  {\n    id: 'npm-hoisted', label: 'npm (hoisted)', bin: tool('npm'), artifact: 'node_modules',\n    prepare: (_project, cache) => ({ ...process.env, npm_config_cache: join(cache, 'npm') }),\n    setupArgs: ['install', '--ignore-scripts', '--no-audit', '--no-fund'],\n    coldArgs: ['ci', '--ignore-scripts', '--no-audit', '--no-fund'],\n    warmArgs: ['ci', '--offline', '--ignore-scripts', '--no-audit', '--no-fund'],\n    verifyArgs: ['run', 'verify']\n  },\n  {\n    id: 'pnpm-isolated', label: 'pnpm (isolated)', bin: tool('pnpm'), artifact: 'node_modules',\n    prepare: (_project, cache) => ({ ...process.env, PNPM_HOME: join(cache, 'home') }),\n    setupArgs: cache => ['install', '--store-dir', join(cache, 'store'), '--ignore-scripts'],\n    coldArgs: cache => ['install', '--store-dir', join(cache, 'store'), '--frozen-lockfile', '--ignore-scripts'],\n    warmArgs: cache => ['install', '--store-dir', join(cache, 'store'), '--offline', '--frozen-lockfile', '--ignore-scripts'],\n    verifyArgs: ['run', 'verify']\n  },\n  {\n    id: 'yarn-pnp', label: 'Yarn moderno (PnP)', bin: tool('yarn'), artifact: '.pnp.cjs',\n    prepare: (project, cache) => {\n      writeFileSync(join(project, '.yarnrc.yml'), [\n        'nodeLinker: pnp',\n        'enableGlobalCache: true',\n        `globalFolder: ${JSON.stringify(join(cache, 'global'))}`,\n        'enableScripts: false',\n        'enableTelemetry: false',\n        ''\n      ].join('\\n'))\n      return { ...process.env }\n    },\n    setupArgs: ['install'],\n    coldArgs: ['install', '--immutable'],\n    warmArgs: ['install', '--immutable', '--immutable-cache'],\n    verifyArgs: ['run', 'verify']\n  },\n  {\n    id: 'yarn-node-modules', label: 'Yarn moderno (node-modules)', bin: tool('yarn'), artifact: 'node_modules',\n    prepare: (project, cache) => {\n      writeFileSync(join(project, '.yarnrc.yml'), [\n        'nodeLinker: node-modules',\n        'enableGlobalCache: true',\n        `globalFolder: ${JSON.stringify(join(cache, 'global'))}`,\n        'enableScripts: false',\n        'enableTelemetry: false',\n        ''\n      ].join('\\n'))\n      return { ...process.env }\n    },\n    setupArgs: ['install'],\n    coldArgs: ['install', '--immutable'],\n    warmArgs: ['install', '--immutable', '--immutable-cache'],\n    verifyArgs: ['run', 'verify']\n  },\n  {\n    id: 'bun-hoisted', label: 'Bun (hoisted)', bin: tool('bun'), artifact: 'node_modules',\n    prepare: (_project, cache) => ({ ...process.env, BUN_INSTALL_CACHE_DIR: join(cache, 'bun') }),\n    setupArgs: ['install', '--ignore-scripts'],\n    coldArgs: ['ci', '--ignore-scripts'],\n    warmArgs: ['ci', '--offline', '--ignore-scripts'],\n    verifyArgs: ['run', 'verify']\n  }\n]\n\nfunction argsFor(value, cache) {\n  return typeof value === 'function' ? value(cache) : value\n}\n\nfunction copyFixture(target) {\n  rmSync(target, { recursive: true, force: true })\n  cpSync(fixture, target, { recursive: true })\n}\n\nfunction copyLocked(source, target) {\n  rmSync(target, { recursive: true, force: true })\n  cpSync(source, target, {\n    recursive: true,\n    filter: path => ![\n      'node_modules', 'dist', '.yarn', '.pnp.cjs', '.pnp.loader.mjs'\n    ].includes(path.split('/').at(-1))\n  })\n}\n\nfunction run(bin, args, cwd, env, allowOutput = false) {\n  const started = performance.now()\n  const child = spawnSync(bin, args, {\n    cwd, env: { ...env, TZ: 'UTC' }, encoding: 'utf8',\n    stdio: allowOutput ? 'inherit' : ['ignore', 'pipe', 'pipe']\n  })\n  const elapsedMs = performance.now() - started\n  if (child.status !== 0) {\n    throw new Error([\n      `Falha (${child.status}): ${bin} ${args.join(' ')}`,\n      child.stdout || '', child.stderr || ''\n    ].join('\\n'))\n  }\n  return elapsedMs\n}\n\nfunction kib(target) {\n  if (!existsSync(target)) return 0\n  const output = execFileSync('du', ['-sk', target], { encoding: 'utf8' })\n  return Number(output.trim().split(/\\s+/)[0])\n}\n\nfunction median(values) {\n  const sorted = [...values].sort((a, b) => a - b)\n  const middle = Math.floor(sorted.length / 2)\n  return sorted.length % 2 === 0\n    ? (sorted[middle - 1] + sorted[middle]) / 2\n    : sorted[middle]\n}\n\nfunction shellInfo(command, args = []) {\n  try { return execFileSync(command, args, { encoding: 'utf8' }).trim() } catch { return 'indisponível' }\n}\n\nfunction managerVersion(manager) {\n  return shellInfo(manager.bin, ['--version']).split('\\n').at(-1)\n}\n\nfunction recordRun(manager, mode, index, position, cache, locked) {\n  const runRoot = join(workRoot, 'runs', manager.id, `${mode}-${index}`)\n  const project = join(runRoot, 'project')\n  copyLocked(locked, project)\n  mkdirSync(cache, { recursive: true })\n  const env = manager.prepare(project, cache)\n  if (mode === 'warm' && manager.id.startsWith('yarn-')) {\n    env.YARN_ENABLE_NETWORK = 'false'\n  }\n  const args = argsFor(mode === 'cold' ? manager.coldArgs : manager.warmArgs, cache)\n  const elapsedMs = run(manager.bin, args, project, env)\n  return {\n    manager: manager.id,\n    mode,\n    run: index,\n    orderPosition: position,\n    network: mode === 'warm' ? 'disabled' : 'enabled',\n    elapsedMs: Number(elapsedMs.toFixed(2)),\n    projectKiB: kib(project),\n    cacheKiB: kib(cache),\n    installArtifactPresent: existsSync(join(project, manager.artifact))\n  }\n}\n\nrmSync(workRoot, { recursive: true, force: true })\nmkdirSync(workRoot, { recursive: true })\nmkdirSync(resultsDir, { recursive: true })\n\nconst raw = []\nconst versions = {}\nconst verification = {}\nconst contexts = new Map()\n\nfor (const manager of managers) {\n  if (!existsSync(manager.bin)) throw new Error(`CLI ausente: ${manager.bin}`)\n  versions[manager.id] = managerVersion(manager)\n\n  const locked = join(workRoot, 'locked', manager.id)\n  const warmCache = join(workRoot, 'cache', manager.id)\n  copyFixture(locked)\n  mkdirSync(warmCache, { recursive: true })\n  const setupEnv = manager.prepare(locked, warmCache)\n  run(manager.bin, argsFor(manager.setupArgs, warmCache), locked, setupEnv)\n  rmSync(join(locked, 'node_modules'), { recursive: true, force: true })\n  rmSync(join(locked, 'dist'), { recursive: true, force: true })\n  rmSync(join(locked, '.pnp.cjs'), { force: true })\n  rmSync(join(locked, '.pnp.loader.mjs'), { force: true })\n\n  contexts.set(manager.id, { locked, warmCache })\n}\n\nfunction rotatedManagers(index) {\n  const offset = (index - 1) % managers.length\n  return [...managers.slice(offset), ...managers.slice(0, offset)]\n}\n\nfor (let index = 1; index <= coldRuns; index++) {\n  rotatedManagers(index).forEach((manager, position) => {\n    const { locked } = contexts.get(manager.id)\n    const coldCache = join(workRoot, 'cold-cache', manager.id, String(index))\n    raw.push(recordRun(manager, 'cold', index, position + 1, coldCache, locked))\n  })\n}\n\nfor (let index = 1; index <= warmRuns; index++) {\n  rotatedManagers(index).forEach((manager, position) => {\n    const { locked, warmCache } = contexts.get(manager.id)\n    raw.push(recordRun(manager, 'warm', index, position + 1, warmCache, locked))\n  })\n}\n\nfor (const manager of managers) {\n  const { locked, warmCache } = contexts.get(manager.id)\n  const verifyProject = join(workRoot, 'verify', manager.id)\n  copyLocked(locked, verifyProject)\n  const verifyEnv = manager.prepare(verifyProject, warmCache)\n  if (manager.id.startsWith('yarn-')) verifyEnv.YARN_ENABLE_NETWORK = 'false'\n  try {\n    run(manager.bin, argsFor(manager.warmArgs, warmCache), verifyProject, verifyEnv)\n    const elapsedMs = run(manager.bin, argsFor(manager.verifyArgs, warmCache), verifyProject, verifyEnv)\n    verification[manager.id] = { passed: true, elapsedMs: Number(elapsedMs.toFixed(2)) }\n  } catch (error) {\n    verification[manager.id] = {\n      passed: false,\n      error: String(error.message).slice(0, 6000)\n    }\n  }\n}\n\nconst summary = []\nfor (const manager of managers) {\n  for (const mode of ['cold', 'warm']) {\n    const rows = raw.filter(row => row.manager === manager.id && row.mode === mode)\n    const elapsed = rows.map(row => row.elapsedMs)\n    summary.push({\n      manager: manager.id,\n      label: manager.label,\n      version: versions[manager.id],\n      mode,\n      runs: rows.length,\n      medianMs: Number(median(elapsed).toFixed(2)),\n      minMs: Number(Math.min(...elapsed).toFixed(2)),\n      maxMs: Number(Math.max(...elapsed).toFixed(2)),\n      projectKiBMedian: median(rows.map(row => row.projectKiB)),\n      cacheKiBFinal: mode === 'warm' ? rows.at(-1).cacheKiB : null\n    })\n  }\n}\n\nconst metadata = {\n  generatedAt: new Date().toISOString(),\n  fixturePackageJson: JSON.parse(readFileSync(join(fixture, 'package.json'), 'utf8')),\n  environment: {\n    platform: platform(),\n    release: release(),\n    totalMemoryBytes: totalmem(),\n    node: process.version,\n    architecture: process.arch,\n    os: shellInfo('sw_vers'),\n    cpu: shellInfo('sysctl', ['-n', 'machdep.cpu.brand_string']),\n    registry: 'https://registry.npmjs.org/'\n  },\n  versions,\n  verification,\n  protocol: {\n    coldRuns,\n    warmRuns,\n    lifecycleScripts: 'desativados igualmente para isolar resolução, download e materialização',\n    cold: 'lockfile presente, cache vazio e rede habilitada',\n    warm: 'lockfile presente, cache aquecido, artefato de instalação removido e rede desabilitada; Yarn usa YARN_ENABLE_NETWORK=false',\n    order: 'ordem em rotação determinística; com cinco cenários, cada um ocupa cada posição uma vez nas rodadas frias e duas vezes nas quentes',\n    statistics: 'mediana, mínimo e máximo; a amostra é pequena demais para estimar cauda/p95 com honestidade',\n    dependencyTrees: 'as 19 versões diretas são exatas; cada resolver produz sua própria árvore transitiva, cuja equivalência não foi presumida',\n    validation: 'cada cenário tentou executar TypeScript build e node:test após instalação imutável; falhas ficam registradas, não são descartadas'\n  }\n}\n\nwriteFileSync(join(resultsDir, 'raw.json'), JSON.stringify({ metadata, runs: raw }, null, 2) + '\\n')\nwriteFileSync(join(resultsDir, 'summary.json'), JSON.stringify({ metadata, summary }, null, 2) + '\\n')\nwriteFileSync(join(resultsDir, 'summary.csv'), [\n  'manager,label,version,mode,runs,median_ms,min_ms,max_ms,project_kib_median,cache_kib_final',\n  ...summary.map(row => [\n    row.manager, JSON.stringify(row.label), row.version, row.mode, row.runs,\n    row.medianMs, row.minMs, row.maxMs,\n    row.projectKiBMedian, row.cacheKiBFinal ?? ''\n  ].join(','))\n].join('\\n') + '\\n')\n\nconsole.table(summary)\nconsole.log(`Resultados: ${resolve(resultsDir)}`)\n",
      "derive-summary.mjs": "import { readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst here = dirname(fileURLToPath(import.meta.url))\nconst resultsDir = join(here, 'resultados')\nconst raw = JSON.parse(readFileSync(join(resultsDir, 'raw.json'), 'utf8'))\n\nconst median = values => {\n  const sorted = [...values].sort((a, b) => a - b)\n  const middle = Math.floor(sorted.length / 2)\n  return sorted.length % 2 === 0\n    ? (sorted[middle - 1] + sorted[middle]) / 2\n    : sorted[middle]\n}\n\nconst labels = {\n  'npm-hoisted': 'npm (hoisted)',\n  'pnpm-isolated': 'pnpm (isolated)',\n  'yarn-pnp': 'Yarn moderno (PnP)',\n  'yarn-node-modules': 'Yarn moderno (node-modules)',\n  'bun-hoisted': 'Bun (hoisted)'\n}\n\nconst summary = []\nfor (const manager of Object.keys(labels)) {\n  for (const mode of ['cold', 'warm']) {\n    const rows = raw.runs.filter(row => row.manager === manager && row.mode === mode)\n    const elapsed = rows.map(row => row.elapsedMs)\n    summary.push({\n      manager,\n      label: labels[manager],\n      version: raw.metadata.versions[manager],\n      mode,\n      runs: rows.length,\n      medianMs: Number(median(elapsed).toFixed(2)),\n      minMs: Number(Math.min(...elapsed).toFixed(2)),\n      maxMs: Number(Math.max(...elapsed).toFixed(2)),\n      projectKiBMedian: median(rows.map(row => row.projectKiB)),\n      cacheKiBFinal: mode === 'warm' ? rows.at(-1).cacheKiB : null\n    })\n  }\n}\n\nwriteFileSync(join(resultsDir, 'summary.json'), JSON.stringify({\n  metadata: raw.metadata,\n  summary\n}, null, 2) + '\\n')\n\nwriteFileSync(join(resultsDir, 'summary.csv'), [\n  'manager,label,version,mode,runs,median_ms,min_ms,max_ms,project_kib_median,cache_kib_final',\n  ...summary.map(row => [\n    row.manager, JSON.stringify(row.label), row.version, row.mode, row.runs,\n    row.medianMs, row.minMs, row.maxMs,\n    row.projectKiBMedian, row.cacheKiBFinal ?? ''\n  ].join(','))\n].join('\\n') + '\\n')\n\nconsole.table(summary)\n",
      "validate.mjs": "import assert from 'node:assert/strict'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst here = dirname(fileURLToPath(import.meta.url))\nconst readJson = file => JSON.parse(readFileSync(join(here, file), 'utf8'))\nconst raw = readJson('resultados/raw.json')\nconst report = readJson('resultados/summary.json')\nconst fixture = readJson('fixture/package.json')\nconst article = readFileSync(resolve(here, '../../artigo.md'), 'utf8')\n\nconst directCount = Object.keys(fixture.dependencies || {}).length\n  + Object.keys(fixture.devDependencies || {}).length\nassert.equal(directCount, 19, 'A fixture precisa conservar 19 dependências diretas.')\n\nconst managers = [...new Set(raw.runs.map(row => row.manager))]\nassert.equal(managers.length, 5, 'A bancada precisa conservar cinco cenários.')\nassert.equal(raw.runs.length, 75, 'Esperadas 75 instalações medidas.')\nassert.equal(report.summary.length, 10, 'Esperados dois resumos por cenário.')\n\nconst median = values => {\n  const sorted = [...values].sort((a, b) => a - b)\n  const middle = Math.floor(sorted.length / 2)\n  return sorted.length % 2 === 0\n    ? (sorted[middle - 1] + sorted[middle]) / 2\n    : sorted[middle]\n}\n\nfor (const manager of managers) {\n  for (const mode of ['cold', 'warm']) {\n    const rows = raw.runs.filter(row => row.manager === manager && row.mode === mode)\n    const expectedRuns = mode === 'cold' ? 5 : 10\n    assert.equal(rows.length, expectedRuns, `${manager}/${mode}: quantidade incorreta.`)\n    assert.ok(rows.every(row => row.installArtifactPresent), `${manager}/${mode}: artefato ausente.`)\n    if (mode === 'warm') {\n      assert.ok(rows.every(row => row.network === 'disabled'), `${manager}: rede quente não bloqueada.`)\n    }\n\n    const positions = rows.map(row => row.orderPosition).sort((a, b) => a - b)\n    const expectedPositions = mode === 'cold'\n      ? [1, 2, 3, 4, 5]\n      : [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]\n    assert.deepEqual(positions, expectedPositions, `${manager}/${mode}: rotação desequilibrada.`)\n\n    const summary = report.summary.find(row => row.manager === manager && row.mode === mode)\n    assert.ok(summary, `${manager}/${mode}: resumo ausente.`)\n    const elapsed = rows.map(row => row.elapsedMs)\n    assert.equal(summary.medianMs, Number(median(elapsed).toFixed(2)), `${manager}/${mode}: mediana divergente.`)\n    assert.equal(summary.minMs, Math.min(...elapsed), `${manager}/${mode}: mínimo divergente.`)\n    assert.equal(summary.maxMs, Math.max(...elapsed), `${manager}/${mode}: máximo divergente.`)\n    assert.ok(!Object.hasOwn(summary, 'p95Ms'), `${manager}/${mode}: p95 não é honesto com esta amostra.`)\n  }\n}\n\nfor (const [manager, verification] of Object.entries(report.metadata.verification)) {\n  assert.equal(\n    verification.passed,\n    manager !== 'yarn-pnp',\n    `${manager}: resultado de build/teste mudou; revise o artigo.`\n  )\n}\n\nconst articleLabels = {\n  'npm-hoisted': 'npm 12 hoisted',\n  'pnpm-isolated': 'pnpm 11 isolated',\n  'yarn-pnp': 'Yarn 4 PnP',\n  'yarn-node-modules': 'Yarn 4 node-modules',\n  'bun-hoisted': 'Bun 1.4 hoisted'\n}\nconst seconds = value => `${(value / 1000).toFixed(3).replace('.', ',')} s`\nconst mebibytes = value => `${(value / 1024).toFixed(1).replace('.', ',')} MiB`\n\nfor (const [manager, label] of Object.entries(articleLabels)) {\n  const line = article.split('\\n').find(value => value.startsWith(`| ${label} |`))\n  assert.ok(line, `${manager}: linha ausente na tabela do artigo.`)\n  const normalized = line.replaceAll('**', '')\n  const cold = report.summary.find(row => row.manager === manager && row.mode === 'cold')\n  const warm = report.summary.find(row => row.manager === manager && row.mode === 'warm')\n  assert.ok(normalized.includes(`${seconds(cold.medianMs)} / ${seconds(cold.maxMs)}`), `${manager}: frio diverge do artigo.`)\n  assert.ok(normalized.includes(`${seconds(warm.medianMs)} / ${seconds(warm.maxMs)}`), `${manager}: quente diverge do artigo.`)\n  assert.ok(normalized.includes(mebibytes(warm.projectKiBMedian)), `${manager}: projeto diverge do artigo.`)\n  assert.ok(normalized.includes(mebibytes(warm.cacheKiBFinal)), `${manager}: cache diverge do artigo.`)\n}\n\nconst publicPath = resolve(here, '../../../../99-website-code/public/dados/package-managers-2026.json')\nif (existsSync(publicPath)) {\n  const publicBundle = JSON.parse(readFileSync(publicPath, 'utf8'))\n  assert.deepEqual(publicBundle.benchmark.runs, raw.runs, 'Bundle público diverge das amostras locais.')\n  assert.deepEqual(publicBundle.benchmark.summary, report.summary, 'Bundle público diverge do resumo local.')\n}\n\nconsole.log('PASS: amostras, rotação, rede, estatísticas, artigo e bundle público conferidos')\n",
      "fixture/package.json": "{\n  \"name\": \"codeinit-package-manager-fixture\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"build\": \"tsc -p tsconfig.json\",\n    \"test\": \"node --test dist/tests/app.test.js\",\n    \"verify\": \"tsc -p tsconfig.json && node --test dist/tests/app.test.js\"\n  },\n  \"dependencies\": {\n    \"@fastify/cors\": \"11.3.0\",\n    \"@fastify/helmet\": \"13.1.1\",\n    \"@fastify/rate-limit\": \"11.2.0\",\n    \"@fastify/sensible\": \"6.0.5\",\n    \"ajv\": \"8.20.0\",\n    \"date-fns\": \"4.4.0\",\n    \"dotenv\": \"17.4.2\",\n    \"fastify\": \"5.12.1\",\n    \"jose\": \"6.2.10\",\n    \"nanoid\": \"6.0.1\",\n    \"pino\": \"10.3.1\",\n    \"undici\": \"8.10.0\",\n    \"zod\": \"4.5.4\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"26.4.0\",\n    \"eslint\": \"10.9.1\",\n    \"prettier\": \"3.9.6\",\n    \"tsx\": \"4.23.13\",\n    \"typescript\": \"7.0.2\",\n    \"vitest\": \"4.1.11\"\n  }\n}\n\n",
      "fixture/tsconfig.json": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2023\",\n    \"module\": \"NodeNext\",\n    \"moduleResolution\": \"NodeNext\",\n    \"rootDir\": \".\",\n    \"outDir\": \"dist\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"declaration\": true,\n    \"sourceMap\": true\n  },\n  \"include\": [\"src/**/*.ts\", \"tests/**/*.ts\"]\n}\n\n",
      "fixture/src/app.ts": "import Fastify from 'fastify'\nimport cors from '@fastify/cors'\nimport helmet from '@fastify/helmet'\nimport rateLimit from '@fastify/rate-limit'\nimport sensible from '@fastify/sensible'\nimport { formatISO } from 'date-fns'\nimport { SignJWT } from 'jose'\nimport { nanoid } from 'nanoid'\nimport { Headers } from 'undici'\nimport { z } from 'zod'\n\nconst querySchema = z.object({ name: z.string().min(1).default('CodeIniter') })\nconst secret = new TextEncoder().encode('fixture-only-not-a-production-secret')\n\nexport async function buildApp() {\n  const app = Fastify({ logger: false })\n  await app.register(cors, { origin: false })\n  await app.register(helmet)\n  await app.register(rateLimit, { max: 100, timeWindow: '1 minute' })\n  await app.register(sensible)\n\n  app.get('/health', async request => {\n    const query = querySchema.parse(request.query)\n    const requestId = nanoid(12)\n    const token = await new SignJWT({ sub: query.name })\n      .setProtectedHeader({ alg: 'HS256' })\n      .setIssuedAt()\n      .setExpirationTime('5m')\n      .sign(secret)\n    const headers = new Headers({ 'x-request-id': requestId })\n\n    return {\n      ok: true,\n      name: query.name,\n      now: formatISO(new Date(0)),\n      requestId: headers.get('x-request-id'),\n      token\n    }\n  })\n\n  return app\n}\n\n",
      "fixture/tests/app.test.ts": "import assert from 'node:assert/strict'\nimport test from 'node:test'\nimport { buildApp } from '../src/app.js'\n\ntest('a fixture instala, compila e executa uma rota real', async () => {\n  const app = await buildApp()\n  const response = await app.inject({ method: 'GET', url: '/health?name=CodeInit' })\n  const body = response.json()\n\n  assert.equal(response.statusCode, 200)\n  assert.equal(body.ok, true)\n  assert.equal(body.name, 'CodeInit')\n  assert.equal(body.now, '1970-01-01T00:00:00Z')\n  assert.match(body.requestId, /^[\\w-]{12}$/)\n  assert.equal(body.token.split('.').length, 3)\n\n  await app.close()\n})\n\n"
    }
  },
  "migrationProof": {
    "result": {
      "generatedAt": "2026-08-31T02:07:52.015Z",
      "versions": {
        "node": "v22.23.0",
        "npm": "12.0.2",
        "pnpm": "11.24.0"
      },
      "steps": [
        {
          "command": "npm install --ignore-scripts --no-audit --no-fund",
          "status": 0,
          "stdout": "added 3 packages in 437ms",
          "stderr": ""
        },
        {
          "command": "npm run start --workspace=@codeinit/api",
          "status": 0,
          "stdout": "PASS: aplicação executou",
          "stderr": "npm notice run @codeinit/api@1.0.0 start\nnpm notice run node index.js"
        },
        {
          "command": "pnpm import",
          "status": 0,
          "stdout": "Progress: resolved 1, reused 0, downloaded 0, added 0\nProgress: resolved 2, reused 0, downloaded 0, added 0, done",
          "stderr": ""
        },
        {
          "command": "pnpm install --frozen-lockfile --ignore-scripts",
          "status": 0,
          "stdout": "Scope: all 3 workspace projects\n✓ Lockfile passes supply-chain policies (verified 317ms ago)\nLockfile is up to date, resolution step is skipped\nProgress: resolved 1, reused 0, downloaded 0, added 0\nPackages: +1\n+\nPackages are cloned from the content-addressable store to the virtual store.\n  Content-addressable store is at: /private/tmp/codeinit-pnpm-migration-proof/home/store/v11\n  Virtual store is at:             node_modules/.pnpm\nProgress: resolved 1, reused 0, downloaded 1, added 1, done\n\nDone in 486ms using pnpm v11.24.0",
          "stderr": ""
        },
        {
          "command": "pnpm --filter @codeinit/api start",
          "status": 1,
          "expectedFailure": "Cannot find package 'is-number' imported from apps/api/index.js"
        },
        {
          "command": "pnpm --filter @codeinit/api add is-number@7.0.0",
          "status": 0,
          "stdout": "✓ Lockfile passes supply-chain policies (verified 1s ago)\nLockfile is up to date, resolution step is skipped\nDone in 322ms using pnpm v11.24.0",
          "stderr": ""
        },
        {
          "command": "pnpm --filter @codeinit/api start",
          "status": 0,
          "stdout": "PASS: aplicação executou",
          "stderr": "$ node index.js"
        },
        {
          "command": "pnpm install --frozen-lockfile --ignore-scripts",
          "status": 0,
          "stdout": "Scope: all 3 workspace projects\n✓ Lockfile passes supply-chain policies (verified 30m ago)\nLockfile is up to date, resolution step is skipped\nAlready up to date\n\nDone in 322ms using pnpm v11.24.0",
          "stderr": ""
        }
      ]
    },
    "source": {
      "README.md": "# Prova — dependência fantasma durante npm → pnpm\n\nA fixture tem dois workspaces. `@codeinit/tool` declara `is-number`; a aplicação\nusa `is-number` diretamente sem declará-lo.\n\nO `packageManager` exato e `pnpm-workspace.yaml` já existem na fixture. O roteiro\nconfirma que nenhum `pnpm-lock.yaml` surge antes de `pnpm import` e prova três\nestados:\n\n1. npm hoisted deixa a aplicação executar e mascara o manifesto incompleto;\n2. depois de `pnpm import`, pnpm isolated recusa o import da aplicação;\n3. `pnpm --filter @codeinit/api add is-number@7.0.0` corrige a declaração e a\n   instalação frozen passa.\n\nExecute depois de instalar as CLIs exatas usadas pela bancada principal:\n\n```bash\nnode run.mjs\n```\n\nO resultado auditável fica em `resultado.json`. A pasta de trabalho é temporária\ne pode ser apagada sem afetar a fixture.\n",
      "run.mjs": "import { spawnSync } from 'node:child_process'\nimport { cpSync, existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst here = dirname(fileURLToPath(import.meta.url))\nconst work = '/private/tmp/codeinit-pnpm-migration-proof'\nconst project = join(work, 'project')\nconst tools = process.env.CODEINIT_PM_TOOLS || '/private/tmp/codeinit-pm-tools/node_modules/.bin'\nconst npm = join(tools, 'npm')\nconst pnpm = join(tools, 'pnpm')\nconst store = join(work, 'store')\n\nfunction command(bin, args, expected = 0) {\n  const result = spawnSync(bin, args, {\n    cwd: project,\n    env: {\n      ...process.env,\n      TZ: 'UTC',\n      ...(bin === pnpm ? {\n        PNPM_HOME: join(work, 'home'),\n        npm_config_store_dir: store\n      } : {})\n    },\n    encoding: 'utf8'\n  })\n  if (result.status !== expected) {\n    throw new Error(`${bin} ${args.join(' ')} retornou ${result.status}, esperado ${expected}\\n${result.stdout}\\n${result.stderr}`)\n  }\n  return {\n    command: `${bin.split('/').at(-1)} ${args.join(' ')}`,\n    status: result.status,\n    stdout: result.stdout.trim(),\n    stderr: result.stderr.trim()\n  }\n}\n\nrmSync(work, { recursive: true, force: true })\nmkdirSync(work, { recursive: true })\ncpSync(join(here, 'fixture'), project, { recursive: true })\n\nconst results = {\n  generatedAt: new Date().toISOString(),\n  versions: {\n    node: process.version,\n    npm: command(npm, ['--version']).stdout,\n    pnpm: command(pnpm, ['--version']).stdout\n  },\n  steps: []\n}\n\nresults.steps.push(command(npm, ['install', '--ignore-scripts', '--no-audit', '--no-fund']))\nresults.steps.push(command(npm, ['run', 'start', '--workspace=@codeinit/api']))\n\nrmSync(join(project, 'node_modules'), { recursive: true, force: true })\nif (existsSync(join(project, 'pnpm-lock.yaml'))) {\n  throw new Error('pnpm-lock.yaml surgiu antes do pnpm import')\n}\nresults.steps.push(command(pnpm, ['import']))\nresults.steps.push(command(pnpm, ['install', '--frozen-lockfile', '--ignore-scripts']))\n\nconst phantom = spawnSync(pnpm, ['--filter', '@codeinit/api', 'start'], {\n  cwd: project,\n  env: {\n    ...process.env,\n    TZ: 'UTC',\n    PNPM_HOME: join(work, 'home'),\n    npm_config_store_dir: store\n  },\n  encoding: 'utf8'\n})\nif (phantom.status === 0 || !`${phantom.stdout}\\n${phantom.stderr}`.includes(\"Cannot find package 'is-number'\")) {\n  throw new Error(`pnpm deveria revelar a dependência fantasma\\n${phantom.stdout}\\n${phantom.stderr}`)\n}\nresults.steps.push({\n  command: 'pnpm --filter @codeinit/api start',\n  status: phantom.status,\n  expectedFailure: \"Cannot find package 'is-number' imported from apps/api/index.js\"\n})\n\nresults.steps.push(command(pnpm, [\n  '--filter', '@codeinit/api', 'add', 'is-number@7.0.0'\n]))\nresults.steps.push(command(pnpm, ['--filter', '@codeinit/api', 'start']))\nresults.steps.push(command(pnpm, ['install', '--frozen-lockfile', '--ignore-scripts']))\n\nwriteFileSync(join(here, 'resultado.json'), JSON.stringify(results, null, 2) + '\\n')\nconsole.log('PASS: npm mascarou a dependência; pnpm revelou; declaração explícita corrigiu')\n",
      "fixture/package.json": "{\n  \"name\": \"codeinit-phantom-workspace\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"packageManager\": \"pnpm@11.24.0\",\n  \"workspaces\": [\"apps/*\", \"packages/*\"]\n}\n",
      "fixture/pnpm-workspace.yaml": "packages:\n  - \"apps/*\"\n  - \"packages/*\"\n\n",
      "fixture/apps/api/package.json": "{\n  \"name\": \"@codeinit/api\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"start\": \"node index.js\"\n  },\n  \"dependencies\": {\n    \"@codeinit/tool\": \"file:../../packages/tool\"\n  }\n}\n",
      "fixture/apps/api/index.js": "import isNumber from 'is-number'\nimport { classify } from '@codeinit/tool'\n\nif (!isNumber('42') || classify('CodeInit') !== 'text') {\n  throw new Error('resultado incorreto')\n}\n\nconsole.log('PASS: aplicação executou')\n\n",
      "fixture/packages/tool/package.json": "{\n  \"name\": \"@codeinit/tool\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"exports\": \"./index.js\",\n  \"dependencies\": {\n    \"is-number\": \"7.0.0\"\n  }\n}\n\n",
      "fixture/packages/tool/index.js": "import isNumber from 'is-number'\n\nexport function classify(value) {\n  return isNumber(value) ? 'number' : 'text'\n}\n\n"
    }
  }
}
