xyz.quasigod.lab.letta.lock
Schema Diff
+29 -23
Compatibility Analysis
Breaking Changes Detected
10 breaking changes, 5 non-breaking changes.
Breaking Changes (10)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.lock:body", src: "xyz.quasigod.lab.letta.lock:body", tgt: "xyz.quasigod.lab.letta.lock:body.nonce", kind: "prop", name: Some("nonce") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.lock:body", src: "xyz.quasigod.lab.letta.lock:body", tgt: "xyz.quasigod.lab.letta.lock:body.expiresAt", kind: "prop", name: Some("expiresAt") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.lock:body", src: "xyz.quasigod.lab.letta.lock:body", tgt: "xyz.quasigod.lab.letta.lock:body.holder", kind: "prop", name: Some("holder") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.lock", src: "xyz.quasigod.lab.letta.lock", tgt: "xyz.quasigod.lab.letta.lock.nonce", kind: "prop", name: Some("nonce") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.lock", src: "xyz.quasigod.lab.letta.lock", tgt: "xyz.quasigod.lab.letta.lock.holder", kind: "prop", name: Some("holder") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.lock", src: "xyz.quasigod.lab.letta.lock", tgt: "xyz.quasigod.lab.letta.lock.expiresAt", kind: "prop", name: Some("expiresAt") }
- RemovedVertex RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.lock.expiresAt" }
- RemovedVertex RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.lock.holder" }
- RemovedVertex RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.lock.nonce" }
- KindChanged KindChanged { vertex_id: "xyz.quasigod.lab.letta.lock", old_kind: "object", new_kind: "record" }
Non-Breaking Changes (5)
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.lock:body" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.lock:body.expiresAt" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.lock:body.holder" }
- AddedVertex AddedVertex { vertex_id: "xyz.quasigod.lab.letta.lock:body.nonce" }
- AddedEdge AddedEdge { src: "xyz.quasigod.lab.letta.lock", tgt: "xyz.quasigod.lab.letta.lock:body", kind: "record-schema", name: None }
Migration Guidance
Removed Elements
RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.lock.expiresAt" }RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.lock.holder" }RemovedVertex { vertex_id: "xyz.quasigod.lab.letta.lock.nonce" }
Added Elements
AddedVertex { vertex_id: "xyz.quasigod.lab.letta.lock:body" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.lock:body.expiresAt" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.lock:body.holder" }AddedVertex { vertex_id: "xyz.quasigod.lab.letta.lock:body.nonce" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.lock:body", src: "xyz.quasigod.lab.letta.lock:body", tgt: "xyz.quasigod.lab.letta.lock:body.nonce", kind: "prop", name: Some("nonce") }
- Breaking: RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.lock:body", src: "xyz.quasigod.lab.letta.lock:body", tgt: "xyz.quasigod.lab.letta.lock:body.expiresAt", kind: "prop", name: Some("expiresAt") }
- Breaking: RequiredEdgeAdded { vertex_id: "xyz.quasigod.lab.letta.lock:body", src: "xyz.quasigod.lab.letta.lock:body", tgt: "xyz.quasigod.lab.letta.lock:body.holder", kind: "prop", name: Some("holder") }
- Breaking: RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.lock", src: "xyz.quasigod.lab.letta.lock", tgt: "xyz.quasigod.lab.letta.lock.nonce", kind: "prop", name: Some("nonce") }
- Breaking: RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.lock", src: "xyz.quasigod.lab.letta.lock", tgt: "xyz.quasigod.lab.letta.lock.holder", kind: "prop", name: Some("holder") }
- Breaking: RequiredEdgeRemoved { vertex_id: "xyz.quasigod.lab.letta.lock", src: "xyz.quasigod.lab.letta.lock", tgt: "xyz.quasigod.lab.letta.lock.expiresAt", kind: "prop", name: Some("expiresAt") }
- Breaking: KindChanged { vertex_id: "xyz.quasigod.lab.letta.lock", old_kind: "object", new_kind: "record" }
- Non-breaking: AddedEdge { src: "xyz.quasigod.lab.letta.lock", tgt: "xyz.quasigod.lab.letta.lock:body", kind: "record-schema", name: None }
1
1
{
2
2
"id": "xyz.quasigod.lab.letta.lock",
3
3
"defs": {
4
4
"main": {
5
-
"type": "object",
6
-
"required": [
7
-
"holder",
8
-
"nonce",
9
-
"expiresAt"
10
-
],
11
-
"properties": {
12
-
"nonce": {
13
-
"type": "string",
14
-
"maxLength": 64,
15
-
"description": "Random value proving ownership; read back to confirm."
16
-
},
17
-
"holder": {
18
-
"type": "string",
19
-
"maxLength": 256,
20
-
"description": "Identifier of the backend instance holding the lock."
21
-
},
22
-
"expiresAt": {
23
-
"type": "string",
24
-
"format": "datetime",
25
-
"description": "TTL deadline; expired locks are treated as absent."
5
+
"key": "literal:self",
6
+
"type": "record",
7
+
"record": {
8
+
"type": "object",
9
+
"required": [
10
+
"holder",
11
+
"nonce",
12
+
"expiresAt"
13
+
],
14
+
"properties": {
15
+
"nonce": {
16
+
"type": "string",
17
+
"maxLength": 64,
18
+
"description": "Random value proving ownership; read back to confirm the holder is still the writer before releasing."
19
+
},
20
+
"holder": {
21
+
"type": "string",
22
+
"maxLength": 256,
23
+
"description": "Identifier of the backend instance holding the lock."
24
+
},
25
+
"expiresAt": {
26
+
"type": "string",
27
+
"format": "datetime",
28
+
"description": "TTL deadline. A lock past its deadline is treated as a crashed writer and stolen."
29
+
}
26
30
}
27
-
}
31
+
},
32
+
"description": "Held-writer lock record. Writers coordinate through this record: acquire (put), work, release (delete); an expired lock is stolen by the next writer. This is the in-process fast-path guard; cross-device safety against stray concurrent writes comes from per-record CAS (swapRecord) on data records."
28
33
}
29
34
},
30
35
"$type": "com.atproto.lexicon.schema",
31
-
"lexicon": 1
36
+
"lexicon": 1,
37
+
"description": "Advisory single-writer lock for the space. One instance per space, fixed rkey `self`."
32
38
}