- Convert check interval setting from minutes to hours in the UI
- Show PDF queue tab to all authenticated users (not admin-only); requeue
actions remain admin-only in both backend and frontend
- Fix users tab not loading on first visit by removing the AsyncStateGate
wrapper that prevented child component refs from being populated before
onMounted fired
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove the auth.isAdmin guard from the Start check and Cancel check
buttons in the Activity Monitor. Admin-only route links (check history,
diagnostics) are unchanged.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Two issues with the initial implementation:
- Counter only appeared after the first SSE event arrived (scholarProgress null
kept the v-else static template showing until a scholar completed)
- First events were often dropped because the EventSource hadn't subscribed yet
Fix:
- Backend: emit an initial scholar_progress kickoff event (0/0/N) at the
start of run_scholar_iteration so the frontend receives total early
- Frontend: gate on isLikelyRunning alone (not scholarProgress); use optional
chaining with fallbacks so "0 / … visited · 0 finished" shows immediately
when a run starts, before any SSE events arrive
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Emit scholar_progress SSE events during two-pass ingestion so the
Activity Monitor shows "X / N visited · Y finished · Z new publications"
in real time instead of static post-run counts.
- scholar_processing: add on_progress callback to _run_first_pass and
_run_depth_pass; build _emit closure in run_scholar_iteration that
publishes visited/finished/total via run_events; batch-emit scholars
finished in first pass before depth pass; skip emission on abort/cancel
- run_status store: add scholarProgress state, reset on stream open and
reset(); subscribe to scholar_progress SSE events with safe parsing
- DashboardPage: show live counter during run, fall back to static text
when run is not active or no progress received yet
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Background tasks (ingestion, PDF resolution, scheduler) now acquire an
asyncio.Semaphore before checking out a DB connection, guaranteeing at
least N connections remain available for API request handlers. Removes
duplicate polling loop from PublicationsPage, debounces publication
reload on run-status changes, and increases poll interval from 5s to 15s
since SSE handles live discovery.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add ruff and mypy to dev dependencies with configuration in pyproject.toml.
Add a lint CI job that runs ruff check, ruff format --check, and mypy.
Auto-fix import sorting and formatting across the codebase. Exclude
alembic/versions from linting (auto-generated migrations). Ignore B008
(FastAPI Depends pattern) and RUF001 (unicode in user-facing strings).
21 ruff lint errors and 50 mypy errors remain for manual review.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove 114 tracked build/lib/ files (stale setuptools artifact that
broke the repo-hygiene CI guard)
- Add build/ to .gitignore
- Remove AGENTS.MD from .gitignore (track agents.md instead)
- Delete ad-hoc scripts: diag_pubs.py, test_enrich.py
- Delete orphaned frontend/docs/website/package-lock.json
- Replace npm install with npm ci in ci.yml and docs-pages.yml for
deterministic lockfile installs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- complete tokenized theme preset system and admin style guide visibility
- refine dashboard layout/scroll behavior and shared async/request UI states
- add user nav-visibility settings across API, migration, and frontend stores
- harden security headers/CSP handling and related test coverage
- enforce CI repository hygiene + frontend contract/theme/build quality gates
- update docs/env references and make migration smoke test head-aware