@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/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/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/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/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/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/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/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/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/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 "Consume a lesson + emit consumption descriptor" ;
    rdfs:comment "Stream-load a Foxxi-parsed lesson's structural stratum (slides, audio, transcripts) for consumption, and emit an fxa:ConsumptionEvent descriptor + an xAPI Statement (via the lrs-adapter) for each slide the learner advances past. Composes with the iep:TemporalFacet so consumption is timeboxed; composes with iep:TrustFacet so partial completion is recorded as Hypothetical, full as Asserted." ;
    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 "Lesson-consumption outcome — { consumed, descriptors emitted for each slide advanced, xAPI statementIds (when lrs_endpoint was supplied), modalStatus = Hypothetical when partial / Asserted on full completion }. Current bridge build returns a stub note flag until the streaming consumption handler is wired."
    ] ;

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.consume_lesson-input" ;
        hydra:supportedProperty
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "course_iri" ] ;
            hydra:required true ;
            rdfs:comment "IRI of the course (federation_iri_base/course_id)." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "learner_did" ] ;
            hydra:required true ;
            rdfs:comment "Consuming learner DID." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "lrs_endpoint" ] ;
            hydra:required false ;
            rdfs:comment "Optional xAPI LRS endpoint to forward Statements to (composes with the lrs-adapter projector). If omitted, Statements are emitted as descriptors only." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "lrs_auth_header" ] ;
            hydra:required false ;
            rdfs:comment "Authorization header for the LRS when provided." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Consume a lesson" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "courses" ;
    iep:appliesToCollection "profiles" ;
    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). 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. 400 on missing task_name/success; 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 "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? }). recipients?: pod URLs/DIDs to ALSO wrap the encrypted holon to (cross-seat owner-decrypt)." ;
            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/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/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,answer}] }] }, 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 "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 (content + assessment questions, 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. 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." ;
        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 } (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 xAPI statements recorded to the ELR (when done:true)." ;
            sh:datatype xsd:integer
        ]
    ] ;

    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." ;
            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/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 "[admin] Register an external LMS connector" ;
    rdfs:comment "Register an external LMS (Cornerstone OnDemand, Workday Learning, SAP SuccessFactors, etc.) as a content source. Composes with src/connectors/ — uses the existing OAuth 2.0 / Basic-auth / SCORM-Cloud-API flows where supported. The connector's sync schedule is recorded as a foxxi:LmsConnection descriptor on the tenant pod with the connector's auth_warning surfaced if the credentials need rotation." ;
    hydra:target <https://foxxi-bridge.interego.xwisee.com/foxxi/connect_lms> ;
    dcat:accessURL <https://foxxi-bridge.interego.xwisee.com/foxxi/connect_lms> ;
    
    

    hydra:expects [
        a hydra:Class ;
        rdfs:label "foxxi.connect_lms-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 "connector_id" ] ;
            hydra:required true ;
            rdfs:comment "Stable connector ID (e.g., \"cornerstone-prod\")." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "product" ] ;
            hydra:required true ;
            rdfs:comment "LMS product name (e.g., \"Cornerstone OnDemand\")." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "instance" ] ;
            hydra:required true ;
            rdfs:comment "LMS instance URL or domain (e.g., \"acme-training.csod.com\")." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "auth_method" ] ;
            hydra:required true ;
            rdfs:comment "Auth method (e.g., \"OAuth 2.0 (corporate)\", \"Basic+API key\")." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "sync_frequency" ] ;
            hydra:required false ;
            rdfs:comment "Human-readable sync frequency (default: \"every 6 hours\")." ;
            sh:datatype xsd:string
        ]
    ] ;
    rdfs:label "Register an external LMS connector" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    iep:appliesToCollection "integrations" ;
    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 "[admin] Query concept coverage across the catalog" ;
    rdfs:comment "Privacy-respecting coverage query: across the catalog, which concepts are taught vs only mentioned, by which courses, in which categories. Defaults to v2 merkle-attested-opt-in (count of courses per concept); v3 zk-distribution mode returns a histogram of coverage shape (concepts taught in 1 course / 2-5 / 6-10 / 10+) with per-bucket DP noise. Composes with the existing applications/_shared/aggregate-privacy/ ladder." ;
    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 "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 "category_filter" ] ;
            hydra:required false ;
            rdfs:comment "Optional category filter (e.g., \"Power Systems / Technical\")." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "concept_filter" ] ;
            hydra:required false ;
            rdfs:comment "Optional concept label substring filter." ;
            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 "Query 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 "[admin] Publish a course's extracted concept map as a federated artifact" ;
    rdfs:comment "Publish the fxk: knowledge-stratum graph for a course as a federated pod artifact (using the federation_iri_base pattern from federation_payload.json). Lets peer tenants discover + cite concept nodes by IRI without re-ingesting the course content." ;
    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:expects [
        a hydra:Class ;
        rdfs:label "foxxi.publish_concept_map-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 "Course IRI." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "federation_share_with" ] ;
            hydra:required false ;
            rdfs:comment "Optional list of peer-tenant DIDs the concept map is explicitly shared with (default: pod ACL)."
        ]
    ] ;
    rdfs:label "Publish a concept map" ;
    iep:readOnlyHint false ;
    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-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 "[admin] Publish L&D compliance evidence (SOC 2 / EU AI Act / NIST RMF)" ;
    rdfs:comment "Emit an ops event (assignment/completion/exception/audit) wrapped via compliance-overlay so the L&D activity becomes a framework-cited descriptor. Composes integrations/compliance-overlay/ + src/ops/ — same path the substrate uses for its own SOC 2 evidence." ;
    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:expects [
        a hydra:Class ;
        rdfs:label "foxxi.publish_compliance_evidence-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 "event_type" ] ;
            hydra:required true ;
            rdfs:comment "One of: assignment-created | completion | exception | audit-action." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "event_payload" ] ;
            hydra:required true ;
            rdfs:comment "Event payload (shape varies by event_type — assignment payload includes user_id + course_iri + due_at; completion payload includes user_id + course_iri + completed_at; etc.)."
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "framework" ] ;
            hydra:required false ;
            rdfs:comment "Compliance framework to cite (default: \"soc2\"; alternatives: \"eu-ai-act\", \"nist-rmf\")." ;
            sh:datatype xsd:string
        ] ,
        [
            a hydra:SupportedProperty ;
            hydra:property [ a rdf:Property ; rdfs:label "controls" ] ;
            hydra:required false ;
            rdfs:comment "Optional explicit control IRIs (default: framework's default L&D controls)."
        ]
    ] ;
    rdfs:label "Publish compliance evidence" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    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, id?, parent_id?, supersedes_id?, was_derived_from?[], result?{success,quality,note} }."
        ]
    ] ;
    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 "Emit a cmi5-conformant xAPI session trace (launched → terminated)" ;
    rdfs:comment "Build the full cmi5 statement trace (launched + initialized + completed + passed/failed + terminated, plus optional satisfied if moveOn rule fires) for a learner's AU session. Each statement carries the cmi5 context category, session ID, and registration UUID per IEEE 9274.2.1. Caller can either fan-out to a connected LRS via the lrs-adapter or persist directly to the pod as fxa:LearningExperience descriptors." ;
    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 "Emit a cmi5 xAPI session trace" ;
    iep:readOnlyHint false ;
    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 "Launch a cmi5 AU gated on a verified-credential prerequisite" ;
    rdfs:comment "Compose: walk the learner's pod for a credential satisfying the declared prereq (verify Data Integrity Proof, check achievement IRI + proficiency level + expiry + accepted issuers); if satisfied, emit the cmi5 launched + initialized statements; else return a structured prereq-failure report." ;
    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 "Launch cmi5 AU with prereq check" ;
    iep:readOnlyHint false ;
    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 "AI mentor signs a (Hypothetical) CompetencyAssertion VC" ;
    rdfs:comment "AI agent reviews evidence (cited slide IDs, Q&A traces, performance results) and signs a CompetencyAssertion VC with its own did:key. Modal status: Hypothetical until a human countersigns via foxxi.countersign_assessment." ;
    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 "AI mentor assesses competency" ;
    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] Countersign an AI mentor's CompetencyAssertion → full OB3" ;
    rdfs:comment "Human admin reviews + countersigns the AI mentor's Hypothetical CompetencyAssertion. Result: a dual-issuer credential whose modal status is Asserted (= OB3-eligible). Both signatures are preserved on the descriptor for auditability." ;
    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 "Countersign an AI 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/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] Declare an alignment between this tenant's competency and another tenant's" ;
    rdfs:comment "Publishes a fxa:CASEAlignment descriptor binding one of this tenant's fxk:Skill / rcd:CompetencyDefinition items to an item in a foreign tenant's framework. The alignment becomes a substrate-discoverable artifact + lifts into the next CASE 1.0 export as a CFAssociation." ;
    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 "Declare framework alignment" ;
    iep:readOnlyHint false ;
    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 "Given the held credential's competency IRI + a required competency IRI + the alignment graph, BFS over isAlignedTo / isEquivalentTo edges. Returns the alignment chain (could be 0 hops for direct match, N hops for transitive) so the verifier sees how the held credential satisfied the requirement." ;
    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), and 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 }. 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 "The pod that hosts your self-sovereign tenant membership (usually your own pod). 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." ;
    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." ;
            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 "[admin] Derive an adaptive-sequencing policy from cohort intelligence" ;
    rdfs:comment "Takes the output of foxxi.cohort_concept_intelligence and derives a fxa:AdaptiveSequencingPolicy document naming the concepts a cohort is struggling with and the reinforcement each suggests. NOT ENFORCED: nothing currently consumes it — foxxi.launch_au_with_prereq_check returns the same decision with and without a policy supplied, verified by direct comparison. Treat the output as analysis to act on, not as a gate that acts on your behalf." ;
    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 "Derive an adaptive-sequencing policy" ;
    iep:readOnlyHint false ;
    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 "Schedule spaced-repetition reminders for a learner" ;
    rdfs:comment "Ebbinghaus 1/7/30-day intervals, with early-week reminders for concepts other concepts depend on (foundation signal)." ;
    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 "Schedule spaced-repetition reminders" ;
    iep:readOnlyHint false ;
    iep:destructiveHint false ;
    iep:idempotentHint true ;
    iep:openWorldHint true ;
    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 "Register an AI tutor agent in the marketplace" ;
    rdfs:comment "Builds a fxa:TutorAgentProfile descriptor from your specialties + contact endpoint. WRITES NOTHING: this route is unauthenticated pure-compute and echoes your arguments back shaped as a descriptor — verified live, your pod is untouched. agent_did is NOT bound to any signer, so the descriptor asserts whatever DID you pass; what binds it to you is PUBLISHING it to your own pod with publish_context, which is signed. Once published it is discoverable, and foxxi.find_tutor_for_competency will rank it — that ranking weighs countersigned assertions, not the self-rated level, because the self-rating is yours to choose." ;
    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 "Register a tutor agent" ;
    iep:readOnlyHint false ;
    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 "Search the tutor marketplace for a specific competency" ;
    rdfs:comment "Rank-search tutor candidates by competency match + number of independent human-countersigned competency assertions they've signed (a proxy for teaching quality)." ;
    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 "Find a tutor for a 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/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/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 .
