This is a general question, but based on a specific situation. In Commerce the standard way of customising a product AFAIK is to use Commerce Customizable Products. It allows you to create different bundles of the line_item entity and configure certain fields to be used on the add-to-cart form. A typical example would be a customisable message being implemented as a text field. When you add the product to your cart, a new line item is created and that's what's actually associated with your order.
While considering another Q I thought it made sense to have the option to fill out the form at checkout time. It would be useful to have required fields, but that would mean that when the line item is created these required fields are empty. AFAICT core doesn't enforce required fields when saving entities programatically.
field_default_validate() just checks cardinality. (And a quick test creating a node without required fields populated seems to bear this out.) It seems like the required attribute is only for the UI.
One potential problem occurs if users have access to the entity edit form. Imagine you want to change the title of a node, you edit it, and then you have to fill in all the required fields as well before you can save. But in some cases (like line_item) users typically don't have general access to an entity edit form. So in this situation is it icky to create an entity without its required fields? Is there any precedent? Can anyone see any other pitfalls?