net.anisota.chronicle.progress

anisota.net

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "chronicleSignature": {
      "description": "ES256 cryptographic signature proving record authenticity",
      "properties": {
        "alg": {
          "description": "Signing algorithm (ES256)",
          "type": "string"
        },
        "kid": {
          "description": "Key identifier for the signing key",
          "type": "string"
        },
        "nonce": {
          "description": "Unique random nonce to prevent replay",
          "type": "string"
        },
        "sig": {
          "description": "Base64-encoded ES256 signature",
          "type": "string"
        },
        "signedAt": {
          "description": "When the record was signed",
          "format": "datetime",
          "type": "string"
        },
        "version": {
          "description": "Signature schema version",
          "type": "integer"
        }
      },
      "required": [
        "sig",
        "alg",
        "kid",
        "signedAt",
        "nonce",
        "version"
      ],
      "type": "object"
    },
    "main": {
      "description": "Signed player progression state. Singleton (rkey: self), overwritten via putRecord. Backend validates XP claims before signing.",
      "key": "any",
      "record": {
        "properties": {
          "createdAt": {
            "description": "When the record was first created",
            "format": "datetime",
            "type": "string"
          },
          "level": {
            "description": "Current player level (derived from XP table)",
            "maximum": 99,
            "minimum": 1,
            "type": "integer"
          },
          "progressPercentage": {
            "description": "Progress toward next level as decimal string",
            "type": "string"
          },
          "signature": {
            "ref": "#chronicleSignature",
            "type": "ref"
          },
          "totalXP": {
            "description": "Total accumulated XP",
            "minimum": 0,
            "type": "integer"
          },
          "triggerSource": {
            "description": "What triggered this save (level_up, session_end, visibility_hidden, periodic, card_advance)",
            "type": "string"
          },
          "updatedAt": {
            "description": "When the record was last updated",
            "format": "datetime",
            "type": "string"
          },
          "xpGainedSinceLastSign": {
            "description": "XP gained since the last signed progress record (for rate validation against daily activity)",
            "minimum": 0,
            "type": "integer"
          },
          "xpToNextLevel": {
            "description": "XP remaining to reach next level",
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "totalXP",
          "level",
          "signature",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    }
  },
  "id": "net.anisota.chronicle.progress",
  "lexicon": 1
}

Validate Record

Validate a record against net.anisota.chronicle.progress

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:lcieujcfkv4jx7gehsvok3pr
CID
bafyreihin5rj3qhr3pufonbqawidskxbt375njtwkoikbuiff2z7tnglna
Indexed At
2026-06-22 18:49 UTC
AT-URI
at://did:plc:lcieujcfkv4jx7gehsvok3pr/com.atproto.lexicon.schema/net.anisota.chronicle.progress

Similar Lexicons

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

  • net.anisota.chronicle.level recordnot from the namespace authority

    Immutable level milestone record. Created once on level-up with createRecord. rkey is zero-padded level (001-099).

  • net.anisota.chronicle.milestone recordnot from the namespace authority

    A milestone reached in the field, shown on the Fieldwork page's Milestones tab. Successor to net.anisota.chronicle.achievement (legacy records in that collection remain readable but no new ones are written). rkey is the…

  • net.anisota.chronicle.achievement recordnot from the namespace authority

    DEPRECATED - superseded by net.anisota.chronicle.milestone. No new records are written to this collection; the schema is kept because earlier records still exist on users' PDSes and remain readable. rkey is the achievem…

  • net.anisota.chronicle.fieldwork recordnot from the namespace authority

    Signed quest completion record. rkey is the quest ID (e.g. 'first-post', 'make-camp'). Created once with createRecord when the quest is completed. Immutable.

  • A player's game progress, as adjudicated by turtle meat and published by the player. The record lives in the player's own repository and can be deleted by them at any time, which removes them from the public leaderboard…

Lexicon Garden

@