Roof vs. shelter vs. canopy vs. covered?

Whats the exact difference between:

1. Roof https://wiki.openstreetmap.org/wiki/Tag:building=roof
2. Shelter https://wiki.openstreetmap.org/wiki/Tag:amenity=shelter

and some sort of mixture

3. Shelter + building=yes ?

(in addition, there is also man_made=canopy, and also covered=*)

Roof is any building structure with a roof but no walls. building=canopy can be assumed to be a special case of building=roof. I can’t be sure, but man_made=canopy is probably a synonym.

A shelter may well be a building=roof or it may be a hut, or a number of other structures (depending on shelter type: e.g. bus shelters range from a roof canopy through to small buildings with seating inside; shelters for tourists at the seaside are likely to provide protection from both wind & rain etc.

The covered=* tag is usually applied to ways, mainly highways where the associated covering structures may or may not have been mapped (e.g., covered walkways, avalanche galleries etc.). It is often more convenient to tag the way than rely on a complex query involving any buildings which intersect the way.

There is also tunnel=building_passage which is in common usage for roads and paths which pass through an arch or similar hole in a building.

How do i know if a structure is a roof or shelter?

and if its a shelter, should i add a building tag to it?

You look at it and make a judgement call. For instance the cover above a gas station is a roof. But a structure in the woods made to take shelter against weather is a shelter.
If it is a shelter than usually you don’t add the building tag.