Install
openclaw skills install async-concurrency-reviewerReviews async and concurrency code for deadlocks, race conditions, missing cancellation, and misuse across multiple languages, returning detailed fix reports.
openclaw skills install async-concurrency-reviewerReview async and concurrency code across any language. Finds real bugs — deadlocks, race conditions, missing cancellation, blocking calls in async contexts, and misused primitives. Returns a structured report with severity ratings and corrected code.
Python, JavaScript/TypeScript, C#, Go, Rust, Java, Kotlin — and any other language with async or concurrency primitives.
Paste code. Optionally specify: language, runtime (Node, .NET, JVM, etc.), context (web server, CLI, background worker).
## Async/Concurrency Review
### Critical (fix before shipping)
- [Finding] — [why it causes bugs in production]
✗ Before: [problematic code]
✓ After: [corrected code]
### Warnings (should fix)
- [Finding] — [explanation]
### Suggestions (nice to have)
- [Finding] — [explanation]
### What's correct
- [Specific patterns done right — always include at least one]
### Summary
[2–3 sentences: biggest risk, top fix, one pattern to adopt going forward]
asyncio.run() called inside an already-running event looptime.sleep, requests.get) inside async def — use asyncio.sleep, httpxasyncio.create_task() result not stored — task gets garbage collectedawait on coroutines (silent no-op bug)threading.Lock() inside async code — use asyncio.Lock()await inside forEach — use Promise.all with mapasync function called without await (fire and forget — often unintentional)await where parallel Promise.all would worksetTimeout used as a poor-man's debounce in async context.Result or .Wait() — deadlocks in sync-over-asyncasync void — exceptions swallowed, no awaitableCancellationToken on public async methodsConfigureAwait(false) missing in library codeTask.Run wrapping sync CPU-bound work — correct; wrapping async — wronglock keyword in async code — use SemaphoreSlimawait inside lock — compiler error but watch for equivalent patternsWaitGroup.Add() called inside goroutine — race conditionblock_on inside an async runtime — panic.unwrap() on JoinHandle — hides panicsMutex lock across an .await — deadlockspawn without storing the handle — fire and forget, errors lostArc<Mutex<T>> contention hotspot — consider RwLock or message passingCompletableFuture.get() blocking on the event threadrunBlocking inside a coroutine scopeGlobalScope.launch — unstructured concurrency, leaksDispatchers.IO for blocking I/O in coroutinessynchronized on wrong object — lock doesn't protect the shared stateAfter each review, note the most common finding. After 20 reviews, surface the top 3 patterns in your response as "Most common issues in [language]" to help users learn, not just fix.