Skip to main content

Persona-scoped ontologies

A persona is the unit of analytic viewpoint. Two analysts watching the same video frame describe it differently because they care about different things; Fovea makes that difference first-class by binding the ontology to the persona, not to the project or to the video.

Why per-persona

A project-scoped ontology forces every analyst on a project into a single shared vocabulary. That works when the analysts agree; when they disagree, the shared vocabulary either pleases nobody or accumulates all four disagreeing definitions of "Pass" as near-duplicate types.

Per-persona ontologies sidestep the disagreement. Each analyst constructs the vocabulary that fits their information need; the same physical video can host parallel annotation sets under different personas without cross-talk.

What scopes to a persona

The four ontology lists are persona-scoped:

entityTypes      Persona.ontology.entityTypes
eventTypes Persona.ontology.eventTypes
roleTypes Persona.ontology.roleTypes
relationTypes Persona.ontology.relationTypes

Annotations carry personaId (for type annotations) or are linked to world objects (for object annotations). Summaries carry (videoId, personaId). Claims hang off summaries.

What does not scope to a persona

World state is per-user, not per-persona:

WorldState.userId @unique

This is intentional. A user studying a soccer match under a "Coach" persona and a "Referee" persona is studying the same real-world objects. The named instances (Player 9, the specific match, the home stadium) are shared across the user's personas even though the type vocabulary differs.

Implications for ontology change

Editing an ontology does not invalidate existing annotations; labels are stored as plain ids. If a typeId is renamed, existing annotations keep their old id. The ontology becomes the authoritative lookup at render time; missing ids show as unresolved (this is the symptom that surfaced in issue #121, fixed for object annotations in v0.1.8).

Cross-persona linking

The relations layer (claim relations, world relations) lets a user assert links across persona boundaries: a claim under persona A can target a claim under persona B if both belong to the same user. The frontend filters by persona for the per-persona views; the API responses include the foreign claim text where ownership permits.