From
bafyreiedw4i6nacyoxjnvm4umm4vql4ugyneybguk7qhehgtu2xecx35lm
indexed 2026-11-07 05:41 UTC
View this version
To
bafyreifuvrfzu7wy6fzmbxczu6mhavqdfphu4tlmbrv2larjsyikferm2a
indexed 2026-11-08 04:54 UTC
View this version
Compatibility
breaking 2 breaking changes, 13 non-breaking changes.
Breaking changes (2)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "dev.knotless.getMergeStatus#autoMerge", src: "dev.knotless.getMergeStatus#autoMerge", tgt: "dev.knotless.getMergeStatus#autoMerge.by", kind: "prop", name: Some("by") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "dev.knotless.getMergeStatus#autoMerge", src: "dev.knotless.getMergeStatus#autoMerge", tgt: "dev.knotless.getMergeStatus#autoMerge.state", kind: "prop", name: Some("state") }
Non-breaking changes (13)
- AddedVertex AddedVertex { vertex_id: "dev.knotless.defs#actorView" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.getMergeStatus#autoMerge" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.getMergeStatus#autoMerge.by" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.getMergeStatus#autoMerge.pushedBy" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.getMergeStatus#autoMerge.state" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.getMergeStatus#permissions.autoMerge" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.autoMerge" }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus#autoMerge", tgt: "dev.knotless.getMergeStatus#autoMerge.pushedBy", kind: "prop", name: Some("pushedBy") }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus#autoMerge.by", tgt: "dev.knotless.defs#actorView", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus#autoMerge.pushedBy", tgt: "dev.knotless.defs#actorView", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus#permissions", tgt: "dev.knotless.getMergeStatus#permissions.autoMerge", kind: "prop", name: Some("autoMerge") }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus:output", tgt: "dev.knotless.getMergeStatus:output.autoMerge", kind: "prop", name: Some("autoMerge") }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus:output.autoMerge", tgt: "dev.knotless.getMergeStatus#autoMerge", kind: "ref", name: None }
Migration guidance
Added
AddedVertex { vertex_id: "dev.knotless.defs#actorView" }AddedVertex { vertex_id: "dev.knotless.getMergeStatus#autoMerge" }AddedVertex { vertex_id: "dev.knotless.getMergeStatus#autoMerge.by" }AddedVertex { vertex_id: "dev.knotless.getMergeStatus#autoMerge.pushedBy" }AddedVertex { vertex_id: "dev.knotless.getMergeStatus#autoMerge.state" }AddedVertex { vertex_id: "dev.knotless.getMergeStatus#permissions.autoMerge" }AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.autoMerge" }
Notes
- Breaking: RequiredEdgeAdded { vertex_id: "dev.knotless.getMergeStatus#autoMerge", src: "dev.knotless.getMergeStatus#autoMerge", tgt: "dev.knotless.getMergeStatus#autoMerge.by", kind: "prop", name: Some("by") }
- Breaking: RequiredEdgeAdded { vertex_id: "dev.knotless.getMergeStatus#autoMerge", src: "dev.knotless.getMergeStatus#autoMerge", tgt: "dev.knotless.getMergeStatus#autoMerge.state", kind: "prop", name: Some("state") }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus#autoMerge", tgt: "dev.knotless.getMergeStatus#autoMerge.pushedBy", kind: "prop", name: Some("pushedBy") }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus#autoMerge.by", tgt: "dev.knotless.defs#actorView", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus#autoMerge.pushedBy", tgt: "dev.knotless.defs#actorView", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus#permissions", tgt: "dev.knotless.getMergeStatus#permissions.autoMerge", kind: "prop", name: Some("autoMerge") }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus:output", tgt: "dev.knotless.getMergeStatus:output.autoMerge", kind: "prop", name: Some("autoMerge") }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus:output.autoMerge", tgt: "dev.knotless.getMergeStatus#autoMerge", kind: "ref", name: None }
Changes
11
{22
"$type": "com.atproto.lexicon.schema",33
"defs": {4
"autoMerge": {5
"description": "Where the pull's merge when checks pass stands, if it was ever set and not cancelled by someone: a runner the repository names merges it once it would merge.",6
"properties": {7
"by": {8
"description": "Who set it.",9
"ref": "dev.knotless.defs#actorView",10
"type": "ref"11
},12
"pushedBy": {13
"description": "For pushed, the owner of the head repository pushed to.",14
"ref": "dev.knotless.defs#actorView",15
"type": "ref"16
},17
"state": {18
"description": "set while it stands; pushed once someone who may not merge it pushed to its head since, and retargeted once it moved to another branch, either of which cancels it.",19
"knownValues": [20
"set",21
"pushed",22
"retargeted"23
],24
"type": "string"25
}26
},27
"required": [28
"state",29
"by"30
],31
"type": "object"32
},433
"conflict": {534
"description": "A file that both sides changed so that they do not merge.",635
"properties": {736
"path": {837
"description": "From the repository's root.",938
"type": "string"1039
}1140
},1241
"required": [1342
"path"1443
],1544
"type": "object"1645
},1746
"main": {1847
"description": "Whether an open pull can merge now, decided as `knotless pull merge` decides it, without merging: whether its head merges with its target branch as it is now, and, in a repository that names runners, whether each workflow that runs on it passed there. And what the account asking may do to it: merge it, queue it, retarget it or run its checks again. Requires the session cookie the pages' login sets, or a service token from the caller's PDS, audience the appview's DID, for this method.",1948
"errors": [2049
{2150
"description": "No such repository.",2251
"name": "NotFound"2352
},2453
{2554
"description": "No one asked: log in to the pages first.",2655
"name": "AuthenticationRequired"2756
}2857
],2958
"output": {3059
"encoding": "application/json",3160
"schema": {3261
"properties": {62
"autoMerge": {63
"ref": "#autoMerge",64
"type": "ref"65
},3366
"base": {3467
"description": "The commit its target branch is at, in hex.",3568
"type": "string"3669
},3770
"checks": {3871
"description": "Where its checks stand at its head merged with its base: pending for those not run there; none when the repository names no runners, so a merge waits for none, or when it conflicts.",3972
"knownValues": [4073
"passed",4174
"failed",4275
"running",4376
"pending",4477
"none"4578
],4679
"type": "string"4780
},4881
"codeOwnersWarnings": {4982
"description": "The lines of the target branch's CODEOWNERS file that were skipped, and why: one naming a team, say.",5083
"items": {5184
"ref": "#note",5285
"type": "ref"5386
},5487
"type": "array"5588
},5689
"conflicts": {5790
"description": "The files that conflict.",5891
"items": {5992
"ref": "#conflict",6093
"type": "ref"6194
},6295
"type": "array"6396
},6497
"deletes": {6598
"description": "Its head branch, which merging deletes unless asked to keep it.",6699
"type": "string"67100
},68101
"head": {69102
"description": "The commit its head branch is at, in hex.",70103
"type": "string"71104
},72105
"may": {73106
"ref": "#permissions",74107
"type": "ref"75108
},76109
"method": {77110
"description": "How it would merge: a merge commit naming the pull; into a branch protected as linear, one squashed commit. fastForward is no longer made.",78111
"knownValues": [79112
"fastForward",80113
"merge",81114
"squash"82115
],83116
"type": "string"84117
},85118
"queueBlocked": {86119
"description": "Why the merge queue would not land it yet, when this server knows: undelegated when no runner the repository names may push, so its queue lands through this server's gateway, and the owner has not delegated writes to it.",87120
"knownValues": [88121
"undelegated"89122
],90123
"type": "string"91124
},92125
"queueOnly": {93126
"description": "Its target branch takes pulls only through the merge queue: queue it with dev.knotless.queuePull, as dev.knotless.mergePull refuses it. Absent is false.",94127
"type": "boolean"95128
},96129
"reason": {97130
"description": "Why it cannot merge now, in the words a merge would refuse it with; and when the account asking may not merge it, that too.",98131
"type": "string"99132
},100133
"reviews": {101134
"description": "Where its reviews stand against what its target branch's rule asks of them (dev.knotless.repo#reviews): none when the rule asks nothing of them, or when it conflicts.",102135
"knownValues": [103136
"passed",104137
"blocked",105138
"none"106139
],107140
"type": "string"108141
},109142
"reviewsMissing": {110143
"description": "What its reviews lack, each as `knotless pull merge --check` lists it: `reviews 1 of 2`, `owners of web/: @alice or @bob`, `changes asked by @carol`.",111144
"items": {112145
"ref": "#note",113146
"type": "ref"114147
},115148
"type": "array"116149
},117150
"reviewsUncounted": {118151
"description": "The approvals that do not count toward its target branch's rule, and why: `@dan's approval does not count: only the owner's and collaborators' approvals count`, or one of an earlier head when only approvals of its head as it is now count.",119152
"items": {120153
"ref": "#note",121154
"type": "ref"122155
},123156
"type": "array"124157
},125158
"state": {126159
"description": "clean when it can merge now; conflicting when its head does not merge with its base; blocked when its checks have not all passed, or it is not reviewed as its target branch's rule asks; draft, whatever else holds, while its author has not marked it ready.",127160
"knownValues": [128161
"clean",129162
"conflicting",130163
"blocked",131164
"draft"132165
],133166
"type": "string"134167
}135168
},136169
"required": [137170
"state",138171
"checks",139172
"method",140173
"base",141174
"head",142175
"may"143176
],144177
"type": "object"145178
}146179
},147180
"parameters": {148181
"properties": {149182
"pull": {150183
"description": "The dev.knotless.pull record.",151184
"format": "at-uri",152185
"type": "string"153186
},154187
"repo": {155188
"description": "The repository's dev.knotless.repo record, as dev.knotless.getRepo takes it.",156189
"format": "at-uri",157190
"type": "string"158191
}159192
},160193
"required": [161194
"repo",162195
"pull"163196
],164197
"type": "params"165198
},166199
"type": "query"167200
},168201
"note": {169202
"description": "A line of text about the pull's reviews.",170203
"properties": {171204
"text": {172205
"description": "In plain words.",173206
"type": "string"174207
}175208
},176209
"required": [177210
"text"178211
],179212
"type": "object"180213
},181214
"permissions": {182215
"description": "What the account asking may do to the pull: what its part in the repository lets it do, not whether that would work now. state and reason say that: a merge refuses a blocked pull, the owner's merge too, unless the owner forces it.",183216
"properties": {217
"autoMerge": {218
"description": "Set it to merge by itself once its checks pass, with dev.knotless.setAutoMerge: those who may merge it, in a repository that names runners, into a branch with no merge queue. Cancelling that, those and its author may. Absent is false.",219
"type": "boolean"220
},184221
"base": {185222
"description": "Change its target branch: those who may close it.",186223
"type": "boolean"187224
},188225
"force": {189226
"description": "Merge it past its checks: the owner alone.",190227
"type": "boolean"191228
},192229
"head": {193230
"description": "Change its head branch: its author.",194231
"type": "boolean"195232
},196233
"merge": {197234
"description": "Merge it: the owner and collaborators.",198235
"type": "boolean"199236
},200237
"queue": {201238
"description": "Put it in the merge queue or take it out: those who may merge it, in a repository whose runners land a queue, while the branch it lands on takes pulls through the queue or it is already queued.",202239
"type": "boolean"203240
},204241
"rerun": {205242
"description": "Ask the runners to run its checks again: the owner, in a repository that names runners.",206243
"type": "boolean"207244
}208245
},209246
"required": [210247
"merge",211248
"force",212249
"queue",213250
"base",214251
"head",215252
"rerun"216253
],217254
"type": "object"218255
}219256
},220257
"description": "Whether an open pull can merge now, and what the account asking may do to it.",221258
"id": "dev.knotless.getMergeStatus",222259
"lexicon": 1223260
}