@prefix aiprov: <https://w3id.org/aiprov/ns#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix verif: <https://example.org/demo/verification/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<https://example.org/demo/activity/promote-c-speed-human-confirmed> a aiprov:AuditPass ;
    rdfs:label "Promotion of c-speed: ai-confirmed -> human-confirmed (Re-ran the benchmark myself)"@en ;
    prov:endedAtTime "2026-11-12T12:05:15.952243+00:00"^^xsd:dateTime ;
    prov:used <https://example.org/demo/claim/c-speed> ;
    prov:wasAssociatedWith <https://example.org/demo/agent/alice> .

<https://example.org/demo/claim/c-tests> a aiprov:Claim ;
    rdfs:label "All public functions are tested."@en ;
    prov:wasAttributedTo <https://example.org/demo/agent/model-x> ;
    prov:wasGeneratedBy <https://example.org/demo/activity/draft-report> ;
    aiprov:verificationState verif:unverified .

<https://example.org/demo/entity/report-md> a aiprov:Artefact ;
    prov:wasAttributedTo <https://example.org/demo/agent/model-x> ;
    prov:wasGeneratedBy <https://example.org/demo/activity/draft-report> ;
    aiprov:contentHash "sha256:2ce88f8ca38578dedc9065068533895d80e52c1ddcbf9fa851bc0fa3be701216" ;
    aiprov:filePath "report.md" .

<https://example.org/demo/graph> aiprov:schemaVersion "0.3.0" .

verif:ai-confirmed a aiprov:VerificationState ;
    rdfs:label "AI-confirmed"@en ;
    rdfs:comment "An AI agent checked that the source CONTENT supports the associated claim (abstract/full-text cross-check). This is the highest rung an AI may grant; it is a machine judgement, not a human one."@en ;
    aiprov:ladderPosition 3 .

verif:human-read a aiprov:VerificationState ;
    rdfs:label "human-read"@en ;
    rdfs:comment "A HUMAN has read the source in full. Top of the ladder; consolidates the former lit-read rung. Human-only: an AI agent must never grant this rung."@en ;
    skos:altLabel "lit-read"@en ;
    aiprov:ladderPosition 6 .

verif:needs-research a aiprov:VerificationState ;
    rdfs:label "needs research"@en ;
    rdfs:comment "A check was attempted or demanded and did not succeed (e.g. DOI did not resolve). Must not be cited or relied upon until re-verified."@en ;
    aiprov:ladderPosition 1 .

verif:reference-resolved a aiprov:VerificationState ;
    rdfs:label "reference resolved"@en ;
    rdfs:comment "The reference EXISTS: its DOI/URL resolved in a bibliographic registry (Crossref, OpenAlex, DataCite) and metadata was captured. Says nothing about whether the content supports anything."@en ;
    skos:altLabel "lit-retrieved"@en,
        "retrieved"@en ;
    aiprov:ladderPosition 2 .

verif:source-vendored a aiprov:VerificationState ;
    rdfs:label "source vendored"@en ;
    rdfs:comment "A copy of the source is preserved inside the repository, immune to link rot; the vendored bytes are what any later audit reads."@en ;
    aiprov:ladderPosition 4 .

aiprov:AIContribution a owl:Class ;
    rdfs:subClassOf aiprov:Contribution .

aiprov:AllOf a aiprov:CompositionKind ;
    rdfs:label "all of (AND)"@en .

aiprov:AnyOf a aiprov:CompositionKind ;
    rdfs:label "any of (OR)"@en .

aiprov:AtLeast a aiprov:CompositionKind ;
    rdfs:label "at least k of n"@en .

aiprov:AuxiliaryPass a owl:Class ;
    rdfs:comment "A model request outside the agent loop (compaction summary, title, classifier). Its tokens are counted but kept apart from the loop's."@en ;
    rdfs:subClassOf prov:Activity .

aiprov:Build a owl:Class ;
    rdfs:comment "Deterministic build/compile/CI activity."@en ;
    rdfs:subClassOf prov:Activity .

aiprov:HumanContribution a owl:Class ;
    rdfs:subClassOf aiprov:Contribution .

aiprov:MetaContribution a owl:Class ;
    rdfs:subClassOf aiprov:Contribution .

aiprov:Prompt a owl:Class ;
    rdfs:comment "A versioned prompt file. Bind to activities via prov:qualifiedAssociation/prov:hadPlan or dcterms:source."@en ;
    rdfs:subClassOf prov:Plan .

aiprov:Repair a owl:Class ;
    rdfs:comment "Fixes a structural defect in the graph itself (e.g. backfilled parent)."@en ;
    rdfs:subClassOf prov:Activity .

aiprov:ToolAgent a owl:Class ;
    rdfs:label "Deterministic tool"@en ;
    rdfs:comment "Non-AI software (compiler, linter, CI job) acting in the pipeline."@en ;
    rdfs:subClassOf prov:SoftwareAgent .

aiprov:Transcript a owl:Class ;
    rdfs:comment "Preserved conversation record; bound to activities via aiprov:transcript."@en ;
    rdfs:subClassOf prov:Entity .

aiprov:addedTriples a owl:DatatypeProperty ;
    rdfs:domain aiprov:Migration ;
    rdfs:range xsd:integer .

aiprov:affiliation a owl:DatatypeProperty ;
    rdfs:range xsd:string .

aiprov:askedIn a owl:ObjectProperty ;
    rdfs:comment "IRI of the issue, pull request or message where the question was asked."@en ;
    rdfs:domain aiprov:Decision .

aiprov:cacheReadTokens a owl:DatatypeProperty ;
    rdfs:range xsd:integer .

aiprov:cacheWriteTokens a owl:DatatypeProperty ;
    rdfs:range xsd:integer .

aiprov:capturePath a owl:ObjectProperty ;
    rdfs:comment "How the record of an activity came to be: a concept of the scheme aiprov:CapturePaths. Absent means unknown; no default is assumed."@en ;
    rdfs:domain prov:Activity ;
    rdfs:range skos:Concept .

aiprov:capturePath-backfill a skos:Concept ;
    skos:definition "Written after the fact by another agent from a secondary source."@en ;
    skos:inScheme aiprov:CapturePaths ;
    skos:prefLabel "backfill"@en .

aiprov:capturePath-gateway a skos:Concept ;
    skos:definition "An API gateway's log is the source."@en ;
    skos:inScheme aiprov:CapturePaths ;
    skos:prefLabel "gateway"@en .

aiprov:capturePath-harness-export a skos:Concept ;
    skos:definition "The record is read later from the harness's own store."@en ;
    skos:inScheme aiprov:CapturePaths ;
    skos:prefLabel "harness-export"@en .

aiprov:capturePath-harness-record a skos:Concept ;
    skos:definition "A hook or plugin of the harness writes the record while the work happens."@en ;
    skos:inScheme aiprov:CapturePaths ;
    skos:prefLabel "harness-record"@en .

aiprov:capturePath-script a skos:Concept ;
    skos:definition "A deterministic tool logs itself."@en ;
    skos:inScheme aiprov:CapturePaths ;
    skos:prefLabel "script"@en .

aiprov:capturePath-self-report a skos:Concept ;
    skos:definition "The acting agent logs its own work."@en ;
    skos:inScheme aiprov:CapturePaths ;
    skos:prefLabel "self-report"@en .

aiprov:chainHead a owl:DatatypeProperty ;
    rdfs:comment "sha256:<hex> head of the chain after aiprov:chainLength records. Each line of the file hashes the line before it, so a changed, removed or reordered record changes the head."@en ;
    rdfs:domain aiprov:TelemetryChain ;
    rdfs:range xsd:string .

aiprov:chainLength a owl:DatatypeProperty ;
    rdfs:comment "Number of records the head covers. The file may have grown since; `provlog bulk verify --anchor` checks that the first records still match."@en ;
    rdfs:domain aiprov:TelemetryChain ;
    rdfs:range xsd:integer .

aiprov:channelName a owl:DatatypeProperty ;
    rdfs:comment "Display name of the channel. Optional; a channel may be known by its identifier alone."@en ;
    rdfs:domain aiprov:Channel ;
    rdfs:range xsd:string .

aiprov:chosenOption a owl:ObjectProperty ;
    rdfs:comment "The option chosen. validate fails when it is not an option of the decision the activity used."@en ;
    rdfs:domain aiprov:Deciding ;
    rdfs:range aiprov:Option .

aiprov:composition a owl:ObjectProperty ;
    rdfs:comment "Combination of the premises. The effective rung is computed and never written: AllOf the weakest premise, AnyOf the best, AtLeast the k-th best (aiprov:minPremises), never above the own rung of the claim. Absent with premises means AllOf."@en ;
    rdfs:domain aiprov:Claim ;
    rdfs:range aiprov:CompositionKind .

aiprov:configHash a owl:DatatypeProperty ;
    rdfs:comment "sha256 of the normalised configuration of the harness; the configuration itself is never stored. Comparable only for equal aiprov:configNormaliser."@en ;
    rdfs:domain aiprov:Harness ;
    rdfs:range xsd:string .

aiprov:configNormaliser a owl:DatatypeProperty ;
    rdfs:comment "Name and version of the normaliser that produced aiprov:configHash (today aiprov-config/1: object keys sorted, list order kept, values under credential-like keys removed, URLs replaced by their sha256)."@en ;
    rdfs:domain aiprov:Harness ;
    rdfs:range xsd:string .

aiprov:content a owl:DatatypeProperty ;
    rdfs:comment "The text of the message. Stored only on request (provlog message --keep-text), where the data class of the channel allows it; aiprov:contentHash is its sha256."@en ;
    rdfs:domain aiprov:Message ;
    rdfs:range xsd:string .

aiprov:contentHash a owl:DatatypeProperty ;
    rdfs:comment "sha256 of the artefact bytes at generation time."@en ;
    rdfs:range xsd:string .

aiprov:contextWindow a owl:DatatypeProperty ;
    rdfs:range xsd:integer .

aiprov:contradicts a owl:ObjectProperty ;
    rdfs:domain aiprov:Claim ;
    rdfs:range aiprov:Claim .

aiprov:cost a owl:DatatypeProperty ;
    rdfs:range xsd:decimal .

aiprov:costCurrency a owl:DatatypeProperty ;
    rdfs:comment "ISO 4217, e.g. EUR, USD."@en ;
    rdfs:range xsd:string .

aiprov:dataClass a owl:DatatypeProperty ;
    rdfs:comment "Data class of what a channel or the text of a decision holds: public, untrusted, internal, confidential or restricted. validate warns when message text is kept in a channel above internal or of unknown class."@en ;
    rdfs:range xsd:string .

aiprov:decidedIn a owl:ObjectProperty ;
    rdfs:comment "IRI of the place where it was decided (a comment, a card, a label event)."@en ;
    rdfs:domain aiprov:Deciding .

aiprov:decisionState a owl:ObjectProperty ;
    rdfs:comment "State of a decision or of a deciding activity: a concept of the scheme aiprov:DecisionStates. Only a registered human sets done; an AI sets provisional."@en .

aiprov:decisionState-done a skos:Concept ;
    rdfs:comment "Decided by a registered human."@en ;
    skos:inScheme aiprov:DecisionStates ;
    skos:prefLabel "done"@en .

aiprov:decisionState-open a skos:Concept ;
    rdfs:comment "Asked, not decided."@en ;
    skos:inScheme aiprov:DecisionStates ;
    skos:prefLabel "open"@en .

aiprov:decisionState-provisional a skos:Concept ;
    rdfs:comment "The recommendation applies until a person decides."@en ;
    skos:inScheme aiprov:DecisionStates ;
    skos:prefLabel "provisional"@en .

aiprov:deprecatedTriples a owl:DatatypeProperty ;
    rdfs:comment "Number of terms the migration marked owl:deprecated."@en ;
    rdfs:domain aiprov:Migration ;
    rdfs:range xsd:integer .

aiprov:doi a owl:DatatypeProperty ;
    rdfs:range xsd:anyURI .

aiprov:endpoint a owl:DatatypeProperty ;
    rdfs:comment "API endpoint or gateway URL through which the model was reached."@en ;
    rdfs:range xsd:anyURI .

aiprov:energyWh a owl:DatatypeProperty ;
    rdfs:comment "Optional energy estimate for the inference, in watt-hours."@en ;
    rdfs:range xsd:decimal .

aiprov:fallbackOf a owl:ObjectProperty ;
    rdfs:comment "The activity this one replaces after it failed (an error, a timeout, a policy refusal, no capacity)."@en ;
    rdfs:domain prov:Activity ;
    rdfs:range prov:Activity .

aiprov:fallbackReason a owl:DatatypeProperty ;
    rdfs:comment "Why the fallback happened: error, timeout, policy or capacity."@en ;
    rdfs:domain prov:Activity ;
    rdfs:range xsd:string .

aiprov:filePath a owl:DatatypeProperty ;
    rdfs:range xsd:string .

aiprov:fromSchemaVersion a owl:DatatypeProperty ;
    rdfs:domain aiprov:Migration ;
    rdfs:range xsd:string .

aiprov:gitCommit a owl:DatatypeProperty ;
    rdfs:comment "Commit hash binding the entity to repository state."@en ;
    rdfs:range xsd:string .

aiprov:harnessKind a owl:ObjectProperty ;
    rdfs:comment "Kind of harness: a concept of the scheme aiprov:HarnessKinds, or of the adopter's own scheme."@en ;
    rdfs:domain aiprov:Harness ;
    rdfs:range skos:Concept .

aiprov:harnessKind-batch a skos:Concept ;
    rdfs:comment "A script or scheduled job that calls a model."@en ;
    skos:inScheme aiprov:HarnessKinds ;
    skos:prefLabel "batch"@en .

aiprov:harnessKind-coding-agent-cli a skos:Concept ;
    rdfs:comment "A coding agent in a terminal."@en ;
    skos:inScheme aiprov:HarnessKinds ;
    skos:prefLabel "coding-agent-cli"@en .

aiprov:harnessKind-ide-extension a skos:Concept ;
    rdfs:comment "An assistant inside an editor or IDE."@en ;
    skos:inScheme aiprov:HarnessKinds ;
    skos:prefLabel "ide-extension"@en .

aiprov:harnessKind-portal-chat a skos:Concept ;
    rdfs:comment "A chat interface of a provider or an institution."@en ;
    skos:inScheme aiprov:HarnessKinds ;
    skos:prefLabel "portal-chat"@en .

aiprov:harnessVersion a owl:DatatypeProperty ;
    rdfs:domain aiprov:Harness ;
    rdfs:range xsd:string .

aiprov:hasPremise a owl:ObjectProperty ;
    rdfs:comment "A claim that this claim rests on. A subproperty of prov:wasDerivedFrom, so plain PROV tools still see the dependency. Premises may be composite themselves (a DAG, no cycles)."@en ;
    rdfs:domain aiprov:Claim ;
    rdfs:range aiprov:Claim ;
    rdfs:subPropertyOf prov:wasDerivedFrom .

aiprov:inChannel a owl:ObjectProperty ;
    rdfs:comment "The channel the message was posted in."@en ;
    rdfs:domain aiprov:Message ;
    rdfs:range aiprov:Channel .

aiprov:inReplyTo a owl:ObjectProperty ;
    rdfs:comment "The message this one replies to. The target is a message of the same graph."@en ;
    rdfs:domain aiprov:Message ;
    rdfs:range aiprov:Message .

aiprov:inputTokens a owl:DatatypeProperty ;
    rdfs:range xsd:integer .

aiprov:knowledgeCutoff a owl:DatatypeProperty ;
    rdfs:range xsd:date .

aiprov:ladderPosition a owl:DatatypeProperty ;
    rdfs:comment "Total order of the ladder; promotions must strictly increase this value."@en ;
    rdfs:domain aiprov:VerificationState ;
    rdfs:range xsd:integer .

aiprov:maxTokens a owl:DatatypeProperty ;
    rdfs:range xsd:integer .

aiprov:minPremises a owl:DatatypeProperty ;
    rdfs:comment "k for aiprov:AtLeast: how many premises must hold."@en ;
    rdfs:domain aiprov:Claim ;
    rdfs:range xsd:integer .

aiprov:model a owl:DatatypeProperty ;
    rdfs:comment "Model identifier, e.g. claude-fable-5."@en ;
    rdfs:domain aiprov:AIAgent ;
    rdfs:range xsd:string .

aiprov:modelRole a owl:DatatypeProperty ;
    rdfs:comment "What a model did within one answer: answer, draft, revise, judge or route (recommended values; adopters may add their own). Several activities with a model role, informed by one Orchestration, produce one answer."@en ;
    rdfs:domain prov:Activity ;
    rdfs:range xsd:string .

aiprov:modelUnknownReason a owl:DatatypeProperty ;
    rdfs:comment "Why the model of an activity is not known (for example: not reported by the harness), stated instead of an empty or guessed model."@en ;
    rdfs:domain prov:Activity ;
    rdfs:range xsd:string .

aiprov:modelVariant a owl:DatatypeProperty ;
    rdfs:comment "The reasoning variant in force for an activity (for example low, max). On the activity, not the agent, because the variant can change per request."@en ;
    rdfs:domain prov:Activity ;
    rdfs:range xsd:string .

aiprov:modelVersion a owl:DatatypeProperty ;
    rdfs:range xsd:string .

aiprov:optionOf a owl:ObjectProperty ;
    rdfs:comment "The decision an option belongs to."@en ;
    rdfs:domain aiprov:Option ;
    rdfs:range aiprov:Decision .

aiprov:orcid a owl:DatatypeProperty ;
    rdfs:domain aiprov:HumanAgent ;
    rdfs:range xsd:anyURI .

aiprov:outputTokens a owl:DatatypeProperty ;
    rdfs:range xsd:integer .

aiprov:plannedAgent a owl:ObjectProperty ;
    rdfs:comment "An agent instance registered before the orchestration (repeatable). If any is declared, sub-activities must be associated with one of them."@en ;
    rdfs:domain aiprov:Orchestration ;
    rdfs:range prov:Agent .

aiprov:plannedBinding a owl:DatatypeProperty ;
    rdfs:comment "Binds a planned agent to one role: the string AGENT-IRI|ROLE (repeatable). An agent with at least one binding may act only in its bound roles."@en ;
    rdfs:domain aiprov:Orchestration ;
    rdfs:range xsd:string .

aiprov:plannedRole a owl:DatatypeProperty ;
    rdfs:comment "A role the orchestration plans to use (repeatable). If any is declared, sub-activities must name one of them in aiprov:role."@en ;
    rdfs:domain aiprov:Orchestration ;
    rdfs:range xsd:string .

aiprov:platform a owl:DatatypeProperty ;
    rdfs:comment "The kind of system that hosts the channel, in the adopter's own words."@en ;
    rdfs:domain aiprov:Channel ;
    rdfs:range xsd:string .

aiprov:promptHash a owl:DatatypeProperty ;
    rdfs:comment "Content hash (e.g. sha256) of the exact prompt text used."@en ;
    rdfs:range xsd:string .

aiprov:provider a owl:DatatypeProperty ;
    rdfs:comment "e.g. Anthropic, local/llama.cpp, gateway name."@en ;
    rdfs:range xsd:string .

aiprov:reasoningTokens a owl:DatatypeProperty ;
    rdfs:range xsd:integer .

aiprov:recommendedOption a owl:ObjectProperty ;
    rdfs:comment "The option the asker recommended. Absent when no recommendation was made."@en ;
    rdfs:domain aiprov:Decision ;
    rdfs:range aiprov:Option .

aiprov:recordedAtTime a owl:DatatypeProperty ;
    rdfs:comment "When the record of an activity or a message was written, as distinct from when the work happened. prov:startedAtTime and prov:endedAtTime describe the work; this property describes the bookkeeping. They differ whenever an activity is logged in arrears, which is the normal case for an agent session, and keeping them apart is what allows a reader to tell a measured span from the instant a log line was appended."@en ;
    rdfs:range xsd:dateTime .

aiprov:recordedBy a owl:ObjectProperty ;
    rdfs:comment "The agent that wrote the record, when it is not the agent that acted."@en ;
    rdfs:domain prov:Activity ;
    rdfs:range prov:Agent .

aiprov:recordedFrom a owl:ObjectProperty ;
    rdfs:comment "What a record was written from (a transcript, a summary, a commit); expected for a backfill."@en ;
    rdfs:domain prov:Activity ;
    rdfs:range prov:Entity .

aiprov:refersTo a owl:ObjectProperty ;
    rdfs:comment "An issue, pull request or commit the message is about, as an IRI."@en ;
    rdfs:domain aiprov:Message .

aiprov:refusedAgent a owl:ObjectProperty ;
    rdfs:comment "The agent whose request was refused."@en ;
    rdfs:domain aiprov:Refusal ;
    rdfs:range prov:Agent .

aiprov:refusedAtTime a owl:DatatypeProperty ;
    rdfs:domain aiprov:Refusal ;
    rdfs:range xsd:dateTime .

aiprov:refusedRung a owl:DatatypeProperty ;
    rdfs:comment "The human-only rung that was requested."@en ;
    rdfs:domain aiprov:Refusal ;
    rdfs:range xsd:string .

aiprov:refusedStep a owl:DatatypeProperty ;
    rdfs:comment "The refused command: claim, source or promote."@en ;
    rdfs:domain aiprov:Refusal ;
    rdfs:range xsd:string .

aiprov:refusedTarget a owl:DatatypeProperty ;
    rdfs:comment "The id of the claim or source the step was about."@en ;
    rdfs:domain aiprov:Refusal ;
    rdfs:range xsd:string .

aiprov:registeredAtTime a owl:DatatypeProperty ;
    rdfs:comment "When the person was registered."@en ;
    rdfs:domain aiprov:HumanAgent ;
    rdfs:range xsd:dateTime .

aiprov:registeredBy a owl:ObjectProperty ;
    rdfs:comment "The agent that registered this person (provlog agent --type human, from --by or PROV_ACTOR). Makes a self-registration visible."@en ;
    rdfs:domain aiprov:HumanAgent ;
    rdfs:range prov:Agent .

aiprov:repairs a owl:ObjectProperty ;
    rdfs:comment "A Repair activity amends generation metadata of a claim without invalidating its content."@en .

aiprov:requestId a owl:DatatypeProperty ;
    rdfs:comment "Provider request ID for a single inference call."@en ;
    rdfs:range xsd:string .

aiprov:role a owl:DatatypeProperty ;
    rdfs:comment "Role of a sub-activity within an orchestration."@en ;
    rdfs:domain prov:Activity ;
    rdfs:range xsd:string .

aiprov:routedBy a owl:ObjectProperty ;
    rdfs:comment "The routing rule (a prov:Plan) that chose the model for this activity."@en ;
    rdfs:domain prov:Activity ;
    rdfs:range prov:Plan .

aiprov:schemaVersion a owl:DatatypeProperty ;
    rdfs:comment "Version of the aiprov schema the graph was last written or migrated to (major.minor.patch). Set by init and migrate; a graph without it is detected by its terms."@en ;
    rdfs:range xsd:string .

aiprov:scoreValue a owl:DatatypeProperty ;
    rdfs:comment "The value a judge gave; the scale is the judge's own and is not interpreted by aiprov."@en ;
    rdfs:domain aiprov:Score ;
    rdfs:range xsd:decimal .

aiprov:seed a owl:DatatypeProperty ;
    rdfs:range xsd:integer .

aiprov:sentAt a owl:DatatypeProperty ;
    rdfs:comment "When the message was sent. Absent when unknown; aiprov:recordedAtTime says when it was logged."@en ;
    rdfs:domain aiprov:Message ;
    rdfs:range xsd:dateTime .

aiprov:sessionId a owl:DatatypeProperty ;
    rdfs:comment "Identifier of a session as the harness reports it (for example a coding-agent session UUID or a chat conversation id)."@en ;
    rdfs:range xsd:string .

aiprov:sessionOutcome a owl:DatatypeProperty ;
    rdfs:comment "How the session ended, as the harness reports it: succeeded, failed or interrupted. A session that failed may never have logged itself; the outcome is what makes that visible."@en ;
    rdfs:domain aiprov:Session ;
    rdfs:range xsd:string .

aiprov:sessionType a owl:ObjectProperty ;
    rdfs:comment "Kind of session: a concept of the scheme aiprov:SessionTypes, or a concept of the adopter's own scheme."@en ;
    rdfs:domain aiprov:Session ;
    rdfs:range skos:Concept .

aiprov:sessionType-batch a skos:Concept ;
    rdfs:comment "A scheduled or unattended run."@en ;
    skos:inScheme aiprov:SessionTypes ;
    skos:prefLabel "batch"@en .

aiprov:sessionType-coding-agent a skos:Concept ;
    rdfs:comment "A coding agent works in a terminal or editor on a working tree."@en ;
    skos:inScheme aiprov:SessionTypes ;
    skos:prefLabel "coding-agent"@en .

aiprov:sessionType-evaluation a skos:Concept ;
    rdfs:comment "A run whose purpose is to measure a model or a pipeline."@en ;
    skos:inScheme aiprov:SessionTypes ;
    skos:prefLabel "evaluation"@en .

aiprov:sessionType-interactive-chat a skos:Concept ;
    rdfs:comment "A person converses with a model in a chat interface."@en ;
    skos:inScheme aiprov:SessionTypes ;
    skos:prefLabel "interactive-chat"@en .

aiprov:stopReason a owl:DatatypeProperty ;
    rdfs:range xsd:string .

aiprov:supersedes a owl:ObjectProperty ;
    rdfs:comment "The earlier decision this one replaces. A decided decision is never edited; a change is a new decision that supersedes it."@en ;
    rdfs:domain aiprov:Decision ;
    rdfs:range aiprov:Decision .

aiprov:systemPromptRef a owl:ObjectProperty ;
    rdfs:comment "Links an activity to the system-prompt entity in force."@en .

aiprov:temperature a owl:DatatypeProperty ;
    rdfs:range xsd:decimal .

aiprov:toSchemaVersion a owl:DatatypeProperty ;
    rdfs:domain aiprov:Migration ;
    rdfs:range xsd:string .

aiprov:toolCalls a owl:DatatypeProperty ;
    rdfs:range xsd:integer .

aiprov:toolVersion a owl:DatatypeProperty ;
    rdfs:comment "Version of the aiprov package that ran the migration."@en ;
    rdfs:domain aiprov:Migration ;
    rdfs:range xsd:string .

aiprov:topP a owl:DatatypeProperty ;
    rdfs:range xsd:decimal .

aiprov:totalTokens a owl:DatatypeProperty ;
    rdfs:range xsd:integer .

aiprov:transcript a owl:ObjectProperty ;
    rdfs:comment "Links the activity to a preserved conversation transcript entity."@en .

aiprov:turnCount a owl:DatatypeProperty ;
    rdfs:range xsd:integer .

aiprov:usedTool a owl:DatatypeProperty ;
    rdfs:comment "Repeatable: one value per distinct tool invoked (web_search, bash, ...)."@en ;
    rdfs:range xsd:string .

aiprov:verificationState a owl:ObjectProperty ;
    rdfs:comment "Current rung of a claim or source on the verification ladder. Exactly one value; transitions are recorded as AuditPass activities so the history stays in the graph."@en ;
    rdfs:domain aiprov:Claim ;
    rdfs:range aiprov:VerificationState .

aiprov:viaHarness a owl:ObjectProperty ;
    rdfs:comment "The harness an activity ran under."@en ;
    rdfs:domain prov:Activity ;
    rdfs:range aiprov:Harness .

<https://example.org/demo/claim/c-speed> a aiprov:Claim ;
    rdfs:label "The new parser is twice as fast."@en ;
    prov:wasAttributedTo <https://example.org/demo/agent/model-x> ;
    prov:wasGeneratedBy <https://example.org/demo/activity/draft-report> ;
    aiprov:verificationState verif:human-confirmed .

<https://example.org/demo/source/notes-md> a aiprov:Source ;
    aiprov:filePath "notes.md" .

verif:human-confirmed a aiprov:VerificationState ;
    rdfs:label "human-confirmed"@en ;
    rdfs:comment "A HUMAN checked that the source supports the claim (targeted spot-check, not necessarily a full read). Human-only: an AI agent must never grant this rung."@en ;
    aiprov:ladderPosition 5 .

verif:unverified a aiprov:VerificationState ;
    rdfs:label "unverified"@en ;
    rdfs:comment "Recorded, nothing checked yet by anyone. Default state at creation."@en ;
    aiprov:ladderPosition 0 .

aiprov:Artefact a owl:Class ;
    rdfs:comment "Generalizes Manuscript/Section/Figure: any produced file or object."@en ;
    rdfs:subClassOf prov:Entity .

aiprov:AuditPass a owl:Class ;
    rdfs:comment "AI or human reviews, verifies, or contests an artefact."@en ;
    rdfs:subClassOf prov:Activity .

aiprov:AuthoringPass a owl:Class ;
    rdfs:comment "AI or human produces/edits an artefact."@en ;
    rdfs:subClassOf prov:Activity .

aiprov:Score a owl:Class ;
    rdfs:comment "The result of a judge activity. The judge prov:used the answer and the score prov:wasGeneratedBy the judge."@en ;
    rdfs:subClassOf prov:Entity .

aiprov:Source a owl:Class ;
    rdfs:subClassOf prov:Entity .

<https://example.org/demo/agent/alice> a aiprov:HumanAgent ;
    foaf:name "Alice Example" ;
    aiprov:orcid "0000-0002-1825-0097"^^xsd:anyURI ;
    aiprov:registeredAtTime "2026-11-12T12:05:15.499664+00:00"^^xsd:dateTime .

aiprov:Deciding a owl:Class ;
    rdfs:label "Deciding"@en ;
    rdfs:comment "The act of choosing an option of a decision. It prov:used the decision, is prov:wasAssociatedWith the decider, and carries aiprov:chosenOption and aiprov:decisionState."@en ;
    rdfs:subClassOf prov:Activity .

aiprov:Session a owl:Class ;
    rdfs:label "Session"@en ;
    rdfs:comment "A working session of one harness (an interactive chat, a coding-agent run, a batch job, an evaluation). Activities that belong to it point to it with dcterms:isPartOf. It may carry prov:startedAtTime, prov:endedAtTime, aiprov:sessionType, aiprov:sessionOutcome and aiprov:sessionId."@en ;
    rdfs:subClassOf prov:Activity .

aiprov:TelemetryChain a owl:Class ;
    rdfs:label "TelemetryChain"@en ;
    rdfs:comment "The anchor of a hash-chained JSONL file of bulk telemetry (requests, tool runs). The records stay in the file; the graph holds only the head after aiprov:chainLength records. prov:wasAttributedTo names who anchored it."@en ;
    rdfs:subClassOf prov:Entity .

<https://example.org/demo/activity/draft-report> a aiprov:AuthoringPass ;
    rdfs:label "Draft the report from the notes"@en ;
    prov:endedAtTime "2026-11-12T12:05:15.680839+00:00"^^xsd:dateTime ;
    prov:used <https://example.org/demo/source/notes-md> ;
    prov:wasAssociatedWith <https://example.org/demo/agent/model-x> ;
    aiprov:inputTokens 1200 ;
    aiprov:outputTokens 800 ;
    aiprov:recordedAtTime "2026-11-12T12:05:15.680871+00:00"^^xsd:dateTime ;
    aiprov:totalTokens 2000 .

aiprov:AIAgent a owl:Class ;
    rdfs:label "AI agent"@en ;
    rdfs:comment "An LLM- or ML-driven agent participating in artefact production."@en ;
    rdfs:subClassOf prov:SoftwareAgent .

aiprov:Channel a owl:Class ;
    rdfs:label "Channel"@en ;
    rdfs:comment "A place where agents exchange messages (a chat room, an issue thread). It may carry aiprov:platform, aiprov:channelName and aiprov:dataClass."@en ;
    rdfs:subClassOf prov:Entity .

aiprov:Contribution a owl:Class ;
    rdfs:subClassOf prov:Entity .

aiprov:DecisionStates a skos:ConceptScheme ;
    skos:prefLabel "Decision states"@en .

aiprov:Option a owl:Class ;
    rdfs:label "Option"@en ;
    rdfs:comment "One alternative of a decision, with aiprov:contentHash and, on request, rdfs:label."@en ;
    rdfs:subClassOf prov:Entity .

aiprov:Orchestration a owl:Class ;
    rdfs:label "Orchestration"@en ;
    rdfs:comment "Root activity of a multi-agent run. Logged before any sub-agent starts; sub-activities point to it with prov:wasInformedBy. Declares the planned roles and agents."@en ;
    rdfs:subClassOf prov:Activity .

<https://example.org/demo/agent/model-x> a aiprov:AIAgent ;
    prov:actedOnBehalfOf <https://example.org/demo/agent/alice> ;
    foaf:name "Model X" ;
    aiprov:model "model-x"^^xsd:string ;
    aiprov:provider "Example AI"^^xsd:string .

aiprov:CompositionKind a owl:Class ;
    rdfs:comment "How the premises of a claim combine."@en .

aiprov:HarnessKinds a skos:ConceptScheme ;
    rdfs:label "Harness kinds"@en ;
    rdfs:comment "Small scheme of harness kinds; adopters may add concepts in their own namespace."@en .

aiprov:HumanAgent a owl:Class ;
    rdfs:label "Human agent"@en ;
    rdfs:comment "A person. Never also an aiprov:AIAgent: validate fails a node typed as both."@en ;
    rdfs:subClassOf prov:Person ;
    owl:disjointWith aiprov:AIAgent .

aiprov:SessionTypes a skos:ConceptScheme ;
    rdfs:label "Session types"@en ;
    rdfs:comment "Small scheme of session kinds; adopters may add concepts in their own namespace."@en .

aiprov:Decision a owl:Class ;
    rdfs:label "Decision"@en ;
    rdfs:comment "A question put to a decider with its options and, optionally, a recommendation. prov:wasAttributedTo names who asked; aiprov:contentHash is the sha256 of the question; the text (rdfs:label) is stored only on request. The effective state is the state of the latest aiprov:Deciding activity, open when there is none."@en ;
    rdfs:subClassOf prov:Entity .

aiprov:Harness a owl:Class ;
    rdfs:label "Harness"@en ;
    rdfs:comment "The software an agent works through (a coding-agent CLI, an IDE extension, a portal chat, a batch script). The same model behaves differently under different harnesses: permission rules, hooks, loaded instructions and context management differ. It may carry aiprov:harnessKind, aiprov:harnessVersion, aiprov:configHash and aiprov:configNormaliser."@en ;
    rdfs:subClassOf prov:SoftwareAgent .

aiprov:Migration a owl:Class ;
    rdfs:label "Migration"@en ;
    rdfs:comment "One run of provlog migrate: the graph moved from one schema version to another. Existing triples are kept; deprecated terms are marked, not deleted."@en ;
    rdfs:subClassOf prov:Activity .

aiprov:Refusal a owl:Class ;
    rdfs:label "Refusal"@en ;
    rdfs:comment "A human-only step (a rung only a registered person may grant) that provlog refused. Written only with --record-refusals."@en ;
    rdfs:subClassOf prov:Entity .

aiprov:CapturePaths a skos:ConceptScheme ;
    rdfs:comment "Capture paths of a record. When two paths report the same session their token sums are not added up."@en .

aiprov:Message a owl:Class ;
    rdfs:label "Message"@en ;
    rdfs:comment "One message of an agent in a channel. prov:wasAttributedTo names the sender; aiprov:contentHash is required; aiprov:content is stored only on request. An activity or a decision uses a message with prov:used."@en ;
    rdfs:subClassOf prov:Entity .

aiprov:Claim a owl:Class ;
    rdfs:comment "An assertion in any artefact that warrants attribution and verification."@en ;
    rdfs:subClassOf prov:Entity .

aiprov:VerificationState a owl:Class ;
    rdfs:comment "A rung on the verification ladder. Higher position = stronger check. Rungs at position 5+ are human-only: an AI agent must never grant them."@en .

