{
"id": "id.sifa.profile.involvement",
"defs": {
"main": {
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"kind",
"createdAt"
],
"properties": {
"kind": {
"type": "string",
"description": "The nature of the involvement. Drives the display heading (Open Source / Community / Volunteering / Civic).",
"knownValues": [
"id.sifa.defs#involvementOpenSource",
"id.sifa.defs#involvementCommunity",
"id.sifa.defs#involvementCharity",
"id.sifa.defs#involvementCivic",
"id.sifa.defs#involvementOther"
]
},
"role": {
"type": "string",
"maxLength": 2560,
"description": "The user's role (e.g. 'Maintainer', 'Translator', 'Organizer', 'Contributor').",
"maxGraphemes": 256
},
"links": {
"type": "array",
"items": {
"ref": "id.sifa.defs#artifactLink",
"type": "ref"
},
"maxLength": 50,
"description": "Public artifacts proving the involvement (PRs, releases, talk recordings, published translations)."
},
"labels": {
"refs": [
"com.atproto.label.defs#selfLabels"
],
"type": "union",
"description": "Self-label values for this record."
},
"skills": {
"type": "array",
"items": {
"ref": "id.sifa.defs#skillRef",
"type": "ref"
},
"maxLength": 50,
"description": "Skills demonstrated by this involvement. Each entry is a URI reference to an id.sifa.profile.skill record owned by the same DID."
},
"endedAt": {
"type": "string",
"description": "End date in YYYY-MM or YYYY-MM-DD format. Omit if ongoing."
},
"location": {
"ref": "community.lexicon.location.address",
"type": "ref",
"description": "Where the involvement takes place. Sifa enforces ISO 3166-1 alpha-2 country codes at the app layer."
},
"upstream": {
"type": "string",
"maxLength": 2560,
"description": "Name of the project, community, event, or cause (e.g. 'atproto', 'Linux kernel', 'PyCon NL'). Optional — a one-off contribution need not name an organization.",
"maxGraphemes": 256
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "Client-declared timestamp when this record was originally created."
},
"entityRef": {
"type": "string",
"format": "uri",
"description": "Portable, app-neutral identifier for the upstream 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 upstream claims an ATproto account. Absent for free-text or one-off entries."
},
"startedAt": {
"type": "string",
"description": "Start date in YYYY-MM or YYYY-MM-DD format. Freeform (NOT strict datetime) to allow partial dates and importer writes."
},
"description": {
"type": "string",
"maxLength": 50000,
"description": "What the user did and why it mattered.",
"maxGraphemes": 5000
},
"upstreamDid": {
"type": "string",
"format": "did",
"description": "DID of the upstream's ATproto account, if one exists."
},
"upstreamUrl": {
"type": "string",
"format": "uri",
"description": "Primary URL of the upstream (project homepage, repo, event site)."
}
}
},
"description": "Record representing one involvement — an ongoing role and/or a body of discrete contributions to a single upstream."
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1,
"description": "Uncompensated involvement with an external project, community, event, or cause the user does not own or run — open-source, community, charity, or civic work. Distinct from paid roles (position), things you own (project), and paid employment."
}