id.sifa.profile.position

sifa.id

Schema Diff

+77 -16

From

CID
bafyreiei6d5sb2w...
Indexed At
2026-03-27 23:46 UTC
View this version

To

CID
bafyreibdrpq3ag4...
Indexed At
2026-08-07 11:35 UTC
View this version

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
}

Compare Other Versions

Lexicon Garden

@