What problem does it solve? Writing concurrent Jac code requires choosing between two different concurrency models, and picking the wrong one serializes work or produces invalid syntax. This Skill explains Jac's flow/wait thread-pool model and async def/await asyncio model so parallel and asynchronous code runs correctly the first time. ## Core Features & Use Cases - flow/wait parallelism: Launch blocking or CPU-bound functions on a thread pool with flow, then collect results with wait, using the launch-all-then-wait-all pattern to avoid accidental serialization. - async/await asyncio interop: Write async def functions, use asyncio.gather and asyncio.run, and declare async walkers whose abilities await I/O during graph traversal. - Model selection guidance: A decision table maps workload types (CPU-bound vs I/O-bound, HTTP/DB/LLM calls) to the right concurrency model, plus pitfalls like reserved keywords, await outside async def, and sendability rules for ownership-annotated payloads. - Use Case: You need to call an LLM for dozens of regulation clauses concurrently in a Jac backend; this Skill tells you to use async/await with an async client, or flow/wait for blocking calls, and how to structure the collect phase. ## Quick Start Ask the AI to write Jac code that runs several blocking function calls in parallel using flow and wait, then collects the results.