So, how can people who see the message after that 100th block verify it was signed before it?
Because you can write a double-spend. Which means, things are locked in, and you cannot modify something, which was committed on-chain. If you created a double-spend intentionally, and committed it into one of your signatures, then you can later reveal that commitment.
Maybe I should show you, how the whole proof could look like, if you use commitments. Getting it "technically correct" on some test network will take some time, so here is the draft:
1. Current block hash: 00000000000000000003a9044d0dffa7630a2b63b7631412cb5598eef7781488
This is easy, and can prove, that this message was written on 2024-01-03 23:09 UTC (or later, but not before that).
2. Transaction hash: 576a95899c537e861cac07d294228b703297938310b9d780aaef2bf28a6ab8bf
Then, you make sure, that this transaction is present on-chain, it is valid, and confirmed. You find my signature, and extract it:
30440220
1a8615561a18fbc274b51d84f29e311ee93dd2242d5710149b816286bb18990d //r-value
0220
6507ca5cd1ea2a0b17b6b5f35d3ce0e9a3e536b98cb4469fb57b07da5e47bca5 //s-value
01
And then, you look at R-value of that signature, and convert it into Taproot address: bc1pr2rp24s6rrauya94rkz09833rm5nm53y94t3q9yms93gdwccnyxsxseupy
Then, if I can provide you any matching TapScript, in that case I can include any proof. Which means, if that R-value was random, then I would be able to spend by key, but not by TapScript. But if I prepared it intentionally before, then I could reveal a TapScript, for example with 'OP_RETURN "Here is my proof"'. In that case, it would be impossible to abuse it, and post that commitment on-chain (because it starts with OP_RETURN), but at the same time, it would be possible, to prove later, that I didn't generate that message in 2028, because it would require going back into 2024, and modifying R-value of that specific transaction.