Sashité for Developers
  1. Sashité for Developers
  2. Specifications
  3. PCN
  4. 1.0.0
  5. Examples
  6. Draw Offers

Draw Offer Scenarios (PCN v1.0.0)

This page demonstrates draw offer scenarios using the draw_offered_by field in PCN documents.

Key principle: The status and draw_offered_by fields are completely independent. The draw_offered_by field records which player has made a draw offer, while status indicates the observable game state.


Field Semantics

draw_offered_by

status Interaction

When a draw is accepted:


1) Pending Draw Offer — First Player Proposes

First player offers a draw after their move. Game continues while offer is pending.

{
  "meta": {
    "event": "Club Match",
    "round": 3
  },
  "sides": {
    "first":  { "style": "CHESS", "name": "Alice", "elo": 2100 },
    "second": { "style": "chess", "name": "Bob",   "elo": 2050 }
  },
  "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", 9.0]
  ],
  "draw_offered_by": "first",
  "status": "in_progress"
}

Interpretation: Alice (first player) has proposed a draw after move 5. The game is still in progress, awaiting Bob’s response.


2) Pending Draw Offer — Second Player Proposes

Second player offers a draw. The position shows it’s now first player’s turn.

{
  "sides": {
    "first":  { "style": "CHESS", "name": "White" },
    "second": { "style": "chess", "name": "Black" }
  },
  "setup": "r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R / C/c",
  "moves": [
    ["d2-d4", 10.0],
    ["g8-f6", 8.0],
    ["c1-g5", 12.0]
  ],
  "draw_offered_by": "second",
  "status": "in_progress"
}

Interpretation: Black (second player) has proposed a draw after move 3. White must now decide whether to accept or continue playing.


3) Accepted Draw — With Proposer Recorded

Draw offer accepted. The draw_offered_by field preserves who initiated the proposal.

{
  "meta": {
    "event": "Tournament",
    "round": 5,
    "started_at": "2025-01-27T14:00:00Z"
  },
  "sides": {
    "first":  { "style": "CHESS", "name": "Player A", "elo": 2200 },
    "second": { "style": "chess", "name": "Player B", "elo": 2190 }
  },
  "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", 15.0],
    ["e7-e5", 18.0],
    ["g1-f3", 22.0],
    ["b8-c6", 12.0],
    ["d2-d4", 31.0],
    ["e5+d4", 25.0]
  ],
  "draw_offered_by": "first",
  "status": "agreement"
}

Interpretation: Player A offered a draw, and Player B accepted it. The draw_offered_by field records that the first player initiated the proposal, providing historical context for the draw agreement.


4) Accepted Draw — Without Proposer Recorded

Draw agreement without recording who proposed.

{
  "sides": {
    "first":  { "style": "CHESS" },
    "second": { "style": "chess" }
  },
  "setup": "r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R / C/c",
  "moves": [
    ["d2-d4", 5.0],
    ["g8-f6", 6.0],
    ["c1-f4", 8.0],
    ["e7-e6", 7.0]
  ],
  "status": "agreement"
}

Interpretation: The game ended in a draw by mutual agreement. Since draw_offered_by is not specified (defaults to null), there is no record of who initiated the proposal. This is perfectly valid — implementations may choose not to track draw offer origination.


5) Draw Without Prior Offer — Mutual Agreement

Players agree to a draw without an explicit offer being recorded in the notation.

{
  "meta": {
    "event": "Simultaneous Exhibition"
  },
  "sides": {
    "first":  { "style": "CHESS", "name": "Grandmaster" },
    "second": { "style": "chess", "name": "Amateur" }
  },
  "setup": "8/5k2/8/8/8/8/5K2/8 / C/c",
  "moves": [
    ["f2-e3", 2.0],
    ["f7-e7", 1.5],
    ["e3-f3", 1.8],
    ["e7-f7", 1.2]
  ],
  "status": "agreement"
}

Interpretation: In a dead drawn position (king vs king), players agreed to a draw. No explicit offer was recorded because the outcome was obvious to both parties.


6) Offer During Time Control — Fischer Timing

Draw offer in a game with Fischer time control.

{
  "sides": {
    "first": {
      "name": "Alice",
      "periods": [ { "time": 300, "inc": 3 } ]
    },
    "second": {
      "name": "Bob",
      "periods": [ { "time": 300, "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]
  ],
  "draw_offered_by": "second",
  "status": "in_progress"
}

Interpretation: Bob offered a draw with time controls active. The clock states remain derivable from the period configuration and move times, regardless of the draw offer status.


Implementation Notes

Field Independence

The two fields serve different purposes:

State Transitions

Common patterns:

  1. Offer made: draw_offered_by changes from null to "first" or "second", status remains "in_progress"
  2. Offer accepted: status changes to "agreement", draw_offered_by may remain set or be cleared (implementation choice)
  3. Offer declined/withdrawn: draw_offered_by returns to null, status remains "in_progress"

Optional Tracking

Implementations may choose:

All approaches are valid PCN.

Validation

When validating PCN documents:

  1. draw_offered_by must be null, "first", or "second"
  2. No constraint linking draw_offered_by to status
  3. status: "agreement" is valid regardless of draw_offered_by value
  4. draw_offered_by: "first" or "second" is valid with any status

For other game scenarios, see: