Sashité for Developers
  1. Sashité for Developers
  2. Specifications
  3. PCN
  4. 1.0.0
  5. Examples
  6. Time Control

Time Control (PCN v1.0.0)

This page focuses on period-based timing. Time control in PCN is Match-wide — both players share the same period configuration.

All examples are shown in both TOML and JSON formats.


Quick Reference

Property Description
duration_ms Time budget in milliseconds (required)
increment_ms Fischer increment per ply in milliseconds
plies Move quota for this period

Time Control Modes

Configuration Mode Behavior
duration_ms only Fixed bank Time depletes linearly
duration_ms + increment_ms Fischer Increment added after each ply
duration_ms + plies = 1 Per-ply cap (byōyomi) Each ply must complete within the time
duration_ms + plies ≥ 2 Quota (Canadian) Time covers N plies, then resets

1. Bank Only — Pure Main Time

10 minutes per player, no increment.

TOML

[[periods]]
duration_ms = 600000

[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"

[[plies]]
pmn = "e2-e4"
elapsed_ms = 18400

[[plies]]
pmn = "e7-e5"
elapsed_ms = 22100

JSON

{
  "periods": [
    { "duration_ms": 600000 }
  ],
  "setup": {
    "feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
  },
  "plies": [
    { "pmn": "e2-e4", "elapsed_ms": 18400 },
    { "pmn": "e7-e5", "elapsed_ms": 22100 }
  ]
}

2. Fischer — 5+3

5 minutes initial time with 3 seconds increment per move.

TOML

[[periods]]
duration_ms = 300000
increment_ms = 3000

[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"

[[plies]]
pmn = "e2-e4"
elapsed_ms = 8000

[[plies]]
pmn = "e7-e5"
elapsed_ms = 12000

[[plies]]
pmn = "g1-f3"
elapsed_ms = 15000

[[plies]]
pmn = "b8-c6"
elapsed_ms = 5000

JSON

{
  "periods": [
    { "duration_ms": 300000, "increment_ms": 3000 }
  ],
  "setup": {
    "feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
  },
  "plies": [
    { "pmn": "e2-e4", "elapsed_ms": 8000 },
    { "pmn": "e7-e5", "elapsed_ms": 12000 },
    { "pmn": "g1-f3", "elapsed_ms": 15000 },
    { "pmn": "b8-c6", "elapsed_ms": 5000 }
  ]
}

Clock calculation (First Player):


3. Byōyomi — Main Time + Per-Ply Overtime

10 minutes main time, then 30 seconds per move.

TOML

[[periods]]
duration_ms = 600000

[[periods]]
duration_ms = 30000
plies = 1

[setup]
feen = "lnsgk^gsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGK^GSNL / S/s"

[[plies]]
pmn = "7g-7f"
elapsed_ms = 5200

[[plies]]
pmn = "3c-3d"
elapsed_ms = 8000

[[plies]]
pmn = "2g-2f"
elapsed_ms = 28400

[[plies]]
pmn = "8d-8e"
elapsed_ms = 4100

JSON

{
  "periods": [
    { "duration_ms": 600000 },
    { "duration_ms": 30000, "plies": 1 }
  ],
  "setup": {
    "feen": "lnsgk^gsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGK^GSNL / S/s"
  },
  "plies": [
    { "pmn": "7g-7f", "elapsed_ms": 5200 },
    { "pmn": "3c-3d", "elapsed_ms": 8000 },
    { "pmn": "2g-2f", "elapsed_ms": 28400 },
    { "pmn": "8d-8e", "elapsed_ms": 4100 }
  ]
}

Behavior: Once main time is exhausted, each move must complete within 30 seconds.


4. Pure Byōyomi — No Main Time

30 seconds per move from the start.

TOML

[[periods]]
duration_ms = 30000
plies = 1

[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"

[[plies]]
pmn = "e2-e4"
elapsed_ms = 15000

[[plies]]
pmn = "e7-e5"
elapsed_ms = 22000

JSON

{
  "periods": [
    { "duration_ms": 30000, "plies": 1 }
  ],
  "setup": {
    "feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
  },
  "plies": [
    { "pmn": "e2-e4", "elapsed_ms": 15000 },
    { "pmn": "e7-e5", "elapsed_ms": 22000 }
  ]
}

5. Canadian — 25 Moves in 5 Minutes

Quota-based time control that resets after each batch.

TOML

[[periods]]
duration_ms = 300000
plies = 25

[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"

[[plies]]
pmn = "e2-e4"
elapsed_ms = 10000

[[plies]]
pmn = "e7-e5"
elapsed_ms = 12500

JSON

{
  "periods": [
    { "duration_ms": 300000, "plies": 25 }
  ],
  "setup": {
    "feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
  },
  "plies": [
    { "pmn": "e2-e4", "elapsed_ms": 10000 },
    { "pmn": "e7-e5", "elapsed_ms": 12500 }
  ]
}

Behavior: After 25 moves, the 5-minute budget resets for the next 25 moves.


6. Main Time + Canadian Overtime

1 hour main time, then 25 moves in 5 minutes.

TOML

[[periods]]
duration_ms = 3600000

[[periods]]
duration_ms = 300000
plies = 25

[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"

[[plies]]
pmn = "d2-d4"
elapsed_ms = 27300

[[plies]]
pmn = "d7-d5"
elapsed_ms = 18000

JSON

{
  "periods": [
    { "duration_ms": 3600000 },
    { "duration_ms": 300000, "plies": 25 }
  ],
  "setup": {
    "feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
  },
  "plies": [
    { "pmn": "d2-d4", "elapsed_ms": 27300 },
    { "pmn": "d7-d5", "elapsed_ms": 18000 }
  ]
}

7. Classical — 40 Moves in 2 Hours + 30 Minutes

Tournament-style multi-stage time control.

TOML

[[periods]]
duration_ms = 7200000
plies = 40

[[periods]]
duration_ms = 1800000

[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"

[[plies]]
pmn = "e2-e4"
elapsed_ms = 50000

[[plies]]
pmn = "c7-c5"
elapsed_ms = 35000

[[plies]]
pmn = "g1-f3"
elapsed_ms = 42200

JSON

{
  "periods": [
    { "duration_ms": 7200000, "plies": 40 },
    { "duration_ms": 1800000 }
  ],
  "setup": {
    "feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
  },
  "plies": [
    { "pmn": "e2-e4", "elapsed_ms": 50000 },
    { "pmn": "c7-c5", "elapsed_ms": 35000 },
    { "pmn": "g1-f3", "elapsed_ms": 42200 }
  ]
}

Behavior: After 40 moves, remaining time carries over and 30 minutes are added.


8. Rapid — 15+10

15 minutes with 10 seconds increment.

TOML

[[periods]]
duration_ms = 900000
increment_ms = 10000

[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"

[[plies]]
pmn = "e2-e4"
elapsed_ms = 5000

[[plies]]
pmn = "e7-e5"
elapsed_ms = 8000

JSON

{
  "periods": [
    { "duration_ms": 900000, "increment_ms": 10000 }
  ],
  "setup": {
    "feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
  },
  "plies": [
    { "pmn": "e2-e4", "elapsed_ms": 5000 },
    { "pmn": "e7-e5", "elapsed_ms": 8000 }
  ]
}

9. Bullet — 1+0

1 minute, no increment.

TOML

[[periods]]
duration_ms = 60000

[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"

[[plies]]
pmn = "e2-e4"
elapsed_ms = 1200

[[plies]]
pmn = "e7-e5"
elapsed_ms = 800

[[plies]]
pmn = "d2-d4"
elapsed_ms = 1500

[[plies]]
pmn = "e5+d4"
elapsed_ms = 900

JSON

{
  "periods": [
    { "duration_ms": 60000 }
  ],
  "setup": {
    "feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
  },
  "plies": [
    { "pmn": "e2-e4", "elapsed_ms": 1200 },
    { "pmn": "e7-e5", "elapsed_ms": 800 },
    { "pmn": "d2-d4", "elapsed_ms": 1500 },
    { "pmn": "e5+d4", "elapsed_ms": 900 }
  ]
}

10. No Time Control

Games without time limits simply omit the periods section.

TOML

[sides.first]
name = "Human"

[sides.second]
name = "Engine"

[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"

[[plies]]
pmn = "e2-e4"

[[plies]]
pmn = "e7-e5"

JSON

{
  "sides": {
    "first": { "name": "Human" },
    "second": { "name": "Engine" }
  },
  "setup": {
    "feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
  },
  "plies": [
    { "pmn": "e2-e4" },
    { "pmn": "e7-e5" }
  ]
}

Implementation Notes

Clock Calculation

For Fischer time control, the clock after each ply is:

remaining = previous_remaining - elapsed_ms + increment_ms

Period Transitions

Time Forfeit Detection

A player forfeits on time when:


See Also