net.anisota.chronicle.walk

anisota.net

Documentation

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 manual wrap-up). rkey is a TID. Walks are the everyday unit and are never numbered; identity is the record key and display identity is the walk's time. Tracks the full lifecycle of a walk including camps, gathered findings, light consumption, and conditions.

main record

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 manual wrap-up). rkey is a TID. Walks are the everyday unit and are never numbered; identity is the record key and display identity is the walk's time. Tracks the full lifecycle of a walk including camps, gathered findings, light consumption, and conditions.

Record Key tid Timestamp-based ID

Properties

activeDuration integer Optional

Active exploring time in minutes (excludes camp/rest time)

minimum: 0
campsCount integer Optional

Number of camps made during the walk

minimum: 0
closedBy string Optional

How the walk closed. Known values: 'user' (manual 'that's enough for now' tap), 'auto' (idle auto-close after the inactivity window), and 'lamp' (light depleted). Free string with no enum so future close reasons need no lexicon change. Unset while the walk is active.

completedAt string datetime Optional

When the walk ended. For idle auto-closes this is the last tracked activity, clamped to be no earlier than startedAt.

createdAt string datetime Required

When the record was created

duration integer Optional

Total walk duration in minutes

minimum: 0
light ref #walkLight Optional

No description available.

restDuration integer Optional

Total camp/rest time in minutes

minimum: 0
startedAt string datetime Optional

When the walk started (first engagement)

status string Required

Current walk status. A walk is 'active' while open and 'completed' once it closes; there is no 'abandoned' state because a walk never fails.

Allowed: active, completed
updatedAt string datetime Optional

When the record was last updated

View raw schema
{
  "key": "tid",
  "type": "record",
  "record": {
    "type": "object",
    "required": [
      "status",
      "signature",
      "createdAt"
    ],
    "properties": {
      "light": {
        "ref": "#walkLight",
        "type": "ref"
      },
      "status": {
        "enum": [
          "active",
          "completed"
        ],
        "type": "string",
        "description": "Current walk status. A walk is 'active' while open and 'completed' once it closes; there is no 'abandoned' state because a walk never fails."
      },
      "closedBy": {
        "type": "string",
        "description": "How the walk closed. Known values: 'user' (manual 'that's enough for now' tap), 'auto' (idle auto-close after the inactivity window), and 'lamp' (light depleted). Free string with no enum so future close reasons need no lexicon change. Unset while the walk is active."
      },
      "duration": {
        "type": "integer",
        "minimum": 0,
        "description": "Total walk duration in minutes"
      },
      "findings": {
        "ref": "#walkFindings",
        "type": "ref"
      },
      "createdAt": {
        "type": "string",
        "format": "datetime",
        "description": "When the record was created"
      },
      "heartbeat": {
        "ref": "#walkHeartbeat",
        "type": "ref"
      },
      "signature": {
        "ref": "#chronicleSignature",
        "type": "ref"
      },
      "startedAt": {
        "type": "string",
        "format": "datetime",
        "description": "When the walk started (first engagement)"
      },
      "updatedAt": {
        "type": "string",
        "format": "datetime",
        "description": "When the record was last updated"
      },
      "campsCount": {
        "type": "integer",
        "minimum": 0,
        "description": "Number of camps made during the walk"
      },
      "conditions": {
        "ref": "#walkConditions",
        "type": "ref"
      },
      "completedAt": {
        "type": "string",
        "format": "datetime",
        "description": "When the walk ended. For idle auto-closes this is the last tracked activity, clamped to be no earlier than startedAt."
      },
      "restDuration": {
        "type": "integer",
        "minimum": 0,
        "description": "Total camp/rest time in minutes"
      },
      "activeDuration": {
        "type": "integer",
        "minimum": 0,
        "description": "Active exploring time in minutes (excludes camp/rest time)"
      },
      "elsewhereActivity": {
        "ref": "#walkElsewhereActivity",
        "type": "ref"
      }
    }
  },
  "description": "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 manual wrap-up). rkey is a TID. Walks are the everyday unit and are never numbered; identity is the record key and display identity is the walk's time. Tracks the full lifecycle of a walk including camps, gathered findings, light consumption, and conditions."
}
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
{
  "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"
}
deviceProgress object

Per-device progress bucket. Buckets are summed across devices (not max-merged) so in-app activity spread over multiple devices is fully counted.

Properties

deviceId string Optional

Random per-install device id from userScopedStorage. No fingerprinting.

View raw schema
{
  "type": "object",
  "properties": {
    "counts": {
      "ref": "#heartbeatProgress",
      "type": "ref"
    },
    "deviceId": {
      "type": "string",
      "description": "Random per-install device id from userScopedStorage. No fingerprinting."
    }
  },
  "description": "Per-device progress bucket. Buckets are summed across devices (not max-merged) so in-app activity spread over multiple devices is fully counted."
}
heartbeatLight object

Light state at heartbeat time

Properties

current integer Optional

Current light level

drainActive boolean Optional

Whether drain is actively ticking (true while exploring, false while resting or camping). Walks have no frozen state.

drainRate integer Optional

Current drain rate as percentage

View raw schema
{
  "type": "object",
  "properties": {
    "current": {
      "type": "integer",
      "description": "Current light level"
    },
    "drainRate": {
      "type": "integer",
      "description": "Current drain rate as percentage"
    },
    "drainActive": {
      "type": "boolean",
      "description": "Whether drain is actively ticking (true while exploring, false while resting or camping). Walks have no frozen state."
    }
  },
  "description": "Light state at heartbeat time"
}
heartbeatProgress object

Session progress counters at heartbeat time (per-device bucket contents)

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
{
  "type": "object",
  "properties": {
    "xpGained": {
      "type": "integer",
      "minimum": 0
    },
    "likesSent": {
      "type": "integer",
      "minimum": 0
    },
    "postsRead": {
      "type": "integer",
      "minimum": 0
    },
    "itemsCount": {
      "type": "integer",
      "minimum": 0
    },
    "repostsSent": {
      "type": "integer",
      "minimum": 0
    },
    "postsCreated": {
      "type": "integer",
      "minimum": 0
    },
    "mothsSeenCount": {
      "type": "integer",
      "minimum": 0
    },
    "specimensCount": {
      "type": "integer",
      "minimum": 0
    }
  },
  "description": "Session progress counters at heartbeat time (per-device bucket contents)"
}
walkConditions object

Environmental conditions during the walk

Properties

biome string Optional

Forest biome type

lightLevel string Optional

Time-of-day light condition at walk start

moonPhase string Optional

Moon phase condition (nighttime only)

userState string Optional

User fatigue state at walk start

weather string Optional

Weather condition during the walk

View raw schema
{
  "type": "object",
  "properties": {
    "biome": {
      "type": "string",
      "description": "Forest biome type"
    },
    "weather": {
      "enum": [
        "clear",
        "overcast",
        "rainy",
        "stormy",
        "foggy"
      ],
      "type": "string",
      "description": "Weather condition during the walk"
    },
    "moonPhase": {
      "enum": [
        "full_moon",
        "new_moon"
      ],
      "type": "string",
      "description": "Moon phase condition (nighttime only)"
    },
    "userState": {
      "enum": [
        "well_rested",
        "tired",
        "exhausted",
        "first_expedition"
      ],
      "type": "string",
      "description": "User fatigue state at walk start"
    },
    "lightLevel": {
      "enum": [
        "dawn",
        "morning",
        "midday",
        "afternoon",
        "dusk",
        "night",
        "deepnight"
      ],
      "type": "string",
      "description": "Time-of-day light condition at walk start"
    }
  },
  "description": "Environmental conditions during the walk"
}
walkElsewhereActivity object

Cross-client activity during the walk window that did NOT happen in anisota: the PDS scan of app.bsky posts/likes/reposts in the walk window minus the in-app per-device summed totals, floored at 0 per field. Because likes and reposts carry no client marker this is a subtraction estimate, so the elsewhere panel labels it 'at least'. This block NEVER earns XP or findings; it is data for the panel only. Optional; unset when there was no elsewhere activity or the scan was unavailable.

Properties

likesSent integer Optional

Likes sent elsewhere during the walk window (scan minus in-app; at-least estimate)

minimum: 0
postsCreated integer Optional

Posts created elsewhere during the walk window (scan minus in-app)

minimum: 0
repostsSent integer Optional

Reposts sent elsewhere during the walk window (scan minus in-app; at-least estimate)

minimum: 0
View raw schema
{
  "type": "object",
  "properties": {
    "likesSent": {
      "type": "integer",
      "minimum": 0,
      "description": "Likes sent elsewhere during the walk window (scan minus in-app; at-least estimate)"
    },
    "repostsSent": {
      "type": "integer",
      "minimum": 0,
      "description": "Reposts sent elsewhere during the walk window (scan minus in-app; at-least estimate)"
    },
    "postsCreated": {
      "type": "integer",
      "minimum": 0,
      "description": "Posts created elsewhere during the walk window (scan minus in-app)"
    }
  },
  "description": "Cross-client activity during the walk window that did NOT happen in anisota: the PDS scan of app.bsky posts/likes/reposts in the walk window minus the in-app per-device summed totals, floored at 0 per field. Because likes and reposts carry no client marker this is a subtraction estimate, so the elsewhere panel labels it 'at least'. This block NEVER earns XP or findings; it is data for the panel only. Optional; unset when there was no elsewhere activity or the scan was unavailable."
}
walkFindings object

What was found/gathered during the walk

Properties

itemsCollected integer Optional

Number of items collected

minimum: 0
likesSent integer Optional

Likes sent during the walk

minimum: 0
mothsSeen integer Optional

Total moth encounters (caught + escaped)

minimum: 0
postsCreated integer Optional

Posts created during the walk

minimum: 0
postsRead integer Optional

Posts read during the walk

minimum: 0
repostsSent integer Optional

Reposts sent during the walk

minimum: 0
specimensFound integer Optional

Number of specimens successfully caught

minimum: 0
xpGained integer Optional

XP gained from the walk

minimum: 0
View raw schema
{
  "type": "object",
  "properties": {
    "xpGained": {
      "type": "integer",
      "minimum": 0,
      "description": "XP gained from the walk"
    },
    "likesSent": {
      "type": "integer",
      "minimum": 0,
      "description": "Likes sent during the walk"
    },
    "mothsSeen": {
      "type": "integer",
      "minimum": 0,
      "description": "Total moth encounters (caught + escaped)"
    },
    "postsRead": {
      "type": "integer",
      "minimum": 0,
      "description": "Posts read during the walk"
    },
    "repostsSent": {
      "type": "integer",
      "minimum": 0,
      "description": "Reposts sent during the walk"
    },
    "postsCreated": {
      "type": "integer",
      "minimum": 0,
      "description": "Posts created during the walk"
    },
    "itemsCollected": {
      "type": "integer",
      "minimum": 0,
      "description": "Number of items collected"
    },
    "specimensFound": {
      "type": "integer",
      "minimum": 0,
      "description": "Number of specimens successfully caught"
    }
  },
  "description": "What was found/gathered during the walk"
}
walkHeartbeat object

Periodic snapshot of walk progress for cross-device sync

Properties

lastActivityAt string datetime Optional

Timestamp of the last tracked activity. Drives the idle clock and is max-merged across devices (heartbeats themselves fire on a timer, so idle detection must key on this field, not updatedAt).

progress array of ref#deviceProgress Optional

Per-device progress buckets, one entry per device that has contributed to this walk. In-app totals are the SUM across buckets, not a max-merge: per-device buckets exist deliberately so multi-device in-app activity is never undercounted (an undercount would falsely inflate the elsewhere figure).

updatedAt string datetime Optional

When this heartbeat was written

View raw schema
{
  "type": "object",
  "properties": {
    "light": {
      "ref": "#heartbeatLight",
      "type": "ref"
    },
    "progress": {
      "type": "array",
      "items": {
        "ref": "#deviceProgress",
        "type": "ref"
      },
      "description": "Per-device progress buckets, one entry per device that has contributed to this walk. In-app totals are the SUM across buckets, not a max-merge: per-device buckets exist deliberately so multi-device in-app activity is never undercounted (an undercount would falsely inflate the elsewhere figure)."
    },
    "updatedAt": {
      "type": "string",
      "format": "datetime",
      "description": "When this heartbeat was written"
    },
    "lastActivityAt": {
      "type": "string",
      "format": "datetime",
      "description": "Timestamp of the last tracked activity. Drives the idle clock and is max-merged across devices (heartbeats themselves fire on a timer, so idle detection must key on this field, not updatedAt)."
    }
  },
  "description": "Periodic snapshot of walk progress for cross-device sync"
}
walkLight object

Light resource tracking for the walk

Properties

atEnd integer Optional

Light level when the walk ended (in minutes)

minimum: 0
atStart integer Optional

Light level when the walk started (in minutes)

minimum: 0
consumed integer Optional

Total light consumed during the walk

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

Total light regenerated during the walk's camps

minimum: 0
status string Optional

Light status at start of the walk

View raw schema
{
  "type": "object",
  "properties": {
    "atEnd": {
      "type": "integer",
      "minimum": 0,
      "description": "Light level when the walk ended (in minutes)"
    },
    "status": {
      "enum": [
        "bright",
        "steady",
        "dim",
        "flickering",
        "dying",
        "fullCharge",
        "charged",
        "low",
        "critical",
        "dead"
      ],
      "type": "string",
      "description": "Light status at start of the walk"
    },
    "atStart": {
      "type": "integer",
      "minimum": 0,
      "description": "Light level when the walk started (in minutes)"
    },
    "consumed": {
      "type": "integer",
      "minimum": 0,
      "description": "Total light consumed during the walk"
    },
    "drainRate": {
      "type": "integer",
      "description": "Effective drain rate as a percentage (80 = 0.8x drain). Multiply by 0.01 to get the float multiplier."
    },
    "regenerated": {
      "type": "integer",
      "minimum": 0,
      "description": "Total light regenerated during the walk's camps"
    }
  },
  "description": "Light resource tracking for the walk"
}

Lexicon Garden

@