Resolved. config.py reads MODEL env var with default anthropic/claude-3.5-sonnet. llm.py uses config.model (line 28: self.model = config.model). No hardcoded model string remains.
Resolved. No bare print() calls remain in analyzer.py, serp_api.py, or llm.py. All use logging.getLogger(__name__). Log level is configurable via LOG_LEVEL env var in config.py.…
Resolved. tests/test_auth.py (302 lines) covers registration, login, protected routes, token refresh, and admin-only endpoints with real JWT flow.
Resolved. Rate limiting via slowapi is implemented. /auth/register is limited to 5/minute, /auth/login to 10/minute. HTTP 429 with Retry-After header is returned when exceeded. Tests…
Resolved. Job state is persisted in PostgreSQL via db.create_job(), db.update_job(), db.get_job(), and db.list_jobs(). On startup, stale jobs are marked failed via `db.mark_stale_jobs_f…
Resolved. auth.py now uses a module-level singleton _db_client initialized via init_db_client() at app startup. get_db_client() returns the shared instance. No per-call DatabaseClient…
Resolved. docker-compose.yml uses ${POSTGRES_USER}, ${POSTGRES_PASSWORD}, ${POSTGRES_DB} env var references throughout. A .env.example file exists with placeholder values. .env is…
Resolved. config.py reads CORS_ORIGINS env var (comma-separated), defaults to localhost dev origins. api.py passes config.cors_origins to CORS middleware. No hardcoded origins remain.…
Resolved. check_jwt_secret() is implemented in auth.py and called at startup in api.py lifespan. It refuses to start with the default JWT secret when APP_ENV is not development. All…