The Game of Nomic

Nomsu's inspiration (and name) comes from a game called Nomic that was invented by the philosopher Peter Suber ("Nomsu" = Nomic + Suber) as a thought experiment about paradoxes in law. Nomic is a game where you start with a small set of rules, such as:

  1. All players begin with 10 points.
  2. During each round, all players submit a proposal for a change to the rules. Have one player read the proposals aloud. Players vote "yea" or "nay" on each proposal. The proposal (or proposals) with the most "yea"s becomes part of the rules, and a new round begins.
  3. Whenever a player's proposal is adopted, that player gains 3 points.
  4. The game ends if any player reaches 25 points, or if it's impossible to determine how play will proceed.
  5. When the game ends, the player with the most points wins.
The specific set of rules is less important than the fact that the rules contain a mechanism for changing the rules, and rule changing is a central part of the gameplay. Players might submit proposals like: The most interesting part of Nomic is that all of the rules are subject to change. It is perfectly valid to submit rule changes like: As time passes and new rules get added, the game can get very complex. It's a ton of fun, and it can teach you a lot about legal systems, game theory, and game design.

Playing Nomic for the First Time

When I first played Nomic, I played it in a Slack group over the course of a month, and what started as a simple set of 12 rules (modified to fit asychronous online play, rather than short, in-person games) grew into more than 80 rules, including rules that referenced an additional set of 75 random outcomes for when certain events occurred. We built up a whole mythology and had a lot of ups and downs, finding places where the rules didn't work and fixing them as we went. Even when the rules were badly broken or exploitable, it was still very fun.

Of course, you can imagine that that sort of complexity became hard to keep track of. It became a hassle to maintain an up-to-date record of whose turn it was, how many points everyone had, and even what the current set of rules was. Since we were playing on Slack, I decided to use an existing Slackbot to keep track of the score. That helped a lot, but it wasn't very flexible, and we still had to manually keep track of a lot of other things. So, I decided to roll up my sleeves and write my own simple Slackbot to handle some of the bookkeeping. It supported some basic functionality like commands for !give @person 5 points and !most points to track points, !random player to randomly select players, and !end turn to keep track of whose turn it was. This worked great, but it still had some irritating limitations. I had to manually update the code and restart the bots every time the rules changed, and it was possible for the code and the rules to drift out of sync. At some point, I had the idea to provide a mechanism for the players to tell the bot to update itself for some of the rudimentary random outcomes. This made maintaining the bot much less work, but it was still very inflexible.

Eventually the game ended, a winner was crowned, and I moved on with my life. Time passed, and I was working on various projects (my games 30 Second Life, Unshuffle, and Triptoy), but from time to time, my mind would wander back to Nomic, and the Slack bot I had made to keep things running smoothly. I really wished the system was more powerful, and could handle things like collecting and tallying votes, determining the winning proposals, and updating its own source code accordingly.

I particularly liked the user-friendly natural syntax of my original Slack bot commands like !give @person 2 points, and like many programmers, I also have strong opinions about programming languages. So, I decided to make my own language for playing Nomic. Its main design goals were to be easy to read and good at accepting modifications to its own code while running. And thus, Nomsu was born.