Three of the four situations are resolved without any irreversible command.
Peering that will not finish: find the intermittent OSD
It is nearly always the same problem as flapping: an OSD coming and going stops PGs from completing peering. Identify it from ceph pg <id> query, then find out why it answers intermittently, usually on the network. Taking it down for good (ceph osd down) is often better than letting it oscillate: the cluster stops waiting for it and rebuilds.
Undersized or degraded: let it work, but watch
If recovery is progressing, the right move is to leave it alone and check there is room to rebuild into: a cluster near full has nowhere to put the missing copies and stays degraded indefinitely. If recovery is slow, raise the bandwidth limits with osd_max_backfills, one step at a time, watching that client I/O holds up.
OSDs down but recoverable: bring them back
The simplest answer and the most overlooked. An OSD that will not start because of a filesystem to check or a stopped service still holds the copies you need: recovering it closes the PGs and loses nothing. It is worth persisting with this before any other move.
incomplete PGs: this is a decision, not an execution
There are tools to unstick them, from ceph-objectstore-tool to export and reimport a PG from an OSD that will not start, through to declaring the missing copies lost. They work, and some cannot be undone. Which one to use depends on what is still on those disks, and that is established beforehand, not afterwards. If you have reached this point, write to us before running anything: the order matters more than the command.