I agree with you about moving the panic inside the Status() call, and not returning a func that the caller has to execute.

I also agree that only one goroutine should ever call Status and friends. This package isn't designed for tasks that execute in multiple parts. (Sub-tasks can Start() their own tasks, and I think that's reasonable.)

I think the documentation might be lacking a little narrative or something. I can take a look afterwards. Especially after we run this new version in production in our own systems -- that should be helpful.

So... ok, let's leave as-is and add the new feature to prevent cancelling. Although, since there is already a struct for setting opts, I would not do it via Start, unless you want Start to take an optional Opts argument?