CONNECTED REPORT — L07, L08, L09
Open the folder for the stage you are studying. Every stage is complete;
you do not need to copy files between stages. Python 3.10+ is sufficient.
Use py instead of python on Windows if that is your installed command.
No packages, account, API key, real campaign data or paid service is needed.

01_query: python run_report.py
Prints the Search report: 2 rows, 48000 cents, 21 enquiries.

02_api: python server.py
Open http://127.0.0.1:8765/ and follow the report links.
This stage publishes report messages, before the interactive screen exists.

03_browser: python server.py
Open http://127.0.0.1:8765/, choose a channel and press Load report.
All: 5 campaigns, EUR 900.00, 35 enquiries, EUR 25.71 per enquiry.
Search: 2 campaigns, EUR 480.00, 21 enquiries, EUR 22.86 per enquiry.

04_qualified: python server.py
Same address, now choose a metric and minimum total enquiries per campaign.
All / qualified / 0: EUR 900.00, 22 qualified, EUR 40.91 per qualified enquiry.
Search / qualified / 10: Search Spring only, EUR 300.00, 8 qualified, EUR 37.50.
Email / qualified / 7: no rows; EUR 0.00, zero counts, rate Not available.

Stop a running server with Ctrl+C before starting another stage.
If port 8765 is occupied: python server.py --port 8766
Use the address printed in the terminal. Keep that terminal running.
Do not double-click index.html: browser requests need the Python server.
The server listens only on your computer. It is a teaching project, not
a publicly deployable service with identity, hosting or access controls.

Each stage creates campaigns.sqlite on its first run. Editing campaigns.json
later does not alter an existing database. To reset fictional data, stop
the server, delete ONLY that stage's campaigns.sqlite, and restart.
Do not delete or edit an unrelated database.

AUTOMATED CHECKS (run from this connected_report folder)
python test_project.py
node --test test_client.mjs
The Python suite starts actual local HTTP servers with temporary databases.
The JavaScript suite tests pure helpers and response/failure validation.
It is not a visual browser or accessibility audit. Run MANUAL_CHECKS.txt too.

EXERCISES
exercises/L07.txt, L08.txt, L09.txt
Separate solutions: ../solutions/L07.md through L09.md.
