o, have you seen this? -Aris
On Fri, Sep 29, 2017 at 1:00 AM, Aris Merchant <[email protected]> wrote: > On Thu, Sep 28, 2017 at 12:28 AM, Owen Jacobson <[email protected]> wrote: >>> This is the first stage of an attempt to create an annotation system >>> designed to formalize game state changes by attaching formal descriptions >>> of those changes to documents, represented by email messages. At this time, >>> I plan only to archive messages, but there will be a read element allowing >>> anonymous users to read and enumerate messages from the archive in the near >>> future. >> >> The broader scheme here is this: >> >> 1. A client app forwards public messages to the archive. They sit in an >> “unannotated messages” queue until someone - me, probably - picks them up >> and annotates them. >> >> 2. A user annotates each message with a short formal description of the >> game-state changes imposed by a message. These annotations are mutable, so >> mistaken annotations are not a permanent problem, and are versioned so that >> vandalism can be undone. I haven’t worked out the exact schema for these >> annotations, yet, but the concept I’m working with is loosely based on the >> RFC 6902 JSON Patch format, adapted for Agora’s specific needs. For example, >> an annotation transferring shinies might read, in YAML form for readability: >> >>> - op: event >>> office: Secretary >>> summary: o paid Ørjan 1 sh. >>> >>> - op: transfer >>> from: /Shinies/Player/o >>> to: /Shinies/Player/Ørjan >>> delta: 1 >> >> Obviously, this is an awkward format, but it has some nice properties that I >> think make it worth building on. I’m still tweaking the actual format for >> annotaitons, and it’s likely I’ll add a UI or some variety of terse syntax >> so that it’s possible to write this kind of simple action in fewer than >> eight lines. >> >> 3. The archive exposes an API that can sum up the annotations, starting from >> the beginning of time, all the way up to a specific point in time, and then >> return the computed state of the game plus a list of events by office. My >> report scripts will become “query this API in a specific way, and feed the >> resulting data to a template to render it for email.” >> >> The idea is that instead of trying to reduce Agora to a set of formal >> actions, I instead want to keep the prose forms as the primary documents and >> allow formal note-taking alongside them. Many of Agora’s state changes are >> formalizable, and from there, those parts of Agora’s state are computable, >> so this could take a bunch of load off for computing those parts of the game. >> >> I’ve had some success with a reduced version of this approach for the office >> of Surveyor. All Surveyor’s reports have been generated by a >> built-to-purpose Python script that applies the same principles to a set of >> local YAML files instead of a web API. >> >> -o > > I love this idea. It seems very practical without sacrificing > usability for the end users (i.e. the players). I have a few > suggestions: > > 1. Who annotates. I think giving everyone access to the annotation > interface would probably make sense. You can't personally annotate > every message affecting the entire gamestate, and I'd love to help set > the formats I'm consuming for Promotor. nichdel came up with a > proposal format suggestion, and now that this has come along I'm > modifying it to have more information for the Promotor side of the > Promotor-Assessor pipeline. I'm sure other officers have input on how > formalization for their parts of the gamestate should take place, and > they have a unique understanding of what information is needed to do > their jobs. > > 2. Annotation style. As you've mentioned, your format is a bit forced. > You're doing a great job with what you have to work with, but I think > the basic problem may be that you're trying to use markup to represent > transactions. It works wonderfully for representing the data (and > should probably be a base format for that), but poorly for > representing things like conditional actions. You can add and add to > the format, but you'll just be making it more complicated to use. I > suggest you consider using programs (possibly with methods you > provide) as annotations. It feels kind of intuitively weird to > represent an annotation as a program, and they don't have the nice > formal properties the data itself does (except maybe if you used > Haskell or something), but I think it might be a lot more practical > for actual use. Programs allow for loops, unrestricted conditionals, > and the like, meaning that you don't have to work something out by > hand or create a new transaction type just for one complicated > transaction. They would work well for this because they take data and > compute changes, which is exactly what our action system does. There > is thus a neat one-to-one correspondence between an action and a > program. > > o, honestly, this is an amazing idea. This is such a brilliant > solution to the entire problem that I'm kind of kicking myself for not > coming up with it (not that I would have been able to implement it if > I had). > > -Aris

