{
  "schema": 1,
  "exported_at": "2026-10-02T16:01:28+00:00",
  "dispatcher_repo": "https://github.com/DylnMtthws/sdlc-dispatcher",
  "host_note": {
    "docker_cpus": 1,
    "cpu_cap": "The runner requests --cpus=2; this host's Docker VM has fewer, so run_demo.py lowered that one flag to the available count. Nothing else changed."
  },
  "demo": {
    "source": "README quick-start demo (`sdlc-dispatcher demo`), regenerated for this page",
    "job": "4373eb32e6b5486886cfef9ecdb4077a",
    "external_id": "DEMO-1",
    "report": {
      "description": "Entering ' Ada ' should greet Ada without surrounding whitespace.",
      "title": "Greeting keeps accidental spaces"
    },
    "status": "ready",
    "revision": "e115fb2397bd8896f7437e0bf07beec723ad28e37631124ce49c1f88275ab64b",
    "policy": "450a9a0d1471b387c634a11a16865b87305387493e9894223facdbe3fb3d5ff6",
    "artifact_digest": "c1f74d86d90c5bb1f4eafaa32c3efb954e0bd171b80a72dade4e4fe0ec8209f8",
    "base_sha": "f3f95a108fdc2cf64f69bfb6a0693e2d81f3551e",
    "image": "sha256:75da068f73b9900c92e7127208a64dc18be3c6ba786285a3ab4dcc07132c3ead",
    "engine": "demo",
    "checks": [
      {
        "command": [
          "python",
          "-m",
          "unittest",
          "discover",
          "-v"
        ],
        "exit_code": 0
      }
    ],
    "regression_on_base": [
      {
        "command": [
          "python",
          "-m",
          "unittest",
          "discover",
          "-v"
        ],
        "exit_code": 1
      }
    ],
    "changed_files": [
      "greeting.py",
      "test_regression.py"
    ],
    "events": [
      {
        "action": "ingested",
        "at": "2026-10-02T15:51:35.665+00:00",
        "offset_s": 0.0,
        "detail": "needs_review"
      },
      {
        "action": "approved",
        "at": "2026-10-02T15:51:35.666+00:00",
        "offset_s": 0.001,
        "detail": ""
      },
      {
        "action": "started",
        "at": "2026-10-02T15:51:35.751+00:00",
        "offset_s": 0.085,
        "detail": ""
      },
      {
        "action": "coding_started",
        "at": "2026-10-02T15:51:36.351+00:00",
        "offset_s": 0.686,
        "detail": ""
      },
      {
        "action": "verifying",
        "at": "2026-10-02T15:51:36.660+00:00",
        "offset_s": 0.995,
        "detail": ""
      },
      {
        "action": "verification_started",
        "at": "2026-10-02T15:51:36.661+00:00",
        "offset_s": 0.996,
        "detail": ""
      },
      {
        "action": "ready",
        "at": "2026-10-02T15:51:37.289+00:00",
        "offset_s": 1.623,
        "detail": ""
      }
    ],
    "logs": {
      "baseline": "test_basic (test_greeting.GreetingTest.test_basic) ... ok\n\n----------------------------------------------------------------------\nRan 1 test in 0.000s\n\nOK",
      "regression_on_base": "test_basic (test_greeting.GreetingTest.test_basic) ... ok\ntest_spaces (test_regression.Regression.test_spaces) ... FAIL\n\n======================================================================\nFAIL: test_spaces (test_regression.Regression.test_spaces)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n  File \"/workspace/test_regression.py\", line 5, in test_spaces\n    self.assertEqual(greet(\" Ada \"), \"Hello, Ada\")\nAssertionError: 'Hello,  Ada ' != 'Hello, Ada'\n- Hello,  Ada \n?        -   -\n+ Hello, Ada\n\n\n----------------------------------------------------------------------\nRan 2 tests in 0.001s\n\nFAILED (failures=1)",
      "fresh_verification": "test_basic (test_greeting.GreetingTest.test_basic) ... ok\ntest_spaces (test_regression.Regression.test_spaces) ... ok\n\n----------------------------------------------------------------------\nRan 2 tests in 0.001s\n\nOK",
      "agent": ""
    },
    "review_diff": "--- a/greeting.py\n+++ b/greeting.py\n@@ -1,2 +1,2 @@\n def greet(name):\n-    return \"Hello, \" + name\n+    return \"Hello, \" + name.strip()\n--- /dev/null\n+++ b/test_regression.py\n@@ -0,0 +1,5 @@\n+import unittest\n+from greeting import greet\n+class Regression(unittest.TestCase):\n+    def test_spaces(self):\n+        self.assertEqual(greet(\" Ada \"), \"Hello, Ada\")",
    "files": [
      "agent.log",
      "baseline-0.log",
      "candidate.json",
      "check-0.log",
      "regression-0.log",
      "result.json",
      "review.diff"
    ],
    "seed_source": {
      "greeting.py": "def greet(name):\n    return \"Hello, \" + name\n",
      "test_greeting.py": "import unittest\nfrom greeting import greet\n\nclass GreetingTest(unittest.TestCase):\n    def test_basic(self):\n        self.assertEqual(greet(\"Ada\"), \"Hello, Ada\")\n"
    }
  },
  "blocked": {
    "source": "First attempt at the same demo on this machine, before the CPU accommodation",
    "job": "1226762400414e80bd14a8d41e98d4da",
    "status": "blocked",
    "events": [
      {
        "action": "ingested",
        "at": "2026-10-02T15:50:55.360+00:00",
        "offset_s": 0.0,
        "detail": "needs_review"
      },
      {
        "action": "approved",
        "at": "2026-10-02T15:50:55.360+00:00",
        "offset_s": 0.001,
        "detail": ""
      },
      {
        "action": "started",
        "at": "2026-10-02T15:50:55.480+00:00",
        "offset_s": 0.121,
        "detail": ""
      },
      {
        "action": "blocked",
        "at": "2026-10-02T15:50:55.842+00:00",
        "offset_s": 0.482,
        "detail": "Baseline checks failed; repair the environment or triage existing failures"
      }
    ],
    "baseline_log": "docker: Error response from daemon: range of CPUs is from 0.01 to 1.00, as there are only 1 CPUs available\n\nRun 'docker run --help' for more information",
    "files": [
      "baseline-0.log"
    ]
  },
  "live": {
    "source": "Live Deck Lab pilot run on the dispatcher host, exported from its queue and receipts",
    "label": "DYL-11",
    "job": "acc317d6e6344fc6953352b0adc366ae",
    "report_title": "[Bug] Choose/commanders/partner button styling is way off",
    "status": "published",
    "attempts": 1,
    "revision": "2a286c0cca929c8112b337a525fd28fe4512780bdfe9d30b8785a2c9bbd4d0e4",
    "policy": "f2f385b1ed8c8493c3d2f1ffce731de1ecb6a25ba1d01543fac461ad13f44534",
    "base_sha": "b36424793f68cb717e87ab8d3f9302df96cbb1ae",
    "artifact_digest": "ed2e0ad49f997943afa96b9dcd5661e94f2f4222773af3d803e1e752e8b438f8",
    "engine": "cursor",
    "model": "grok-4.6[effort=high,fast=false]",
    "image": "sha256:135492650c621252fa2bf0c27317eb7aaf7241988f55b968efb4f9d9474c065e",
    "changed_files": [
      "src/sabermetrics/ui/static/deck-lab.css",
      "tests/test_layout.py"
    ],
    "context_files": [
      "src/sabermetrics/ui/templates/deck_lab/base.html",
      "src/sabermetrics/ui/templates/deck_lab/builder.html"
    ],
    "events": [
      {
        "action": "ingested",
        "at": "2026-09-08T22:49:06.942+00:00",
        "offset_s": 0.0,
        "detail": "queued"
      },
      {
        "action": "started",
        "at": "2026-09-08T22:51:58.626+00:00",
        "offset_s": 171.683,
        "detail": ""
      },
      {
        "action": "coding_started",
        "at": "2026-09-08T22:53:13.006+00:00",
        "offset_s": 246.063,
        "detail": ""
      },
      {
        "action": "verifying",
        "at": "2026-09-08T22:57:54.884+00:00",
        "offset_s": 527.942,
        "detail": ""
      },
      {
        "action": "verification_started",
        "at": "2026-09-08T22:57:54.885+00:00",
        "offset_s": 527.942,
        "detail": ""
      },
      {
        "action": "review_started",
        "at": "2026-09-08T22:59:54.052+00:00",
        "offset_s": 647.109,
        "detail": ""
      },
      {
        "action": "preview_prepared",
        "at": "2026-09-08T23:00:02.550+00:00",
        "offset_s": 655.608,
        "detail": "ed2e0ad49f997943afa96b9dcd5661e94f2f4222773af3d803e1e752e8b438f8"
      },
      {
        "action": "review_completed",
        "at": "2026-09-08T23:01:23.095+00:00",
        "offset_s": 736.153,
        "detail": "pass:ed2e0ad49f997943afa96b9dcd5661e94f2f4222773af3d803e1e752e8b438f8"
      },
      {
        "action": "ready",
        "at": "2026-09-08T23:01:23.097+00:00",
        "offset_s": 736.154,
        "detail": ""
      },
      {
        "action": "publication_started",
        "at": "2026-09-08T23:01:23.460+00:00",
        "offset_s": 736.517,
        "detail": ""
      },
      {
        "action": "published",
        "at": "2026-09-08T23:01:28.821+00:00",
        "offset_s": 741.879,
        "detail": "https://github.com/DylnMtthws/deck-lab/pull/32"
      }
    ],
    "checks": {
      "ruff check --no-cache src tests": {
        "baseline_tail": "All checks passed!",
        "candidate_tail": "All checks passed!",
        "exit_code": 0
      },
      "black --check src tests": {
        "baseline_tail": "231 files would be left unchanged.",
        "candidate_tail": "232 files would be left unchanged.",
        "exit_code": 0
      },
      "mypy --cache-dir=/tmp/mypy-cache src": {
        "baseline_tail": "Success: no issues found in 134 source files",
        "candidate_tail": "Success: no issues found in 134 source files",
        "exit_code": 0
      },
      "pytest -q -p no:cacheprovider": {
        "baseline_tail": "1349 passed, 31 skipped, 53 warnings in 39.48s",
        "candidate_tail": "1350 passed, 31 skipped, 53 warnings in 41.78s",
        "exit_code": 0
      }
    },
    "regression_on_base": {
      "commands": [
        {
          "command": [
            "pytest",
            "-q",
            "-p",
            "no:cacheprovider"
          ],
          "exit_code": 1
        }
      ],
      "failure": "=================================== FAILURES ===================================\n_______ test_choose_commanders_button_is_inset_and_compact_in_add_panel ________\n\n    def test_choose_commanders_button_is_inset_and_compact_in_add_panel() -> None:\n        \"\"\"The add-rail opener was full-bleed 16px text in a 220–250px column.\"\"\"\n        html = BUILDER_TEMPLATE.read_text()\n        assert re.search(\n            r'<aside class=\"dl-add-panel\"[^>]*>[\\s\\S]*?'\n            r'<button class=\"dl-button\"[^>]*data-commanders-open[^>]*>'\n            r\"Choose commanders / partner</button>\",\n            html,\n        )\n>       body = _rule_body(CSS_PATH.read_text(), \".dl-add-panel [data-commanders-open]\")\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\ntests/test_layout.py:30: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncss = ':root {\\n  color-scheme: dark;\\n  --ink: #0a0d16;\\n  --ink-deep: #06080d;\\n  --panel: #12172a;\\n  --panel-2: #1b2238;...0px; height: auto; }\\n.dl-commander-results button { display: block; widt …[truncated]\nselector = '.dl-add-panel [data-commanders-open]'\n\n    def _rule_body(css: str, selector: str) -> str:\n        match = re.search(re.escape(selector) + r\"\\s*\\{([^}]+)\\}\", css)\n>       assert match, f\"missing CSS rule for {selector}\"\nE       AssertionError: missing CSS rule for .dl-add-panel [data-commanders-open]\nE       assert None\n\ntests/test_layout.py:17: AssertionError"
    },
    "review_diff_stat": {
      "files": 2,
      "lines": 57
    },
    "test_diff": "\"\"\"Builder chrome layout: the commanders opener must fit the add-cards rail.\"\"\"\n\nfrom __future__ import annotations\n\nimport re\nfrom pathlib import Path\n\nROOT = Path(__file__).resolve().parents[1]\nCSS_PATH = ROOT / \"src\" / \"sabermetrics\" / \"ui\" / \"static\" / \"deck-lab.css\"\nBUILDER_TEMPLATE = (\n    ROOT / \"src\" / \"sabermetrics\" / \"ui\" / \"templates\" / \"deck_lab\" / \"builder.html\"\n)\n\n\ndef _rule_body(css: str, selector: str) -> str:\n    match = re.search(re.escape(selector) + r\"\\s*\\{([^}]+)\\}\", css)\n    assert match, f\"missing CSS rule for {selector}\"\n    return match.group(1)\n\n\ndef test_choose_commanders_button_is_inset_and_compact_in_add_panel() -> None:\n    \"\"\"The add-rail opener was full-bleed 16px text in a 220–250px column.\"\"\"\n    html = BUILDER_TEMPLATE.read_text()\n    assert re.search(\n        r'<aside class=\"dl-add-panel\"[^>]*>[\\s\\S]*?'\n        r'<button class=\"dl-button\"[^>]*data-commanders-open[^>]*>'\n        r\"Choose commanders / partner</button>\",\n        html,\n    )\n    body = _rule_body(CSS_PATH.read_text(), \".dl-add-panel [data-commanders-open]\")\n    assert re.search(r\"margin\\s*:\\s*0\\s+14px\\s+10px\", body)\n    font = re.search(r\"font-size\\s*:\\s*(\\d+(?:\\.\\d+)?)px\", body)\n    assert font is not None and float(font.group(1)) <= 12\n    assert re.search(r\"white-space\\s*:\\s*nowrap\", body)\n    assert re.search(r\"flex\\s*:\\s*none\", body)\n    min_height = re.search(r\"min-height\\s*:\\s*(\\d+(?:\\.\\d+)?)px\", body)\n    assert min_height is not None and float(min_height.group(1)) <= 36\n",
    "review": {
      "verdict": "pass",
      "summary": "The scoped CSS fixes the reported button styling in supplied desktop evidence, preserves the shared button component, and introduces no demonstrated blocking regression.",
      "findings": [
        {
          "id": "R1",
          "severity": "low",
          "blocking": false,
          "category": "test_quality",
          "path": "tests/test_layout.py",
          "line": 30,
          "requirement": "Regression tests should verify observable layout behavior.",
          "evidence": "The test inspects CSS strings rather than rendered geometry. A later overriding rule could restore the defect while this test still passes. The supplied base failure establishes only that the selector was absent.",
          "impact": "The committed test offers limited protection against recurrence, although independent desktop screenshots demonstrate this fix.",
          "requested_change": "Add browser regression coverage for button containment, spacing, and label overflow in the desktop rail and open mobile panel."
        }
      ],
      "coverage": [
        "Reviewed the packet, policy, complete diff, supplied templates, surrounding CSS, screenshots, browser measurements, and check logs.",
        "Desktop screenshots with one and two commanders show the button inset consistently with nearby controls and its label on one line.",
        "The change retains shared button styling, native button semantics, hover behavior, and the global focus outline; no new component or architecture boundary is introduced.",
        "Single-commander containment and partner overflow measurements are identical before and after; nearby zone overlap is pre-existing.",
        "Supplied checks report successful Ruff, Black, mypy, and pytest results: 1350 passed and 31 skipped. No tests were run by this reviewer."
      ],
      "limitations": [
        "Evidence uses synthetic fixtures without production data or external card artwork.",
        "Browser evidence covers Chromium at 1440×900 and 390×844; mobile screenshots show the add panel closed and do not validate the changed button.",
        "The 220px tablet rail, reported 1440×812 viewport, browser/text zoom, keyboard interaction, and other browsers lack direct evidence.",
        "Referenced builder JavaScript is absent from the supplied source subset, so commander-dialog interaction could not be inspected."
      ],
      "suggested_debt": [
        "Track pre-existing partner-card overflow and commander/Unsorted zone overlap separately; supplied before/after measurements show no change."
      ],
      "model_requested": "gpt-6-astra",
      "model_reported": "gpt-6-astra",
      "reasoning_effort": "high",
      "cli_version": "codex-cli 0.153.1",
      "duration_s": 79.4,
      "usage": {
        "input_tokens": 236118,
        "cached_input_tokens": 15616,
        "cache_write_input_tokens": 0,
        "output_tokens": 1212,
        "reasoning_output_tokens": 51
      },
      "input_digest": "5f44bf64e284cf841ac0eeb3ca72d889fc9cd1dad52cc94b2ef8273d847159c9",
      "review_digest": "4e6866e5091fadf7b83f2b30d2eae7b1c53c38e7b7e4f7b9707087c39393b419",
      "input_files": 28,
      "receipt": {
        "verdict": "pass",
        "metadata_digest": "2f72c47cf77132397c898505cf80b996b8674c55c01148b3cc67bd4796c03852",
        "artifact_digest": "ed2e0ad49f997943afa96b9dcd5661e94f2f4222773af3d803e1e752e8b438f8"
      }
    },
    "pull_request": {
      "url": "https://github.com/DylnMtthws/deck-lab/pull/32",
      "title": "Fix feedback: deck-lab (acc317d6)",
      "created_at": "2026-09-08T23:01:28Z",
      "merged_at": "2026-09-08T23:11:02Z",
      "merged_by": "DylnMtthws",
      "additions": 45,
      "deletions": 0,
      "timeline": [
        {
          "event": "committed",
          "at": "2026-09-08T23:01:25Z"
        },
        {
          "event": "ready_for_review",
          "at": "2026-09-08T23:10:54Z"
        },
        {
          "event": "merged",
          "at": "2026-09-08T23:11:02Z"
        },
        {
          "event": "closed",
          "at": "2026-09-08T23:11:02Z"
        }
      ],
      "checks": [
        {
          "name": "container",
          "conclusion": "success",
          "url": "https://github.com/DylnMtthws/deck-lab/actions/runs/34288729150/job/102271451262"
        },
        {
          "name": "review",
          "conclusion": "success",
          "url": "https://github.com/DylnMtthws/deck-lab/actions/runs/34288729150/job/102270236290"
        },
        {
          "name": "test",
          "conclusion": "success",
          "url": "https://github.com/DylnMtthws/deck-lab/actions/runs/34288729150/job/102270236011"
        },
        {
          "name": "dispatcher/astra",
          "conclusion": "success",
          "description": "Astra High passed this exact verified candidate"
        }
      ],
      "body_excerpt": [
        "Proposed fix for dispatcher job `acc317d6e6344fc6953352b0adc366ae`.",
        "Independent baseline and candidate checks passed in an offline container. Review the code and private dispatcher evidence before merging. This run does not deploy or close the source issue.",
        "Base commit: `b36424793f68cb717e87ab8d3f9302df96cbb1ae`",
        "Artifact digest: `ed2e0ad49f997943afa96b9dcd5661e94f2f4222773af3d803e1e752e8b438f8`",
        "Environment: `sha256:135492650c621252fa2bf0c27317eb7aaf7241988f55b968efb4f9d9474c065e`",
        "Changed files:",
        "- `src/sabermetrics/ui/static/deck-lab.css`",
        "- `tests/test_layout.py`",
        "Independent review: **Astra High — pass**. 1 advisory finding(s); no blocking findings.",
        "Review packet: `5f44bf64e284cf841ac0eeb3ca72d889fc9cd1dad52cc94b2ef8273d847159c9`",
        "- Advisory (low): `tests/test_layout.py:30`",
        "Mark this draft ready and merge after trying the preview and CI passes. Merging accepts the code. Production release requires the project’s separate approval workflow."
      ]
    }
  },
  "incidents": {
    "repair_bound": {
      "job": "69ca699e2f644056974b5bd8a8d084de",
      "status": "blocked",
      "events_before_window": {
        "ingested": 1,
        "policy_changed_or_limit_reached": 22,
        "automatic_approval": 22
      },
      "events": [
        {
          "action": "started",
          "at": "2026-09-10T06:19:26.127+00:00",
          "offset_s": 0.0,
          "detail": ""
        },
        {
          "action": "coding_started",
          "at": "2026-09-10T06:20:45.742+00:00",
          "offset_s": 79.615,
          "detail": ""
        },
        {
          "action": "verifying",
          "at": "2026-09-10T06:26:53.230+00:00",
          "offset_s": 447.103,
          "detail": ""
        },
        {
          "action": "verification_started",
          "at": "2026-09-10T06:26:53.230+00:00",
          "offset_s": 447.103,
          "detail": ""
        },
        {
          "action": "review_started",
          "at": "2026-09-10T06:29:00.873+00:00",
          "offset_s": 574.746,
          "detail": ""
        },
        {
          "action": "preview_prepared",
          "at": "2026-09-10T06:29:20.444+00:00",
          "offset_s": 594.317,
          "detail": "fc5146fa8e1a0b6b4e88c311e6c8f3500cb95ae22940551fd2447afd9f19ffb1"
        },
        {
          "action": "review_completed",
          "at": "2026-09-10T06:31:05.108+00:00",
          "offset_s": 698.981,
          "detail": "needs_human_review:fc5146fa8e1a0b6b4e88c311e6c8f3500cb95ae22940551fd2447afd9f19ffb1"
        },
        {
          "action": "repair_started",
          "at": "2026-09-10T06:31:05.111+00:00",
          "offset_s": 698.984,
          "detail": "1"
        },
        {
          "action": "repair_started",
          "at": "2026-09-10T06:31:05.227+00:00",
          "offset_s": 699.1,
          "detail": ""
        },
        {
          "action": "verifying",
          "at": "2026-09-10T06:42:40.385+00:00",
          "offset_s": 1394.258,
          "detail": ""
        },
        {
          "action": "verification_started",
          "at": "2026-09-10T06:42:40.386+00:00",
          "offset_s": 1394.259,
          "detail": ""
        },
        {
          "action": "review_started",
          "at": "2026-09-10T06:44:42.841+00:00",
          "offset_s": 1516.714,
          "detail": ""
        },
        {
          "action": "preview_prepared",
          "at": "2026-09-10T06:45:01.634+00:00",
          "offset_s": 1535.507,
          "detail": "c6f49c10aabaf66849bb26c3d914f3c2a8d2b09570b12e3acd74d6118181e18d"
        },
        {
          "action": "review_completed",
          "at": "2026-09-10T06:46:21.582+00:00",
          "offset_s": 1615.455,
          "detail": "needs_human_review:c6f49c10aabaf66849bb26c3d914f3c2a8d2b09570b12e3acd74d6118181e18d"
        },
        {
          "action": "repair_started",
          "at": "2026-09-10T06:46:21.586+00:00",
          "offset_s": 1615.459,
          "detail": "2"
        },
        {
          "action": "repair_started",
          "at": "2026-09-10T06:46:21.707+00:00",
          "offset_s": 1615.58,
          "detail": ""
        },
        {
          "action": "blocked",
          "at": "2026-09-10T06:49:26.883+00:00",
          "offset_s": 1800.756,
          "detail": "Worker cancelled or deadline exceeded"
        }
      ]
    },
    "publication_reconcile": {
      "job": "faa425d54a024f27b6cbfd632be1e17f",
      "status": "published",
      "events_before_window": {
        "ingested": 1,
        "approved": 1,
        "started": 2,
        "blocked": 1,
        "recovered_candidate_verified": 1,
        "retry_authorized": 1,
        "coding_started": 1,
        "verifying": 1,
        "verification_started": 1,
        "review_started": 1,
        "preview_prepared": 1
      },
      "events": [
        {
          "action": "review_completed",
          "at": "2026-09-08T23:35:54.000+00:00",
          "offset_s": 0.0,
          "detail": "pass:77198b3a43fd25e8205e7db42a1f1bef2532fa1b5749c938e37314a330186b6f"
        },
        {
          "action": "ready",
          "at": "2026-09-08T23:35:54.001+00:00",
          "offset_s": 0.002,
          "detail": ""
        },
        {
          "action": "publication_started",
          "at": "2026-09-08T23:35:54.240+00:00",
          "offset_s": 0.241,
          "detail": ""
        },
        {
          "action": "publication_needs_attention",
          "at": "2026-09-08T23:36:02.341+00:00",
          "offset_s": 8.342,
          "detail": "Inspect publisher auth or reconcile an ambiguous write"
        },
        {
          "action": "publication_started",
          "at": "2026-09-08T23:48:32.634+00:00",
          "offset_s": 758.634,
          "detail": ""
        },
        {
          "action": "published",
          "at": "2026-09-08T23:48:37.379+00:00",
          "offset_s": 763.379,
          "detail": "https://github.com/DylnMtthws/deck-lab/pull/33"
        }
      ]
    },
    "unverified_approval": {
      "job": "5c3639796b474dab99d30e3f2a6891b7",
      "status": "published",
      "events_before_window": {
        "ingested": 1,
        "started": 3,
        "coding_started": 2,
        "blocked": 2,
        "retry_authorized": 3,
        "verifying": 2,
        "verification_started": 2,
        "review_started": 2,
        "preview_prepared": 2,
        "review_completed": 2,
        "policy_changed_or_limit_reached": 1,
        "repair_started": 1,
        "ready": 1,
        "publication_started": 1
      },
      "events": [
        {
          "action": "published",
          "at": "2026-09-09T17:17:43.713+00:00",
          "offset_s": 0.0,
          "detail": "https://github.com/DylnMtthws/deck-lab/pull/39"
        },
        {
          "action": "release_blocked",
          "at": "2026-09-09T17:28:22.858+00:00",
          "offset_s": 639.145,
          "detail": "Ready to Deploy was observed without a verified owner webhook. Move the issue back to Ready for Your Review, then select Ready to Deploy again; check webhook delivery if this repeats."
        },
        {
          "action": "linear_release_approved",
          "at": "2026-09-09T17:43:07.923+00:00",
          "offset_s": 1524.21,
          "detail": {
            "head": "8e06dc47cb578c1cbf8582c034880f2b78a1f79f"
          }
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T17:43:12.835+00:00",
          "offset_s": 1529.121,
          "detail": "validating"
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T17:43:35.338+00:00",
          "offset_s": 1551.625,
          "detail": "merging"
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T17:44:12.880+00:00",
          "offset_s": 1589.166,
          "detail": "main_ci"
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T17:49:39.321+00:00",
          "offset_s": 1915.608,
          "detail": "dispatching"
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T17:49:58.504+00:00",
          "offset_s": 1934.791,
          "detail": "deploying"
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T17:54:37.788+00:00",
          "offset_s": 2214.075,
          "detail": "deploying"
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T17:54:40.888+00:00",
          "offset_s": 2217.174,
          "detail": "done"
        }
      ]
    },
    "production_failure": {
      "job": "3997a74d06a44bf289d8ea2611add64d",
      "status": "published",
      "events_before_window": {
        "ingested": 1,
        "started": 2,
        "coding_started": 1,
        "verifying": 3,
        "verification_started": 3,
        "review_started": 3,
        "preview_prepared": 3,
        "review_completed": 3,
        "repair_started": 5,
        "blocked": 1,
        "retry_authorized": 1,
        "ready": 1,
        "publication_started": 1,
        "published": 1
      },
      "events": [
        {
          "action": "linear_release_approved",
          "at": "2026-09-09T14:34:41.707+00:00",
          "offset_s": 0.0,
          "detail": {
            "head": "f6381bf0ec25ef25811c911676233f16675cd2f1"
          }
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T14:34:58.349+00:00",
          "offset_s": 16.642,
          "detail": "validating"
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T14:35:21.732+00:00",
          "offset_s": 40.025,
          "detail": "merging"
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T14:35:59.369+00:00",
          "offset_s": 77.662,
          "detail": "main_ci"
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T14:41:27.091+00:00",
          "offset_s": 405.384,
          "detail": "dispatching"
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T14:41:45.996+00:00",
          "offset_s": 424.289,
          "detail": "deploying"
        },
        {
          "action": "release_retry",
          "at": "2026-09-09T14:42:55.973+00:00",
          "offset_s": 494.266,
          "detail": "Production workflow failed: https://github.com/DylnMtthws/deck-lab/actions/runs/34365278353. Inspect backup and deployment receipt before retrying; the old build may still be live."
        },
        {
          "action": "release_retry",
          "at": "2026-09-09T14:43:58.044+00:00",
          "offset_s": 556.337,
          "detail": "Production workflow failed: https://github.com/DylnMtthws/deck-lab/actions/runs/34365278353. Inspect backup and deployment receipt before retrying; the old build may still be live."
        },
        {
          "action": "release_blocked",
          "at": "2026-09-09T14:45:00.090+00:00",
          "offset_s": 618.383,
          "detail": "Production workflow failed: https://github.com/DylnMtthws/deck-lab/actions/runs/34365278353. Inspect backup and deployment receipt before retrying; the old build may still be live."
        },
        {
          "action": "linear_release_approved",
          "at": "2026-09-09T15:14:45.257+00:00",
          "offset_s": 2403.55,
          "detail": {
            "head": "f6381bf0ec25ef25811c911676233f16675cd2f1"
          }
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T15:16:16.480+00:00",
          "offset_s": 2494.773,
          "detail": "main_ci"
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T15:16:35.539+00:00",
          "offset_s": 2513.832,
          "detail": "dispatching"
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T15:16:54.266+00:00",
          "offset_s": 2532.559,
          "detail": "deploying"
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T15:22:56.803+00:00",
          "offset_s": 2895.096,
          "detail": "deploying"
        },
        {
          "action": "release_progress",
          "at": "2026-09-09T15:22:57.220+00:00",
          "offset_s": 2895.513,
          "detail": "done"
        }
      ]
    },
    "eligibility_withdrawn": {
      "job": "82e0304d06f847d593f652d9e412d025",
      "status": "needs_review",
      "events_before_window": {},
      "events": [
        {
          "action": "ingested",
          "at": "2026-09-09T18:04:17.805+00:00",
          "offset_s": 0.0,
          "detail": "queued"
        },
        {
          "action": "policy_changed_or_limit_reached",
          "at": "2026-09-09T18:04:21.284+00:00",
          "offset_s": 3.479,
          "detail": ""
        },
        {
          "action": "automatic_approval",
          "at": "2026-09-09T18:04:27.849+00:00",
          "offset_s": 10.044,
          "detail": ""
        },
        {
          "action": "policy_changed_or_limit_reached",
          "at": "2026-09-09T18:04:31.908+00:00",
          "offset_s": 14.103,
          "detail": ""
        },
        {
          "action": "eligibility_withdrawn",
          "at": "2026-09-09T18:05:12.822+00:00",
          "offset_s": 55.018,
          "detail": ""
        }
      ]
    }
  },
  "tests": {
    "command": "PYTHONPATH=src:tests python -m unittest -v <the tests below>",
    "dispatcher_commit": "c8c4b942a78d107445bfb3617bd1a83956dac469",
    "summary": "Ran 19 tests in 0.714s",
    "final": "OK",
    "exit_code": 0,
    "groups": {
      "baseline": [
        {
          "file": "tests/test_worker.py",
          "name": "test_baseline_failure_does_not_launch_agent",
          "result": "ok",
          "source": "def test_baseline_failure_does_not_launch_agent(self):\n        runner = self.run_worker(\"baseline\")\n        self.assertEqual(len(runner.calls), 1)\n        self.assertEqual(self.store.get(self.job)[\"status\"], \"blocked\")"
        }
      ],
      "regression": [
        {
          "file": "tests/test_worker.py",
          "name": "test_independent_verification_and_regression_evidence",
          "result": "ok",
          "source": ""
        },
        {
          "file": "tests/test_worker.py",
          "name": "test_no_change_and_no_regression_and_policy_violation_blocked",
          "result": "ok",
          "source": ""
        }
      ],
      "repair_bound": [
        {
          "file": "tests/test_worker.py",
          "name": "test_two_repair_round_bound_is_enforced",
          "result": "ok",
          "source": "def test_two_repair_round_bound_is_enforced(self):\n        runner, reviews = self.exercise(\n            [{\"verdict\": \"changes_required\", \"findings\": [self.finding(i)]} for i in range(3)]\n        )\n        self.assertEqual(len(reviews), 3)\n        self.assertEqual(sum(c[\"phase\"] == \"agent\" for c in runner.calls), 3)\n        self.assertEqual(self.store.get(self.job)[\"status\"], \"blocked\")"
        },
        {
          "file": "tests/test_worker.py",
          "name": "test_repeated_blockers_stop_before_second_repair",
          "result": "ok",
          "source": ""
        }
      ],
      "revoked_approval": [
        {
          "file": "tests/test_store.py",
          "name": "test_report_update_cancels_run",
          "result": "ok",
          "source": "def test_report_update_cancels_run(self):\n        job = self.enqueue()\n        self.store.approve(job, self.project)\n        self.store.claim(self.project)\n        self.store.ingest(\n            self.project, \"manual\", \"1\", {\"title\": \"Updated\", \"description\": \"Changed\"}\n        )\n        self.assertTrue(self.store.cancelled(job))\n        self.store.finish(job, \"ready\", artifact=\"unsafe\")\n        row = self.store.get(job)\n        self.assertEqual(row[\"status\"], \"cancelled\")\n        self.assertIsNone(row[\"artifact\"])"
        },
        {
          "file": "tests/test_store.py",
          "name": "test_policy_change_requires_new_approval",
          "result": "ok",
          "source": ""
        },
        {
          "file": "tests/test_linear.py",
          "name": "test_withdrawal_cancels_previously_eligible_work",
          "result": "ok",
          "source": ""
        },
        {
          "file": "tests/test_linear_release.py",
          "name": "test_issue_edit_invalidates_approval",
          "result": "ok",
          "source": ""
        },
        {
          "file": "tests/test_linear_release.py",
          "name": "test_stale_event_after_revocation_cannot_reapprove",
          "result": "ok",
          "source": ""
        },
        {
          "file": "tests/test_linear_release.py",
          "name": "test_withdrawal_prevents_merge",
          "result": "ok",
          "source": ""
        }
      ],
      "moved_commits": [
        {
          "file": "tests/test_publish.py",
          "name": "test_moved_base_prevents_writes",
          "result": "ok",
          "source": "def test_moved_base_prevents_writes(self):\n        self.client.base_sha = \"b\" * 40\n        with self.assertRaises(DispatchError):\n            publish(self.store, self.project, self.job, client=self.client)\n        self.assertTrue(all(method == \"GET\" for method, _, _ in self.client.calls))\n        self.assertEqual(self.store.get(self.job)[\"status\"], \"blocked\")\n        self.store.approve(self.job, self.project)\n        self.assertEqual(self.store.get(self.job)[\"status\"], \"queued\")"
        },
        {
          "file": "tests/test_publish.py",
          "name": "test_tampered_artifact_prevents_provider_calls",
          "result": "ok",
          "source": ""
        },
        {
          "file": "tests/test_linear_release.py",
          "name": "test_changed_head_is_not_merged",
          "result": "ok",
          "source": ""
        },
        {
          "file": "tests/test_linear_release.py",
          "name": "test_main_moved_after_merge_cannot_deploy_unrelated_changes",
          "result": "ok",
          "source": ""
        }
      ],
      "lost_responses": [
        {
          "file": "tests/test_publish.py",
          "name": "test_lost_pr_response_reconciles_without_duplicate_creation",
          "result": "ok",
          "source": "def test_lost_pr_response_reconciles_without_duplicate_creation(self):\n        self.client.lose_response = True\n        with self.assertRaises(DispatchError):\n            publish(self.store, self.project, self.job, client=self.client)\n        self.assertEqual(self.store.get(self.job)[\"status\"], \"publishing\")\n        with self.assertRaises(DispatchError):\n            publish(self.store, self.project, self.job, reconcile=True, client=self.client)\n        with self.store.transaction() as db:\n            db.execute(\"UPDATE jobs SET deadline=? WHERE id=?\", (time.time() - 1, self.job))\n        publish(self.store, self.project, self.job, reconcile=True, client=self.client)\n        self.assertEqual(\n            sum(method == \"POST\" and path == \"/pulls\" for method, path, _ in self.client.calls),\n            1,\n        )"
        },
        {
          "file": "tests/test_linear_release.py",
          "name": "test_lost_merge_response_reconciles_without_second_merge",
          "result": "ok",
          "source": ""
        },
        {
          "file": "tests/test_linear_release.py",
          "name": "test_lost_dispatch_response_finds_existing_run",
          "result": "ok",
          "source": ""
        },
        {
          "file": "tests/test_linear_release.py",
          "name": "test_digitalocean_lost_response_reconciles_receipt_without_second_deploy",
          "result": "ok",
          "source": ""
        }
      ]
    }
  }
}
