is_expired used age > ttl_secs, so a message with ttl_secs=0 whose age rounded to 0 seconds was considered live forever. Switch to >= so the zero-TTL boundary expires on the first check, matching the intuitive meaning of TTL and the behavior the tests assert.