A little background:
1. If you want to test if the array of Passage Names returned by the (history:) macro contains three specific names then you need to check that array three times, once for each name.
(untested code)
(if: (history:) contains "PassageOne" and (history:) contains "PassageTwo" and (history:) contains "PassageThree")[ ... ]
2. The array of Passage Names returned by the (history:) macro is re-generated each time the macro is called, if you know that the list won't change between each call then you should temporarly save the array returned by the first call and use that for the other calls.
eg. In your (if:) macro you need to check the array three times, and the names within that array won't change between the 1st & 2nd or 2nd & 3rd call. So in this case you should use a temporary variable like so.
(untested code)
(set: _history to (history:))
(if: _history contains "PassageOne" and _history contains "PassageTwo" and _history contains "PassageThree")[ ... [
3. You stated you wanted to automatically send the player to another passage, that is what the (go-to:) macro is for. (untested code)
(set: _history to (history:))
(if: _history contains "PassageOne" and _history contains "PassageTwo" and _history contains "PassageThree")[
(go-to: "MessageOne")
]