From
bafyreih5phgm7g6vrdpsxew54x65n7cs2g7nx3f7n2xoqck3hriodypwxe
indexed 2026-11-05 18:56 UTC
View this version
To
bafyreifnkx3rzckkt7ozjczfamf5ugxlcsqsg24htkvdtlti72trletp2e
indexed 2026-11-06 01:44 UTC
View this version
Compatibility
breaking 2 breaking changes, 14 non-breaking changes.
Breaking changes (2)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "org.cairnsproto.draft.policy#calibrationStep", src: "org.cairnsproto.draft.policy#calibrationStep", tgt: "org.cairnsproto.draft.policy#calibrationStep.weightPpm", kind: "prop", name: Some("weightPpm") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "org.cairnsproto.draft.policy#calibrationStep", src: "org.cairnsproto.draft.policy#calibrationStep", tgt: "org.cairnsproto.draft.policy#calibrationStep.goldPasses", kind: "prop", name: Some("goldPasses") }
Non-breaking changes (14)
- AddedVertex AddedVertex { vertex_id: "org.cairnsproto.draft.policy#calibrationStep" }
- AddedVertex AddedVertex { vertex_id: "org.cairnsproto.draft.policy#calibrationStep.goldPasses" }
- AddedVertex AddedVertex { vertex_id: "org.cairnsproto.draft.policy#calibrationStep.weightPpm" }
- AddedVertex AddedVertex { vertex_id: "org.cairnsproto.draft.policy:body.calibration" }
- AddedVertex AddedVertex { vertex_id: "org.cairnsproto.draft.policy:body.calibration:items" }
- AddedVertex AddedVertex { vertex_id: "org.cairnsproto.draft.policy:body.dormancy" }
- AddedVertex AddedVertex { vertex_id: "org.cairnsproto.draft.policy:body.mergeOrgs" }
- AddedVertex AddedVertex { vertex_id: "org.cairnsproto.draft.policy:body.snapshotCadence" }
- AddedEdge AddedEdge { src: "org.cairnsproto.draft.policy:body", tgt: "org.cairnsproto.draft.policy:body.calibration", kind: "prop", name: Some("calibration") }
- AddedEdge AddedEdge { src: "org.cairnsproto.draft.policy:body", tgt: "org.cairnsproto.draft.policy:body.dormancy", kind: "prop", name: Some("dormancy") }
- AddedEdge AddedEdge { src: "org.cairnsproto.draft.policy:body", tgt: "org.cairnsproto.draft.policy:body.mergeOrgs", kind: "prop", name: Some("mergeOrgs") }
- AddedEdge AddedEdge { src: "org.cairnsproto.draft.policy:body", tgt: "org.cairnsproto.draft.policy:body.snapshotCadence", kind: "prop", name: Some("snapshotCadence") }
- AddedEdge AddedEdge { src: "org.cairnsproto.draft.policy:body.calibration", tgt: "org.cairnsproto.draft.policy:body.calibration:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "org.cairnsproto.draft.policy:body.calibration:items", tgt: "org.cairnsproto.draft.policy#calibrationStep", kind: "ref", name: None }
Migration guidance
Added
AddedVertex { vertex_id: "org.cairnsproto.draft.policy#calibrationStep" }AddedVertex { vertex_id: "org.cairnsproto.draft.policy#calibrationStep.goldPasses" }AddedVertex { vertex_id: "org.cairnsproto.draft.policy#calibrationStep.weightPpm" }AddedVertex { vertex_id: "org.cairnsproto.draft.policy:body.calibration" }AddedVertex { vertex_id: "org.cairnsproto.draft.policy:body.calibration:items" }AddedVertex { vertex_id: "org.cairnsproto.draft.policy:body.dormancy" }AddedVertex { vertex_id: "org.cairnsproto.draft.policy:body.mergeOrgs" }AddedVertex { vertex_id: "org.cairnsproto.draft.policy:body.snapshotCadence" }
Notes
- Breaking: RequiredEdgeAdded { vertex_id: "org.cairnsproto.draft.policy#calibrationStep", src: "org.cairnsproto.draft.policy#calibrationStep", tgt: "org.cairnsproto.draft.policy#calibrationStep.weightPpm", kind: "prop", name: Some("weightPpm") }
- Breaking: RequiredEdgeAdded { vertex_id: "org.cairnsproto.draft.policy#calibrationStep", src: "org.cairnsproto.draft.policy#calibrationStep", tgt: "org.cairnsproto.draft.policy#calibrationStep.goldPasses", kind: "prop", name: Some("goldPasses") }
- Non-breaking: AddedEdge { src: "org.cairnsproto.draft.policy:body", tgt: "org.cairnsproto.draft.policy:body.calibration", kind: "prop", name: Some("calibration") }
- Non-breaking: AddedEdge { src: "org.cairnsproto.draft.policy:body", tgt: "org.cairnsproto.draft.policy:body.dormancy", kind: "prop", name: Some("dormancy") }
- Non-breaking: AddedEdge { src: "org.cairnsproto.draft.policy:body", tgt: "org.cairnsproto.draft.policy:body.mergeOrgs", kind: "prop", name: Some("mergeOrgs") }
- Non-breaking: AddedEdge { src: "org.cairnsproto.draft.policy:body", tgt: "org.cairnsproto.draft.policy:body.snapshotCadence", kind: "prop", name: Some("snapshotCadence") }
- Non-breaking: AddedEdge { src: "org.cairnsproto.draft.policy:body.calibration", tgt: "org.cairnsproto.draft.policy:body.calibration:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "org.cairnsproto.draft.policy:body.calibration:items", tgt: "org.cairnsproto.draft.policy#calibrationStep", kind: "ref", name: None }
Changes
11
{22
"$type": "com.atproto.lexicon.schema",33
"defs": {44
"builtinCanonicalizer": {55
"description": "Built-in steps applied in order to every string value in the payload. Object keys, $type, $link and $bytes are never changed.",66
"properties": {77
"steps": {88
"items": {99
"knownValues": [1010
"identity",1111
"text",1212
"integerStrings",1313
"lowercase"1414
],1515
"maxLength": 64,1616
"type": "string"1717
},1818
"maxLength": 8,1919
"minLength": 1,2020
"type": "array"2121
}2222
},2323
"required": [2424
"steps"2525
],2626
"type": "object"2727
},28
"calibrationStep": {29
"properties": {30
"goldPasses": {31
"minimum": 0,32
"type": "integer"33
},34
"weightPpm": {35
"maximum": 1000000,36
"minimum": 0,37
"type": "integer"38
}39
},40
"required": [41
"goldPasses",42
"weightPpm"43
],44
"type": "object"45
},2846
"canonicalizer": {2947
"description": "How payloads of one schema become candidate values. Stones whose canonical values are equal are the same candidate. Schemas without an entry use identity.",3048
"properties": {3149
"schema": {3250
"ref": "org.cairnsproto.draft.defs#hash",3351
"type": "ref"3452
},3553
"using": {3654
"refs": [3755
"#checkCanonicalizer",3856
"#builtinCanonicalizer"3957
],4058
"type": "union"4159
}4260
},4361
"required": [4462
"schema",4563
"using"4664
],4765
"type": "object"4866
},4967
"checkCanonicalizer": {5068
"description": "A WASM check that maps a payload to its canonical value.",5169
"properties": {5270
"check": {5371
"ref": "com.atproto.repo.strongRef",5472
"type": "ref"5573
}5674
},5775
"required": [5876
"check"5977
],6078
"type": "object"6179
},6280
"courseSelector": {6381
"properties": {6482
"course": {6583
"description": "A course id from the project.",6684
"maxLength": 128,6785
"type": "string"6886
}6987
},7088
"required": [7189
"course"7290
],7391
"type": "object"7492
},7593
"credit": {7694
"properties": {7795
"attemptWeightPpm": {7896
"default": 50000,7997
"maximum": 1000000,8098
"minimum": 0,8199
"type": "integer"82100
},83101
"dedup": {84102
"default": false,85103
"description": "Open-scope dedup: a new site earns placement credit only if no earlier site matches it.",86104
"type": "boolean"87105
},88106
"flowBack": {89107
"ref": "#flowBack",90108
"type": "ref"91109
},92110
"pebbleWeightPpm": {93111
"default": 500000,94112
"maximum": 1000000,95113
"minimum": 0,96114
"type": "integer"97115
},98116
"volunteeredWeightPpm": {99117
"default": 500000,100118
"maximum": 1000000,101119
"minimum": 0,102120
"type": "integer"103121
}104122
},105123
"type": "object"106124
},107125
"draw": {108126
"properties": {109127
"drawnToRaise": {110128
"default": 1,111129
"description": "Agreeing drawn retraces needed before the low bound can rise without an anchor.",112130
"minimum": 1,113131
"type": "integer"114132
},115133
"epochRounds": {116134
"default": 1200,117135
"description": "drand quicknet rounds per epoch. 1200 rounds of 3 seconds is one hour.",118136
"minimum": 1,119137
"type": "integer"120138
},121139
"startThresholdPpm": {122140
"default": 31250,123141
"description": "Starting draw threshold T; doubles each epoch without a drawn retrace.",124142
"maximum": 1000000,125143
"minimum": 0,126144
"type": "integer"127145
},128146
"volunteeredWeightPpm": {129147
"default": 500000,130148
"maximum": 1000000,131149
"minimum": 0,132150
"type": "integer"133151
},134152
"windowEpochs": {135153
"default": 24,136154
"description": "How long a drawn sponsor has to deliver.",137155
"minimum": 1,138156
"type": "integer"139157
}140158
},141159
"type": "object"142160
},143161
"flowBack": {144162
"properties": {145163
"capMultiple": {146164
"default": 5,147165
"description": "Flow-back is capped at this multiple of a stone's own credit.",148166
"minimum": 0,149167
"type": "integer"150168
},151169
"sharePpm": {152170
"default": 250000,153171
"maximum": 1000000,154172
"minimum": 0,155173
"type": "integer"156174
}157175
},158176
"type": "object"159177
},160178
"judge": {161179
"properties": {162180
"minJudges": {163181
"default": 1,164182
"minimum": 1,165183
"type": "integer"166184
},167185
"prompt": {168186
"ref": "org.cairnsproto.draft.defs#hash",169187
"type": "ref"170188
},171189
"schema": {172190
"ref": "org.cairnsproto.draft.defs#hash",173191
"type": "ref"174192
}175193
},176194
"required": [177195
"schema",178196
"prompt"179197
],180198
"type": "object"181199
},182200
"labeler": {183201
"properties": {184202
"did": {185203
"format": "did",186204
"type": "string"187205
},188206
"labels": {189207
"description": "Label values honored from this labeler, such as bad-actor, exclude, recheck, unsafe or tag:<name>.",190208
"items": {191209
"maxLength": 128,192210
"type": "string"193211
},194212
"maxLength": 64,195213
"minLength": 1,196214
"type": "array"197215
}198216
},199217
"required": [200218
"did",201219
"labels"202220
],203221
"type": "object"204222
},205223
"main": {206224
"description": "The rules that turn evidence into confidence and credit. A policy that extends another overrides only the fields it sets.",207225
"key": "tid",208226
"record": {209227
"properties": {210228
"activationDelay": {211229
"default": 24,212230
"description": "Epochs after a timekeeper first sees a version before additions to its executable surface take effect.",213231
"minimum": 0,214232
"type": "integer"215233
},216234
"blind": {217235
"default": false,218236
"description": "Payloads are timelock-encrypted to the round that closes the epoch.",219237
"type": "boolean"220238
},239
"calibration": {240
"description": "A per-setup weight curve from gold passes: each stone's model weight is multiplied by the weightPpm of the step with the most goldPasses its setup has reached. A setup below every step keeps full weight. Absent, gold scores only inform.",241
"items": {242
"ref": "#calibrationStep",243
"type": "ref"244
},245
"maxLength": 32,246
"type": "array"247
},221248
"canonicalizers": {222249
"items": {223250
"ref": "#canonicalizer",224251
"type": "ref"225252
},226253
"maxLength": 256,227254
"type": "array"228255
},229256
"confidence": {230257
"description": "Check that maps tallies to [low, high] per candidate. Absent means the built-in Beta-share interval.",231258
"ref": "com.atproto.repo.strongRef",232259
"type": "ref"233260
},234261
"createdAt": {235262
"format": "datetime",236263
"type": "string"237264
},238265
"credit": {239266
"ref": "#credit",240267
"type": "ref"241268
},242269
"deny": {243270
"description": "Weight 0 in this reading, including agents through sponsor links.",244271
"items": {245272
"format": "did",246273
"type": "string"247274
},248275
"maxLength": 10000,249276
"type": "array"250277
},278
"dormancy": {279
"default": 720,280
"description": "Epochs maintainer-only work may wait unanswered before the project is dormant.",281
"minimum": 1,282
"type": "integer"283
},251284
"draw": {252285
"ref": "#draw",253286
"type": "ref"254287
},255288
"escalation": {256289
"items": {257290
"format": "did",258291
"type": "string"259292
},260293
"maxLength": 64,261294
"type": "array"262295
},263296
"extends": {264297
"ref": "com.atproto.repo.strongRef",265298
"type": "ref"266299
},267300
"judges": {268301
"items": {269302
"ref": "#judge",270303
"type": "ref"271304
},272305
"maxLength": 64,273306
"type": "array"274307
},275308
"labelers": {276309
"description": "Labelers the policy trusts, and which of each one's labels it honors with their standard effects.",277310
"items": {278311
"ref": "#labeler",279312
"type": "ref"280313
},281314
"maxLength": 64,282315
"type": "array"283316
},317
"mergeOrgs": {318
"default": false,319
"description": "Members of one organization count as one sponsor: draws are keyed on the org, an org with a stone at a site can't be drawn for it, and agreeing reads from its members count once. Orgs that share a member count as one.",320
"type": "boolean"321
},284322
"models": {285323
"ref": "#models",286324
"type": "ref"287325
},288326
"nullSampling": {289327
"ref": "#nullSampling",290328
"type": "ref"291329
},292330
"priorities": {293331
"items": {294332
"ref": "#priority",295333
"type": "ref"296334
},297335
"maxLength": 1024,298336
"type": "array"299337
},300338
"requiredChecks": {301339
"description": "A candidate that fails a required check has a low bound of 0.",302340
"items": {303341
"ref": "com.atproto.repo.strongRef",304342
"type": "ref"305343
},306344
"maxLength": 64,307345
"type": "array"308346
},309347
"retraceBudget": {310348
"default": 3,311349
"description": "Automatic retraces per site. A new distinct value schedules more.",312350
"minimum": 0,313351
"type": "integer"314352
},353
"snapshotCadence": {354
"description": "Epochs a maintainer may go without a snapshot while the values past the export bar differ from the latest snapshot's. Absent, snapshots are never due.",355
"minimum": 1,356
"type": "integer"357
},315358
"thresholds": {316359
"ref": "#thresholds",317360
"type": "ref"318361
},319362
"timekeepers": {320363
"items": {321364
"format": "did",322365
"type": "string"323366
},324367
"maxLength": 16,325368
"type": "array"326369
}327370
},328371
"required": [329372
"createdAt"330373
],331374
"type": "object"332375
},333376
"type": "record"334377
},335378
"modelWeight": {336379
"properties": {337380
"family": {338381
"maxLength": 256,339382
"type": "string"340383
},341384
"thinking": {342385
"items": {343386
"maxLength": 64,344387
"type": "string"345388
},346389
"maxLength": 16,347390
"type": "array"348391
},349392
"versions": {350393
"items": {351394
"maxLength": 128,352395
"type": "string"353396
},354397
"maxLength": 64,355398
"type": "array"356399
},357400
"weightPpm": {358401
"maximum": 1000000,359402
"minimum": 0,360403
"type": "integer"361404
}362405
},363406
"required": [364407
"family",365408
"weightPpm"366409
],367410
"type": "object"368411
},369412
"models": {370413
"properties": {371414
"accept": {372415
"items": {373416
"ref": "#modelWeight",374417
"type": "ref"375418
},376419
"maxLength": 256,377420
"type": "array"378421
},379422
"defaultWeightPpm": {380423
"default": 0,381424
"description": "Weight for stones from unlisted models.",382425
"maximum": 1000000,383426
"minimum": 0,384427
"type": "integer"385428
},386429
"sameSetupWeightPpm": {387430
"default": 1000000,388431
"description": "Extra weight on each agreeing read beyond the first from one setup (model, modelVersion and config hash) at a site.",389432
"maximum": 1000000,390433
"minimum": 0,391434
"type": "integer"392435
}393436
},394437
"type": "object"395438
},396439
"nullSampling": {397440
"description": "Sampling for nulls without segments: initialPpm at first, then sampleNumerator/n after n passes, never below floorPpm.",398441
"properties": {399442
"floorPpm": {400443
"default": 100000,401444
"maximum": 1000000,402445
"minimum": 0,403446
"type": "integer"404447
},405448
"initialPpm": {406449
"default": 1000000,407450
"maximum": 1000000,408451
"minimum": 0,409452
"type": "integer"410453
},411454
"poolClearSamples": {412455
"default": 60,413456
"description": "Passing samples that clear a pool for final credit.",414457
"minimum": 1,415458
"type": "integer"416459
},417460
"sampleNumerator": {418461
"default": 3,419462
"minimum": 1,420463
"type": "integer"421464
}422465
},423466
"type": "object"424467
},425468
"priority": {426469
"properties": {427470
"need": {428471
"description": "Relative need. Weights routing and placement credit.",429472
"minimum": 0,430473
"type": "integer"431474
},432475
"selector": {433476
"refs": [434477
"#courseSelector",435478
"#siteSelector"436479
],437480
"type": "union"438481
}439482
},440483
"required": [441484
"selector",442485
"need"443486
],444487
"type": "object"445488
},446489
"siteSelector": {447490
"properties": {448491
"site": {449492
"description": "Site key.",450493
"ref": "org.cairnsproto.draft.defs#hash",451494
"type": "ref"452495
}453496
},454497
"required": [455498
"site"456499
],457500
"type": "object"458501
},459502
"thresholds": {460503
"description": "Bars on the low bound of the leading candidate's interval.",461504
"properties": {462505
"exportPpm": {463506
"default": 950000,464507
"maximum": 1000000,465508
"minimum": 0,466509
"type": "integer"467510
},468511
"finalizeCreditPpm": {469512
"default": 900000,470513
"maximum": 1000000,471514
"minimum": 0,472515
"type": "integer"473516
},474517
"minFamilies": {475518
"default": 1,476519
"description": "Model families a candidate's agreeing reads must come from before it clears the open-children or export bar. A read that declares no model is a family of its own sponsor.",477520
"minimum": 1,478521
"type": "integer"479522
},480523
"openChildrenPpm": {481524
"default": 800000,482525
"maximum": 1000000,483526
"minimum": 0,484527
"type": "integer"485528
},486529
"stopRoutingPpm": {487530
"default": 990000,488531
"maximum": 1000000,489532
"minimum": 0,490533
"type": "integer"491534
}492535
},493536
"type": "object"494537
}495538
},496539
"description": "Fractions are parts per million (0 to 1000000).",497540
"id": "org.cairnsproto.draft.policy",498541
"lexicon": 1499542
}