Every provenance record in ProvenanceKit is expressed as one or more of three types: Entity, Action, or Attribution. This is the EAA model — a pure meta-pattern with no economic or governance opinions baked in.
Why three types?
Provenance answers: who did what, to what, with what authority?| Type | Answers | Examples |
|---|---|---|
| Entity | Who? | A human, an AI agent, an organization |
| Action | What happened? | A file was created, a model was called, a document was reviewed |
| Attribution | What claim is being made? | ”This person authored this output”, “This AI was the generator” |
Entity
An Entity represents any participant that can perform or be attributed to an action."human", "ai", "organization", or any domain-specific value. The only built-in semantics are in the aiAgent field (present when role is "ai").
Action
An Action represents something that happened. It is the central event record.Attribution
An Attribution makes a claim linking an Entity to either an Action or a resource (CID).actionId (attributing to the event that produced something) or resourceRef (attributing directly to a CID), not both.
Extensions
Any EAA type can carryextensions — a typed dictionary keyed by ext:namespace@semver. Extensions add domain semantics without changing the core schema.
@provenancekit/extensions and validated with Zod.
Composing a provenance graph
Multiple EAA records compose into a directed acyclic graph (DAG) via CIDs:@provenancekit/indexer materializes from on-chain events, and what the ProvenanceGraph UI component renders.
Gotchas
- Self-attribution is allowed by design. The contracts do not enforce who can make a claim. The assumption is that claims are signed and audited by the consuming application or off-chain verifier.
- CIDs must be deterministic. For provenance to link correctly across systems, use a consistent content-addressing scheme (IPFS CIDs are recommended).
sessionIdis app-managed. Generate a session ID per conversation, pipeline run, or creative session. Pass it to all actions in that session. The API does not enforce uniqueness or lifecycle.