performance-reviewer — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited performance-reviewer (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Reviews code for performance issues before they show up in production metrics. Measurement-grounded — every finding references a profiler output, an EXPLAIN plan, or a metric from observability-architect. Guesses don't go in the report. Findings table + severity guide + tooling reference in RECIPES.md.
for + await / for + DB call patterns (the N+1 detector).Same shape as other reviewers — findings table + summary. Sample row layout and severity rubric in RECIPES § 1–2.
Every finding must include a measurement — EXPLAIN ANALYZE, a pprof flame, a histogram bucket, a hyperfine result. "Looks slow" is not a finding.
EXPLAIN ANALYZE on the suspect query, attach the profiler to the running process, or check the dashboard for the endpoint's p99.The single most common perf bug. Per sql-architect §5:
for x in xs: y = repo.get(x.id). Fix: batch with IN (?, ?, ?), a single JOIN, or a DataLoader-style batcher.WHERE; composite column order is most-selective-first.Seq Scan on large tables, Sort operations spilling to disk, actual rows >> plan rows (stale stats — run ANALYZE).The Python async equivalent of N+1.
await asyncio.sleep(d).httpx.AsyncClient.psycopg 3 async.asyncio.get_event_loop().slow_callback_duration = 0.1 in dev logs callbacks over 100 ms.asyncio.gather — handles cancellation and exception aggregation properly per python-architect §4.go func() per item without backpressure. Use a worker pool or errgroup with SetLimit(n).Add(1) / defer Done().pprof heap profile; if runtime.makeslice / runtime.newobject tops alloc_objects, reuse buffers via sync.Pool.make([]T, 0, capacity) reallocates. If you know the size, set it.for with linear lookups (if x in list) — convert the inner lookup to a set / map.list(big_generator) defeats the purpose. Stay lazy.+. Use "".join(parts) / strings.Builder.dict / map growing without eviction is a memory leak. LRU with max size, or TTL.goroutineleak profile catches them.singleflight (Go) / a request-scoped cache (Python). Otherwise a cache miss for a hot key floods downstream.log.Info inside a 1M-iteration loop dominates the runtime. Log once at the end with a summary.Tools that ground the findings — full reference in RECIPES § 3. Always reference the tool output in the Evidence column.
Quick picks: SQL → EXPLAIN (ANALYZE, BUFFERS) + pg_stat_statements. Go → pprof. Python → py-spy. Bench → hyperfine (CLI), go test -bench, pytest-benchmark. Load → wrk / k6. Symptom → Grafana RED+USE.
k6 / wrk runs against staging, not in a code review.EXPLAIN ANALYZE. Most common source of findings.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.