From cdace7d170e35a66e5f7d6e7e497b52b5e5081c9 Mon Sep 17 00:00:00 2001 From: Justin Visser Date: Tue, 11 Aug 2026 10:15:20 +0200 Subject: [PATCH] fix: type the health test mode, pace cards with the stream, and size the results panel --- README.md | 5 +++++ backend/tests/test_health.py | 4 ++-- docs/logboek.md | 26 +++++++++++++++++++++++ frontend/src/components/ResultSet.vue | 12 ++++------- frontend/src/components/TrackCard.vue | 1 - frontend/src/style.css | 1 - frontend/tests/resultPresentation.test.ts | 7 +++--- 7 files changed, 41 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 9eb0c91..3f18cae 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,11 @@ Forgejo/GitHub mirror, deployment, how the agents are used) is mapped in - A faster model on the intent call, which would cut most of the time to first card; the grounding stage already measures the trade-off to watch (fabrication rate), so the experiment is cheap to run safely. +- A guaranteed minimum grounding budget. The request deadline is anchored + at request start, so an unusually slow intent call can leave grounding + with no time at all; raising the deadline works around it (env-tunable), + but grounding deserves a floor of its own regardless of what call 1 + spent. - Deeper discovery. A repair loop that re-prompts the model for candidates that failed verification would let the prompt chase less obvious work without losing the pool, and a novelty signal beyond exact-id exclusion diff --git a/backend/tests/test_health.py b/backend/tests/test_health.py index eb12b52..9e6a701 100644 --- a/backend/tests/test_health.py +++ b/backend/tests/test_health.py @@ -5,7 +5,7 @@ from unittest.mock import AsyncMock, Mock import pytest from fastapi.testclient import TestClient -from app.config import Settings +from app.config import AppMode, Settings from app.main import create_app @@ -23,7 +23,7 @@ def test_anthropic_client_uses_configured_timeout(monkeypatch: pytest.MonkeyPatc monkeypatch.setattr("app.main.AsyncAnthropic", constructor) live_settings = Settings( - app_mode="live", + app_mode=AppMode.LIVE, spotify_client_id="client-id", anthropic_api_key="api-key", llm_timeout_seconds=42.0, diff --git a/docs/logboek.md b/docs/logboek.md index 851e9b1..78be65d 100644 --- a/docs/logboek.md +++ b/docs/logboek.md @@ -472,3 +472,29 @@ Wat ik heb laten vallen of uitgesteld: - Een sneller model op de intent call (zou de wachttijd flink verlagen; de fabrication rate is de afweging om dan te meten) staat als vervolg in de README, niet gebouwd. + +### Afronding en de laatste live-test + +Wat ik deed: + +- Laatste ronde live testen op de gehoste instantie voor het insturen. + Twee dingen gevonden: een vraag waarbij call 1 zo lang nadacht dat de + request deadline al om was voordat grounding begon (0 resultaten, + 0 Spotify calls), en opnieuw QUOTA_EXCEEDED 429's omdat het dagquotum + van gisteren nog meetelde in het huidige quota-venster. +- De deadline via env verhoogd naar 60 s en de cache-TTL's op de gehoste + instantie opgerekt (resolutie 24 h, taste profile 1 h) zodat het quotum + langer meegaat; een structurele fix (een gegarandeerd minimum + tijdsbudget voor grounding, los van wat call 1 opmaakt) staat in de + README als vervolgstap. +- De card-animatie versneld: elke kaart wachtte nog index maal 80 ms na + binnenkomst voordat hij verscheen, bovenop het tempo van de stream + zelf. De vertraging is weg; de stream is nu zelf de cadans. De + resultatenlijst toont nu ongeveer 5,5 kaarten zodat zichtbaar is dat er + meer te scrollen valt. +- Insturen gepland na de quota-reset vanavond. + +Waarom: + +- Een reviewer die de live instantie opent moet niet als eerste een + uitgeput quotum zien; de reset bepaalt dus het moment van insturen. diff --git a/frontend/src/components/ResultSet.vue b/frontend/src/components/ResultSet.vue index 8030cf9..9ac23a9 100644 --- a/frontend/src/components/ResultSet.vue +++ b/frontend/src/components/ResultSet.vue @@ -17,12 +17,7 @@ const regionLabel = computed(() => @@ -31,7 +26,8 @@ const regionLabel = computed(() => display: flex; flex-direction: column; gap: var(--s-2); - max-height: min(42dvh, 480px); + /* Roughly 5.5 cards tall: the half card signals there is more to scroll. */ + max-height: min(66dvh, 610px); padding: var(--s-2) var(--s-3) var(--s-2) 0; overflow-y: auto; overscroll-behavior-y: contain; @@ -42,7 +38,7 @@ const regionLabel = computed(() => @media (max-width: 560px) { .set { - max-height: min(34dvh, 360px); + max-height: min(52dvh, 470px); } } diff --git a/frontend/src/components/TrackCard.vue b/frontend/src/components/TrackCard.vue index af8b3e3..8244a9f 100644 --- a/frontend/src/components/TrackCard.vue +++ b/frontend/src/components/TrackCard.vue @@ -53,7 +53,6 @@ const artworkAlt = computed(() => border-color var(--dur-fast) ease, background var(--dur-fast) ease; animation: card-in var(--dur-card) var(--ease) both; - animation-delay: calc(var(--card-order, 0) * var(--dur-card-stagger)); } .card:hover { diff --git a/frontend/src/style.css b/frontend/src/style.css index a43b9a6..6275449 100644 --- a/frontend/src/style.css +++ b/frontend/src/style.css @@ -76,7 +76,6 @@ --ease: cubic-bezier(0.2, 0.8, 0.3, 1); --dur-fast: 0.16s; --dur-card: 0.4s; - --dur-card-stagger: 0.08s; --dur-reduced-motion: 0.001s; color-scheme: dark; diff --git a/frontend/tests/resultPresentation.test.ts b/frontend/tests/resultPresentation.test.ts index c1cfe84..3782903 100644 --- a/frontend/tests/resultPresentation.test.ts +++ b/frontend/tests/resultPresentation.test.ts @@ -104,12 +104,13 @@ describe('result presentation', () => { expect(region?.contains(action ?? null)).toBe(false) }) - it('assigns a deliberate stagger order to arriving cards', () => { + it('renders arriving cards without an artificial entrance delay', () => { const root = mountComponent(AssistantMessage, { turn: doneTurn(), canSave: true }) const cards = root.querySelectorAll('article') - expect(cards[0]?.style.getPropertyValue('--card-order')).toBe('0') - expect(cards[1]?.style.getPropertyValue('--card-order')).toBe('1') + expect(cards.length).toBeGreaterThan(1) + expect(cards[0]?.style.getPropertyValue('--card-order')).toBe('') + expect(cards[1]?.style.getPropertyValue('--card-order')).toBe('') }) it('anchors a completed response at the top of the conversation viewport', async () => {