{
  "title": "Coverage regression checker",
  "human_url": "https://happytails.ai/en/developer-tools/coverage-regression-checker/",
  "agent_url": "https://happytails.ai/agents/en/developer-tools/coverage-regression-checker/",
  "language": "en",
  "markdown_url": "https://happytails.ai/en/developer-tools/coverage-regression-checker.md",
  "content": "Coverage regression checker\nCompare coverage from before and after a change and see the total change, the coverage of the changed lines and which files dropped. Each threshold gets a clear pass or fail.\nHow to use Coverage regression checker\nPaste the head coverage report from after the change.\nPaste the base report and, if you have it, the unified diff of the change.\nSet the minimum patch coverage and the largest allowed drop.\nRun the check and review the verdicts and per-file deltas.\nDownload the JSON report, CSV or Markdown summary.\nHow can we improve this tool?\nReport a problem or share an idea.\nPlease leave out private information. Your message and the tool name go to our team via PostHog.\nUseful next steps\nJSON diff\nXML validator\nRegex tester\nWhat it compares\nBoth reports are read into executable lines and hit counts. LCOV, Cobertura, JaCoCo, Istanbul coverage-final and json-summary, and Go coverprofile files are supported and detected automatically. Line coverage is the share of executable lines with at least one hit.\nPatch coverage\nWith a unified diff, the added lines of each file in the new version are checked against the head report. Lines that are not executable, such as comments, are left out. Paths are matched exactly after removing a/ and b/ prefixes and any prefixes you list, then by a unique path suffix.\nThresholds\nThe total drop check compares head and base line coverage in percentage points. Patch coverage passes when it is at least the minimum. A per-file drop check is available and is off at 100. Istanbul json-summary has no line detail, so it supports totals only.",
  "content_format": "text/plain",
  "visibility": "public",
  "links": [
    {
      "name": "JSON diff",
      "url": "https://happytails.ai/en/developer-tools/json-diff/"
    },
    {
      "name": "XML validator",
      "url": "https://happytails.ai/en/developer-tools/xml-validator/"
    },
    {
      "name": "Regex tester",
      "url": "https://happytails.ai/en/developer-tools/regex-tester/"
    }
  ],
  "tool": {
    "id": "coverage-regression-checker",
    "category": "developer-tools",
    "built": true,
    "requirements": "Up to 2,000,000 characters for each coverage report and 1,000,000 characters for the diff. Processing runs locally in a background worker in your browser. Downloads: a JSON report, a CSV of files and a Markdown table.",
    "implementation": {
      "fields": [
        {
          "key": "base",
          "label": "Base coverage report (before the change)",
          "value": "TN:\nSF:src/cart.js\nFN:3,addItem\nFNDA:4,addItem\nDA:3,4\nDA:4,4\nDA:5,0\nDA:7,4\nend_of_record\nSF:src/price.js\nDA:1,2\nDA:2,2\nDA:3,0\nend_of_record\n",
          "type": "textarea",
          "maxLength": 2000000,
          "help": "LCOV, Cobertura, JaCoCo, Istanbul or Go coverage from the base branch."
        },
        {
          "key": "changes",
          "label": "Unified diff or changed file list (optional)",
          "value": "diff --git a/src/cart.js b/src/cart.js\n--- a/src/cart.js\n+++ b/src/cart.js\n@@ -6,2 +6,4 @@\n }\n export function total(items){\n+  if(!items.length)return 0;\n+  return items.reduce((n,i)=>n+i.price,0);\ndiff --git a/src/price.js b/src/price.js\n--- a/src/price.js\n+++ b/src/price.js\n@@ -3,1 +3,1 @@\n-  return value;\n+  return Math.round(value*100)/100;\n",
          "type": "textarea",
          "maxLength": 1000000,
          "help": "A git diff gives patch coverage. A list of paths, one per line, limits the comparison to those files."
        },
        {
          "key": "format",
          "label": "Report format",
          "value": "auto",
          "type": "select",
          "values": [
            "auto",
            "lcov",
            "cobertura",
            "jacoco",
            "istanbul",
            "istanbul-summary",
            "go"
          ],
          "labels": {
            "auto": "Detect automatically",
            "lcov": "LCOV",
            "cobertura": "Cobertura",
            "jacoco": "JaCoCo",
            "istanbul": "Istanbul",
            "istanbul-summary": "Istanbul summary",
            "go": "Go coverage"
          }
        },
        {
          "key": "minPatch",
          "label": "Minimum patch coverage (%)",
          "value": "80",
          "type": "number",
          "min": 0,
          "max": 100,
          "step": "any"
        },
        {
          "key": "maxDrop",
          "label": "Largest allowed total drop (percentage points)",
          "value": "0",
          "type": "number",
          "min": 0,
          "max": 100,
          "step": "any"
        },
        {
          "key": "maxFileDrop",
          "label": "Largest allowed drop for one file (percentage points)",
          "value": "100",
          "type": "number",
          "min": 0,
          "max": 100,
          "step": "any",
          "help": "100 turns the per-file check off."
        },
        {
          "key": "stripPrefix",
          "label": "Path prefixes to remove",
          "value": "",
          "type": "text",
          "maxLength": 2000,
          "help": "Comma separated, for example /home/ci/project/."
        }
      ],
      "registrationFamily": "report-ingest-analysis-reference",
      "inputMaxLength": 2000000,
      "inputErrorCode": "REPORT_INGEST_ANALYSIS_REFERENCE_TOO_LONG",
      "note": "Runs in your browser in a background worker. Compares two coverage reports of up to 2,000,000 characters each and a diff of up to 1,000,000 characters.",
      "experience": {
        "automatic": false,
        "single": false,
        "inputMaxLength": 2000000,
        "inputMode": "text",
        "label": "Head coverage report",
        "placeholder": "SF:src/cart.js\nDA:3,5\nend_of_record",
        "help": "Paste the coverage file produced after your change, for example lcov.info or cobertura.xml. Up to 2,000,000 characters. Review the settings before running.",
        "action": null
      },
      "mode": "explicit",
      "interactive": false
    },
    "execution": "Browser interface",
    "api": null,
    "browser_agent": {
      "supported": true,
      "name": "run_current_tool",
      "discovery": "WebMCP on the human page in a supporting browser",
      "verification": "See audit/API-AUDIT.md; availability is not verification"
    }
  },
  "markdown": "# Coverage regression checker\n\n- Human page: https://happytails.ai/en/developer-tools/coverage-regression-checker/\n- Markdown: https://happytails.ai/en/developer-tools/coverage-regression-checker.md\n- Structured JSON: https://happytails.ai/agents/en/developer-tools/coverage-regression-checker/index.json\n- Visibility: public\n\n## Tool capabilities\n\n| Property | Value |\n| --- | --- |\n| Tool ID | `coverage-regression-checker` |\n| Category | developer-tools |\n| Implementation | Registered implementation. Registration alone is not a production-quality guarantee. |\n| Browser execution | Use the visible action or interactive controls. |\n| Browser processing | Browser; see tool notes for network behavior. |\n| HTTP API | Not callable through HTTP. |\n| Browser-agent interface | run_current_tool |\n\n### Implementation notes\n\nRuns in your browser in a background worker. Compares two coverage reports of up to 2,000,000 characters each and a diff of up to 1,000,000 characters.\n\n### Inputs and settings\n\nText input: Head coverage report.\n\nExample or placeholder shown in the interface (not a validated fixture):\n\n```text\nSF:src/cart.js\nDA:3,5\nend_of_record\n```\n\nPaste the coverage file produced after your change, for example lcov.info or cobertura.xml. Up to 2,000,000 characters. Review the settings before running.\n\n| Setting | Meaning | Control type | Default | Constraints |\n| --- | --- | --- | --- | --- |\n| `base` | Base coverage report (before the change) | textarea | \"TN:\\nSF:src/cart.js\\nFN:3,addItem\\nFNDA:4,addItem\\nDA:3,4\\nDA:4,4\\nDA:5,0\\nDA:7,4\\nend_of_record\\nSF:src/price.js\\nDA:1,2\\nDA:2,2\\nDA:3,0\\nend_of_record\\n\" |  |\n| `changes` | Unified diff or changed file list (optional) | textarea | \"diff --git a/src/cart.js b/src/cart.js\\n--- a/src/cart.js\\n+++ b/src/cart.js\\n@@ -6,2 +6,4 @@\\n }\\n export function total(items){\\n+  if(!items.length)return 0;\\n+  return items.reduce((n,i)=>n+i.price,0);\\ndiff --git a/src/price.js b/src/price.js\\n--- a/src/price.js\\n+++ b/src/price.js\\n@@ -3,1 +3,1 @@\\n-  return value;\\n+  return Math.round(value*100)/100;\\n\" |  |\n| `format` | Report format | select | \"auto\" | Allowed: auto, lcov, cobertura, jacoco, istanbul, istanbul-summary, go |\n| `minPatch` | Minimum patch coverage (%) | number | \"80\" | min=0 max=100 step=any |\n| `maxDrop` | Largest allowed total drop (percentage points) | number | \"0\" | min=0 max=100 step=any |\n| `maxFileDrop` | Largest allowed drop for one file (percentage points) | number | \"100\" | min=0 max=100 step=any |\n| `stripPrefix` | Path prefixes to remove | text | \"\" |  |\n\n### Browser-agent workflow\n\n1. Open the human page in a browser that supports WebMCP.\n2. Discover the interface exposed by that page; use its actual schema.\n3. Select files on the page first when the tool requires files.\n4. Call `run_current_tool` with valid input and settings.\n5. Inspect the returned result or error and the displayed output. Retrieve files from the displayed download links.\n\nCalls do not automatically copy or download results. Browser permissions still apply. Interface availability alone is not proof of successful execution.\n\n### Planning specification\n\nUp to 2,000,000 characters for each coverage report and 1,000,000 characters for the diff. Processing runs locally in a background worker in your browser. Downloads: a JSON report, a CSV of files and a Markdown table.\n\nThis describes intended requirements. Use the implementation notes, interface schema and observed output to determine current support.\n\n### Complete machine-readable capability record\n\n```json\n{\n  \"id\": \"coverage-regression-checker\",\n  \"category\": \"developer-tools\",\n  \"built\": true,\n  \"requirements\": \"Up to 2,000,000 characters for each coverage report and 1,000,000 characters for the diff. Processing runs locally in a background worker in your browser. Downloads: a JSON report, a CSV of files and a Markdown table.\",\n  \"implementation\": {\n    \"fields\": [\n      {\n        \"key\": \"base\",\n        \"label\": \"Base coverage report (before the change)\",\n        \"value\": \"TN:\\nSF:src/cart.js\\nFN:3,addItem\\nFNDA:4,addItem\\nDA:3,4\\nDA:4,4\\nDA:5,0\\nDA:7,4\\nend_of_record\\nSF:src/price.js\\nDA:1,2\\nDA:2,2\\nDA:3,0\\nend_of_record\\n\",\n        \"type\": \"textarea\",\n        \"maxLength\": 2000000,\n        \"help\": \"LCOV, Cobertura, JaCoCo, Istanbul or Go coverage from the base branch.\"\n      },\n      {\n        \"key\": \"changes\",\n        \"label\": \"Unified diff or changed file list (optional)\",\n        \"value\": \"diff --git a/src/cart.js b/src/cart.js\\n--- a/src/cart.js\\n+++ b/src/cart.js\\n@@ -6,2 +6,4 @@\\n }\\n export function total(items){\\n+  if(!items.length)return 0;\\n+  return items.reduce((n,i)=>n+i.price,0);\\ndiff --git a/src/price.js b/src/price.js\\n--- a/src/price.js\\n+++ b/src/price.js\\n@@ -3,1 +3,1 @@\\n-  return value;\\n+  return Math.round(value*100)/100;\\n\",\n        \"type\": \"textarea\",\n        \"maxLength\": 1000000,\n        \"help\": \"A git diff gives patch coverage. A list of paths, one per line, limits the comparison to those files.\"\n      },\n      {\n        \"key\": \"format\",\n        \"label\": \"Report format\",\n        \"value\": \"auto\",\n        \"type\": \"select\",\n        \"values\": [\n          \"auto\",\n          \"lcov\",\n          \"cobertura\",\n          \"jacoco\",\n          \"istanbul\",\n          \"istanbul-summary\",\n          \"go\"\n        ],\n        \"labels\": {\n          \"auto\": \"Detect automatically\",\n          \"lcov\": \"LCOV\",\n          \"cobertura\": \"Cobertura\",\n          \"jacoco\": \"JaCoCo\",\n          \"istanbul\": \"Istanbul\",\n          \"istanbul-summary\": \"Istanbul summary\",\n          \"go\": \"Go coverage\"\n        }\n      },\n      {\n        \"key\": \"minPatch\",\n        \"label\": \"Minimum patch coverage (%)\",\n        \"value\": \"80\",\n        \"type\": \"number\",\n        \"min\": 0,\n        \"max\": 100,\n        \"step\": \"any\"\n      },\n      {\n        \"key\": \"maxDrop\",\n        \"label\": \"Largest allowed total drop (percentage points)\",\n        \"value\": \"0\",\n        \"type\": \"number\",\n        \"min\": 0,\n        \"max\": 100,\n        \"step\": \"any\"\n      },\n      {\n        \"key\": \"maxFileDrop\",\n        \"label\": \"Largest allowed drop for one file (percentage points)\",\n        \"value\": \"100\",\n        \"type\": \"number\",\n        \"min\": 0,\n        \"max\": 100,\n        \"step\": \"any\",\n        \"help\": \"100 turns the per-file check off.\"\n      },\n      {\n        \"key\": \"stripPrefix\",\n        \"label\": \"Path prefixes to remove\",\n        \"value\": \"\",\n        \"type\": \"text\",\n        \"maxLength\": 2000,\n        \"help\": \"Comma separated, for example /home/ci/project/.\"\n      }\n    ],\n    \"registrationFamily\": \"report-ingest-analysis-reference\",\n    \"inputMaxLength\": 2000000,\n    \"inputErrorCode\": \"REPORT_INGEST_ANALYSIS_REFERENCE_TOO_LONG\",\n    \"note\": \"Runs in your browser in a background worker. Compares two coverage reports of up to 2,000,000 characters each and a diff of up to 1,000,000 characters.\",\n    \"experience\": {\n      \"automatic\": false,\n      \"single\": false,\n      \"inputMaxLength\": 2000000,\n      \"inputMode\": \"text\",\n      \"label\": \"Head coverage report\",\n      \"placeholder\": \"SF:src/cart.js\\nDA:3,5\\nend_of_record\",\n      \"help\": \"Paste the coverage file produced after your change, for example lcov.info or cobertura.xml. Up to 2,000,000 characters. Review the settings before running.\",\n      \"action\": null\n    },\n    \"mode\": \"explicit\",\n    \"interactive\": false\n  },\n  \"execution\": \"Browser interface\",\n  \"api\": null,\n  \"browser_agent\": {\n    \"supported\": true,\n    \"name\": \"run_current_tool\",\n    \"discovery\": \"WebMCP on the human page in a supporting browser\",\n    \"verification\": \"See audit/API-AUDIT.md; availability is not verification\"\n  }\n}\n```\n\n## Page guide\n\nCompare coverage from before and after a change and see the total change, the coverage of the changed lines and which files dropped. Each threshold gets a clear pass or fail.\n\n### How to use Coverage regression checker\n\n1. Paste the head coverage report from after the change.\n2. Paste the base report and, if you have it, the unified diff of the change.\n3. Set the minimum patch coverage and the largest allowed drop.\n4. Run the check and review the verdicts and per-file deltas.\n5. Download the JSON report, CSV or Markdown summary.\n\nHow can we improve this tool?\n\nReport a problem or share an idea.\n\nPlease leave out private information. Your message and the tool name go to our team via PostHog.\n\n## Useful next steps\n\n- [JSON diff](https://happytails.ai/en/developer-tools/json-diff/) ([Markdown](https://happytails.ai/en/developer-tools/json-diff.md))\n\n- [XML validator](https://happytails.ai/en/developer-tools/xml-validator/) ([Markdown](https://happytails.ai/en/developer-tools/xml-validator.md))\n\n- [Regex tester](https://happytails.ai/en/developer-tools/regex-tester/) ([Markdown](https://happytails.ai/en/developer-tools/regex-tester.md))\n\n## What it compares\n\nBoth reports are read into executable lines and hit counts. LCOV, Cobertura, JaCoCo, Istanbul coverage-final and json-summary, and Go coverprofile files are supported and detected automatically. Line coverage is the share of executable lines with at least one hit.\n\n### Patch coverage\n\nWith a unified diff, the added lines of each file in the new version are checked against the head report. Lines that are not executable, such as comments, are left out. Paths are matched exactly after removing a/ and b/ prefixes and any prefixes you list, then by a unique path suffix.\n\n### Thresholds\n\nThe total drop check compares head and base line coverage in percentage points. Patch coverage passes when it is at least the minimum. A per-file drop check is available and is off at 100. Istanbul json-summary has no line detail, so it supports totals only.\n"
}