net.anisota.chronicle.expedition

anisota.net

Documentation

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.

main record

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.

Record Key tid Timestamp-based ID

Properties

abandonReason string Optional

Reason for abandonment (only set if status is 'abandoned')

Allowed: light_depleted, user_abandoned, app_crash, force_close, auto_abandoned_stale
activeDuration integer Optional

Active exploring time in milliseconds (excludes camp rest time)

minimum: 0
campsCount integer Optional

Number of camps made during the expedition

minimum: 0
completedAt string datetime Optional

When the expedition ended (extracted or abandoned)

createdAt string datetime Required

When the record was created

duration integer Optional

Total expedition duration in milliseconds

minimum: 0
expeditionNumber integer Optional

Sequential expedition number for this user (Expedition 1, 2, 3...)

minimum: 1
restDuration integer Optional

Total camp/rest time in milliseconds

minimum: 0
startedAt string datetime Optional

When the expedition started (entered forest)

status string Required

Current expedition status

Allowed: active, completed, abandoned
updatedAt string datetime Optional

When the record was last updated

View raw schema
{
  "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"
}
chronicleSignature object

ES256 cryptographic signature proving record authenticity

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
{
  "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 object

Environmental conditions during expedition

Properties

biome string Optional

Forest biome type

lightLevel string Optional

Time-of-day light condition at expedition start

moonPhase string Optional

Moon phase condition (nighttime only)

userState string Optional

User fatigue state at expedition start

weather string Optional

Weather condition during expedition

View raw schema
{
  "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 object

What was found/gathered during the expedition

Properties

itemsCollected integer Optional

Number of items collected

minimum: 0
likesSent integer Optional

Likes sent during the expedition

minimum: 0
mothsSeen integer Optional

Total moth encounters (caught + escaped)

minimum: 0
postsCreated integer Optional

Posts created during the expedition

minimum: 0
postsRead integer Optional

Posts read during the expedition

minimum: 0
specimensFound integer Optional

Number of specimens successfully caught

minimum: 0
xpGained integer Optional

XP gained from the expedition

minimum: 0
View raw schema
{
  "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 object

Periodic snapshot of expedition progress for cross-device sync

Properties

updatedAt string datetime Optional

When this heartbeat was written

View raw schema
{
  "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 object

Light resource tracking for the expedition

Properties

atEnd integer Optional

Light level when expedition ended (in minutes)

minimum: 0
atStart integer Optional

Light level when expedition started (in minutes)

minimum: 0
consumed integer Optional

Total light consumed during expedition

minimum: 0
drainRate integer Optional

Effective drain rate as a percentage (80 = 0.8x drain). Multiply by 0.01 to get the float multiplier.

regenerated integer Optional

Light regenerated during camps

minimum: 0
status string Optional

Light status at start of expedition

View raw schema
{
  "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 object

Light state at heartbeat time

Properties

current integer Optional

Current light level

drainActive boolean Optional

Whether drain is actively ticking

drainRate integer Optional

Current drain rate as percentage

frozen boolean Optional

Whether light is frozen (at hub/trailhead)

View raw schema
{
  "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 object

Session progress counters at heartbeat time

Properties

itemsCount integer Optional

No description available.

minimum: 0
likesSent integer Optional

No description available.

minimum: 0
mothsSeenCount integer Optional

No description available.

minimum: 0
postsCreated integer Optional

No description available.

minimum: 0
postsRead integer Optional

No description available.

minimum: 0
repostsSent integer Optional

No description available.

minimum: 0
specimensCount integer Optional

No description available.

minimum: 0
xpGained integer Optional

No description available.

minimum: 0
View raw schema
{
  "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"
}

Lexicon Garden

@