go-concurrencylisted
Install: claude install-skill Dankosik/go-service-template-rest
# Go Concurrency
Judge every change by its **happens-before** story: a claim that two events cannot race is either an edge you can name — channel operation, lock, `WaitGroup`, `Once`, atomic — or it is false.
`shared state -> goroutine lifetime -> happens-before edges -> cancellation -> unblock and join -> bounds -> proof`
Every goroutine has an owner, a signal it observes to stop, a guaranteed unblock for each blocking site, and a join point; a goroutine missing any of these outlives its purpose and leaks work, memory, or writes into freed assumptions. Worker pools and fan-outs carry explicit bounds, and timers and tickers have named stop owners.
Load [goroutine leak profiles](references/goroutine-leak-profiles.md) for
goroutine-count growth, shutdown stalls, production liveness incidents, or
changes to channel, lock, wait-group, and process-exit ownership.
For a delegated Decision or Review, or when the active artifact requires its
result interface, load the
[shared specialist contract](../../contracts/specialist-contract.md).
Trace every changed spawn site to its join or explicit process-lifetime
disposition. For interacting goroutines, exhaustive blocking-site coverage, or
a decision/review handoff, record
`GoroutineStory{owner, stop, blocking_sites, unblock, join, bound, happens_before,
proof}` per path. A single local path can keep its judgment and evidence in the
code or existing task artifact. Account for shared state, callers,
cancellation, close ownership, time