{
  "version": "1.0.0",
  "project": {
    "name": "Group Scheduling Application",
    "version": "0.1.0",
    "repository": "coditect-research-lab/group-scheduling-application",
    "component": "scheduling-tool"
  },
  "testRun": {
    "id": "c8ea4de7-d647-4574-aed1-c4f3719995cf",
    "timestamp": "2026-04-11T02:18:48.738Z",
    "duration": 48593,
    "durationFormatted": "49s",
    "passed": true,
    "browser": "chromium",
    "viewport": "1440x900",
    "testFile": "e2e-vtr-test.ts",
    "environment": {
      "frontend": "https://scheduling-tool-8rv.pages.dev",
      "api": "https://scheduling-tool-worker.1-095.workers.dev",
      "pollSlug": "-4Mzos1jOaSREYK83n7ABQ"
    }
  },
  "customerStory": {
    "id": "CS-001",
    "title": "Team coordinator creates a poll and three team members respond",
    "persona": "Team Coordinator + Team Members",
    "goal": "Find the best meeting time across three respondents with mixed availability",
    "acceptanceCriteria": [
      "Coordinator can create a poll via API",
      "Three respondents can submit availability with AVAILABLE and IF_NEEDED states",
      "Results page ranks slots by response count",
      "Organizer dashboard accepts PIN and allows closing the poll",
      "Closed poll shows correct closed state to participants"
    ]
  },
  "phases": [
    {
      "id": "home",
      "title": "Landing Page",
      "description": "Verify the home page loads with the poll creation form.",
      "steps": [
        {
          "id": "landing",
          "title": "Home page loaded",
          "description": "Navigate to the application root and confirm the poll creation form is visible.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/01-home-landing.png",
            "filename": "01-home-landing.png",
            "timestamp": "2026-04-11T02:18:01.598Z",
            "label": "Home page loaded"
          },
          "stateChange": {
            "before": "No page loaded",
            "after": "Home page with poll creation form"
          },
          "tags": [
            "navigation",
            "smoke"
          ]
        }
      ]
    },
    {
      "id": "create-poll",
      "title": "Create Poll",
      "description": "Create the poll via API with four slots across two days, then navigate to the participant URL.",
      "steps": [
        {
          "id": "poll-created",
          "title": "Navigated to newly created poll",
          "description": "Poll \"Q2 Planning Session\" (slug: -4Mzos1jOaSREYK83n7ABQ) was created via API with 4 slots (Apr 20 Morning/Afternoon, Apr 21 Morning/Afternoon). Participant URL is now open.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/02-create-poll-poll-created.png",
            "filename": "02-create-poll-poll-created.png",
            "timestamp": "2026-04-11T02:18:06.664Z",
            "label": "Navigated to newly created poll"
          },
          "stateChange": {
            "before": "No poll exists",
            "after": "Empty poll page with name entry form"
          },
          "tags": [
            "api",
            "poll-creation"
          ]
        }
      ]
    },
    {
      "id": "alice",
      "title": "Respondent 1: Alice Johnson",
      "description": "Alice submits availability for mornings only (Mon Morning + Tue Morning = AVAILABLE).",
      "steps": [
        {
          "id": "empty-poll",
          "title": "Poll page — no respondents yet",
          "description": "Fresh session. The poll shows the name entry form and no responses in the results section.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/03-alice-empty-poll.png",
            "filename": "03-alice-empty-poll.png",
            "timestamp": "2026-04-11T02:18:09.429Z",
            "label": "Poll page — no respondents yet"
          },
          "tags": [
            "respondent",
            "alice"
          ]
        },
        {
          "id": "name-entered",
          "title": "Name field filled: Alice Johnson",
          "description": "Typed \"Alice Johnson\" into the participant name input.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/04-alice-name-entered.png",
            "filename": "04-alice-name-entered.png",
            "timestamp": "2026-04-11T02:18:09.518Z",
            "label": "Name field filled: Alice Johnson"
          },
          "action": {
            "type": "fill",
            "target": "name input",
            "value": "Alice Johnson"
          },
          "tags": [
            "respondent",
            "alice",
            "input"
          ]
        },
        {
          "id": "grid-visible",
          "title": "Availability grid appeared",
          "description": "After clicking Continue, the slot selection grid is visible with 4 cells.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/05-alice-grid-visible.png",
            "filename": "05-alice-grid-visible.png",
            "timestamp": "2026-04-11T02:18:10.606Z",
            "label": "Availability grid appeared"
          },
          "stateChange": {
            "before": "Name entry form",
            "after": "Availability grid with 4 slots"
          },
          "tags": [
            "respondent",
            "alice",
            "grid"
          ]
        },
        {
          "id": "morning-selected",
          "title": "Mon Morning marked AVAILABLE",
          "description": "Clicked Mon Morning slot once — it transitions to teal (AVAILABLE) state.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/06-alice-morning-selected.png",
            "filename": "06-alice-morning-selected.png",
            "timestamp": "2026-04-11T02:18:11.101Z",
            "label": "Mon Morning marked AVAILABLE"
          },
          "action": {
            "type": "click",
            "target": "Mon Morning cell",
            "slotIndex": 0
          },
          "stateChange": {
            "before": "All slots unselected",
            "after": "Mon Morning shows teal (Available)"
          },
          "tags": [
            "respondent",
            "alice",
            "slot-selection"
          ]
        },
        {
          "id": "both-mornings",
          "title": "Both mornings marked AVAILABLE",
          "description": "Clicked Tue Morning slot — both morning slots are now teal (AVAILABLE). Afternoon slots remain unset.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/07-alice-both-mornings.png",
            "filename": "07-alice-both-mornings.png",
            "timestamp": "2026-04-11T02:18:11.617Z",
            "label": "Both mornings marked AVAILABLE"
          },
          "action": {
            "type": "click",
            "target": "Tue Morning cell",
            "slotIndex": 1
          },
          "stateChange": {
            "before": "Only Mon Morning selected",
            "after": "Mon Morning and Tue Morning both show teal (Available)"
          },
          "tags": [
            "respondent",
            "alice",
            "slot-selection"
          ]
        },
        {
          "id": "submitted",
          "title": "Alice submitted — confirmation shown",
          "description": "Submit button clicked. A confirmation banner appears and the results section renders below.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/08-alice-submitted.png",
            "filename": "08-alice-submitted.png",
            "timestamp": "2026-04-11T02:18:14.202Z",
            "label": "Alice submitted — confirmation shown"
          },
          "stateChange": {
            "before": "Grid with morning slot selections",
            "after": "Confirmation banner + results section with 1 respondent"
          },
          "tags": [
            "respondent",
            "alice",
            "submission"
          ]
        },
        {
          "id": "results",
          "title": "Results section — 1 respondent",
          "description": "Scrolled to results section showing Alice's responses. Morning slots show 1 response.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/09-alice-results.png",
            "filename": "09-alice-results.png",
            "timestamp": "2026-04-11T02:18:14.772Z",
            "label": "Results section — 1 respondent"
          },
          "tags": [
            "respondent",
            "alice",
            "results"
          ]
        }
      ]
    },
    {
      "id": "bob",
      "title": "Respondent 2: Bob Smith",
      "description": "Bob marks all slots available, with Mon Afternoon as IF_NEEDED (amber) via double-click.",
      "steps": [
        {
          "id": "poll-after-alice",
          "title": "Poll showing 1 respondent (Alice)",
          "description": "Fresh session. Results section now shows Alice's responses in the bar summary.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/10-bob-poll-after-alice.png",
            "filename": "10-bob-poll-after-alice.png",
            "timestamp": "2026-04-11T02:18:17.776Z",
            "label": "Poll showing 1 respondent (Alice)"
          },
          "tags": [
            "respondent",
            "bob"
          ]
        },
        {
          "id": "name-entered",
          "title": "Name field filled: Bob Smith",
          "description": "Typed \"Bob Smith\" into the participant name input.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/11-bob-name-entered.png",
            "filename": "11-bob-name-entered.png",
            "timestamp": "2026-04-11T02:18:17.854Z",
            "label": "Name field filled: Bob Smith"
          },
          "action": {
            "type": "fill",
            "target": "name input",
            "value": "Bob Smith"
          },
          "tags": [
            "respondent",
            "bob",
            "input"
          ]
        },
        {
          "id": "grid-visible",
          "title": "Availability grid appeared for Bob",
          "description": "Grid is visible. All 4 slots start unselected.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/12-bob-grid-visible.png",
            "filename": "12-bob-grid-visible.png",
            "timestamp": "2026-04-11T02:18:18.933Z",
            "label": "Availability grid appeared for Bob"
          },
          "stateChange": {
            "before": "Name entry form",
            "after": "Availability grid with 4 slots, all unselected"
          },
          "tags": [
            "respondent",
            "bob",
            "grid"
          ]
        },
        {
          "id": "if-needed-state",
          "title": "Mon Afternoon shows IF_NEEDED (amber)",
          "description": "Mon Afternoon slot was clicked twice: first click = AVAILABLE (teal), second click = IF_NEEDED (amber). This represents conditional availability.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/13-bob-if-needed-state.png",
            "filename": "13-bob-if-needed-state.png",
            "timestamp": "2026-04-11T02:18:20.124Z",
            "label": "Mon Afternoon shows IF_NEEDED (amber)"
          },
          "action": {
            "type": "click",
            "target": "Mon Afternoon cell",
            "slotIndex": 2,
            "clickCount": 2
          },
          "stateChange": {
            "before": "Mon Afternoon AVAILABLE (teal)",
            "after": "Mon Afternoon IF_NEEDED (amber)"
          },
          "tags": [
            "respondent",
            "bob",
            "if-needed"
          ]
        },
        {
          "id": "all-selected",
          "title": "All slots selected — Mon Afternoon is IF_NEEDED",
          "description": "Bob has selected all 4 slots. Mon Morning, Tue Morning, Tue Afternoon are AVAILABLE (teal). Mon Afternoon is IF_NEEDED (amber).",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/14-bob-all-selected.png",
            "filename": "14-bob-all-selected.png",
            "timestamp": "2026-04-11T02:18:20.893Z",
            "label": "All slots selected — Mon Afternoon is IF_NEEDED"
          },
          "tags": [
            "respondent",
            "bob",
            "slot-selection"
          ]
        },
        {
          "id": "submitted",
          "title": "Bob submitted — confirmation shown",
          "description": "Submission confirmed. Results section now reflects 2 respondents.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/15-bob-submitted.png",
            "filename": "15-bob-submitted.png",
            "timestamp": "2026-04-11T02:18:23.518Z",
            "label": "Bob submitted — confirmation shown"
          },
          "stateChange": {
            "before": "Grid with Bob's selections",
            "after": "Confirmation banner + results showing 2 respondents"
          },
          "tags": [
            "respondent",
            "bob",
            "submission"
          ]
        },
        {
          "id": "results",
          "title": "Results section — 2 respondents",
          "description": "Scrolled to results. Mon Morning shows 2 responses (both Alice and Bob). Other slots show 1.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/16-bob-results.png",
            "filename": "16-bob-results.png",
            "timestamp": "2026-04-11T02:18:24.095Z",
            "label": "Results section — 2 respondents"
          },
          "tags": [
            "respondent",
            "bob",
            "results"
          ]
        }
      ]
    },
    {
      "id": "carol",
      "title": "Respondent 3: Carol Davis",
      "description": "Carol marks Mon Morning, Tue Morning, and Tue Afternoon as AVAILABLE. Mon Afternoon is left unset.",
      "steps": [
        {
          "id": "poll-after-bob",
          "title": "Poll showing 2 respondents (Alice + Bob)",
          "description": "Fresh session. Results section now shows 2 responses in the bar summary.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/17-carol-poll-after-bob.png",
            "filename": "17-carol-poll-after-bob.png",
            "timestamp": "2026-04-11T02:18:27.112Z",
            "label": "Poll showing 2 respondents (Alice + Bob)"
          },
          "tags": [
            "respondent",
            "carol"
          ]
        },
        {
          "id": "selections",
          "title": "Carol's selections: Mon Morning, Tue Morning, Tue Afternoon",
          "description": "Carol entered her name, clicked Continue, and selected three slots as AVAILABLE. Mon Afternoon remains unset.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/18-carol-selections.png",
            "filename": "18-carol-selections.png",
            "timestamp": "2026-04-11T02:18:29.243Z",
            "label": "Carol's selections: Mon Morning, Tue Morning, Tue Afternoon"
          },
          "action": {
            "type": "fill+click",
            "target": "name input + slot cells",
            "slots": [
              "Mon Morning (nth 0)",
              "Tue Morning (nth 1)",
              "Tue Afternoon (nth 3)"
            ]
          },
          "tags": [
            "respondent",
            "carol",
            "slot-selection"
          ]
        },
        {
          "id": "submitted",
          "title": "Carol submitted — confirmation shown",
          "description": "Submission confirmed. Results section now reflects 3 respondents.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/19-carol-submitted.png",
            "filename": "19-carol-submitted.png",
            "timestamp": "2026-04-11T02:18:31.849Z",
            "label": "Carol submitted — confirmation shown"
          },
          "stateChange": {
            "before": "Grid with Carol's selections",
            "after": "Confirmation banner + results showing 3 respondents"
          },
          "tags": [
            "respondent",
            "carol",
            "submission"
          ]
        },
        {
          "id": "results",
          "title": "Results section — 3 respondents, ranked slots",
          "description": "Scrolled to full results. Mon Morning shows 3/3 responses (top rank). Tue Morning shows 2/3. Mon Afternoon shows 1/3 (Bob IF_NEEDED only). Tue Afternoon shows 2/3.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/20-carol-results.png",
            "filename": "20-carol-results.png",
            "timestamp": "2026-04-11T02:18:32.428Z",
            "label": "Results section — 3 respondents, ranked slots"
          },
          "tags": [
            "respondent",
            "carol",
            "results"
          ]
        }
      ]
    },
    {
      "id": "final",
      "title": "Final Participant View",
      "description": "Fresh session shows the complete poll with all three respondents and ranked slot bars.",
      "steps": [
        {
          "id": "full-results",
          "title": "Poll showing all 3 respondents",
          "description": "Fresh anonymous view of the poll. Results section already renders 3 respondents because no session data exists — participant skips directly to the results.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/21-final-full-results.png",
            "filename": "21-final-full-results.png",
            "timestamp": "2026-04-11T02:18:35.975Z",
            "label": "Poll showing all 3 respondents"
          },
          "tags": [
            "final-view",
            "results"
          ]
        },
        {
          "id": "results-scrolled",
          "title": "Full bar chart + participant list visible",
          "description": "Scrolled to bottom. Bar chart ranks Mon Morning highest (3 available), followed by Tue Morning and Tue Afternoon (2 each), then Mon Afternoon (1 IF_NEEDED).",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/22-final-results-scrolled.png",
            "filename": "22-final-results-scrolled.png",
            "timestamp": "2026-04-11T02:18:36.557Z",
            "label": "Full bar chart + participant list visible"
          },
          "tags": [
            "final-view",
            "bar-chart"
          ]
        }
      ]
    },
    {
      "id": "manage",
      "title": "Organizer Dashboard",
      "description": "Organizer enters PIN to access the dashboard, selects the winning slot, and closes the poll.",
      "steps": [
        {
          "id": "pin-gate",
          "title": "Organizer PIN gate",
          "description": "Navigated to /manage/:slug. A PIN entry form is displayed before granting dashboard access.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/23-manage-pin-gate.png",
            "filename": "23-manage-pin-gate.png",
            "timestamp": "2026-04-11T02:18:38.360Z",
            "label": "Organizer PIN gate"
          },
          "tags": [
            "organizer",
            "auth"
          ]
        },
        {
          "id": "pin-filled",
          "title": "PIN entered",
          "description": "Filled organizer PIN (551382) into the PIN input field.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/24-manage-pin-filled.png",
            "filename": "24-manage-pin-filled.png",
            "timestamp": "2026-04-11T02:18:38.437Z",
            "label": "PIN entered"
          },
          "action": {
            "type": "fill",
            "target": "PIN input",
            "value": "551382"
          },
          "tags": [
            "organizer",
            "auth"
          ]
        },
        {
          "id": "dashboard",
          "title": "Organizer dashboard loaded",
          "description": "PIN verified. The organizer dashboard is visible with the full results, a slot selection dropdown, and a Close Poll button.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/25-manage-dashboard.png",
            "filename": "25-manage-dashboard.png",
            "timestamp": "2026-04-11T02:18:41.017Z",
            "label": "Organizer dashboard loaded"
          },
          "stateChange": {
            "before": "PIN entry gate",
            "after": "Organizer dashboard with poll results and controls"
          },
          "tags": [
            "organizer",
            "dashboard"
          ]
        },
        {
          "id": "dashboard-scrolled",
          "title": "Dashboard scrolled — full results visible",
          "description": "Scrolled to bottom of dashboard to show complete slot ranking and respondent breakdown.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/26-manage-dashboard-scrolled.png",
            "filename": "26-manage-dashboard-scrolled.png",
            "timestamp": "2026-04-11T02:18:41.594Z",
            "label": "Dashboard scrolled — full results visible"
          },
          "tags": [
            "organizer",
            "dashboard",
            "results"
          ]
        },
        {
          "id": "slot-selected",
          "title": "Best slot selected in dropdown",
          "description": "Organizer selected the top-ranked slot (index 1) from the slot selection dropdown.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/27-manage-slot-selected.png",
            "filename": "27-manage-slot-selected.png",
            "timestamp": "2026-04-11T02:18:42.468Z",
            "label": "Best slot selected in dropdown"
          },
          "action": {
            "type": "select",
            "target": "slot dropdown",
            "value": "index 1"
          },
          "tags": [
            "organizer",
            "slot-selection"
          ]
        },
        {
          "id": "poll-closed",
          "title": "Poll closed — success state",
          "description": "Clicked \"Close poll\". The dashboard now shows a success confirmation and the poll is marked as closed with the selected winning slot.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/28-manage-poll-closed.png",
            "filename": "28-manage-poll-closed.png",
            "timestamp": "2026-04-11T02:18:45.065Z",
            "label": "Poll closed — success state"
          },
          "stateChange": {
            "before": "Active poll with open status",
            "after": "Poll closed with winning slot confirmed"
          },
          "tags": [
            "organizer",
            "close-poll"
          ]
        }
      ]
    },
    {
      "id": "closed",
      "title": "Closed Poll — Participant View",
      "description": "A new participant visits the poll URL and sees the closed state with the winning slot announced.",
      "steps": [
        {
          "id": "closed-view",
          "title": "Participant sees closed poll",
          "description": "Fresh session on the participant URL. The poll is closed — no availability grid is shown. A banner indicates the poll has ended and displays the chosen time slot.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/29-closed-closed-view.png",
            "filename": "29-closed-closed-view.png",
            "timestamp": "2026-04-11T02:18:48.088Z",
            "label": "Participant sees closed poll"
          },
          "stateChange": {
            "before": "Active poll accepting submissions",
            "after": "Closed poll — submissions no longer accepted, winning slot displayed"
          },
          "tags": [
            "closed",
            "participant"
          ]
        },
        {
          "id": "closed-scrolled",
          "title": "Closed poll — full results visible",
          "description": "Scrolled to the bottom to show the final results and participant breakdown in the closed state.",
          "screenshot": {
            "path": "/tmp/vtr-scheduling-report/screenshots/30-closed-closed-scrolled.png",
            "filename": "30-closed-closed-scrolled.png",
            "timestamp": "2026-04-11T02:18:48.671Z",
            "label": "Closed poll — full results visible"
          },
          "tags": [
            "closed",
            "participant",
            "results"
          ]
        }
      ]
    }
  ]
}