net.anisota.chronicle.milestone

anisota.net

Documentation

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 milestone ID (e.g. level-50, expedition-first-light). Created once with createRecord when the milestone is reached. Immutable.

main record

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 milestone ID (e.g. level-50, expedition-first-light). Created once with createRecord when the milestone is reached. Immutable.

Record Key any Any valid record key

Properties

category string Required

Category of the milestone

Allowed: level, social, collection, patterns, special, expedition
createdAt string datetime Required

When the milestone record was created

dailyRecordRef string Optional

AT URI of the daily record when the milestone was reached

description string Optional

Description of what was reached

maxLength: 500 bytes
milestoneId string Required

Unique identifier for the milestone (e.g. 'level-50', 'expedition-first-light')

maxLength: 100 bytes
name string Optional

Display name of the milestone

maxLength: 100 bytes
rarity string Optional

Rarity tier of the milestone

Allowed: common, uncommon, rare, epic, legendary
tier integer Optional

Tier or threshold value (e.g. 50 for level-50)

minimum: 0
unlockedAt string datetime Required

When the milestone was reached

xpReward integer Optional

XP awarded for this milestone

minimum: 0
View raw schema
{
  "key": "any",
  "type": "record",
  "record": {
    "type": "object",
    "required": [
      "milestoneId",
      "category",
      "unlockedAt",
      "signature",
      "createdAt"
    ],
    "properties": {
      "name": {
        "type": "string",
        "maxLength": 100,
        "description": "Display name of the milestone"
      },
      "tier": {
        "type": "integer",
        "minimum": 0,
        "description": "Tier or threshold value (e.g. 50 for level-50)"
      },
      "rarity": {
        "enum": [
          "common",
          "uncommon",
          "rare",
          "epic",
          "legendary"
        ],
        "type": "string",
        "description": "Rarity tier of the milestone"
      },
      "context": {
        "ref": "#milestoneContext",
        "type": "ref"
      },
      "category": {
        "enum": [
          "level",
          "social",
          "collection",
          "patterns",
          "special",
          "expedition"
        ],
        "type": "string",
        "description": "Category of the milestone"
      },
      "xpReward": {
        "type": "integer",
        "minimum": 0,
        "description": "XP awarded for this milestone"
      },
      "createdAt": {
        "type": "string",
        "format": "datetime",
        "description": "When the milestone record was created"
      },
      "signature": {
        "ref": "#chronicleSignature",
        "type": "ref"
      },
      "unlockedAt": {
        "type": "string",
        "format": "datetime",
        "description": "When the milestone was reached"
      },
      "description": {
        "type": "string",
        "maxLength": 500,
        "description": "Description of what was reached"
      },
      "milestoneId": {
        "type": "string",
        "maxLength": 100,
        "description": "Unique identifier for the milestone (e.g. 'level-50', 'expedition-first-light')"
      },
      "dailyRecordRef": {
        "type": "string",
        "description": "AT URI of the daily record when the milestone was reached"
      }
    }
  },
  "description": "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 milestone ID (e.g. level-50, expedition-first-light). Created once with createRecord when the milestone is reached. Immutable."
}
chronicleSignature object

ES256 cryptographic signature proving record authenticity. The signature itself proves legitimacy - no separate verification lexicons needed.

Properties

alg string Required

Signing algorithm (ES256)

kid string Required

Key identifier for the signing key

nonce string Required

Unique random nonce to prevent replay

sig string Required

Base64-encoded ES256 signature

signedAt string datetime Required

When the record was signed

version integer Required

Signature schema version

View raw schema
{
  "type": "object",
  "required": [
    "sig",
    "alg",
    "kid",
    "signedAt",
    "nonce",
    "version"
  ],
  "properties": {
    "alg": {
      "type": "string",
      "description": "Signing algorithm (ES256)"
    },
    "kid": {
      "type": "string",
      "description": "Key identifier for the signing key"
    },
    "sig": {
      "type": "string",
      "description": "Base64-encoded ES256 signature"
    },
    "nonce": {
      "type": "string",
      "description": "Unique random nonce to prevent replay"
    },
    "version": {
      "type": "integer",
      "description": "Signature schema version"
    },
    "signedAt": {
      "type": "string",
      "format": "datetime",
      "description": "When the record was signed"
    }
  },
  "description": "ES256 cryptographic signature proving record authenticity. The signature itself proves legitimacy - no separate verification lexicons needed."
}
milestoneContext object

Contextual data at the time the milestone was reached

Properties

level integer Optional

Player level when the milestone was reached

minimum: 1
postCount integer Optional

Post count when the milestone was reached

minimum: 0
specimenCount integer Optional

Specimen count when the milestone was reached

minimum: 0
totalXP integer Optional

Total XP when the milestone was reached

minimum: 0
View raw schema
{
  "type": "object",
  "properties": {
    "level": {
      "type": "integer",
      "minimum": 1,
      "description": "Player level when the milestone was reached"
    },
    "totalXP": {
      "type": "integer",
      "minimum": 0,
      "description": "Total XP when the milestone was reached"
    },
    "postCount": {
      "type": "integer",
      "minimum": 0,
      "description": "Post count when the milestone was reached"
    },
    "specimenCount": {
      "type": "integer",
      "minimum": 0,
      "description": "Specimen count when the milestone was reached"
    }
  },
  "description": "Contextual data at the time the milestone was reached"
}

Lexicon Garden

@