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