go-concurrency
SkillAI & modelsUse when writing or reviewing Go concurrency — goroutines, channels, errgroup, context cancellation, or goroutine leaks. Not for sequential idioms (go-core-idioms).
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the go-concurrency skill
What this skill tells your AI
The instructions your AI receives, as published by fusengine/agents in plugins/go-expert/skills/go-concurrency/SKILL.md and read by ahel’s review.
Go Concurrency
Goroutines, channels, context, and errgroup for Go 1.26 — plus the number-one
documented pitfall: leaking goroutines on an unbuffered channel + early return.
Agent Workflow (MANDATORY)
Before ANY implementation, spawn 3 agents in parallel, one Agent call each with a name:
- fuse-ai-pilot:explore-codebase - Map existing goroutine/channel/context usage
- fuse-ai-pilot:research-expert - Verify errgroup/context docs via Context7/Exa
- mcp__context7__query-docs - Confirm
golang.org/x/sync/errgroupsignatures
After implementation, run fuse-ai-pilot:sniper for validation, and run tests
with go test -race ./....
Overview
| Feature | Description |
|---|---|
| Goroutines & channels | Lightweight concurrency + typed communication |
| errgroup | Parallelism + error aggregation + context cancellation |
| context | First param, propagated strictly, carries cancellation/deadline |
| WaitGroup vs channels | Counting-only vs result/error passing |
| Race detector | -race in tests/CI to catch data races |
| Leak profile (1.26) | GOEXPERIMENT=goroutineleakprofile / /debug/pprof/goroutineleak |
Critical Rules
context.Contextis the first parameter - namedctx, never stored in a struct- Every started goroutine must be able to exit - or it leaks (see rule 4)
- Prefer
errgroupfor fan-out with errors - it handles wait + first error + cancel - Unbuffered channel + early return = leak - senders block forever; buffer or drain
- Test with
-race- a passing test without-raceproves nothing about races
Architecture
internal/
├── fetch/
│ ├── fetch.go # errgroup.WithContext fan-out, bounded by SetLimit
│ └── worker.go # worker pool: fixed goroutines drain a jobs channel
└── pipeline/
└── stage.go # ctx-cancellable stages, buffered hand-off channels
→ See errgroup-patterns.md for full example
Reference Guide
Concepts
| Topic | Reference | When to Consult |
|---|---|---|
| Goroutines & channels | goroutines-channels.md | Buffered vs not, select, WaitGroup vs channels |
| errgroup | errgroup.md | Fan-out, error aggregation, SetLimit, TryGo |
| context | context-propagation.md | Cancellation, deadlines, propagation rules |
| Goroutine leaks | goroutine-leaks.md | The #1 pitfall + the 1.26 leak profile |
Templates
| Template | When to Use |
|---|---|
| errgroup-patterns.md | Bounded parallel work with error handling |
| worker-pool.md | Fixed workers draining a job queue |
Quick Reference
Parallel work with errgroup
g, ctx := errgroup.WithContext(ctx)
g.SetLimit(8) // bound concurrency
for _, u := range urls {
g.Go(func() error { return fetch(ctx, u) })
}
if err := g.Wait(); err != nil { // first non-nil error; cancels ctx
return err
}
→ See errgroup.md
Avoid the leak (buffer so senders never block)
ch := make(chan result, len(items)) // buffered → early return can't strand senders
→ See goroutine-leaks.md
Best Practices
DO
- Pass
ctxfirst and thread it through every blocking call - Reach for
errgroupbefore hand-rollingWaitGroup+ error channels - Buffer result channels to the number of senders, or fully drain them
- Run
go test -race; tryGOEXPERIMENT=goroutineleakprofilein CI (1.26)
DON'T
- Return early from a fan-out while goroutines still block on an unbuffered channel
- Store a
context.Contextin a struct field - Use a bare
sync.WaitGroupwhen goroutines return errors (useerrgroup) - Assume tests are race-free without the
-raceflag
Signals
- GitHub stars
- 25
- Forks
- 4
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
go-concurrency-fusengine- Source
- github.com/fusengine/agents