id.sifa.profile.position
Schema Diff
+90 -24
Compatibility Analysis
Breaking Changes Detected
5 breaking changes, 20 non-breaking changes.
Breaking Changes (5)
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "id.sifa.profile.position:body", src: "id.sifa.profile.position:body", tgt: "id.sifa.profile.position:body.company", kind: "prop", name: Some("company") }
- RemovedVertex RemovedVertex { vertex_id: "com.atproto.repo.strongRef" }
- RemovedEdge RemovedEdge { src: "id.sifa.profile.position:body.skills:items", tgt: "com.atproto.repo.strongRef", kind: "ref", name: None }
- ConstraintTightened ConstraintTightened { vertex_id: "id.sifa.profile.position:body.employmentType", sort: "knownValues", old_value: "[\"id.sifa.defs#fullTime\",\"id.sifa.defs#partTime\",\"id.sifa.defs#contract\",\"id.sifa.defs#freelance\",\"id.sifa.defs#internship\",\"id.sifa.defs#apprenticeship\",\"id.sifa.defs#volunteer\",\"id.sifa.defs#selfEmployed\"]", new_value: "[\"id.sifa.defs#fullTime\",\"id.sifa.defs#partTime\",\"id.sifa.defs#temporary\",\"id.sifa.defs#seasonal\",\"id.sifa.defs#contract\",\"id.sifa.defs#freelance\",\"id.sifa.defs#selfEmployed\",\"id.sifa.defs#independentWork\",\"id.sifa.defs#internship\",\"id.sifa.defs#apprenticeship\",\"id.sifa.defs#fellowship\",\"id.sifa.defs#trainee\",\"id.sifa.defs#volunteer\",\"id.sifa.defs#boardMember\",\"id.sifa.defs#boardObserver\",\"id.sifa.defs#advisor\"]" }
- ConstraintTightened ConstraintTightened { vertex_id: "id.sifa.profile.position:body.skills:items", sort: "ref", old_value: "com.atproto.repo.strongRef", new_value: "id.sifa.defs#skillRef" }
Non-Breaking Changes (20)
- AddedVertex AddedVertex { vertex_id: "id.sifa.defs#agentRef" }
- AddedVertex AddedVertex { vertex_id: "id.sifa.defs#skillRef" }
- AddedVertex AddedVertex { vertex_id: "id.sifa.profile.position:body.agentRef" }
- AddedVertex AddedVertex { vertex_id: "id.sifa.profile.position:body.entityRef" }
- AddedVertex AddedVertex { vertex_id: "id.sifa.profile.position:body.onBehalfOf" }
- AddedVertex AddedVertex { vertex_id: "id.sifa.profile.position:body.onBehalfOfDid" }
- AddedVertex AddedVertex { vertex_id: "id.sifa.profile.position:body.onBehalfOfEntityRef" }
- AddedEdge AddedEdge { src: "id.sifa.profile.position:body", tgt: "id.sifa.profile.position:body.agentRef", kind: "prop", name: Some("agentRef") }
- AddedEdge AddedEdge { src: "id.sifa.profile.position:body", tgt: "id.sifa.profile.position:body.entityRef", kind: "prop", name: Some("entityRef") }
- AddedEdge AddedEdge { src: "id.sifa.profile.position:body", tgt: "id.sifa.profile.position:body.onBehalfOf", kind: "prop", name: Some("onBehalfOf") }
- AddedEdge AddedEdge { src: "id.sifa.profile.position:body", tgt: "id.sifa.profile.position:body.onBehalfOfDid", kind: "prop", name: Some("onBehalfOfDid") }
- AddedEdge AddedEdge { src: "id.sifa.profile.position:body", tgt: "id.sifa.profile.position:body.onBehalfOfEntityRef", kind: "prop", name: Some("onBehalfOfEntityRef") }
- AddedEdge AddedEdge { src: "id.sifa.profile.position:body.agentRef", tgt: "id.sifa.defs#agentRef", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "id.sifa.profile.position:body.skills:items", tgt: "id.sifa.defs#skillRef", kind: "ref", name: None }
- ConstraintRelaxed ConstraintRelaxed { vertex_id: "id.sifa.profile.position:body.company", sort: "maxLength", old_value: "1000", new_value: "2560" }
- ConstraintRelaxed ConstraintRelaxed { vertex_id: "id.sifa.profile.position:body.company", sort: "maxGraphemes", old_value: "100", new_value: "256" }
- ConstraintRelaxed ConstraintRelaxed { vertex_id: "id.sifa.profile.position:body.title", sort: "maxGraphemes", old_value: "100", new_value: "256" }
- ConstraintRelaxed ConstraintRelaxed { vertex_id: "id.sifa.profile.position:body.title", sort: "maxLength", old_value: "1000", new_value: "2560" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "id.sifa.profile.position:body.endedAt", sort: "format" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "id.sifa.profile.position:body.startedAt", sort: "format" }
Migration Guidance
Removed Elements
RemovedVertex { vertex_id: "com.atproto.repo.strongRef" }
Added Elements
AddedVertex { vertex_id: "id.sifa.defs#agentRef" }AddedVertex { vertex_id: "id.sifa.defs#skillRef" }AddedVertex { vertex_id: "id.sifa.profile.position:body.agentRef" }AddedVertex { vertex_id: "id.sifa.profile.position:body.entityRef" }AddedVertex { vertex_id: "id.sifa.profile.position:body.onBehalfOf" }AddedVertex { vertex_id: "id.sifa.profile.position:body.onBehalfOfDid" }AddedVertex { vertex_id: "id.sifa.profile.position:body.onBehalfOfEntityRef" }
Constraint Changes
- ConstraintTightened ConstraintTightened { vertex_id: "id.sifa.profile.position:body.employmentType", sort: "knownValues", old_value: "[\"id.sifa.defs#fullTime\",\"id.sifa.defs#partTime\",\"id.sifa.defs#contract\",\"id.sifa.defs#freelance\",\"id.sifa.defs#internship\",\"id.sifa.defs#apprenticeship\",\"id.sifa.defs#volunteer\",\"id.sifa.defs#selfEmployed\"]", new_value: "[\"id.sifa.defs#fullTime\",\"id.sifa.defs#partTime\",\"id.sifa.defs#temporary\",\"id.sifa.defs#seasonal\",\"id.sifa.defs#contract\",\"id.sifa.defs#freelance\",\"id.sifa.defs#selfEmployed\",\"id.sifa.defs#independentWork\",\"id.sifa.defs#internship\",\"id.sifa.defs#apprenticeship\",\"id.sifa.defs#fellowship\",\"id.sifa.defs#trainee\",\"id.sifa.defs#volunteer\",\"id.sifa.defs#boardMember\",\"id.sifa.defs#boardObserver\",\"id.sifa.defs#advisor\"]" }
- ConstraintTightened ConstraintTightened { vertex_id: "id.sifa.profile.position:body.skills:items", sort: "ref", old_value: "com.atproto.repo.strongRef", new_value: "id.sifa.defs#skillRef" }
- ConstraintRelaxed ConstraintRelaxed { vertex_id: "id.sifa.profile.position:body.company", sort: "maxLength", old_value: "1000", new_value: "2560" }
- ConstraintRelaxed ConstraintRelaxed { vertex_id: "id.sifa.profile.position:body.company", sort: "maxGraphemes", old_value: "100", new_value: "256" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "id.sifa.profile.position:body.endedAt", sort: "format" }
- ConstraintRelaxed ConstraintRelaxed { vertex_id: "id.sifa.profile.position:body.title", sort: "maxGraphemes", old_value: "100", new_value: "256" }
- ConstraintRelaxed ConstraintRelaxed { vertex_id: "id.sifa.profile.position:body.title", sort: "maxLength", old_value: "1000", new_value: "2560" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "id.sifa.profile.position:body.startedAt", sort: "format" }
Additional Notes
- Breaking: RequiredEdgeRemoved { vertex_id: "id.sifa.profile.position:body", src: "id.sifa.profile.position:body", tgt: "id.sifa.profile.position:body.company", kind: "prop", name: Some("company") }
- Breaking: RemovedEdge { src: "id.sifa.profile.position:body.skills:items", tgt: "com.atproto.repo.strongRef", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "id.sifa.profile.position:body", tgt: "id.sifa.profile.position:body.agentRef", kind: "prop", name: Some("agentRef") }
- Non-breaking: AddedEdge { src: "id.sifa.profile.position:body", tgt: "id.sifa.profile.position:body.entityRef", kind: "prop", name: Some("entityRef") }
- Non-breaking: AddedEdge { src: "id.sifa.profile.position:body", tgt: "id.sifa.profile.position:body.onBehalfOf", kind: "prop", name: Some("onBehalfOf") }
- Non-breaking: AddedEdge { src: "id.sifa.profile.position:body", tgt: "id.sifa.profile.position:body.onBehalfOfDid", kind: "prop", name: Some("onBehalfOfDid") }
- Non-breaking: AddedEdge { src: "id.sifa.profile.position:body", tgt: "id.sifa.profile.position:body.onBehalfOfEntityRef", kind: "prop", name: Some("onBehalfOfEntityRef") }
- Non-breaking: AddedEdge { src: "id.sifa.profile.position:body.agentRef", tgt: "id.sifa.defs#agentRef", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "id.sifa.profile.position:body.skills:items", tgt: "id.sifa.defs#skillRef", kind: "ref", name: None }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"main": {
5
5
"description": "Record representing a single work position or role.",
6
6
"key": "tid",
7
7
"record": {
8
8
"properties": {
9
+
"agentRef": {
10
+
"description": "The employer, as a single nested reference mirroring the flat company / companyDid / entityRef fields. Additive dual-write: the flat fields remain the source of truth for existing consumers.",
11
+
"ref": "id.sifa.defs#agentRef",
12
+
"type": "ref"
13
+
},
9
14
"company": {
10
-
"description": "Company or organization name.",
11
-
"maxGraphemes": 100,
12
-
"maxLength": 1000,
15
+
"description": "Organization name. Optional: omit for self-employed, freelance, contract, or independent work that has no separately named or registered entity.",
16
+
"maxGraphemes": 256,
17
+
"maxLength": 2560,
13
18
"minLength": 1,
14
-
"type": "string"
19
+
"type": "string",
20
+
"x-skos:exactMatch": [
21
+
"org:organization",
22
+
"schema:worksFor"
23
+
]
15
24
},
16
25
"companyDid": {
17
-
"description": "DID of the company's ATproto account, if one exists. Enables verified company linking.",
26
+
"description": "DID of the organization's ATproto account, if one exists. Enables verified organization linking.",
18
27
"format": "did",
19
28
"type": "string"
20
29
},
21
30
"createdAt": {
22
31
"description": "Client-declared timestamp when this record was originally created.",
23
32
"format": "datetime",
24
33
"type": "string"
25
34
},
26
35
"description": {
27
36
"description": "Description of responsibilities, achievements, and duties.",
28
37
"maxGraphemes": 5000,
29
38
"maxLength": 50000,
30
-
"type": "string"
39
+
"type": "string",
40
+
"x-skos:exactMatch": [
41
+
"dcterms:description"
42
+
]
31
43
},
32
44
"employmentType": {
33
45
"description": "Type of employment (full-time, part-time, contract, etc.).",
34
46
"knownValues": [
35
47
"id.sifa.defs#fullTime",
36
48
"id.sifa.defs#partTime",
49
+
"id.sifa.defs#temporary",
50
+
"id.sifa.defs#seasonal",
37
51
"id.sifa.defs#contract",
38
52
"id.sifa.defs#freelance",
53
+
"id.sifa.defs#selfEmployed",
54
+
"id.sifa.defs#independentWork",
39
55
"id.sifa.defs#internship",
40
56
"id.sifa.defs#apprenticeship",
57
+
"id.sifa.defs#fellowship",
58
+
"id.sifa.defs#trainee",
41
59
"id.sifa.defs#volunteer",
42
-
"id.sifa.defs#selfEmployed"
60
+
"id.sifa.defs#boardMember",
61
+
"id.sifa.defs#boardObserver",
62
+
"id.sifa.defs#advisor"
63
+
],
64
+
"type": "string",
65
+
"x-skos:closeMatch": [
66
+
"schema:employmentType"
43
67
],
44
-
"type": "string"
68
+
"x-skos:note": "schema:employmentType is free text. ESCO is the better value anchor."
45
69
},
46
70
"endedAt": {
47
-
"description": "End date of the position. Omit if this is a current position.",
48
-
"format": "datetime",
49
-
"type": "string"
71
+
"description": "End date of the position in YYYY-MM or YYYY-MM-DD format. Omit if this is a current position.",
72
+
"type": "string",
73
+
"x-skos:exactMatch": [
74
+
"schema:endDate"
75
+
]
76
+
},
77
+
"entityRef": {
78
+
"description": "Portable, app-neutral identifier for the organization the user selected from a resolver dropdown: a Wikidata Q-ID URI (http://www.wikidata.org/entity/Q...), a ROR URI, or an LEI URI. Enables deterministic resolution to a canonical entity even before the org claims an ATproto account. Absent for free-text or independent/self-employed positions.",
79
+
"format": "uri",
80
+
"type": "string",
81
+
"x-skos:closeMatch": [
82
+
"schema:sameAs"
83
+
]
50
84
},
51
85
"isPrimary": {
52
86
"description": "Whether this is the user's primary current position, displayed on the identity card.",
53
87
"type": "boolean"
54
88
},
55
89
"labels": {
56
90
"description": "Self-label values for this position record.",
57
91
"refs": [
58
92
"com.atproto.label.defs#selfLabels"
59
93
],
60
94
"type": "union"
61
95
},
62
96
"location": {
63
-
"description": "Work location. Uses community location lexicon.",
97
+
"description": "Work location. Sifa enforces ISO 3166-1 alpha-2 country codes at the app layer.",
64
98
"ref": "community.lexicon.location.address",
65
-
"type": "ref"
99
+
"type": "ref",
100
+
"x-skos:exactMatch": [
101
+
"schema:jobLocation"
102
+
]
66
103
},
104
+
"onBehalfOf": {
105
+
"description": "Name of the party this role is held on behalf of, when the person represents someone else — most often a fund whose board seat this is. A disclosure, not a role type. Omit for independent seats.",
106
+
"maxGraphemes": 256,
107
+
"maxLength": 2560,
108
+
"type": "string"
109
+
},
110
+
"onBehalfOfDid": {
111
+
"description": "DID of the represented party's ATproto account, if one exists. May resolve to an organization or to a person (e.g. a family-office principal).",
112
+
"format": "did",
113
+
"type": "string"
114
+
},
115
+
"onBehalfOfEntityRef": {
116
+
"description": "Portable, app-neutral identifier for the represented party selected from a resolver dropdown: a Wikidata Q-ID URI, a ROR URI, or an LEI URI. Absent for free-text entries.",
117
+
"format": "uri",
118
+
"type": "string"
119
+
},
67
120
"skills": {
68
-
"description": "Skills used in this position. Each entry is a strongRef to an id.sifa.profile.skill record owned by the same DID.",
121
+
"description": "Skills used in this position. Each entry is a URI reference to an id.sifa.profile.skill record owned by the same DID.",
69
122
"items": {
70
-
"ref": "com.atproto.repo.strongRef",
123
+
"ref": "id.sifa.defs#skillRef",
71
124
"type": "ref"
72
125
},
73
126
"maxLength": 50,
74
127
"type": "array"
75
128
},
76
129
"startedAt": {
77
-
"description": "Start date of the position. For month-precision imports, use first day of month at midnight UTC.",
78
-
"format": "datetime",
79
-
"type": "string"
130
+
"description": "Start date of the position in YYYY-MM or YYYY-MM-DD format.",
131
+
"type": "string",
132
+
"x-skos:exactMatch": [
133
+
"schema:startDate"
134
+
]
80
135
},
81
136
"title": {
82
137
"description": "Job title or role name.",
83
-
"maxGraphemes": 100,
84
-
"maxLength": 1000,
138
+
"maxGraphemes": 256,
139
+
"maxLength": 2560,
85
140
"minLength": 1,
86
-
"type": "string"
141
+
"type": "string",
142
+
"x-skos:exactMatch": [
143
+
"org:role",
144
+
"schema:roleName"
145
+
]
87
146
},
88
147
"workplaceType": {
89
148
"description": "Workplace arrangement (on-site, remote, hybrid).",
90
149
"knownValues": [
91
150
"id.sifa.defs#onSite",
92
151
"id.sifa.defs#remote",
93
152
"id.sifa.defs#hybrid"
94
153
],
95
-
"type": "string"
154
+
"type": "string",
155
+
"x-skos:narrowMatch": [
156
+
"schema:jobLocationType"
157
+
],
158
+
"x-skos:note": "schema.org models only a remote flag; Sifa distinguishes onSite, remote, and hybrid."
96
159
}
97
160
},
98
161
"required": [
99
-
"company",
100
162
"title",
101
163
"startedAt",
102
164
"createdAt"
103
165
],
104
166
"type": "object"
105
167
},
106
-
"type": "record"
168
+
"type": "record",
169
+
"x-skos:closeMatch": [
170
+
"org:Membership",
171
+
"schema:OrganizationRole"
172
+
]
107
173
}
108
174
},
109
175
"description": "A work experience entry in the user's professional profile.",
110
176
"id": "id.sifa.profile.position",
111
177
"lexicon": 1
112
178
}