- Sashité for Developers
- Specifications
- PON
- 1.0.0
- Examples
PON Examples
- Position Object Notation (PON) v1.0.0
- Author: Cyril Kato
- License: Open Web Foundation Agreement 1.0
Overview
This document provides comprehensive examples of PON (Position Object Notation) usage across various game types, scenarios, and configurations. These examples illustrate practical applications of the PON specification while remaining rule-agnostic.
Note: All examples are for illustration purposes only. PON does not define or assume any game-specific rules, movement patterns, or win conditions.
Quick Reference Examples
Traditional Game Starting Positions
Western Chess (2D: 8×8 = 64 squares, 32 pieces)
{
"board": [
["-r", "n", "b", "q", "k^", "b", "n", "-r"],
["+p", "+p", "+p", "+p", "+p", "+p", "+p", "+p"],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
["+P", "+P", "+P", "+P", "+P", "+P", "+P", "+P"],
["-R", "N", "B", "Q", "K^", "B", "N", "-R"]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "C",
"second": "c"
},
"turn": "first"
}
Japanese Shōgi (2D: 9×9 = 81 squares, 40 pieces)
{
"board": [
["l", "n", "s", "g", "k^", "g", "s", "n", "l"],
[null, "r", null, null, null, null, null, "b", null],
["p", "p", "p", "p", "p", "p", "p", "p", "p"],
[null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null],
["P", "P", "P", "P", "P", "P", "P", "P", "P"],
[null, "B", null, null, null, null, null, "R", null],
["L", "N", "S", "G", "K^", "G", "S", "N", "L"]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "S",
"second": "s"
},
"turn": "first"
}
Chinese Xiangqi (2D: 9×10 = 90 squares, 32 pieces)
{
"board": [
["r", "h", "e", "a", "g^", "a", "e", "h", "r"],
[null, null, null, null, null, null, null, null, null],
[null, "c", null, null, null, null, null, "c", null],
["p", null, "p", null, "p", null, "p", null, "p"],
[null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null],
["P", null, "P", null, "P", null, "P", null, "P"],
[null, "C", null, null, null, null, null, "C", null],
[null, null, null, null, null, null, null, null, null],
["R", "H", "E", "A", "G^", "A", "E", "H", "R"]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "X",
"second": "x"
},
"turn": "first"
}
Thai Makruk (2D: 8×8 = 64 squares, 32 pieces)
{
"board": [
["r", "n", "s", "m", "k^", "s", "n", "r"],
[null, null, null, null, null, null, null, null],
["p", "p", "p", "p", "p", "p", "p", "p"],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
["P", "P", "P", "P", "P", "P", "P", "P"],
[null, null, null, null, null, null, null, null],
["R", "N", "S", "K^", "M", "S", "N", "R"]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "M",
"second": "m"
},
"turn": "first"
}
Games After Opening Moves
Chess after 1.e4
{
"board": [
["-r", "n", "b", "q", "k^", "b", "n", "-r"],
["+p", "+p", "+p", "+p", "+p", "+p", "+p", "+p"],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, "+P", null, null, null],
[null, null, null, null, null, null, null, null],
["+P", "+P", "+P", "+P", null, "+P", "+P", "+P"],
["-R", "N", "B", "Q", "K^", "B", "N", "-R"]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "C",
"second": "c"
},
"turn": "second"
}
Chess after 1.e4 c5 (Sicilian Defense)
{
"board": [
["-r", "n", "b", "q", "k^", "b", "n", "-r"],
["+p", "+p", null, "+p", "+p", "+p", "+p", "+p"],
[null, null, null, null, null, null, null, null],
[null, null, "+p", null, null, null, null, null],
[null, null, null, null, "+P", null, null, null],
[null, null, null, null, null, null, null, null],
["+P", "+P", "+P", "+P", null, "+P", "+P", "+P"],
["-R", "N", "B", "Q", "K^", "B", "N", "-R"]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "C",
"second": "c"
},
"turn": "first"
}
Shōgi after 1.P-7f
{
"board": [
["l", "n", "s", "g", "k^", "g", "s", "n", "l"],
[null, "r", null, null, null, null, null, "b", null],
["p", "p", "p", "p", "p", "p", "p", "p", "p"],
[null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null],
[null, null, "P", null, null, null, null, null, null],
["P", "P", null, "P", "P", "P", "P", "P", "P"],
[null, "B", null, null, null, null, null, "R", null],
["L", "N", "S", "G", "K^", "G", "S", "N", "L"]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "S",
"second": "s"
},
"turn": "second"
}
Dimensional Examples
PON supports boards of any dimensionality through nested array structures.
1D Boards
1D boards are represented as a single array of squares.
1D board with 8 squares, 2 pieces
{
"board": ["k^", "+p", null, null, null, null, "+P", "K^"],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "C",
"second": "c"
},
"turn": "first"
}
Minimal 1D board: 1 square, 1 piece
{
"board": ["k^"],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "S",
"second": "s"
},
"turn": "first"
}
Minimal 1D board: 1 square, 0 pieces (empty)
{
"board": [null],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "G",
"second": "g"
},
"turn": "first"
}
2D Boards
2D boards are represented as an array of ranks (arrays).
Empty 8×8 board (64 squares, 0 pieces)
{
"board": [
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "C",
"second": "c"
},
"turn": "first"
}
Empty 3×3 board (9 squares, 0 pieces)
{
"board": [
[null, null, null],
[null, null, null],
[null, null, null]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "G",
"second": "g"
},
"turn": "first"
}
3D Boards
3D boards use an additional level of nesting: array of layers, each containing ranks.
Simple 3D board (2 layers × 2 ranks × 2 files = 8 squares)
{
"board": [
[
["a", "b"],
["c", "d"]
],
[
["A", "B"],
["C", "D"]
]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "G",
"second": "g"
},
"turn": "first"
}
Empty 3D board (2 layers × 3 ranks × 3 files = 18 squares)
{
"board": [
[
[null, null, null],
[null, null, null],
[null, null, null]
],
[
[null, null, null],
[null, null, null],
[null, null, null]
]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "G",
"second": "g"
},
"turn": "first"
}
4D Boards
4D boards add another level of nesting: array of cubes, each containing layers.
4D board (2 cubes × 2 layers × 2 ranks × 2 files = 16 squares)
{
"board": [
[
[
["a", "b"],
["c", "d"]
],
[
["e", "f"],
["g", "h"]
]
],
[
[
["A", "B"],
["C", "D"]
],
[
["E", "F"],
["G", "H"]
]
]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "G",
"second": "g"
},
"turn": "first"
}
Dimensional Coherence
PON enforces dimensional coherence: all arrays at the same nesting level must have the same length (rectangular structure).
Valid examples:
| Structure | Description |
|---|---|
["a", "b", "c"] |
1D: 3 squares |
[["a", "b"], ["c", "d"]] |
2D: 2 ranks × 2 files |
[[["a", "b"], ["c", "d"]], [["e", "f"], ["g", "h"]]] |
3D: 2 layers × 2 ranks × 2 files |
Invalid examples:
| Structure | Why invalid |
|---|---|
[["a", "b"], ["c"]] |
Jagged: ranks have different lengths |
[[["a"], ["b", "c"]], [["d", "e"], ["f", "g"]]] |
Jagged: inconsistent rank lengths |
Cardinality Constraints
PON enforces cardinality constraints inherited from the Game Protocol:
- n ≥ 1: The board must have at least one square.
- p ≤ n: The number of pieces cannot exceed the number of squares.
Where:
- n = total squares (count of all leaf elements in the
boardarray) - p = total pieces (count of non-null elements in
board+ count of all elements in both Hand arrays)
Valid Examples
| Description | n | p | Validity |
|---|---|---|---|
| Minimal board with 1 piece | 1 | 1 | ✓ (1 ≤ 1) |
| Minimal empty board | 1 | 0 | ✓ (0 ≤ 1) |
| Empty 8×8 board | 64 | 0 | ✓ (0 ≤ 64) |
| Chess starting position | 64 | 32 | ✓ (32 ≤ 64) |
| Board with pieces in hand | 16 | 4 | ✓ (4 ≤ 16) |
Invalid Examples
| Description | n | p | Why invalid |
|---|---|---|---|
| More pieces than squares | 2 | 6 | p > n (6 > 2) |
| Hands overflow board capacity | 2 | 12 | p > n (12 > 2) |
Empty Board Positions
PON supports positions with zero pieces, useful for placement games like Go.
Empty 19×19 Go board (361 squares, 0 pieces)
{
"board": [
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "G",
"second": "g"
},
"turn": "first"
}
Cross-Style Games
Chess vs Makruk
Initial hybrid position (First player: Chess, Second player: Makruk):
{
"board": [
["r", "n", "s", "m", "k^", "s", "n", "r"],
[null, null, null, null, null, null, null, null],
["p", "p", "p", "p", "p", "p", "p", "p"],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
["+P", "+P", "+P", "+P", "+P", "+P", "+P", "+P"],
["-R", "N", "B", "Q", "K^", "B", "N", "-R"]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "C",
"second": "m"
},
"turn": "first"
}
Chess vs Shōgi
{
"board": [
["l", "n", "s", "g", "k^", "g", "s", "n", "l"],
[null, "r", null, null, null, null, null, "b", null],
["p", "p", "p", "p", "p", "p", "p", "p", "p"],
[null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null],
["+P", "+P", "+P", "+P", "+P", "+P", "+P", "+P", "+P"],
[null, "B", null, null, null, null, null, "R", null],
["-R", "N", "B", "Q", "K^", "Q", "B", "N", "-R"]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "C",
"second": "s"
},
"turn": "first"
}
Positions with Captured Pieces
Pieces in Hand
The hands field encodes pieces located in each player’s Hand.
Position with captures (First player has: 1 pawn; Second player has: 1 bishop)
{
"board": [
["r", null, "b", "q", null, "b", null, "r"],
["+p", "+p", "+p", "+p", null, "k^", "+p", "+p"],
[null, null, "n", null, null, "n", null, null],
[null, null, null, null, "+p", null, null, null],
[null, null, null, null, "+P", null, null, null],
[null, null, null, null, null, "N", null, null],
["+P", "+P", "+P", "+P", null, "+P", "+P", "+P"],
["-R", "N", "B", "Q", "K^", null, null, "-R"]
],
"hands": {
"first": ["+p"],
"second": ["B"]
},
"styles": {
"first": "C",
"second": "c"
},
"turn": "first"
}
Shōgi position with multiple pieces in hand
{
"board": [
["l", "n", null, "g", "k^", "g", null, "n", "l"],
[null, "r", null, null, "s", null, null, "b", null],
["p", "p", "p", "p", null, "p", "p", "p", "p"],
[null, null, null, null, null, null, null, null, null],
[null, null, null, null, "p", null, null, null, null],
[null, null, null, null, null, null, null, null, null],
["P", "P", "P", "P", null, "P", "P", "P", "P"],
[null, "B", null, null, null, null, null, "R", null],
["L", "N", "S", "G", "K^", "G", "S", "N", "L"]
],
"hands": {
"first": ["P"],
"second": ["p"]
},
"styles": {
"first": "S",
"second": "s"
},
"turn": "first"
}
Multiple pieces of same type in hand
{
"board": [
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, "K^", null, null, null, null],
[null, null, null, null, "k^", null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null]
],
"hands": {
"first": ["P", "P", "P", "B", "B"],
"second": ["p", "p", "p", "b", "b"]
},
"styles": {
"first": "C",
"second": "c"
},
"turn": "first"
}
Hand Attribution
The Piece Side encoded in an EPIN token is independent of the Hand’s associated Side.
First player’s hand contains a piece with Side = second (lowercase ‘p’)
{
"board": [
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, "K^", null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null]
],
"hands": {
"first": ["p"],
"second": []
},
"styles": {
"first": "C",
"second": "c"
},
"turn": "first"
}
Second player’s hand contains a piece with Side = first (uppercase ‘P’)
{
"board": [
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, "k^", null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null]
],
"hands": {
"first": [],
"second": ["P"]
},
"styles": {
"first": "C",
"second": "c"
},
"turn": "second"
}
This reflects the Game Protocol’s rule that captured pieces go to the Active Player’s Hand regardless of their Piece Side.
Piece State Modifiers
EPIN tokens support state modifiers (+ for enhanced, - for diminished).
Chess with castling rights encoded via state modifiers
Rooks with - indicate castling-capable (unmoved) state:
{
"board": [
["-r", "n", "b", "q", "k^", "b", "n", "-r"],
["+p", "+p", "+p", "+p", "+p", "+p", "+p", "+p"],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
["+P", "+P", "+P", "+P", "+P", "+P", "+P", "+P"],
["-R", "N", "B", "Q", "K^", "B", "N", "-R"]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "C",
"second": "c"
},
"turn": "first"
}
Shōgi with promoted pieces
+ prefix indicates promoted state:
{
"board": [
["l", "n", null, "g", "k^", "g", "s", "n", "l"],
[null, "r", null, null, null, null, null, "b", null],
["p", null, "p", "p", "p", "p", "+B", "p", "p"],
[null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null],
[null, "p", null, null, null, null, null, null, null],
["P", null, "P", "P", "P", "P", "P", "P", "P"],
[null, null, null, null, null, null, null, "R", null],
["L", "N", "S", "G", "K^", "G", "S", "N", "L"]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "S",
"second": "s"
},
"turn": "first"
}
Terminal Pieces
The terminal marker (^) indicates pieces critical to match continuation.
Chess: Kings are terminal
{
"board": [
["-r", "n", "b", "q", "k^", "b", "n", "-r"],
["+p", "+p", "+p", "+p", "+p", "+p", "+p", "+p"],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null],
["+P", "+P", "+P", "+P", "+P", "+P", "+P", "+P"],
["-R", "N", "B", "Q", "K^", "B", "N", "-R"]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "C",
"second": "c"
},
"turn": "first"
}
Multiple terminal pieces
{
"board": [
["k^", null, null, null, null, "K^"],
[null, null, null, null, null, null],
[null, null, null, null, null, null],
[null, null, null, null, null, null],
[null, null, null, null, null, null],
["q^", null, null, null, null, "Q^"]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "C",
"second": "c"
},
"turn": "first"
}
Derivation Marker
The derivation marker (') indicates pieces with a derived (non-native) style.
Shōgi with Jeweled King for Gote (second player)
{
"board": [
["l", "n", "s", "g", "k^'", "g", "s", "n", "l"],
[null, "r", null, null, null, null, null, "b", null],
["p", "p", "p", "p", "p", "p", "p", "p", "p"],
[null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null],
["P", "P", "P", "P", "P", "P", "P", "P", "P"],
[null, "B", null, null, null, null, null, "R", null],
["L", "N", "S", "G", "K^", "G", "S", "N", "L"]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "S",
"second": "s"
},
"turn": "first"
}
Shōgi with Jeweled King for Sente (first player)
{
"board": [
["l", "n", "s", "g", "k^", "g", "s", "n", "l"],
[null, "r", null, null, null, null, null, "b", null],
["p", "p", "p", "p", "p", "p", "p", "p", "p"],
[null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null],
[null, null, null, null, null, null, null, null, null],
["P", "P", "P", "P", "P", "P", "P", "P", "P"],
[null, "B", null, null, null, null, null, "R", null],
["L", "N", "S", "G", "K^'", "G", "S", "N", "L"]
],
"hands": {
"first": [],
"second": []
},
"styles": {
"first": "S",
"second": "s"
},
"turn": "first"
}
Summary Table
| Feature | JSON Representation | Notes |
|---|---|---|
| 1D board | ["a", "b", "c"] |
Single array |
| 2D board | [["a", "b"], ["c", "d"]] |
Array of ranks |
| 3D board | [[["a"], ["b"]], [["c"], ["d"]]] |
Array of layers |
| Empty square | null |
JSON null value |
| Piece | "K^" |
EPIN token as string |
| Empty hand | [] |
Empty array |
| Hand with pieces | ["P", "P", "N"] |
Array of EPIN tokens |
| Styles | {"first": "C", "second": "c"} |
SIN tokens |
| Turn | "first" or "second" |
Active player |
| State modifier | "+P", "-R" |
Enhanced/diminished |
| Terminal marker | "k^", "K^" |
Critical pieces |
| Derivation marker | "k^'", "K^'" |
Derived style |
