net.anisota.chronicle.log.monthly

anisota.net

Schema Diff

+36 -0

From

CID
bafyreifwzmgik2c...
Indexed At
2026-06-22 18:49 UTC
View this version

To

CID
bafyreibpyync5gi...
Indexed At
2026-07-23 23:28 UTC
View this version

Compatibility Analysis

Backward Compatible

Backward compatible. 14 non-breaking changes.

Non-Breaking Changes (14)
  • AddedVertex AddedVertex { vertex_id: "net.anisota.chronicle.log.monthly#inAppCounts" }
  • AddedVertex AddedVertex { vertex_id: "net.anisota.chronicle.log.monthly#inAppCounts.likes" }
  • AddedVertex AddedVertex { vertex_id: "net.anisota.chronicle.log.monthly#inAppCounts.posts" }
  • AddedVertex AddedVertex { vertex_id: "net.anisota.chronicle.log.monthly#inAppCounts.quotes" }
  • AddedVertex AddedVertex { vertex_id: "net.anisota.chronicle.log.monthly#inAppCounts.replies" }
  • AddedVertex AddedVertex { vertex_id: "net.anisota.chronicle.log.monthly#inAppCounts.reposts" }
  • AddedVertex AddedVertex { vertex_id: "net.anisota.chronicle.log.monthly:body.inApp" }
  • AddedEdge AddedEdge { src: "net.anisota.chronicle.log.monthly#inAppCounts", tgt: "net.anisota.chronicle.log.monthly#inAppCounts.likes", kind: "prop", name: Some("likes") }
  • AddedEdge AddedEdge { src: "net.anisota.chronicle.log.monthly#inAppCounts", tgt: "net.anisota.chronicle.log.monthly#inAppCounts.posts", kind: "prop", name: Some("posts") }
  • AddedEdge AddedEdge { src: "net.anisota.chronicle.log.monthly#inAppCounts", tgt: "net.anisota.chronicle.log.monthly#inAppCounts.quotes", kind: "prop", name: Some("quotes") }
  • AddedEdge AddedEdge { src: "net.anisota.chronicle.log.monthly#inAppCounts", tgt: "net.anisota.chronicle.log.monthly#inAppCounts.replies", kind: "prop", name: Some("replies") }
  • AddedEdge AddedEdge { src: "net.anisota.chronicle.log.monthly#inAppCounts", tgt: "net.anisota.chronicle.log.monthly#inAppCounts.reposts", kind: "prop", name: Some("reposts") }
  • AddedEdge AddedEdge { src: "net.anisota.chronicle.log.monthly:body", tgt: "net.anisota.chronicle.log.monthly:body.inApp", kind: "prop", name: Some("inApp") }
  • AddedEdge AddedEdge { src: "net.anisota.chronicle.log.monthly:body.inApp", tgt: "net.anisota.chronicle.log.monthly#inAppCounts", kind: "ref", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "net.anisota.chronicle.log.monthly#inAppCounts" }
  • AddedVertex { vertex_id: "net.anisota.chronicle.log.monthly#inAppCounts.likes" }
  • AddedVertex { vertex_id: "net.anisota.chronicle.log.monthly#inAppCounts.posts" }
  • AddedVertex { vertex_id: "net.anisota.chronicle.log.monthly#inAppCounts.quotes" }
  • AddedVertex { vertex_id: "net.anisota.chronicle.log.monthly#inAppCounts.replies" }
  • AddedVertex { vertex_id: "net.anisota.chronicle.log.monthly#inAppCounts.reposts" }
  • AddedVertex { vertex_id: "net.anisota.chronicle.log.monthly:body.inApp" }

Additional Notes

  • Non-breaking: AddedEdge { src: "net.anisota.chronicle.log.monthly#inAppCounts", tgt: "net.anisota.chronicle.log.monthly#inAppCounts.likes", kind: "prop", name: Some("likes") }
  • Non-breaking: AddedEdge { src: "net.anisota.chronicle.log.monthly#inAppCounts", tgt: "net.anisota.chronicle.log.monthly#inAppCounts.posts", kind: "prop", name: Some("posts") }
  • Non-breaking: AddedEdge { src: "net.anisota.chronicle.log.monthly#inAppCounts", tgt: "net.anisota.chronicle.log.monthly#inAppCounts.quotes", kind: "prop", name: Some("quotes") }
  • Non-breaking: AddedEdge { src: "net.anisota.chronicle.log.monthly#inAppCounts", tgt: "net.anisota.chronicle.log.monthly#inAppCounts.replies", kind: "prop", name: Some("replies") }
  • Non-breaking: AddedEdge { src: "net.anisota.chronicle.log.monthly#inAppCounts", tgt: "net.anisota.chronicle.log.monthly#inAppCounts.reposts", kind: "prop", name: Some("reposts") }
  • Non-breaking: AddedEdge { src: "net.anisota.chronicle.log.monthly:body", tgt: "net.anisota.chronicle.log.monthly:body.inApp", kind: "prop", name: Some("inApp") }
  • Non-breaking: AddedEdge { src: "net.anisota.chronicle.log.monthly:body.inApp", tgt: "net.anisota.chronicle.log.monthly#inAppCounts", kind: "ref", name: None }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 4
    "chronicleSignature": {
5 5
      "description": "ES256 cryptographic signature proving record authenticity",
6 6
      "properties": {
7 7
        "alg": {
8 8
          "description": "Signing algorithm (ES256)",
9 9
          "type": "string"
10 10
        },
11 11
        "kid": {
12 12
          "description": "Key identifier for the signing key",
13 13
          "type": "string"
14 14
        },
15 15
        "nonce": {
16 16
          "description": "Unique random nonce to prevent replay",
17 17
          "type": "string"
18 18
        },
19 19
        "sig": {
20 20
          "description": "Base64-encoded ES256 signature",
21 21
          "type": "string"
22 22
        },
23 23
        "signedAt": {
24 24
          "description": "When the record was signed",
25 25
          "format": "datetime",
26 26
          "type": "string"
27 27
        },
28 28
        "version": {
29 29
          "description": "Signature schema version",
30 30
          "type": "integer"
31 31
        }
32 32
      },
33 33
      "required": [
34 34
        "sig",
35 35
        "alg",
36 36
        "kid",
37 37
        "signedAt",
38 38
        "nonce",
39 39
        "version"
40 40
      ],
41 41
      "type": "object"
42 42
    },
43 +
    "inAppCounts": {
44 +
      "description": "Per-category counts of activity performed inside anisota, summed across the period and across devices.",
45 +
      "properties": {
46 +
        "likes": {
47 +
          "description": "Likes created in anisota",
48 +
          "minimum": 0,
49 +
          "type": "integer"
50 +
        },
51 +
        "posts": {
52 +
          "description": "Top-level posts created in anisota",
53 +
          "minimum": 0,
54 +
          "type": "integer"
55 +
        },
56 +
        "quotes": {
57 +
          "description": "Quote posts created in anisota",
58 +
          "minimum": 0,
59 +
          "type": "integer"
60 +
        },
61 +
        "replies": {
62 +
          "description": "Replies created in anisota",
63 +
          "minimum": 0,
64 +
          "type": "integer"
65 +
        },
66 +
        "reposts": {
67 +
          "description": "Reposts created in anisota",
68 +
          "minimum": 0,
69 +
          "type": "integer"
70 +
        }
71 +
      },
72 +
      "type": "object"
73 +
    },
43 74
    "main": {
44 75
      "description": "Monthly aggregation of weekly records. rkey is YYYY-MM. Updated once per week, finalized when month ends.",
45 76
      "key": "any",
46 77
      "record": {
47 78
        "properties": {
48 79
          "aggregates": {
49 80
            "ref": "#monthlyAggregates",
50 81
            "type": "ref"
51 82
          },
52 83
          "createdAt": {
53 84
            "description": "When the monthly record was first created",
54 85
            "format": "datetime",
55 86
            "type": "string"
56 87
          },
57 88
          "expeditionRefs": {
58 89
            "description": "AT URIs of expedition records that occurred during this month",
59 90
            "items": {
60 91
              "type": "string"
61 92
            },
62 93
            "type": "array"
63 94
          },
64 95
          "finalizedAt": {
65 96
            "description": "When the monthly record was finalized (end of month)",
66 97
            "format": "datetime",
67 98
            "type": "string"
68 99
          },
100 +
          "inApp": {
101 +
            "description": "Rolled-up in-anisota activity for the month (summed daily inApp across devices, per field). Optional and additive; the read side may instead compute this from the month's daily logs.",
102 +
            "ref": "#inAppCounts",
103 +
            "type": "ref"
104 +
          },
69 105
          "lowerLogRefs": {
70 106
            "description": "AT URIs of weekly log records included in this month",
71 107
            "items": {
72 108
              "type": "string"
73 109
            },
74 110
            "type": "array"
75 111
          },
76 112
          "month": {
77 113
            "description": "Month string in YYYY-MM format (e.g. 2026-02)",
78 114
            "type": "string"
79 115
          },
80 116
          "patterns": {
81 117
            "ref": "#monthlyPatterns",
82 118
            "type": "ref"
83 119
          },
84 120
          "signature": {
85 121
            "ref": "#chronicleSignature",
86 122
            "type": "ref"
87 123
          },
88 124
          "status": {
89 125
            "description": "Whether this month is still being updated or has been finalized",
90 126
            "enum": [
91 127
              "active",
92 128
              "finalized"
93 129
            ],
94 130
            "type": "string"
95 131
          },
96 132
          "upperLogRefs": {
97 133
            "description": "AT URIs of containing logs (yearly) this month belongs to",
98 134
            "items": {
99 135
              "type": "string"
100 136
            },
101 137
            "type": "array"
102 138
          }
103 139
        },
104 140
        "required": [
105 141
          "month",
106 142
          "aggregates",
107 143
          "status",
108 144
          "signature",
109 145
          "createdAt"
110 146
        ],
111 147
        "type": "object"
112 148
      },
113 149
      "type": "record"
114 150
    },
115 151
    "monthlyAggregates": {
116 152
      "description": "Rolled-up counts from weekly records",
117 153
      "properties": {
118 154
        "daysActive": {
119 155
          "description": "Number of days with activity this month",
120 156
          "minimum": 0,
121 157
          "type": "integer"
122 158
        },
123 159
        "likesReceived": {
124 160
          "description": "Total likes received this month",
125 161
          "minimum": 0,
126 162
          "type": "integer"
127 163
        },
128 164
        "postsCreated": {
129 165
          "description": "Total posts created this month",
130 166
          "minimum": 0,
131 167
          "type": "integer"
132 168
        },
133 169
        "postsRead": {
134 170
          "description": "Total posts read this month",
135 171
          "minimum": 0,
136 172
          "type": "integer"
137 173
        },
138 174
        "repliesReceived": {
139 175
          "description": "Total replies received this month",
140 176
          "minimum": 0,
141 177
          "type": "integer"
142 178
        },
143 179
        "specimensPhotographed": {
144 180
          "description": "New specimens photographed this month",
145 181
          "minimum": 0,
146 182
          "type": "integer"
147 183
        },
148 184
        "totalXPGained": {
149 185
          "description": "Total XP gained this month",
150 186
          "minimum": 0,
151 187
          "type": "integer"
152 188
        },
153 189
        "weeksActive": {
154 190
          "description": "Number of weeks with activity this month",
155 191
          "minimum": 0,
156 192
          "type": "integer"
157 193
        }
158 194
      },
159 195
      "type": "object"
160 196
    },
161 197
    "monthlyPatterns": {
162 198
      "description": "Activity pattern aggregation for the month based on half-hour blocks",
163 199
      "properties": {
164 200
        "avgBlocksPerDay": {
165 201
          "description": "Average active blocks per day (totalActiveBlocks / daysActive, rounded)",
166 202
          "minimum": 0,
167 203
          "type": "integer"
168 204
        },
169 205
        "peakBlocks": {
170 206
          "description": "Highest activeBlockCount for any single day in the month",
171 207
          "maximum": 48,
172 208
          "minimum": 0,
173 209
          "type": "integer"
174 210
        },
175 211
        "totalActiveBlocks": {
176 212
          "description": "Sum of activeBlockCount across all days in the month",
177 213
          "minimum": 0,
178 214
          "type": "integer"
179 215
        }
180 216
      },
181 217
      "type": "object"
182 218
    }
183 219
  },
184 220
  "id": "net.anisota.chronicle.log.monthly",
185 221
  "lexicon": 1
186 222
}

Compare Other Versions

Lexicon Garden

@