with one click
ln-653-runtime-performance-auditor
// Checks blocking IO in async, unnecessary allocations, sync sleep, string concat in loops, redundant copies. Use when auditing runtime performance.
// Checks blocking IO in async, unnecessary allocations, sync sleep, string concat in loops, redundant copies. Use when auditing runtime performance.
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | ln-653-runtime-performance-auditor |
| description | Checks blocking IO in async, unnecessary allocations, sync sleep, string concat in loops, redundant copies. Use when auditing runtime performance. |
| allowed-tools | Read, Grep, Glob, Bash, mcp__hex-graph__audit_workspace, mcp__hex-line__read_file, mcp__hex-line__grep_search, mcp__hex-line__outline |
| license | MIT |
Paths: File paths (
references/,../ln-*) are relative to this skill directory.
Type: L3 Worker
Specialized worker auditing runtime performance anti-patterns in async and general code.
MANDATORY READ: Load references/audit_worker_core_contract.md.
Tool policy: follow host AGENTS.md MCP preferences; load references/mcp_tool_preferences.md and references/mcp_integration_patterns.md only when host policy is absent or MCP behavior is unclear.
Receives contextStore with: tech_stack, best_practices, codebase_root, output_dir.
Domain-aware: Supports domain_mode + current_domain.
Use hex-graph first when hotspot detection materially improves runtime findings. Use hex-line first for local code reads when available. If MCP is unavailable, unsupported, or not indexed, continue with built-in Read/Grep/Glob/Bash and state the fallback in the report.
Detection policy: use two-layer detection (candidate scan, then context verification); load references/two_layer_detection.md only when the verification method is ambiguous.
Parse context from contextStore
Scan codebase for violations
scan_pathasync def blocks first, then check for violations inside themCollect findings with severity, location, effort, recommendation
Calculate score using penalty algorithm
Write Report: Build full markdown report in memory per references/templates/audit_worker_report_template.md, write to {output_dir}/ln-653--global.md in single Write call
Return Summary: Return minimal summary to coordinator (see Output Format)
What: Synchronous file/network operations inside async functions, blocking event loop
Detection (Python):
async def functionsopen(, .read_bytes(), .read_text(), .write_bytes(), .write_text(), Path(...).(read|write)requests.get, requests.post, urllib.requestsubprocess.run(, subprocess.call(await asyncio.to_thread(...) or await loop.run_in_executor(...)Detection (Node.js):
async function or arrow async, grep for fs.readFileSync, fs.writeFileSync, child_process.execSyncSeverity:
__init__/setup/bootstrap (not request path) -> LOW. Small file (<1KB) read in non-hot path -> skipRecommendation: Use aiofiles, asyncio.to_thread(), or loop.run_in_executor() for file operations; use httpx.AsyncClient instead of requests
Effort: S (wrap in to_thread or switch to async library)
What: List comprehension where generator expression suffices
Detection:
len([x for x in ...]) - allocates list just to count; use sum(1 for ...)any([x for x in ...]) - allocates list for short-circuit check; use any(x for ...)all([x for x in ...]) - same pattern; use all(x for ...)set([x for x in ...]) - use set comprehension {x for x in ...}"".join([x for x in ...]) - use generator directly "".join(x for x in ...)Severity:
Recommendation: Replace [...] with generator (...) or set comprehension {...}
Effort: S (syntax change only)
What: time.sleep() inside async function blocks event loop
Detection:
time\.sleep inside async def blocksawait some_async_call() ... time.sleep(N) ... await another_call()Severity:
time.sleep() in async API handler (freezes all concurrent requests)time.sleep() in async background tasktime.sleep in CLI/script (not async server) -> skipRecommendation: Replace with await asyncio.sleep(N)
Effort: S (one-line change)
What: Building string via += inside loop (O(n^2) for large strings)
Detection:
result, output, html, text with += inside for/while loop+= containing string operand inside loop bodySeverity:
Recommendation: Use list.append() + "".join(), or io.StringIO, or f-string with "".join(generator)
Effort: S (refactor to list + join)
to_thread for CPU-BoundWhat: CPU-intensive synchronous code in async handler without offloading to thread
Detection:
async def, find CPU-intensive operations:
json.loads(large_data), json.load(file)PIL.Image.open, cv2.imreadhashlib, bcrypt.hashpwlxml.etree.parse, BeautifulSoup(asyncio.to_thread() or executorSeverity:
Recommendation: Wrap in await asyncio.to_thread(func, *args) (Python 3.9+) or loop.run_in_executor(None, func, *args)
Effort: S (wrap in to_thread)
What: Unnecessary .copy(), list(), dict() when data is only read, not mutated
Detection:
data = list(items) where data is only iterated (never modified)config = config_dict.copy() where config is only readresult = dict(original) where result is returned without modificationSeverity:
Recommendation: Remove unnecessary copy; pass original if not mutated
Effort: S (remove copy call)
MANDATORY READ: Load references/audit_scoring.md.
MANDATORY READ: Load references/templates/audit_worker_report_template.md.
Write JSON summary per references/audit_summary_contract.md. In managed mode the caller passes both runId and summaryArtifactPath; in standalone mode the worker generates its own run-scoped artifact path per shared contract.
Write report to {output_dir}/ln-653--global.md with category: "Runtime Performance" and checks: blocking_io_in_async, unnecessary_list_allocation, sync_sleep_in_async, string_concat_in_loop, missing_to_thread, redundant_data_copies.
Return summary per references/audit_summary_contract.md.
When summaryArtifactPath is absent, write the standalone runtime summary under .hex-skills/runtime-artifacts/runs/{run_id}/evaluation-worker/{worker}--{identifier}.json and optionally echo the same summary in structured output.
Report written: .hex-skills/runtime-artifacts/runs/{run_id}/audit-report/ln-653--global.md
Score: X.X/10 | Issues: N (C:N H:N M:N L:N)
Apply the already-loaded references/audit_worker_core_contract.md.
to_thread/run_in_executorApply the already-loaded references/audit_worker_core_contract.md.
{output_dir}/ln-653--global.md (atomic single Write call)references/audit_output_schema.mdVersion: 1.0.0 Last Updated: 2026-02-04