org.lichess.puzzle.attempt

pds.dad

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "main": {
      "description": "A record of a user's attempt at solving an org.lichess.puzzle. Ranked attempts carry a detached signature (sig) from the service proving the submitted moves were judged server-side. Rating is not part of the record: it is each scoring service's (appview's) own business.",
      "key": "tid",
      "record": {
        "properties": {
          "createdAt": {
            "description": "client-declared timestamp when this attempt record was created.",
            "format": "datetime",
            "type": "string"
          },
          "fen": {
            "description": "The FEN of the puzzle's starting position (position before the opponent's setup move). Advisory context denormalized from the puzzle; derivable from puzzleId and not covered by sig.",
            "maxLength": 128,
            "type": "string"
          },
          "mode": {
            "default": "casual",
            "description": "Whether this attempt was played for rating and should be counted towards the user's rating.",
            "knownValues": [
              "casual",
              "ranked"
            ],
            "type": "string"
          },
          "nonce": {
            "description": "Idempotency key echoed back by submitAttempt (the challenge's jti). Uniquely identifies the issued challenge, so duplicate records for one attempt can be detected. Covered by sig.",
            "maxLength": 64,
            "type": "string"
          },
          "playerMoves": {
            "description": "the moves played by the solver during the attempt, in the same notation as the puzzle's solution moves. For ranked attempts this must be the line submitted to submitAttempt verbatim: it is covered by sig.",
            "type": "string"
          },
          "puzzleId": {
            "description": "Lichess puzzle ID.",
            "maxLength": 32,
            "type": "string"
          },
          "service": {
            "description": "DID of the puzzle/scoring service that issued this puzzle and owns the rating it affects. This is traditionally a did:web of the web server, not a user's identity. Needed to be able to find the puzzle",
            "format": "did",
            "type": "string"
          },
          "sig": {
            "description": "base64url (unpadded) detached signature by the service proving it judged playerMoves against the puzzle's solution with the given solved result. Signs the canonical DAG-CBOR encoding of an org.lichess.puzzle.defs#resultAttestation rebuilt from this record's fields — see that def for the exact verification recipe. Present only when the attempt was rated (ranked and not flagged).",
            "maxLength": 128,
            "type": "string"
          },
          "solved": {
            "description": "Whether the puzzle was solved. Advisory (client-claimed) unless sig is present, in which case it is the server-judged result and covered by the signature.",
            "type": "boolean"
          }
        },
        "required": [
          "puzzleId",
          "service",
          "solved",
          "playerMoves",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    }
  },
  "id": "org.lichess.puzzle.attempt",
  "lexicon": 1
}

Validate Record

Validate a record against org.lichess.puzzle.attempt

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:rnpkyqnmsw4ipey6eotbdnnf
CID
bafyreiauarwqckkpfvmnml4b6m7ouf4bcnmbvqhdowuqrbvcfjkt6l2hwa
Indexed At
2026-07-26 20:13 UTC
AT-URI
at://did:plc:rnpkyqnmsw4ipey6eotbdnnf/com.atproto.lexicon.schema/org.lichess.puzzle.attempt

Similar Lexicons

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • org.lichess.puzzle.defs not from the namespace authority

    The shared representation of a chess puzzle returned by the puzzle queries.

  • org.lichess.puzzle.submitAttempt procedurenot from the namespace authority

    Submits the outcome of a ranked puzzle previously issued by getNextRanked. The challenge token issued with the puzzle must be passed back verbatim, along with the full solution line the player played. The server validat…

  • org.lichess.puzzle.getNextRanked querynot from the namespace authority

    Fetches the next ranked puzzle for the authenticated player. Each puzzle needs to be solved or failed before requesting another; if the player already holds an unresolved ranked puzzle, that same puzzle (with a freshly …

Lexicon Garden

@