social.dracome.library.defs

dracome.social

Schema Diff

+5 -0

From

CID
bafyreidrlryn2rh...
Indexed At
2026-10-14 19:42 UTC
View this version

To

CID
bafyreidi24viqdc...
Indexed At
2026-10-14 19:54 UTC
View this version

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
}

Compare Other Versions

Lexicon Garden

@