Issue TypeReferenceSession lifecycle, context managers, async sessionsreferences/sessions.mdrelationship(), lazy loading, N+1, joinedloadreferences/relationships.mdselect() vs query(), ORM overhead, bulk opsreferences/queries.mdAlembic patterns, reversible migrations, data migrationsreferences/migrations.md
with, async with)relationship() uses appropriate lazy strategyjoinedload/ selectinload to avoid N+1select() syntax, not legacy query()downgrade()op.execute() not ORM modelsRun once per SQLAlchemy-related finding, after you can anchor file:line (see review-verification-protocol) and before the finding ships. If a step’s pass condition is not met, do not assert the finding as written—gather evidence, withdraw, downgrade severity, or rephrase as a question.
StepActionPass condition1aOpen the module where the session is created or injected (not from memory).file:line for Session, sessionmaker, async_session, or the factory/ Depends() that yields a session.1bIf claiming leak, cross-request sharing, or missing cleanup: trace the session’s scope (context manager, try/ finally, middleware).Scoped region cited with a file:line range, or withdraw if scope is correct after the read.
StepActionPass condition2aIdentify the loop or repeated call site (ORM attribute access, execute in a loop).file:line for the loop or hot path.2bIf claiming N+1: name the relationship or query pattern emitted per iteration.Relationship or per-iteration SQL pattern with file:line, or rephrase as a question if unclear.
StepActionPass condition3aOpen the revision file (e.g. under versions/, or the project’s Alembic layout).Repo-relative path + file:line for revision / upgrade / downgrade.3bIf claiming broken downgrade() or risky data migration: point at the op.* / op.execute() involved.Snippet or line range in that file for each claimed op, or withdraw.
select() syntax?