net.anisota.chronicle.log.monthly
Schema Diff
+36 -0
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
}