package obs import ( "context" "log/slog" "runtime/debug" ) // SafeGo runs fn in a goroutine with panic recovery: a panic in a background // task (async telemetry write, retention trim) logs an ERROR with the stack // and dies alone instead of taking the process down. Вынесено из vojo bot.go — // без него async-паттерн телеметрии не переносится. func SafeGo(ctx context.Context, log *slog.Logger, name string, fn func()) { go func() { defer func() { if r := recover(); r != nil { log.ErrorContext(ctx, "background task panicked", "task", name, "panic", r, "stack", string(debug.Stack())) } }() fn() }() }