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