{
"id": "net.anisota.chronicle.log.daily",
"defs": {
"main": {
"key": "any",
"type": "record",
"record": {
"type": "object",
"required": [
"date",
"player",
"activity",
"signature",
"createdAt"
],
"properties": {
"date": {
"type": "string",
"description": "Date string in YYYY-MM-DD format (user's local timezone)"
},
"player": {
"ref": "#playerSnapshot",
"type": "ref"
},
"activity": {
"ref": "#activityCounts",
"type": "ref"
},
"patterns": {
"ref": "#patternsData",
"type": "ref"
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "When the daily record was first created"
},
"signature": {
"ref": "#chronicleSignature",
"type": "ref"
},
"updatedAt": {
"type": "string",
"format": "datetime",
"description": "When the daily record was last updated"
},
"engagement": {
"ref": "#engagementCounts",
"type": "ref"
},
"expeditions": {
"ref": "#expeditionSummary",
"type": "ref"
},
"upperLogRefs": {
"type": "array",
"items": {
"type": "string"
},
"description": "AT URIs of containing logs (weekly, monthly, yearly) this day belongs to"
},
"expeditionRefs": {
"type": "array",
"items": {
"type": "string"
},
"description": "AT URIs of expedition records that occurred on this day"
}
}
},
"description": "Daily activity snapshot. Updated throughout the day via putRecord. rkey is YYYY-MM-DD in user's local timezone."
},
"patternsData": {
"type": "object",
"properties": {
"activeBlocks": {
"type": "array",
"items": {
"type": "string"
},
"maxLength": 48,
"description": "Half-hour slots with activity, as HH:MM strings (e.g. '09:00', '09:30'). Max 48 per day."
},
"activeBlockCount": {
"type": "integer",
"maximum": 48,
"minimum": 0,
"description": "Number of half-hour blocks with activity today"
},
"offlineXPAwarded": {
"type": "integer",
"minimum": 0,
"description": "XP awarded for offline time"
}
},
"description": "Activity pattern data for the day based on half-hour blocks"
},
"activityCounts": {
"type": "object",
"properties": {
"likesSent": {
"type": "integer",
"minimum": 0,
"description": "Likes sent today"
},
"postsRead": {
"type": "integer",
"minimum": 0,
"description": "Posts read today"
},
"repliesSent": {
"type": "integer",
"minimum": 0,
"description": "Replies sent today"
},
"repostsSent": {
"type": "integer",
"minimum": 0,
"description": "Reposts sent today"
},
"postsCreated": {
"type": "integer",
"minimum": 0,
"description": "Posts created today"
}
},
"description": "Aggregate activity counts for the day (no timestamps or URIs)"
},
"playerSnapshot": {
"type": "object",
"required": [
"level",
"totalXP"
],
"properties": {
"level": {
"type": "integer",
"minimum": 1,
"description": "Player level at end of day"
},
"totalXP": {
"type": "integer",
"minimum": 0,
"description": "Total accumulated XP"
},
"itemsTotal": {
"type": "integer",
"minimum": 0,
"description": "Total items in inventory"
},
"xpGainedToday": {
"type": "integer",
"minimum": 0,
"description": "XP gained during this day"
},
"itemsAcquiredToday": {
"type": "integer",
"minimum": 0,
"description": "Number of items acquired today"
},
"itemsConsumedToday": {
"type": "integer",
"minimum": 0,
"description": "Number of items consumed/used today"
},
"specimensDocumented": {
"type": "integer",
"minimum": 0,
"description": "Total specimens in collection"
}
},
"description": "Player state snapshot for this day"
},
"engagementCounts": {
"type": "object",
"properties": {
"likesReceived": {
"type": "integer",
"minimum": 0,
"description": "Likes received on posts today"
},
"quotesReceived": {
"type": "integer",
"minimum": 0,
"description": "Quotes received today"
},
"repliesReceived": {
"type": "integer",
"minimum": 0,
"description": "Replies received on posts today"
},
"repostsReceived": {
"type": "integer",
"minimum": 0,
"description": "Reposts received today"
}
},
"description": "Engagement received on user's posts (aggregate counts only)"
},
"expeditionSummary": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"minimum": 0,
"description": "Number of expeditions completed today"
},
"totalDuration": {
"type": "integer",
"minimum": 0,
"description": "Total expedition duration in milliseconds"
},
"currentCampNumber": {
"type": "integer",
"minimum": 0,
"description": "Current camp number within the active expedition (0 = exploring, not camped; unset if no active expedition)"
},
"currentExpeditionNumber": {
"type": "integer",
"minimum": 1,
"description": "Number of the currently active expedition (unset if no active expedition)"
}
},
"description": "Summary of expeditions for the day (details in chronicle.expedition)"
},
"chronicleSignature": {
"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"
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}