{
  "caseCount": 15,
  "cases": [
    {
      "id": "RT-POLL-001",
      "title": "Load the bounded polling fixture",
      "route": "/practice/apps/realtime/",
      "preconditions": [
        "Use a fresh Practice Lab session with synthetic seed data."
      ],
      "steps": [
        "Open Realtime updates."
      ],
      "expectedResult": "The scenario control, transport contract, and empty event log are visible.",
      "priority": "Critical",
      "goodAutomationCandidate": "yes"
    },
    {
      "id": "RT-POLL-002",
      "title": "Choose a refresh scenario by query parameter",
      "route": "/practice/apps/realtime/",
      "preconditions": [
        "Use a fresh Practice Lab session with synthetic seed data."
      ],
      "steps": [
        "Open the route with ?scenario=refresh."
      ],
      "expectedResult": "Refresh is selected and no request starts before Run next poll is clicked.",
      "priority": "High",
      "goodAutomationCandidate": "yes"
    },
    {
      "id": "RT-POLL-003",
      "title": "Run one explicit refresh poll",
      "route": "/practice/apps/realtime/",
      "preconditions": [
        "Use a fresh Practice Lab session with synthetic seed data."
      ],
      "steps": [
        "Click Run next poll in the refresh scenario."
      ],
      "expectedResult": "One ticket request is made and Ticket snapshot refreshed is visible.",
      "priority": "Critical",
      "goodAutomationCandidate": "yes"
    },
    {
      "id": "RT-POLL-004",
      "title": "Keep refresh polling bounded",
      "route": "/practice/apps/realtime/",
      "preconditions": [
        "Use a fresh Practice Lab session with synthetic seed data."
      ],
      "steps": [
        "Complete the refresh sequence and observe the page."
      ],
      "expectedResult": "The sequence stops after its scripted steps without an interval or extra request.",
      "priority": "Critical",
      "goodAutomationCandidate": "yes"
    },
    {
      "id": "RT-ORDER-001",
      "title": "Render canonical event ordering",
      "route": "/practice/apps/realtime/",
      "preconditions": [
        "Use a fresh Practice Lab session with synthetic seed data."
      ],
      "steps": [
        "Select Canonical event ordering and run two steps."
      ],
      "expectedResult": "Received order differs from the rendered Sequence order, which is ascending.",
      "priority": "High",
      "goodAutomationCandidate": "yes"
    },
    {
      "id": "RT-ORDER-002",
      "title": "Preserve stable event rows",
      "route": "/practice/apps/realtime/",
      "preconditions": [
        "Use a fresh Practice Lab session with synthetic seed data."
      ],
      "steps": [
        "Complete the ordering sequence."
      ],
      "expectedResult": "The ordered event log remains stable after the batch completes.",
      "priority": "Medium",
      "goodAutomationCandidate": "yes"
    },
    {
      "id": "RT-RECONNECT-001",
      "title": "Expose a controlled connection loss",
      "route": "/practice/apps/realtime/",
      "preconditions": [
        "Use a fresh Practice Lab session with synthetic seed data."
      ],
      "steps": [
        "Select Reconnect after a controlled loss and run its first step."
      ],
      "expectedResult": "Connection loss observed is visible and no request has been made.",
      "priority": "High",
      "goodAutomationCandidate": "yes"
    },
    {
      "id": "RT-RECONNECT-002",
      "title": "Recover with one bounded poll",
      "route": "/practice/apps/realtime/",
      "preconditions": [
        "Use a fresh Practice Lab session with synthetic seed data."
      ],
      "steps": [
        "Run the next reconnect step."
      ],
      "expectedResult": "Connection restored is visible and exactly one synthetic ticket request was made.",
      "priority": "Critical",
      "goodAutomationCandidate": "yes"
    },
    {
      "id": "RT-RECONNECT-003",
      "title": "Stop after reconnect recovery",
      "route": "/practice/apps/realtime/",
      "preconditions": [
        "Use a fresh Practice Lab session with synthetic seed data."
      ],
      "steps": [
        "Complete the reconnect sequence."
      ],
      "expectedResult": "The status confirms no retry loop is scheduled.",
      "priority": "High",
      "goodAutomationCandidate": "yes"
    },
    {
      "id": "RT-FAULT-001",
      "title": "Expose a controlled 503",
      "route": "/practice/apps/realtime/",
      "preconditions": [
        "Use a fresh Practice Lab session with synthetic seed data."
      ],
      "steps": [
        "Select Recover from a controlled 503 and run its first step."
      ],
      "expectedResult": "Controlled 503 response is visible and the fault is labelled local.",
      "priority": "High",
      "goodAutomationCandidate": "yes"
    },
    {
      "id": "RT-FAULT-002",
      "title": "Recover from the controlled fault",
      "route": "/practice/apps/realtime/",
      "preconditions": [
        "Use a fresh Practice Lab session with synthetic seed data."
      ],
      "steps": [
        "Run the second fault step."
      ],
      "expectedResult": "Controlled fault recovered is visible after one bounded ticket poll.",
      "priority": "Critical",
      "goodAutomationCandidate": "yes"
    },
    {
      "id": "RT-FAULT-003",
      "title": "Reset realtime state",
      "route": "/practice/apps/realtime/",
      "preconditions": [
        "Use a fresh Practice Lab session with synthetic seed data."
      ],
      "steps": [
        "Run a scenario and click Reset realtime fixture."
      ],
      "expectedResult": "The event log is empty, the poll count is zero, and the selected scenario is ready again.",
      "priority": "Critical",
      "goodAutomationCandidate": "yes"
    },
    {
      "id": "RT-UI-001",
      "title": "Use accessible controls",
      "route": "/practice/apps/realtime/",
      "preconditions": [
        "Use a fresh Practice Lab session with synthetic seed data."
      ],
      "steps": [
        "Locate the scenario select and all controls by label or role."
      ],
      "expectedResult": "Each action is operable without implementation-specific selectors.",
      "priority": "Medium",
      "goodAutomationCandidate": "yes"
    },
    {
      "id": "RT-API-001",
      "title": "Inspect the declared poll endpoint",
      "route": "/practice/apps/realtime/",
      "preconditions": [
        "Use a fresh Practice Lab session with synthetic seed data."
      ],
      "steps": [
        "Read the transport contract before running a poll."
      ],
      "expectedResult": "The existing synthetic tickets GET endpoint is documented and no new API route is required.",
      "priority": "Medium",
      "goodAutomationCandidate": "yes"
    },
    {
      "id": "RT-NET-001",
      "title": "Handle a bounded ticket request failure",
      "route": "/practice/apps/realtime/",
      "preconditions": [
        "Use a fresh Practice Lab session with synthetic seed data."
      ],
      "steps": [
        "Mock the ticket GET request with a failure and run a polling step."
      ],
      "expectedResult": "A visible failure message appears and no automatic retry begins.",
      "priority": "High",
      "goodAutomationCandidate": "yes"
    }
  ]
}
