net.anisota.chronicle.log.yearly

anisota.net

Documentation

Yearly aggregation of monthly records. rkey is YYYY. Updated once per month, finalized when year ends.

main record

Yearly aggregation of monthly records. rkey is YYYY. Updated once per month, finalized when year ends.

Record Key any Any valid record key

Properties

createdAt string datetime Required

When the yearly record was first created

finalizedAt string datetime Optional

When the yearly record was finalized (end of year)

lowerLogRefs array of string Optional

AT URIs of monthly log records included in this year

status string Required

Whether this year is still being updated or has been finalized

Allowed: active, finalized
year string Required

Year string in YYYY format (e.g. 2026)

View raw schema
{
  "key": "any",
  "type": "record",
  "record": {
    "type": "object",
    "required": [
      "year",
      "aggregates",
      "status",
      "signature",
      "createdAt"
    ],
    "properties": {
      "year": {
        "type": "string",
        "description": "Year string in YYYY format (e.g. 2026)"
      },
      "status": {
        "enum": [
          "active",
          "finalized"
        ],
        "type": "string",
        "description": "Whether this year is still being updated or has been finalized"
      },
      "patterns": {
        "ref": "#yearlyPatterns",
        "type": "ref"
      },
      "createdAt": {
        "type": "string",
        "format": "datetime",
        "description": "When the yearly record was first created"
      },
      "signature": {
        "ref": "#chronicleSignature",
        "type": "ref"
      },
      "aggregates": {
        "ref": "#yearlyAggregates",
        "type": "ref"
      },
      "finalizedAt": {
        "type": "string",
        "format": "datetime",
        "description": "When the yearly record was finalized (end of year)"
      },
      "lowerLogRefs": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "AT URIs of monthly log records included in this year"
      }
    }
  },
  "description": "Yearly aggregation of monthly records. rkey is YYYY. Updated once per month, finalized when year ends."
}
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"
}
yearlyAggregates object

Rolled-up counts from monthly records

Properties

daysActive integer Optional

Total days with activity this year

minimum: 0
levelsGained integer Optional

Levels gained this year

minimum: 0
likesReceived integer Optional

Total likes received this year

minimum: 0
monthsActive integer Optional

Number of months with activity this year

minimum: 0
postsCreated integer Optional

Total posts created this year

minimum: 0
postsRead integer Optional

Total posts read this year

minimum: 0
repliesReceived integer Optional

Total replies received this year

minimum: 0
specimensPhotographed integer Optional

New specimens photographed this year

minimum: 0
totalXPGained integer Optional

Total XP gained this year

minimum: 0
View raw schema
{
  "type": "object",
  "properties": {
    "postsRead": {
      "type": "integer",
      "minimum": 0,
      "description": "Total posts read this year"
    },
    "daysActive": {
      "type": "integer",
      "minimum": 0,
      "description": "Total days with activity this year"
    },
    "levelsGained": {
      "type": "integer",
      "minimum": 0,
      "description": "Levels gained this year"
    },
    "monthsActive": {
      "type": "integer",
      "minimum": 0,
      "description": "Number of months with activity this year"
    },
    "postsCreated": {
      "type": "integer",
      "minimum": 0,
      "description": "Total posts created this year"
    },
    "likesReceived": {
      "type": "integer",
      "minimum": 0,
      "description": "Total likes received this year"
    },
    "totalXPGained": {
      "type": "integer",
      "minimum": 0,
      "description": "Total XP gained this year"
    },
    "repliesReceived": {
      "type": "integer",
      "minimum": 0,
      "description": "Total replies received this year"
    },
    "specimensPhotographed": {
      "type": "integer",
      "minimum": 0,
      "description": "New specimens photographed this year"
    }
  },
  "description": "Rolled-up counts from monthly records"
}
yearlyPatterns object

Activity pattern aggregation for the year based on half-hour blocks

Properties

avgBlocksPerDay integer Optional

Average active blocks per day (totalActiveBlocks / daysActive, rounded)

minimum: 0
peakBlocks integer Optional

Highest activeBlockCount for any single day in the year

minimum: 0maximum: 48
totalActiveBlocks integer Optional

Sum of activeBlockCount across all days in the year

minimum: 0
View raw schema
{
  "type": "object",
  "properties": {
    "peakBlocks": {
      "type": "integer",
      "maximum": 48,
      "minimum": 0,
      "description": "Highest activeBlockCount for any single day in the year"
    },
    "avgBlocksPerDay": {
      "type": "integer",
      "minimum": 0,
      "description": "Average active blocks per day (totalActiveBlocks / daysActive, rounded)"
    },
    "totalActiveBlocks": {
      "type": "integer",
      "minimum": 0,
      "description": "Sum of activeBlockCount across all days in the year"
    }
  },
  "description": "Activity pattern aggregation for the year based on half-hour blocks"
}

Lexicon Garden

@