net.anisota.chronicle.achievement
Schema Diff
+1 -1
Compatibility Analysis
Backward Compatible
No changes detected.
1
1
{
2
2
"id": "net.anisota.chronicle.achievement",
3
3
"defs": {
4
4
"main": {
5
5
"key": "any",
6
6
"type": "record",
7
7
"record": {
8
8
"type": "object",
9
9
"required": [
10
10
"achievementId",
11
11
"category",
12
12
"unlockedAt",
13
13
"signature",
14
14
"createdAt"
15
15
],
16
16
"properties": {
17
17
"name": {
18
18
"type": "string",
19
19
"maxLength": 100,
20
20
"description": "Display name of the achievement"
21
21
},
22
22
"tier": {
23
23
"type": "integer",
24
24
"minimum": 0,
25
25
"description": "Tier or milestone value (e.g. 2500 for followers2500)"
26
26
},
27
27
"rarity": {
28
28
"enum": [
29
29
"common",
30
30
"uncommon",
31
31
"rare",
32
32
"epic",
33
33
"legendary"
34
34
],
35
35
"type": "string",
36
36
"description": "Rarity tier of the achievement"
37
37
},
38
38
"context": {
39
39
"ref": "#achievementContext",
40
40
"type": "ref"
41
41
},
42
42
"category": {
43
43
"enum": [
44
44
"followers",
45
45
"level",
46
46
"social",
47
47
"collection",
48
48
"patterns",
49
49
"special",
50
50
"expedition"
51
51
],
52
52
"type": "string",
53
53
"description": "Category of the achievement"
54
54
},
55
55
"xpReward": {
56
56
"type": "integer",
57
57
"minimum": 0,
58
58
"description": "XP awarded for this achievement"
59
59
},
60
60
"createdAt": {
61
61
"type": "string",
62
62
"format": "datetime",
63
63
"description": "When the achievement record was created"
64
64
},
65
65
"signature": {
66
66
"ref": "#chronicleSignature",
67
67
"type": "ref"
68
68
},
69
69
"unlockedAt": {
70
70
"type": "string",
71
71
"format": "datetime",
72
72
"description": "When the achievement was unlocked"
73
73
},
74
74
"description": {
75
75
"type": "string",
76
76
"maxLength": 500,
77
77
"description": "Description of what was accomplished"
78
78
},
79
79
"achievementId": {
80
80
"type": "string",
81
81
"maxLength": 100,
82
82
"description": "Unique identifier for the achievement (e.g. 'followers2500', 'level50')"
83
83
},
84
84
"dailyRecordRef": {
85
85
"type": "string",
86
86
"description": "AT URI of the daily record when the achievement was unlocked"
87
87
}
88
88
}
89
89
},
90
-
"description": "Consolidated achievement record. Replaces 30 beta achievement lexicons. rkey is the achievement ID (e.g. followers2500, level50). Created once with createRecord when achievement is unlocked. Immutable."
90
+
"description": "DEPRECATED - superseded by net.anisota.chronicle.milestone. No new records are written to this collection; the schema is kept because earlier records still exist on users' PDSes and remain readable. rkey is the achievement ID (e.g. followers2500, level50). Immutable."
91
91
},
92
92
"achievementContext": {
93
93
"type": "object",
94
94
"properties": {
95
95
"level": {
96
96
"type": "integer",
97
97
"minimum": 1,
98
98
"description": "Player level when achievement was unlocked"
99
99
},
100
100
"totalXP": {
101
101
"type": "integer",
102
102
"minimum": 0,
103
103
"description": "Total XP when achievement was unlocked"
104
104
},
105
105
"postCount": {
106
106
"type": "integer",
107
107
"minimum": 0,
108
108
"description": "Post count when achievement was unlocked"
109
109
},
110
110
"followerCount": {
111
111
"type": "integer",
112
112
"minimum": 0,
113
113
"description": "Follower count when achievement was unlocked"
114
114
},
115
115
"specimenCount": {
116
116
"type": "integer",
117
117
"minimum": 0,
118
118
"description": "Specimen count when achievement was unlocked"
119
119
}
120
120
},
121
121
"description": "Contextual data at the time of achievement unlock"
122
122
},
123
123
"chronicleSignature": {
124
124
"type": "object",
125
125
"required": [
126
126
"sig",
127
127
"alg",
128
128
"kid",
129
129
"signedAt",
130
130
"nonce",
131
131
"version"
132
132
],
133
133
"properties": {
134
134
"alg": {
135
135
"type": "string",
136
136
"description": "Signing algorithm (ES256)"
137
137
},
138
138
"kid": {
139
139
"type": "string",
140
140
"description": "Key identifier for the signing key"
141
141
},
142
142
"sig": {
143
143
"type": "string",
144
144
"description": "Base64-encoded ES256 signature"
145
145
},
146
146
"nonce": {
147
147
"type": "string",
148
148
"description": "Unique random nonce to prevent replay"
149
149
},
150
150
"version": {
151
151
"type": "integer",
152
152
"description": "Signature schema version"
153
153
},
154
154
"signedAt": {
155
155
"type": "string",
156
156
"format": "datetime",
157
157
"description": "When the record was signed"
158
158
}
159
159
},
160
160
"description": "ES256 cryptographic signature proving record authenticity. The signature itself proves legitimacy - no separate verification lexicons needed."
161
161
}
162
162
},
163
163
"$type": "com.atproto.lexicon.schema",
164
164
"lexicon": 1
165
165
}