Suppose I automatically generate two dandelion transactions, with some relationship with each other, like parent/child and relay them at the same time. Not seeing the first transaction makes the second invalid, but if they both relay through dandelion, won't there be situations where the second transaction is seen by the Bitcoin network first and rejected as invalid because the first is still swimming around in dandelion relays somewhere?
You would have the same problem today. If you relayed both transactions to your peers at the same time, the second would also be invalid because the first hadn't propagated fully yet. The solution to this "problem" is to wait a few seconds before sending the second transaction. With Dandelion, it is easier to tell if the network has heard your transaction because you will get INVs from the rest of your peers (the ones you hadn't sent the tx to) saying that they have your transaction. At that point, you can broadcast the second one.
Or are both somehow routing through the same route?
They could be routed through the same route. For a given inbound connection, all dandelion transactions received from the connection must be sent through the same outbound connection. As the creator of a transaction, you can choose which outbound connection you wish sent your dandelion transaction to. So if you choose the same node as the first one, then your transaction will most likely end up going through the same route. Of course, each node should also be periodically reselecting which outbound node they will send dandelion transactions to for each incoming connection, so it is possible that you will end up with a different route.
Additionally, from what I read, every dandelion ready node can turn any dandelion transaction into a normal Bitcoin transaction and broadcast it. There isn't anything like onion routing preventing intermediaries from reading what they're sending along in the next hop. What if you set up a few nodes, but instead of "fluffing" a transaction 10% of the time, you do it 50%. Doesn't that degrade the overall security assumptions?
What security assumptions?
All that Dandelion guarantees is that an adversary will have a harder time connecting transactions to IP addresses. Even if you have a node that fluffs 100% of the time, this guarantee still holds because it is not
you who sent the transaction to the network, it was
someone else. So long as
you follow the protocol, your transactions will be harder to deanonymize. Furthermore, you don't stick with the same outbound peer forever. You change which peer to relay dandelion transactions to periodically, so eventually you will get an honest node.