with one click
review-performance
// Performance review checklist for OpenAEV code: N+1 queries, fetch strategy, pagination, indexing, memory usage. Use when reviewing PRs or auditing performance of a feature.
// Performance review checklist for OpenAEV code: N+1 queries, fetch strategy, pagination, indexing, memory usage. Use when reviewing PRs or auditing performance of a feature.
Creates tests for an existing feature following OpenAEV patterns: fixture class, composer, integration test with @Nested groups, and optionally unit tests. Use when asked to add tests or improve test coverage.
Scaffolds a complete feature end-to-end: JPA entity, repository, service, DTOs, mapper, controller, migration, tests (fixture + composer + integration test), and frontend actions/page. Use when asked to create a new feature or module.
Step-by-step general code review procedure for OpenAEV pull requests. Covers architecture, conventions, code quality, and delegation to specialized agents.
Frontend review checklist for OpenAEV React/TypeScript code: component patterns, forms, MUI usage, permissions, i18n, state management, dead code. Use when reviewing PRs or auditing frontend features.
Step-by-step tenant isolation audit for OpenAEV pull requests. Use when reviewing PRs that touch entities, repositories, native queries, or migrations.
Creates a Flyway Java-based migration for schema changes. Handles table creation, column additions, tenant isolation, and ES reindex. Use when asked to modify the database schema.
| name | review-performance |
| description | Performance review checklist for OpenAEV code: N+1 queries, fetch strategy, pagination, indexing, memory usage. Use when reviewing PRs or auditing performance of a feature. |
grep -rn "\.findById\|\.findAll\|\.existsById" openaev-api/src/main/java/ --include="*.java"
findById() or findAll() is called inside a for / forEach / stream().map()findAllById() or a single @Query with IN clause@ManyToMany / @OneToMany collections have @Fetch(FetchMode.SUBSELECT) to avoid N+1FetchType.LAZYFetchType.EAGER is only acceptable for small, always-needed collections (e.g. capabilities)grep -rn "FetchType.EAGER" openaev-model/src/main/java/ --include="*.java"
LazyInitializationException)Page<T>, not unbounded List<T>grep -rn "List<.*>" openaev-api/src/main/java/io/openaev/api/ --include="*.java" | grep -i "public\|return"
findAll() without pagination is only acceptable for small reference data tablesfindAll() that could be filtered at DB level:
grep -rn "\.findAll()" openaev-api/src/main/java/ --include="*.java"
existsById() instead of findById().isPresent()@Modifying @Query instead of loading + deleting one by one@Transactional(readOnly = true) is used on all read methodsgrep -rn "CREATE TABLE\|CREATE INDEX\|ADD COLUMN" openaev-api/src/main/java/io/openaev/migration/ --include="*.java"
byte[] or full file content loaded in memory — use streamingfindAll() result stored in a List)grep -rn "byte\[\]\|ByteArrayOutputStream\|toByteArray" openaev-api/src/main/java/ --include="*.java"
@Transactional(readOnly = true)@Transactional (keep transactions short)@Transactional self-calls (Spring proxy bypass):
grep -rn "this\." openaev-api/src/main/java/io/openaev/service/ --include="*.java" | grep -i "find\|get\|search\|create\|update\|delete"
Document findings using conventional comments format:
issue (blocking): for performance bugs (N+1, missing pagination, unbounded queries)suggestion (non-blocking): for optimizations (index, fetch strategy, caching)note: for informational items (acceptable tradeoffs, future improvements)