{
  "asOf": "2026-09-09",
  "note": "The last twenty batch runs, newest last. A run is ok when nothing failed, partial when some items failed and the rest finished, and failed when the run stopped part way through. Every failure names the item and the reason, because a count on its own tells you nothing you can act on.",
  "counts": {
    "runs": 20,
    "byOutcome": {
      "ok": 14,
      "partial": 4,
      "failed": 2
    },
    "itemsProcessed": 3514,
    "itemsFailed": 22
  },
  "batches": [
    {
      "id": "B01",
      "kind": "regeneration",
      "label": "Regenerate every guide from its facts file",
      "startedAt": "2026-09-04T05:10:00Z",
      "durationSeconds": 11,
      "itemsProcessed": 26,
      "itemsPlanned": 26,
      "itemsFailed": 0,
      "outcome": "ok",
      "stoppedAt": null,
      "failures": []
    },
    {
      "id": "B02",
      "kind": "regeneration",
      "label": "Regenerate price sheets from the price source",
      "startedAt": "2026-09-04T11:02:00Z",
      "durationSeconds": 15,
      "itemsProcessed": 15,
      "itemsPlanned": 15,
      "itemsFailed": 0,
      "outcome": "ok",
      "stoppedAt": null,
      "failures": []
    },
    {
      "id": "B03",
      "kind": "rebuild",
      "label": "Rebuild the site from the content store",
      "startedAt": "2026-09-04T17:32:00Z",
      "durationSeconds": 138,
      "itemsProcessed": 233,
      "itemsPlanned": 233,
      "itemsFailed": 0,
      "outcome": "ok",
      "stoppedAt": null,
      "failures": []
    },
    {
      "id": "B04",
      "kind": "import",
      "label": "Import the partner register",
      "startedAt": "2026-09-04T23:52:00Z",
      "durationSeconds": 30,
      "itemsProcessed": 84,
      "itemsPlanned": 84,
      "itemsFailed": 3,
      "outcome": "partial",
      "stoppedAt": null,
      "failures": [
        {
          "item": "Approved returns policy",
          "itemId": "A022",
          "reason": "the price source had no row for this code",
          "reasonKind": "data"
        },
        {
          "item": "Approved data retention note",
          "itemId": "A033",
          "reason": "the template referenced a facts file that no longer exists",
          "reasonKind": "reference"
        },
        {
          "item": "Return form template",
          "itemId": "A044",
          "reason": "the output exceeded the page it had to fit",
          "reasonKind": "render"
        }
      ]
    },
    {
      "id": "B05",
      "kind": "regeneration",
      "label": "Regenerate the templates from brand rules",
      "startedAt": "2026-09-05T05:41:00Z",
      "durationSeconds": 11,
      "itemsProcessed": 15,
      "itemsPlanned": 15,
      "itemsFailed": 0,
      "outcome": "ok",
      "stoppedAt": null,
      "failures": []
    },
    {
      "id": "B06",
      "kind": "import",
      "label": "Import the parts record",
      "startedAt": "2026-09-05T10:56:00Z",
      "durationSeconds": 280,
      "itemsProcessed": 823,
      "itemsPlanned": 823,
      "itemsFailed": 0,
      "outcome": "ok",
      "stoppedAt": null,
      "failures": []
    },
    {
      "id": "B07",
      "kind": "rebuild",
      "label": "Rebuild the search index",
      "startedAt": "2026-09-05T16:55:00Z",
      "durationSeconds": 37,
      "itemsProcessed": 59,
      "itemsPlanned": 233,
      "itemsFailed": 2,
      "outcome": "failed",
      "stoppedAt": 59,
      "failures": [
        {
          "item": "Site readiness checklist template",
          "itemId": "A043",
          "reason": "the output exceeded the page it had to fit",
          "reasonKind": "render"
        },
        {
          "item": "Consumable price list",
          "itemId": "A054",
          "reason": "the import row had two values in one column",
          "reasonKind": "data"
        }
      ]
    },
    {
      "id": "B08",
      "kind": "regeneration",
      "label": "Regenerate the dashboards",
      "startedAt": "2026-09-05T23:37:00Z",
      "durationSeconds": 12,
      "itemsProcessed": 20,
      "itemsPlanned": 20,
      "itemsFailed": 0,
      "outcome": "ok",
      "stoppedAt": null,
      "failures": []
    },
    {
      "id": "B09",
      "kind": "import",
      "label": "Import the service record",
      "startedAt": "2026-09-06T05:59:00Z",
      "durationSeconds": 204,
      "itemsProcessed": 412,
      "itemsPlanned": 412,
      "itemsFailed": 0,
      "outcome": "ok",
      "stoppedAt": null,
      "failures": []
    },
    {
      "id": "B10",
      "kind": "rebuild",
      "label": "Rebuild the PDF set",
      "startedAt": "2026-09-06T11:45:00Z",
      "durationSeconds": 17,
      "itemsProcessed": 34,
      "itemsPlanned": 34,
      "itemsFailed": 4,
      "outcome": "partial",
      "stoppedAt": null,
      "failures": [
        {
          "item": "Extended warranty pricing",
          "itemId": "A064",
          "reason": "the owner field was blank, so the review date could not be set",
          "reasonKind": "data"
        },
        {
          "item": "Reading a calibration certificate",
          "itemId": "A075",
          "reason": "the source file was locked by another run",
          "reasonKind": "transient"
        },
        {
          "item": "Quote building guide",
          "itemId": "A086",
          "reason": "a required field was empty in the source row",
          "reasonKind": "data"
        },
        {
          "item": "Parts stock dashboard",
          "itemId": "A097",
          "reason": "the price source had no row for this code",
          "reasonKind": "data"
        }
      ]
    },
    {
      "id": "B11",
      "kind": "regeneration",
      "label": "Regenerate every guide from its facts file",
      "startedAt": "2026-09-06T17:46:00Z",
      "durationSeconds": 25,
      "itemsProcessed": 26,
      "itemsPlanned": 26,
      "itemsFailed": 0,
      "outcome": "ok",
      "stoppedAt": null,
      "failures": []
    },
    {
      "id": "B12",
      "kind": "regeneration",
      "label": "Regenerate price sheets from the price source",
      "startedAt": "2026-09-06T22:56:00Z",
      "durationSeconds": 9,
      "itemsProcessed": 15,
      "itemsPlanned": 15,
      "itemsFailed": 0,
      "outcome": "ok",
      "stoppedAt": null,
      "failures": []
    },
    {
      "id": "B13",
      "kind": "rebuild",
      "label": "Rebuild the site from the content store",
      "startedAt": "2026-09-07T05:44:00Z",
      "durationSeconds": 28,
      "itemsProcessed": 233,
      "itemsPlanned": 233,
      "itemsFailed": 0,
      "outcome": "ok",
      "stoppedAt": null,
      "failures": []
    },
    {
      "id": "B14",
      "kind": "import",
      "label": "Import the partner register",
      "startedAt": "2026-09-07T11:28:00Z",
      "durationSeconds": 40,
      "itemsProcessed": 84,
      "itemsPlanned": 84,
      "itemsFailed": 0,
      "outcome": "ok",
      "stoppedAt": null,
      "failures": []
    },
    {
      "id": "B15",
      "kind": "regeneration",
      "label": "Regenerate the templates from brand rules",
      "startedAt": "2026-09-07T17:34:00Z",
      "durationSeconds": 12,
      "itemsProcessed": 15,
      "itemsPlanned": 15,
      "itemsFailed": 5,
      "outcome": "partial",
      "stoppedAt": null,
      "failures": [
        {
          "item": "Training bookings dashboard",
          "itemId": "A099",
          "reason": "the source file was locked by another run",
          "reasonKind": "transient"
        },
        {
          "item": "Guide usage dashboard",
          "itemId": "A110",
          "reason": "a required field was empty in the source row",
          "reasonKind": "data"
        },
        {
          "item": "Company facts, addresses and contacts",
          "itemId": "A001",
          "reason": "the price source had no row for this code",
          "reasonKind": "data"
        },
        {
          "item": "Partner facts, Northlight Group",
          "itemId": "A012",
          "reason": "the template referenced a facts file that no longer exists",
          "reasonKind": "reference"
        },
        {
          "item": "Approved privacy statement",
          "itemId": "A023",
          "reason": "the output exceeded the page it had to fit",
          "reasonKind": "render"
        }
      ]
    },
    {
      "id": "B16",
      "kind": "import",
      "label": "Import the parts record",
      "startedAt": "2026-09-07T22:39:00Z",
      "durationSeconds": 132,
      "itemsProcessed": 823,
      "itemsPlanned": 823,
      "itemsFailed": 0,
      "outcome": "ok",
      "stoppedAt": null,
      "failures": []
    },
    {
      "id": "B17",
      "kind": "rebuild",
      "label": "Rebuild the search index",
      "startedAt": "2026-09-08T04:46:00Z",
      "durationSeconds": 49,
      "itemsProcessed": 131,
      "itemsPlanned": 233,
      "itemsFailed": 4,
      "outcome": "failed",
      "stoppedAt": 131,
      "failures": [
        {
          "item": "Approved onboarding note for new partners",
          "itemId": "A113",
          "reason": "the owner field was blank, so the review date could not be set",
          "reasonKind": "data"
        },
        {
          "item": "Product facts, Meridian Pro",
          "itemId": "A004",
          "reason": "the source file was locked by another run",
          "reasonKind": "transient"
        },
        {
          "item": "Accessory facts",
          "itemId": "A015",
          "reason": "a required field was empty in the source row",
          "reasonKind": "data"
        },
        {
          "item": "Approved quality statement",
          "itemId": "A026",
          "reason": "the price source had no row for this code",
          "reasonKind": "data"
        }
      ]
    },
    {
      "id": "B18",
      "kind": "regeneration",
      "label": "Regenerate the dashboards",
      "startedAt": "2026-09-08T11:08:00Z",
      "durationSeconds": 17,
      "itemsProcessed": 20,
      "itemsPlanned": 20,
      "itemsFailed": 0,
      "outcome": "ok",
      "stoppedAt": null,
      "failures": []
    },
    {
      "id": "B19",
      "kind": "import",
      "label": "Import the service record",
      "startedAt": "2026-09-08T16:58:00Z",
      "durationSeconds": 207,
      "itemsProcessed": 412,
      "itemsPlanned": 412,
      "itemsFailed": 4,
      "outcome": "partial",
      "stoppedAt": null,
      "failures": [
        {
          "item": "Service facts, Atlas Care Plus",
          "itemId": "A007",
          "reason": "the import row had two values in one column",
          "reasonKind": "data"
        },
        {
          "item": "Calibration standards facts",
          "itemId": "A018",
          "reason": "the owner field was blank, so the review date could not be set",
          "reasonKind": "data"
        },
        {
          "item": "Approved claim list",
          "itemId": "A029",
          "reason": "the source file was locked by another run",
          "reasonKind": "transient"
        },
        {
          "item": "Partner one pager template",
          "itemId": "A040",
          "reason": "a required field was empty in the source row",
          "reasonKind": "data"
        }
      ]
    },
    {
      "id": "B20",
      "kind": "rebuild",
      "label": "Rebuild the PDF set",
      "startedAt": "2026-09-08T23:54:00Z",
      "durationSeconds": 13,
      "itemsProcessed": 34,
      "itemsPlanned": 34,
      "itemsFailed": 0,
      "outcome": "ok",
      "stoppedAt": null,
      "failures": []
    }
  ]
}
