Phase B1 of docs/SPEC.md (sections 6, 8 record actions, 9, 10).
analyze: 14 rules (SLOW_QUERY, MISSING_INDEX, UNUSED_INDEX, DUPLICATE_INDEX, N_PLUS_ONE, HOT_JOB, OVER_AUDITED, BLOAT, VACUUM_STALE, POOL_SIZING, IDLE_IN_TRANSACTION, CACHE_HIT_LOW, TEMP_SPILL, DEADLOCKS), each driven by its seeded db_perf_rule row. Findings dedupe by key, rank by severity x impact, auto-resolve when no longer produced, IGNORED stays ignored, disabled rules are inert.
Liquibase snippets: CREATE INDEX CONCURRENTLY IF NOT EXISTS / DROP INDEX CONCURRENTLY IF EXISTS changesets with runInTransaction:false and rollbacks; never executed.
Scheduled dbPerfAnalyze (durable-eligible) and Analyze now table action.
Record actions Acknowledge, Mark resolved, Ignore (note required), Reopen: standard Review/Result, db_performance.manage_findings.
Alerts through core QAlerts: dbperf.collection_failed, dbperf.query_spike, dbperf.connection_saturation, dbperf.blocked_chain (core rejects underscores in alert type names, so types are dbperf.*; keys keep db_perf), raised and resolved after each snapshot.
Phase B1 of docs/SPEC.md (sections 6, 8 record actions, 9, 10).
- `analyze`: 14 rules (SLOW_QUERY, MISSING_INDEX, UNUSED_INDEX, DUPLICATE_INDEX, N_PLUS_ONE, HOT_JOB, OVER_AUDITED, BLOAT, VACUUM_STALE, POOL_SIZING, IDLE_IN_TRANSACTION, CACHE_HIT_LOW, TEMP_SPILL, DEADLOCKS), each driven by its seeded `db_perf_rule` row. Findings dedupe by key, rank by severity x impact, auto-resolve when no longer produced, IGNORED stays ignored, disabled rules are inert.
- Liquibase snippets: `CREATE INDEX CONCURRENTLY IF NOT EXISTS` / `DROP INDEX CONCURRENTLY IF EXISTS` changesets with `runInTransaction:false` and rollbacks; never executed.
- Scheduled `dbPerfAnalyze` (durable-eligible) and Analyze now table action.
- Record actions Acknowledge, Mark resolved, Ignore (note required), Reopen: standard Review/Result, `db_performance.manage_findings`.
- Alerts through core QAlerts: `dbperf.collection_failed`, `dbperf.query_spike`, `dbperf.connection_saturation`, `dbperf.blocked_chain` (core rejects underscores in alert type names, so types are `dbperf.*`; keys keep `db_perf`), raised and resolved after each snapshot.
- Health: `db_performance.collector`, `.stats_access`, `.connections`.
Tests: 66 (H2 and PostgreSQL 17), checkstyle clean, JaCoCo gate met. Implementation by Codex, reviewed by Claude.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Phase B1 of docs/SPEC.md (sections 6, 8 record actions, 9, 10).
analyze: 14 rules (SLOW_QUERY, MISSING_INDEX, UNUSED_INDEX, DUPLICATE_INDEX, N_PLUS_ONE, HOT_JOB, OVER_AUDITED, BLOAT, VACUUM_STALE, POOL_SIZING, IDLE_IN_TRANSACTION, CACHE_HIT_LOW, TEMP_SPILL, DEADLOCKS), each driven by its seededdb_perf_rulerow. Findings dedupe by key, rank by severity x impact, auto-resolve when no longer produced, IGNORED stays ignored, disabled rules are inert.CREATE INDEX CONCURRENTLY IF NOT EXISTS/DROP INDEX CONCURRENTLY IF EXISTSchangesets withrunInTransaction:falseand rollbacks; never executed.dbPerfAnalyze(durable-eligible) and Analyze now table action.db_performance.manage_findings.dbperf.collection_failed,dbperf.query_spike,dbperf.connection_saturation,dbperf.blocked_chain(core rejects underscores in alert type names, so types aredbperf.*; keys keepdb_perf), raised and resolved after each snapshot.db_performance.collector,.stats_access,.connections.Tests: 66 (H2 and PostgreSQL 17), checkstyle clean, JaCoCo gate met. Implementation by Codex, reviewed by Claude.
🤖 Generated with Claude Code