- Sashité for Developers
- Specifications
- PCN
- 1.0.0
- Examples
- 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
statusanddraw_offered_byfields are completely independent. Thedraw_offered_byfield records which player has made a draw offer, whilestatusindicates the observable game state.
Field Semantics
draw_offered_by
null(default): No draw offer is currently pending"first": The first player has offered a draw to the second player"second": The second player has offered a draw to the first player
status Interaction
When a draw is accepted:
statustransitions from"in_progress"to"agreement"draw_offered_bymay remain set, indicating who initiated the draw proposaldraw_offered_byis optional even whenstatusis"agreement"
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:
draw_offered_by: Records communication between players (proposal state)status: Records observable game state (terminal condition)
State Transitions
Common patterns:
- Offer made:
draw_offered_bychanges fromnullto"first"or"second",statusremains"in_progress" - Offer accepted:
statuschanges to"agreement",draw_offered_bymay remain set or be cleared (implementation choice) - Offer declined/withdrawn:
draw_offered_byreturns tonull,statusremains"in_progress"
Optional Tracking
Implementations may choose:
- Full tracking: Always record who proposed draws when
statusis"agreement" - Minimal tracking: Only set
statusto"agreement", leavedraw_offered_byasnull - Current state only: Clear
draw_offered_bywhen a draw is accepted or declined
All approaches are valid PCN.
Validation
When validating PCN documents:
draw_offered_bymust benull,"first", or"second"- No constraint linking
draw_offered_bytostatus status: "agreement"is valid regardless ofdraw_offered_byvaluedraw_offered_by: "first"or"second"is valid with any status
Related Examples
For other game scenarios, see:
- Complete Game Records — End-to-end game documentation
- Game Status — All CGSN status outcomes
- Traditional Games — Standard chess and variant games
