01 What students build
Same four agents, three production upgrades. Test cases become plain CSV with Jira's import columns (Summary, Issue Type, Priority, Labels, Components, Description), so QA leads bulk-import them in one click. The Playwright agent emits a multi-file framework using === FILE: path === markers that split_playwright_files() explodes into a real folder tree. And a lightweight Starlette + uvicorn UI wraps the whole thing at localhost:8000.
Jira-Importable CSV
No markdown fences, no prose: the Test Case Writer is prompted to emit a valid CSV body with h3-formatted descriptions, ready for Jira's bulk importer.
Framework, Not a Snippet
Post-processing splits the coder's raw output into advanced-playwright-framework/src/ with pages, modules, fixtures, tests, and testdata folders. Copy it into a repo and run.
Run Snapshots + UI
Each run is moved from output/ into runs/VWO-48/ so nothing gets clobbered. The Starlette UI lists runs, renders the file tree, and serves downloads.
02 Architecture
03 Live demo (simulated with sample data)
This is a UI walkthrough with pre-baked sample data. In the course you run the real stack: uvicorn ui.app:app with CrewAI + mcp-atlassian behind it, and real artifacts landing in runs/. Edit the ticket list below: it knows VWO-24, VWO-48, VWO-105, and VWO-217.
04 Inputs & outputs
What goes in
- One or more Jira ticket IDs from the web form (or CLI)
- Jira credentials passed to
uvx mcp-atlassianvia env templates/testplan.md· the externalized plan template- Groq API key for llama-3.3-70b-versatile
What comes out
test_plan.md· 12-section plan per tickettest_cases.csv· bulk-importable into Jira as Test issuesadvanced-playwright-framework/src/· POM framework treeruns/<ticket>/snapshot, browsable and downloadable in the UI
05 How it's built
templates/testplan.md so the template evolves without touching agent code.=== FILE: path === markers into playwright_raw.txt.split_playwright_files(): parse the markers and write each file under advanced-playwright-framework/src/.run_crew() executes, and _snapshot_output_for_ticket() moves artifacts to runs/<ticket>/.FileResponse.