From 5080e9a6091b84007bbcfdc551061718d3e4bc2d Mon Sep 17 00:00:00 2001 From: Justin Visser Date: Tue, 11 Aug 2026 09:31:39 +0200 Subject: [PATCH] chore: restore wrapped chips, trim unused scopes, and complete env docs --- .env.example | 18 +++++-- AGENTS.md | 7 ++- backend/app/adapters/spotify/auth.py | 6 +-- docs/logboek.md | 42 ++++++++++++++++ frontend/src/components/SuggestionChips.vue | 54 +++++---------------- frontend/tests/resultPresentation.test.ts | 4 +- 6 files changed, 74 insertions(+), 57 deletions(-) diff --git a/.env.example b/.env.example index 05680eb..2831159 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,17 @@ -# Copy to .env and adjust. Without a .env the app starts in demo mode. -APP_MODE=demo +# Runtime mode; set to demo for no-key fixtures or live for Spotify and Anthropic. +APP_MODE= -# The redirect URI must exactly match the URI registered in the Spotify dashboard. +# Spotify app client ID; required in live mode and unused in demo mode. SPOTIFY_CLIENT_ID= + +# Spotify OAuth callback URI; set in live mode if the local default is not registered. +SPOTIFY_REDIRECT_URI= + +# Anthropic API key; required in live mode and unused in demo mode. +ANTHROPIC_API_KEY= + +# Pre-authorized Spotify token; only for hosted instances without interactive login. +SPOTIFY_SEED_REFRESH_TOKEN= + +# Secure session cookie flag; set to true on every HTTPS deployment. +SESSION_COOKIE_SECURE= diff --git a/AGENTS.md b/AGENTS.md index 65b4f0a..f919c7c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -26,10 +26,9 @@ api -> pipeline -> ports <- adapters domain imports nothing app-level - Spotify JSON never escapes `adapters/spotify/mapping.py`. - Pipeline tunables (counts, thresholds, budgets, model id, effort, TTLs) live in `app/config.py` (pydantic-settings). No magic numbers in code. -- LLM prompts are versioned template files under `app/prompts/`, not inline - strings. -- `eval/scenarios.yaml` is one source of truth for three consumers: golden - eval queries, demo fixture keys, and UI suggestion chips. +- LLM prompts live as constants in `app/prompts.py`, not inline in adapters. +- `eval/scenarios.yaml` defines golden eval queries and fixture-recording keys. + UI suggestion chips live in `frontend/src/lib/suggestions.ts`. ## Naming diff --git a/backend/app/adapters/spotify/auth.py b/backend/app/adapters/spotify/auth.py index fb78635..8be4b8d 100644 --- a/backend/app/adapters/spotify/auth.py +++ b/backend/app/adapters/spotify/auth.py @@ -13,11 +13,7 @@ from app.adapters.spotify.errors import SpotifyAuthenticationError AUTHORIZE_URL = "https://accounts.spotify.com/authorize" TOKEN_URL = "https://accounts.spotify.com/api/token" -SCOPES = ( - "user-top-read user-library-read user-read-recently-played " - "playlist-modify-public playlist-modify-private " - "user-read-playback-state user-modify-playback-state" -) +SCOPES = "user-top-read user-library-read playlist-modify-public playlist-modify-private" TOKEN_EXPIRY_SKEW_SECONDS = 60.0 diff --git a/docs/logboek.md b/docs/logboek.md index d70a432..1ee58cb 100644 --- a/docs/logboek.md +++ b/docs/logboek.md @@ -396,3 +396,45 @@ Wat ik heb laten vallen of uitgesteld: - Byte-snapshots per pipeline-stap; de checks hierboven en de cassettes zijn nu het bewijs. + +### Demo mode + +Wat ik deed: + +- Demo mode af: zonder keys speelt de app de opgenomen cassettes af door + dezelfde pipeline en hetzelfde streamingpad als live. Onbekende vragen + krijgen het dichtstbijzijnde scenario, met een banner die dat eerlijk + benoemt; playlist-acties zijn gesimuleerd en zo gelabeld. +- Een eerste versie deelde replay-state tussen gelijktijdige requests; + dat kon elkaars refinement verstoren. Nu krijgt elke request zijn + eigen replay-pool, met een test die de botsing naspeelt. +- Het docker image bestaat nu in twee smaken: live zonder fixtures, demo + met. docker compose bouwt standaard de demo-smaak, dus een verse clone + zonder keys werkt direct. Een .dockerignore bracht de build context + van ~350 MB terug naar ~7 MB. + +Waarom: + +- De reviewer moet de app kunnen starten met alleen docker compose, + zonder accounts of keys; demo mode is ook het bewijs dat de + ports-and-adapters opzet echt is (dezelfde poorten, andere adapter). + +Wat ik heb laten vallen of uitgesteld: + +- Meer demo-scenario's; de 8 opgenomen zijn de suggestion chips en dat + is genoeg voor het verhaal. + +### Opruimen + +Wat ik deed: + +- De suggestion chips terug naar de wrapped look; de scrollbare box uit de + vorige batch stond lelijker dan wat er eerst was. +- Ongebruikte OAuth scopes weggehaald (player en recently-played; nergens + in de code gebruikt), .env.example compleet gemaakt en AGENTS.md + gelijkgetrokken met hoe de repo er echt uitziet. + +Waarom: + +- Minder scopes vragen dan je gebruikt is netter richting de reviewer en + richting Spotify. diff --git a/frontend/src/components/SuggestionChips.vue b/frontend/src/components/SuggestionChips.vue index 8f0dfdd..70e3c18 100644 --- a/frontend/src/components/SuggestionChips.vue +++ b/frontend/src/components/SuggestionChips.vue @@ -6,59 +6,27 @@ defineEmits<{ pick: [suggestion: string] }>()