social.dracome.library.defs
Schema Diff
+5 -0
Compatibility Analysis
Breaking Changes Detected
5 breaking changes, 0 non-breaking changes.
Breaking Changes (5)
- ConstraintAdded ConstraintAdded { vertex_id: "social.dracome.library.defs#goalMetric", sort: "maxLength", value: "64" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.dracome.library.defs#trackingProgress.kind", sort: "maxLength", value: "64" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.dracome.library.defs#trackingStatus", sort: "maxLength", value: "64" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.dracome.library.defs#goalFormatScope", sort: "maxLength", value: "64" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.dracome.library.defs#acquisitionType", sort: "maxLength", value: "64" }
Migration Guidance
Constraint Changes
- ConstraintAdded ConstraintAdded { vertex_id: "social.dracome.library.defs#goalFormatScope", sort: "maxLength", value: "64" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.dracome.library.defs#acquisitionType", sort: "maxLength", value: "64" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.dracome.library.defs#trackingStatus", sort: "maxLength", value: "64" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.dracome.library.defs#goalMetric", sort: "maxLength", value: "64" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.dracome.library.defs#trackingProgress.kind", sort: "maxLength", value: "64" }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"acquisitionType": {
5
5
"description": "How an actor came to own a specific book edition, tracked on a `library.acquisition` record.",
6
6
"knownValues": [
7
7
"review_copy",
8
8
"purchased",
9
9
"gift",
10
10
"giveaway",
11
11
"subscription",
12
12
"other"
13
13
],
14
+
"maxLength": 64,
14
15
"type": "string"
15
16
},
16
17
"audioProgress": {
17
18
"description": "Position marker for time-based audio progress.",
18
19
"properties": {
19
20
"positionSeconds": {
20
21
"description": "Playback position in seconds reached as of this progress entry.",
21
22
"minimum": 0,
22
23
"type": "integer"
23
24
}
24
25
},
25
26
"required": [
26
27
"positionSeconds"
27
28
],
28
29
"type": "object"
29
30
},
30
31
"audioTargetCustomization": {
31
32
"description": "User-confirmed customization for an audio target. Runtime validation MUST require at least one of durationSeconds or chapterTotal. Both may be populated at once: an audiobook edition can carry an independent chapter total alongside its duration total.",
32
33
"properties": {
33
34
"chapterTotal": {
34
35
"description": "User-confirmed total chapter count for this audiobook target, independent of durationSeconds — set when the actor tracks progress by chapter instead of (or in addition to) audio position.",
35
36
"minimum": 1,
36
37
"type": "integer"
37
38
},
38
39
"durationSeconds": {
39
40
"description": "Total audio duration in seconds, as confirmed by the actor.",
40
41
"minimum": 1,
41
42
"type": "integer"
42
43
}
43
44
},
44
45
"type": "object"
45
46
},
46
47
"catalogTargetCustomization": {
47
48
"description": "User-confirmed target-scoped customization that overrides catalog totals for this actor. Runtime validation MUST require exactly one of book, audiobook, manga, or comic to be populated, chosen based on the edition's actual tracking modality rather than a literal workType lookup: for most workType values this is book (paginated); narrated audio recordings of any workType use audiobook (audio_drama itself is a comparatively rare workType, not the common case for this payload); manga and comic each use their own respective payload, since comic is a distinct workType. The format-appropriate shape always takes precedence over workType since audio recordings of any work type need audio-shaped tracking.",
48
49
"properties": {
49
50
"audiobook": {
50
51
"description": "Customization payload for a target tracked with audio-duration progress. Most commonly used for narrated audio recordings of any workType (e.g. an audiobook edition of a novel) — audio_drama is a comparatively rare workType value, not the common case, but always uses this same shape.",
51
52
"ref": "#audioTargetCustomization",
52
53
"type": "ref"
53
54
},
54
55
"book": {
55
56
"description": "Customization payload for a target tracked with paginated (page or chapter) progress, most commonly used for novel, poetry, non_fiction, and other text-first workType values.",
56
57
"ref": "#paginatedTargetCustomization",
57
58
"type": "ref"
58
59
},
59
60
"comic": {
60
61
"description": "Customization payload for a target tracked with comic-style chapter progress, used for comic workType values. Comic is a distinct workType from manga (not a subset or synonym of it), even though both share the same chapter-based payload shape.",
61
62
"ref": "#paginatedTargetCustomization",
62
63
"type": "ref"
63
64
},
64
65
"manga": {
65
66
"description": "Customization payload for a target tracked with manga-style chapter progress, used for manga workType values.",
66
67
"ref": "#paginatedTargetCustomization",
67
68
"type": "ref"
68
69
},
69
70
"workType": {
70
71
"description": "Structural content form of the targeted work, carried here for context. It informs, but does not literally select, which of book, audiobook, manga, or comic is populated below: the populated payload MUST match the edition's actual tracking modality (page/chapter-based, audio-duration-based, or manga/comic-chapter-based), not a literal workType lookup. For example, an audiobook recording of a novel still has workType novel while needing the audiobook-shaped payload; audio_drama itself is a comparatively rare workType value even though it always needs the same audiobook-shaped payload.",
71
72
"ref": "social.dracome.work.defs#workType",
72
73
"type": "ref"
73
74
}
74
75
},
75
76
"required": [
76
77
"workType"
77
78
],
78
79
"type": "object"
79
80
},
80
81
"chapterProgress": {
81
82
"description": "Position marker for chapter-based reading progress.",
82
83
"properties": {
83
84
"position": {
84
85
"description": "One-based chapter number reached as of this progress entry.",
85
86
"minimum": 1,
86
87
"type": "integer"
87
88
}
88
89
},
89
90
"required": [
90
91
"position"
91
92
],
92
93
"type": "object"
93
94
},
94
95
"goalFormatScope": {
95
96
"description": "The format category a `library.goal` record's `formatScope` restricts fulfillment counting to. Resolved to specific `social.dracome.work.defs#editionFormat` values at read time.",
96
97
"knownValues": [
97
98
"physical",
98
99
"digital",
99
100
"audiobook"
100
101
],
102
+
"maxLength": 64,
101
103
"type": "string"
102
104
},
103
105
"goalMetric": {
104
106
"description": "The consumption metric a `library.goal` record targets. Fulfillment for every value is computed at read time by filtering the actor's `library.state` records that both fall within the goal's period and have status `completed`; each value differs only in what it sums/counts from that filtered set. `completed_state_count`: count of completed `library.state` records within the period. `page_count_sum`: aggregate page total of those completed records, sourcing each record's page count from `catalogSnapshot.edition.pageCount`, or from the record's own `catalogTargetCustomization` page-total override when the actor set a more accurate figure. `duration_seconds_sum`: aggregate duration in seconds of those completed records, sourcing each record's duration from `catalogSnapshot.edition.durationSeconds`, or from the record's own `catalogTargetCustomization` audiobook duration override when the actor set a more accurate figure.",
105
107
"knownValues": [
106
108
"completed_state_count",
107
109
"page_count_sum",
108
110
"duration_seconds_sum"
109
111
],
112
+
"maxLength": 64,
110
113
"type": "string"
111
114
},
112
115
"pageProgress": {
113
116
"description": "Position marker for page-based reading progress.",
114
117
"properties": {
115
118
"position": {
116
119
"description": "Zero-based page position reached as of this progress entry.",
117
120
"minimum": 0,
118
121
"type": "integer"
119
122
}
120
123
},
121
124
"required": [
122
125
"position"
123
126
],
124
127
"type": "object"
125
128
},
126
129
"paginatedTargetCustomization": {
127
130
"description": "User-confirmed totals for paginated works. Runtime validation MUST require at least one of pageTotal or chapterTotal.",
128
131
"properties": {
129
132
"chapterTotal": {
130
133
"description": "User-confirmed total chapter count for this work or edition, overriding catalog data when the actor knows a more accurate figure.",
131
134
"minimum": 1,
132
135
"type": "integer"
133
136
},
134
137
"pageTotal": {
135
138
"description": "User-confirmed total page count for this work or edition, overriding catalog data when the actor knows a more accurate figure.",
136
139
"minimum": 1,
137
140
"type": "integer"
138
141
}
139
142
},
140
143
"type": "object"
141
144
},
142
145
"percentageProgress": {
143
146
"description": "Position marker for percentage-based reading progress.",
144
147
"properties": {
145
148
"percentage": {
146
149
"description": "Percentage of the work completed as of this progress entry, from 0 to 100.",
147
150
"maximum": 100,
148
151
"minimum": 0,
149
152
"type": "integer"
150
153
}
151
154
},
152
155
"required": [
153
156
"percentage"
154
157
],
155
158
"type": "object"
156
159
},
157
160
"progressLogEntry": {
158
161
"description": "Runtime validation SHOULD require at least one of page, percentage, chapter, or audio to be present.",
159
162
"properties": {
160
163
"audio": {
161
164
"description": "Audio-based progress recorded for this day, present when the actor tracks by listening time.",
162
165
"ref": "#audioProgress",
163
166
"type": "ref"
164
167
},
165
168
"chapter": {
166
169
"description": "Chapter-based progress recorded for this day, present when the actor tracks by chapter.",
167
170
"ref": "#chapterProgress",
168
171
"type": "ref"
169
172
},
170
173
"date": {
171
174
"description": "Canonical UTC instant for the progress entry day, serialized as ISO 8601 with a trailing Z suffix. At most one entry per UTC calendar day should exist in the log. Frontend clients may localize this for presentation only.",
172
175
"format": "datetime",
173
176
"type": "string"
174
177
},
175
178
"page": {
176
179
"description": "Page-based progress recorded for this day, present when the actor tracks by page.",
177
180
"ref": "#pageProgress",
178
181
"type": "ref"
179
182
},
180
183
"percentage": {
181
184
"description": "Percentage-based progress recorded for this day, present when the actor tracks by percentage.",
182
185
"ref": "#percentageProgress",
183
186
"type": "ref"
184
187
}
185
188
},
186
189
"required": [
187
190
"date"
188
191
],
189
192
"type": "object"
190
193
},
191
194
"trackingProgress": {
192
195
"description": "An actor's progress on a work or edition, expressed either as text-based (page, chapter, or percentage) or audio-based (elapsed time) tracking.",
193
196
"properties": {
194
197
"kind": {
195
198
"description": "Progress dimension. text = page, chapter, or percentage tracking; audio = time-based tracking. Mirrors the workType medium but stays independent of it.",
196
199
"knownValues": [
197
200
"text",
198
201
"audio"
199
202
],
203
+
"maxLength": 64,
200
204
"type": "string"
201
205
},
202
206
"log": {
203
207
"description": "Ordered progress log, oldest entry first. At most one entry per UTC calendar day should be stored. Capped at 2000 entries: writers drop the oldest entries when the cap is reached.",
204
208
"items": {
205
209
"ref": "#progressLogEntry",
206
210
"type": "ref"
207
211
},
208
212
"maxLength": 2000,
209
213
"type": "array"
210
214
}
211
215
},
212
216
"required": [
213
217
"kind"
214
218
],
215
219
"type": "object"
216
220
},
217
221
"trackingStatus": {
218
222
"description": "Current reading-state status for a work or edition, from initial intent through completion or abandonment.",
219
223
"enum": [
220
224
"wishlist",
221
225
"backlog",
222
226
"in_progress",
223
227
"paused",
224
228
"completed",
225
229
"abandoned"
226
230
],
231
+
"maxLength": 64,
227
232
"type": "string"
228
233
}
229
234
},
230
235
"id": "social.dracome.library.defs",
231
236
"lexicon": 1
232
237
}