- Sashité for Developers
- Specifications
- PCN
- 1.0.0
- Examples
- Complete Games
Complete Game Records (PCN v1.0.0)
This page provides end-to-end PCN documents that you can copy/paste and validate. Each example includes:
meta(optional),sides(per-player periods), requiredsetup(FEEN),movesas tuples["<PAN>", <seconds>]with float ≥ 0.0,- optional
status(CGSN) when the game ends.
Time control lives per player. Define it in
sides.first.periodsandsides.second.periods. Omit or use[]for no time limit.
1) Chess — Blitz (Fischer 5+3), In Progress
Highlights
- Symmetric bank with increment (
moves=null,inc=3). - Seconds are raw thinking time per move; increment applied at end of each move.
{
"meta": {
"event": "Blitz Arena",
"round": 12,
"started_at": "2025-01-27T14:30:00Z"
},
"sides": {
"first": {
"style": "CHESS",
"name": "Alice",
"elo": 2100,
"periods": [
{ "time": 300, "moves": null, "inc": 3 }
]
},
"second": {
"style": "chess",
"name": "Bob",
"elo": 2050,
"periods": [
{ "time": 300, "moves": null, "inc": 3 }
]
}
},
"setup": "+rnbq+kbn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+KBN+R / C/c",
"moves": [
["e2-e4", 8.0], ["e7-e5", 12.0],
["g1-f3", 15.0], ["b8-c6", 5.0],
["f1-c4", 120.0], ["f8-c5", 180.0]
],
"status": "in_progress"
}
Notes
- Active side is derived from FEEN + parity of
moves.length. - Remaining times are derivable by replaying periods + moves (no embedded clock state).
2) Shōgi — Main Time → Byōyomi (10′ → 30s/move), In Progress
Highlights
- Bank (10 minutes) then per-move cap (
moves=1, 30s, repeats naturally). - In per-move periods, each move must satisfy
seconds ≤ time, elsestatus = "time_limit".
{
"meta": {
"event": "Meijin Qualifier",
"round": 3,
"started_at": "2025-06-10T09:00:00Z"
},
"sides": {
"first": {
"style": "SHOGI",
"name": "Sente",
"periods": [
{ "time": 600, "moves": null },
{ "time": 30, "moves": 1 }
]
},
"second": {
"style": "shogi",
"name": "Gote",
"periods": [
{ "time": 600, "moves": null },
{ "time": 30, "moves": 1 }
]
}
},
"setup": "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL / S/s",
"moves": [
["7g-7f", 5.2], ["3c-3d", 8.0],
["2b-3c", 28.4], ["8d-8e", 4.1],
["P*5e", 3.0]
]
}
Transition rule reminder
- When bank hits
≤ 0and a next period exists, the next period applies to the next move (overshoot allowed). - Per-move periods naturally repeat; there is no counter to deplete.
3) Go-style Timing — Bank → Canadian (1h → 25/5′), In Progress
Highlights
- Bank then quota (
moves≥2): resets inherently when no next period exists. - Works for any PAN-addressed game; here we use a neutral FEEN placeholder board.
{
"meta": {
"event": "League Match",
"started_at": "2025-01-27T18:00:00Z"
},
"sides": {
"first": {
"name": "North",
"periods": [
{ "time": 3600 },
{ "time": 300, "moves": 25 }
]
},
"second": {
"name": "South",
"periods": [
{ "time": 3600 },
{ "time": 300, "moves": 25 }
]
}
},
"setup": "8/8/8/8/8/8/8/8 / U/u",
"moves": [
["D16", 27.3],
["Q4", 18.0],
["pass", 0.0],
["C14", 15.5]
]
}
Quota rule reminder
-
On quota reaching 0:
- If a next period exists → transition (applies to the next move).
- Otherwise → reset budget
timeand quotamoves, stay in the same period.
4) Classical Chess — 40/2h → 30′, Ends by Resignation
Highlights
- Stage 1: quota of 40 moves in 2h.
- Stage 2: bank of 30 minutes.
{
"meta": {
"event": "Championship",
"round": 5,
"started_at": "2025-01-27T12:00:00Z",
"href": "https://example.com/game/42"
},
"sides": {
"first": {
"style": "CHESS",
"name": "White",
"periods": [
{ "time": 7200, "moves": 40 },
{ "time": 1800 }
]
},
"second": {
"style": "chess",
"name": "Black",
"periods": [
{ "time": 7200, "moves": 40 },
{ "time": 1800 }
]
}
},
"setup": "+rnbq+kbn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+KBN+R / C/c",
"moves": [
["e2-e4", 50.0], ["c7-c5", 35.0],
["g1-f3", 42.2], ["d7-d6", 31.8],
["f1-b5", 25.0]
],
"status": "resignation"
}
Why resignation?
- CGSN
statuscan record declared outcomes regardless of remaining time.
5) Cross-Style — Chess vs Makruk, In Progress
Highlights
- Different SNN styles per side (cross-variant).
- No time control defined for either side (free play).
{
"sides": {
"first": { "style": "CHESS", "name": "Western Champion" },
"second": { "style": "makruk", "name": "Thai Champion" }
},
"setup": "rnsmksnr/8/pppppppp/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+KBN+R / C/m",
"moves": [
["e2-e4", 0.0],
["d6-d5", 0.0]
],
"status": "in_progress"
}
Implementation Notes
- Move tuples: always
[string PAN, number seconds≥0.0](floating-point). - Increment timing:
incapplies at the end of a move, using the period active at the start of that move. - Active player: derived from FEEN +
moves.lengthparity. - State derivation: remaining times, stage indices, and quotas are deterministically recomputed from
sides.{first,second}.periods+moves+meta.started_at(if present).
For focused examples by system (Fischer, Byōyomi, Canadian), see the Time Control Systems section.
