First, recognize that a transaction is made of:
- inputs - the funding source(s), the individual payments you previously received, and
- outputs - the amount(s) you are sending to different addresses. Typically only one or two outputs, but you can send to many people in one transaction if you want.
The baseline calculation for "when it becomes free" is 1 BTC after one day. If the input of your transaction is a single 1 BTC payment you received over a day ago (144 confirmations), then Bitcoin-qt won't require a fee, even if you are only sending .1 BTC to someone else (the other .9 is also sent, but it's sent back to your wallet as another output). Likewise, if your balance is from a single 0.1 BTC, a transaction using that payment would be free to send after 10 days of confirmations.
The above examples are when your transaction is made of one input. Often a transaction will be made of many smaller previous payments to you, put together by Bitcoin in whatever way it calculates will minimize the change that needs to be sent back to you. Therefore, it can be harder to know if you will need a fee without actually attempting to send the transaction. No "warning, requires a fee" message? That means a fee was not required, and only your optional fee (if set above 0) will be included.
what the stops miners increasing fees all the time?
If any output of your transaction is less than 0.01 BTC, a minimum fee is required regardless, to keep people from cheaply spamming the blockchain by sending the same money over and over.
priority = sum(input_value_in_base_units * input_age)/size_in_bytes
((0.4 * 100,000,000) * 100) / 258 = 15,503,875
Transactions need to have a priority above 57,600,000 to avoid the enforced limit. I would recommend ANY payment include a fee even if it would qualify to be free, as "free transaction" space in blocks is limited, and profit-motivated miners have no incentive to include free transactions over those with fees.