Portable Move Notation (PMN) Specification
Version: 1.0.0 Author: Sashité Published: May 1, 2025 License: MIT License
Overview
Portable Move Notation (PMN) is a rule-agnostic, JSON-based format for describing the mechanical decomposition of moves in abstract strategy board games. PMN breaks down complex movements into sequences of atomic actions, revealing the underlying mechanics while remaining completely independent of specific game rules, validation logic, or gameplay concepts.
PMN provides a universal vocabulary for expressing how pieces physically move, interact, and transform during gameplay across any board game system, from traditional chaturanga to modern variants and hybrid games.
Core Philosophy
Mechanical Decomposition
PMN treats every move as a sequence of atomic mechanical actions. Each action represents a single, indivisible transformation that occurs during move execution. Complex movements that appear as single “moves” in traditional notation are decomposed into their constituent mechanical steps.
Key principle: PMN describes what happens mechanically, not what is allowed or why it happens.
Atomic Actions
An atomic action is the smallest meaningful transformation in a game system:
- One piece moving from one location to another
- Optional transformation of the piece during movement
- All actions are independent and execute sequentially
Universal Applicability
PMN’s mechanical approach enables universal application across:
- Chaturanga family games: International chess, shōgi, xiangqi, makruk, sittuyin
- Regional board games: Go placement and captures, mancala transfers
- Modern innovations: Fairy pieces, multi-dimensional boards
- Hybrid systems: Cross-game piece interactions
Format Structure
Flat Array Representation
A PMN move is a flat JSON array containing the complete action sequence:
[<element-1>, <element-2>, <element-3>, <element-4>, <element-5>, <element-6>, ...]
Action Sequence Parsing
The array is parsed by grouping elements into action sequences of exactly 3 elements:
- Process elements left-to-right sequentially
- Group into sets of 3 consecutive elements
- Each group represents one atomic action
Array length must be divisible by 3 (complete action sequences only).
Action Sequence Format
Each action follows this fixed pattern:
[<source>, <destination>, <piece>]
Position | Element | Description |
---|---|---|
0 | Source | Origin location ("*" for drop from hand) |
1 | Destination | Target location ("*" for capture to hand) |
2 | Piece | Final piece state after the action |
Element Specification
Source Location
- Type: Non-empty string
- Board position: Any valid board location identifier (
"e4"
,"5c"
,"center"
) - Drop from hand:
"*"
indicates placement from player’s hand/reserve
Destination Location
- Type: Non-empty string
- Board position: Any valid board location identifier
- Capture to hand:
"*"
indicates piece goes to player’s hand/reserve
Piece State
- Type: Non-empty string
- Purpose: Describes the piece’s final state after the action
- Identity preservation: Use current identifier if piece unchanged
- Transformation: Use new identifier if piece changes (
"Q"
for promotion,"+S"
for shōgi promotion)
Constraint: Source and destination cannot both be "*"
in the same action.
Mechanical Semantics
Execution Model
Actions execute sequentially in array order. Each action completes fully before the next begins, producing these deterministic effects:
- Source state change:
- Board location → becomes empty
- Hand (
"*"
) → remove specified piece from hand/reserve
- Destination state change:
- Board location → contains the final piece state
- Hand (
"*"
) → add specified piece to hand/reserve
-
Piece transformation: Piece assumes its final state as specified
- Atomic commitment: All changes occur atomically per action
State Dependencies
Later actions may reference locations modified by earlier actions, enabling complex movement patterns like exchanges or multi-step captures.
Examples by Complexity
Note: The following descriptions represent common interpretations of PMN sequences, not inherent properties of the notation itself. PMN describes only mechanical transformations.
Basic Movements
Simple move (international chess):
["e2", "e4", "P"]
Piece P moves e2 → e4
Simple move (shōgi):
["7g", "7f", "P"]
Piece P moves 7g → 7f
Simple move (xiangqi):
["e4", "e5", "兵"]
Piece 兵 moves e4 → e5
Transformation (international chess):
["e7", "e8", "Q"]
Piece moves e7 → e8 and becomes Q
Drop from hand (shōgi):
["*", "5e", "P"]
Place piece P from hand onto 5e
Capture Mechanics
Simple capture with elimination (international chess):
["f3", "e4", "K"]
Piece K moves f3 → e4
Capture with retention (shōgi):
["2b", "*", "K", "2c", "2b", "S"]
Two actions: (1) Piece K at 2b goes to hand, (2) Piece S moves 2c → 2b
Cannon capture (xiangqi):
["a1", "a4", "車"]
Piece 車 moves a1 → a4
Complex Movements
Castling (international chess):
["e1", "g1", "K", "h1", "f1", "R"]
Two actions: (1) Piece K moves e1 → g1, (2) Piece R moves h1 → f1
En passant (international chess):
["d4", "e4", "P", "e4", "e3", "P"]
Two actions: (1) Piece P moves d4 → e4, (2) Piece P moves e4 → e3
Promotion with capture retention (shōgi):
["7f", "*", "S", "7g", "7f", "+P"]
Two actions: (1) Piece S at 7f goes to hand, (2) Piece moves 7g → 7f, becomes +P
Palace movement (xiangqi):
["e1", "f2", "仕"]
Piece 仕 moves e1 → f2
Piece exchange:
["e2", "*", "A", "e3", "e2", "B", "*", "e3", "A"]
Three actions: (1) Piece A at e2 goes to hand, (2) Piece B moves e3 → e2, (3) Piece A from hand goes to e3
Validation Requirements
Structural Validation
- Array length: Must be divisible by 3
- Minimum length: At least 3 elements (one complete action)
- Element format: All elements must be non-empty strings
- Action constraints: Source and destination cannot both be
"*"
Semantic Validation
- Source piece existence: Each action must reference an existing piece at its source location:
- When source is
"*"
: The specified piece must exist in the player’s hand/reserve - When source is not
"*"
: A piece (any piece) must be present at that board location
- When source is
JSON Schema
Schema URL: https://sashite.dev/schemas/pmn/1.0.0/schema.json
The JSON Schema provides structural validation for PMN format compliance. Semantic validation (piece existence) must be implemented by applications based on current game state.
Ecosystem Integration
PMN serves as the execution layer in the Sashité notation ecosystem:
- General Actor Notation (GAN): Provides game-qualified piece identifiers
- Forsyth-Edwards Enhanced Notation (FEEN): Represents game states before/after move execution
- General Gameplay Notation (GGN): Describes movement possibilities that PMN actualizes
- Piece Name Notation (PNN): Standardizes piece identifier formats
PMN uniquely focuses on mechanical decomposition, complementing formats that handle piece identification, position representation, and movement analysis.
Implementations
Ruby
- Pmn.rb – Complete mechanical decomposition support with full validation