net.anisota.chronicle.expedition

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"
    },
    "expeditionConditions": {
      "description": "Environmental conditions during expedition",
      "properties": {
        "biome": {
          "description": "Forest biome type",
          "type": "string"
        },
        "lightLevel": {
          "description": "Time-of-day light condition at expedition start",
          "enum": [
            "dawn",
            "morning",
            "midday",
            "afternoon",
            "dusk",
            "night",
            "deepnight"
          ],
          "type": "string"
        },
        "moonPhase": {
          "description": "Moon phase condition (nighttime only)",
          "enum": [
            "full_moon",
            "new_moon"
          ],
          "type": "string"
        },
        "userState": {
          "description": "User fatigue state at expedition start",
          "enum": [
            "well_rested",
            "tired",
            "exhausted",
            "first_expedition"
          ],
          "type": "string"
        },
        "weather": {
          "description": "Weather condition during expedition",
          "enum": [
            "clear",
            "overcast",
            "rainy",
            "stormy",
            "foggy"
          ],
          "type": "string"
        }
      },
      "type": "object"
    },
    "expeditionFindings": {
      "description": "What was found/gathered during the expedition",
      "properties": {
        "itemsCollected": {
          "description": "Number of items collected",
          "minimum": 0,
          "type": "integer"
        },
        "likesSent": {
          "description": "Likes sent during the expedition",
          "minimum": 0,
          "type": "integer"
        },
        "mothsSeen": {
          "description": "Total moth encounters (caught + escaped)",
          "minimum": 0,
          "type": "integer"
        },
        "postsCreated": {
          "description": "Posts created during the expedition",
          "minimum": 0,
          "type": "integer"
        },
        "postsRead": {
          "description": "Posts read during the expedition",
          "minimum": 0,
          "type": "integer"
        },
        "specimensFound": {
          "description": "Number of specimens successfully caught",
          "minimum": 0,
          "type": "integer"
        },
        "xpGained": {
          "description": "XP gained from the expedition",
          "minimum": 0,
          "type": "integer"
        }
      },
      "type": "object"
    },
    "expeditionHeartbeat": {
      "description": "Periodic snapshot of expedition progress for cross-device sync",
      "properties": {
        "light": {
          "ref": "#heartbeatLight",
          "type": "ref"
        },
        "progress": {
          "ref": "#heartbeatProgress",
          "type": "ref"
        },
        "updatedAt": {
          "description": "When this heartbeat was written",
          "format": "datetime",
          "type": "string"
        }
      },
      "type": "object"
    },
    "expeditionLight": {
      "description": "Light resource tracking for the expedition",
      "properties": {
        "atEnd": {
          "description": "Light level when expedition ended (in minutes)",
          "minimum": 0,
          "type": "integer"
        },
        "atStart": {
          "description": "Light level when expedition started (in minutes)",
          "minimum": 0,
          "type": "integer"
        },
        "consumed": {
          "description": "Total light consumed during expedition",
          "minimum": 0,
          "type": "integer"
        },
        "drainRate": {
          "description": "Effective drain rate as a percentage (80 = 0.8x drain). Multiply by 0.01 to get the float multiplier.",
          "type": "integer"
        },
        "regenerated": {
          "description": "Light regenerated during camps",
          "minimum": 0,
          "type": "integer"
        },
        "status": {
          "description": "Light status at start of expedition",
          "enum": [
            "bright",
            "steady",
            "dim",
            "flickering",
            "dying",
            "fullCharge",
            "charged",
            "low",
            "critical",
            "dead"
          ],
          "type": "string"
        }
      },
      "type": "object"
    },
    "heartbeatLight": {
      "description": "Light state at heartbeat time",
      "properties": {
        "current": {
          "description": "Current light level",
          "type": "integer"
        },
        "drainActive": {
          "description": "Whether drain is actively ticking",
          "type": "boolean"
        },
        "drainRate": {
          "description": "Current drain rate as percentage",
          "type": "integer"
        },
        "frozen": {
          "description": "Whether light is frozen (at hub/trailhead)",
          "type": "boolean"
        }
      },
      "type": "object"
    },
    "heartbeatProgress": {
      "description": "Session progress counters at heartbeat time",
      "properties": {
        "itemsCount": {
          "minimum": 0,
          "type": "integer"
        },
        "likesSent": {
          "minimum": 0,
          "type": "integer"
        },
        "mothsSeenCount": {
          "minimum": 0,
          "type": "integer"
        },
        "postsCreated": {
          "minimum": 0,
          "type": "integer"
        },
        "postsRead": {
          "minimum": 0,
          "type": "integer"
        },
        "repostsSent": {
          "minimum": 0,
          "type": "integer"
        },
        "specimensCount": {
          "minimum": 0,
          "type": "integer"
        },
        "xpGained": {
          "minimum": 0,
          "type": "integer"
        }
      },
      "type": "object"
    },
    "main": {
      "description": "Expedition record. Created with status 'active' when entering the forest, updated to 'completed'/'abandoned' on extraction/abandon. rkey is a TID. Tracks the full lifecycle of a forest expedition including camps, gathered loot, light consumption, and conditions.",
      "key": "tid",
      "record": {
        "properties": {
          "abandonReason": {
            "description": "Reason for abandonment (only set if status is 'abandoned')",
            "enum": [
              "light_depleted",
              "user_abandoned",
              "app_crash",
              "force_close",
              "auto_abandoned_stale"
            ],
            "type": "string"
          },
          "activeDuration": {
            "description": "Active exploring time in milliseconds (excludes camp rest time)",
            "minimum": 0,
            "type": "integer"
          },
          "campsCount": {
            "description": "Number of camps made during the expedition",
            "minimum": 0,
            "type": "integer"
          },
          "completedAt": {
            "description": "When the expedition ended (extracted or abandoned)",
            "format": "datetime",
            "type": "string"
          },
          "conditions": {
            "ref": "#expeditionConditions",
            "type": "ref"
          },
          "createdAt": {
            "description": "When the record was created",
            "format": "datetime",
            "type": "string"
          },
          "duration": {
            "description": "Total expedition duration in milliseconds",
            "minimum": 0,
            "type": "integer"
          },
          "expeditionNumber": {
            "description": "Sequential expedition number for this user (Expedition 1, 2, 3...)",
            "minimum": 1,
            "type": "integer"
          },
          "findings": {
            "ref": "#expeditionFindings",
            "type": "ref"
          },
          "heartbeat": {
            "ref": "#expeditionHeartbeat",
            "type": "ref"
          },
          "light": {
            "ref": "#expeditionLight",
            "type": "ref"
          },
          "restDuration": {
            "description": "Total camp/rest time in milliseconds",
            "minimum": 0,
            "type": "integer"
          },
          "signature": {
            "ref": "#chronicleSignature",
            "type": "ref"
          },
          "startedAt": {
            "description": "When the expedition started (entered forest)",
            "format": "datetime",
            "type": "string"
          },
          "status": {
            "description": "Current expedition status",
            "enum": [
              "active",
              "completed",
              "abandoned"
            ],
            "type": "string"
          },
          "updatedAt": {
            "description": "When the record was last updated",
            "format": "datetime",
            "type": "string"
          }
        },
        "required": [
          "status",
          "signature",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    }
  },
  "id": "net.anisota.chronicle.expedition",
  "lexicon": 1
}

Validate Record

Validate a record against net.anisota.chronicle.expedition

Validation Options
Treat any remaining unresolved references as valid

Metadata

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

Similar Lexicons

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

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

    Walk record. Created with status 'active' at first engagement (first tracked action on the feed), kept current with putRecord, and updated to 'completed' when the walk closes (idle auto-close, light depletion, or a manu…

  • net.anisota.chronicle.expedition.camp recordnot from the namespace authority

    Camp record. Created when a user makes camp during an expedition. Updated when camp is broken. References the parent expedition record via AT URI.

  • net.anisota.chronicle.walk.camp recordnot from the namespace authority

    Camp record. Created when a user makes camp during a walk. Updated when camp is broken. References the parent walk record via AT URI.

  • net.anisota.chronicle.log.daily recordnot from the namespace authority

    Daily activity snapshot. Updated throughout the day via putRecord. rkey is YYYY-MM-DD in user's local timezone.

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

    Granular chronicle event log. Each record is a single timestamped event. TID rkey for chronological ordering. Used to capture moments that don't have their own record type (moth sightings, random encounters, item discov…

Lexicon Garden

@