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:
- All players begin with 10 points.
- 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.
- Whenever a player's proposal is adopted, that player gains 3 points.
- The game ends if any player reaches 25 points, or if it's impossible to determine how play will proceed.
- When the game ends, the player with the most points wins.
- If a player's proposal comes in second place, they gain 1 point.
- Any time a player says the word "what" they lose 1 point.
- After each round, randomly select one of the previously rejected proposals to become a part of the rules.
- Replace rule 4 with: The game ends when one player reaches 20 points.
- Replace rule 2 with: During each round, elect a president, who proposes a rule change that will be enacted unless at least 2/3rds of players veto it.
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
@person 5 points and
!most points to track points,
!random player to randomly select players, and
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
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,
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
!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