Community Event Model
This document defines the canonical community plane event schema for PTI v1.0 (community_event.v1).
Community events record Ubuntu-plane activity (credentials, endorsements, network connections, employment verification, programme milestones). They are not partner Trust Events (trust_event.v1). Producers MUST NOT mix community envelopes into connector TrustEvent timelines.
Normative language
The key words MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY, and OPTIONAL are to be interpreted as described in RFC 2119.
Event envelope
All community events MUST conform to the envelope below regardless of ingest channel (api, console, system, seed).
{
"schema_version": "community_event.v1",
"event_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"idempotency_key": "seed:wirepick:badge:42:community.credential.verified",
"event_type": "community.credential.verified",
"context_id": "lending",
"context_ids": ["lending", "employment"],
"affected_contexts": ["lending", "employment"],
"pti_id": "pti_JANEBRW1",
"producer_id": "seed:wirepick",
"actor_user_id": 1001,
"subject_user_id": 1002,
"occurred_at": "2026-08-01T10:00:00Z",
"ingested_at": "2026-08-01T10:00:02Z",
"ingest_channel": "seed",
"correlation_id": "req_community_9a8b",
"title": "Employment verified",
"subtitle": "",
"payload": {
"badge_id": "42",
"badge_type": "employment"
},
"status": "materialized",
"steps_json": [],
"corrects_event_id": null,
"retracts_event_id": null
}
Required envelope fields
| Field | Requirement |
|---|---|
schema_version | MUST be community_event.v1 for this specification |
event_id | MUST be a UUID; server MAY accept client-supplied values |
idempotency_key | MUST be unique per producer_id per logical community action |
event_type | MUST be registered in the community event catalog |
subject_user_id | MUST identify the member subject of the activity |
producer_id | MUST identify the writing system or seed cohort |
occurred_at | MUST reflect real-world activity time, not ingest time |
payload | MUST be a JSON object (type-specific keys MAY apply) |
Optional / derived fields
| Field | Requirement |
|---|---|
pti_id | SHOULD be resolved during process when a portable subject exists |
actor_user_id | MAY identify the acting user (issuer, endorser, verifier) |
context_id / context_ids / affected_contexts | SHOULD bind official trust-context slugs for hybrid lenses |
ingest_channel | MUST be one of api, console, system, seed when present |
correlation_id | MAY correlate request/trace identifiers |
title / subtitle | MAY supply display labels for attestation rails |
corrects_event_id / retracts_event_id | MAY link correction or retraction to a prior event |
seed_tag | MAY mark demo/seed cohorts for retract-and-reingest |
Separation from partner TrustEvent
| Concern | Partner (trust_event.v1) | Community (community_event.v1) |
|---|---|---|
| Store | TrustEvent / pti_trust_event | CommunityTrustEvent / pti_community_trust_event |
| Catalog | Partner event registry / connectors | Community event type catalog |
| Evolution timeline | Yes | MUST NOT appear as operational rows |
| Score plane | Partner context 0–850 | Ubuntu headline 0–1000; hybrid bridge MAY emit native_user signals with community_event_id metadata |
Event lifecycle
| State | Description |
|---|---|
received | Persisted ingest record awaiting process |
processing | Resolve / bind / fan-out in progress |
materialized | Community effects applied; optional hybrid bridge completed or skipped |
failed | Terminal process failure with error_message |
retracted | Seed or producer withdrew the event |
Idempotency
- Writers MUST supply
idempotency_keyfor mutating ingest. - Servers MUST enforce uniqueness on
(producer_id, idempotency_key). - Duplicate keys MUST return the original event without double materialization side effects beyond safe no-ops.
Event type naming
Community types MUST use the community. namespace prefix with dot-separated segments, for example:
| event_type | Kind |
|---|---|
community.credential.issued | badge |
community.credential.verified | badge |
community.endorsement.recorded | endorsement |
community.connection.formed | connection |
community.verification.employment | verification |
community.programme.milestone | programme |
Async processing
After accept, implementations SHOULD process asynchronously. Write paths that must not break UX SHOULD use a safe ingest wrapper that swallows unexpected errors after best-effort persist.
Related documents
- Reference Event Model — partner
trust_event.v1 - Reference Data Model
- Architecture