# xAPI profile

Statements are emitted for contributions, analyses, grants and exports. The LRS
is an interoperable event and research record; **Google Cloud Storage remains
the authoritative store** and the conversation can always be reconstructed from
GCS alone.

Base IRI: `https://observatory.example.org/xapi`. Change it before deploying
under your own domain.

## Actors

Pseudonymous. `account.name` is the thread-scoped participant pseudonym; the
homepage is `https://observatory.example.org/participants`. Real participant
identifiers, email addresses and JWT subjects never appear.

## Verbs

| Verb | IRI |
|---|---|
| initialized | `http://adlnet.gov/expapi/verbs/initialized` |
| experienced | `http://adlnet.gov/expapi/verbs/experienced` |
| responded | `http://adlnet.gov/expapi/verbs/responded` |
| answered | `http://adlnet.gov/expapi/verbs/answered` |
| completed | `http://adlnet.gov/expapi/verbs/completed` |
| asked | `{base}/verbs/asked` |
| corrected | `{base}/verbs/corrected` |
| acknowledged | `{base}/verbs/acknowledged` |
| analyzed | `{base}/verbs/analyzed` |
| revised | `{base}/verbs/revised` |
| authorized | `{base}/verbs/authorized` |
| revoked | `{base}/verbs/revoked` |
| exported | `{base}/verbs/exported` |

The verb for a contribution is chosen from its primary speech act.

## Activity types

`{base}/activity-types/` + `discussion-thread`, `contribution`, `analysis`,
`research-grant`, `export`.

## Extensions

`{base}/extensions/` + `speaker-role`, `speaker-type`, `token-counts`,
`token-count-source`, `lexical-density`, `lexical-diversity`, `speech-acts`,
`time-to-first-token-ms`, `generation-duration-ms`,
`human-adjacent-turn-latency-ms`, `repair-status`, `lcc-rn`, `lcc-ro`, `lcc-in`,
`lcc-io`, `lcc-relevance`, `lcc-novelty`, `iccc-participation`,
`iccc-overall-responsivity`, `iccc-internal-cohesion`, `iccc-social-impact`,
`iccc-newness`, `iccc-communication-density`, `provisional-status`,
`calculation-mode`, `semantic-model-version`, `algorithm-version`,
`schema-version`, `consent-version`, `thread-id`, `session-index`,
`application-id`, `target-participants`, `analysis-revision`.

## What is never included

**Raw text, semantic units and embeddings are not included by default.**
Statements carry structural measures, classified acts, timing and curve values —
never the contribution itself.

## Revisions

When an ICCC Social Impact value changes, a **new** statement is emitted with
the `revised` verb and a revision-qualified object IRI
(`…/analysis/iccc/{threadId}/{contributionId}/r{n}`). Historical statements are
never mutated, so the LRS holds an append-only record of how a provisional value
converged.

## Delivery and the outbox

Delivery is attempted inline. On failure the batch is written to a GCS-backed
outbox and retried by an idempotent worker with bounded exponential backoff
(30 s doubling to a 1 hour cap, 6 attempts) before moving to `dead_letter`.
Statements are never dropped silently, and LRS credentials never appear in logs.
