Hey Devan,
Jacob is mostly right. :-)
push IDs are generated client-side and are therefore at the mercy of the client's local clock (which could be completely wrong). We actually try to compensate for wrong clocks to some degree though. When a Firebase client connects, the server will send an accurate timestamp to the client so it can then use that as a basis to adjust its own clock to be more correct when generating push ID's.
But note that this correction only takes effect once the client has connected to Firebase, so if you call .push() before then you may get non-chronological IDs. In fact, you can even call .push() twice in a row on the same client and the second push ID will be ordered before the first one (if we started compensating your clock between the two push() calls).
Anyway, long story short: push() usually works out to be chronological, but it's definitely not guaranteed. To get guaranteed choronological order, you can do something like:
ref.push({ foo: 'bar', date: Firebase.ServerValue.TIMESTAMP });
// later, retrieve them ordered by date.
ref.orderBy('date').on('child_added', ...)
This is guaranteed to give you chronological ordering, since the ServerValue.TIMESTAMP will be resolved on the Firebase server to be an accurate timestamp.
-Michael