- Sashité for Developers
- Specifications
- PCN
- 1.0.0
- Examples
- Game Status
Game Status (PCN v1.0.0, CGSN)
This page shows concrete PCN documents that end in various CGSN status values. Each example is a valid JSON you can copy/paste.
Reminder
- Moves are tuples
["<PAN>", <seconds: float ≥ 0.0>].- Time control is per player (
sides.{first|second}.periods), optional.- Some statuses are inferable from the final position (e.g., stalemate), others are explicit (e.g., resignation).
1) in_progress — Ongoing Game
{
"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", 0.0],
["e7-e5", 0.0]
],
"status": "in_progress"
}
2) resignation — Declared Resignation
{
"meta": { "event": "Club Match" },
"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", 12.4],
["c7-c5", 9.1],
["g1-f3", 3.0]
],
"status": "resignation"
}
Notes: resignation is an explicit outcome; it doesn’t depend on time control.
3) time_limit — Time Expired (Bank with Increment)
{
"meta": { "event": "Blitz Arena", "started_at": "2025-01-27T14:30:00Z" },
"sides": {
"first": { "periods": [ { "time": 60, "inc": 2 } ] },
"second": { "periods": [ { "time": 60, "inc": 2 } ] }
},
"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", 7.0],
["e7-e5", 12.0],
["g1-f3", 30.5],
["b8-c6", 22.4],
["f1-c4", 40.1] // suppose White's bank < 0 at end → time_limit
],
"status": "time_limit"
}
Rule reminder: bank (moves = null) depletes by seconds; inc adds after each move. If bank < 0 and no valid transition → time_limit.
4) time_limit — Per-Move Cap (Byōyomi)
{
"sides": {
"first": { "periods": [ { "time": 5, "moves": 1 } ] },
"second": { "periods": [ { "time": 5, "moves": 1 } ] }
},
"setup": "8/8/8/8/8/8/8/8 / U/u",
"moves": [
["...", 3.0],
["...", 6.2] // violates per-move cap 5s
],
"status": "time_limit"
}
Rule reminder: for moves = 1, each move must satisfy seconds ≤ time; otherwise time_limit.
5) agreement — Draw by Agreement
{
"meta": { "name": "Friendly Game" },
"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", 0.5],
["e7-e5", 0.6],
["g1-f3", 0.3]
],
"status": "agreement"
}
Notes: explicit outcome, independent of position.
6) repetition — Position Repetition
{
"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": [
["g1-f3", 1.2],
["g8-f6", 1.1],
["f3-g1", 0.9],
["f6-g8", 1.0],
["g1-f3", 1.1],
["g8-f6", 0.8]
],
"status": "repetition"
}
Notes: The engine/viewer determines whether the necessary repetition threshold is reached for the style in use.
7) stalemate — No Legal Moves, Not in Check
{
"setup": "7k/5Q2/6K1/8/8/8/8/8 / c/C",
"status": "stalemate"
}
Notes: Often inferable from the position; explicit status is allowed.
8) checkmate — Check with No Escape
{
"setup": "6rk/6pp/8/8/8/8/6PP/5RK1 / c/C",
"moves": [
["g1-f2", 2.1], // illustrative only
["...", 0.0]
],
"status": "checkmate"
}
Notes: In many cases, the final position suffices to infer checkmate; explicit status removes doubt.
9) insufficient — Insufficient Material
{
"setup": "8/8/4k3/8/8/4K3/8/8 / C/c",
"status": "insufficient"
}
Notes: Another status that is often inferable from the final position.
10) illegal_move — Invalid PAN or Violates Style Rules
{
"sides": {
"first": { "style": "CHESS" },
"second": { "style": "chess" }
},
"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~e5", 0.2] // bogus special operator for chess: invalid under style rules
],
"status": "illegal_move"
}
Notes: illegal_move may arise from malformed PAN or a legal PAN that is not legal under the acting side’s SNN style.
11) move_limit — Move Count Reached
{
"meta": { "name": "Training Drill" },
"setup": "8/8/8/8/8/8/8/8 / U/u",
"moves": [
["...", 0.1],
["...", 0.1],
["...", 0.1]
],
"status": "move_limit"
}
Notes: Move limits are policy dependent (outside PCN core). CGSN allows recording the outcome explicitly.
Implementation Tips
-
Trait derivation
side0 = FEEN.active(setup) active = (moves.length % 2 == 0) ? side0 : opposite(side0) -
Time control semantics
moves = null→ bank (decrement byseconds; applyincafter each move).moves = 1→ per-move cap (seconds ≤ timeper move).moves ≥ 2→ quota (decrement count; if no next period when reaching 0, reset budget & quota and stay).
-
Explicit vs Inferable
- Inferable (e.g., stalemate, checkmate, insufficient) can be omitted; Explicit statuses (e.g., resignation, time_limit, agreement, illegal_move, move_limit) should be recorded directly.
For full games, see Complete Game Records. For timing patterns, see Time Control Systems.
