# Task Showcase — repeatable web-agent runs as a dashboard A tiny Flask app that consolidates Webwright runs for **repeatable** odyssey tasks (those whose answer changes over time — deals, inventory, listings, job boards, weather, etc.) into a single dashboard. Each task ships only two files: ``` tasks// task.json – metadata (title, theme, cadence, level, prompt, website) report.json – curated, structured agent output: {sources, result.sections} ``` The Flask app is fully generic: templates iterate `sources` and `result.sections` without any per-task branching, so adding a new task is just dropping in a new folder with those two files. ## Run ```bash pip install flask python app.py # serves http://127.0.0.1:5005 ``` To render JSON generated by a Webwright run without copying it back into this folder, point the app at that run's generated tasks directory: ```bash python app.py --tasks-dir ../../outputs/default//task_showcase/tasks ``` The `task_showcase.yaml` runtime overlay writes the same directory shape under the run workspace and then smoke-tests this renderer against it. ## report.json shape ```jsonc { "sources": [ {"name": "Slickdeals", "url": "https://slickdeals.net/", "note": "front-page best deal"} ], "result": { "headline": "Today's bargain roundup", "sections": [ {"type": "summary", "title": "...", "body": "..."}, {"type": "table", "title": "...", "columns": [...], "rows": [[...], ...]}, {"type": "list", "title": "...", "entries": ["..."]}, {"type": "kv", "title": "...", "entries": [["k", "v"], ...]}, {"type": "cards", "title": "...", "entries": [ {"title": "...", "subtitle": "...", "fields": [["k","v"]], "url": "..."} ]} ] } } ``` The 6 included tasks (Slickdeals, Pokémon TCG, Austin apartments, The Ophelia Pittsburgh, NZ→AU legal roles, this-week driving weather) each map to an odyssey benchmark task whose underlying pages refresh on a schedule, so the dashboard makes sense to re-run repeatedly.