# net.anisota.chronicle.log.daily

> Published by [anisota.net](https://lexicon.garden/identity/did:plc:lcieujcfkv4jx7gehsvok3pr)

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:lcieujcfkv4jx7gehsvok3pr/net.anisota.chronicle.log.daily)
- [Documentation](https://lexicon.garden/lexicon/did:plc:lcieujcfkv4jx7gehsvok3pr/net.anisota.chronicle.log.daily/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:lcieujcfkv4jx7gehsvok3pr/net.anisota.chronicle.log.daily/examples)

## Definitions

### `net.anisota.chronicle.log.daily`

**Type**: `record`

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

**Key**: `any`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `date` | `string` | Yes | Date string in YYYY-MM-DD format (user's local timezone) |
| `player` | `ref` → `#playerSnapshot` | Yes |  |
| `activity` | `ref` → `#activityCounts` | Yes |  |
| `patterns` | `ref` → `#patternsData` | No |  |
| `createdAt` | `string` (datetime) | Yes | When the daily record was first created |
| `signature` | `ref` → `#chronicleSignature` | Yes |  |
| `updatedAt` | `string` (datetime) | No | When the daily record was last updated |
| `engagement` | `ref` → `#engagementCounts` | No |  |
| `expeditions` | `ref` → `#expeditionSummary` | No |  |
| `upperLogRefs` | `array` | No | AT URIs of containing logs (weekly, monthly, yearly) this day belongs to |
| `expeditionRefs` | `array` | No | AT URIs of expedition records that occurred on this day |

### `net.anisota.chronicle.log.daily#patternsData`

**Type**: `object`

Activity pattern data for the day based on half-hour blocks

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `activeBlocks` | `array` | No | Half-hour slots with activity, as HH:MM strings (e.g. '09:00', '09:30'). Max 48 per day. |
| `activeBlockCount` | `integer` | No | Number of half-hour blocks with activity today |
| `offlineXPAwarded` | `integer` | No | XP awarded for offline time |

### `net.anisota.chronicle.log.daily#activityCounts`

**Type**: `object`

Aggregate activity counts for the day (no timestamps or URIs)

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `likesSent` | `integer` | No | Likes sent today |
| `postsRead` | `integer` | No | Posts read today |
| `repliesSent` | `integer` | No | Replies sent today |
| `repostsSent` | `integer` | No | Reposts sent today |
| `postsCreated` | `integer` | No | Posts created today |

### `net.anisota.chronicle.log.daily#playerSnapshot`

**Type**: `object`

Player state snapshot for this day

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `level` | `integer` | Yes | Player level at end of day |
| `totalXP` | `integer` | Yes | Total accumulated XP |
| `itemsTotal` | `integer` | No | Total items in inventory |
| `xpGainedToday` | `integer` | No | XP gained during this day |
| `itemsAcquiredToday` | `integer` | No | Number of items acquired today |
| `itemsConsumedToday` | `integer` | No | Number of items consumed/used today |
| `specimensDocumented` | `integer` | No | Total specimens in collection |

### `net.anisota.chronicle.log.daily#engagementCounts`

**Type**: `object`

Engagement received on user's posts (aggregate counts only)

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `likesReceived` | `integer` | No | Likes received on posts today |
| `quotesReceived` | `integer` | No | Quotes received today |
| `repliesReceived` | `integer` | No | Replies received on posts today |
| `repostsReceived` | `integer` | No | Reposts received today |

### `net.anisota.chronicle.log.daily#expeditionSummary`

**Type**: `object`

Summary of expeditions for the day (details in chronicle.expedition)

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `count` | `integer` | No | Number of expeditions completed today |
| `totalDuration` | `integer` | No | Total expedition duration in milliseconds |
| `currentCampNumber` | `integer` | No | Current camp number within the active expedition (0 = exploring, not camped; unset if no active expedition) |
| `currentExpeditionNumber` | `integer` | No | Number of the currently active expedition (unset if no active expedition) |

### `net.anisota.chronicle.log.daily#chronicleSignature`

**Type**: `object`

ES256 cryptographic signature proving record authenticity

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `alg` | `string` | Yes | Signing algorithm (ES256) |
| `kid` | `string` | Yes | Key identifier for the signing key |
| `sig` | `string` | Yes | Base64-encoded ES256 signature |
| `nonce` | `string` | Yes | Unique random nonce to prevent replay |
| `version` | `integer` | Yes | Signature schema version |
| `signedAt` | `string` (datetime) | Yes | When the record was signed |

## Raw Schema

```json
{
  "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
}
```
