Spaces:
Running
Running
Commit History
30 days ago
-
test(e2e): mark the browser suite and warn against running it on the Space
siddhm11 +1: Claude Opus 5.5pytest.ini registers a `browser` marker that nothing used, so `-m "not browser"` deselected nothing: with a dev server up on 7860, a unit run silently drove Chromium against it. The module now carries the marker. The docstring suggested pointing E2E_BASE_URL at the deployed Space. These tests save and dismiss papers, so that writes synthetic signal into real reader data; it now documents a scratch-storage server instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>06b09e6
-
feat(ui): make the multi-interest engine visible and give the page ink
siddhm11The frontend had one content component. paper_card.html renders the Feed, Search, Library and Collections, and every page is a vertical stack of it, so the product reads flat by the fifth screen no matter how well that card is styled. Separately, every prior design decision here had been subtractive -- hero removed, badges removed, timings removed -- each correct on its own, and the sum was restraint with nothing left to be restrained about. WHAT THE PIPELINE KNEW AND NEVER SAID * Cluster identity. Each card now carries a tone and the interest's name, and the feed heads with a composition strip. Because stabilize_cluster_ids() Hungarian-matches indices across reclusterings, a tone stays attached to the same interest between sessions -- an existing mechanism that was collecting no payoff. Exploration picks deliberately lose it: they are chosen for being OUTSIDE the profile, so badging them with an interest would be a lie. * The match score. Cosine against the r…1730744
-
feat(frontend): infinite paginated feed and a hand-written design system
The feed used to end. REC_LIMIT (10) papers plus 2 exploration picks, then a dead end — and dismissing shrank it further, so actively triaging drained the page toward empty. That is an inbox, not a feed. Feed - GET /api/recommendations?page=N&query_id=… The first request ranks a 60-deep pool and caches the ORDER under its query_id; later pages replay it, so they cost a metadata fetch rather than a recluster + re-retrieve + rescore. Measured cold, one process: page 1 3506ms, page 2 1.6ms, no overlap. - Exploration is drawn PER PAGE from a pre-shuffled pool, so doc 06 §3.5's "2 serendipitous papers per feed" holds for every page. Injecting once over the pool would dilute the ratio and strand every pick on the last page, since inject_exploration appends. - Scroll-to-load is driven by an IntersectionObserver in app.js that clicks a real <button>. Both htmx built-ins were tried against the deployment first: `revealed` cannot fire when combined with a second trigger (htmx's …99c77d4