From
bafyreiewf7zqdyn5ql5xnlob5ggw5zulxkdwqcz2t6fajvvgts7mqpnfyy
indexed 2026-07-26 20:07 UTC
View this version
To
bafyreiadoi5sal2opt5o4f6y2qm3wvm37k2ygraw2gf3qpnsfojca3muqe
indexed 2026-10-05 21:43 UTC
View this version
Compatibility
breaking 1 breaking change, 0 non-breaking changes.
Breaking changes (1)
- ConstraintTightened ConstraintTightened { vertex_id: "fm.freemix.stem:body.stemType", sort: "knownValues", old_value: "[\"drums\",\"bass\",\"vocals\",\"synth\",\"guitar\",\"keys\",\"pad\",\"lead\",\"fx\",\"other\"]", new_value: "[\"drums\",\"bass\",\"vocals\",\"synth\",\"guitar\",\"keys\",\"pad\",\"lead\",\"fx\",\"other\",\"808\",\"synth-strings\",\"vocal-sample\",\"space-echo\",\"plate\",\"african-percussion\",\"surdo\",\"kete\"]" }
Migration guidance
Constraint changes
- ConstraintTightened ConstraintTightened { vertex_id: "fm.freemix.stem:body.stemType", sort: "knownValues", old_value: "[\"drums\",\"bass\",\"vocals\",\"synth\",\"guitar\",\"keys\",\"pad\",\"lead\",\"fx\",\"other\"]", new_value: "[\"drums\",\"bass\",\"vocals\",\"synth\",\"guitar\",\"keys\",\"pad\",\"lead\",\"fx\",\"other\",\"808\",\"synth-strings\",\"vocal-sample\",\"space-echo\",\"plate\",\"african-percussion\",\"surdo\",\"kete\"]" }
Changes
11
{22
"$type": "com.atproto.lexicon.schema",33
"defs": {44
"main": {55
"description": "A stem (isolated track component). Top-level leaf (FM-549 s38: pulled out from under release.* ; release.stem -> stem). May optionally reference a parent track and/or a parent stems-group.",66
"key": "tid",77
"record": {88
"properties": {99
"aiDeclaration": {1010
"description": "Declaration of AI involvement in creation",1111
"properties": {1212
"category": {1313
"description": "Level of AI involvement",1414
"knownValues": [1515
"none",1616
"assisted",1717
"augmented",1818
"generated"1919
],2020
"maxLength": 100,2121
"type": "string"2222
},2323
"description": {2424
"description": "Creator's description of how AI was used",2525
"maxLength": 1000,2626
"type": "string"2727
},2828
"tools": {2929
"description": "AI tools used",3030
"items": {3131
"maxLength": 100,3232
"type": "string"3333
},3434
"maxLength": 10,3535
"type": "array"3636
}3737
},3838
"required": [3939
"category"4040
],4141
"type": "object"4242
},4343
"audioDurationMs": {4444
"description": "Duration of the stem in milliseconds",4545
"type": "integer"4646
},4747
"audioFormat": {4848
"description": "Audio file format",4949
"knownValues": [5050
"wav",5151
"flac",5252
"mp3"5353
],5454
"maxLength": 100,5555
"type": "string"5656
},5757
"audioHash": {5858
"description": "SHA-256 hash of the stem audio content",5959
"maxLength": 200,6060
"type": "string"6161
},6262
"audioSizeBytes": {6363
"description": "Size of the audio file in bytes",6464
"type": "integer"6565
},6666
"audioUrl": {6767
"description": "DEPRECATED (FM-508): no longer emitted. Stem audio is private (gated download / app-served preview) and is never surfaced in the portable record. Field kept (optional) to tolerate pre-FM-508 records without a putRecord rewrite. Stems never get a public clip.",6868
"format": "uri",6969
"maxLength": 3000,7070
"type": "string"7171
},7272
"bpmCentis": {7373
"description": "Centi-BPM (BPM × 100), integer — the Lexicon model has no float type; decode as `bpmCentis / 100` on read. Mirrors `fm.freemix.release.track`.",7474
"maximum": 99900,7575
"minimum": 2000,7676
"type": "integer"7777
},7878
"coverArtUrl": {7979
"description": "URL to cover art image",8080
"format": "uri",8181
"maxLength": 3000,8282
"type": "string"8383
},8484
"createdAt": {8585
"description": "Record creation timestamp",8686
"format": "datetime",8787
"maxLength": 100,8888
"type": "string"8989
},9090
"description": {9191
"description": "Stem description",9292
"maxLength": 5000,9393
"type": "string"9494
},9595
"detachedAt": {9696
"description": "FM-504 tombstone: when the parent link was severed",9797
"format": "datetime",9898
"maxLength": 100,9999
"type": "string"100100
},101101
"genres": {102102
"description": "Genre classifications. Deliberately plural `genres` (it IS an array), NOT the track lexicon's singular `genre` — singular-for-an-array is misleading. Intentional divergence.",103103
"items": {104104
"maxLength": 50,105105
"type": "string"106106
},107107
"maxLength": 10,108108
"type": "array"109109
},110110
"label": {111111
"description": "Human-readable name (e.g., 'Main Vocal', 'Acid Line', '808 Kit')",112112
"maxLength": 100,113113
"type": "string"114114
},115115
"license": {116116
"description": "AT URI of the license grant record. For child stems this is the parent track's license, copied down at creation (FM-504)",117117
"format": "at-uri",118118
"maxLength": 3000,119119
"type": "string"120120
},121121
"musicalKey": {122122
"description": "Musical key (e.g., 'Am', 'F#m', 'Bb'). Deliberately named `musicalKey`, NOT the track lexicon's `key`: `key` is dangerously overloaded in a data layer (record keys, rkeys, map keys), so `musicalKey` is collision-proof and self-documenting. Intentional divergence.",123123
"maxLength": 10,124124
"type": "string"125125
},126126
"notes": {127127
"description": "Generic freeform notes for this stem (FM-550, s41). Any purpose — processing notes, licensing caveats, or an ad-hoc credit like 'Drummer: Joey Beats'. Deliberately NOT the structured #trackCredits block: most credit roles are meaningless on a stem, so a freeform escape hatch covers the rare case. Stems carry no structured credits.",128128
"maxLength": 1000,129129
"type": "string"130130
},131131
"parentGroup": {132132
"description": "AT URI of the parent fm.freemix.group.stems this stem belongs to (optional). FM-549 s38: stems may carry an optional parentTrack AND an optional parentGroup back-ref — the only upward refs in the model (containers otherwise point down at members).",133133
"format": "at-uri",134134
"maxLength": 3000,135135
"type": "string"136136
},137137
"parentGroupCid": {138138
"description": "CID of the parent stems-group record (pins to exact version).",139139
"format": "cid",140140
"maxLength": 200,141141
"type": "string"142142
},143143
"parentTrack": {144144
"description": "AT URI of the parent track this stem belongs to (optional for standalone stems)",145145
"format": "at-uri",146146
"maxLength": 3000,147147
"type": "string"148148
},149149
"parentTrackCid": {150150
"description": "CID of the parent track record (pins to exact version)",151151
"format": "cid",152152
"maxLength": 200,153153
"type": "string"154154
},155155
"position": {156156
"description": "Display order position (0-indexed)",157157
"minimum": 0,158158
"type": "integer"159159
},160160
"previouslyAttachedToCid": {161161
"description": "FM-504 tombstone: CID of the former parent track record at detach time",162162
"format": "cid",163163
"maxLength": 200,164164
"type": "string"165165
},166166
"previouslyAttachedToUri": {167167
"description": "FM-504 tombstone: AT URI of the former parent track, set when this stem was detached (parent deleted, keep-stems path). Preserves remix-tree placement + royalty-lineage reconstructability",168168
"format": "at-uri",169169
"maxLength": 3000,170170
"type": "string"171171
},172172
"stemType": {173173
"description": "Type/category of the stem",174174
"knownValues": [175175
"drums",176176
"bass",177177
"vocals",178178
"synth",179179
"guitar",180180
"keys",181181
"pad",182182
"lead",183183
"fx",184
"other"184
"other",185
"808",186
"synth-strings",187
"vocal-sample",188
"space-echo",189
"plate",190
"african-percussion",191
"surdo",192
"kete"185193
],186194
"maxLength": 100,187195
"type": "string"188196
},189197
"tags": {190198
"description": "Freeform tags",191199
"items": {192200
"maxLength": 50,193201
"type": "string"194202
},195203
"maxLength": 10,196204
"type": "array"197205
},198206
"title": {199207
"description": "Stem title (first-class stems). `label` remains the required human-readable name; `title` is the unified-on-title field added in FM-504",200208
"maxLength": 300,201209
"type": "string"202210
}203211
},204212
"required": [205213
"stemType",206214
"label",207215
"audioHash",208216
"audioDurationMs",209217
"audioFormat",210218
"audioSizeBytes",211219
"createdAt"212220
],213221
"type": "object"214222
},215223
"type": "record"216224
}217225
},218226
"id": "fm.freemix.stem",219227
"lexicon": 1220228
}