Petrov Day Retrospective: 2022

This is a follow-up to the Petrov Day commemoration of 2022


We died.

Twice.

Maybe three times.


This is how it went down...

September, 21, 5:43 PM Pacific Time: I write the code that determines whether a user is authorized to launch. I was in a rush because I leaving for EA Global DC.

September 25, 8:00 PM: Petrov Day celebration commences. The button is on the frontpage. Any users with greater than 2,300 karma could press the button.

September 25: 9:05 PM: I am reminded by others at LessWrong that I was supposed to publish the launch code in the comments. Without the code, no one can nuke the site. Understandably, no one spoke up to point out the absence of code – that would be hella suspicious. This reveals that incompetence on occasion might even save you from destruction. But don’t bet on it.

September 25, 10:55:04 PM: The frontpage is nuked after 2 hours and 55 minutes. The karma threshold is 2,100 and there are 290 users with that much karma or more.

September 25, 11:51 PM: Oliver Habryka is suspicious that there is a bug in the code and he digs into it, uncovering that indeed, due to an error in the logic, any user with 0 karma (and exactly 0 karma) was already able to launch nukes and destroy the frontpage. An anonymity-preserving database check confirmed that it was a user with 0 karma who had launched the missiles.

September 26, 12:36 AM: The decision is made to revive the frontpage and keep going with the Petrov Day commemoration.

September 26, 10:11 AM: The entire LessWrong website (not just the front page) goes down and is returning 502s. This is because I pushed a bad commit to fix hiding the Petrov Opt-Out checkbox without properly testing it. The site is soon restored to functioning.

September 26, 5:33:02 PM: At this time, the karma threshold for the ability to launch is 200, and 1,504 users were able to bring down the front page.

With two hours and 27 minutes remaining, someone presses the initiation button, enters the launch code, and presses fire. The frontpage goes down.

With the anonymity introduced in 2022, we do not know who pressed the button or why.

September 26, 8:00:00 PM: The Petrov Day commemoration is concluded. The LessWrong frontpage is restored.


What a day. What a day indeed.

I will tell you the symbolic lessons I take from these events, though you are welcome to interpret things how you please.

First, we very successfully commemorated how shoddy engineering by well-intentioned engineers can still lead to the end of the world. In Petrov’s case, the shoddy engineering lead to a false alarm that was safely ignored. In our case, we weren’t so lucky, and the bad code meant that the site did indeed go down. And in real life, you don’t get to decide that wasn’t fun and have a do-over.

We could have decided to leave the site down, there would have been some symbolic purity in that, however it seemed more worthwhile to see what would happen under the primary design of the exercises – seeing how long it’d take for the site to go down, even if we were pretty sure that it would.

Second, I want to claim that although the site went down, it in fact revealed that users on LessWrong with more than 300 karma (1,178 of them exist, 335 visited the site on Petrov Day) are not the kind to push buttons for one reason or another. Granted many of them would not have been checking the site, but still. This is a much better outcome than the Manifold Prediction market anticipated:

You can see that for much of the day, the market thought that the site would survived for only ~30% of the day, i.e. 8 hours. In fact, the site survived 21.5 hours or 90% of the day.

I feel pretty good about that! This is even true despite the fact that a button-pusher would remain anonymous this year.

A couple of people expressed that they were very sad that the site went down this year as it means we don’t get the symbol of trust we had in previous years. I’m not sure that’s the right argument. Given that 335 users with 300+ karma were active on the site on Petrov Day, and the site didn’t go down until we got beneath that, you could argue this is most successful Petrov Day yet on LessWrong (in past years, at most 250 people were given codes, and it’s not clear they all visited LessWrong even). Plus, as above, this year the 300+ users didn’t press the button despite the offer of anonymity.

Of course, this analysis ignores the fact that someone with 300+ karma might have decided to wait until the threshold was much lower than their own score in order to act with more anonymity. It’s very hard to rule that out, so perhaps the above analysis is bunk. Or rather, it’s far from certain but is evidence in a certain direction.


Something we introduced this year was the ability to opt out of Petrov Day. There are at least two reasons you might want to do so: 1) because you wish to object to the game, or 2) because you want to commit yourself to not pressing the button.

35 users chose to opt out. We cannot be sure of their motivations, but a few users publicly declared their opt-out, several citing that committing to not press the button seemed like the right thing to do. Kudos to them!

Lastly, Zack Stein-Perlman polled LessWrong’s users to check what people overall thought about bringing the site down:

As you can see, overwhelmingly, users think one ought not to press the button.

Hear, hear. I agree.

This was great, y’all. Yes, the site went down eventually, but only once the karma required to do was merely 200. From this we can conclude that in gaining more karma than that, one becomes the kind of person who doesn’t destroy the world symbolically or otherwise.

Till next time!

  1. ^

    Specifically, the function below determines who could launch nukes. The flaw in this function is that users with 0 karma do not have a karma field on their user object, so checking their karma is below the current threshold does nothing, i.e. nothing in the function prevents them from launching.

    export const userCanLaunchPetrovMissile = (user: UsersCurrent|DbUser|null): boolean  => {
      const currentKarmaThreshold = getPetrovDayKarmaThreshold()
      const manuallyExcludedUsers: String[] = [<redacted>]
      const userCreatedBeforeCutoff = moment('2022-09-21').isSameOrAfter(moment(user?.createdAt))
    
      return !!user && userCreatedBeforeCutoff && !(manuallyExcludedUsers.includes(user._id) 
        || !!user.banned 
        || user.deleted 
        || (user.karma && user.karma < currentKarmaThreshold) 
        || (user.karma && user.karma < 0) 
        || user.petrovOptOut)
    }