Review-Gate findings: - openalex: bare DOIs/arXiv IDs need doi:/arxiv: prefix (bare IDs 404); add _resolve_id(); fix fetch_citations to use referenced_works field instead of non-existent /works/{id}/references endpoint. - semanticscholar: wait_fixed(1) was inter-retry only; add per-request monotonic rate-limiter (_rate_limit()) before each httpx call. Add _is_retryable() filter so 404s don't burn 5 retry slots. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
pyproject.toml (Python 3.12, uv), codex/ package (config, db, models), infra/ (docker-compose + schema), .env.example, .gitignore, README. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>