id.sifa.profile.position

sifa.id

Schema Diff

+76 -13

From

CID
bafyreiblguoexne...
Indexed At
2026-05-27 12:05 UTC
View this version

To

CID
bafyreiayjjm3mr5...
Indexed At
2026-09-29 09:12 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

2 breaking changes, 12 non-breaking changes.

Breaking Changes (2)
  • 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") }
  • 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#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\"]", 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 (12)
  • AddedVertex AddedVertex { vertex_id: "id.sifa.defs#agentRef" }
  • 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 }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "id.sifa.defs#agentRef" }
  • 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#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\"]", 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\"]" }

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") }
  • 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 }
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.",
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 -
            "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",
37 49
              "id.sifa.defs#temporary",
38 50
              "id.sifa.defs#seasonal",
39 51
              "id.sifa.defs#contract",
40 52
              "id.sifa.defs#freelance",
41 53
              "id.sifa.defs#selfEmployed",
42 54
              "id.sifa.defs#independentWork",
43 55
              "id.sifa.defs#internship",
44 56
              "id.sifa.defs#apprenticeship",
45 57
              "id.sifa.defs#fellowship",
46 58
              "id.sifa.defs#trainee",
47 -
              "id.sifa.defs#volunteer"
59 +
              "id.sifa.defs#volunteer",
60 +
              "id.sifa.defs#boardMember",
61 +
              "id.sifa.defs#boardObserver",
62 +
              "id.sifa.defs#advisor"
48 63
            ],
49 -
            "type": "string"
64 +
            "type": "string",
65 +
            "x-skos:closeMatch": [
66 +
              "schema:employmentType"
67 +
            ],
68 +
            "x-skos:note": "schema:employmentType is free text. ESCO is the better value anchor."
50 69
          },
51 70
          "endedAt": {
52 71
            "description": "End date of the position in YYYY-MM or YYYY-MM-DD format. Omit if this is a current position.",
53 -
            "type": "string"
72 +
            "type": "string",
73 +
            "x-skos:exactMatch": [
74 +
              "schema:endDate"
75 +
            ]
54 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 +
            ]
84 +
          },
55 85
          "isPrimary": {
56 86
            "description": "Whether this is the user's primary current position, displayed on the identity card.",
57 87
            "type": "boolean"
58 88
          },
59 89
          "labels": {
60 90
            "description": "Self-label values for this position record.",
61 91
            "refs": [
62 92
              "com.atproto.label.defs#selfLabels"
63 93
            ],
64 94
            "type": "union"
65 95
          },
66 96
          "location": {
67 97
            "description": "Work location. Sifa enforces ISO 3166-1 alpha-2 country codes at the app layer.",
68 98
            "ref": "community.lexicon.location.address",
69 -
            "type": "ref"
99 +
            "type": "ref",
100 +
            "x-skos:exactMatch": [
101 +
              "schema:jobLocation"
102 +
            ]
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"
70 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 +
          },
71 120
          "skills": {
72 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.",
73 122
            "items": {
74 123
              "ref": "id.sifa.defs#skillRef",
75 124
              "type": "ref"
76 125
            },
77 126
            "maxLength": 50,
78 127
            "type": "array"
79 128
          },
80 129
          "startedAt": {
81 130
            "description": "Start date of the position in YYYY-MM or YYYY-MM-DD format.",
82 -
            "type": "string"
131 +
            "type": "string",
132 +
            "x-skos:exactMatch": [
133 +
              "schema:startDate"
134 +
            ]
83 135
          },
84 136
          "title": {
85 137
            "description": "Job title or role name.",
86 138
            "maxGraphemes": 256,
87 139
            "maxLength": 2560,
88 140
            "minLength": 1,
89 -
            "type": "string"
141 +
            "type": "string",
142 +
            "x-skos:exactMatch": [
143 +
              "org:role",
144 +
              "schema:roleName"
145 +
            ]
90 146
          },
91 147
          "workplaceType": {
92 148
            "description": "Workplace arrangement (on-site, remote, hybrid).",
93 149
            "knownValues": [
94 150
              "id.sifa.defs#onSite",
95 151
              "id.sifa.defs#remote",
96 152
              "id.sifa.defs#hybrid"
97 153
            ],
98 -
            "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."
99 159
          }
100 160
        },
101 161
        "required": [
102 -
          "company",
103 162
          "title",
104 163
          "startedAt",
105 164
          "createdAt"
106 165
        ],
107 166
        "type": "object"
108 167
      },
109 -
      "type": "record"
168 +
      "type": "record",
169 +
      "x-skos:closeMatch": [
170 +
        "org:Membership",
171 +
        "schema:OrganizationRole"
172 +
      ]
110 173
    }
111 174
  },
112 175
  "description": "A work experience entry in the user's professional profile.",
113 176
  "id": "id.sifa.profile.position",
114 177
  "lexicon": 1
115 178
}

Compare Other Versions

Lexicon Garden

@