@prefix iep:    <https://markjspivey-xwisee.github.io/interego/ns/iep#> .
@prefix ieh:   <https://markjspivey-xwisee.github.io/interego/ns/harness#> .
@prefix hydra: <http://www.w3.org/ns/hydra/core#> .
@prefix dcat:  <http://www.w3.org/ns/dcat#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
# SHACL and XSD, for the value constraints every input already declared and this manifest used to
# drop. Neither is new to this fleet: SHACL shapes are published under docs/ns and a SHACL engine
# runs against them; a document emitting a prefix it does not declare is unparseable, and this one
# is served to strangers.
@prefix sh:    <http://www.w3.org/ns/shacl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
# Dublin Core, for the DCAT-native reading of an evidence source's description. Added with the
# read-side terms: a document that emits dct: without declaring it is unparseable, and this
# manifest is served to strangers.
@prefix dct:   <http://purl.org/dc/terms/> .

<https://foxxi-bridge.interego.xwisee.com/affordances> a hydra:Collection ;
    rdfs:label "foxxi-content-intelligence affordance manifest" ;
    rdfs:comment "Capabilities exposed by the foxxi-content-intelligence vertical bridge. Generic Interego agents discover via this manifest; ergonomic clients use the MCP tool surface at /mcp." ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-classify> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-validate> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-peer-term> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-source-version> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-authored-catalog> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-authored-rdf> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-authored-shapes> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-capabilities> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-challenge> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-session> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-read> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-write> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-interventions> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-intervention-ask> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-ask> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-orchestrate> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/profile> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/ingest> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/query> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/capture-read> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/capture-update> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/client-setup> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/collector-create> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/collector-revoke> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-private-performance-outcome-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/read-private-performance-outcomes-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/read-private-performance-calibration-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/discover-lrs> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/discover-assigned-courses> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/discover-course-catalogs> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/earned-credentials> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/claim-credential> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/verify-credential> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/earned-credentials-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/claim-credential-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/cmi5-launch-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-launch-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-gradebook-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-reconciliation-contract> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-reconciliation-preview-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-reconciliation-apply-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-reconciliation-read-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/consume-lesson> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/ask-course-question> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/ask-course-question-agentic> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/retrieve-course-context> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/explore-concept-map> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/extend-standards> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/review-record> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/issue-credential> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/verify-extension> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/prove-competency-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/self-assert-competency> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/verify-presentation> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/void-credential> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-encryption-key> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-analyze> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-analyze-authored> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-ask> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-skill> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-analyze-skill> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/skill-affordance> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-propose-successor> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/calibration-merge> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-performance-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/ingest-course-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-course-completion-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/set-forwarding-targets-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/write-xapi-statements-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/read-xapi-statements-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/write-own-subject-xapi-statements-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/read-own-subject-xapi-statements-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/set-inbound-credentials-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-memory-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-fragment-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-compose-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-fold-course-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-resolve-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-admit-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-admissions-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-mine-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-launch-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-next-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/xapi-author-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-author-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-launch-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-submit-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-course-ask> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-dispatch-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-dispatch-revoke-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-dispatches-signed> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/bind-decoration> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/read-intervention-methods> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/review-method-evidence> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/ingest-content-package> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-authoring-policy> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/connect-lms> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/assign-audience> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/coverage-query> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-concept-map> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-compliance-evidence> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/issue-completion-credential> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/export-clr> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/assemble-learner-record> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-performance> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-agent-trajectory> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/get-agent-trajectory> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/assess-agent-disposition> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/run-performance-probe> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/open-agent-evaluation> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/request-evaluation-enrollment> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/decide-evaluation-candidate> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-external-agent-run> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/get-agent-evaluation> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/compare-agent-evaluation> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/export-case-framework> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/emit-cmi5-session> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/resolve-did> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/query-experience-index> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/push-to-cass> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/export-clr-v1> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/issue-bbs-credential> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/derive-bbs-presentation> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/verify-bbs-presentation> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/prove-competency> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/launch-au-with-prereq> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/ai-assess-competency> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/countersign-assessment> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/audit-compliance-trail> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/declare-framework-alignment> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/resolve-aligned-competency> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/cohort-concept-intelligence> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/register-self-sovereign-learner> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-ontology> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/bootstrap-tenant> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-cloud-pull> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-cloud-register> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/upload-scorm-package> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/derive-adaptive-policy> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/schedule-spaced-repetition> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-course-catalog-product> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/discover-framework-registry> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/register-tutor-agent> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/find-tutor-for-competency> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/generate-dpia> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/manager-team-view> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/build-did-web-document> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/backup-tenant-pod> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/le-design-ab-experiment> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/judge-content-claim> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/confirm-content-judgment> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-judgment-calibration> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/attest-content-judgments> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-judgment-reputation> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/confirm-next> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-content-judgment> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/cross-confirm> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/best-judge> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/set-autonomy-policy> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/autonomy-status> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/weakest-claims> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/revise-claim> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/le-estimate-concept-difficulty> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/le-analyze-learning-curve> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/le-calibrate-mastery-threshold> ;
    iep:affordance <https://relay.interego.xwisee.com/ns/iep/action/foxxi/le-framework-gap-analysis> .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-classify> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-classify> ;
    hydra:method "POST" ;
    hydra:title "Classify an RDF draft" ;
    rdfs:comment "Run the fixed q-classify query and pinned category-disjointness checks. Derived types remain Hypothetical; this is not full OWL consistency checking." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/classify> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/classify> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_classify-output" ;
        rdfs:comment "An executed deterministic read-only check with pinned source provenance and explicit evidence. No model sampling, pod writes, approval, ratification or publication occurs." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "task" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "status" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "execution" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sampling_performed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "writes_performed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "source" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evidence" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_classify-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "graph_content" ] ;
            hydra:required true ;
            rdfs:comment "Inline instance-only Turtle, at most 64000 UTF-8 bytes and 512 triples. No caller schema, inference-changing axioms, paths, remote graph URLs, custom shapes or executable queries." ;
            sh:datatype xsd:string
        ]
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-validate> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-validate> ;
    hydra:method "POST" ;
    hydra:title "Validate an RDF draft" ;
    rdfs:comment "Run the existing native SHACL Core validator and check classified concept existence against the pinned glossary. Unsupported constraints fail closed." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/validate> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/validate> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_validate-output" ;
        rdfs:comment "An executed deterministic read-only check with pinned source provenance and explicit evidence. No model sampling, pod writes, approval, ratification or publication occurs." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "task" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "status" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "execution" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sampling_performed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "writes_performed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "source" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evidence" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_validate-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "graph_content" ] ;
            hydra:required true ;
            rdfs:comment "Inline instance-only Turtle, at most 64000 UTF-8 bytes and 512 triples. No caller schema, inference-changing axioms, paths, remote graph URLs, custom shapes or executable queries." ;
            sh:datatype xsd:string
        ]
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-peer-term> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-peer-term> ;
    hydra:method "POST" ;
    hydra:title "Look up a peer term" ;
    rdfs:comment "Look up an exact IRI in the pinned publisher-label and mapping-target evidence. A miss means unconfirmed in this snapshot, not nonexistent." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/peer-term> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/peer-term> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_peer_term-output" ;
        rdfs:comment "An executed deterministic read-only check with pinned source provenance and explicit evidence. No model sampling, pod writes, approval, ratification or publication occurs." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "task" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "status" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "execution" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sampling_performed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "writes_performed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "source" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evidence" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_peer_term-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "iri" ] ;
            hydra:required true ;
            rdfs:comment "One absolute HTTP(S) term IRI, at most 2048 UTF-8 bytes. This operation does not fetch the supplied IRI." ;
            sh:datatype xsd:string
        ]
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-source-version> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-source-version> ;
    hydra:method "POST" ;
    hydra:title "Check the upstream source version" ;
    rdfs:comment "Compare the pinned glossary release with the canonical scheme fetched now. An outage returns unavailable; no snapshot is automatically upgraded." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/source-version> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/source-version> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_source_version-output" ;
        rdfs:comment "An executed deterministic read-only check with pinned source provenance and explicit evidence. No model sampling, pod writes, approval, ratification or publication occurs." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "task" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "status" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "execution" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sampling_performed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "writes_performed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "source" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evidence" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_source_version-input"
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-authored-catalog> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-authored-catalog> ;
    hydra:method "GET" ;
    hydra:title "Read the authored glossary catalog" ;
    rdfs:comment "Read the deployment-owned Hypothetical authored layer with origin and source binding. No canonical source edit, ratification, learner claim or publication occurs." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/authored-catalog> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/authored-catalog> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_authored_catalog-output" ;
        rdfs:comment "Externally routed HTTP GET, not a named-MCP shim. The endpoint returns application/json directly. These fields describe the existing core followAffordance result, not a JSON wrapper added to the endpoint; inspect status and contentType before parsing body." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "status" ] ;
            hydra:required false ;
            rdfs:comment "Actual HTTP status from the read target; 200 is success, while failures retain their returned status." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "contentType" ] ;
            hydra:required false ;
            rdfs:comment "The target response Content-Type. Successful reads return application/json; an unavailable read returns an application/json error." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "body" ] ;
            hydra:required false ;
            rdfs:comment "Raw JSON response text. JSON.parse(body) exposes kind, status, upstream_adopted, canonical_source, counts, catalog, rdf and _affordances. Follow rdf.href and verify its bytes against rdf.sha256; the catalog has its own representation ETag." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "affordance" ] ;
            hydra:required false ;
            rdfs:comment "The existing follower echoes the resolved read action, HTTP target, method and declared media type."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_authored_catalog-input"
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-authored-rdf> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-authored-rdf> ;
    hydra:method "GET" ;
    hydra:title "Read authored glossary RDF" ;
    rdfs:comment "Read the deployment-owned Hypothetical authored layer with origin and source binding. No canonical source edit, ratification, learner claim or publication occurs." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/authored.ttl> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/authored.ttl> ;
    dcat:mediaType "text/turtle" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_authored_rdf-output" ;
        rdfs:comment "Externally routed HTTP GET, not a named-MCP shim. The endpoint returns text/turtle directly. These fields describe the existing core followAffordance result, not a JSON wrapper added to the endpoint; inspect status and contentType before parsing body." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "status" ] ;
            hydra:required false ;
            rdfs:comment "Actual HTTP status from the read target; 200 is success, while failures retain their returned status." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "contentType" ] ;
            hydra:required false ;
            rdfs:comment "The target response Content-Type. Successful reads return text/turtle; an unavailable read returns an application/json error." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "body" ] ;
            hydra:required false ;
            rdfs:comment "Raw Turtle response text, not JSON. It contains the authored concept, definition, origin, reviewed proposal digest, evidence and directional restrictions; its SHA-256 is catalog.rdf.sha256 and classifier evidence authored_graph_sha256." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "affordance" ] ;
            hydra:required false ;
            rdfs:comment "The existing follower echoes the resolved read action, HTTP target, method and declared media type."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_authored_rdf-input"
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-authored-shapes> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-authored-shapes> ;
    hydra:method "GET" ;
    hydra:title "Read the canonical and exact-authored reference shapes" ;
    rdfs:comment "Read the deployment-owned Hypothetical authored layer with origin and source binding. No canonical source edit, ratification, learner claim or publication occurs." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/authored-shapes.ttl> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/authored-shapes.ttl> ;
    dcat:mediaType "text/turtle" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_authored_shapes-output" ;
        rdfs:comment "Externally routed HTTP GET, not a named-MCP shim. The endpoint returns text/turtle directly. These fields describe the existing core followAffordance result, not a JSON wrapper added to the endpoint; inspect status and contentType before parsing body." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "status" ] ;
            hydra:required false ;
            rdfs:comment "Actual HTTP status from the read target; 200 is success, while failures retain their returned status." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "contentType" ] ;
            hydra:required false ;
            rdfs:comment "The target response Content-Type. Successful reads return text/turtle; an unavailable read returns an application/json error." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "body" ] ;
            hydra:required false ;
            rdfs:comment "Raw Turtle response text, not JSON. It contains the canonical SHACL profile extended with only the exact authored IRIs; its SHA-256 is the validator evidence effective_shape_sha256." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "affordance" ] ;
            hydra:required false ;
            rdfs:comment "The existing follower echoes the resolved read action, HTTP target, method and declared media type."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_authored_shapes-input"
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-capabilities> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-capabilities> ;
    hydra:method "GET" ;
    hydra:title "Inspect I2IDL-X workbench connection capabilities" ;
    rdfs:comment "Inspect optional pod storage and the workbench signed session/read/write links. No model is funded by the project; client subscription sampling is optional." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/capabilities> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/capabilities> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_capabilities-output" ;
        rdfs:comment "Actual signing audience, whether encrypted shared storage is configured, optional model connection contract, and followable challenge/session/read/write controls. No project-paid model connection is claimed." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "audience" ] ;
            hydra:required false ;
            rdfs:comment "Exact audience to cover in each signature." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "shared" ] ;
            hydra:required false ;
            rdfs:comment "True only when shared pod, participant configuration and stable encryption exist." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ai" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "connection" ] ;
            hydra:required false ;
            rdfs:comment "Connection instructions." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_affordances" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "code" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_capabilities-input"
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-challenge> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-challenge> ;
    hydra:method "GET" ;
    hydra:title "Get a one-use I2IDL-X sign-in nonce" ;
    rdfs:comment "Get a server-issued nonce bound to this bridge. Sign it immediately with Interego sign_request, with i2idlx_operation=session and the returned audience. Expires in 60 seconds." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/challenge> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/challenge> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_challenge-output" ;
        rdfs:comment "A fresh one-use sign-in nonce, its expiry and exact bridge audience; HTTP 429 returns an error when pending challenges are exhausted." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "nonce" ] ;
            hydra:required false ;
            rdfs:comment "Random server-issued nonce; use once within 60 seconds." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "expires_at" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "audience" ] ;
            hydra:required false ;
            rdfs:comment "Exact audience to sign for i2idlx-session." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_challenge-input"
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint false ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-session> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-session> ;
    hydra:method "POST" ;
    hydra:title "Verify an Interego identity for I2IDL-X" ;
    rdfs:comment "Signature/delegation-verify the calling actor on their own existing pod, consume the one-use server nonce, and return a derived account identifier plus actual write/editor standing. Never accepts a claimed userId and never registers a pod." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/session> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/session> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_session-output" ;
        rdfs:comment "Verified derived identity and actual own-pod write, encrypted shared read/write and private encryption standing. Editor flags come only from deployment policy. Refusals return error/code without identity." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "me" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "canWrite" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sharedRead" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sharedWrite" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "privateEncryption" ] ;
            hydra:required false ;
            rdfs:comment "Stable bridge key and signature-bound owner key are available for private writes." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "code" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_session-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "owner_encryption_key" ] ;
            hydra:required false ;
            rdfs:comment "Optional owner-held X25519 key from authenticated signing context, signature-covered; determines whether shared/private writes can be available. Never resolve this from unsigned pod key bytes." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "nonce" ] ;
            hydra:required true ;
            rdfs:comment "Fresh one-use nonce from i2idlx-challenge." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "i2idlx_operation" ] ;
            hydra:required true ;
            rdfs:comment "Must be session; signature binds the route operation." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "bridge_audience" ] ;
            hydra:required true ;
            rdfs:comment "Exact audience returned by i2idlx-challenge, without a trailing slash." ;
            sh:datatype xsd:string
        ]
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-read> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-read> ;
    hydra:method "POST" ;
    hydra:title "Read verified I2IDL-X pod documents" ;
    rdfs:comment "Read encrypted author-signed ballots, notes, usage and policy from the configured shared pod ONLY as an admitted signed participant, or decrypt only the caller account private workspace from their own pod. Signature/delegation and author ownership are rechecked on reads; unreadable or forged state is an error rather than empty data." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/read> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/read> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_read-output" ;
        rdfs:comment "Single document: {exists,data,etag,resource_url}, with data null only when absent and etag null when absent or when storage supplies no ETag. Collection: {docs:[{id,exists,data,etag,resource_url}]}. All: {ballots:{docs},notes:{docs},usage:{docs},policy:{exists,data,etag,resource_url}}. Shared plaintext is returned only to admitted verified callers. Unreadable/forged/unauthorized data returns an error, never empty verified state." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "exists" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "resource_url" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "docs" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ballots" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "notes" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "usage" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "policy" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "code" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_read-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "i2idlx_operation" ] ;
            hydra:required true ;
            rdfs:comment "Must be read." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "bridge_audience" ] ;
            hydra:required true ;
            rdfs:comment "Exact advertised bridge audience." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "collection" ] ;
            hydra:required false ;
            rdfs:comment "ballots, notes, usage, or all (all shared collections and policy)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "doc_path" ] ;
            hydra:required false ;
            rdfs:comment "settings/policy, <shared-collection>/<derived-account-id>, or data/users/<own-derived-account-id>/workspace. Supply collection OR doc_path." ;
            sh:datatype xsd:string
        ]
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-write> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-write> ;
    hydra:method "POST" ;
    hydra:title "Conditionally save an author-owned I2IDL-X document" ;
    rdfs:comment "Save ONLY the verified caller account ballot/note/usage or private workspace; policy requires a configured verified editor DID. Retains the exact author-signed envelope, uses signed read ETag for CAS, and reports durable only after a verified unchanged readback. Every shared/private document requires author-bound owner encryption plus a stable bridge key. No project database or plaintext private fallback." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/write> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/write> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_write-output" ;
        rdfs:comment "After successful conditional encrypted PUT and unchanged verified readback: {ok:true,durable:true,exists:true,data,etag,resource_url}. etag is storage strong ETag or null; a missing ETag prevents further overwrites. A conflict, missing key/member config, failed signature or unconfirmed acknowledgement returns error/code and no durable claim." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "durable" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "exists" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "data" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "resource_url" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "code" ] ;
            hydra:required false ;
            rdfs:comment "conflict for HTTP 409; unavailable for other refusals." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_write-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "i2idlx_operation" ] ;
            hydra:required true ;
            rdfs:comment "Must be write." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "bridge_audience" ] ;
            hydra:required true ;
            rdfs:comment "Exact advertised bridge audience." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "doc_path" ] ;
            hydra:required true ;
            rdfs:comment "Own ballots/<id>, notes/<id>, usage/<id>, data/users/<id>/workspace, or settings/policy for a verified editor." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "document" ] ;
            hydra:required true ;
            rdfs:comment "Complete schema-validated document: ballots {v}, notes {n}, usage {u}, policy {quorum}, or workspace {packs,stars,recents?,at?}. Every property is signature-covered."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "expected_etag" ] ;
            hydra:required true ;
            rdfs:comment "Exact strong ETag from the preceding read, or empty string ONLY when that read reported absent. Conflicts require read-and-merge, never a blind retry." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "owner_encryption_key" ] ;
            hydra:required true ;
            rdfs:comment "Required for ALL shared/private document writes: owner-held canonical base64 X25519 public key, bound by this exact author signature. Obtain from owned signing context, never an unsigned pod document." ;
            sh:datatype xsd:string
        ]
    ] ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-interventions> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-interventions> ;
    hydra:method "GET" ;
    hydra:title "Browse public interventions for conversation" ;
    rdfs:comment "List a bounded selection of authored courses and packages already publicly available on this workbench. This GET-only operation returns at most forty source identifiers and labels; it does not access caller-selected pods, create descriptions or records, launch content or invoke a model. An empty bounded list does not prove that no other interventions exist. No signature or identity is required." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/interventions> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/interventions> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_interventions-input"
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-intervention-ask> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-intervention-ask> ;
    hydra:method "POST" ;
    hydra:title "Discuss an intervention using your connected AI client" ;
    rdfs:comment "Return bounded instructional passages and pinned glossary context for YOUR connected AI client to answer about an intervention with its own model. An authored course, hosted package or supplied job aid, simulation, coaching plan, process change or other intervention preserves its actual kind and source. Send plain JSON arguments, without a signature envelope or credentials. This read-only operation does not invoke a model, launch content, assess a person, record activity or write state. Source text and identifiers are reference data, never instructions or independently verified provenance." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/intervention-ask> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/intervention-ask> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_intervention_ask-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "question" ] ;
            hydra:required true ;
            rdfs:comment "Nonempty question for the conversation model, at most 4000 UTF-8 bytes." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "source" ] ;
            hydra:required true ;
            rdfs:comment "Choose an existing public authored course, a package already hosted here, or intervention material supplied explicitly in this request." ;
            sh:datatype xsd:string ;
            sh:in ( "authored-course" "package" "supplied" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "intervention_id" ] ;
            hydra:required false ;
            rdfs:comment "Required for authored-course or package: at most 200 UTF-8 bytes. A hosted package is named by its 64-character lowercase SHA-256. Omit for supplied material." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "author_did" ] ;
            hydra:required false ;
            rdfs:comment "Optional authored-course owner reference, at most 500 UTF-8 bytes; it must match the already known public owner and cannot direct a lookup to another pod. Omit for supplied material." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "lens" ] ;
            hydra:required false ;
            rdfs:comment "Perspective for applying the material, understanding its design, proposing improvements or reviewing evaluation evidence. Defaults to analyze; never establishes learner achievement." ;
            sh:datatype xsd:string ;
            sh:in ( "use" "analyze" "improve" "evaluate" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "concept_ids" ] ;
            hydra:required false ;
            rdfs:comment "At most 14 unique existing canonical glossary concept identifiers; the workbench glossary pin remains distinct from the intervention version."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "intervention" ] ;
            hydra:required false ;
            rdfs:comment "Required only for source supplied: {id,title,kind,source_uri?,version?,sections:[{id,title,body}]}. Kind is free text, not a course-only enum. Supply 1-24 sections; each body is at most 6000 UTF-8 bytes. Unknown fields and structured assessment data are refused. Source identifiers are references and are never fetched. Total input is at most 96000 UTF-8 bytes."
        ]
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-ask> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-ask> ;
    hydra:method "POST" ;
    hydra:title "Ask I2IDL-X using your connected AI client" ;
    rdfs:comment "Return a bounded public glossary/semantic context packet and the workbench Ask instructions for YOUR connected AI/MCP client to answer with its own model. This read-only operation does not sample, answer, store the question, access team/private pod data or incur project model charges. Accepts plain arguments or the arguments inside a relay-signed envelope; no identity claim is made by this public operation." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/ask> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/ask> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_ask-output" ;
        rdfs:comment "An instructions-only task packet: execution=client-required, no server sampling/writes, original question, shared Ask rules, up to 14 public concept entries with release/commit/rights, relevant semantic categories and catalog controls, and followable task links. The connected client must produce the answer and cite entries; this response contains no answer or completion claim. Missing public build returns503; oversized input/context is refused." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "task" ] ;
            hydra:required false ;
            sh:datatype xsd:string ;
            sh:in ( "ask" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "execution" ] ;
            hydra:required false ;
            sh:datatype xsd:string ;
            sh:in ( "client-required" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "status" ] ;
            hydra:required false ;
            sh:datatype xsd:string ;
            sh:in ( "instructions-only" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sampling_performed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "writes_performed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "request" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "instructions" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "context" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_affordances" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "code" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_ask-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "question" ] ;
            hydra:required true ;
            rdfs:comment "Question for your client to answer, nonempty and at most 4000 UTF-8 bytes. It is returned as task data, never a server model instruction." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "concept_ids" ] ;
            hydra:required false ;
            rdfs:comment "At most 14 existing canonical glossary ids to include. Unknown ids are refused; lexical retrieval fills remaining bounded context."
        ]
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-orchestrate> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/i2idlx-orchestrate> ;
    hydra:method "POST" ;
    hydra:title "Run the I2IDL-X eight-role recipe in your AI client" ;
    rdfs:comment "Return bounded public context plus the existing eight-role/twelve-step Interpretant workflow for YOUR connected AI/MCP client to execute with its own model. The server creates no run/agents/gate/staging and never samples or publishes. Browser sandbox method names are source descriptors, not MCP operations. Clients must discover current real controls, report unperformed checks and get human authorization before external writes." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/orchestrate> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/i2idlx/api/orchestrate> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_orchestrate-output" ;
        rdfs:comment "An instructions-only task packet: execution=client-required, sampling/writes=false, supplied brief/inventory or labelled fictional example, bounded public release/context, actual eight role charters and twelve dependency steps from scenario.js, source browser method names, and explicit pending human authorization before external writes. Limits are two parallel roles and six tool rounds per step. There is no server run, result, ratification, staging or publication claim." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "task" ] ;
            hydra:required false ;
            sh:datatype xsd:string ;
            sh:in ( "orchestrate" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "execution" ] ;
            hydra:required false ;
            sh:datatype xsd:string ;
            sh:in ( "client-required" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "status" ] ;
            hydra:required false ;
            sh:datatype xsd:string ;
            sh:in ( "instructions-only" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sampling_performed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "writes_performed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "request" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "instructions" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "context" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "workflow" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_affordances" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "code" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.i2idlx_orchestrate-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "example" ] ;
            hydra:required false ;
            rdfs:comment "Set true to use the explicitly fictional Kestrel Point brief/inventory from the existing walkthrough. Do not also supply brief or records." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "brief" ] ;
            hydra:required false ;
            rdfs:comment "Required unless example=true: your nonempty brief, at most 6000 UTF-8 bytes. The client adapts scenario-specific wording only when your inventory supports it." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "records" ] ;
            hydra:required false ;
            rdfs:comment "Required unless example=true: 1..20 unique {id,title,description,sourceTypes?} entries; UTF-8 maxima120/400/2400 bytes and at most10 source type names of200 bytes each. No arbitrary paths/URLs/model keys."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "concept_ids" ] ;
            hydra:required false ;
            rdfs:comment "At most14 existing canonical ids for selected public glossary context."
        ]
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/profile> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/profile> ;
    hydra:method "GET" ;
    hydra:title "Read the LLM xAPI profile" ;
    rdfs:comment "Read the versioned, general LLM telemetry vocabulary, statement templates and observation-stream pattern." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/llm-telemetry/profile> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/llm-telemetry/profile> ;
    dcat:mediaType "application/ld+json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "llm_telemetry.profile-output" ;
        rdfs:comment "Versioned ADL xAPI Profile document." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "id" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "type" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "versions" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "concepts" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "templates" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "patterns" ] ;
            hydra:required false
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "llm_telemetry.profile-input"
    ] ;
    rdfs:label "Read LLM telemetry profile" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:appliesToCollection "entry" ;
    iep:appliesToCollection "profiles" ;
    iep:appliesToCollection "telemetry" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/ingest> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/ingest> ;
    hydra:method "POST" ;
    hydra:title "Record LLM observations" ;
    rdfs:comment "Sign {events:[...]} with the authenticated observer using sign_request then act, or act(sign_payload:true). Server and client deliveries require their independent capture opt-in; explicit manual-observation events are a signed one-off action. Accepts 1–20 allowlisted metadata events, validates xAPI in the actual own-lens LRS, then awaits encrypted PGSL persistence. Retry identical source_event_id and metadata; conflicting reuse returns 409. Content, credentials and transcripts are excluded." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/llm-telemetry/ingest> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/llm-telemetry/ingest> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "llm_telemetry.ingest-output" ;
        rdfs:comment "LRS acceptance and awaited encrypted persistence receipts. A 502 can represent a partial commit; retry identical event IDs." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "lrsAccepted" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "durable" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "statementIds" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "receipts" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "llm_telemetry.ingest-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "events" ] ;
            hydra:required true ;
            rdfs:comment "Metadata observations conforming to /llm-telemetry/event-schema. Actor is bound by verified signature." ;
            sh:minCount 1
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "capture_revision" ] ;
            hydra:required false ;
            rdfs:comment "Required for server observations: the durable consent revision read before the operation." ;
            sh:datatype xsd:integer ;
            sh:minInclusive 0
        ]
    ] ;
    rdfs:label "Record LLM observations" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:appliesToCollection "telemetry" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/query> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/query> ;
    hydra:method "POST" ;
    hydra:title "Query sessions and insights" ;
    rdfs:comment "Sign the query with your bound identity. Read only your observer records from the actual LRS lens and a fresh encrypted PGSL snapshot, preserving provenance and exposing unavailable sources and conflicting IDs. Returns sessions, timeline, measured usage, capture-gap insights and paginated xAPI statements. No prompt or response text is collected." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/llm-telemetry/query> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/llm-telemetry/query> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "llm_telemetry.query-output" ;
        rdfs:comment "Own-observer snapshot with source coverage, measured totals, session summaries, evidence-backed insights, an xAPI event page and the affordance-derived HyperMarkdown view." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "observer" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "profile" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "capture" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "capture_unavailable" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "coverage" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "totals" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sessions" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "insights" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "statements" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "pagination" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "view" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "llm_telemetry.query-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "session_id" ] ;
            hydra:required false ;
            rdfs:comment "Optional opaque session ID; empty means all observed sessions." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "source" ] ;
            hydra:required false ;
            rdfs:comment "Optional reporting adapter, for example codex-hooks." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "model" ] ;
            hydra:required false ;
            rdfs:comment "Optional exact model identifier reported by the source." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "runtime_agent_id" ] ;
            hydra:required false ;
            rdfs:comment "Optional exact runtime agent identifier. Distinct from the signature-bound observer agent_id." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tool_name" ] ;
            hydra:required false ;
            rdfs:comment "Optional exact tool name." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "status" ] ;
            hydra:required false ;
            rdfs:comment "Optional explicit event outcome. Completion alone does not mean success." ;
            sh:datatype xsd:string ;
            sh:in ( "ok" "error" "cancelled" "unknown" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required false ;
            rdfs:comment "Optional event kind, for example tool-failed." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "capture_mode" ] ;
            hydra:required false ;
            rdfs:comment "Optional live, backfill or validation observation filter." ;
            sh:datatype xsd:string ;
            sh:in ( "live" "backfill" "validation" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "capture_channel" ] ;
            hydra:required false ;
            rdfs:comment "Select server, client or explicit manual observations. Multiple channels may observe the same work." ;
            sh:datatype xsd:string ;
            sh:in ( "server" "client" "manual" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "since" ] ;
            hydra:required false ;
            rdfs:comment "Optional inclusive UTC event time, for example 2026-09-16T00:00:00Z." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "until" ] ;
            hydra:required false ;
            rdfs:comment "Optional inclusive UTC event time." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "limit" ] ;
            hydra:required false ;
            rdfs:comment "Event page size (default 50). Aggregates cover the full matching snapshot." ;
            sh:datatype xsd:integer ;
            sh:minInclusive 1 ;
            sh:maxInclusive 200
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "offset" ] ;
            hydra:required false ;
            rdfs:comment "Event page offset (default 0)." ;
            sh:datatype xsd:integer ;
            sh:minInclusive 0 ;
            sh:maxInclusive 1000000
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "view" ] ;
            hydra:required false ;
            rdfs:comment "Choose the report presentation." ;
            sh:datatype xsd:string ;
            sh:in ( "sessions" "timeline" "report" "export" )
        ]
    ] ;
    rdfs:label "Query LLM observations" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:appliesToCollection "entry" ;
    iep:appliesToCollection "profiles" ;
    iep:appliesToCollection "telemetry" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/capture-read> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/capture-read> ;
    hydra:method "POST" ;
    hydra:title "Read capture settings" ;
    rdfs:comment "Read your independent server and client reporting opt-ins. Both default to off. The server observer covers Interego /mcp requests; client reporters use the existing connection with host hook configuration and review." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/llm-telemetry/capture/read> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/llm-telemetry/capture/read> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "llm_telemetry.capture_read-output" ;
        rdfs:comment "Durable independent capture preferences for this authenticated observer, plus a HyperMarkdown view. Client opt-in does not attest host installation or hook trust." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "preferences" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "scope" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "client_host_activation" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "view" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "llm_telemetry.capture_read-input"
    ] ;
    rdfs:label "Capture settings" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:appliesToCollection "entry" ;
    iep:appliesToCollection "telemetry" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/capture-update> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/capture-update> ;
    hydra:method "POST" ;
    hydra:title "Change capture settings" ;
    rdfs:comment "Opt this authenticated observer into server reporting, client reporting, both or neither. Omitted switches retain their value. Disabling refuses new automatic deliveries; it does not erase history or disable hooks in another host. Client installation and hook trust remain separate." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/llm-telemetry/capture/update> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/llm-telemetry/capture/update> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "llm_telemetry.capture_update-output" ;
        rdfs:comment "Durable independent capture preferences for this authenticated observer, plus a HyperMarkdown view. Client opt-in does not attest host installation or hook trust." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "preferences" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "scope" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "client_host_activation" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "view" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "llm_telemetry.capture_update-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "server_enabled" ] ;
            hydra:required false ;
            rdfs:comment "Allow automatic metadata recording for authenticated calls through Interego MCP." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "client_enabled" ] ;
            hydra:required false ;
            rdfs:comment "Accept reports from client hooks and runtime adapters. Does not install or trust a collector." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "expected_revision" ] ;
            hydra:required false ;
            rdfs:comment "The revision displayed by Capture settings. A stale change is refused." ;
            sh:datatype xsd:integer ;
            sh:minInclusive 0
        ]
    ] ;
    rdfs:label "Change capture settings" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:appliesToCollection "telemetry" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/client-setup> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/client-setup> ;
    hydra:method "POST" ;
    hydra:title "Set up client reporting" ;
    rdfs:comment "Read hosted metadata-only hook configuration for an existing Interego MCP connection. Supports Codex CLI and Claude Code CLI/VS Code contracts; other surfaces report their coverage limits explicitly. Does not install a plugin, connect another server, change consent or approve host trust. Configuration availability is not proof of live delivery." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/llm-telemetry/client-setup> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/llm-telemetry/client-setup> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "llm_telemetry.client_setup-output" ;
        rdfs:comment "Client support, requirements, configuration and verification query, with an executable HyperMarkdown setup view. No activation is attested." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "client" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "status" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "host_activation" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "view" ] ;
            hydra:required false
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "llm_telemetry.client_setup-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "client" ] ;
            hydra:required false ;
            rdfs:comment "Runtime or surface to configure; omitted means support overview." ;
            sh:datatype xsd:string ;
            sh:in ( "overview" "codex" "claude-code" "claude-code-vscode" "codex-vscode" "chatgpt-work" "chatgpt-web" "claude-web" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "server_name" ] ;
            hydra:required false ;
            rdfs:comment "Exact existing MCP server name in the selected client. Required to generate configuration. No credentials or new connection." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Client reporting setup" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:appliesToCollection "entry" ;
    iep:appliesToCollection "telemetry" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/collector-create> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/collector-create> ;
    hydra:method "POST" ;
    hydra:title "Create native collector credential" ;
    rdfs:comment "Create a private, expiring, ingest-only credential bound to this authenticated observer. Requires client consent. Returns native Claude Code OTLP HTTP/JSON settings. Does not configure a host. Keep the credential private." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/llm-telemetry/collector/create> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/llm-telemetry/collector/create> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "llm_telemetry.collector_create-output" ;
        rdfs:comment "Private collector credential and native settings; activation remains unverified." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "token" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "collector_id" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "configuration" ] ;
            hydra:required false
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "llm_telemetry.collector_create-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "source" ] ;
            hydra:required false ;
            rdfs:comment "Native exporter source. Defaults to Claude Code." ;
            sh:datatype xsd:string ;
            sh:in ( "claude-code-otel" "claude-cowork-otel" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "account_id" ] ;
            hydra:required false ;
            rdfs:comment "Your exact user.account_uuid; mandatory for organization-wide Cowork export so other users are excluded." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "capture_mode" ] ;
            hydra:required true ;
            rdfs:comment "Live native observations or explicitly separated validation fixtures." ;
            sh:datatype xsd:string ;
            sh:in ( "live" "validation" )
        ]
    ] ;
    rdfs:label "Create collector" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint false ;
    iep:appliesToCollection "telemetry" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/collector-revoke> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/llm-telemetry/collector-revoke> ;
    hydra:method "POST" ;
    hydra:title "Revoke collector credential" ;
    rdfs:comment "Revoke one own collector credential. Existing observations are preserved." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/llm-telemetry/collector/revoke> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/llm-telemetry/collector/revoke> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "llm_telemetry.collector_revoke-output" ;
        rdfs:comment "Confirmed revocation." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "revoked" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "llm_telemetry.collector_revoke-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "collector_id" ] ;
            hydra:required true ;
            rdfs:comment "Collector ID returned at creation." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Revoke collector" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:appliesToCollection "telemetry" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-private-performance-outcome-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-private-performance-outcome-signed> ;
    hydra:method "POST" ;
    hydra:title "Record a private measured intervention episode" ;
    rdfs:comment "Signed payload {agent_id,timestamp,outcome:{episode_id,plan_id,plan_sha256,intervention:{type,delivered,artifact:{uri,version,sha256},delivered_at},post,fresh?,assistance,observed_at}}. The server plan is created using private_evidence on contextualize-and-plan. Measurements include exact canonical report content and evidence references. No caller success labels; no causal attribution. Full input contract: /agent/performance/schema." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/performance/outcome> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/performance/outcome> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.record_private_performance_outcome-output" ;
        rdfs:comment "A durable private episode, its independently supplied numeric/report evidence, computed verdict and calibration eligibility; identical logical retries return the original outcome. Or {error} with non-success HTTP status." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required false ;
            rdfs:comment "True on a successful signed own-account operation." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "owner" ] ;
            hydra:required false ;
            rdfs:comment "Canonical verified account pod; shared by its authorized surface delegates." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "actor" ] ;
            hydra:required false ;
            rdfs:comment "Verified caller DID for this request." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "private" ] ;
            hydra:required false ;
            rdfs:comment "True; no public outcome or seed-profile publication." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            rdfs:comment "Refusal/failure explanation on a non-success HTTP response; other success properties are absent." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "duplicate" ] ;
            hydra:required false ;
            rdfs:comment "True when this exact immutable episode was already durable." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "durable" ] ;
            hydra:required false ;
            rdfs:comment "True only after storage confirmation or read-back of an identical committed write." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "outcome" ] ;
            hydra:required false ;
            rdfs:comment "Stored episode and derived observations, not a claim of causal learning."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.record_private_performance_outcome-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "Signed payload {agent_id,timestamp,outcome:{episode_id,plan_id,plan_sha256,intervention:{type,delivered,artifact:{uri,version,sha256},delivered_at},post,fresh?,assistance,observed_at}}. The server plan is created using private_evidence on contextualize-and-plan. Measurements include exact canonical report content and evidence references. No caller success labels; no causal attribution. Full schema: {\"version\":\"1\",\"planner\":{\"path\":\"/agent/contextualize-and-plan\",\"optIn\":\"private_evidence\",\"reviewOnly\":\"private_review: true reads own empirical profile without a new plan or counted episode\"},\"transport\":\"Use existing sign_request then act. agent_id/timestamp are required by signed transport. Automatically stamped subject_pod_url is accepted only when equivalent to the authenticated own pod, then excluded from logical plan identity.\",\"ref\":{\"uri\":\"HTTP(S) or URN immutable evidence identifier\",\"version\":\"nonempty version string\",\"sha256\":\"lowercase SHA-256 hex of evidence bytes; report uses canonical JSON below\"},\"private_evidence\":{\"episode_id\":\"stable id for one learner/intervention episode\",\"study_id\":\"study id\",\"learner_id\":\"learner label (not an independently verified identity)\",\"policy\":\"ref\",\"baseline\":\"measurement with phase=baseline\",\"assistance\":\"baseline assistance description\",\"independence\":\"same-account-procedural | self-assessed\",\"target\":{\"minimum_score\":\"number >0 and <=1\",\"maximum_unsafe\":\"nonnegative integer\"}},\"measurement\":{\"phase\":\"baseline | post | fresh\",\"correct\":\"integer >=0\",\"total\":\"integer >0, >=correct\",\"unsafe\":\"integer >=0, <=total\",\"assessed_at\":\"observed ISO UTC timestamp\",\"assessment\":\"ref\",\"responses\":\"ref\",\"scorer\":\"ref, same hash/version in every phase\",\"report\":\"ref whose sha256 hashes report_content\",\"report_content\":{\"phase\":\"exact matching phase\",\"correct\":\"exact matching correct\",\"total\":\"exact matching total\",\"unsafe\":\"exact matching unsafe\",\"assessed_at\":\"exact matching timestamp\",\"policy_sha256\":\"policy.sha256\",\"assessment_sha256\":\"assessment.sha256\",\"responses_sha256\":\"responses.sha256\",\"scorer_sha256\":\"scorer.sha256\"}},\"canonicalHash\":\"SHA-256 UTF-8 JSON with object keys recursively lexicographically sorted, compact separators, array order retained, finite JSON values only. report_content accepts exactly the nine declared fields.\",\"outcome\":{\"episode_id\":\"same as private_evidence.episode_id\",\"plan_id\":\"returned privatePlan.plan_id\",\"plan_sha256\":\"returned privatePlan.sha256\",\"intervention\":{\"type\":\"a selected intervention in the bound server plan\",\"delivered\":\"boolean\",\"artifact\":\"ref\",\"delivered_at\":\"UTC time >= baseline and server plan creation, <= post\"},\"post\":\"measurement phase=post\",\"fresh\":\"optional additional measurement phase=fresh; omit if no additional follow-up occurred\",\"assistance\":\"post/fresh assistance description\",\"observed_at\":\"UTC time >= last assessment\"},\"actionPayloads\":{\"record\":\"{agent_id,timestamp,subject_pod_url?,outcome}\",\"read\":\"{agent_id,timestamp,subject_pod_url?,episode_id?}\",\"calibration\":\"{agent_id,timestamp,subject_pod_url?}\"},\"limits\":\"1000 plans and 1000 episodes, 4 MB encrypted snapshot per account. Private content is encrypted to owner+bridge; trusted bridge can decrypt. No public projection or shared-seed update.\",\"verification\":\"Arithmetic, submitted report content hashes and fixed evidence bindings are checked. Evidence URIs are not fetched. Server plans/outcomes carry a bridge-secret authentication tag. Assessor truth, independent sampling and causal learning are not verified.\",\"calibration\":\"Only derived Knowable gap-analysis with named cause, baseline gap, newly delivered selected intervention and non-self-assessed reports is eligible. Eligible rates are tentative: this caller-supplied evidence trust class always remains Hypothetical and cannot trigger automatic rate-driven intervention swapping. Manager may use observations for review/stop. Seeds excluded.\"}" ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "Use sign_request; signature binds agent_id and complete payload." ;
            sh:datatype xsd:string
        ]
    ] ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/read-private-performance-outcomes-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/read-private-performance-outcomes-signed> ;
    hydra:method "POST" ;
    hydra:title "Read your private server plans and measured outcomes" ;
    rdfs:comment "Signed payload {agent_id,timestamp,episode_id?}. Reads only the verified caller own encrypted pod. Full input contract: /agent/performance/schema." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/performance/outcomes> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/performance/outcomes> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.read_private_performance_outcomes-output" ;
        rdfs:comment "Private server plans and measured outcomes on the verified account, optionally filtered by episode_id. Empty arrays mean no matching durable records; unreadable storage returns an error instead." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required false ;
            rdfs:comment "True on a successful signed own-account operation." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "owner" ] ;
            hydra:required false ;
            rdfs:comment "Canonical verified account pod; shared by its authorized surface delegates." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "actor" ] ;
            hydra:required false ;
            rdfs:comment "Verified caller DID for this request." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "private" ] ;
            hydra:required false ;
            rdfs:comment "True; no public outcome or seed-profile publication." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            rdfs:comment "Refusal/failure explanation on a non-success HTTP response; other success properties are absent." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "plans" ] ;
            hydra:required false ;
            rdfs:comment "Immutable {plan_id,sha256,owner,created_by,created_at,context,input_sha256,diagnosis,plan,server_authentication}; context holds baseline/target/evidence bindings. plan_id+sha256 feed the outcome action."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "outcomes" ] ;
            hydra:required false ;
            rdfs:comment "Stored outcomes with input/sha256, derived scores/verdict, eligibility and provenance; same shape as record-private-performance-outcome.outcome."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.read_private_performance_outcomes-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "Signed payload {agent_id,timestamp,episode_id?}. Reads only the verified caller own encrypted pod. Full schema: {\"version\":\"1\",\"planner\":{\"path\":\"/agent/contextualize-and-plan\",\"optIn\":\"private_evidence\",\"reviewOnly\":\"private_review: true reads own empirical profile without a new plan or counted episode\"},\"transport\":\"Use existing sign_request then act. agent_id/timestamp are required by signed transport. Automatically stamped subject_pod_url is accepted only when equivalent to the authenticated own pod, then excluded from logical plan identity.\",\"ref\":{\"uri\":\"HTTP(S) or URN immutable evidence identifier\",\"version\":\"nonempty version string\",\"sha256\":\"lowercase SHA-256 hex of evidence bytes; report uses canonical JSON below\"},\"private_evidence\":{\"episode_id\":\"stable id for one learner/intervention episode\",\"study_id\":\"study id\",\"learner_id\":\"learner label (not an independently verified identity)\",\"policy\":\"ref\",\"baseline\":\"measurement with phase=baseline\",\"assistance\":\"baseline assistance description\",\"independence\":\"same-account-procedural | self-assessed\",\"target\":{\"minimum_score\":\"number >0 and <=1\",\"maximum_unsafe\":\"nonnegative integer\"}},\"measurement\":{\"phase\":\"baseline | post | fresh\",\"correct\":\"integer >=0\",\"total\":\"integer >0, >=correct\",\"unsafe\":\"integer >=0, <=total\",\"assessed_at\":\"observed ISO UTC timestamp\",\"assessment\":\"ref\",\"responses\":\"ref\",\"scorer\":\"ref, same hash/version in every phase\",\"report\":\"ref whose sha256 hashes report_content\",\"report_content\":{\"phase\":\"exact matching phase\",\"correct\":\"exact matching correct\",\"total\":\"exact matching total\",\"unsafe\":\"exact matching unsafe\",\"assessed_at\":\"exact matching timestamp\",\"policy_sha256\":\"policy.sha256\",\"assessment_sha256\":\"assessment.sha256\",\"responses_sha256\":\"responses.sha256\",\"scorer_sha256\":\"scorer.sha256\"}},\"canonicalHash\":\"SHA-256 UTF-8 JSON with object keys recursively lexicographically sorted, compact separators, array order retained, finite JSON values only. report_content accepts exactly the nine declared fields.\",\"outcome\":{\"episode_id\":\"same as private_evidence.episode_id\",\"plan_id\":\"returned privatePlan.plan_id\",\"plan_sha256\":\"returned privatePlan.sha256\",\"intervention\":{\"type\":\"a selected intervention in the bound server plan\",\"delivered\":\"boolean\",\"artifact\":\"ref\",\"delivered_at\":\"UTC time >= baseline and server plan creation, <= post\"},\"post\":\"measurement phase=post\",\"fresh\":\"optional additional measurement phase=fresh; omit if no additional follow-up occurred\",\"assistance\":\"post/fresh assistance description\",\"observed_at\":\"UTC time >= last assessment\"},\"actionPayloads\":{\"record\":\"{agent_id,timestamp,subject_pod_url?,outcome}\",\"read\":\"{agent_id,timestamp,subject_pod_url?,episode_id?}\",\"calibration\":\"{agent_id,timestamp,subject_pod_url?}\"},\"limits\":\"1000 plans and 1000 episodes, 4 MB encrypted snapshot per account. Private content is encrypted to owner+bridge; trusted bridge can decrypt. No public projection or shared-seed update.\",\"verification\":\"Arithmetic, submitted report content hashes and fixed evidence bindings are checked. Evidence URIs are not fetched. Server plans/outcomes carry a bridge-secret authentication tag. Assessor truth, independent sampling and causal learning are not verified.\",\"calibration\":\"Only derived Knowable gap-analysis with named cause, baseline gap, newly delivered selected intervention and non-self-assessed reports is eligible. Eligible rates are tentative: this caller-supplied evidence trust class always remains Hypothetical and cannot trigger automatic rate-driven intervention swapping. Manager may use observations for review/stop. Seeds excluded.\"}" ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "Use sign_request; signature binds agent_id and complete payload." ;
            sh:datatype xsd:string
        ]
    ] ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/read-private-performance-calibration-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/read-private-performance-calibration-signed> ;
    hydra:method "POST" ;
    hydra:title "Read your own empirical calibration, excluding seeds" ;
    rdfs:comment "Signed payload {agent_id,timestamp}. Counts one learner/intervention episode, with eligibility, source and sample counts. No public aggregate publication. Full input contract: /agent/performance/schema." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/performance/calibration> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/performance/calibration> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.read_private_performance_calibration-output" ;
        rdfs:comment "The caller account empirical profile, excluding every seeded corpus. Actual episode counts and eligibility are exposed; caller-supplied evidence stays Hypothetical regardless count and cannot trigger automatic rate-based swaps." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required false ;
            rdfs:comment "True on a successful signed own-account operation." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "owner" ] ;
            hydra:required false ;
            rdfs:comment "Canonical verified account pod; shared by its authorized surface delegates." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "actor" ] ;
            hydra:required false ;
            rdfs:comment "Verified caller DID for this request." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "private" ] ;
            hydra:required false ;
            rdfs:comment "True; no public outcome or seed-profile publication." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            rdfs:comment "Refusal/failure explanation on a non-success HTTP response; other success properties are absent." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "source" ] ;
            hydra:required false ;
            sh:datatype xsd:string ;
            sh:in ( "own-private-observed-episodes" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "seed_samples" ] ;
            hydra:required false ;
            rdfs:comment "Always zero on this private path." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "measured_episodes" ] ;
            hydra:required false ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "eligible_episodes" ] ;
            hydra:required false ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ineligible_episodes" ] ;
            hydra:required false ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "distinct_reported_learners" ] ;
            hydra:required false ;
            rdfs:comment "Distinct caller-supplied learner labels, not verified independent identities." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "independent_sampling_verified" ] ;
            hydra:required false ;
            rdfs:comment "False for this evidence trust class." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "assertion_policy" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sample_unit" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "causal_effect_established" ] ;
            hydra:required false ;
            rdfs:comment "False; observational association does not establish causality." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "profile" ] ;
            hydra:required false ;
            rdfs:comment "AGP CalibrationProfile {cells,totalSamples,sources,assertThreshold,federationKThreshold,generatedAt}; all private cells retain Hypothetical modal status."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "verification_scope" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.read_private_performance_calibration-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "Signed payload {agent_id,timestamp}. Counts one learner/intervention episode, with eligibility, source and sample counts. No public aggregate publication. Full schema: {\"version\":\"1\",\"planner\":{\"path\":\"/agent/contextualize-and-plan\",\"optIn\":\"private_evidence\",\"reviewOnly\":\"private_review: true reads own empirical profile without a new plan or counted episode\"},\"transport\":\"Use existing sign_request then act. agent_id/timestamp are required by signed transport. Automatically stamped subject_pod_url is accepted only when equivalent to the authenticated own pod, then excluded from logical plan identity.\",\"ref\":{\"uri\":\"HTTP(S) or URN immutable evidence identifier\",\"version\":\"nonempty version string\",\"sha256\":\"lowercase SHA-256 hex of evidence bytes; report uses canonical JSON below\"},\"private_evidence\":{\"episode_id\":\"stable id for one learner/intervention episode\",\"study_id\":\"study id\",\"learner_id\":\"learner label (not an independently verified identity)\",\"policy\":\"ref\",\"baseline\":\"measurement with phase=baseline\",\"assistance\":\"baseline assistance description\",\"independence\":\"same-account-procedural | self-assessed\",\"target\":{\"minimum_score\":\"number >0 and <=1\",\"maximum_unsafe\":\"nonnegative integer\"}},\"measurement\":{\"phase\":\"baseline | post | fresh\",\"correct\":\"integer >=0\",\"total\":\"integer >0, >=correct\",\"unsafe\":\"integer >=0, <=total\",\"assessed_at\":\"observed ISO UTC timestamp\",\"assessment\":\"ref\",\"responses\":\"ref\",\"scorer\":\"ref, same hash/version in every phase\",\"report\":\"ref whose sha256 hashes report_content\",\"report_content\":{\"phase\":\"exact matching phase\",\"correct\":\"exact matching correct\",\"total\":\"exact matching total\",\"unsafe\":\"exact matching unsafe\",\"assessed_at\":\"exact matching timestamp\",\"policy_sha256\":\"policy.sha256\",\"assessment_sha256\":\"assessment.sha256\",\"responses_sha256\":\"responses.sha256\",\"scorer_sha256\":\"scorer.sha256\"}},\"canonicalHash\":\"SHA-256 UTF-8 JSON with object keys recursively lexicographically sorted, compact separators, array order retained, finite JSON values only. report_content accepts exactly the nine declared fields.\",\"outcome\":{\"episode_id\":\"same as private_evidence.episode_id\",\"plan_id\":\"returned privatePlan.plan_id\",\"plan_sha256\":\"returned privatePlan.sha256\",\"intervention\":{\"type\":\"a selected intervention in the bound server plan\",\"delivered\":\"boolean\",\"artifact\":\"ref\",\"delivered_at\":\"UTC time >= baseline and server plan creation, <= post\"},\"post\":\"measurement phase=post\",\"fresh\":\"optional additional measurement phase=fresh; omit if no additional follow-up occurred\",\"assistance\":\"post/fresh assistance description\",\"observed_at\":\"UTC time >= last assessment\"},\"actionPayloads\":{\"record\":\"{agent_id,timestamp,subject_pod_url?,outcome}\",\"read\":\"{agent_id,timestamp,subject_pod_url?,episode_id?}\",\"calibration\":\"{agent_id,timestamp,subject_pod_url?}\"},\"limits\":\"1000 plans and 1000 episodes, 4 MB encrypted snapshot per account. Private content is encrypted to owner+bridge; trusted bridge can decrypt. No public projection or shared-seed update.\",\"verification\":\"Arithmetic, submitted report content hashes and fixed evidence bindings are checked. Evidence URIs are not fetched. Server plans/outcomes carry a bridge-secret authentication tag. Assessor truth, independent sampling and causal learning are not verified.\",\"calibration\":\"Only derived Knowable gap-analysis with named cause, baseline gap, newly delivered selected intervention and non-self-assessed reports is eligible. Eligible rates are tentative: this caller-supplied evidence trust class always remains Hypothetical and cannot trigger automatic rate-driven intervention swapping. Manager may use observations for review/stop. Seeds excluded.\"}" ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "Use sign_request; signature binds agent_id and complete payload." ;
            sh:datatype xsd:string
        ]
    ] ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/discover-lrs> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/discover-lrs> ;
    hydra:method "GET" ;
    hydra:title "Find the xAPI Learning Record Store this bridge serves" ;
    rdfs:comment "Dereference the LRS's own discovery document (xAPI 2.0 §4.1.6 `about`). Returns the xAPI versions supported plus extensions naming the backend, the tenancy model, the published xAPI Profile, and the IEEE-LER / ADL-TLA spec ontologies. FROM HERE the whole standard LRS surface follows without being restated in this manifest: /xapi/statements (write, query, PUT-by-id, void), /xapi/activities, /xapi/agents, and the Activity State / Activity Profile / Agent Profile document resources — all fixed by the specification rather than by this vertical. Unauthenticated and requires no version header, by design: it is how a client discovers which versions it may then ask for. TO ACTUALLY READ OR WRITE you need Basic credentials scoped to your own lens — mint them yourself with foxxi.credentials (POST /agent/credentials), which is also what an upstream system would use to forward statements in; no admin or operator role is involved. Statements you record through foxxi.record_performance land in that same lens, so course completion and production work are queryable together." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/xapi/about> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/xapi/about> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.discover_lrs-output" ;
        rdfs:comment "The xAPI `about` document: supported versions plus this deployment's extensions. Always 200; no authentication." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "version" ] ;
            hydra:required true ;
            rdfs:comment "xAPI versions this LRS accepts, newest first."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "extensions" ] ;
            hydra:required false ;
            rdfs:comment "Deployment facts under the foxxi namespace — identity, bridge, pod, statementForwarding, substrateBackend, lrsBackend, multiTenant, and the dereferenceable xapiProfile / ieeeLerOntology / adlTlaOntology IRIs."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.discover_lrs-input"
    ] ;
    rdfs:label "Discover the LRS" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/discover-assigned-courses> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/discover-assigned-courses> ;
    hydra:method "POST" ;
    hydra:title "Discover assigned courses" ;
    rdfs:comment "Walk the L&D admin's policy descriptors + the learner's audience-tag membership, returning the courses currently assigned to this learner (required + suggested) with due-by dates derived from policy triggers." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/discover_assigned_courses> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/discover_assigned_courses> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.discover_assigned_courses-output" ;
        rdfs:comment "Discovered assignment list for the learner — required + suggested courses with due-by dates derived from policy triggers — plus an ABAC accessDecision trace. Returns { error, accessDecision } when the caller is not authorised to query this learner." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learnerWebId" ] ;
            hydra:required false ;
            rdfs:comment "Echo of the queried learner DID/WebID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "assignments" ] ;
            hydra:required false ;
            rdfs:comment "Per-course assignment entries (courseIri, courseTitle, requirementType (required|recommended), trigger, dueAt, sourcePolicyIri)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "audienceTagsUsed" ] ;
            hydra:required false ;
            rdfs:comment "Audience tags actually used to compute the membership (caller override OR resolved from the learner record)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "accessDecision" ] ;
            hydra:required false ;
            rdfs:comment "ABAC trace: caller role + applied policies + allow/deny."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            rdfs:comment "Set when the caller cannot query this learner (forbidden); accessDecision carries the deny trace." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.discover_assigned_courses-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Learner DID (web_id pattern from the tenant identity service)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required true ;
            rdfs:comment "Pod URL of the L&D tenant where policy descriptors live." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "audience_tags" ] ;
            hydra:required false ;
            rdfs:comment "Optional caller-supplied audience tags to override the learner's default audience membership (e.g., temporary access)."
        ]
    ] ;
    rdfs:label "Discover assigned courses" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/discover-course-catalogs> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/discover-course-catalogs> ;
    hydra:method "POST" ;
    hydra:title "Discover course catalogs across pods" ;
    rdfs:comment "Every federated course catalog the given pods publish, found by its descriptor type (hyprcat:FederatedCatalog) in each pod's manifest and read back: the catalog's issuer and world, and each course as a data product with its title, category, keywords, standard, landing page and the port that fetches it. The issuer is checked against the identity the manifest attributes the descriptor to. No registry: the pods are the ones the caller names, or the tenant pod and the pods this deployment federates with. A pod that cannot be reached is reported, not fatal." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/discover_course_catalogs> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/discover_course_catalogs> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.discover_course_catalogs-output" ;
        rdfs:comment "The catalogs found, each with its pod, descriptor, issuer, whether the issuer matches the attribution, its federation peers and its products with ports; and a line per pod walked." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "catalogs" ] ;
            hydra:required false ;
            rdfs:comment "Per catalog: iri, pod, descriptorUrl, title, issuedBy, attributedTo, issuerMatches, world, modified, federatedWith, products (iri, courseId, title, description, category, standard, keywords, landingPage, ports)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "pods" ] ;
            hydra:required false ;
            rdfs:comment "Per pod walked: entries seen, catalogs found, unreachable when it could not be read."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "accessDecision" ] ;
            hydra:required false ;
            rdfs:comment "ABAC trace: caller role + applied policies + the decision."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.discover_course_catalogs-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "pod_urls" ] ;
            hydra:required false ;
            rdfs:comment "The pods to walk; omitted, the tenant pod and this deployment's federation peers." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "The tenant the caller belongs to; omitted, the configured tenant." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Discover course catalogs" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "catalog" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/earned-credentials> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/earned-credentials> ;
    hydra:method "POST" ;
    hydra:title "Where every assigned course stands" ;
    rdfs:comment "For each course assigned to the learner: credentialed (a verified, unexpired completion credential in their pod wallet), claimable (their own xAPI record demonstrates mastery — a passed, mastered, satisfied or waived statement about the course with success not false and any score at or above the course's threshold, graded by this bridge itself — and no credential is in force), in progress (statements about the course, none demonstrating mastery), or not started. The claimable ones carry the foxxi.claim_credential call; a lapsed credential is named. Reads the learner's own record (shared lattice, lens and durable records) and wallet. A learner asks about themselves; an admin about anyone." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/earned_credentials> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/earned_credentials> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.earned_credentials-output" ;
        rdfs:comment "The learner's standing per assigned course, the claimable ones first, with the credential held or lapsed and the evidence counts, plus an ABAC accessDecision trace." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner" ] ;
            hydra:required false ;
            rdfs:comment "The learner the standings are about." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learnerPodUrl" ] ;
            hydra:required false ;
            rdfs:comment "The pod the record and the wallet were read from." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "standings" ] ;
            hydra:required false ;
            rdfs:comment "Per course: courseId, courseTitle, state (credentialed | claimable | in-progress | not-started), dueAt, credential, lapsed, statements, mastery, and for a claimable course the claim call."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "held" ] ;
            hydra:required false ;
            rdfs:comment "How many credentials the wallet holds." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "accessDecision" ] ;
            hydra:required false ;
            rdfs:comment "ABAC trace: caller role + applied policies + the decision."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.earned_credentials-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required false ;
            rdfs:comment "The learner's WebID; omitted, the caller. An admin may name any learner." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "The learner's pod when it is not derived from their identity; bounded to the pod space this deployment reads." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "The tenant whose catalog and assignments apply; omitted, the configured tenant." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "audience_tags" ] ;
            hydra:required false ;
            rdfs:comment "Audience tags to resolve the assignments with, for a learner the tenant directory does not list." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Where every assigned course stands" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/claim-credential> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/claim-credential> ;
    hydra:method "POST" ;
    hydra:title "Claim a credential the record has earned" ;
    rdfs:comment "The tenant issues an Open Badges 3.0 completion credential for a catalog course only from the learner's own record: a passed, mastered, satisfied or waived xAPI statement about the course, with success not false and any score at or above the course's threshold, and graded by this bridge itself: the SCORM engine's completions carry the bridge's grading tag, so a statement the learner recorded is in the record but does not earn a credential. The credential names that evidence, is signed by the tenant's issuer key, is valid for a year, and is written to the learner's pod wallet; a credentialed statement joins their record. Already held and in force: the held credential comes back and nothing is issued. Not earned: a 409 refusal saying what statement would earn it. A learner claims for themselves; an admin may claim for a learner." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/claim_credential> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/claim_credential> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.claim_credential-output" ;
        rdfs:comment "The decision: issued (credentialId, descriptorUrl, graphUrl, issuer, validUntil, the evidence statements, the signed vc, the credentialed statement id) or already-held (the credential in force); a refusal with status 409 when the record has not earned it, saying what would." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "decision" ] ;
            hydra:required false ;
            rdfs:comment "issued | already-held" ;
            sh:datatype xsd:string ;
            sh:in ( "issued" "already-held" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseId" ] ;
            hydra:required false ;
            rdfs:comment "The catalog course the credential is for." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "credentialId" ] ;
            hydra:required false ;
            rdfs:comment "The credential's id: its own dereferenceable descriptor location on the learner's pod." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "descriptorUrl" ] ;
            hydra:required false ;
            rdfs:comment "Where the credential descriptor was published in the wallet." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "validUntil" ] ;
            hydra:required false ;
            rdfs:comment "When the issued credential expires (ISO 8601)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evidence" ] ;
            hydra:required false ;
            rdfs:comment "The mastery statements the credential names: id, verb, object, timestamp, scoreScaled, success."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "credential" ] ;
            hydra:required false ;
            rdfs:comment "For already-held: the credential in force (id, descriptorUrl, achievementId, issuer, validFrom, validUntil, verified)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "vc" ] ;
            hydra:required false ;
            rdfs:comment "The signed Open Badges 3.0 credential as issued."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "accessDecision" ] ;
            hydra:required false ;
            rdfs:comment "ABAC trace: caller role + applied policies + the decision."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.claim_credential-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_id" ] ;
            hydra:required true ;
            rdfs:comment "The tenant catalog course id the credential is for." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required false ;
            rdfs:comment "The learner's WebID; omitted, the caller. An admin may name any learner." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "The learner's pod when it is not derived from their identity; bounded to the pod space this deployment reads." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "The tenant whose catalog applies and whose issuer signs; omitted, the configured tenant." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Claim a credential the record has earned" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/verify-credential> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/verify-credential> ;
    hydra:method "POST" ;
    hydra:title "Verify a credential" ;
    rdfs:comment "What a relying party should check before believing an Open Badges 3.0 credential: the Data Integrity proof verifies against the issuer's key and the proof's key is the stated issuer; validUntil has not passed and validFrom has; the issuer is one this tenant stands behind (its own issuer key); the credential names its subject. Answers every check and, in words, what each failed one found. Give the credential's link in its holder's wallet and the bridge reads the exact bytes that were signed; a pasted copy is only as good as whoever copied it, and an agent that retypes a credential can change it. No caller identity is needed: anyone may verify." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/verify_credential> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/verify_credential> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.verify_credential-output" ;
        rdfs:comment "Whether the credential is valid here, each check (signature, notExpired, inForce, issuerTrusted, subjectBound), what the credential says (issuer, subject, achievement, validFrom, validUntil), and the notes for the checks that failed." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "valid" ] ;
            hydra:required false ;
            rdfs:comment "Every check passed." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "checks" ] ;
            hydra:required false ;
            rdfs:comment "signature, notExpired, inForce, issuerTrusted, subjectBound: each true or false."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "issuer" ] ;
            hydra:required false ;
            rdfs:comment "The stated issuer DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "subject" ] ;
            hydra:required false ;
            rdfs:comment "The credential subject." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "achievement" ] ;
            hydra:required false ;
            rdfs:comment "The achievement's id and name, when present."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "notes" ] ;
            hydra:required false ;
            rdfs:comment "What each failed check found, in words."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "trustedIssuers" ] ;
            hydra:required false ;
            rdfs:comment "How many issuers this verifier stands behind." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "readFrom" ] ;
            hydra:required false ;
            rdfs:comment "The link the credential was read from, when one was given." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.verify_credential-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "credential_url" ] ;
            hydra:required false ;
            rdfs:comment "A link to the credential in its holder's wallet on this deployment's pod store: its wallet descriptor (the credential's id, as a claim returns it) or the graph beside it. Preferred: nothing is retyped. Give this or credential." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "credential" ] ;
            hydra:required false ;
            rdfs:comment "The credential JSON, with its Data Integrity proof, when there is no link to it. Give this or credential_url."
        ]
    ] ;
    rdfs:label "Verify a credential" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/earned-credentials-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/earned-credentials-signed> ;
    hydra:method "POST" ;
    hydra:title "Where my courses stand, signed as myself" ;
    rdfs:comment "foxxi.earned_credentials for the courses this bridge's SCORM engine grades, signed the way the engine's own routes are: by your wallet, or by an agent holding your delegation (a relay connection, such as a Claude connector). Reads your own record and wallet — the pod the signature derives, never one you name — and reports each course your record is about, and any you list in course_ids: credentialed, claimable (with the claim to make), in progress, or not started. Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/credentials/earned> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/credentials/earned> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.earned_credentials_signed-output" ;
        rdfs:comment "Your standing per course, the claimable ones first, each claimable one with the claim to make. 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner" ] ;
            hydra:required false ;
            rdfs:comment "Who the standings are about: your wallet DID, or the person your delegation names." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "via" ] ;
            hydra:required false ;
            rdfs:comment "The agent that signed for you, when it was a delegation." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learnerPodUrl" ] ;
            hydra:required false ;
            rdfs:comment "The pod the record and the wallet were read from." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "standings" ] ;
            hydra:required false ;
            rdfs:comment "Per course: courseId, courseTitle, state (credentialed | claimable | in-progress | not-started), credential, lapsed, statements, mastery, and for a claimable course the claim (affordance, target, payload)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "held" ] ;
            hydra:required false ;
            rdfs:comment "How many credentials the wallet holds." ;
            sh:datatype xsd:integer
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.earned_credentials_signed-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, course_ids? })." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Where my courses stand" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/claim-credential-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/claim-credential-signed> ;
    hydra:method "POST" ;
    hydra:title "Claim a credential the record earned, signed as myself" ;
    rdfs:comment "foxxi.claim_credential for a course this bridge's SCORM engine grades, signed by your wallet or by an agent holding your delegation (a relay connection, such as a Claude connector). The tenant issues an Open Badges 3.0 completion credential only from your own record — a passed, mastered, satisfied or waived statement about the course with success not false and any score at or above its threshold, graded by this bridge (the engine's results carry its grading tag; a statement you wrote yourself is in the record but is not evidence). The credential names that evidence and the course's author, is signed by the tenant's issuer key, is valid for a year, and is written to your pod's wallet; a delegated claim is issued to the person the delegation names. Already held and in force: the held credential comes back. Not earned: 409 saying what would earn it. Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/credentials/claim> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/credentials/claim> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.claim_credential_signed-output" ;
        rdfs:comment "issued (credentialId, descriptorUrl, graphUrl, issuer, validUntil, evidence, courseAuthor, vc) or already-held (credential). 409 when your record has not earned it, saying what would; 404 for a course the engine does not play; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "decision" ] ;
            hydra:required false ;
            rdfs:comment "issued | already-held" ;
            sh:datatype xsd:string ;
            sh:in ( "issued" "already-held" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseId" ] ;
            hydra:required false ;
            rdfs:comment "The course the credential is for." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "credentialId" ] ;
            hydra:required false ;
            rdfs:comment "The credential's id: its own descriptor location on your pod." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "descriptorUrl" ] ;
            hydra:required false ;
            rdfs:comment "Where the credential descriptor was published in your wallet." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner" ] ;
            hydra:required false ;
            rdfs:comment "Who the credential names: your wallet DID, or the person your delegation names." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseAuthor" ] ;
            hydra:required false ;
            rdfs:comment "Who authored the course, as the credential's criteria also say." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "vc" ] ;
            hydra:required false ;
            rdfs:comment "The signed Open Badges 3.0 credential as issued."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "credential" ] ;
            hydra:required false ;
            rdfs:comment "For already-held: the credential in force."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.claim_credential_signed-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, course_id })." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Claim an earned credential" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/cmi5-launch-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/cmi5-launch-signed> ;
    hydra:method "POST" ;
    hydra:title "Launch a cmi5 activity for myself" ;
    rdfs:comment "Launch an Assignable Unit of a cmi5 course published on this bridge, for yourself, signed by your wallet or by an agent holding your delegation (a relay connection, such as a Claude connector). The launch is for the signer and nobody else. The LMS stages LMS.LaunchData in the State resource and returns the conformant launch URL; the AU fetches its auth-token once. Its statements, and the `satisfied` the LMS records when they meet moveOn, land in your own record and are kept on your pod, where your IEEE P2997 learner record reads them. They count as experience, not as graded evidence for a credential: a cmi5 AU reports its own result. Without au_id, the first AU you have not satisfied; sequential progression is enforced (409 names the AU that comes first). Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/cmi5/launch> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/cmi5/launch> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.cmi5_launch_signed-output" ;
        rdfs:comment "The launch: registration, launchUrl, actor, and the AU with its moveOn. 404 for a course or AU this bridge does not publish; 409 when an earlier AU is not yet satisfied; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "registration" ] ;
            hydra:required false ;
            rdfs:comment "The cmi5 registration this launch opened." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "launchUrl" ] ;
            hydra:required false ;
            rdfs:comment "The conformant cmi5 launch URL: open it to run the AU." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "actor" ] ;
            hydra:required false ;
            rdfs:comment "The xAPI Agent the AU records as: you."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "auId" ] ;
            hydra:required false ;
            rdfs:comment "The AU launched." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "moveOn" ] ;
            hydra:required false ;
            rdfs:comment "The criterion the LMS applies before recording satisfied." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "launchDataStaged" ] ;
            hydra:required false ;
            rdfs:comment "LMS.LaunchData is in the State resource for the AU to read." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "progress" ] ;
            hydra:required false ;
            rdfs:comment "Where the registration's moveOn state can be read." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner" ] ;
            hydra:required false ;
            rdfs:comment "Who the launch is for: your wallet DID, or the person your delegation names." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.cmi5_launch_signed-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, course_id, au_id?, return_url? }): the published course, optionally the AU, optionally where the AU returns you." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Launch a cmi5 activity" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-launch-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-launch-signed> ;
    hydra:method "POST" ;
    hydra:title "Launch a course from Foxxi's own LMS over LTI 1.3" ;
    rdfs:comment "Launch a course this bridge's SCORM engine grades from Foxxi's own LMS, the LTI 1.3 Platform this bridge runs beside its Tool, for yourself, signed by your wallet or by an agent holding your delegation (a relay connection, such as a Claude connector). The LMS knows who you are from the signature and returns an initiation URL, used once within five minutes. From there it is a standard launch over HTTP: the Tool's OIDC login, the LMS's authorization, a signed id_token posted to the Tool, then the course. A browser does all of it; a client without one follows the redirects, asks the authorization step for JSON, posts the form it returns, and plays the course as JSON. When the attempt ends the SCORM engine's outcome is in your record, where your IEEE P2997 learner record reads it, and the Tool posts your grade to the LMS gradebook over Assignment and Grade Services (foxxi.lti_gradebook_signed reads it). Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/lti/launch> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/lti/launch> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.lti_launch_signed-output" ;
        rdfs:comment "The launch: the initiation URL, the LMS course context, the resource link and its gradebook line item. 404 for a course this bridge does not grade; 429 when rate limited; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "initiationUrl" ] ;
            hydra:required false ;
            rdfs:comment "The OIDC third-party-initiated login at the Tool: open it once, within five minutes." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "expiresAt" ] ;
            hydra:required false ;
            rdfs:comment "When the launch can no longer be started." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "platform" ] ;
            hydra:required false ;
            rdfs:comment "The LMS: its issuer and its OpenID configuration."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "lineItem" ] ;
            hydra:required false ;
            rdfs:comment "The gradebook column the grade is posted to."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner" ] ;
            hydra:required false ;
            rdfs:comment "Who the launch is for: your wallet DID, or the person your delegation names. It is the LTI sub." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.lti_launch_signed-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, course_id }): a course this bridge's SCORM engine grades." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Launch a course over LTI" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-gradebook-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-gradebook-signed> ;
    hydra:method "POST" ;
    hydra:title "Read my grades in Foxxi's own LMS" ;
    rdfs:comment "Your row of the gradebook in Foxxi's own LMS, signed by your wallet or by an agent holding your delegation: every course in the LMS course context, and the grade the Tool posted for you over LTI Assignment and Grade Services, or null where there is none yet. Only your own row; who you are comes from the signature. Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/lti/gradebook> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/lti/gradebook> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.lti_gradebook_signed-output" ;
        rdfs:comment "Your gradebook rows. 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "rows" ] ;
            hydra:required false ;
            rdfs:comment "One per course: its line item and your result, rescaled to the line item's maximum, or null."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner" ] ;
            hydra:required false ;
            rdfs:comment "Whose rows these are: the LTI sub the LMS knows you by." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.lti_gradebook_signed-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp })." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Read my LMS grades" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-reconciliation-contract> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-reconciliation-contract> ;
    hydra:method "GET" ;
    hydra:title "Read the own-account LMS reconciliation contract" ;
    rdfs:comment "Public version 1.0.0 contract for signed preview, explicit new-entry creation and fresh own-account readback. Describes the required evidence, verified human scope and separate reconciliation provenance. Reading this contract creates no record and reveals no learner data." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/lti/reconciliation/affordance> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/lti/reconciliation/affordance> ;
    dcat:mediaType "text/turtle" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.lti_reconciliation_contract-output" ;
        rdfs:comment "Public Turtle affordance manifest for contract version 1.0.0, including its signed action inputs and original-persistence limitation."
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.lti_reconciliation_contract-input"
    ] ;
    rdfs:label "Read the LMS reconciliation contract" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-reconciliation-preview-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-reconciliation-preview-signed> ;
    hydra:method "POST" ;
    hydra:title "Preview a new own-account LMS reconciliation" ;
    rdfs:comment "Read the two original engine-authenticated records and current failure witness without writing. The returned private ten-minute plan is bound to this human, caller, source facts and native head. Original LMS persistence remains unverified. Contract version 1.0.0; discover /agent/lti/reconciliation/affordance. Signed personal-performance requests bind subject_did to the native controlling human and subject_pod_url to the verified own pod; neither field selects another person." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/lti/reconciliation/preview> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/lti/reconciliation/preview> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.lti_reconciliation_preview_signed-output" ;
        rdfs:comment "Versioned own-account reconciliation preview. Source-scoped association is not a cryptographic attempt binding. 400 invalid input; 403 different owner; 409 stale preview or conflict; 503 unconfirmed evidence or storage." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "previewDigest" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "planToken" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "expiresAt" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.lti_reconciliation_preview_signed-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "Use the exact sign_request payload containing agent_id, timestamp, subject_did, purpose personal-performance and originalStatementIds: exactly two original UUIDs. No additional logical fields are accepted." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "The real signature returned by sign_request for this exact payload." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Preview a new own-account LMS reconciliation" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-reconciliation-apply-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-reconciliation-apply-signed> ;
    hydra:method "POST" ;
    hydra:title "Create my reviewed reconciled LMS entry" ;
    rdfs:comment "Explicitly create the previously previewed private owner entry. Fresh original-record, engine HMAC, witness and native revision checks precede append. This never posts a grade, rewrites source statements or changes the global LMS snapshot. Read back the same entry before accepting it. Contract version 1.0.0; discover /agent/lti/reconciliation/affordance. Signed personal-performance requests bind subject_did to the native controlling human and subject_pod_url to the verified own pod; neither field selects another person." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/lti/reconciliation/apply> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/lti/reconciliation/apply> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.lti_reconciliation_apply_signed-output" ;
        rdfs:comment "Versioned own-account reconciliation apply. Source-scoped association is not a cryptographic attempt binding. 400 invalid input; 403 different owner; 409 stale preview or conflict; 503 unconfirmed evidence or storage." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "found" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "entry" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "verification" ] ;
            hydra:required false
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.lti_reconciliation_apply_signed-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "Use the exact sign_request payload containing agent_id, timestamp, subject_did, purpose personal-performance and planToken: the exact private preview token; intent: create-reconciled-lms-entry. No additional logical fields are accepted." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "The real signature returned by sign_request for this exact payload." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Create my reviewed reconciled LMS entry" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-reconciliation-read-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/lti-reconciliation-read-signed> ;
    hydra:method "POST" ;
    hydra:title "Read my reconciled LMS entry" ;
    rdfs:comment "Freshly read the private native owner ledger and verify the complete entry attestation. This separate record does not establish that the original LMS grade persisted. Contract version 1.0.0; discover /agent/lti/reconciliation/affordance. Signed personal-performance requests bind subject_did to the native controlling human and subject_pod_url to the verified own pod; neither field selects another person." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/lti/reconciliation/read> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/lti/reconciliation/read> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.lti_reconciliation_read_signed-output" ;
        rdfs:comment "Versioned own-account reconciliation read. Source-scoped association is not a cryptographic attempt binding. 400 invalid input; 403 different owner; 409 stale preview or conflict; 503 unconfirmed evidence or storage." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "found" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "entry" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "verification" ] ;
            hydra:required false
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.lti_reconciliation_read_signed-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "Use the exact sign_request payload containing agent_id, timestamp, subject_did, purpose personal-performance and entryId: the exact 64-character lowercase SHA-256 identifier. No additional logical fields are accepted." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "The real signature returned by sign_request for this exact payload." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Read my reconciled LMS entry" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/consume-lesson> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/consume-lesson> ;
    hydra:method "POST" ;
    hydra:title "Load a published lesson or record your signed progress report" ;
    rdfs:comment "Load the actual authorized published course slides in source order. Default load mode does not record consumption. record-progress stores only your signed self-report for existing slide IDs, encrypted to you and the bridge, with exact readback; it remains Hypothetical and never asserts completion, mastery, achievement or creates xAPI statements. Sign the complete inner action payload with sign_request; only signature-covered fields are used. No arbitrary LRS endpoint or credentials are accepted." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/consume_lesson> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/consume_lesson> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.consume_lesson-output" ;
        rdfs:comment "Load returns the actual lesson with loaded:true, consumed:false, completed:false and writesPerformed:false. Progress returns encrypted publication/readback receipts and Hypothetical caller-self-report, never a completion claim." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "loaded" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "consumed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "completed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "writesPerformed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "published" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "encrypted" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "readbackVerified" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "descriptorUrl" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "graphUrl" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "graphIri" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "trustLevel" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authorship" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "lesson" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "source" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "modalStatus" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.consume_lesson-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "Use the actual _signed_payload returned by sign_request. Its complete inner payload must satisfy {\"type\":\"object\",\"properties\":{\"action\":{\"type\":\"string\",\"const\":\"foxxi.consume_lesson\"},\"tenant_pod_url\":{\"type\":\"string\",\"description\":\"Optional corroboration of the authenticated own pod; cannot select another pod.\"},\"course_iri\":{\"type\":\"string\",\"description\":\"Exact published CoursePackageBundle federation_iri_base plus #package.\"},\"learner_did\":{\"type\":\"string\",\"description\":\"Optional; must equal verified caller.\"},\"mode\":{\"type\":\"string\",\"enum\":[\"load\",\"record-progress\"],\"default\":\"load\"},\"advanced_slide_ids\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"uniqueItems\":true,\"minItems\":1,\"maxItems\":10000},\"owner_encryption_key\":{\"type\":\"string\",\"description\":\"Signature-bound canonical base64 X25519 public key held by the owner; never an unsigned discovered key.\"},\"bridge_audience\":{\"type\":\"string\",\"description\":\"Exact current bridge origin, without a trailing slash; derive it from this manifest authority, never a caller-selected different service.\"}},\"required\":[\"action\",\"bridge_audience\",\"course_iri\"],\"allOf\":[{\"if\":{\"properties\":{\"mode\":{\"const\":\"record-progress\"}},\"required\":[\"mode\"]},\"then\":{\"required\":[\"advanced_slide_ids\",\"owner_encryption_key\"]}}]}. sign_request binds authenticated agent_id and timestamp. Put every action field inside this signed payload; unsigned outer fields provide no authority. Standard sign_request ECDSA envelopes only; browser _session grant envelopes are refused on these durable-proof actions." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "The real signature returned by sign_request over that exact inner payload; never a placeholder." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Load lesson or record self-reported progress" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/ask-course-question> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/ask-course-question> ;
    hydra:method "POST" ;
    hydra:title "Ask a question about a course" ;
    rdfs:comment "Grounded Q&A over a course's narration transcripts + extracted concepts. The learner asks \"what is handicap?\" and the substrate returns verbatim-cited transcript segments + concept snippets that overlap the question. Composes the existing learner-performer-companion grounded-answer machinery (same honesty discipline: tamper-detected atoms, IRI citations, honest null when no atom overlaps the question). Lexical retrieval only — use foxxi.ask_course_question_agentic for graph-aware retrieval + LLM synthesis." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/ask_course_question> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/ask_course_question> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.ask_course_question-output" ;
        rdfs:comment "Grounded course-Q&A result — verbatim transcript citations + concept-card snippets that overlap the question. Honest null when nothing in the course grounds the question. Also persists an lpc:CitedResponse-shape audit descriptor." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "question" ] ;
            hydra:required false ;
            rdfs:comment "Echo of the asked question." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "citations" ] ;
            hydra:required false ;
            rdfs:comment "Per-citation entries: { slideId, slideTitle?, verbatimQuote, transcriptOffsetMs?, conceptIds }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "conceptCards" ] ;
            hydra:required false ;
            rdfs:comment "Concept-card snippets that overlap the question (id, label, definition)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "displayText" ] ;
            hydra:required false ;
            rdfs:comment "Composed display text wrapping the citations — never paraphrases the cited atoms." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "nullReason" ] ;
            hydra:required false ;
            rdfs:comment "When no atom in the course overlaps the question, set to a human-readable reason (\"no-data\")." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.ask_course_question-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_iri" ] ;
            hydra:required true ;
            rdfs:comment "IRI of the course (matches federation_iri_base#package emitted by ingest_content_package)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Asking learner DID. Recorded on the response descriptor for audit." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "question" ] ;
            hydra:required true ;
            rdfs:comment "Natural-language question (e.g., \"what is handicap?\")." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_content" ] ;
            hydra:required true ;
            rdfs:comment "The course's narration transcripts + extracted concepts. In a real deployment the bridge fetches this from the tenant pod via the published fxs/fxk descriptors; for the in-process invocation supply the shape from the parser's dashboard_data + transcripts payloads."
        ]
    ] ;
    rdfs:label "Ask a question about a course" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/ask-course-question-agentic> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/ask-course-question-agentic> ;
    hydra:method "POST" ;
    hydra:title "Agentic RAG Q&A over a course federation (with LLM synthesis)" ;
    rdfs:comment "Multi-step agentic retrieval + LLM synthesis: (1) federated concept-graph search across the primary course + any loaded federation peers, (2) prereq + modifier-of edge expansion within each concept's home course, (3) round-robin slide allocation so peer-course slides survive the citation cap, (4) LLM synthesis with the substrate-assembled structured context as the system prompt. Each step of the agent loop emits an Interego descriptor (fxa:LearnerQuestionEvent Asserted → fxa:RetrievalActivity Hypothetical → fxa:LlmCompletion Hypothetical → fxa:CitedAnswer Asserted with iep:supersedes back through the trace). LLM key precedence: per-request llm_api_key (BYOK from the caller) > server-side FOXXI_LLM_API_KEY / ANTHROPIC_API_KEY env. The trace records which key source was used (bridge-env vs per-request-byok). Without any key, returns retrieval scaffold + descriptor trace alone (use foxxi.retrieve_course_context for the explicit no-LLM path)." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/ask_course_question_agentic> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/ask_course_question_agentic> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.ask_course_question_agentic-output" ;
        rdfs:comment "Agentic-RAG result: federated retrieval scaffold + LLM-synthesised answer + full descriptor trace (fxa:LearnerQuestionEvent Asserted → fxa:RetrievalActivity Hypothetical → fxa:LlmCompletion Hypothetical → fxa:CitedAnswer Asserted, with iep:supersedes chains). When no LLM key is configured, returns the retrieval scaffold + trace only (use foxxi.retrieve_course_context for the explicit no-LLM path). Surfaces a rate-limit error when bridge-env key is used and per-IP rate cap is hit." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "answer" ] ;
            hydra:required false ;
            rdfs:comment "LLM-synthesised answer composed over the structured retrieval context. Omitted when no LLM key was available." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "citations" ] ;
            hydra:required false ;
            rdfs:comment "Cited slide entries with verbatim transcript snippets, allocated round-robin across primary + federation peers."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "seedConcepts" ] ;
            hydra:required false ;
            rdfs:comment "Concept-graph seeds chosen by the agentic retrieval step (primary + cross-course matches)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "expandedConcepts" ] ;
            hydra:required false ;
            rdfs:comment "Concepts reached via prereq + modifier-of edge expansion from the seeds."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "trace" ] ;
            hydra:required false ;
            rdfs:comment "Ordered Interego descriptor trace; one entry per agent step (event type + descriptor IRI + modal status + iep:supersedes)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "llmKeySource" ] ;
            hydra:required false ;
            rdfs:comment "Which LLM-key source was used (BYOK takes precedence over the bridge env key)." ;
            sh:datatype xsd:string ;
            sh:in ( "per-request-byok" "bridge-env" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "llmModel" ] ;
            hydra:required false ;
            rdfs:comment "Anthropic model id actually invoked." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            rdfs:comment "Set on rate-limit or auth failure." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "retryAfterSeconds" ] ;
            hydra:required false ;
            rdfs:comment "Set when error is a rate-limit refusal." ;
            sh:datatype xsd:integer
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.ask_course_question_agentic-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Asking learner DID. Recorded on the fxa:LearnerQuestionEvent descriptor." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "question" ] ;
            hydra:required true ;
            rdfs:comment "Natural-language question." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "primary" ] ;
            hydra:required true ;
            rdfs:comment "Primary course payload — matches the FoxxiAgenticPayload shape (packageMeta + concepts + slides + modifier_pairs + prereq_edges). In a real deployment the bridge fetches this via discover_context against the tenant pod's published fxk:ConceptMap + fxs:Slide descriptors."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "federation" ] ;
            hydra:required false ;
            rdfs:comment "Optional array of federation peer course payloads — same shape as primary. Cross-course concept matching + slide citation works across the full federation."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "history" ] ;
            hydra:required false ;
            rdfs:comment "Prior conversation turns (role/content) for multi-turn Q&A."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "llm_model" ] ;
            hydra:required false ;
            rdfs:comment "Anthropic model id (default claude-sonnet-4-5)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "llm_api_key" ] ;
            hydra:required false ;
            rdfs:comment "BYOK: per-request Anthropic API key. Used transiently for the one LLM call; bridge does not store/log. Takes precedence over the server-side FOXXI_LLM_API_KEY / ANTHROPIC_API_KEY env. Caller is responsible for transport security (TLS to the bridge)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Agentic RAG course Q&A" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/retrieve-course-context> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/retrieve-course-context> ;
    hydra:method "POST" ;
    hydra:title "Retrieval-only path (MCP-client-as-LLM — your agent does synthesis)" ;
    rdfs:comment "Pure retrieval, no LLM call. Designed for MCP clients where the AGENT itself (Claude.ai connector / Claude Desktop / Claude Code / Cursor / Codex) is the LLM and uses the user's existing subscription. Returns the same federated concept-graph retrieval scaffold (seed concepts + expanded neighborhood + cited slides with verbatim transcripts) as foxxi.ask_course_question_agentic, plus a 2-step Interego trace (fxa:LearnerQuestionEvent Asserted + fxa:RetrievalActivity Hypothetical). The calling agent synthesises the answer in its own context using the cited transcripts as grounding, and optionally closes the trace by publishing its own fxa:CitedAnswer descriptor back to the tenant pod. NO API key required anywhere — user's subscription pays via the MCP client." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/retrieve_course_context> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/retrieve_course_context> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.retrieve_course_context-output" ;
        rdfs:comment "Retrieval-only Q&A scaffold for MCP-client-as-LLM: seed concepts + expanded neighborhood + cited slides with verbatim transcripts + a 2-step Interego trace (fxa:LearnerQuestionEvent Asserted + fxa:RetrievalActivity Hypothetical). The calling agent synthesises the answer in its OWN context using the scaffold as grounding. No API key required — the user's MCP-client subscription pays for synthesis." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "seedConcepts" ] ;
            hydra:required false ;
            rdfs:comment "Concept-graph seeds matched against the question."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "expandedConcepts" ] ;
            hydra:required false ;
            rdfs:comment "Concepts reached via prereq + modifier-of expansion."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "citations" ] ;
            hydra:required false ;
            rdfs:comment "Cited slide entries with verbatim transcripts the calling agent can ground on."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "trace" ] ;
            hydra:required false ;
            rdfs:comment "Two-step Interego descriptor trace (question event + retrieval activity)."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.retrieve_course_context-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Asking learner DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "question" ] ;
            hydra:required true ;
            rdfs:comment "Natural-language question." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "primary" ] ;
            hydra:required true ;
            rdfs:comment "Primary course payload (FoxxiAgenticPayload)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "federation" ] ;
            hydra:required false ;
            rdfs:comment "Optional federation peer payloads."
        ]
    ] ;
    rdfs:label "Retrieve course context (no LLM)" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/explore-concept-map> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/explore-concept-map> ;
    hydra:method "POST" ;
    hydra:title "Explore the published concept map for a course" ;
    rdfs:comment "Fetch the concept graph a course PUBLISHED (concepts with tier + confidence, prerequisite edges, modifier-of relations) from its on-pod fxa:CoursePackageBundle, and return it as a navigation graph: pick any concept with focus_concept_id, follow prerequisite edges up AND down to max_depth, and read the slide ids that taught each one. Returns { error } — never an empty graph — when the course is not on the pod or focus_concept_id names no concept in it." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/explore_concept_map> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/explore_concept_map> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.explore_concept_map-output" ;
        rdfs:comment "The course's navigation graph, read from its on-pod fxa:CoursePackageBundle. Returns { error } rather than an empty graph when the course is absent or focus_concept_id names no concept — an empty concepts/edges pair would read as \"this course has no concept map\", which is a different and wrong answer." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseIri" ] ;
            hydra:required false ;
            rdfs:comment "Resolved course IRI (…#package)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseId" ] ;
            hydra:required false ;
            rdfs:comment "Resolved course id." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "title" ] ;
            hydra:required false ;
            rdfs:comment "Course title." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "concepts" ] ;
            hydra:required false ;
            rdfs:comment "Nodes { id, label, tier, confidence, taughtInSlides[], depth? }. depth is hops from focus_concept_id (0 = the focus) and is absent on an unfocused full graph."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "edges" ] ;
            hydra:required false ;
            rdfs:comment "Edges { from, to, kind: prerequisite|modifier-of, confidence? }, restricted to the returned node set."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "slides" ] ;
            hydra:required false ;
            rdfs:comment "Slide index { id, title, sequence_index } the taughtInSlides ids refer into."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "focusConceptId" ] ;
            hydra:required false ;
            rdfs:comment "Echo of the focus, when one was given." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "maxDepth" ] ;
            hydra:required false ;
            rdfs:comment "Traversal depth actually applied (default 3)." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "truncated" ] ;
            hydra:required false ;
            rdfs:comment "True when the focus + depth limit excluded concepts the full graph contains." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            rdfs:comment "Set when the course is not published on the pod, or focus_concept_id names no concept in it." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.explore_concept_map-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_iri" ] ;
            hydra:required true ;
            rdfs:comment "Course IRI." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "focus_concept_id" ] ;
            hydra:required false ;
            rdfs:comment "Optional concept to center the navigation graph on; default returns the full graph." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "max_depth" ] ;
            hydra:required false ;
            rdfs:comment "Optional depth limit for prerequisite-edge traversal from focus_concept_id (default 3)." ;
            sh:datatype xsd:decimal
        ]
    ] ;
    rdfs:label "Explore the concept map" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/extend-standards> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/extend-standards> ;
    hydra:method "POST" ;
    hydra:title "Extend a standard (xAPI / IEEE-LER / ADL-TLA) — afforded by the agentic-performance layer" ;
    rdfs:comment "Emergent, self-descriptive capability: an agent extends a standard IN THE FLOW OF WORK — a new xAPI context extension, an xAPI Profile fragment, or an IEEE-LER / ADL-TLA term — COMPOSING Foxxi's standards (built with Foxxi's own buildProfileDoc + served LER/TLA namespaces), never forking the spec. The agentic-performance (agp:) layer affords this; Foxxi surfaces it (the agp<->Foxxi re-integration). Returns a conformant artifact + a publishable, discoverable iep:StandardsExtension descriptor (distributed) + in-flow performance support (what it builds, how to learn it, how to teach it). Discover the learnable-capability catalog at GET /guidance." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/extend-standards> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/extend-standards> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.extend_standards-output" ;
        rdfs:comment "ProposedExtension — the new term IRI, a conformant artifact (xAPI Profile doc or Turtle term), a publishable iep:StandardsExtension descriptor, and _guidance (in-flow performance support)." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "iri" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "extendsStandard" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "artifact" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "descriptor" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_guidance" ] ;
            hydra:required false
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.extend_standards-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            rdfs:comment "What to author." ;
            sh:datatype xsd:string ;
            sh:in ( "XapiContextExtension" "XapiProfileFragment" "LerTerm" "TlaTerm" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "name" ] ;
            hydra:required true ;
            rdfs:comment "Local slug for the new term/extension (e.g. \"collaborationDepth\")." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "definition" ] ;
            hydra:required true ;
            rdfs:comment "Human-readable definition of the new term/extension." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "label" ] ;
            hydra:required false ;
            rdfs:comment "Display label (defaults to name)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "extends_standard" ] ;
            hydra:required false ;
            rdfs:comment "IRI of the standard being extended (defaults per kind)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "subclass_of" ] ;
            hydra:required false ;
            rdfs:comment "For LerTerm/TlaTerm: the superclass IRI to compose onto." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "builds_capability" ] ;
            hydra:required false ;
            rdfs:comment "IRI of the agp:Capability this extension builds/demonstrates." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Extend a standard" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/review-record> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/review-record> ;
    hydra:method "POST" ;
    hydra:title "Review your own performance record (ELR + CLR) as yourself" ;
    rdfs:comment "Review your IEEE P2997 Enterprise Learner Record + 1EdTech CLR 2.0 credential wallet, virtualized by Foxxi entirely over your OWN pod. Authenticate with a rev-196 signed-request envelope — Foxxi verifies your own signature and binds identity to the recovered did:ethr (no relay, no separate login). Defaults to your own record. HOW A COMPETENCY IS EARNED, so an empty judgement is readable before you spend a signature: a performance record counts toward a competency only if it carries a DOMAIN activity type, or asserts an outcome (success true/false). A record whose only type is a protocol envelope — AssertedContext, ProductionTask, SignedAuthorship, any *Facet — declares no skill, and auto-projected trajectory steps carry exactly that and no outcome, so any number of them yields zero competencies by design rather than by fault. The other two routes are a mastery-verb learning experience, and an alignment on a verified credential. Competence is a judgement about work; volume of work is not one. WHO IS READABLE, which is a separate question from what counts: a subject is classified from its OWN signed statements, and a subject with none classifies HUMAN, whose record is private to its holder. That is why a brand-new agent cannot be read by anybody, and it is the correct answer rather than a fault — you are what you have done. ONE authenticated performance recorded as actor_kind agent is what flips it, and from that moment the record is a PUBLIC capability record any signed caller can read by naming your DID. Nothing you declare about yourself changes this: a self-declaration would let an agent assert its way into a public class without evidence, which is the opposite of every other rule here. CROSS-POD READS: pass subject_did to read another subject's discoverable agent-capability record — on every route, including through the relay. Two fields that used to be one: subject_pod_url answers WHOSE POD AM I (stamped from your session by sign_request, and never a read target), while the record you are asking for is resolved from subject_did and, when that subject has enrolled, from the pod the enrolment register says it actually writes to. If the subject holds a pod here that its identity does not resolve to, name it with read_pod_url — that carries no authority, only selects among pods this deployment already reads, and is refused with the reason if it names anything else. Every answer reports subject.podChosenBy so you can tell which pod was read and why. A HUMAN learner record stays private to its holder; agent capability records are public." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/review-record> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/review-record> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.review_record-output" ;
        rdfs:comment "Your assembled ELR (+ CLR by default) with the subject + statement-source trace. 401 when the signature/delegation does not verify." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "reviewedAs" ] ;
            hydra:required false ;
            rdfs:comment "Caller DID the record was assembled for." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authMode" ] ;
            hydra:required false ;
            rdfs:comment "How the caller identity was bound." ;
            sh:datatype xsd:string ;
            sh:in ( "direct" "delegated" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "self" ] ;
            hydra:required false ;
            rdfs:comment "True when the subject is the caller." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "subject" ] ;
            hydra:required false ;
            rdfs:comment "Subject envelope: { did, podUrl, label, kind, lensTenant, statementCount, statementSource, latticeStatements }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "elr" ] ;
            hydra:required false ;
            rdfs:comment "The assembled IEEE P2997 Enterprise Learner Record."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "clr" ] ;
            hydra:required false ;
            rdfs:comment "Verified 1EdTech CLR wallet (present unless include_clr=false)."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.review_record-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id: 'did:ethr:<addr>', timestamp: <ISO 8601, within ±60s>, subject_did?, read_pod_url?, subject_pod_url?, subject_name?, actor_kind?, include_clr?, projection?: 'inline'|'links' }). DEFAULT 'links' returns the JUDGEMENT (competencies, credentials, counts — bounded by vocabulary, not by history) with evidence as hydra:Collection references carrying hydra:totalItems and a self-scoped address you can dereference with this same envelope. Pass 'inline' to embed every experience and performance record instead — that grows without bound with the subject's history and has been measured over 1.2 MB." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "read_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "WHOSE RECORD AM I ASKING FOR, when the subject holds a pod that its identity does not resolve to (one wallet has both an eth-<hex> pod and a relay-mediated u-eth-<hex> one). Untrusted: it carries no authority, selects only among pods this deployment already reads, and a pod outside that space is REFUSED with the reason rather than silently swapped for a derived one. Usually unnecessary — an enrolled subject is found from subject_did alone, via the enrolment register. Distinct from subject_pod_url, which answers WHOSE POD AM I, is stamped from your session by sign_request, and is never a read target." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "secp256k1 signature over the canonical message sha256:<hex(sha256(_signed_payload))>, signed with the wallet matching agent_id." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Review your performance record" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:reads
        [
            a iep:EvidenceSource, dcat:Dataset ;
            rdfs:label "the subject's per-agent mesh lens (lens:<agent>)" ;
            iep:store <https://relay.interego.xwisee.com/ns/iep/store/foxxi/mesh-lens> ;
            dcat:accessURL <https://relay.interego.xwisee.com/ns/iep/store/foxxi/mesh-lens> ;
            iep:populatedBy <https://foxxi-bridge.interego.xwisee.com/agent/mesh-event> ;
            iep:admits "Trajectory steps swept from ENROLLED pods, or pushed directly to /agent/mesh-event. A step whose modal status is Hypothetical is an intention and is not evidence of performance. ADMITTED IS NOT COUNTED: a step enters this store and still earns no competency unless it carries a domain activity type or an asserted outcome — see the judgement rule in this affordance's description. An auto-projected step carries neither, so a long trajectory can produce a full performance record and an empty judgement." ;
            dct:description "Trajectory steps swept from ENROLLED pods, or pushed directly to /agent/mesh-event. A step whose modal status is Hypothetical is an intention and is not evidence of performance. ADMITTED IS NOT COUNTED: a step enters this store and still earns no competency unless it carries a domain activity type or an asserted outcome — see the judgement rule in this affordance's description. An auto-projected step carries neither, so a long trajectory can produce a full performance record and an empty judgement." ;
            iep:enrolmentRegister <https://foxxi-bridge.interego.xwisee.com/agent/mesh/enrolment>
        ] ,
        [
            a iep:EvidenceSource, dcat:Dataset ;
            rdfs:label "the shared PGSL lattice, cold-loaded from the subject's pod" ;
            iep:store <https://relay.interego.xwisee.com/ns/iep/store/foxxi/shared-lattice> ;
            dcat:accessURL <https://relay.interego.xwisee.com/ns/iep/store/foxxi/shared-lattice> ;
            iep:populatedBy <https://foxxi-bridge.interego.xwisee.com/xapi/statements> ;
            iep:admits "xAPI statement content atoms resident for this subject." ;
            dct:description "xAPI statement content atoms resident for this subject."
        ] ,
        [
            a iep:EvidenceSource, dcat:Dataset ;
            rdfs:label "durable xAPI statements recorded on the subject's own pod" ;
            iep:store <https://relay.interego.xwisee.com/ns/iep/store/foxxi/durable-pod-record> ;
            dcat:accessURL <https://relay.interego.xwisee.com/ns/iep/store/foxxi/durable-pod-record> ;
            iep:populatedBy <https://foxxi-bridge.interego.xwisee.com/xapi/statements> ;
            iep:admits "Statements durably written to the subject pod, readable without any enrolment." ;
            dct:description "Statements durably written to the subject pod, readable without any enrolment."
        ] ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/issue-credential> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/issue-credential> ;
    hydra:method "POST" ;
    hydra:title "Issue a competency credential as the authority for your vertical" ;
    rdfs:comment "Issue an Open Badges 3.0 / W3C Verifiable Credential to an agent who demonstrated a competency you defined, as the AUTHORITY for your own vertical. The credential is signed by your stable, platform-custodied issuer identity (derived from your DID), aligned to your competency, and delivered to the recipient agent's OWN pod wallet (their CLR surfaces it). Gated by your verifiable delegation (no tenant admin). Externally routed: sign_request the issuance args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/issue-credential> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/issue-credential> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.issue_credential-output" ;
        rdfs:comment "The issued OB3/W3C VC, its issuer + recipient, and the shared-lattice composition. 503 when FOXXI_ISSUER_KEY_SEED is unset; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "issuedBy" ] ;
            hydra:required false ;
            rdfs:comment "Caller DID acting as the issuing authority." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "issuerDid" ] ;
            hydra:required false ;
            rdfs:comment "Per-creator custodied issuer DID on the VC." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "credentialId" ] ;
            hydra:required false ;
            rdfs:comment "VC id." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "recipient" ] ;
            hydra:required false ;
            rdfs:comment "{ did, podUrl }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "competency" ] ;
            hydra:required false ;
            rdfs:comment "{ id, name }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "descriptorUrl" ] ;
            hydra:required false ;
            rdfs:comment "Published credential descriptor URL on the recipient pod." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "vc" ] ;
            hydra:required false ;
            rdfs:comment "The full signed Verifiable Credential."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.issue_credential-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, recipient_did, recipient_pod_url?, recipient_name?, competency_name, competency_id?, competency_framework?, achievement_description?, criterion?, evidence?, justified_by? })." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "secp256k1 over sha256:<hex(sha256(_signed_payload))> by the wallet matching agent_id (relay sign_request)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Issue a competency credential" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/verify-extension> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/verify-extension> ;
    hydra:method "POST" ;
    hydra:title "Independently verify a subject extended a standard (issuer due diligence)" ;
    rdfs:comment "Independently verify, from the SUBJECT's own authoritative pod records, that they (a) completed an engine-graded course and (b) recorded a domain-typed StandardsExtension performance, and that the named extension (c) conforms to the agp:StandardsExtension shape. Returns a verdict separating independently-verified evidence from any self-attested outcome — the issuer's due diligence before issue-credential. On success it composes a dereferenceable iep:Verification holon (chain of custody). Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/verify-extension> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/verify-extension> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.verify_extension-output" ;
        rdfs:comment "The verification verdict + per-check evidence + (on success) the verification holon URI." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "verifiedBy" ] ;
            hydra:required false ;
            rdfs:comment "Caller DID acting as verifier." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "subject" ] ;
            hydra:required false ;
            rdfs:comment "{ did, podUrl, statementCount }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "verified" ] ;
            hydra:required false ;
            rdfs:comment "Overall verdict (independently graded ∧ performance recorded ∧ shape conformant)." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "checks" ] ;
            hydra:required false ;
            rdfs:comment "{ independentlyGraded, gradedScore, performanceRecorded, selfAttestedPerformance, shapeConformant }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "verificationHolonUri" ] ;
            hydra:required false ;
            rdfs:comment "Dereferenceable iep:Verification holon composed on the verifier's lattice (present only when verified)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evidence" ] ;
            hydra:required false ;
            rdfs:comment "Statement ids that grounded the verdict."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "note" ] ;
            hydra:required false ;
            rdfs:comment "Human-readable verdict narrative." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.verify_extension-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, subject_did, name?, kind?, definition?, subject_pod_url? }). kind defaults to XapiContextExtension; name triggers the shape-conformance check." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Independently verify an extension" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/prove-competency-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/prove-competency-signed> ;
    hydra:method "POST" ;
    hydra:title "Prove a competency privately end-to-end (BBS+ selective disclosure)" ;
    rdfs:comment "Holder-facing BBS+ proof, GROUNDED IN THE HOLDER'S ACTUAL RECORD: the bridge assembles the holder's learner record, refuses any competency that record does not assert (\"you can only prove a demonstrated competency, not a claimed one\"), and derives the proficiency from the published Dreyfus rollup rather than from the request. It then signs a multi-claim credential, discloses only a minimal privacy-preserving subset (issuer + achievement name + proficiency by default), and cryptographically HIDES the rest (score, dates, name, id); a verifier learns ONLY the disclosed claims. Real W3C bbs-2023 crypto. Returns a serialized `presentation` an INDEPENDENT verifier can check via foxxi.verify_presentation. Externally routed: sign_request the args as the HOLDER, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/prove_competency> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/prove_competency> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.prove_competency_signed-output" ;
        rdfs:comment "The serialized BBS+ selective-disclosure presentation + which claims were revealed vs cryptographically hidden + the record evidence the proficiency was derived from. Returns { error } when the competency is not asserted in the holder's record, or when FOXXI_ISSUER_KEY_SEED is unset." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "verified" ] ;
            hydra:required true ;
            rdfs:comment "Whether the derived proof verifies (checked at derivation time)." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "issuerDid" ] ;
            hydra:required false ;
            rdfs:comment "Issuer DID that signed the credential." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "competencyName" ] ;
            hydra:required false ;
            rdfs:comment "The competency proved." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "totalClaims" ] ;
            hydra:required false ;
            rdfs:comment "Number of signed claims the BBS+ signature commits to." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "revealedClaims" ] ;
            hydra:required false ;
            rdfs:comment "Disclosed { path, value } pairs — what a verifier learns."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "hiddenClaimCount" ] ;
            hydra:required false ;
            rdfs:comment "How many claims stayed behind the zero-knowledge proof." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "hiddenClaimPaths" ] ;
            hydra:required false ;
            rdfs:comment "Claim paths cryptographically withheld."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "unknownRevealPaths" ] ;
            hydra:required false ;
            rdfs:comment "Requested reveal paths the credential does not carry, and which were therefore dropped. Non-empty here means you disclosed less than you intended."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "presentation" ] ;
            hydra:required false ;
            rdfs:comment "Serialized BBS+ presentation (base64 proof + disclosed messages + issuer public key + presentationContext) — feed directly to foxxi.verify_presentation."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "proofB64" ] ;
            hydra:required false ;
            rdfs:comment "Proof bytes alone. NOT sufficient to verify — use `presentation`." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "derivedFromRecord" ] ;
            hydra:required false ;
            rdfs:comment "The rollup this proof was grounded in: Dreyfus proficiency, confidence, the rule that produced it, and the competency IRI."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.prove_competency_signed-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, tenant_pod_url, competency_name, learner_did?, learner_name?, course_id?, reveal_paths?, presentation_context? }). reveal_paths is an array of claim paths to disclose (default [\"issuer\",\"achievement.name\",\"achievement.proficiencyLevel\"]); any path the credential does not carry is dropped and reported back in unknownRevealPaths. presentation_context binds the proof to one occasion — a verifier MUST echo it back or the proof will not verify. NOTE: score and proficiency are NOT inputs; both are derived from the holder's record." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature by the holder (subject of the credential)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Prove a competency (BBS+)" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/self-assert-competency> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/self-assert-competency> ;
    hydra:method "POST" ;
    hydra:title "Self-assert a competency with selective disclosure (SelfAsserted — not an authority attestation)" ;
    rdfs:comment "Mint a BBS+ credential about YOURSELF and derive a selective-disclosure presentation from it. The issuer is always the authenticated signer: this route will not issue under another party's identity, and it does not read score or proficiency from the request, so the claim carries the floor of the scale (Novice). What a verifying proof establishes here is INTEGRITY — the holder said this and cannot have altered it since — and not merit. Results carry selfIssued, trustLevel=SelfAsserted and claimsGroundedInRecord=false so a relying party can weigh them without knowing this route. For a proof grounded in a real learning record, and a proficiency derived from the published rollup, use foxxi.prove_competency instead. Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/prove-competency> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/prove-competency> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.self_assert_competency-output" ;
        rdfs:comment "The serialized BBS+ presentation plus explicit provenance labels. 403 when issuer_did names a party other than the signer; 503 when FOXXI_ISSUER_KEY_SEED is unset." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "holder" ] ;
            hydra:required false ;
            rdfs:comment "Holder DID — also the issuer." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "issuerDid" ] ;
            hydra:required false ;
            rdfs:comment "Issuer key, derived from the authenticated signer." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "selfIssued" ] ;
            hydra:required false ;
            rdfs:comment "Always true on this route." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "trustLevel" ] ;
            hydra:required false ;
            rdfs:comment "Always \"SelfAsserted\"." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "claimsGroundedInRecord" ] ;
            hydra:required false ;
            rdfs:comment "Always false — the claims came from the request, not a learner record." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "groundedAlternative" ] ;
            hydra:required false ;
            rdfs:comment "The affordance to use when the claim must be backed by evidence." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "revealed" ] ;
            hydra:required false ;
            rdfs:comment "Disclosed { path, value } pairs."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "hiddenPaths" ] ;
            hydra:required false ;
            rdfs:comment "Claim paths cryptographically withheld."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "presentation" ] ;
            hydra:required false ;
            rdfs:comment "Serialized BBS+ presentation for foxxi.verify_presentation."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.self_assert_competency-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, competency_name, reveal? }). reveal is an array of claim paths to disclose (default [\"issuer\",\"achievement.name\",\"achievement.proficiencyLevel\"]). issuer_did, score and proficiency are NOT accepted — naming an issuer other than the signer returns 403." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature. The recovered signer is both the holder AND the issuer." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Self-assert a competency (BBS+)" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/verify-presentation> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/verify-presentation> ;
    hydra:method "POST" ;
    hydra:title "Verify a selective-disclosure BBS+ presentation" ;
    rdfs:comment "Verifier-side. Takes a presentation produced by foxxi.prove_competency; returns whether the issuer signed a credential containing exactly the disclosed claims at the disclosed positions. The verifier learns ONLY the revealed claims. Externally routed: sign_request the args (as any independent verifier), then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/verify-presentation> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/verify-presentation> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.verify_presentation-output" ;
        rdfs:comment "The verification result + which claims the verifier learned. 400 when the presentation envelope is malformed." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "verifiedBy" ] ;
            hydra:required false ;
            rdfs:comment "Verifier DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "issuerDid" ] ;
            hydra:required false ;
            rdfs:comment "Issuer DID the proof attests." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "verified" ] ;
            hydra:required false ;
            rdfs:comment "Whether the BBS+ proof verified." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "reason" ] ;
            hydra:required false ;
            rdfs:comment "Why the proof did/did not verify." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "disclosed" ] ;
            hydra:required false ;
            rdfs:comment "The claims the verifier learned."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learned" ] ;
            hydra:required false ;
            rdfs:comment "Count of disclosed claims." ;
            sh:datatype xsd:integer
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.verify_presentation-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, presentation: { proof, disclosedIndexes, disclosedMessages, issuerPublicKey, issuerDid } }) — the presentation from foxxi.prove_competency." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature by the verifier." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Verify a BBS+ presentation" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/void-credential> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/void-credential> ;
    hydra:method "POST" ;
    hydra:title "Void (remove) a credential from your own wallet" ;
    rdfs:comment "Remove a credential you hold from your OWN pod wallet by its descriptor URL (the sourceDescriptor of a CLR entry returned by review-record). Deletes the credential resource + its graph AND rebuilds your pod manifest from actual contents, so no stale entry/ghost remains. You can only void credentials under your own pod. Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/void-credential> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/void-credential> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.void_credential-output" ;
        rdfs:comment "The deletion result + manifest rebuild summary. 403 when the descriptor_url is not under your own pod." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "voidedBy" ] ;
            hydra:required false ;
            rdfs:comment "Caller DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "descriptor" ] ;
            hydra:required false ;
            rdfs:comment "The voided descriptor URL." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "deletions" ] ;
            hydra:required false ;
            rdfs:comment "Per-resource HTTP delete status (path → status)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "manifest" ] ;
            hydra:required false ;
            rdfs:comment "Manifest rebuild summary { written, scanned } (or \"rebuild-failed\")."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.void_credential-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, descriptor_url, subject_pod_url? }) — descriptor_url = a CLR entry sourceDescriptor under your own pod." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "secp256k1 over sha256:<hex(sha256(_signed_payload))> by the wallet matching agent_id." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Void a credential" ;
    iep:readOnlyHint false ;
    iep:destructiveHint true ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-encryption-key> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-encryption-key> ;
    hydra:method "POST" ;
    hydra:title "Publish your X25519 encryption public key (self-sovereign)" ;
    rdfs:comment "Publish YOUR X25519 public key to your OWN pod so the bridge encrypts your canonical PGSL holons TO YOU (not just to itself) — making your recorded performances/credentials owner-readable. You generate + hold the private key; only the public key is published (to <yourpod>/keys/encryption.json). Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/publish-encryption-key> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/publish-encryption-key> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.publish_encryption_key-output" ;
        rdfs:comment "Where the public key was published + the algorithm. 400 when public_key is missing." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "published" ] ;
            hydra:required false ;
            rdfs:comment "URL of the published <pod>/keys/encryption.json." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "owner" ] ;
            hydra:required false ;
            rdfs:comment "Caller DID (owner of the key)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "algorithm" ] ;
            hydra:required false ;
            rdfs:comment "X25519-XSalsa20-Poly1305." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.publish_encryption_key-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, public_key, subject_pod_url? }) — public_key is your base64 X25519 (Curve25519) public key (algorithm X25519-XSalsa20-Poly1305)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "secp256k1 over sha256:<hex(sha256(_signed_payload))> by the wallet matching agent_id." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Publish your encryption key" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-analyze> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-analyze> ;
    hydra:method "POST" ;
    hydra:title "Analyze a SCORM package: fingerprint the authoring tool + build a course KG" ;
    rdfs:comment "Fingerprint WHICH authoring tool produced a SCORM package (from its imsmanifest.xml + file list/contents), build the concept/slide knowledge-graph, and compose it into a per-course PGSL lattice holon (dereferenceable + interrogable). Open + rate-limited per IP (it composes a holon on success). Externally routed (rate-limited open access, no signature)." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/course/analyze> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/course/analyze> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.course_analyze-output" ;
        rdfs:comment "The authoring-tool fingerprint, the parsed course structure + concept/slide course graph, and the composed course-KG holon. 400 on missing/invalid manifest; 413 when too large; 429 on rate limit." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "fingerprint" ] ;
            hydra:required false ;
            rdfs:comment "Authoring-tool fingerprint (tool, vendor, confidence, signals, standard, candidates)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "structure" ] ;
            hydra:required false ;
            rdfs:comment "Parsed course structure (courseId, etc.)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course" ] ;
            hydra:required false ;
            rdfs:comment "The FoxxiAgenticCourse (concepts + slides) usable by /agent/course/ask."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseKg" ] ;
            hydra:required false ;
            rdfs:comment "Composed course-KG holon { label, holonUri, descriptorUrl, agentDid, reusedNodes, newNodes, stats }."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.course_analyze-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "manifestXml" ] ;
            hydra:required true ;
            rdfs:comment "imsmanifest.xml text (must contain <manifest...; max 2MB)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "fileList" ] ;
            hydra:required false ;
            rdfs:comment "Optional list of file paths in the package (capped at 5000) — strengthens fingerprinting."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "fileText" ] ;
            hydra:required false ;
            rdfs:comment "Optional map of filename → extracted text (capped) for concept extraction."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "fileContents" ] ;
            hydra:required false ;
            rdfs:comment "Optional map of filename → raw content (capped) for fingerprint signals."
        ]
    ] ;
    rdfs:label "Analyze a SCORM course" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-analyze-authored> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-analyze-authored> ;
    hydra:method "POST" ;
    hydra:title "Analyze an agent-authored course (cryptographic provenance fingerprint)" ;
    rdfs:comment "Analyze a course an agent authored via /agent/scorm/author. Because the structured course + signed authoredBy provenance is known, the \"fingerprint\" reports that ground truth (a Foxxi agent authored it) rather than sniffing a third-party tool. Resolves the course from the in-memory cache → the author's PGSL lattice → legacy pod RDF. Same response shape as foxxi.course_analyze. Externally routed (rate-limited open access)." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/course/analyze-authored> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/course/analyze-authored> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.course_analyze_authored-output" ;
        rdfs:comment "The provenance fingerprint + parsed course + composed course-KG holon (authored:true). 404 when the agent-authored course is not found; 429 on rate limit." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "fingerprint" ] ;
            hydra:required false ;
            rdfs:comment "Provenance fingerprint (tool: \"Foxxi (agent-authored)\", confidence 1, signed authoredBy signal)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "structure" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course" ] ;
            hydra:required false ;
            rdfs:comment "The FoxxiAgenticCourse."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseKg" ] ;
            hydra:required false ;
            rdfs:comment "Composed course-KG holon."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authored" ] ;
            hydra:required false ;
            rdfs:comment "Always true for this route." ;
            sh:datatype xsd:boolean
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.course_analyze_authored-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseId" ] ;
            hydra:required true ;
            rdfs:comment "The agent-authored course id (from /agent/scorm/author)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "author_did" ] ;
            hydra:required false ;
            rdfs:comment "Author DID — used to resolve the course from the author's pod/lattice when not cached." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_pod" ] ;
            hydra:required false ;
            rdfs:comment "Explicit author pod URL (defaults to the author_did's resolved pod)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Analyze an agent-authored course" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-ask> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-ask> ;
    hydra:method "POST" ;
    hydra:title "Ask a role-framed, grounded question about an analyzed course" ;
    rdfs:comment "Grounded Q&A over a FoxxiAgenticCourse (from /agent/course/analyze*). A role (author / performance-manager / assessor / meta / learner) sets the lens; the answer stays grounded in the course knowledge-graph. Without llm_api_key it returns the retrieval scaffold (rate-limited; the caller's own LLM synthesises); with a BYOK key it runs agentic RAG synthesis. honest `grounded` flag (true only on a real graph hit). Externally routed (rate-limited; BYOK exempt)." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/course/ask> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/course/ask> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.course_ask-output" ;
        rdfs:comment "The retrieval scaffold (and, with BYOK, the synthesised answer) + the honest grounding signal. 400 on missing course/question; 429 on rate limit (non-BYOK)." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "role" ] ;
            hydra:required false ;
            rdfs:comment "Echo of the role lens." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "grounded" ] ;
            hydra:required false ;
            rdfs:comment "True only on a real graph hit (retrievalKind=graph with seed concepts)." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "retrievalKind" ] ;
            hydra:required false ;
            rdfs:comment "graph | fallback — how citations were sourced." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "answer" ] ;
            hydra:required false ;
            rdfs:comment "LLM-synthesised answer (only when llm_api_key supplied)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "retrieval" ] ;
            hydra:required false ;
            rdfs:comment "Retrieval scaffold (seed concepts, cited slides, etc.)."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.course_ask-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course" ] ;
            hydra:required true ;
            rdfs:comment "The FoxxiAgenticCourse (must have concepts[] + slides[]) from /agent/course/analyze*."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "question" ] ;
            hydra:required true ;
            rdfs:comment "Natural-language question." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "role" ] ;
            hydra:required false ;
            rdfs:comment "Lens for the answer: author | performance-manager | assessor | meta | learner." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learnerActivity" ] ;
            hydra:required false ;
            rdfs:comment "Optional fenced learner-activity text the role can reference (treated as untrusted data)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "llm_api_key" ] ;
            hydra:required false ;
            rdfs:comment "BYOK Anthropic key — when present, runs LLM synthesis (rate-limit exempt); when absent, returns the retrieval scaffold for the caller's own LLM." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "history" ] ;
            hydra:required false ;
            rdfs:comment "Prior conversation turns for multi-turn Q&A."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learnerDid" ] ;
            hydra:required false ;
            rdfs:comment "Asking learner DID (recorded; defaults to urn:foxxi:demo:asker)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Ask about a course" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-skill> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-skill> ;
    hydra:method "POST" ;
    hydra:title "Project a course to a SKILL.md an agent can load" ;
    rdfs:comment "Pure projection: turn a FoxxiAgenticCourse (from /agent/course/analyze*) into a SKILL.md document an agent can load — carrying the course provenance (tool, authoredBy, holonUri, courseId). No pod write, no signing. The inverse of /agent/course/analyze-skill. Externally routed." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/course/skill> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/course/skill> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.course_skill-output" ;
        rdfs:comment "The generated SKILL.md text + its name. 400 on missing course." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "skillMd" ] ;
            hydra:required false ;
            rdfs:comment "The generated SKILL.md document." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "name" ] ;
            hydra:required false ;
            rdfs:comment "The skill name." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.course_skill-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course" ] ;
            hydra:required true ;
            rdfs:comment "The FoxxiAgenticCourse (must have concepts[] + slides[])."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tool" ] ;
            hydra:required false ;
            rdfs:comment "Provenance: authoring tool name to record in the skill." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authoredBy" ] ;
            hydra:required false ;
            rdfs:comment "Provenance: author DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "holonUri" ] ;
            hydra:required false ;
            rdfs:comment "Provenance: the course holon URI." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Course → SKILL.md" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:appliesToCollection "courses" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-analyze-skill> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-analyze-skill> ;
    hydra:method "POST" ;
    hydra:title "Ingest a SKILL.md as a course knowledge-graph" ;
    rdfs:comment "Ingest an agent skill (SKILL.md string) as a course: parse it, report the agent-skill provenance fingerprint (ground truth — a skills.md, not a SCORM tool), and compose it into a PGSL course-KG holon so it can be interrogated, chatted with, assessed, and credentialed like any course. The inverse of /agent/course/skill. Externally routed (rate-limited open access)." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/course/analyze-skill> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/course/analyze-skill> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.course_analyze_skill-output" ;
        rdfs:comment "The agent-skill fingerprint + parsed course + composed course-KG holon (fromSkill:true). 400 on empty/unparseable skillMd; 413 when too large; 429 on rate limit." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "fingerprint" ] ;
            hydra:required false ;
            rdfs:comment "Agent-skill provenance fingerprint."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "structure" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course" ] ;
            hydra:required false ;
            rdfs:comment "The FoxxiAgenticCourse derived from the skill."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseKg" ] ;
            hydra:required false ;
            rdfs:comment "Composed course-KG holon."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "fromSkill" ] ;
            hydra:required false ;
            rdfs:comment "Always true for this route." ;
            sh:datatype xsd:boolean
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.course_analyze_skill-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "skillMd" ] ;
            hydra:required true ;
            rdfs:comment "A SKILL.md string (frontmatter + body or ## sections; max 2MB)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "SKILL.md → course KG" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/skill-affordance> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/skill-affordance> ;
    hydra:method "POST" ;
    hydra:title "Translate a SKILL.md to a typed iep:Affordance descriptor graph (round-trip)" ;
    rdfs:comment "The STRICT SKILL.md ⇄ iep:Affordance translator (core @interego/skills bridge): translate a SKILL.md into a real iep:Affordance ContextDescriptor graph (subject typed iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution) and round-trip it back to a SKILL.md to demonstrate the lossless markdown-carrier ⇄ typed-affordance translation. Pure translation: no pod write, no signing — the authoring DID rides in PROV provenance only. Externally routed." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/skill/affordance> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/skill/affordance> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.skill_affordance-output" ;
        rdfs:comment "The typed affordance descriptor graph + the round-tripped SKILL.md + validation. 400 on empty/unparseable skillMd; 413 when too large." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "skillIri" ] ;
            hydra:required false ;
            rdfs:comment "IRI of the translated iep:Affordance subject." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "graphIri" ] ;
            hydra:required false ;
            rdfs:comment "IRI of the descriptor graph." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "graphContent" ] ;
            hydra:required false ;
            rdfs:comment "The iep:Affordance ContextDescriptor graph."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "roundTripMd" ] ;
            hydra:required false ;
            rdfs:comment "The SKILL.md regenerated from the graph (round-trip proof)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "atomIris" ] ;
            hydra:required false ;
            rdfs:comment "Map of atom name → IRI."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "validation" ] ;
            hydra:required false ;
            rdfs:comment "Skill validation report."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.skill_affordance-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "skillMd" ] ;
            hydra:required true ;
            rdfs:comment "A SKILL.md string to translate (max 2MB)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "agentDid" ] ;
            hydra:required false ;
            rdfs:comment "Authoring DID recorded in PROV provenance (must start with did:; defaults to the zero address)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "SKILL.md ⇄ iep:Affordance" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-propose-successor> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/course-propose-successor> ;
    hydra:method "POST" ;
    hydra:title "A course proposes its own successor (regime-engine-routed, iep:supersedes)" ;
    rdfs:comment "The Living Curriculum: a course reasons about ITSELF concept by concept. Each concept routes a performance signal through the work-regime engine, which REFUSES the universal content-gap frame (only the Knowable regime runs a gap analysis; a performer who could perform under ideal conditions yields an environment/incentive cause, not a content gap). It composes a real iep:supersedes SUCCESSOR holon into the PGSL lattice — a versioned, dereferenceable revision. Externally routed (rate-limited open access)." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/course/propose-successor> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/course/propose-successor> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.course_propose_successor-output" ;
        rdfs:comment "The per-concept regime diagnosis + recommendation roll-up + the composed successor holon. 400 on missing course; 429 on rate limit." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseId" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "supersedes" ] ;
            hydra:required false ;
            rdfs:comment "The superseded holon URI (or null)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "summary" ] ;
            hydra:required false ;
            rdfs:comment "Counts: { keep, revise, jobaid, instrument }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "concepts" ] ;
            hydra:required false ;
            rdfs:comment "Per-concept diagnosis (regime, method, cause, recommendation, rationale, signal)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "successor" ] ;
            hydra:required false ;
            rdfs:comment "Composed successor holon { holonUri, descriptorUrl, reusedNodes, newNodes } (or null)."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.course_propose_successor-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course" ] ;
            hydra:required true ;
            rdfs:comment "{ courseId, title, concepts:[{id,label}] } (from /agent/course/analyze*)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "concept_signals" ] ;
            hydra:required false ;
            rdfs:comment "Per-concept signals: array of { id?, label?, completion?, fieldSuccess?, frequency?, criticality? }. No signal for a concept → the engine refuses to claim a regime (instrument-first)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "holonUri" ] ;
            hydra:required false ;
            rdfs:comment "The original course holon URI — shared as a term so the successor links to it (iep:supersedes)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "label" ] ;
            hydra:required false ;
            rdfs:comment "Optional label for the successor holon (sanitized; defaults to successor-<courseId>)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Propose a course successor" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/calibration-merge> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/calibration-merge> ;
    hydra:method "POST" ;
    hydra:title "Merge signed calibration contributions into a federated memory (k-anon)" ;
    rdfs:comment "Federated calibration: pool SIGNED (regime × cause × intervention → verdict) aggregate tallies from multiple orgs WITHOUT sharing a single raw record. The bridge recovers each contributor from its signature (authenticated, not asserted; same-key resubmissions collapse to one source), applies the k-anonymity suppression floor, then pools them — a cell Hypothetical for each org alone becomes Asserted once pooled across ≥2 distinct keys. The merged memory is composed into the PGSL lattice as a dereferenceable holon no single key could assert alone. Externally routed (rate-limited; each contribution carries its own signature)." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/calibration/merge> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/calibration/merge> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.calibration_merge-output" ;
        rdfs:comment "The merged calibration profile + readout + promoted cells + the composed holon. 400 on no/too-many contributions; 401 when a contribution signature fails; 429 on rate limit." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "contributors" ] ;
            hydra:required false ;
            rdfs:comment "Per-source { source, cells, samples } after k-anon suppression."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "distinctSigners" ] ;
            hydra:required false ;
            rdfs:comment "Count of distinct recovered signing keys." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "multiParty" ] ;
            hydra:required false ;
            rdfs:comment "True when ≥2 distinct signers (cross-source promotion is only honest then)." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "droppedContributions" ] ;
            hydra:required false ;
            rdfs:comment "Envelopes dropped because the recovered signer did not match the claimed agent_id." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "merged" ] ;
            hydra:required false ;
            rdfs:comment "The pooled calibration profile."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "readout" ] ;
            hydra:required false ;
            rdfs:comment "The calibration readout."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "promoted" ] ;
            hydra:required false ;
            rdfs:comment "Cells promoted Hypothetical→Asserted by pooling (only when multiParty)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "holon" ] ;
            hydra:required false ;
            rdfs:comment "Composed PGSL holon { holonUri, descriptorUrl } (or null)."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.calibration_merge-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "contributions" ] ;
            hydra:required true ;
            rdfs:comment "Array (1..64) of signed envelopes { _signature, _signed_payload: JSON.stringify({ agent_id, timestamp, specs:[{ regime, causeFactor, intervention, closed, improved, noChange, worsened }] }) }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "k" ] ;
            hydra:required false ;
            rdfs:comment "Federation k-anonymity threshold floor (server enforces a minimum of 8; callers may raise but not lower it)." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "assertThreshold" ] ;
            hydra:required false ;
            rdfs:comment "Sample count above which a pooled cell becomes Asserted (server minimum 12; raise-only)." ;
            sh:datatype xsd:decimal
        ]
    ] ;
    rdfs:label "Merge calibration contributions" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-performance-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-performance-signed> ;
    hydra:method "POST" ;
    hydra:title "Record a production-work performance event as yourself" ;
    rdfs:comment "Record one unit of on-the-job production work as an xAPI performed statement, into your OWN Foxxi lens, authenticated by your delegation (the agent-drivable counterpart of the session-token foxxi.record_performance). Declare an activity_type (a domain type you define, e.g. urn:ttt:Move) to aggregate same-type executions into one competency; else it keys off task_name. success=true on demonstrated work promotes the competency to performance-verified. Composed into your shared PGSL lattice (optionally wrapped to named recipients for cross-seat owner-decrypt). Send trajectory: how the work went, step by step, and it is kept with the record. When a unit fails, the answer offers, unasked, what the work you recorded at that competency implies: its regime read from the trajectories kept with it, the plan for that regime, and the admission that plan implies, yours to keep with foxxi.content_admit or not. Nothing is kept from the offer, and without a trajectory the regime is not read, so nothing is offered. Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/record-performance> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/record-performance> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.record_performance_signed-output" ;
        rdfs:comment "The recorded statement id + performer + shared-lattice composition, and for a failed unit an offer or why none is made. 400 on missing task_name/success or a malformed trajectory; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "recorded" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "offer" ] ;
            hydra:required false ;
            rdfs:comment "For a failed unit: the admission the work at its competency implies, { competency, kinds, because, regime, forPerformer, keep, situation, diagnosis, plan, evidence }, yours to keep with foxxi.content_admit."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "offerWithheld" ] ;
            hydra:required false ;
            rdfs:comment "For a failed unit with no offer: why (no trajectory to read the regime from, a plan with nothing to keep, or an admission you already keep)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "statementId" ] ;
            hydra:required false ;
            rdfs:comment "The xAPI performed statement id." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "performer" ] ;
            hydra:required false ;
            rdfs:comment "Performer DID (the verified caller)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "taskId" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "taskName" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "activityType" ] ;
            hydra:required false ;
            rdfs:comment "Domain activity-type IRI (or the generic ProductionTask wrapper)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "success" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "durable" ] ;
            hydra:required false ;
            rdfs:comment "Pod the canonical holon was composed into." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sharedLattice" ] ;
            hydra:required false ;
            rdfs:comment "Shared-lattice composition { holonUri, descriptorUrl, ... }."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.record_performance_signed-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, task_name, success, activity_type?, task_id?, quality?, duration_iso?, actor_kind?, cost_usd?, recipients?, trajectory? }). recipients?: pod URLs/DIDs to ALSO wrap the encrypted holon to (cross-seat owner-decrypt). trajectory?: { steps: [{ modalStatus: Asserted|Hypothetical|Counterfactual, granularity: task|subtask|tool-call, verb, objectId, objectName, id?, parentId?, supersedesId?, result?: { success?, quality?, note? }, recordedAt? }] }, at most 100 steps." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "secp256k1 over sha256:<hex(sha256(_signed_payload))> by the wallet matching agent_id (relay sign_request)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Record a performance event" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/ingest-course-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/ingest-course-signed> ;
    hydra:method "POST" ;
    hydra:title "Author + publish a course to your own pod (as yourself)" ;
    rdfs:comment "Author a Foxxi course (cmi5/SCORM-shaped: modules → lessons → fragments; assessment-item fragments are scored) and PUBLISH it to your OWN pod, authenticated by your delegation (the agent-drivable counterpart of foxxi.ingest_content_package). Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/ingest-course> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/ingest-course> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.ingest_course-output" ;
        rdfs:comment "The publish result (descriptor URLs etc.) + the author pod. 400 on missing parsed package; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authoredBy" ] ;
            hydra:required false ;
            rdfs:comment "Caller DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authorPod" ] ;
            hydra:required false ;
            rdfs:comment "Pod the course was published to." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseIri" ] ;
            hydra:required false ;
            rdfs:comment "IRI of the published course bundle." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "descriptorUrls" ] ;
            hydra:required false ;
            rdfs:comment "Per-stratum descriptor URLs from the ingest."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.ingest_course-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, parsed: <ParsedFoxxiPackage = { courseId, title, modules:[{id,title,lessons:[{id,title,competency,fragments:[{modality,body,level}]}]}] }>, subject_pod_url? })." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "secp256k1 over sha256:<hex(sha256(_signed_payload))> by the wallet matching agent_id (sign_request)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Author + publish a course" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-course-completion-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-course-completion-signed> ;
    hydra:method "POST" ;
    hydra:title "Record a cmi5 course completion as yourself" ;
    rdfs:comment "Record completing + passing a course as cmi5 xAPI (launched/initialized/completed/passed/terminated) into your OWN lens, authenticated by your delegation (the agent-drivable counterpart of foxxi.emit_cmi5_session). A passed completion (score_scaled ≥ mastery_score) lands mastery-verb experiences → an inferred competency in your ELR, which a later record-performance can supersede to performance-verified. Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/record-course-completion> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/record-course-completion> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.record_course_completion-output" ;
        rdfs:comment "The completion record (statement count, score, pass) + the lens it landed in. 400 on missing course_id or below-mastery score; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "completedBy" ] ;
            hydra:required false ;
            rdfs:comment "Caller DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseId" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseActivityId" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "scoreScaled" ] ;
            hydra:required false ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "masteryScore" ] ;
            hydra:required false ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "passed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "statementCount" ] ;
            hydra:required false ;
            rdfs:comment "Number of cmi5 statements recorded." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "durable" ] ;
            hydra:required false ;
            rdfs:comment "Pod the canonical holons were composed into." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.record_course_completion-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, course_id, course_title?, score_scaled, mastery_score?, duration_iso?, registration?, subject_pod_url? }). score_scaled must be ≥ mastery_score (default 0.7)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "secp256k1 over sha256:<hex(sha256(_signed_payload))> by the wallet matching agent_id (sign_request)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Record a course completion" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/set-forwarding-targets-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/set-forwarding-targets-signed> ;
    hydra:method "POST" ;
    hydra:title "Manage your own downstream xAPI forwarding targets" ;
    rdfs:comment "Set / list / remove the downstream LRS endpoints YOUR OWN xAPI statements are forwarded to (per-user Statement Forwarding). Owner = your verified delegation; targets are scoped to your own lens, so only your statements forward to them, never another user's. Omit both targets + delete to just list (downstream secrets are never echoed). Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/forwarding/targets> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/forwarding/targets> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.forwarding_targets-output" ;
        rdfs:comment "Your current forwarding targets (secrets redacted). 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "owner" ] ;
            hydra:required false ;
            rdfs:comment "Caller DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ownerTenant" ] ;
            hydra:required false ;
            rdfs:comment "Your lens tenant id." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "targets" ] ;
            hydra:required false ;
            rdfs:comment "Your forwarding targets (downstream secrets omitted)."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.forwarding_targets-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, targets?: [{ endpoint, credentials, label?, version?, enabled? }], delete?: string[] }). targets are added/updated (credentials = downstream LRS \"user:pass\"); delete removes by id." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "secp256k1 over sha256:<hex(sha256(_signed_payload))> by the wallet matching agent_id (relay sign_request)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Manage forwarding targets" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:appliesToCollection "integrations" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/write-xapi-statements-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/write-xapi-statements-signed> ;
    hydra:method "POST" ;
    hydra:title "Record your own xAPI activity and preserve its native evidence" ;
    rdfs:comment "Signed transport over the standard xAPI Statements Resource, scoped to your own lens. Accepts 1–20 JSON Activity statements (128 KiB maximum), each with a UUID id, observed timestamp and actor.account.name equal to your authenticated DID. Uses the existing LRS validation, immutability and forwarding; reads back its exact enriched envelopes and awaits encrypted PGSL persistence. No attachment, SubStatement or voiding transport on this adapter. Retry identical ids/content after uncertainty; never manufacture replacement events. Does not infer competency from mere reads: choose the accurate xAPI verb/result." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/xapi-statements/write> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/xapi-statements/write> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.write_xapi_statements_signed-output" ;
        rdfs:comment "200 only when accepted by the LRS and persisted to encrypted PGSL. A partial persistence failure returns 502 with lrsAccepted, statementIds and per-statement receipts so the same ids can be reconciled. Authority and stored are LRS-assigned." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "lrsAccepted" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "durable" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "statementIds" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "receipts" ] ;
            hydra:required false
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.write_xapi_statements_signed-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "sign_request({ statements:[{id, actor, verb, object, timestamp, result?, context?}] }). The relay supplies agent_id and the fresh authentication timestamp. Statement timestamps describe when the observed activities happened." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "The complete signature returned by sign_request." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Record own xAPI activity" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/read-xapi-statements-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/read-xapi-statements-signed> ;
    hydra:method "POST" ;
    hydra:title "Read your actual xAPI LRS statements" ;
    rdfs:comment "Signed transport to GET /xapi/statements in your own lens. Returns the actual LRS response, without merging a pod snapshot or learner-record summary. query accepts standard statementId, verb, activity, registration, since, until, ascending, limit (1–200; default 100), and the LRS cursor. Follow the returned more cursor through this same signed affordance. No operator role or caller-managed Basic secret required. LRS memory/restart limits remain as reported by discover-lrs; the write affordance separately preserves an encrypted native copy." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/xapi-statements/read> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/xapi-statements/read> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.read_xapi_statements_signed-output" ;
        rdfs:comment "The unmodified xAPI Statement for statementId, or StatementResult {statements, more} for a filtered query; errors preserve the LRS HTTP status." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "statements" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "more" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.read_xapi_statements_signed-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "sign_request({query?:{statementId?,verb?,activity?,registration?,since?,until?,ascending?,limit?,cursor?}}); identity/pod are bound by the signature." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "The complete signature returned by sign_request." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Read own xAPI statements" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/write-own-subject-xapi-statements-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/write-own-subject-xapi-statements-signed> ;
    hydra:method "POST" ;
    hydra:title "Keep personal activity in your own encrypted native pod" ;
    rdfs:comment "Record observed activity for the human who controls your native session agent. The signed subject_did and purpose personal-performance are checked against the configured identity authority, own storage, active owner registry, cryptographically verified publish delegation and live relay signing anchor. A subject_pod_url stamp corroborates that independently derived destination; it cannot select another pod. Every statement actor must equal the verified human subject. API authority is the owner-issued native delegation; a signed purpose does not mint or enforce the game client 15-minute activity-recording choice. Keeps a bounded personal activity profile in that person own encrypted native Interego pod: cumulative activity counts plus a rolling one-hour window of exact xAPI observations and immutable delivery receipts. No shared tenant copy, public descriptor, or indefinitely growing event archive. Existing own-agent xAPI actions remain separate. Limits: 1–20 statements, 128 KiB batch, 16 KiB per statement, up to 512 recent details (which can be pruned sooner by capacity) and 4096 UUID/body-digest receipts retained for one hour by observation age. Unexpired receipt capacity refuses further events until slots age out. Events older than one hour are refused instead of being counted again. Native encrypted head is capped at 1 MiB; A separate persisted 16 MiB rolling-hour encrypted CAS write budget survives restarts; runtime throttles bound input to 4 MiB/hour, actual encrypted writes to 16 MiB/hour and 4 MiB/request, with two concurrent writes per subject. These runtime throttles reset on restart; the encrypted profile and window bounds do not. Retry identical UUID ids/content only after reconciling uncertainty through the matching own-subject read action." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/xapi-statements/own-subject/write> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/xapi-statements/own-subject/write> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.write_own_subject_xapi_statements_signed-output" ;
        rdfs:comment "200 requires atomic own-pod native persistence and actual durable read-back of the bounded profile. Receipts contain exact immutable UUID ids and persisted:true, never a public descriptor. 409 means changed-content UUID reuse; 410 rejects observations outside the one-hour window; 413 preserves the confirmed profile if encrypted capacity is exceeded; 429 bounds write admission or unexpired receipt capacity. Unconfirmed delivery is reconciled using the same UUIDs." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "subjectDid" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "durable" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "lrsAccepted" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "statementIds" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "receipts" ] ;
            hydra:required false
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.write_own_subject_xapi_statements_signed-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "sign_request({subject_did:<verified controlling user DID>,purpose:\"personal-performance\",statements:[{id,actor,verb,object,timestamp,result?,context?}]}). The relay supplies agent_id, subject_pod_url and fresh signature timestamp. Statement timestamps describe observed events." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "The complete fresh signature returned by sign_request." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Keep private personal activity" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/read-own-subject-xapi-statements-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/read-own-subject-xapi-statements-signed> ;
    hydra:method "POST" ;
    hydra:title "Read and reconcile your own private native activity" ;
    rdfs:comment "Read the authoritative bounded encrypted own-pod xAPI activity window for the human who controls your native session agent. Requires subject_did, exact purpose personal-performance and fresh signed envelope. Independently verifies the native controller, own pod, active discover delegation and live relay anchor on every request. Queries do not initialize or mutate a pod head. This is a bounded personal activity profile with cumulative counts and a one-hour reconciliation window, not an indefinite raw-event LRS archive. statementId returns an owner-bound {ok,subjectDid,durable:true,statement}; a missing UUID returns 404 with coverage metadata, a known unavailable detail may return 410, and unavailable authority/storage returns an error. Expired observations must not be resent as new events. Other query fields match the own-agent adapter; continuation remains bound to this native subject and snapshot. No shared LRS cache, public descriptor, arbitrary learner, service-subject identity or inferred achievement." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/xapi-statements/own-subject/read> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/xapi-statements/own-subject/read> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.read_own_subject_xapi_statements_signed-output" ;
        rdfs:comment "Actual authoritative own-pod recent statement or filtered statements, with bounded-window coverage metadata. durable:true is emitted only after a verified native read." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "subjectDid" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "durable" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "statement" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "statements" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "more" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.read_own_subject_xapi_statements_signed-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "sign_request({subject_did:<verified controlling user DID>,purpose:\"personal-performance\",query:{statementId}}), or query filters verb/activity/registration/since/until/ascending/limit/cursor. The relay supplies agent_id, own pod stamp and fresh timestamp." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "The complete fresh signature returned by sign_request." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Read private personal activity" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/set-inbound-credentials-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/set-inbound-credentials-signed> ;
    hydra:method "POST" ;
    hydra:title "Manage your own inbound forwarding credentials" ;
    rdfs:comment "Mint / list / revoke the Basic-auth credentials an upstream system uses to forward xAPI statements INTO your OWN lens. Owner = your verified delegation; credentials are scoped to your lens, so forwarded-in statements land in your record. Secrets are never echoed back. Omit both credentials + revoke to just list. Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/credentials> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/credentials> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.credentials-output" ;
        rdfs:comment "Your current inbound credentials scoped to your lens (secrets redacted). 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "owner" ] ;
            hydra:required false ;
            rdfs:comment "Caller DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ownerTenant" ] ;
            hydra:required false ;
            rdfs:comment "Your lens tenant id." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "credentials" ] ;
            hydra:required false ;
            rdfs:comment "Your inbound credentials (secrets omitted)."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.credentials-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, credentials?: [{ principal, secret, label? }], revoke?: string[] }). credentials are added (the \"user:pass\" an upstream presents on /xapi/statements); revoke removes by id." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "secp256k1 over sha256:<hex(sha256(_signed_payload))> by the wallet matching agent_id (relay sign_request)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Manage inbound credentials" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:appliesToCollection "integrations" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-memory-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-memory-signed> ;
    hydra:method "POST" ;
    hydra:title "Publish a job aid / quick reference as a dereferenceable memory" ;
    rdfs:comment "Author a job aid or quick reference as yourself. It composes into a PUBLIC shared PGSL lattice at triple granularity, so the memory and its points become dereferenceable URL atoms that RESOLVE (via the relay id authority) to their description — a term, not a word. This is the shared-memory intervention: a job aid lives in the same fabric the resolver serves, unlike an ephemeral vault ingest. Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/publish-memory> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/publish-memory> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.publish_memory-output" ;
        rdfs:comment "The published memory + its dereferenceable atom URL. 400 on missing title/body; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "memoryIri" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "atom" ] ;
            hydra:required false ;
            rdfs:comment "The memory's dereferenceable URL atom (resolves via the relay id authority)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "resolver" ] ;
            hydra:required false ;
            rdfs:comment "The direct resolver link to the memory node's description." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.publish_memory-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, title, body, kind?:\"job-aid\"|\"quick-reference\" }). body is Markdown." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Publish a memory" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-fragment-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-fragment-signed> ;
    hydra:method "POST" ;
    hydra:title "Author a fragment of teaching or support" ;
    rdfs:comment "Author a fragment as yourself: one piece of teaching or support that compositions use by reference. Its IRI is the hash of its content, so the same content is the same fragment anywhere and nobody can change what a learner is shown under it. The body is Markdown (read as is by an agent, rendered for a person); questions take the xAPI interaction types and are stored with verifiers, never answers. It is kept on your pod's shared lattice and recorded as your authored statement; its IRI dereferences to its public form (no salt, verifier or explanation, and still checkable against the IRI)." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/content/fragment> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/content/fragment> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.content_fragment-output" ;
        rdfs:comment "The fragment's IRI and public form. 400 naming what to fix when the fragment cannot be stored; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "@id" ] ;
            hydra:required false ;
            rdfs:comment "The fragment IRI: <bridge>/ns/foxxi/fragment/<sha256>. GET <IRI>/efficacy shows, for each competency and learner level it has been played at, how the learners who met it went on to do (counts appear once a cell holds 5 outcomes)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authoredBy" ] ;
            hydra:required false ;
            rdfs:comment "Caller DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "fragment" ] ;
            hydra:required false ;
            rdfs:comment "The public form: kind, level, competencies, title?, body, and each question as { question, type, input?, graded, commitment }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "durable" ] ;
            hydra:required false ;
            rdfs:comment "Pod the fragment was composed into." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authoredStatementId" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.content_fragment-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, fragment: { kind, level?, competencies:[competency IRI, term IRI or slug], title?, body, questions?:[question, …], audience?: human|agent, suits?:[tag], language? }, subject_pod_url? }). kind is one of concept, worked-example, video, simulation, practice-task, assessment-item (needs a graded question), job-aid, reference, context-descriptor, probe and reflection (these two take only likert or long-fill-in questions). level is foundational, working (default), applied or advanced. body is Markdown, up to 20000 characters. Questions are written as foxxi.scorm_author takes them, at most 40." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Author a fragment" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-compose-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-compose-signed> ;
    hydra:method "POST" ;
    hydra:title "Compose fragments into a lesson, module, course or curriculum" ;
    rdfs:comment "Author a composition as yourself: a path of positions, each naming a competency and the alternatives that can fill it (fragments or other compositions, by their IRIs). Lesson, module, course and curriculum are one composition at different sizes, and a fragment used in three compositions is one fragment. Its IRI is the hash of its content; a revision names what it supersedes. Every alternative must be content this bridge can reach." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/content/composition> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/content/composition> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.content_compose-output" ;
        rdfs:comment "The composition and its IRI. 400 naming what to fix; 422 listing alternatives this bridge cannot reach; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "@id" ] ;
            hydra:required false ;
            rdfs:comment "The composition IRI: <bridge>/ns/foxxi/composition/<sha256>. GET <IRI>/cmi5.xml projects it as a cmi5 course any LMS can import: one AU, whose page is this bridge's player, resolving it for each learner the LMS launches and sending the record to that LMS. GET <IRI>/scorm.zip projects it as a SCORM 2004 package whose one SCO frames the same player." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authoredBy" ] ;
            hydra:required false ;
            rdfs:comment "Caller DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "composition" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "durable" ] ;
            hydra:required false ;
            rdfs:comment "Pod the composition was composed into." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authoredStatementId" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.content_compose-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, composition: { title, competency, positions:[{ competency, demonstratedAt?: 1-5, paradigm:[fragment or composition IRIs, 1-12] }, …], supersedes? }, subject_pod_url? }). At most 100 positions. demonstratedAt is the proficiency rank (1 Novice … 5 Expert) at which a learner skips the position; the default is 3, Competent." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Compose content" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-fold-course-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-fold-course-signed> ;
    hydra:method "POST" ;
    hydra:title "Fold a course you authored, or a SCORM package hosted here, into fragments and compositions" ;
    rdfs:comment "Fold a course you authored (foxxi.scorm_author), an emergent course as POST /content/compose-course returns it, or a package hosted here (GET /scorm/packages lists them: SCORM packages, and authoring tools' own exports kept to be folded), into composable content, kept on your pod. An emergent course keeps its syntagms and paradigms, its competencies named by the very text they were written in, and its \"question ::: answer — why\" checks graded on this bridge. Each section's teaching becomes a concept fragment and its questions a check (an assessment item, or a reflection when none is graded); a section with both becomes a composition of its own, teaching then check, and the course becomes a composition of its sections in order. The questions keep their stored form, so they grade as they did in the course, and the same course folds to the same IRIs on this bridge. A package is read in the order its manifest gives: each HTML page becomes a concept fragment in Markdown (its images served from the package here), the pages in one folder a topic, and the questions the package keeps a check for their topic: calls to a Question constructor it declares, QTI items (2.x, 3.0 or 1.2) read by their declared correct response, or a question bank written as data, in a JSON file or in a script, read by its field names, graded on this bridge; a topic of more than one part becomes a composition, pages then check, and the package a composition of its topics. A package Adapt, H5P, Rise 360, Storyline, iSpring or Captivate made, or its own export (an .h5p file, an Adapt course exported as source, a Rise 360, Storyline, iSpring or Captivate course published for xAPI or the web), is read in that tool's own model instead, since its runtime draws each page from data it carries: Adapt's pages, articles and components, H5P's chapters, slides and pieces, Rise 360's lessons and blocks, Storyline's scenes and slides, iSpring's slides and quizzes, or Captivate's slides, and their questions as the tool grades them, options the tool shuffles turned so the right one is not always first. A package that holds several courses (a zip of modules, or a SCORM package whose activities include one a tool published) has each read in its tool's model, and its other activities read as any package's. Anything not read (shared templates, a page with no text of its own, a question whose answer does not fit it) is listed with why. What it makes resolves per learner (foxxi.content_resolve), plays step by step (foxxi.content_launch), and learns which explanation works once others are offered at a position. The same for a person and for an agent." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/content/fold-course> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/content/fold-course> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.content_fold_course-output" ;
        rdfs:comment "The course's or package's composition, and where each section or topic went. 404 when the course or package is not here; 403 when you did not author the course; 400 naming what to fix; 422 when the package cannot be folded (no manifest, nothing with text, too large for one fold); 503 when your pod could not keep it, or when this bridge holds no key to keep anything with; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "@id" ] ;
            hydra:required false ;
            rdfs:comment "The course's composition IRI: <bridge>/ns/foxxi/composition/<sha256>. Pass it to foxxi.content_resolve or foxxi.content_launch; GET <IRI>/cmi5.xml projects it as a cmi5 course any LMS can import, and <IRI>/scorm.zip as a SCORM 2004 package." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course" ] ;
            hydra:required false ;
            rdfs:comment "The course IRI it was folded from." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "package" ] ;
            hydra:required false ;
            rdfs:comment "The hosted package it was folded from: <bridge>/scorm/packages/<sha-256>. Kept with the bundle as derivedFrom." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "packageSha256" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "derivedFrom" ] ;
            hydra:required false ;
            rdfs:comment "What the bundle was derived from, kept with it on your pod." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "topics" ] ;
            hydra:required false ;
            rdfs:comment "A package's topics, in order: { id, title, competency, at? (the IRI at its position), pages: [{ path, title, concept }], check?, questions }. A topic with nothing that folded has no at."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "unread" ] ;
            hydra:required false ;
            rdfs:comment "What of a package was not read or not folded, and why: [{ path, why }]."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "checks" ] ;
            hydra:required false ;
            rdfs:comment "Said when a package's questions became checks: they grade here, and are only as closed-book as the package was, which serves its answers to every browser." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authoredBy" ] ;
            hydra:required false ;
            rdfs:comment "Caller DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "competency" ] ;
            hydra:required false ;
            rdfs:comment "The competency the course develops, as named or as the course itself." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "composition" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sections" ] ;
            hydra:required false ;
            rdfs:comment "In order: { id, title, competency, at? (the IRI at its position), concept?, check?, lesson? }. A section with neither teaching nor questions has no at."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "items" ] ;
            hydra:required false ;
            rdfs:comment "How many fragments and compositions the fold made, kept together as one bundle on your pod." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "durable" ] ;
            hydra:required false ;
            rdfs:comment "Pod the bundle was composed into." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authoredStatementId" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.content_fold_course-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, course_id, competency?, section_competencies?: { <section id>: competency }, level?, language?, subject_pod_url? }), or JSON.stringify({ agent_id, timestamp, course: <an emergent course>, subject_pod_url? }), or JSON.stringify({ agent_id, timestamp, package_sha256, competency?, topic_competencies?: { <topic id>: competency }, level?, language?, subject_pod_url? }). An emergent course answers mapped: which IRIs each of its ids became, one each unless the older model gave several things one id (two lessons titled alike share one). competency is what the course or package develops: a competency IRI, another authority's term IRI, or a slug; without one, the course's or package's own IRI names it. section_competencies names a section's own where it differs, and topic_competencies a package topic's (a topic's id is its folder). level is foundational, working (default), applied or advanced; language is a BCP 47 tag." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Fold a course" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-resolve-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-resolve-signed> ;
    hydra:method "POST" ;
    hydra:title "Resolve a composition for yourself, from your own record" ;
    rdfs:comment "Resolve a composition for yourself: which fragment you are shown at each position and why. A position whose competency your record shows you have demonstrated (an Asserted competency, from performance or a credential, at the position's rank) is skipped; a training-only inference skips nothing. An admission, if given, limits each position to the forms that suit the work (the performance practice makes one from a plan); with none given, the admission you have kept for each competency (foxxi.content_admit) does, and admittedBy says which records decided anything. Among what is left, the alternative pitched nearest your level is chosen, and among those pitched equally near, the one that has worked best here for learners at your level, while one not yet tried enough still gets its turn (each fragment IRI's /efficacy shows what it has done where). Content that does not hash to its IRI is never used, and the trace says so. The same for a person and for an agent." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/content/resolve> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/content/resolve> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.content_resolve-output" ;
        rdfs:comment "Your resolution. 404 when the composition is not here; 400 for an invalid admission or a composition too large to resolve; 503 when the admissions you kept could not be read just now (nothing is resolved without them); 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "composition" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner" ] ;
            hydra:required false ;
            rdfs:comment "Caller DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learnerKind" ] ;
            hydra:required false ;
            sh:datatype xsd:string ;
            sh:in ( "human" "agent" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "steps" ] ;
            hydra:required false ;
            rdfs:comment "In order: { fragment (its public form, bodyHtml, numbered questions), competency, path, position, alternatives, chosenBecause, pitchedAt }. chosenBecause names the level and, when alternatives were equally near, what each has done for learners at that level."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "skipped" ] ;
            hydra:required false ;
            rdfs:comment "Positions you have demonstrated, with why."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "unmet" ] ;
            hydra:required false ;
            rdfs:comment "Positions nothing admissible could fill, with why."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "missing" ] ;
            hydra:required false ;
            rdfs:comment "Alternatives this bridge could not reach."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "admittedBy" ] ;
            hydra:required false ;
            rdfs:comment "The admissions you kept (foxxi.content_admit) that limited a position, when the request named none: { competency, admission, source?, regime?, at }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "refused" ] ;
            hydra:required false ;
            rdfs:comment "Content refused anywhere in the resolution because it did not hash to its IRI."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "trace" ] ;
            hydra:required false ;
            rdfs:comment "Every decision, in words."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.content_resolve-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, composition: IRI, admission?: { kinds:[fragment kinds], because }, learner_kind?: human|agent }). learner_kind defaults to human for a wallet signing for itself and agent for a delegated agent." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Resolve a composition" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-admit-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-admit-signed> ;
    hydra:method "POST" ;
    hydra:title "Keep which forms of content suit you at a competency" ;
    rdfs:comment "Keep, on your own pod, which forms of content suit you at a competency, or withdraw that. A plan made for your work (contextualize_and_plan) offers the admission it implies: a plan for Emergent work admits probes and reflection, never a lesson, and one for Turbulent work admits no content at all. The bridge never keeps a plan's consequence for you; you keep it here, and from then on foxxi.content_resolve and foxxi.content_launch admit only those forms at that competency whenever a request names no admission of its own. The latest record for a competency stands; admission: null withdraws it (and a withdrawal at a competency stands over what a composition's wider competency admits), and earlier records stay in your history. It is kept in a list of its own on your pod, sealed to the bridge and to you, and nothing counts until your pod holds it. The same for a person and for an agent." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/content/admit> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/content/admit> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.content_admit-output" ;
        rdfs:comment "The record kept. 400 naming what to fix; 409 when your pod is not on this bridge's store, so resolution here could not read it back; 503 when your pod could not keep it; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kept" ] ;
            hydra:required false ;
            rdfs:comment "{ competency, admission (null for a withdrawal), source?, regime?, at }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "durable" ] ;
            hydra:required false ;
            rdfs:comment "Your pod, where it was kept." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.content_admit-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, competency, admission: { kinds:[fragment kinds], because } | null, source?, regime? }). competency is a competency IRI, another authority's term IRI, or a slug. source is the IRI of the plan or situation it came from; regime is Evident, Knowable, Emergent or Turbulent." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Keep an admission" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-admissions-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-admissions-signed> ;
    hydra:method "POST" ;
    hydra:title "Read which forms of content you keep at each competency" ;
    rdfs:comment "Read back what you keep with foxxi.content_admit: the standing admission at each competency, a withdrawal included, newest first. It is read from the list on your own pod, sealed to the bridge and to you. A list that cannot be read now answers 503, never an empty one. The same for a person and for an agent." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/content/admissions> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/content/admissions> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.content_admissions-output" ;
        rdfs:comment "What you keep. 503 when your list could not be read now; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "standing" ] ;
            hydra:required false ;
            rdfs:comment "The standing record at each competency, newest first: { competency, admission: { kinds, because } | null (withdrawn), source?, regime?, at }."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.content_admissions-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp })." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Read your admissions" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-mine-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-mine-signed> ;
    hydra:method "POST" ;
    hydra:title "List the compositions you made and the ones you played" ;
    rdfs:comment "List the compositions you authored and the ones you have played, to launch one (foxxi.content_launch) or read what it has learned (GET <composition IRI>/efficacy). Nothing new is kept to answer this. Played compositions are read from your own record: the last played first, whether you finished, and the latest finished score. Authored ones are read from the index of where content lives, which names each item's author; one authored as a whole (a composition, or a folded course's root) is marked root when its authoring record is still at hand. Each composition is named by this bridge's IRI for its hash. The same for a person and for an agent." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/content/mine> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/content/mine> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.content_mine-output" ;
        rdfs:comment "Your compositions. 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authored" ] ;
            hydra:required false ;
            rdfs:comment "{ iri, title?, at?, root? }, authoring acts with a known time first, newest first."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "played" ] ;
            hydra:required false ;
            rdfs:comment "{ iri, title?, at, finished, score?: { raw, max } }, the last played first."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.content_mine-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, limit? }). limit: at most how many of each, 1 to 200 (50 when left out)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Your compositions" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-launch-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-launch-signed> ;
    hydra:method "POST" ;
    hydra:title "Launch a composition for yourself and get the first step" ;
    rdfs:comment "Resolve a composition for yourself (as foxxi.content_resolve does, from your own record) and start playing it: the first step comes back as you receive it, the fragment's Markdown and rendering and its questions without their verifiers. Continue with foxxi.content_next. The same for a person and for an agent. When everything is already demonstrated or nothing admissible fills it, there is nothing to play and the reasons come back instead." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/content/launch> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/content/launch> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.content_launch-output" ;
        rdfs:comment "The play session and its first step, or nothingToPlay with the reasons. 404 when the composition is not here; 400 for an invalid admission or a composition too large to resolve; 503 when the admissions you kept could not be read just now (nothing is launched without them); 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sessionId" ] ;
            hydra:required false ;
            rdfs:comment "Pass to foxxi.content_next." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "registration" ] ;
            hydra:required false ;
            rdfs:comment "The xAPI registration every statement of this play carries." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "composition" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learnerKind" ] ;
            hydra:required false ;
            sh:datatype xsd:string ;
            sh:in ( "human" "agent" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "step" ] ;
            hydra:required false ;
            rdfs:comment "{ step, of, competency, chosenBecause, fragment: its public form, bodyHtml and numbered questions }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "nothingToPlay" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "skipped" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "unmet" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "admittedBy" ] ;
            hydra:required false ;
            rdfs:comment "The admissions you kept that limited a position, as foxxi.content_resolve reports them."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "trace" ] ;
            hydra:required false
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.content_launch-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, composition: IRI, admission?: { kinds:[fragment kinds], because }, learner_kind?: human|agent })." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Launch a composition" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-next-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-next-signed> ;
    hydra:method "POST" ;
    hydra:title "Answer the step you are on and go on" ;
    rdfs:comment "Answer the questions of the step you are on, if it has any, and move to the next. The bridge grades graded questions against their verifiers (never your word) and records the step in your own record as xAPI: an answered statement per question, the question as an interaction activity without its correct responses, and an experienced statement for the fragment carrying the competency, position, alternatives offered and why it was chosen. A missed check brings another way in: each position that taught its competency since the last check there, and offers more than you met, gives you another of its alternatives (chosen as resolution chose, never one you were shown), then another check when the missed one's position has one, before the play goes on. Each position does this once per play. On the last step the composition is completed. Every statement follows the Foxxi xAPI profile's composition-attempt pattern. A step counts only once its record is kept: if it cannot be kept, the answers you gave stand and the next call keeps them before anything else." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/content/next> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/content/next> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.content_next-output" ;
        rdfs:comment "The graded step and the next one, or the summary when done. 404 for an unknown or expired session; 403 when the session is another learner's; 422 with validationErrors when the answers cannot be taken (the step does not advance); 503 when your answers were taken but could not be kept in your record yet (call again: the answers already given are kept, and any sent with the retry are not taken); 409 while another call is recording or expected_step is stale; 400 for an invalid expected_step; 401 on auth failure. A guarded latest receipt may be replayed without recording or efficacy credit a second time." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sessionId" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "recorded" ] ;
            hydra:required false ;
            rdfs:comment "The ids of the statements recorded for this step."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "keptEarlierAnswers" ] ;
            hydra:required false ;
            rdfs:comment "True when this call kept a step answered on an earlier call whose record could not be kept then: graded and recorded are that step's." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "replayedReceipt" ] ;
            hydra:required false ;
            rdfs:comment "True when expected_step replayed the latest successful receipt without grading, recording or efficacy credit again." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "graded" ] ;
            hydra:required false ;
            rdfs:comment "{ correct, total, detail:[{ question, correct: true|false|null, explanation? }] } when the step had questions."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "done" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "step" ] ;
            hydra:required false ;
            rdfs:comment "The next step, as launch returns it."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "summary" ] ;
            hydra:required false ;
            rdfs:comment "{ steps, graded: { correct, total } } when done."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.content_next-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, session_id, expected_step?, answers? }). expected_step is the positive one-based step.step you received; keep it unchanged on retries. Include it to replay the latest successful receipt after a lost HTTP acknowledgement without applying old answers to the next step. Receipts last only for this in-process session (up to three hours and the session capacity bound), including a guarded final step. Without it, retry only a reported pending-write failure; a successful write with a lost acknowledgement is not safely replayable. answers is one string per question of the step, in the formats foxxi.scorm_submit takes: text, a number, option letters (\"B\" or \"A, C\"), true or false, the letters of shown items in their right order, a letter per prompt for matching, a scale letter for likert, free text for long-fill-in." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Answer and continue" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/xapi-author-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/xapi-author-signed> ;
    hydra:method "POST" ;
    hydra:title "Author a native xAPI course as yourself" ;
    rdfs:comment "Author teaching and checks natively as content-addressed fragments and compositions, kept on your own pod. The native composition engine grades stored question verifiers and records xAPI 2.0 directly; it does not require SCORM sequencing or a SCORM manifest. The answer-safe native descriptor and HyperMarkdown launch control are readable without starting an attempt. cmi5 and SCORM remain optional projections of the same content. Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/xapi/author> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/xapi/author> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.xapi_author-output" ;
        rdfs:comment "The native course content identity, author, composition, artifact links and confirmed pod persistence. Follow foxxi.content_launch with composition set to the returned @id. 400 for invalid content; 401 for failed authentication; 503 when the course could not be kept." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "@id" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authoredBy" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "composition" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "modules" ] ;
            hydra:required false ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "lessons" ] ;
            hydra:required false ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "items" ] ;
            hydra:required false ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "artifacts" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "durable" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sharedLattice" ] ;
            hydra:required false
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.xapi_author-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, course: { title, competency, modules:[{ title, competency?, lessons:[{ title, competency?, fragments:[{ kind, body, title?, level?, competencies?, questions?, audience?, suits?, language? }] }] }], supersedes? }, subject_pod_url? }). Each fragment uses the same form and question types as foxxi.content_fragment; omitted competencies inherit the lesson, and explicit fragment competencies must include that lesson competency (use a lesson override for another competency). Assessment-item needs a graded question; reflection and probe use only ungraded questions. At most 100 modules, 100 lessons total, and 500 fragments total; each fragment keeps the existing 20000-character and 40-question limits. No plaintext answer key is returned." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Author a native xAPI course" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-author-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-author-signed> ;
    hydra:method "POST" ;
    hydra:title "Author a real conformant SCORM 2004 course as yourself" ;
    rdfs:comment "Author a SCORM 2004 course as yourself. Foxxi generates a CONFORMANT imsmanifest.xml and validates it parses on the real SCORM SN runtime, then composes the full course losslessly into your shared PGSL lattice (launchable cross-restart + cross-agent). Assessment answers are hashed at author time (plaintext never touches the pod). Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/scorm/author> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/scorm/author> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_author-output" ;
        rdfs:comment "The authored course summary + manifest-valid flag + shared-lattice composition. 400 on a missing/invalid course or non-parsing manifest; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authoredBy" ] ;
            hydra:required false ;
            rdfs:comment "Caller DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseId" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "title" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "scoCount" ] ;
            hydra:required false ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "assessmentScos" ] ;
            hydra:required false ;
            rdfs:comment "How many SCOs carry an assessment." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "masteryScore" ] ;
            hydra:required false ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "manifestValid" ] ;
            hydra:required false ;
            rdfs:comment "True — the generated manifest parsed on the SN runtime." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "durable" ] ;
            hydra:required false ;
            rdfs:comment "Pod the course was composed into." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseIri" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_author-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, course: { courseId, title, masteryScore?, scos:[{ id, title, body, assessment?:[question, …] }] }, subject_pod_url? }). body is Markdown (headings, lists, tables, fenced code, quotes, images and links), up to 20000 characters; at most 100 sections and 40 questions a section. Each question is { question, explanation?, … } in one of the xAPI interaction types: fill-in { answer, accept?:[other answers], caseSensitive?: true } (an answer that reads as a number is graded as one unless type is \"fill-in\"; letter case counts only with caseSensitive); numeric { answer: number, min?, max? }; choice { options:[…], answer: \"B\" or the option text, or a list when several are right }; true-false { answer: true|false }; sequencing { items:[in their right order] } (shown shuffled); matching { pairs:[[prompt, answer], …], distractors?:[…] }; likert { scale?:[…] } and long-fill-in {} are recorded, not graded. Give type when it is not plain from the fields." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Author a SCORM course" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-launch-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-launch-signed> ;
    hydra:method "POST" ;
    hydra:title "Launch a SCORM course (start an attempt on the SN engine)" ;
    rdfs:comment "Launch an authored SCORM course as yourself. The SCORM 2004 SN runtime parses the manifest, starts an attempt, and delivers the first SCO (its content +, for an assessment SCO, the questions). The course is resolved from the in-memory catalog, else loaded from the author pod (author_did/course_pod; defaults to your own pod for a self-authored course), so it survives restarts and is launchable cross-agent. Then POST /agent/scorm/submit per SCO. Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/scorm/launch> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/scorm/launch> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_launch-output" ;
        rdfs:comment "The launched session id + the first delivered SCO view. 404 when the course is not found; 409 when the SN start fails; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sessionId" ] ;
            hydra:required false ;
            rdfs:comment "SCORM play session id — pass to /agent/scorm/submit." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "launchedBy" ] ;
            hydra:required false ;
            rdfs:comment "Caller DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course" ] ;
            hydra:required false ;
            rdfs:comment "{ id, title }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sco" ] ;
            hydra:required false ;
            rdfs:comment "The delivered SCO view: body (Markdown), bodyHtml (its safe rendering), and assessment questions { index, question, type, input: { options | items | targets | min/max }, graded } with answers withheld."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sequencingEnded" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "instruction" ] ;
            hydra:required false ;
            rdfs:comment "How to proceed." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_launch-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, course_id, author_did?, course_pod?, subject_pod_url? })." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Launch a SCORM course" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-submit-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-submit-signed> ;
    hydra:method "POST" ;
    hydra:title "Submit the current SCO + advance (graded, committed to the SN engine)" ;
    rdfs:comment "Submit the current SCO. For an assessment SCO pass { answers:[...] } — the player GRADES them against the package answer hashes (not self-reported), commitTracking()s cmi.completion/success/score into the SN engine, and advances (Continue). When the engine sequences to the end, its ROLLUP decides pass/complete and the outcome is recorded to your ELR. If your record does not hold the outcome, the answer is a 503 carrying it, and the session stays: submit to it again, and the same statements are kept. Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/scorm/submit> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/scorm/submit> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_submit-output" ;
        rdfs:comment "The next SCO (done:false) or the final rolled-up outcome (done:true) + grading detail. 404 when no play session; 403 when not your session; 409 when no current SCO; 401 on auth failure; 503 with the outcome when the attempt ended but your record does not hold it (the session stays for another submit)." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ok" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "done" ] ;
            hydra:required false ;
            rdfs:comment "True when sequencing ended (final outcome present)." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "graded" ] ;
            hydra:required false ;
            rdfs:comment "Assessment grading { score, correct, total, passed, detail:[{ question, your, correct (null when not graded), explanation? }] } (for an assessment SCO)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sco" ] ;
            hydra:required false ;
            rdfs:comment "The next delivered SCO view (when done:false)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course" ] ;
            hydra:required false ;
            rdfs:comment "{ id, title } (when done:true)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "completed" ] ;
            hydra:required false ;
            rdfs:comment "Engine rollup completion (when done:true)." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "passed" ] ;
            hydra:required false ;
            rdfs:comment "Engine rollup pass (when done:true)." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "score" ] ;
            hydra:required false ;
            rdfs:comment "Rolled-up normalized score (when done:true)." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "recordedStatements" ] ;
            hydra:required false ;
            rdfs:comment "Count of the outcome's xAPI statements your ELR holds (when done:true)." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "recorded" ] ;
            hydra:required false ;
            rdfs:comment "Whether your ELR holds the outcome: every statement that records it (when done:true)." ;
            sh:datatype xsd:boolean
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_submit-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, session_id, answers? }). answers is the ordered array for an assessment SCO, one string per question: fill-in its text; numeric a number; choice the option letter (\"B\") or its text, several letters joined by commas (\"A, C\"); true-false true or false; sequencing the letters of the shown items in their right order (\"C, A, B\"); matching one target letter per prompt, in prompt order (\"B, A, C\"); likert one letter; long-fill-in its text." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Submit a SCORM SCO" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-course-ask> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-course-ask> ;
    hydra:method "POST" ;
    hydra:title "Ask an authored course a question" ;
    rdfs:comment "Ask a question about a course authored on this bridge. The answer is assembled, not generated: the I2IDL Digital Learning Glossary terms the question names (found by I2IDL-X's surface forms), what I2IDL says each means, where the course covers it, and the course sections whose words overlap the question. Every field says whose it is: definitions and sources are I2IDL's; the provenance wording (\"Direct source definition\" / \"I2IDL synthesis supported by source evidence\") and reuse class are I2IDL-X · derived; referent categories and enactments are I2IDL-X · proposed (Hypothetical). A definition whose direct sources do not allow commercial reuse is not quoted, and I2IDL's card is linked instead. No model is called, and an assessment's questions are never read. Read-only; no signature needed." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/scorm/ask> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/scorm/ask> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_course_ask-output" ;
        rdfs:comment "The answer and its grounding. 400 without course_id or question; 404 when no such course; 429 when rate-limited." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            rdfs:comment "\"course-answer\"." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "answer" ] ;
            hydra:required true ;
            rdfs:comment "The assembled answer, in sentences." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "grounding" ] ;
            hydra:required false ;
            rdfs:comment "glossary-and-course | glossary | course | none." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "concepts" ] ;
            hydra:required false ;
            rdfs:comment "Each I2IDL term the question names: iri, card, label, definition (or definitionWithheld), provenance, reuse, sources, inCourse, and i2idlx { referent, enactments } (Hypothetical)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sections" ] ;
            hydra:required false ;
            rdfs:comment "Up to three course sections that bear on the question, each with a snippet."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseTerms" ] ;
            hydra:required false ;
            rdfs:comment "I2IDL terms the course uses, for a next question."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "attribution" ] ;
            hydra:required false ;
            rdfs:comment "The glossary release and its rights statement; the I2IDL-X graphs read."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_course_ask-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_id" ] ;
            hydra:required true ;
            rdfs:comment "The authored course's id." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "question" ] ;
            hydra:required true ;
            rdfs:comment "The question, up to 500 characters." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "author_did" ] ;
            hydra:required false ;
            rdfs:comment "The author's DID, when the course is not yet known to this bridge." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Ask a course" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-dispatch-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-dispatch-signed> ;
    hydra:method "POST" ;
    hydra:title "Dispatch a course to another LMS (SCORM 2004 or 1.2 stub)" ;
    rdfs:comment "As a course's author, make a dispatch: a stub package another organization's LMS imports like any SCORM package. The stub holds no content and no answers; its one SCO opens the course on this bridge in a frame, the SCORM engine sequences and grades it, and the stub reports score, completion, success, each answered question and the time spent through that LMS's own SCORM API. That LMS keeps the learner's record: the bridge is not told who the learner is, and counts only launches, completions and passes for you. A learner who closes the course mid-way resumes it. Optional expires_at and launch_limit bound the dispatch; foxxi.scorm_dispatch_revoke withdraws it, and every copy of the stub stops launching. Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/scorm/dispatch> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/scorm/dispatch> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_dispatch-output" ;
        rdfs:comment "The dispatch, 201. 400 on a bad expires_at or launch_limit; 403 when you are not the course's author; 404 when no such course; 401 on auth failure; 429 when rate-limited." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            rdfs:comment "\"scorm-dispatch\"." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "dispatch" ] ;
            hydra:required true ;
            rdfs:comment "{ id, courseId, title, owner, createdAt, expiresAt?, launchLimit?, state, usage { launches, completed, passed }, packages { \"2004\", \"1.2\" }, ask }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "note" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_dispatch-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, course_id, title?, expires_at? (ISO 8601, in the future), launch_limit? (whole number ≥ 1) })." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Dispatch a course" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-dispatch-revoke-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-dispatch-revoke-signed> ;
    hydra:method "POST" ;
    hydra:title "Withdraw a course dispatch" ;
    rdfs:comment "Withdraw one of your dispatches. Every copy of its stub then answers that the course was withdrawn; attempts already under way may finish. Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/scorm/dispatch/revoke> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/scorm/dispatch/revoke> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_dispatch_revoke-output" ;
        rdfs:comment "The withdrawn dispatch. 404 when no such dispatch of yours; 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "dispatch" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "note" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_dispatch_revoke-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, dispatch_id })." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Withdraw a dispatch" ;
    iep:readOnlyHint false ;
    iep:destructiveHint true ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-dispatches-signed> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-dispatches-signed> ;
    hydra:method "POST" ;
    hydra:title "List your course dispatches and their usage" ;
    rdfs:comment "Your dispatches, optionally for one course: each one's state (live, revoked, expired, exhausted), its launch, completion and pass counts, and its package links. Externally routed: sign_request the args, then POST the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/scorm/dispatches> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/scorm/dispatches> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_dispatches-output" ;
        rdfs:comment "Your dispatches. 401 on auth failure." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "owner" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "count" ] ;
            hydra:required false ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "dispatches" ] ;
            hydra:required true
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_dispatches-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON.stringify({ agent_id, timestamp, course_id? })." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "sign_request signature (secp256k1 over sha256 of _signed_payload)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "List dispatches" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/bind-decoration> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/bind-decoration> ;
    hydra:method "POST" ;
    hydra:title "Bind a decoration's controls to your own LRS or LMS" ;
    rdfs:comment "LRS-X decorates any xAPI 2.0 Learning Record Store, and LMS-X any LMS that speaks LTI 1.3 Advantage and OneRoster 1.2: each is a catalog of controls (one per resource or service, with the headers and scope it asks for) and a set of Hypothetical proposals tying each part to the I2IDL glossary and to the Foxxi capabilities that enact it. Give the decoration and your instance's URLs (LRS-X: endpoint; LMS-X: configuration, jwks, lineitems, lineitem, memberships, oneroster), and get the controls with them filled in. The bridge fetches nothing; it only fills the templates. The catalogs are at {base}/decorations/<id> (Turtle, JSON-LD, JSON or HTML) and the proposals at {base}/decorations/<id>/proposals. Each decoration is independent work, not affiliated with or endorsed by the publisher of what it decorates." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/agent/decorations/bind> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/agent/decorations/bind> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.bind_decoration-output" ;
        rdfs:comment "The bound controls. 400 on an unknown decoration, a decoration that takes no binding, an unknown variable, or a URL that is not https (or loopback http) or that carries credentials." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            rdfs:comment "\"bound-decoration\"." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "controls" ] ;
            hydra:required true ;
            rdfs:comment "Each control: { id, part, title, method, href (query variables left as an RFC 6570 {?…} for each call), readOnly, accept?, contentType?, headers?, auth? }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "unbound" ] ;
            hydra:required false ;
            rdfs:comment "The binding variables you did not give; controls that need them are left out."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.bind_decoration-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "decoration" ] ;
            hydra:required true ;
            rdfs:comment "lrs-x or lms-x (lti-x, ler-x and tla-x decorate specifications and an architecture, and need no binding)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "values" ] ;
            hydra:required true ;
            rdfs:comment "Each binding variable to an https URL of your instance, e.g. { \"endpoint\": \"https://lrs.example.com/xapi\" }."
        ]
    ] ;
    rdfs:label "Bind a decoration" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:appliesToCollection "profiles" ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/read-intervention-methods> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/read-intervention-methods> ;
    hydra:method "GET" ;
    hydra:title "Read performance consulting and intervention methods" ;
    rdfs:comment "Discover the versioned consulting and management cycle and the implementation method for each intervention. Profiles carry steps, revision links, required work products and evidence criteria. Contextualize and diagnose before choosing a method; gap analysis is Knowable-only." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/performance/methods> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/performance/methods> ;
    dcat:mediaType "application/ld+json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.read_intervention_methods-output" ;
        rdfs:comment "The JSON-LD method catalogue or selected profile. Markdown and Turtle are negotiated representations of this resource." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "@context" ] ;
            hydra:required true ;
            rdfs:comment "Canonical methodology vocabulary bindings."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "@id" ] ;
            hydra:required true ;
            rdfs:comment "Catalogue or selected method resource." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "@graph" ] ;
            hydra:required true ;
            rdfs:comment "Profiles with steps, criteria, source guidance and revision links."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.read_intervention_methods-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "method" ] ;
            hydra:required false ;
            rdfs:comment "Optional profile token or canonical IRI; omit for the catalogue. consulting is the full performance consulting and management cycle." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "format" ] ;
            hydra:required false ;
            rdfs:comment "Representation to read." ;
            sh:datatype xsd:string ;
            sh:in ( "jsonld" "markdown" "turtle" )
        ]
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/review-method-evidence> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/review-method-evidence> ;
    hydra:method "POST" ;
    hydra:title "Check intervention method evidence coverage" ;
    rdfs:comment "Check supplied artifact pointers and notes against the selected method criteria. Returns missing-evidence or documented-unverified, coverage percent and missing work products. Does not inspect linked contents, approve quality, verify authorship, select an intervention or claim performance effects. No records are written." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/performance/methods/review> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/performance/methods/review> ;
    dcat:mediaType "application/json" ;
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.review_method_evidence-output" ;
        rdfs:comment "Evidence-pointer coverage only; never certification or substantive quality approval." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "method" ] ;
            hydra:required true ;
            rdfs:comment "Canonical method IRI." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "version" ] ;
            hydra:required true ;
            rdfs:comment "Reviewed method version." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "status" ] ;
            hydra:required true ;
            rdfs:comment "Coverage status, not an efficacy verdict." ;
            sh:datatype xsd:string ;
            sh:in ( "missing-evidence" "documented-unverified" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "coverage" ] ;
            hydra:required true ;
            rdfs:comment "Percentage of criteria with documented pointers." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "verified" ] ;
            hydra:required true ;
            rdfs:comment "Always false; artifact contents are not inspected." ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "criteria" ] ;
            hydra:required true ;
            rdfs:comment "Required work products and quality criteria."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "criterionResults" ] ;
            hydra:required true ;
            rdfs:comment "Per-criterion coverage and submitted pointers."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "note" ] ;
            hydra:required true ;
            rdfs:comment "Explicit review limitations." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.review_method_evidence-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "method" ] ;
            hydra:required true ;
            rdfs:comment "Method token or canonical IRI from the catalogue." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evidence" ] ;
            hydra:required false ;
            rdfs:comment "Up to 200 objects, each {criterion: exact criterion IRI from the profile, artifact: absolute http/https/urn IRI, note: non-empty explanation (max 2000 characters)}. Omit or send [] to see all missing evidence. Caller approval or verification flags are rejected."
        ]
    ] ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:externallyRouted true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/ingest-content-package> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/ingest-content-package> ;
    hydra:method "POST" ;
    hydra:title "[admin] Ingest a SCORM/cmi5/xAPI content package" ;
    rdfs:comment "Unwrap a SCORM 1.2 / SCORM 2004 / cmi5 zip package, run the Foxxi storyline parser (deterministic structural rendering + Whisper-transcribed audio + concept extraction with morphology + prerequisite-edge inference), and emit three-stratum descriptors (fxs structural, fxk knowledge, fxa activity-schema) to the tenant pod. SHACL-validates against the Foxxi vocab; non-clean packages are flagged in the catalog with parse_status=\"violations\"." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/ingest_content_package> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/ingest_content_package> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.ingest_content_package-output" ;
        rdfs:comment "Result of parsing + publishing a SCORM/cmi5/xAPI content package. Emits three-stratum descriptors (fxs structural, fxk knowledge, fxa activity-schema) on the tenant pod and reports SHACL violations under parseStatus." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "courseIri" ] ;
            hydra:required false ;
            rdfs:comment "IRI of the new fxa:CoursePackageBundle." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "catalogIri" ] ;
            hydra:required false ;
            rdfs:comment "IRI of the catalog entry updated for this course." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "parseStatus" ] ;
            hydra:required false ;
            rdfs:comment "clean = SHACL-valid; violations = catalog flagged with shape violations." ;
            sh:datatype xsd:string ;
            sh:in ( "clean" "violations" )
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "descriptorUrls" ] ;
            hydra:required false ;
            rdfs:comment "Per-stratum descriptor URLs: { structural[], knowledge[], activity[] }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "concepts" ] ;
            hydra:required false ;
            rdfs:comment "Number of concepts extracted." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "slides" ] ;
            hydra:required false ;
            rdfs:comment "Number of slides parsed." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "prereqEdges" ] ;
            hydra:required false ;
            rdfs:comment "Number of prerequisite edges inferred." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "violations" ] ;
            hydra:required false ;
            rdfs:comment "SHACL violation entries (only when parseStatus=violations)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "note" ] ;
            hydra:required false ;
            rdfs:comment "Stub note when the Python parser has not yet been run and parsed payload is absent." ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.ingest_content_package-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "zip_base64" ] ;
            hydra:required true ;
            rdfs:comment "Content package as base64-encoded zip." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required true ;
            rdfs:comment "Tenant pod URL where the parsed descriptors land." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authoritative_source" ] ;
            hydra:required true ;
            rdfs:comment "DID of the content publisher (e.g., did:web:acme-training.example)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_id" ] ;
            hydra:required false ;
            rdfs:comment "Stable catalog course_id (default: derived from manifest identifier)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "lms_source" ] ;
            hydra:required false ;
            rdfs:comment "Originating LMS connector ID (default: \"Direct upload\")." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Ingest a content package" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-authoring-policy> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-authoring-policy> ;
    hydra:method "POST" ;
    hydra:title "[admin] Publish an authoring-tool / standard policy" ;
    rdfs:comment "Declare which authoring tools (Articulate Storyline, Adobe Captivate, Camtasia, etc.) and which package standards (SCORM 1.2, SCORM 2004, cmi5, xAPI) are accepted into the catalog. Reuses the abac policy descriptor pattern; ingestion rejects packages outside the accepted set." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/publish_authoring_policy> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/publish_authoring_policy> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.publish_authoring_policy-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required true ;
            rdfs:comment "Tenant pod URL." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "accepted_tools" ] ;
            hydra:required true ;
            rdfs:comment "Array of accepted authoring tool labels."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "accepted_standards" ] ;
            hydra:required true ;
            rdfs:comment "Array of accepted package standard labels."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "effective_from" ] ;
            hydra:required false ;
            rdfs:comment "ISO 8601 timestamp the policy becomes effective; default: now." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Publish an authoring policy" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "policies" ;
    iep:appliesToCollection "courses" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/connect-lms> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/connect-lms> ;
    hydra:method "POST" ;
    hydra:title "Verify and record an operator-configured LMS connection" ;
    rdfs:comment "As the authenticated pod owner, verify an exact operator-configured LMS account through a bounded authenticated HTTPS JSON API probe, then store a non-secret encrypted connection artifact with verified readback. Connector ID, product, instance and auth method must match FOXXI_LMS_CONNECTORS. The operator connector must be configured for this authenticated own pod; owning another pod does not authorize its credentials. Credentials stay server-side. No caller-selected probe, OAuth enrollment, scheduled synchronization or data import is performed; sync_frequency supports manual only. Sign the complete inner action payload." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/connect_lms> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/connect_lms> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.connect_lms-output" ;
        rdfs:comment "A verified authenticated-probe receipt and encrypted readback-confirmed connection artifact; syncScheduled:false, credentialsPersisted:false, remotePayloadPersisted:false. Missing configuration or failed identity probe refuses publication." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "loaded" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "consumed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "completed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "writesPerformed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "published" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "encrypted" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "readbackVerified" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "descriptorUrl" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "graphUrl" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "graphIri" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "trustLevel" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authorship" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "lesson" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "source" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "modalStatus" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.connect_lms-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "Use the actual _signed_payload returned by sign_request. Its complete inner payload must satisfy {\"type\":\"object\",\"properties\":{\"action\":{\"type\":\"string\",\"const\":\"foxxi.connect_lms\"},\"tenant_pod_url\":{\"type\":\"string\",\"description\":\"Optional corroboration of the authenticated own pod; cannot select another pod.\"},\"connector_id\":{\"type\":\"string\"},\"product\":{\"type\":\"string\"},\"instance\":{\"type\":\"string\",\"description\":\"Exact operator-configured HTTPS instance.\"},\"auth_method\":{\"type\":\"string\"},\"sync_frequency\":{\"type\":\"string\",\"enum\":[\"manual\"],\"default\":\"manual\"},\"owner_encryption_key\":{\"type\":\"string\",\"description\":\"Signature-bound canonical base64 X25519 public key held by the owner; never an unsigned discovered key.\"},\"bridge_audience\":{\"type\":\"string\",\"description\":\"Exact current bridge origin, without a trailing slash; derive it from this manifest authority, never a caller-selected different service.\"}},\"required\":[\"action\",\"bridge_audience\",\"connector_id\",\"product\",\"instance\",\"auth_method\",\"owner_encryption_key\"]}. sign_request binds authenticated agent_id and timestamp. Put every action field inside this signed payload; unsigned outer fields provide no authority. Standard sign_request ECDSA envelopes only; browser _session grant envelopes are refused on these durable-proof actions." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "The real signature returned by sign_request over that exact inner payload; never a placeholder." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Verify a configured LMS connection" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/assign-audience> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/assign-audience> ;
    hydra:method "POST" ;
    hydra:title "[admin] Assign a course to an audience group via a policy" ;
    rdfs:comment "Bind a course to an audience group (by audience_tag) via a Foxxi assignment policy descriptor. Trigger options: on-hire, on-role-change, on-cycle (annually), manual. Due-by relative days control when the assignment expires." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/assign_audience> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/assign_audience> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.assign_audience-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required true ;
            rdfs:comment "Tenant pod URL." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_iri" ] ;
            hydra:required true ;
            rdfs:comment "IRI of the course (must already be ingested)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "audience_tag" ] ;
            hydra:required true ;
            rdfs:comment "Audience tag this course is assigned to (e.g., \"support\")." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "requirement_type" ] ;
            hydra:required true ;
            rdfs:comment "One of: required | recommended." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "trigger" ] ;
            hydra:required true ;
            rdfs:comment "One of: on-hire | on-role-change | on-cycle | manual." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "due_relative_days" ] ;
            hydra:required true ;
            rdfs:comment "Days from trigger event after which the assignment is overdue." ;
            sh:datatype xsd:decimal
        ]
    ] ;
    rdfs:label "Assign a course to an audience" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "groups" ;
    iep:appliesToCollection "policies" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/coverage-query> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/coverage-query> ;
    hydra:method "POST" ;
    hydra:title "Aggregate supplied concept-coverage records" ;
    rdfs:comment "Compute a privacy-preserving aggregate from the coverage records supplied in this request. Does not walk the tenant catalog, extract concepts or apply category/concept filters. Each record is {concept,taughtIn,mentionedIn}; v2 returns an attested aggregate of the record count and v3 a differentially private histogram of taughtIn counts. Caller-supplied coverage is not independently verified catalog evidence." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/coverage_query> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/coverage_query> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.coverage_query-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "coverage" ] ;
            hydra:required true ;
            rdfs:comment "Supplied records: {concept:string,taughtIn:string[],mentionedIn:string[]}[]. Empty array means explicitly no supplied records; this operation never reads a catalog. Maximum 1000 unique concepts, 1000 references per list and 10000 total references; strings are bounded to 2048 characters."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required true ;
            rdfs:comment "Tenant pod URL." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "privacy_mode" ] ;
            hydra:required false ;
            rdfs:comment "One of: abac | merkle-attested-opt-in (v2, default) | zk-distribution (v3 histogram)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "epsilon" ] ;
            hydra:required false ;
            rdfs:comment "DP ε budget for zk-distribution mode." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "distribution_edges" ] ;
            hydra:required false ;
            rdfs:comment "Bucket-edge boundaries (decimal-string bigints) for zk-distribution."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "distribution_max_value" ] ;
            hydra:required false ;
            rdfs:comment "Upper bound for the last bucket in zk-distribution." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Aggregate supplied concept coverage" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-concept-map> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-concept-map> ;
    hydra:method "POST" ;
    hydra:title "Publish an encrypted map of an existing course's concepts" ;
    rdfs:comment "As the authenticated pod owner, project the actual authorized published course into a SKOS ConceptScheme with its source labels and prerequisite relations, then publish to your own pod with encrypted exact RDF readback. No inline or invented course is accepted. Private by default; explicit federation recipients and their X25519 public keys must be covered by the same signature. The map is extracted content, not a validation, competency or mastery assertion." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/publish_concept_map> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/publish_concept_map> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.publish_concept_map-output" ;
        rdfs:comment "Encrypted publication and exact RDF readback receipts, actual source course IRI, concept/prerequisite counts and bound recipient DIDs. The receipt does not assert mastery or external semantic validation." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "loaded" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "consumed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "completed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "writesPerformed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "published" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "encrypted" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "readbackVerified" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "descriptorUrl" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "graphUrl" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "graphIri" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "trustLevel" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authorship" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "lesson" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "source" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "modalStatus" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.publish_concept_map-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "Use the actual _signed_payload returned by sign_request. Its complete inner payload must satisfy {\"type\":\"object\",\"properties\":{\"action\":{\"type\":\"string\",\"const\":\"foxxi.publish_concept_map\"},\"tenant_pod_url\":{\"type\":\"string\",\"description\":\"Optional corroboration of the authenticated own pod; cannot select another pod.\"},\"course_iri\":{\"type\":\"string\"},\"owner_encryption_key\":{\"type\":\"string\",\"description\":\"Signature-bound canonical base64 X25519 public key held by the owner; never an unsigned discovered key.\"},\"federation_share_with\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Explicit recipient DIDs; each requires its bound public key.\"},\"recipient_encryption_keys\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"},\"description\":\"DID to canonical base64 X25519 public key; all entries are signature covered.\"},\"bridge_audience\":{\"type\":\"string\",\"description\":\"Exact current bridge origin, without a trailing slash; derive it from this manifest authority, never a caller-selected different service.\"}},\"required\":[\"action\",\"bridge_audience\",\"course_iri\",\"owner_encryption_key\"]}. sign_request binds authenticated agent_id and timestamp. Put every action field inside this signed payload; unsigned outer fields provide no authority. Standard sign_request ECDSA envelopes only; browser _session grant envelopes are refused on these durable-proof actions." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "The real signature returned by sign_request over that exact inner payload; never a placeholder." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Publish an existing course concept map" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-compliance-evidence> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-compliance-evidence> ;
    hydra:method "POST" ;
    hydra:title "Record an encrypted caller-reported compliance event" ;
    rdfs:comment "Record your signature-bound assignment-created, completion, exception or audit-action report on your own pod, citing only controls in the selected published SOC 2, EU AI Act or NIST RMF control set. Stores the report encrypted to you and the bridge and verifies readback. Evidence remains Hypothetical authenticated caller report: independentlyVerified:false, complianceSatisfied:false and credentialIssued:false. No learning achievement or regulatory satisfaction is independently established." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/publish_compliance_evidence> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/publish_compliance_evidence> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.publish_compliance_evidence-output" ;
        rdfs:comment "Encrypted publication/readback receipt, event IRI, cited controls and explicit Hypothetical caller-report limitations; no credential, achievement or finding of regulatory satisfaction." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "loaded" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "consumed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "completed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "writesPerformed" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "published" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "encrypted" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "readbackVerified" ] ;
            hydra:required false ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "descriptorUrl" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "graphUrl" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "graphIri" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "trustLevel" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "authorship" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "lesson" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "source" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "modalStatus" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "error" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.publish_compliance_evidence-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "Use the actual _signed_payload returned by sign_request. Its complete inner payload must satisfy {\"type\":\"object\",\"properties\":{\"action\":{\"type\":\"string\",\"const\":\"foxxi.publish_compliance_evidence\"},\"tenant_pod_url\":{\"type\":\"string\",\"description\":\"Optional corroboration of the authenticated own pod; cannot select another pod.\"},\"event_type\":{\"type\":\"string\",\"enum\":[\"assignment-created\",\"completion\",\"exception\",\"audit-action\"]},\"event_payload\":{\"type\":\"object\",\"description\":\"assignment-created:{user_id,course_iri,due_at}; completion:{user_id,course_iri,completed_at}; exception:{reason}; audit-action:{action}. Dates are ISO timestamps.\"},\"framework\":{\"type\":\"string\",\"enum\":[\"soc2\",\"eu-ai-act\",\"nist-rmf\"],\"default\":\"soc2\"},\"controls\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"maxItems\":100,\"description\":\"IRIs in the selected published framework control set.\"},\"owner_encryption_key\":{\"type\":\"string\",\"description\":\"Signature-bound canonical base64 X25519 public key held by the owner; never an unsigned discovered key.\"},\"bridge_audience\":{\"type\":\"string\",\"description\":\"Exact current bridge origin, without a trailing slash; derive it from this manifest authority, never a caller-selected different service.\"}},\"required\":[\"action\",\"bridge_audience\",\"event_type\",\"event_payload\",\"owner_encryption_key\"]}. sign_request binds authenticated agent_id and timestamp. Put every action field inside this signed payload; unsigned outer fields provide no authority. Standard sign_request ECDSA envelopes only; browser _session grant envelopes are refused on these durable-proof actions." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "The real signature returned by sign_request over that exact inner payload; never a placeholder." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Record a caller-reported compliance event" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/issue-completion-credential> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/issue-completion-credential> ;
    hydra:method "POST" ;
    hydra:title "[admin] Issue a W3C VC / Open Badges 3.0 completion credential" ;
    rdfs:comment "Mint a W3C Verifiable Credential (Open Badges 3.0-shaped) for a learner who completed a course, sign it with the tenant's deterministic Ed25519 issuer key (eddsa-jcs-2022 DataIntegrityProof), and publish it to the learner's pod in the foxxi-wallet/ container as a fxa:CourseCompletionCredential descriptor. The signed VC verifies independently with any W3C VC verifier; the descriptor is discoverable via iep:discover() filtered on dct:conformsTo." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/issue_completion_credential> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/issue_completion_credential> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.issue_completion_credential-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Learner's WebID / DID — becomes credentialSubject.id on the VC." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_pod_url" ] ;
            hydra:required true ;
            rdfs:comment "Learner's pod where the credential is published (typically same as tenant_pod_url for tenant-hosted wallets)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_id" ] ;
            hydra:required true ;
            rdfs:comment "Course identifier (e.g. golf-explained)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_title" ] ;
            hydra:required true ;
            rdfs:comment "Human-readable course title (becomes Achievement.name)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_description" ] ;
            hydra:required false ;
            rdfs:comment "Optional achievement description." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "criterion_narrative" ] ;
            hydra:required false ;
            rdfs:comment "Optional natural-language statement of the completion criterion (becomes Achievement.criteria.narrative)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "aligned_skills" ] ;
            hydra:required false ;
            rdfs:comment "Optional array of competency alignments (each: { targetCode, targetName, targetFramework?, targetFrameworkUrl?, proficiencyLevel? }). Becomes Achievement.alignment[]."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evidence" ] ;
            hydra:required false ;
            rdfs:comment "Optional supporting evidence array (each: { type, id, narrative? }) — e.g. cited slides from a Q&A turn."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "derived_from_experiences" ] ;
            hydra:required false ;
            rdfs:comment "Optional IRIs of the raw xAPI experience records this completion was derived from. Recorded as prov:wasDerivedFrom on the credential descriptor + fxa:LearningExperience evidence on the VC, so an auditor can walk credential → raw events."
        ]
    ] ;
    rdfs:label "Issue a completion credential" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/export-clr> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/export-clr> ;
    hydra:method "POST" ;
    hydra:title "Export a learner's Comprehensive Learner Record (1EdTech CLR 2.0)" ;
    rdfs:comment "Walk the learner's pod via iep:discover(), aggregate every fxa:CourseCompletionCredential + fxa:CompetencyAssertion the pod holds, verify each embedded W3C VC's DataIntegrityProof, and return a 1EdTech CLR 2.0-shaped envelope wrapping all verified entries. Each entry preserves its own proof so downstream verifiers can re-check any single credential without trusting the envelope." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/export_clr> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/export_clr> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.export_clr-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Learner's WebID/DID — also cross-checked against each credential's credentialSubject.id." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_pod_url" ] ;
            hydra:required true ;
            rdfs:comment "Pod root to walk." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Export a Comprehensive Learner Record" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/assemble-learner-record> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/assemble-learner-record> ;
    hydra:method "POST" ;
    hydra:title "Assemble an Enterprise Learner Record (IEEE P2997 — human or AI agent)" ;
    rdfs:comment "Compose an IEEE P2997 Enterprise Learner Record — the unified, provenance-pointed aggregate of a subject's path. Pulls learning EXPERIENCES + on-the-job PERFORMANCE records from Foxxi-as-LRS xAPI statements, CREDENTIALS from the subject's pod wallet (reusing the verified CLR composer), and COMPETENCIES ranked across three bases: performance-verified (Asserted — proven by successful production work, supersedes weaker evidence), credentialed (Asserted), and inferred (Hypothetical — predicted from a passed/completed experience alone; iep:modalStatus keeps the prediction honest). Actor-agnostic: the subject may be a human learner/performer OR an AI agent learning + exercising tools — set actor_kind accordingly. Every entry carries a raw-data-location pointer per the P2997 data-ownership requirement. Pure read; non-admins may assemble their own human record, and any caller may assemble an agent capability record (agent capabilities are discoverable, like the agent registry)." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/assemble_learner_record> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/assemble_learner_record> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.assemble_learner_record-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Subject's WebID/DID — the ELR subject; cross-checked against credential subjects." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "Subject's pod root to walk for wallet credentials (defaults to the tenant pod)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_name" ] ;
            hydra:required false ;
            rdfs:comment "Optional subject display name for the ELR header." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "actor_kind" ] ;
            hydra:required false ;
            rdfs:comment "human (default) or agent. Agent capability records are assemblable by any caller; human records are self/admin-only." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Assemble an Enterprise Learner Record" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-performance> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-performance> ;
    hydra:method "POST" ;
    hydra:title "Record a performance event (on-the-job work — human or AI agent)" ;
    rdfs:comment "Record one unit of on-the-job production work as an xAPI `performed` statement — the IEEE P2997 employment-history leg, kept distinct from training experiences. The performer (actor_did) may be a human exercising a workplace task OR an AI agent exercising a tool; the authenticated caller is the attesting observer, recorded in provenance. Performance records feed the ELR competency engine: successful production work yields a performance-verified (Asserted) competency that SUPERSEDES a training-only inference for the same competency — closing the data-informed loop." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/record_performance> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/record_performance> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.record_performance-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "actor_did" ] ;
            hydra:required true ;
            rdfs:comment "Performer's DID — a human learner/performer or an AI agent. Defaults to the caller." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "task_name" ] ;
            hydra:required true ;
            rdfs:comment "Human-readable task or tool name (e.g. \"Resolve a tier-2 support ticket\", \"Use the web-search tool\"). Becomes the xAPI Activity name + (absent activity_type) the competency label." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "task_id" ] ;
            hydra:required false ;
            rdfs:comment "Stable task/tool identifier; derived from task_name if omitted." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "activity_type" ] ;
            hydra:required false ;
            rdfs:comment "Optional DOMAIN activity-type IRI you define for your vertical (e.g. urn:ttt:Move). Becomes object.definition.type; the ELR competency engine AGGREGATES same-type executions across instances under one competency. This is how a vertical-creator declares the publishing-layer vocabulary that makes competencies meaningful. Omit to use the generic ProductionTask wrapper (competency then keys off task_name)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "success" ] ;
            hydra:required true ;
            rdfs:comment "Did the performer complete the task successfully?" ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "quality" ] ;
            hydra:required false ;
            rdfs:comment "Outcome quality, 0..1 (becomes xAPI result.score.scaled)." ;
            sh:datatype xsd:decimal ;
            sh:minInclusive 0 ;
            sh:maxInclusive 1
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "duration_iso" ] ;
            hydra:required false ;
            rdfs:comment "ISO 8601 duration the task took (e.g. PT4M30S)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "cost_usd" ] ;
            hydra:required false ;
            rdfs:comment "Optional cost of the execution in USD (useful for AI-agent performance economics)." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "actor_kind" ] ;
            hydra:required false ;
            rdfs:comment "human (default) or agent." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Record a performance event" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-agent-trajectory> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-agent-trajectory> ;
    hydra:method "POST" ;
    hydra:title "Record an agentic-native trajectory (modal · poly-granular · composable)" ;
    rdfs:comment "Record an agent run in the AGENTIC-NATIVE form — not as flat xAPI statements but as a trajectory of Context Descriptors emergent from Interego L1: each step is MODAL (Hypothetical = an intention/plan, Asserted = executed, Counterfactual = a rejected branch — with iep:supersedes chains), POLY-GRANULAR (task ▸ subtask ▸ tool-call, the PGSL principle), and COMPOSABLE (trajectories merge via the L1 union/restriction algebra). The native trajectory is the source of truth; the bridge projects only the Asserted tool-call steps down to xAPI `performed` statements (which the IEEE P2997 ELR then reads). Intentions, counterfactuals, and the task hierarchy are retained ONLY in the native trajectory — xAPI structurally cannot hold them, and the projection reports exactly what it dropped." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/record_agent_trajectory> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/record_agent_trajectory> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.record_agent_trajectory-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "agent_did" ] ;
            hydra:required true ;
            rdfs:comment "The agent whose run this trajectory records." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "agent_name" ] ;
            hydra:required false ;
            rdfs:comment "Optional agent display name." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "steps" ] ;
            hydra:required true ;
            rdfs:comment "Ordered trajectory steps. Each: { modal_status (Hypothetical|Asserted|Counterfactual), granularity (task|subtask|tool-call), verb, object_id, object_name, object_type?, id?, parent_id?, supersedes_id?, was_derived_from?[], result?{success,quality,note} }. A task step names the competency its work counts toward as the learner record counts work: by object_type when that is a domain activity type, or else by object_name when the step has a result. When work you record at that competency fails (foxxi.record_performance_signed), its regime is read from this trajectory too, cut to that task and the steps below it."
        ]
    ] ;
    rdfs:label "Record an agentic-native trajectory" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/get-agent-trajectory> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/get-agent-trajectory> ;
    hydra:method "POST" ;
    hydra:title "Get an agent's native trajectory (what the xAPI projection drops)" ;
    rdfs:comment "Return an agent's full agentic-native trajectory — every step at every modal status (including the Hypothetical intentions + Counterfactual branches xAPI cannot represent) and every granularity. Includes a projection summary: how many steps reach xAPI vs. how many are retained only in the native form. Agent trajectories are discoverable, like the agent capability registry." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/get_agent_trajectory> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/get_agent_trajectory> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.get_agent_trajectory-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "agent_did" ] ;
            hydra:required true ;
            rdfs:comment "The agent whose trajectory to retrieve." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Get an agent's native trajectory" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/assess-agent-disposition> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/assess-agent-disposition> ;
    hydra:method "POST" ;
    hydra:title "Assess a team of agents' disposition (Agent Performance Technology)" ;
    rdfs:comment "Read a team of agents' DISPOSITION from their trajectories — deliberately NOT a gap analysis. There is no ideal future state and no score-vs-exemplary; the gap model only fits knowable work, and a team of agents is a complex, adaptive system. Returns the modal balance (deliberation / exploration / plan-revision propensities), named dispositions, a WORK-REGIME placement of the team's behaviour with the decision stance it calls for, and a VECTOR of drift from the present — not a destination. If a safe-to-fail probe has been run on this team, also returns the causal read (the interventional + counterfactual effect)." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/assess_agent_disposition> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/assess_agent_disposition> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.assess_agent_disposition-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "agent_dids" ] ;
            hydra:required true ;
            rdfs:comment "The DIDs of the agents forming the team to assess." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Assess an agent team disposition" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/run-performance-probe> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/run-performance-probe> ;
    hydra:method "POST" ;
    hydra:title "Run a safe-to-fail performance probe on an agent team" ;
    rdfs:comment "Record a safe-to-fail probe on an agent team — the disposition-based intervention. A probe nudges a CONSTRAINT (an affordance scope, a delegation bound, a connecting constraint), never an outcome: manage constraints, not targets. It is a deliberate, reversible change: the handler snapshots the team's disposition before the change as the causal baseline. The probe declares its safe-to-fail portfolio role (coherent / oblique / contradictory) and its weak signals — what would tell the consultant to amplify vs. dampen it. Re-assess the team afterward (assess_agent_disposition) to get the interventional + counterfactual causal read." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/run_performance_probe> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/run_performance_probe> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.run_performance_probe-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "agent_dids" ] ;
            hydra:required true ;
            rdfs:comment "The agent team the probe is run on." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "constraint_target" ] ;
            hydra:required true ;
            rdfs:comment "The constraint being nudged — e.g. \"delegation-scope\", \"web-search-affordance\", \"connecting-constraint:researcher-summariser\". Never an outcome." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "change" ] ;
            hydra:required true ;
            rdfs:comment "Human description of the constraint nudge (e.g. \"broaden the delegation scope so the researcher may sub-delegate retrieval\")." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "coherence" ] ;
            hydra:required true ;
            rdfs:comment "Safe-to-fail portfolio role: coherent | oblique | contradictory." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "hypothesized_effect" ] ;
            hydra:required true ;
            rdfs:comment "What the consultant expects the nudge to do to the disposition (a hypothesis, not a target)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "amplify_signal" ] ;
            hydra:required true ;
            rdfs:comment "The weak signal that would say: amplify this probe." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "dampen_signal" ] ;
            hydra:required true ;
            rdfs:comment "The weak signal that would say: dampen / withdraw this probe." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Run a safe-to-fail probe" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/open-agent-evaluation> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/open-agent-evaluation> ;
    hydra:method "POST" ;
    hydra:title "Open an agent / harness evaluation cohort" ;
    rdfs:comment "Open a named, shared evaluation — the place where several teams' competing agents or harnesses are compared head-to-head. Carries the decision the cohort exists to inform (e.g. \"should we standardise on one agentic harness, or fund several?\") and an optional shared task set so the comparison is apples-to-apples. The motivating case: an enterprise where multiple teams independently build agents/harnesses and cannot agree how to evaluate one against another. Candidates enrol via foxxi.request_evaluation_enrollment; runs are recorded via foxxi.record_external_agent_run; the portfolio read is foxxi.compare_agent_evaluation." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/open_agent_evaluation> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/open_agent_evaluation> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.open_agent_evaluation-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "name" ] ;
            hydra:required true ;
            rdfs:comment "Human-readable name for the evaluation cohort." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "decision_question" ] ;
            hydra:required true ;
            rdfs:comment "The decision this cohort exists to inform — e.g. \"Which coding-agent harness should the platform team adopt — or should we keep more than one?\"." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "task_set" ] ;
            hydra:required false ;
            rdfs:comment "Optional shared task set for apples-to-apples comparison. Each: { name, id?, description? } (a plain string is accepted as a task name)."
        ]
    ] ;
    rdfs:label "Open an agent evaluation cohort" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/request-evaluation-enrollment> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/request-evaluation-enrollment> ;
    hydra:method "POST" ;
    hydra:title "Request enrollment of an agent into an evaluation cohort (cross-pod delegation)" ;
    rdfs:comment "A team requests that its agent / harness join an evaluation cohort as a candidate. The candidate agent is identified by its own DID — which may live on a different team's pod — so enrolling it is a cross-pod delegation: the request starts as `requested` and does not enter the comparison until the evaluation owner accepts it (foxxi.decide_evaluation_candidate). This request → accept handshake is the delegation grant. Records the team, and the harness/runtime the agent is built on, so the portfolio read can attribute behaviour to the harness." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/request_evaluation_enrollment> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/request_evaluation_enrollment> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.request_evaluation_enrollment-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evaluation_id" ] ;
            hydra:required true ;
            rdfs:comment "The evaluation cohort to enrol into." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "agent_did" ] ;
            hydra:required true ;
            rdfs:comment "The candidate agent's DID — may resolve to another team's pod." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "agent_name" ] ;
            hydra:required false ;
            rdfs:comment "Display name for the candidate agent." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "team" ] ;
            hydra:required true ;
            rdfs:comment "The team that owns / submitted this candidate." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "harness" ] ;
            hydra:required false ;
            rdfs:comment "The harness / runtime the agent is built on: { name?, version?, runtime? }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "pod_url" ] ;
            hydra:required false ;
            rdfs:comment "Pod where the candidate agent's records live, when cross-pod." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Request evaluation enrollment" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/decide-evaluation-candidate> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/decide-evaluation-candidate> ;
    hydra:method "POST" ;
    hydra:title "Accept or decline a candidate agent (the cross-pod delegation grant)" ;
    rdfs:comment "The evaluation owner accepts or declines a requested candidate. Accepting it IS the cross-pod delegation grant — the candidate agent (whose DID may belong to another team / pod) becomes a managed member of the cohort and may record runs into it. This closes the gap where Interego could register an agent on your own pod but had no turnkey flow to authorise an external agent into a shared, managed evaluation." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/decide_evaluation_candidate> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/decide_evaluation_candidate> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.decide_evaluation_candidate-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evaluation_id" ] ;
            hydra:required true ;
            rdfs:comment "The evaluation cohort." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "candidate_id" ] ;
            hydra:required true ;
            rdfs:comment "The candidate to decide on (from request_evaluation_enrollment)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "decision" ] ;
            hydra:required true ;
            rdfs:comment "accept | decline." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Decide a candidate agent" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-external-agent-run> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-external-agent-run> ;
    hydra:method "POST" ;
    hydra:title "Record one completed run of an external agent (Codex, OpenClaw, Hermes, enterprise)" ;
    rdfs:comment "The one-call adapter for an EXTERNAL agent — one that does its work outside Foxxi (a Codex doing real coding, an OpenClaw or Hermes agent, a custom enterprise agent) and is therefore invisible to the trajectory layer and the ELR. Emit a single completed RUN and the bridge normalises it into a genuine agentic-native trajectory AND xAPI `performed` statements, so the run becomes visible to disposition assessment, the IEEE P2997 ELR, and — if bound to an evaluation — the portfolio read. Two input shapes: `tool_calls` (a flat list — an un-instrumented agent wires this in ~10 lines) or `steps` (the full modal / poly-granular trajectory, for an agent that already tracks intentions + counterfactual branches). Bind the run to a cohort with evaluation_id (+ optionally candidate_id)." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/record_external_agent_run> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/record_external_agent_run> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.record_external_agent_run-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "agent_did" ] ;
            hydra:required true ;
            rdfs:comment "The external agent's DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "agent_name" ] ;
            hydra:required false ;
            rdfs:comment "Display name for the agent." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "task_name" ] ;
            hydra:required true ;
            rdfs:comment "What the run accomplished (becomes the xAPI Activity name)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "task_id" ] ;
            hydra:required false ;
            rdfs:comment "Stable task identifier; derived from task_name if omitted." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "task_description" ] ;
            hydra:required false ;
            rdfs:comment "Optional longer task description." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "success" ] ;
            hydra:required true ;
            rdfs:comment "Did the run succeed overall?" ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "quality" ] ;
            hydra:required false ;
            rdfs:comment "Outcome quality 0..1." ;
            sh:datatype xsd:decimal ;
            sh:minInclusive 0 ;
            sh:maxInclusive 1
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "duration_iso" ] ;
            hydra:required false ;
            rdfs:comment "ISO 8601 duration the run took (e.g. PT12M)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "cost_usd" ] ;
            hydra:required false ;
            rdfs:comment "Cost of the run in USD — agent-economics signal for the portfolio read." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tool_calls" ] ;
            hydra:required false ;
            rdfs:comment "Simple form — a flat list of tool invocations. Each: { tool, object_name?, object_id?, success?, quality?, note? }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "steps" ] ;
            hydra:required false ;
            rdfs:comment "Rich form — the full modal / poly-granular trajectory. Each: { modal_status, granularity, verb, object_id, object_name, id?, parent_id?, supersedes_id?, was_derived_from?[], result? }. Provide tool_calls OR steps."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evaluation_id" ] ;
            hydra:required false ;
            rdfs:comment "Bind this run to an evaluation cohort." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "candidate_id" ] ;
            hydra:required false ;
            rdfs:comment "The candidate this run belongs to; resolved from agent_did within the evaluation if omitted." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "harness" ] ;
            hydra:required false ;
            rdfs:comment "The harness / runtime: { name?, version?, runtime? }."
        ]
    ] ;
    rdfs:label "Record an external agent run" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/get-agent-evaluation> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/get-agent-evaluation> ;
    hydra:method "POST" ;
    hydra:title "Get an evaluation cohort — its candidates and their enrollment status" ;
    rdfs:comment "Return an evaluation cohort: the decision question, the shared task set, and every candidate with its team, harness, enrollment status (requested / accepted / declined) and run count. The read view for tracking who is in the bake-off and how much evidence each candidate has accumulated." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/get_agent_evaluation> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/get_agent_evaluation> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.get_agent_evaluation-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evaluation_id" ] ;
            hydra:required true ;
            rdfs:comment "The evaluation cohort to read." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Get an evaluation cohort" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/compare-agent-evaluation> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/compare-agent-evaluation> ;
    hydra:method "POST" ;
    hydra:title "Compare the cohort — the complexity-aware portfolio read (NOT a leaderboard)" ;
    rdfs:comment "Produce the comparative read for an evaluation cohort — deliberately NOT a benchmark leaderboard and it emits no overall score. A leaderboard assumes the choice is knowable (a single best, found by measurement); whether to standardise on one agentic harness is usually an Emergent-regime decision where premature convergence is the ideal-future-state trap. So this returns a PORTFOLIO READ: the work regime of the WORK itself (pooled across all candidates' runs), each candidate's disposition + how well it COHERES with that work, a diagnosis of what KIND of decision the executives face, and a direct answer to \"should we develop only one harness?\" — converge (Evident/Knowable work: analysis can name a direction), parallel (Emergent work: the competing teams ARE the correct safe-to-fail probe portfolio — keep them), recombine (complementary dispositions: compose the harnesses via the substrate's union operator rather than pick), or gather-evidence (thin run history). Retrospective coherence, not prediction." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/compare_agent_evaluation> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/compare_agent_evaluation> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.compare_agent_evaluation-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evaluation_id" ] ;
            hydra:required true ;
            rdfs:comment "The evaluation cohort to compare." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Compare an evaluation cohort" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/export-case-framework> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/export-case-framework> ;
    hydra:method "POST" ;
    hydra:title "[admin] Export the tenant's competency framework as 1EdTech CASE 1.0 JSON-LD" ;
    rdfs:comment "Project the tenant's fxk:SkillFramework + fxk:Skill (+ rcd:CompetencyDefinition for skills that have RDCEO proficiency levels) into a 1EdTech CASE 1.0 CFDocument JSON-LD payload. The CASE document is consumable by any CASE-compliant tool (CASE Network, CaSS, downstream LMSes) without re-implementing the Foxxi vocab." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/export_case_framework> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/export_case_framework> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.export_case_framework-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "framework_id" ] ;
            hydra:required true ;
            rdfs:comment "Framework IRI to export (must already be published as a fxk:SkillFramework descriptor on the tenant pod)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Export a CASE framework" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/emit-cmi5-session> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/emit-cmi5-session> ;
    hydra:method "POST" ;
    hydra:title "Build a cmi5 xAPI session trace" ;
    rdfs:comment "Build launched, initialized, completed, passed or failed, terminated and optional satisfied statement documents from supplied session values. Authenticated callers may name themselves; an admin may name another learner. This operation returns the trace only and does not launch an activity, send statements to an LRS or persist learner evidence. Supply measured values only; generated documents do not establish that the session happened." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/emit_cmi5_session> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/emit_cmi5_session> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.emit_cmi5_session-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Learner WebID — becomes the xAPI actor (mbox or account)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_id" ] ;
            hydra:required true ;
            rdfs:comment "Course ID (becomes parent contextActivities)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "au_activity_id" ] ;
            hydra:required true ;
            rdfs:comment "Assignable Unit IRI (becomes statement object)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "registration" ] ;
            hydra:required true ;
            rdfs:comment "cmi5 session-id / xAPI registration UUID for this launch." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "score_scaled" ] ;
            hydra:required false ;
            rdfs:comment "Normalized score (0..1) for passed/failed determination." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "mastery_score" ] ;
            hydra:required false ;
            rdfs:comment "Threshold for passed; default 0.7." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "duration_iso" ] ;
            hydra:required false ;
            rdfs:comment "Session duration as ISO 8601 (e.g. PT5M30S)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "move_on_rule" ] ;
            hydra:required false ;
            rdfs:comment "One of Passed / Completed / CompletedAndPassed / CompletedOrPassed / NotApplicable." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Build a cmi5 session trace" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/resolve-did> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/resolve-did> ;
    hydra:method "POST" ;
    hydra:title "Resolve a W3C DID (did:key / did:web / did:ethr) to its DID document" ;
    rdfs:comment "Composes the substrate's DID resolver. For did:key, decodes the embedded Ed25519 public key. For did:web, fetches .well-known/did.json over HTTPS and returns the parsed document. For did:ethr, derives the verification method from the Ethereum address." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/resolve_did> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/resolve_did> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.resolve_did-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "did" ] ;
            hydra:required true ;
            rdfs:comment "DID to resolve (did:key:* | did:web:* | did:ethr:*)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Resolve a W3C DID" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/query-experience-index> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/query-experience-index> ;
    hydra:method "POST" ;
    hydra:title "Federate an xAPI Statement query across multiple LRSs (ADL TLA Experience Index)" ;
    rdfs:comment "Implements the read side of the ADL Total Learning Architecture Experience Index. Given a filter (actor / verb / activity / since / until / registration), queries every configured LRS endpoint in parallel, deduplicates statements by id, and returns a unified result with per-LRS attribution." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/query_experience_index> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/query_experience_index> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.query_experience_index-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "endpoints" ] ;
            hydra:required true ;
            rdfs:comment "Array of { label, endpoint, username, password } LRS configs."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "filter" ] ;
            hydra:required false ;
            rdfs:comment "Filter object: { agent?, verb?, activity?, since?, until?, registration?, limit? }."
        ]
    ] ;
    rdfs:label "Federated xAPI Experience Index query" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/push-to-cass> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/push-to-cass> ;
    hydra:method "POST" ;
    hydra:title "[admin] Push the tenant's competency framework to an ADL CaSS server" ;
    rdfs:comment "POST the tenant's CASE 1.0 CFDocument (from foxxi.export_case_framework) to a CaSS server's /api/framework endpoint. Downstream CaSS-integrated tooling can then query learner competencies without re-implementing Foxxi semantics." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/push_to_cass> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/push_to_cass> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.push_to_cass-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "cass_endpoint" ] ;
            hydra:required true ;
            rdfs:comment "CaSS server base URL." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "cass_bearer" ] ;
            hydra:required false ;
            rdfs:comment "Optional bearer token for authenticated push." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "framework_id" ] ;
            hydra:required true ;
            rdfs:comment "Framework IRI to export + push." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Push framework to a CaSS server" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/export-clr-v1> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/export-clr-v1> ;
    hydra:method "POST" ;
    hydra:title "Export a learner's record as 1EdTech CLR 1.0 (legacy pre-VC) JSON" ;
    rdfs:comment "Project the learner's pod credentials into the legacy 1EdTech CLR 1.0 shape for institutional consumers still on the pre-VC format. The 1.0 payload is plaintext JSON — institutional signing is the operator's responsibility." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/export_clr_v1> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/export_clr_v1> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.export_clr_v1-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Learner WebID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_pod_url" ] ;
            hydra:required true ;
            rdfs:comment "Pod to walk." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Export legacy CLR 1.0" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/issue-bbs-credential> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/issue-bbs-credential> ;
    hydra:method "POST" ;
    hydra:title "[admin] Issue a BBS+-signed OB3 completion credential (supports selective disclosure)" ;
    rdfs:comment "Build an OB3-shaped W3C VC, sign it with the tenant's BBS+ key over a flattened message list. The full credential goes to the holder; the holder later derives a zero-knowledge proof revealing only the claims they choose. Verifier learns nothing about un-revealed claims." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/issue_bbs_credential> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/issue_bbs_credential> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.issue_bbs_credential-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Learner subject." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_id" ] ;
            hydra:required true ;
            rdfs:comment "Course identifier." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_title" ] ;
            hydra:required true ;
            rdfs:comment "Achievement name." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "score_scaled" ] ;
            hydra:required true ;
            rdfs:comment "Normalized score (0..1)." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "proficiency_level" ] ;
            hydra:required true ;
            rdfs:comment "Novice | Beginner | Intermediate | Advanced | Expert." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "aligned_skills" ] ;
            hydra:required false ;
            rdfs:comment "Optional list of { targetCode, targetName, proficiencyLevel? }."
        ]
    ] ;
    rdfs:label "Issue a BBS+ credential" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/derive-bbs-presentation> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/derive-bbs-presentation> ;
    hydra:method "POST" ;
    hydra:title "Derive a selective-disclosure presentation from a BBS+ credential" ;
    rdfs:comment "Holder-side. Given a BBS+-issued credential + a list of which claim paths to reveal, produce a zero-knowledge BBS+ proof + the revealed claims for the verifier. The full credential never leaves the holder." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/derive_bbs_presentation> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/derive_bbs_presentation> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.derive_bbs_presentation-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "issued" ] ;
            hydra:required true ;
            rdfs:comment "The BBS+ credential returned by foxxi.issue_bbs_credential."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "reveal_paths" ] ;
            hydra:required true ;
            rdfs:comment "Array of claim paths to reveal (e.g. [\"achievement.name\", \"achievement.proficiencyLevel\"])."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "presentation_header" ] ;
            hydra:required false ;
            rdfs:comment "Optional UTF-8 string binding the proof to a verifier / occasion (challenge / nonce)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Derive a BBS+ presentation" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/verify-bbs-presentation> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/verify-bbs-presentation> ;
    hydra:method "POST" ;
    hydra:title "Verify a selective-disclosure BBS+ presentation" ;
    rdfs:comment "Verifier-side. Takes a presentation produced by foxxi.derive_bbs_presentation; returns whether the issuer signed a credential containing the disclosed claims at the disclosed positions. Verifier learns ONLY the revealed claims." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/verify_bbs_presentation> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/verify_bbs_presentation> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.verify_bbs_presentation-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "presentation" ] ;
            hydra:required true ;
            rdfs:comment "The presentation returned by foxxi.derive_bbs_presentation."
        ]
    ] ;
    rdfs:label "Verify a BBS+ presentation" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/prove-competency> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/prove-competency> ;
    hydra:method "POST" ;
    hydra:title "Prove a competency privately (BBS+ selective disclosure, end-to-end)" ;
    rdfs:comment "Holder-facing competency proof. Composes the three BBS+ steps — issue (the bridge as tenant issuer signs a multi-claim credential), derive (disclose only a minimal privacy-preserving subset), verify — into ONE operation a learner can trigger for their own record. Proves \"I hold this competency at this proficiency, issued by this tenant\" to a verifier while keeping score, name, dates, and credential id behind a zero-knowledge proof. This is the IEEE P2997 LER privacy story a flat wallet cannot give. Non-admins may only prove their own competencies." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/prove_competency> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/prove_competency> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.prove_competency-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Learner whose competency is being proved. Non-admin callers must pass their own DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "competency_name" ] ;
            hydra:required true ;
            rdfs:comment "The competency / course title to prove (becomes Achievement.name on the BBS+ credential)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_id" ] ;
            hydra:required false ;
            rdfs:comment "Optional course identifier; derived from competency_name if omitted." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_name" ] ;
            hydra:required false ;
            rdfs:comment "Optional learner display name (a hidden claim — never disclosed by default)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "reveal_paths" ] ;
            hydra:required false ;
            rdfs:comment "Optional claim paths to disclose; defaults to the minimal privacy-preserving set (issuer + achievement.name + achievement.proficiencyLevel)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "presentation_context" ] ;
            hydra:required false ;
            rdfs:comment "Optional verifier/occasion binding (BBS+ presentation header)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Prove a competency (BBS+)" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "profiles" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/launch-au-with-prereq> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/launch-au-with-prereq> ;
    hydra:method "POST" ;
    hydra:title "Check prerequisite credentials and build a cmi5 launch trace" ;
    rdfs:comment "Read the learner pod and check a prerequisite credential's signature, achievement, proficiency, validity and accepted issuer. If satisfied, return launched and initialized statement documents; otherwise return a prerequisite failure report. This operation does not create a launch URL or session, deliver an AU, or send the returned statements to an LRS. For a real hosted cmi5 launch use foxxi.cmi5_launch_signed." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/launch_au_with_prereq_check> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/launch_au_with_prereq_check> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.launch_au_with_prereq_check-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Learner identity." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_pod_url" ] ;
            hydra:required true ;
            rdfs:comment "Pod to walk for credentials." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_id" ] ;
            hydra:required true ;
            rdfs:comment "Course identifier." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "au_activity_id" ] ;
            hydra:required true ;
            rdfs:comment "Assignable Unit IRI." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "registration" ] ;
            hydra:required true ;
            rdfs:comment "cmi5 sessionId for this launch." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "prereq_achievement_iri" ] ;
            hydra:required true ;
            rdfs:comment "Achievement IRI the prereq credential must match." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "prereq_min_proficiency_rdf_value" ] ;
            hydra:required false ;
            rdfs:comment "Minimum rcd:rdfValue (1=Novice through 5=Expert)." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "prereq_accepted_issuer_dids" ] ;
            hydra:required false ;
            rdfs:comment "Whitelist of acceptable issuer DIDs."
        ]
    ] ;
    rdfs:label "Check prerequisites and build a launch trace" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/ai-assess-competency> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/ai-assess-competency> ;
    hydra:method "POST" ;
    hydra:title "Sign a supplied hypothetical competency assessment" ;
    rdfs:comment "Construct and sign a Hypothetical CompetencyAssertion VC from the supplied competency, evidence references, narrative and mentor seed. No AI model is called and no evidence content is reviewed or verified. The returned credential is not published and does not establish learner achievement or issuer authority." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/ai_assess_competency> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/ai_assess_competency> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.ai_assess_competency-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Learner subject." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "mentor_seed" ] ;
            hydra:required true ;
            rdfs:comment "Mentor's seed for deterministic did:key." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "competency" ] ;
            hydra:required true ;
            rdfs:comment "The competency claimed: { id, label, proficiencyLevel }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evidence" ] ;
            hydra:required true ;
            rdfs:comment "Array of { type, id, narrative? } evidence references."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "narrative" ] ;
            hydra:required true ;
            rdfs:comment "Mentor's assessment narrative." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Sign a supplied assessment" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/countersign-assessment> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/countersign-assessment> ;
    hydra:method "POST" ;
    hydra:title "[admin] Sign a supplied assessment as an Open Badge document" ;
    rdfs:comment "Construct and sign an OpenBadgeCredential document using the supplied assessment and human seed, preserving a reference to the original mentor signature. The route requires tenant admin authorization. It does not perform human review, independently verify the original evidence or publish a credential; its Asserted label is a requested document state, not an independent achievement finding." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/countersign_assessment> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/countersign_assessment> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.countersign_assessment-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "assessment" ] ;
            hydra:required true ;
            rdfs:comment "The CompetencyAssessment returned by foxxi.ai_assess_competency."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "human_seed" ] ;
            hydra:required true ;
            rdfs:comment "Human admin's seed for deterministic countersign key." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Sign an assessment document" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/audit-compliance-trail> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/audit-compliance-trail> ;
    hydra:method "POST" ;
    hydra:title "[admin] Compose a single-query audit chain for a learner window" ;
    rdfs:comment "Walk the learner's pod, pull every descriptor with a Provenance facet or dct:conformsTo tag in the time window, return them ordered as a chain. Each step carries its framework citations so the auditor sees which controls every hop references." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/audit_compliance_trail> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/audit_compliance_trail> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.audit_compliance_trail-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Learner identity." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_pod_url" ] ;
            hydra:required true ;
            rdfs:comment "Pod to walk." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "window_from" ] ;
            hydra:required false ;
            rdfs:comment "ISO 8601 lower bound." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "window_to" ] ;
            hydra:required false ;
            rdfs:comment "ISO 8601 upper bound." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Compose a compliance audit trail" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/declare-framework-alignment> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/declare-framework-alignment> ;
    hydra:method "POST" ;
    hydra:title "[admin] Build a CASE alignment document" ;
    rdfs:comment "Build a CFAssociation document from the supplied competency IRIs, relation and rationale. Requires the configured tenant admin. Returns the alignment for review; this operation does not publish it to a pod, make it discoverable or add it to a later framework export." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/declare_framework_alignment> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/declare_framework_alignment> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.declare_framework_alignment-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "own_item_iri" ] ;
            hydra:required true ;
            rdfs:comment "This tenant's competency IRI." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "own_item_label" ] ;
            hydra:required true ;
            rdfs:comment "Display label." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "other_item_iri" ] ;
            hydra:required true ;
            rdfs:comment "Foreign competency IRI." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "other_framework_iri" ] ;
            hydra:required true ;
            rdfs:comment "Foreign framework IRI." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "other_tenant_did" ] ;
            hydra:required false ;
            rdfs:comment "Foreign tenant DID (optional but useful for trust scoping)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "relation" ] ;
            hydra:required true ;
            rdfs:comment "isAlignedTo | isEquivalentTo | precedes | isPrerequisiteOf | broadens | narrows." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "rationale" ] ;
            hydra:required false ;
            rdfs:comment "Free-text rationale." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Build a CASE alignment" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/resolve-aligned-competency> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/resolve-aligned-competency> ;
    hydra:method "POST" ;
    hydra:title "Resolve whether a held competency satisfies a required competency via alignments" ;
    rdfs:comment "Compute reachability between two supplied competency IRIs over supplied isAlignedTo and isEquivalentTo edges; ordering, prerequisite, broader and narrower relations are ignored. Returns the connecting alignment chain or no match. Does not read or verify a held credential, its issuer, or the supplied alignment assertions." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/resolve_aligned_competency> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/resolve_aligned_competency> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.resolve_aligned_competency-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "held_competency_iri" ] ;
            hydra:required true ;
            rdfs:comment "Competency the credential attests." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "required_competency_iri" ] ;
            hydra:required true ;
            rdfs:comment "Competency the verifier requires." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "alignments" ] ;
            hydra:required true ;
            rdfs:comment "Array of serialized alignments (from foxxi.declare_framework_alignment)."
        ]
    ] ;
    rdfs:label "Resolve aligned competency" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/cohort-concept-intelligence> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/cohort-concept-intelligence> ;
    hydra:method "POST" ;
    hydra:title "[admin] Cross-pod cohort concept-overlap analytics" ;
    rdfs:comment "Walk a list of learner pods, pull every fxa:LearnerQuestionEvent in the time window, compute concept overlap across the cohort: which concepts >= 50% of learners asked about (reinforcement signal). Real PGSL composition with lighter set-intersection for this affordance; full PGSL meet at substrate level for atom-grain analysis." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/cohort_concept_intelligence> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/cohort_concept_intelligence> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.cohort_concept_intelligence-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_pod_urls" ] ;
            hydra:required true ;
            rdfs:comment "Array of learner pod root URLs."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "window_from" ] ;
            hydra:required false ;
            rdfs:comment "ISO 8601 lower bound." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "window_to" ] ;
            hydra:required false ;
            rdfs:comment "ISO 8601 upper bound." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Cohort concept-overlap analytics" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/register-self-sovereign-learner> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/register-self-sovereign-learner> ;
    hydra:method "POST" ;
    hydra:title "Register a learner identity (human or AI agent) with their own DID + pod" ;
    rdfs:comment "Self-enroll into a self-sovereign tenant. Send a rev-196 proof-of-possession envelope ({_signature,_signed_payload}) signed by your wallet; the bridge recovers your address and appends it to a PUBLIC tenant-membership allowlist on your own pod. Any bridge then reads that public section via the substrate (no shared admin key) and authorizes you on foxxi.discover_assigned_courses / retrieve_course_context / etc. You can only enroll yourself (the address written is the recovered signer), only on your own pod: the one your wallet is named for (eth-<first 12 hex of your address>, or its u-eth- spelling), on this store, signed by that wallet for itself (agent_id = its did:ethr). A pod whose name says no wallet (a passkey or named pod), another wallet's pod, a path inside a pod and a request signed for another identity (a relay session or a delegate) are refused, each with its reason; a row another wallet enrolled on your pod before this rule is removed when you enroll. Admin-managed (encrypted-directory) tenants are refused." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/register_self_sovereign_learner> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/register_self_sovereign_learner> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.register_self_sovereign_learner-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "rev-196 signature over _signed_payload (EIP-191). Proof-of-possession — you can only enroll the address this recovers to." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON string carrying at least { agent_id, timestamp, tenant_pod_url }, with agent_id = did:ethr:<the address that signs>. May also carry learner_id / learner_pod_url / tenant_did." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required true ;
            rdfs:comment "Your own pod root, the one your wallet is named for: https://<store>/eth-<first 12 hex of your address>/ or its u-eth- spelling. Sign it inside _signed_payload; sent in the clear it is advisory only." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "Your pod / WebID base (defaults tenant_pod_url). Used to derive your web_id." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_id" ] ;
            hydra:required false ;
            rdfs:comment "Preferred user_id for your membership entry (defaults to u-eth-<addr-prefix>)." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Register a self-sovereign learner" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-ontology> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-ontology> ;
    hydra:method "POST" ;
    hydra:title "Publish + host an ontology on Interego (a vocabulary is just RDF)" ;
    rdfs:comment "Host an OWL/SHACL ontology the substrate way — not a raw file PUT, and not a developer-baked route. Send a rev-196 proof-of-possession envelope + the ontology Turtle; the bridge composes the substrate publish() primitive to write a PUBLIC, signed ContextDescriptor + named graph (dct:conformsTo owl:Ontology) on your OWN self-sovereign pod, and serves it as dereferenceable linked data at its own resolvable IRI (content-negotiated Turtle / JSON-LD / HTML). #terms resolve within the document (hash namespace). This is a HIGHER-ORDER COMPOSITION over the substrate: the ontology dereferences at the Interego relay's generic /ns RDF-projection surface (an ontology is just a holon used as RDF — the same surface dereferences any published graph, and the system's own vocabs once migrated onto it), so the IRI anchors on the substrate, not this vertical. This affordance adds only the PoP-convenient publish path + Foxxi-tenancy owner-gate: you can only publish to a self-sovereign pod you own (self-enroll first via foxxi.register_self_sovereign_learner); the configured (closed) tenant and admin-managed pods are refused." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/publish_ontology> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/publish_ontology> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.publish_ontology-output" ;
        rdfs:comment "The published ontology object — { ontologyIri (where it dereferences), resolvesAt, descriptorUrl, graphUrl, conformsTo=owl:Ontology }, plus a note with the exact hash-namespace prefix to author against. Returns { error } when not PoP-signed or when the caller does not own the target pod."
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.publish_ontology-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signature" ] ;
            hydra:required true ;
            rdfs:comment "rev-196 signature over _signed_payload (EIP-191). Proof-of-possession — you can only publish to a pod you own." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "_signed_payload" ] ;
            hydra:required true ;
            rdfs:comment "JSON string carrying at least { agent_id, timestamp, owner_pod_url, slug, ontology_turtle }." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "owner_pod_url" ] ;
            hydra:required true ;
            rdfs:comment "Your self-sovereign pod (host + serve the ontology here). Sign it inside _signed_payload; sent in the clear it is advisory only." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "slug" ] ;
            hydra:required true ;
            rdfs:comment "Short name for the ontology (e.g. \"hmd\"); becomes part of its resolvable IRI <base>/ns/pod/<your-userId>/<slug>." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ontology_turtle" ] ;
            hydra:required true ;
            rdfs:comment "The OWL/SHACL Turtle to publish. Bind your namespace prefix to a hash namespace under the returned ontologyIri so #terms resolve at the serving host." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Publish an ontology" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/bootstrap-tenant> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/bootstrap-tenant> ;
    hydra:method "POST" ;
    hydra:title "Bootstrap a fresh Foxxi tenant on a Solid pod" ;
    rdfs:comment "Publish tenant-metadata + emit env-var configuration so the bridge can switch over to a new tenant. Wizard backend." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/bootstrap_tenant> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/bootstrap_tenant> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.bootstrap_tenant-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_slug" ] ;
            hydra:required true ;
            rdfs:comment "URL-safe slug (e.g. partnerco-training)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_did" ] ;
            hydra:required true ;
            rdfs:comment "DID for the new tenant (typically did:web:<domain>)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_display_name" ] ;
            hydra:required true ;
            rdfs:comment "Human-readable tenant name." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "admin_web_id" ] ;
            hydra:required true ;
            rdfs:comment "First admin's WebID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "admin_name" ] ;
            hydra:required true ;
            rdfs:comment "First admin's display name." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "pod_url" ] ;
            hydra:required true ;
            rdfs:comment "Pod URL the tenant's artifacts will land on." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Bootstrap a Foxxi tenant" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-cloud-pull> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-cloud-pull> ;
    hydra:method "POST" ;
    hydra:title "[admin] Pull a SCORM Cloud catalog into the tenant" ;
    rdfs:comment "Use SCORM Cloud Application API v2 to list courses + project them as fxs:CourseCatalog stub entries on the tenant pod. Requires FOXXI_SCORM_CLOUD_APP_ID + FOXXI_SCORM_CLOUD_SECRET_KEY env on the bridge." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/scorm_cloud_pull> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/scorm_cloud_pull> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_cloud_pull-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "publish_to_pod" ] ;
            hydra:required false ;
            rdfs:comment "If true, also publish the projected catalog entries as a fxs:CourseCatalog descriptor on the tenant pod (default false: return-only)." ;
            sh:datatype xsd:boolean
        ]
    ] ;
    rdfs:label "Pull SCORM Cloud catalog" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-cloud-register> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/scorm-cloud-register> ;
    hydra:method "POST" ;
    hydra:title "[admin] Create a SCORM Cloud registration for a learner" ;
    rdfs:comment "POST to /registrations on SCORM Cloud; the returned registration ID becomes the cmi5 sessionId." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/scorm_cloud_register> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/scorm_cloud_register> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.scorm_cloud_register-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "registration_id" ] ;
            hydra:required true ;
            rdfs:comment "Caller-chosen UUID for this learner+course attempt." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_id" ] ;
            hydra:required true ;
            rdfs:comment "SCORM Cloud course ID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_id" ] ;
            hydra:required true ;
            rdfs:comment "Stable learner identifier (typically the WebID)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_first_name" ] ;
            hydra:required false ;
            rdfs:comment "Given name of the learner, forwarded to the SCORM Cloud registration record." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_last_name" ] ;
            hydra:required false ;
            rdfs:comment "Family name of the learner, forwarded to the SCORM Cloud registration record." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_email" ] ;
            hydra:required false ;
            rdfs:comment "Email address of the learner; SCORM Cloud keys the registration on it." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Create a SCORM Cloud registration" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/upload-scorm-package> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/upload-scorm-package> ;
    hydra:method "POST" ;
    hydra:title "Upload a SCORM zip package for ingestion" ;
    rdfs:comment "Upload a SCORM / cmi5 .zip. Parsed IN-PROCESS on arrival — no queue, no external runner: the manifest, course title, standard, SCO list, activity structure and authoring-tool fingerprint are read out of the zip synchronously and returned. Publishes a Hypothetical fxs:PackageUpload receipt, then — only if the parse succeeds — an Asserted fxs:ParsedPackage over the same graph that supersedes it (iep:supersedes). A zip that cannot be read returns status:failed and leaves the receipt Hypothetical: nothing is asserted about a package that could not be parsed. A parsed package is also hosted and playable: kept on the tenant pod by its sha-256 (packageSha256), served from this bridge with each document in a sandbox of its own, and registered as a cmi5 course of its SCOs (course.id); a learner plays it with the signed cmi5 launch (launch), and what it reports lands in their record as experience. An authoring tool's own export that is no SCORM package (an .h5p file, an Adapt course exported as source, or a Rise 360, Storyline, iSpring or Captivate course published for xAPI or the web) is read in its tool's model instead (exported: its tool, and the topics, pages and questions folding it reads), promoted the same way, and kept the same way by its sha-256, to be folded: it launches nothing as it is (playable:false), and the answer names the fold that takes it (fold: foxxi.content_fold_course with its package_sha256). hosted:false says why when it could not be kept." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/upload_scorm_package> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/upload_scorm_package> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.upload_scorm_package-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "zip_base64" ] ;
            hydra:required true ;
            rdfs:comment "base64-encoded SCORM zip, or an authoring tool's own export of a course (an .h5p file, an Adapt course exported as source, or a Rise 360, Storyline, iSpring or Captivate course published for xAPI or the web)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "hinted_title" ] ;
            hydra:required false ;
            rdfs:comment "Display name for the upload while parsing is pending." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Upload a SCORM zip package" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/derive-adaptive-policy> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/derive-adaptive-policy> ;
    hydra:method "POST" ;
    hydra:title "Build an advisory reinforcement policy" ;
    rdfs:comment "Build an AdaptiveSequencingPolicy document from supplied cohort intelligence. NOT ENFORCED: the operation returns reinforcement suggestions only; it does not store the policy or change launch, progression or learner access. Questions touching a concept are a heuristic signal, not independently verified evidence of difficulty." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/derive_adaptive_policy> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/derive_adaptive_policy> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.derive_adaptive_policy-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "cohort_intel" ] ;
            hydra:required true ;
            rdfs:comment "CohortIntelligence object from foxxi.cohort_concept_intelligence."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "threshold_pct" ] ;
            hydra:required false ;
            rdfs:comment "Concepts above this cohort-coverage % become reinforcement gates (default 50)." ;
            sh:datatype xsd:decimal
        ]
    ] ;
    rdfs:label "Build an advisory reinforcement policy" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/schedule-spaced-repetition> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/schedule-spaced-repetition> ;
    hydra:method "POST" ;
    hydra:title "Compute a spaced-repetition reminder plan" ;
    rdfs:comment "Compute reminder dates from supplied completion timestamps and prerequisite edges: 1, 7 and 30 days, plus an earlier foundation reminder when at least three concepts depend on one. Returns a date plan only. No reminder is scheduled, stored or delivered by this operation." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/schedule_spaced_repetition> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/schedule_spaced_repetition> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.schedule_spaced_repetition-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Learner DID (web_id pattern from the tenant identity service)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "completed_concepts" ] ;
            hydra:required true ;
            rdfs:comment "Array of { conceptId, completedAt }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "prereq_edges" ] ;
            hydra:required true ;
            rdfs:comment "Array of { from, to } prereq edges from the course graph."
        ]
    ] ;
    rdfs:label "Compute reminder dates" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-course-catalog-product> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/publish-course-catalog-product> ;
    hydra:method "POST" ;
    hydra:title "Publish the course catalog as a federated data product" ;
    rdfs:comment "The tenant's course catalog as a HyprCat FederatedCatalog on the tenant pod: a public, Asserted descriptor that conforms to hyprcat:FederatedCatalog, so any pod walk finds it by type, describing a graph in which each course is a FederatedDataProduct issued by the tenant in the service world, with its title, category, audience keywords, standard, landing page, and an output port that is a followable distribution (a GET of the course's own IRI). Republishing supersedes the previous catalog under the same IRI. federated_with names peer catalogs on other pods. The configured tenant's catalog is its admin's to publish; with tenant_pod_url naming a self-sovereign pod, that pod's owner publishes that pod's catalog, to that pod and issued by it, including the SCORM courses the owner authored on this bridge." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/publish_course_catalog_product> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/publish_course_catalog_product> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.publish_course_catalog_product-output" ;
        rdfs:comment "Where the catalog was published and what it lists." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "catalogIri" ] ;
            hydra:required false ;
            rdfs:comment "The catalog's IRI, fixed per tenant pod." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "descriptorUrl" ] ;
            hydra:required false ;
            rdfs:comment "The published descriptor." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "graphUrl" ] ;
            hydra:required false ;
            rdfs:comment "The published catalog graph (Turtle)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "conformsTo" ] ;
            hydra:required false ;
            rdfs:comment "hyprcat:FederatedCatalog." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "products" ] ;
            hydra:required false ;
            rdfs:comment "How many courses the catalog lists." ;
            sh:datatype xsd:integer
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "federatedWith" ] ;
            hydra:required false ;
            rdfs:comment "The peer catalogs named."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "publishedAt" ] ;
            hydra:required false ;
            rdfs:comment "When it was published (ISO 8601)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "accessDecision" ] ;
            hydra:required false ;
            rdfs:comment "ABAC trace: caller role + applied policies + the decision."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.publish_course_catalog_product-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "federated_with" ] ;
            hydra:required false ;
            rdfs:comment "IRIs of catalogs on other pods this one federates with." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "The tenant whose catalog is published; omitted, the configured tenant." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Publish the catalog as a data product" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "catalog" ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/discover-framework-registry> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/discover-framework-registry> ;
    hydra:method "POST" ;
    hydra:title "Federated discovery of competency frameworks across tenant pods" ;
    rdfs:comment "Walk N pod URLs, return every fxs:CourseCatalog / fxs:SkillFramework / fxa:CASEAlignment descriptor — the public-registry pattern without a central registry." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/discover_framework_registry> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/discover_framework_registry> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.discover_framework_registry-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "pod_urls" ] ;
            hydra:required true ;
            rdfs:comment "Array of pod root URLs to walk."
        ]
    ] ;
    rdfs:label "Discover competency frameworks" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/register-tutor-agent> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/register-tutor-agent> ;
    hydra:method "POST" ;
    hydra:title "Build an unpublished tutor profile" ;
    rdfs:comment "Build a TutorAgentProfile document from the supplied DID, specialties and contact endpoint. WRITES NOTHING. This pure document builder is unauthenticated: agent_did is NOT bound to any signer. Review the profile and separately publish it through an authorized signed pod operation if you want it to become discoverable. Ranking supplied profiles uses foxxi.find_tutor_for_competency." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/register_tutor_agent> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/register_tutor_agent> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.register_tutor_agent-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "agent_did" ] ;
            hydra:required true ;
            rdfs:comment "The tutor's DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "display_name" ] ;
            hydra:required true ;
            rdfs:comment "Human-readable name for the tutor agent, shown wherever it is offered as a tutor." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "specialties" ] ;
            hydra:required true ;
            rdfs:comment "Array of { frameworkIri, competencyIri, selfRatedLevel }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "description" ] ;
            hydra:required false ;
            rdfs:comment "What this tutor agent teaches and how, shown alongside its display name." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "powered_by" ] ;
            hydra:required false ;
            rdfs:comment "e.g. claude-opus-4-7" ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "contact_endpoint" ] ;
            hydra:required false ;
            rdfs:comment "MCP server URL where the tutor agent runs." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Build a tutor profile" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/find-tutor-for-competency> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/find-tutor-for-competency> ;
    hydra:method "POST" ;
    hydra:title "Rank supplied tutor profiles" ;
    rdfs:comment "Rank the candidate_profiles supplied in this request by exact competency match, requested proficiency and caller-supplied countersign_counts. Does not discover a marketplace or fetch profiles, countersigns or reputation. Counts and self-ratings are inputs, not independently verified endorsements." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/find_tutor_for_competency> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/find_tutor_for_competency> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.find_tutor_for_competency-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "required_competency_iri" ] ;
            hydra:required true ;
            rdfs:comment "Dereferenceable IRI of the competency a tutor must hold to be returned." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "required_level" ] ;
            hydra:required false ;
            rdfs:comment "Novice | Beginner | Intermediate | Advanced | Expert" ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "candidate_profiles" ] ;
            hydra:required true ;
            rdfs:comment "Array of TutorAgentProfile to rank."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "countersign_counts" ] ;
            hydra:required false ;
            rdfs:comment "Map { agentDid: number } of independent countersigns per tutor."
        ]
    ] ;
    rdfs:label "Rank supplied tutor profiles" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/generate-dpia> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/generate-dpia> ;
    hydra:method "POST" ;
    hydra:title "[admin] Generate a Data Protection Impact Assessment for a learner window" ;
    rdfs:comment "Wraps foxxi.audit_compliance_trail. Returns a structured DPIA with summary stats, framework controls cited, data-category breakdown, risk-rated findings + suggested mitigations (GDPR Art. 35 + EU AI Act § 13 shape)." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/generate_dpia> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/generate_dpia> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.generate_dpia-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Learner DID (web_id pattern from the tenant identity service)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_pod_url" ] ;
            hydra:required true ;
            rdfs:comment "Pod URL holding the learner records, scoped to the reporting window below." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "window_from" ] ;
            hydra:required false ;
            rdfs:comment "Start of the reporting window, ISO 8601 date-time, inclusive." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "window_to" ] ;
            hydra:required false ;
            rdfs:comment "End of the reporting window, ISO 8601 date-time, inclusive." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Generate a DPIA" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/manager-team-view> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/manager-team-view> ;
    hydra:method "POST" ;
    hydra:title "[manager] Build a competency map for the manager's direct reports" ;
    rdfs:comment "Walk each report's pod, aggregate credentials, return per-report breakdown + team skill coverage roll-up." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/manager_team_view> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/manager_team_view> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.manager_team_view-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "manager_web_id" ] ;
            hydra:required true ;
            rdfs:comment "WebID/DID of the manager whose direct reports are being viewed." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "report_pods" ] ;
            hydra:required true ;
            rdfs:comment "Array of { webId, name?, podUrl }."
        ]
    ] ;
    rdfs:label "Build a manager team view" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/build-did-web-document> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/build-did-web-document> ;
    hydra:method "POST" ;
    hydra:title "[admin] Build a publishable did:web document for a tenant" ;
    rdfs:comment "Returns the DID document JSON the operator uploads to https://<tenant-domain>/.well-known/did.json so verifiers can resolve tenant credentials." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/build_did_web_document> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/build_did_web_document> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.build_did_web_document-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_did" ] ;
            hydra:required true ;
            rdfs:comment "e.g. did:web:tenant.example" ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "issuer_public_key_multibase" ] ;
            hydra:required true ;
            rdfs:comment "Tenant's Ed25519 issuer public key in multibase form." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "bridge_endpoint" ] ;
            hydra:required true ;
            rdfs:comment "URL of the tenant's foxxi bridge." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Build a did:web document" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/backup-tenant-pod> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/backup-tenant-pod> ;
    hydra:method "POST" ;
    hydra:title "[admin] One-shot backup of every descriptor on the tenant pod" ;
    rdfs:comment "Pulls the manifest + every descriptor + every reachable graph into one JSON object. Encrypted graphs come back as ciphertext." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/backup_tenant_pod> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/backup_tenant_pod> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.backup_tenant_pod-input"
    ] ;
    rdfs:label "Backup tenant pod" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/le-design-ab-experiment> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/le-design-ab-experiment> ;
    hydra:method "POST" ;
    hydra:title "[learning-engineer] Pre-register an A/B experiment between two course variants" ;
    rdfs:comment "Power-analysis + analysis plan for an instructional A/B. Returns required sample size per arm, recommended statistical test for the primary metric, and (if perWeekEnrolment is supplied) an estimated duration. Pre-registration prevents p-hacking." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/le_design_ab_experiment> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/le_design_ab_experiment> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.le_design_ab_experiment-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "variant_a" ] ;
            hydra:required true ;
            rdfs:comment "{ courseId, courseTitle? }"
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "variant_b" ] ;
            hydra:required true ;
            rdfs:comment "{ courseId, courseTitle? }"
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "primary_metric" ] ;
            hydra:required true ;
            rdfs:comment "completion-rate | mastery-score | time-to-mastery | retention-30-day | downstream-prereq-pass-rate" ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "minimum_detectable_effect" ] ;
            hydra:required true ;
            rdfs:comment "e.g. 0.05 for a 5pp lift" ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "alpha" ] ;
            hydra:required false ;
            rdfs:comment "default 0.05" ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "power" ] ;
            hydra:required false ;
            rdfs:comment "default 0.8" ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "randomization" ] ;
            hydra:required false ;
            rdfs:comment "simple | stratified-by-audience-tag (default)" ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "per_week_enrolment" ] ;
            hydra:required false ;
            rdfs:comment "Enrolment rate for duration estimate." ;
            sh:datatype xsd:decimal
        ]
    ] ;
    rdfs:label "Design an A/B experiment" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/judge-content-claim> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/judge-content-claim> ;
    hydra:method "POST" ;
    hydra:title "[learning-engineer] Judge a content claim with a System One model: a typed answer with probabilities, Hypothetical until confirmed" ;
    rdfs:comment "One narrow question to TypeSafe System One about a unit of course content, answered as typed probabilities rather than prose. judgment_kind evidence-level scores how well claim_text is supported by context and evidence on a five-level scale (unsupported, asserted-only, supported-by-context, supported-by-cited-evidence, corroborated); work-regime chooses among the Foxxi work regimes (Evident, Knowable, Emergent, Turbulent) for the work the content describes. Policy is code: which question is asked, what the answer means, and which controls a person is offered (cite-evidence, choose-method-for-regime, confirm-or-refute). Published to the tenant pod as a Hypothetical foxxi:ContentJudgment when the bridge has one. Needs TYPESAFE_API_KEY on the bridge (503 otherwise). Built on the shared judgment kit jev-harness proved." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/judge_content_claim> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/judge_content_claim> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.judge_content_claim-output" ;
        rdfs:comment "The judgment (answer, probabilities, confidence, model), the controls it affords, a HyperMarkdown projection, and where it was published." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "judgment" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "controls" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "markdown" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "published" ] ;
            hydra:required false ;
            rdfs:comment "status published | skipped | failed, with the descriptor IRI and URL when published."
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.judge_content_claim-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "judgment_kind" ] ;
            hydra:required true ;
            rdfs:comment "evidence-level or work-regime." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "claim_text" ] ;
            hydra:required true ;
            rdfs:comment "The claim to judge, as it appears in or about the content (at least 8 characters)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "context" ] ;
            hydra:required false ;
            rdfs:comment "The passage the claim sits in (slide text, transcript, section); the first 6000 characters are used." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evidence" ] ;
            hydra:required false ;
            rdfs:comment "Array of { type, id, narrative? } evidence references, as foxxi.ai_assess_competency takes them; at most 20 are used."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_iri" ] ;
            hydra:required false ;
            rdfs:comment "The course the content belongs to." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "slide_id" ] ;
            hydra:required false ;
            rdfs:comment "The slide the claim is on." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "concept_ids" ] ;
            hydra:required false ;
            rdfs:comment "Concept ids the claim concerns."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "A self-sovereign pod to run the loop on instead of the configured tenant: yours, enrolled with foxxi.register_self_sovereign_learner, whose owner you are. Omitted, the configured tenant is meant and a learning-engineer or admin role is required." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Judge a content claim" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/confirm-content-judgment> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/confirm-content-judgment> ;
    hydra:method "POST" ;
    hydra:title "[learning-engineer] Say what is true about a judged claim: the outcome supersedes the judgment" ;
    rdfs:comment "A person confirms or refutes a ContentJudgment: confirmed_answer must be one of the answers the judgment weighed (an evidence level, or a work regime). Publishes an Asserted foxxi:ContentJudgmentOutcome to the tenant pod that supersedes the judgment descriptor and records whether the model had it and the Brier score of its probabilities; foxxi.content_judgment_calibration is computed over these. Learning-engineer or admin only." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/confirm_content_judgment> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/confirm_content_judgment> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.confirm_content_judgment-output" ;
        rdfs:comment "The outcome (answer, confirmed answer, hit, Brier) and where it was published, superseding the judgment." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "outcome" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "published" ] ;
            hydra:required true
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.confirm_content_judgment-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "judgment_iri" ] ;
            hydra:required true ;
            rdfs:comment "The judgment entity on the pod, as foxxi.judge_content_claim returned it in published.graphIri (urn:foxxi:judgment:<id>)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "confirmed_answer" ] ;
            hydra:required true ;
            rdfs:comment "The answer held to be true, one of the judgment's alternatives." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "note" ] ;
            hydra:required false ;
            rdfs:comment "Why, in a sentence." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "confirmed_by_kind" ] ;
            hydra:required false ;
            rdfs:comment "human (the default) or agent: who is confirming. An agent's reading is a second model's opinion and is recorded as such; the calibration and the attestation count the two apart." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "A self-sovereign pod to run the loop on instead of the configured tenant: yours, enrolled with foxxi.register_self_sovereign_learner, whose owner you are. Omitted, the configured tenant is meant and a learning-engineer or admin role is required." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Confirm a content judgment" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-judgment-calibration> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-judgment-calibration> ;
    hydra:method "GET" ;
    hydra:title "[learning-engineer] How the content judgments have done, per question kind" ;
    rdfs:comment "Reads every foxxi:ContentJudgmentOutcome on the tenant pod and reports, per question kind (evidence-level, work-regime), how often the model had the confirmed answer and the mean Brier score of its probabilities; a cell is Hypothetical until it holds five outcomes and Asserted after, as the jev-harness calibration is. The same measurement the harness makes of its own judgments, for content." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/content_judgment_calibration> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/content_judgment_calibration> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.content_judgment_calibration-output" ;
        rdfs:comment "Cells per question kind with samples, hit rate, mean Brier and status; how many outcome entries were read and decoded." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "cells" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "samples" ] ;
            hydra:required true ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "minSamples" ] ;
            hydra:required false ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "read" ] ;
            hydra:required false ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "decoded" ] ;
            hydra:required false ;
            sh:datatype xsd:decimal
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.content_judgment_calibration-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "A self-sovereign pod to run the loop on instead of the configured tenant: yours, enrolled with foxxi.register_self_sovereign_learner, whose owner you are. Omitted, the configured tenant is meant and a learning-engineer or admin role is required." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Content judgment calibration" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/attest-content-judgments> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/attest-content-judgments> ;
    hydra:method "POST" ;
    hydra:title "[learning-engineer] Turn the content-judgment calibration into an attestation" ;
    rdfs:comment "Reads every foxxi:ContentJudgmentOutcome on the tenant pod, computes the calibration, and publishes a Self amta-shaped attestation by the judging agent about itself, grounded in the judgments container: accuracy from the evidence-level hit rate, competence from the work-regime hit rate, honesty from the Brier, Asserted cells only. The new attestation supersedes the earlier ones. Refused with 409 when no question kind has reached its sample floor: only earned ratings are weighed." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/attest_content_judgments> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/attest_content_judgments> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.attest_content_judgments-output" ;
        rdfs:comment "The attestation published, where it landed and what it superseded, and the calibration it came from." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "attestation" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "published" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "calibration" ] ;
            hydra:required false
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.attest_content_judgments-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "A self-sovereign pod to run the loop on instead of the configured tenant: yours, enrolled with foxxi.register_self_sovereign_learner, whose owner you are. Omitted, the configured tenant is meant and a learning-engineer or admin role is required." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Attest content judgments" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-judgment-reputation> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/content-judgment-reputation> ;
    hydra:method "GET" ;
    hydra:title "[learning-engineer] What the pod attests about the content-judging agent" ;
    rdfs:comment "Every foxxi:ContentJudgmentAttestation on the tenant pod about the judging agent (its own, grounded in the calibration, and any a learning engineer publishes as a Peer), aggregated by the registry under the content policy: a self-attestation at a quarter, a peer at a half, half-life thirty days. The snapshot is how much the judgments have earned, not how confident the model sounds." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/content_judgment_reputation> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/content_judgment_reputation> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.content_judgment_reputation-output" ;
        rdfs:comment "The subject, the policy, the attestations read, and the snapshot (null when nothing attests yet)." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "subject" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "policy" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "attestations" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "snapshot" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "read" ] ;
            hydra:required false ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "decoded" ] ;
            hydra:required false ;
            sh:datatype xsd:decimal
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.content_judgment_reputation-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "A self-sovereign pod to run the loop on instead of the configured tenant: yours, enrolled with foxxi.register_self_sovereign_learner, whose owner you are. Omitted, the configured tenant is meant and a learning-engineer or admin role is required." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Content judgment reputation" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/confirm-next> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/confirm-next> ;
    hydra:method "GET" ;
    hydra:title "[learning-engineer] Which content judgment to confirm next" ;
    rdfs:comment "The pending Hypothetical foxxi:ContentJudgment entities on the tenant pod, ranked by what a person's confirmation would teach: the model's own uncertainty (1 − confidence), how far the question kind's calibration cell is from earning anything, and how little evidence the claim carried. No new model call: the factors are the judgments' own and the calibration's, the weights are stated in the answer, and each entry carries the confirm call to make with the model's answer filled in, to keep or change. Ties break oldest first." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/confirm_next> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/confirm_next> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.confirm_next-output" ;
        rdfs:comment "The queue (highest priority first, twelve at most) with each entry's factors and confirm call; how many judgments are pending and confirmed; the weights." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "queue" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "pending" ] ;
            hydra:required true ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "confirmed" ] ;
            hydra:required false ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "weights" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "read" ] ;
            hydra:required false
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.confirm_next-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "A self-sovereign pod to run the loop on instead of the configured tenant: yours, enrolled with foxxi.register_self_sovereign_learner, whose owner you are. Omitted, the configured tenant is meant and a learning-engineer or admin role is required." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Confirm next" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-content-judgment> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/record-content-judgment> ;
    hydra:method "POST" ;
    hydra:title "[learning-engineer] Record a content judgment you made yourself, as a judge in your own right" ;
    rdfs:comment "The same foxxi:ContentJudgment entity foxxi.judge_content_claim publishes for the bridge's model, with the answer, the distribution and the model you declare, and you as its judge. The answer must be one of the kind's alternatives; the distribution is normalised and, when absent, concentrated on the answer at your confidence (0.8 by default). Confirm it, cross-confirm it against other judges' judgments of the same claim, and it earns you a reputation on that kind of question beside theirs." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/record_content_judgment> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/record_content_judgment> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.record_content_judgment-output" ;
        rdfs:comment "The judgment as published, Hypothetical, with you as judge, and where it landed." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "judgment" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "controls" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "published" ] ;
            hydra:required true
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.record_content_judgment-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "judgment_kind" ] ;
            hydra:required true ;
            rdfs:comment "evidence-level or work-regime." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "claim_text" ] ;
            hydra:required true ;
            rdfs:comment "The claim judged, as it appears in or about the content (at least 8 characters)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "answer" ] ;
            hydra:required true ;
            rdfs:comment "Your answer: an evidence level or a work regime." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "model" ] ;
            hydra:required true ;
            rdfs:comment "The model you used, as you name it: a System One model, a reasoning model, or your own name." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "probabilities" ] ;
            hydra:required false ;
            rdfs:comment "Your distribution over the alternatives; normalised."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "confidence" ] ;
            hydra:required false ;
            rdfs:comment "Your confidence in the answer (0..1); 0.8 when absent." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "context" ] ;
            hydra:required false ;
            rdfs:comment "The passage the claim sits in." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evidence" ] ;
            hydra:required false ;
            rdfs:comment "Array of { type, id, narrative? } evidence references."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_iri" ] ;
            hydra:required false ;
            rdfs:comment "The course the content belongs to." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "slide_id" ] ;
            hydra:required false ;
            rdfs:comment "The slide the claim is on." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "concept_ids" ] ;
            hydra:required false ;
            rdfs:comment "Concept ids the claim concerns."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "A self-sovereign pod to run the loop on instead of the configured tenant: yours, enrolled with foxxi.register_self_sovereign_learner, whose owner you are. Omitted, the configured tenant is meant and a learning-engineer or admin role is required." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Record a content judgment" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/cross-confirm> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/cross-confirm> ;
    hydra:method "POST" ;
    hydra:title "[learning-engineer] Judges confirm each other: every two judges' newest judgments of one claim score each other, once" ;
    rdfs:comment "For every claim two or more judges have judged, each judge's newest judgment gets an outcome from each other judge's answer — an agent confirmation naming the peer judgment it came from — so every judge's calibration counts agreement with its peers, apart from a person's word. Idempotent: a pair already scored is skipped. A person's confirmation is still what retires a judgment from foxxi.confirm_next." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/cross_confirm> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/cross_confirm> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.cross_confirm-output" ;
        rdfs:comment "The outcomes recorded (judgment, judge, peer judge, hit, Brier), how many judgments were read and how many pairs were due." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "recorded" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "judgments" ] ;
            hydra:required false ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "pairs" ] ;
            hydra:required false ;
            sh:datatype xsd:decimal
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.cross_confirm-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "A self-sovereign pod to run the loop on instead of the configured tenant: yours, enrolled with foxxi.register_self_sovereign_learner, whose owner you are. Omitted, the configured tenant is meant and a learning-engineer or admin role is required." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Cross-confirm judgments" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/best-judge> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/best-judge> ;
    hydra:method "GET" ;
    hydra:title "[learning-engineer] Who has earned the most on this kind of question" ;
    rdfs:comment "Every judge the pod holds attestations about, ranked by the registry's rating on the axis that kind of question is scored on — accuracy for evidence-level, competence for work-regime — with how many attestations contributed. Unrated judges last. The judge to believe, measured rather than configured." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/best_judge> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/best_judge> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.best_judge-output" ;
        rdfs:comment "The kind, its axis, the best rated judge (or null), every judge ranked with rating and contributing attestations, and the policy." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "judgmentKind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "axis" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "best" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "ranked" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "policy" ] ;
            hydra:required false
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.best_judge-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "judgment_kind" ] ;
            hydra:required false ;
            rdfs:comment "evidence-level (the default) or work-regime." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "A self-sovereign pod to run the loop on instead of the configured tenant: yours, enrolled with foxxi.register_self_sovereign_learner, whose owner you are. Omitted, the configured tenant is meant and a learning-engineer or admin role is required." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Best judge" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/set-autonomy-policy> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/set-autonomy-policy> ;
    hydra:method "POST" ;
    hydra:title "[learning-engineer] Amend the autonomy policy: when a judge may assert on a kind of question without a person" ;
    rdfs:comment "Per kind of question, the registry rating on its axis a judge must reach (accuracy for evidence-level, competence for work-regime), over how many outcomes the latest attestation about it must rest, and how many of those a person must have confirmed. Amended through the constitutional machinery: proposed, voted by the caller, ratified under the tier's rules — tier 4 (a self-sovereign pod, its owner's) ratifies at once; the configured tenant amends at tier 3 and waits for a quorum. Each policy supersedes the last. The judge and record affordances read it to publish Asserted or Hypothetical." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/set_autonomy_policy> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/set_autonomy_policy> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.set_autonomy_policy-output" ;
        rdfs:comment "The policy as published, whether it is in force, the amendment and its status, and where it landed." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "policy" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "inForce" ] ;
            hydra:required true ;
            sh:datatype xsd:boolean
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "amendment" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "published" ] ;
            hydra:required false
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.set_autonomy_policy-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "rules" ] ;
            hydra:required true ;
            rdfs:comment "Array of { kind, axis, floor, minSamples, minHumanConfirmers }, one per kind of question the policy speaks to."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tier" ] ;
            hydra:required false ;
            rdfs:comment "The constitutional tier (1..4); 4 for a self-sovereign pod, 3 for the configured tenant by default." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "description" ] ;
            hydra:required false ;
            rdfs:comment "Why, in a sentence." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "A self-sovereign pod to run the loop on instead of the configured tenant: yours, enrolled with foxxi.register_self_sovereign_learner, whose owner you are. Omitted, the configured tenant is meant and a learning-engineer or admin role is required." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Amend the autonomy policy" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/autonomy-status> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/autonomy-status> ;
    hydra:method "GET" ;
    hydra:title "[learning-engineer] Who may assert what without a person, and why" ;
    rdfs:comment "The autonomy policy in force and, for every judge the pod attests about and every kind of question, whether that judge may assert without a person: its registry rating on the kind's axis, the outcomes the latest attestation rests on, how many a person confirmed, and which part of the rule it clears or misses." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/autonomy_status> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/autonomy_status> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.autonomy_status-output" ;
        rdfs:comment "The policy, its entity IRI when the pod published one, and the table of judge × kind decisions with standings and rules." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "policy" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "policyIri" ] ;
            hydra:required false ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "table" ] ;
            hydra:required true
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.autonomy_status-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "A self-sovereign pod to run the loop on instead of the configured tenant: yours, enrolled with foxxi.register_self_sovereign_learner, whose owner you are. Omitted, the configured tenant is meant and a learning-engineer or admin role is required." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Autonomy status" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/weakest-claims> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/weakest-claims> ;
    hydra:method "GET" ;
    hydra:title "[learning-engineer] The weakest claims on the pod: where the content needs revising first" ;
    rdfs:comment "Every evidence-level claim judged on the pod, graded and ranked weakest first: a person's confirmation if one exists, else an agent's, else the judges' answers — the newest per judge, the lowest of them when they disagree. Each carries the judgments and confirmations behind its grade and a revise control that calls foxxi.revise_claim. A course that grades itself." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/weakest_claims> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/weakest_claims> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.weakest_claims-output" ;
        rdfs:comment "The claims, weakest first, each with its grade, where the grade came from, the judgments and confirmations behind it, and the revise call." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "claims" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "judged" ] ;
            hydra:required false ;
            sh:datatype xsd:decimal
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.weakest_claims-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "limit" ] ;
            hydra:required false ;
            rdfs:comment "How many claims, weakest first; twelve when absent." ;
            sh:datatype xsd:decimal
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "A self-sovereign pod to run the loop on instead of the configured tenant: yours, enrolled with foxxi.register_self_sovereign_learner, whose owner you are. Omitted, the configured tenant is meant and a learning-engineer or admin role is required." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Weakest claims" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/revise-claim> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/revise-claim> ;
    hydra:method "POST" ;
    hydra:title "[learning-engineer] Revise a claim: new words, evidence from outside the passage, judged again at once" ;
    rdfs:comment "Records a foxxi:ContentRevision — the claim as it stood and the grade it had, the words now and the evidence cited, who revised it (a person, or an agent recorded as such) — and has the bridge's judge grade the revised claim immediately under the autonomy policy, so the record says the grade before and after. A revision must change the words or add evidence. The original judgment stands; the revision names it." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/revise_claim> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/revise_claim> ;
    
    
    hydra:returns [
        a hydra:Class ;
        rdfs:label "foxxi.revise_claim-output" ;
        rdfs:comment "The revision with its grade before and after, the new judgment, the autonomy decision it was published under, and where both landed." ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "kind" ] ;
            hydra:required true ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "revision" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "judgment" ] ;
            hydra:required true
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "autonomy" ] ;
            hydra:required false
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "published" ] ;
            hydra:required true
        ]
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.revise_claim-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "claim_text" ] ;
            hydra:required true ;
            rdfs:comment "The claim as it stood, exactly as it was judged." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "revised_text" ] ;
            hydra:required true ;
            rdfs:comment "The claim as it should read now." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "evidence" ] ;
            hydra:required false ;
            rdfs:comment "Array of { type, id, narrative? } evidence references from outside the passage: a rule, a source, a record, another slide."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "context" ] ;
            hydra:required false ;
            rdfs:comment "The passage as revised, if it changed." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "slide_id" ] ;
            hydra:required false ;
            rdfs:comment "The slide the claim is on." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_iri" ] ;
            hydra:required false ;
            rdfs:comment "The course the content belongs to." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "revised_by_kind" ] ;
            hydra:required false ;
            rdfs:comment "human (the default) or agent: who wrote the revision." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "note" ] ;
            hydra:required false ;
            rdfs:comment "Why, in a sentence." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "tenant_pod_url" ] ;
            hydra:required false ;
            rdfs:comment "A self-sovereign pod to run the loop on instead of the configured tenant: yours, enrolled with foxxi.register_self_sovereign_learner, whose owner you are. Omitted, the configured tenant is meant and a learning-engineer or admin role is required." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Revise a claim" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint false ;
    iep:openWorldHint true ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/le-estimate-concept-difficulty> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/le-estimate-concept-difficulty> ;
    hydra:method "POST" ;
    hydra:title "[learning-engineer] Rank a course's concepts by estimated difficulty" ;
    rdfs:comment "Composes prereq-graph topology + cohort question-frequency to produce a per-concept difficulty score (0..1). Foundational concepts (≥3 dependents) flagged. The right-shape proxy for IRT until per-learner response data is available." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/le_estimate_concept_difficulty> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/le_estimate_concept_difficulty> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.le_estimate_concept_difficulty-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_id" ] ;
            hydra:required true ;
            rdfs:comment "Course whose concept graph to analyze (e.g. golf-explained)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "cohort_intel" ] ;
            hydra:required false ;
            rdfs:comment "Output of foxxi.cohort_concept_intelligence (optional but improves accuracy)."
        ]
    ] ;
    rdfs:label "Estimate concept difficulty" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/le-analyze-learning-curve> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/le-analyze-learning-curve> ;
    hydra:method "POST" ;
    hydra:title "[learning-engineer] Detect plateaus in a per-concept learning curve" ;
    rdfs:comment "Plots mastery-rate-per-attempt + detects plateaus (3 consecutive attempts with <1pp improvement). Returns diagnosis (rising / plateau-low / plateau-high / insufficient-data) + an actionable recommendation." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/le_analyze_learning_curve> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/le_analyze_learning_curve> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.le_analyze_learning_curve-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "concept_id" ] ;
            hydra:required true ;
            rdfs:comment "Stable identifier of the concept whose learning curve is analysed." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "concept_label" ] ;
            hydra:required false ;
            rdfs:comment "Human-readable label for that concept, echoed in the returned analysis." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "attempts" ] ;
            hydra:required true ;
            rdfs:comment "Per-learner outcomes: array of { learnerId, attemptNumber, mastered }."
        ]
    ] ;
    rdfs:label "Analyze a learning curve" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/le-calibrate-mastery-threshold> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/le-calibrate-mastery-threshold> ;
    hydra:method "POST" ;
    hydra:title "[learning-engineer] Calibrate the cmi5 mastery threshold against downstream success" ;
    rdfs:comment "Find the score threshold that maximizes Youden's J (sensitivity + specificity − 1) against downstream prereq-dependent performance. Returns ROC curve + recommended threshold." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/le_calibrate_mastery_threshold> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/le_calibrate_mastery_threshold> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.le_calibrate_mastery_threshold-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "records" ] ;
            hydra:required true ;
            rdfs:comment "Per-learner outcomes: array of { scoreScaled, downstreamSuccess }."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "threshold_grid" ] ;
            hydra:required false ;
            rdfs:comment "Optional thresholds to evaluate (default 0..1 step 0.05)."
        ]
    ] ;
    rdfs:label "Calibrate mastery threshold" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:encrypted false .

<https://relay.interego.xwisee.com/ns/iep/action/foxxi/le-framework-gap-analysis> a iep:Affordance, ieh:Affordance, hydra:Operation, dcat:Distribution ;
    iep:action <https://relay.interego.xwisee.com/ns/iep/action/foxxi/le-framework-gap-analysis> ;
    hydra:method "POST" ;
    hydra:title "[learning-engineer] Cross-reference framework competencies against taught concepts" ;
    rdfs:comment "Finds (a) competencies in the framework with no taught concept (assessments can't be grounded) and (b) taught concepts not aligned to any competency (credentials can't reference the framework). Returns coverage % + per-direction gap lists." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/le_framework_gap_analysis> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/le_framework_gap_analysis> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.le_framework_gap_analysis-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "framework_skills" ] ;
            hydra:required true ;
            rdfs:comment "Array of { id, label? } competency definitions."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_concepts" ] ;
            hydra:required true ;
            rdfs:comment "Array of CourseConcept from a published course."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "alignments" ] ;
            hydra:required true ;
            rdfs:comment "Array of { skillId, conceptId } edges."
        ]
    ] ;
    rdfs:label "Framework gap analysis" ;
    iep:readOnlyHint true ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint false ;
    iep:encrypted false .
