# Ontology School — course manifest (CONCEPT:AU-KG.ontology.learning-curriculum-manifest,
# Ontology-Playground coverage row #16).
#
# A small, versioned, human-editable curriculum index: courses -> lessons
# (title + a markdown body path + an optional quiz). This ships the FRAMEWORK
# plus two real starter lessons authored from existing platform material — see
# docs/learn/index.md for the honest scope note (not the full curriculum).
#
# Consumed by two independent readers, deliberately (this is documentation
# CONTENT, not a runtime capability — docs/ is excluded from the installed
# Python package, see pyproject.toml `exclude`, so nothing here is reachable
# from a deployed agent-utilities process):
#   - this docs site (mkdocs nav links straight to the lesson .md files below)
#   - agent-webui's LearnView, which carries its own copy of this manifest +
#     lessons (agent-webui/src/content/learn/) so the in-app course list /
#     lesson reader / presentation mode / quiz work with no backend round-trip
#
# Lesson bodies are plain Markdown; a frontend presentation mode splits a
# lesson into slides at each `##` heading (mirrors Ontology-Playground's own
# convention for its Ontology School articles).
schema_version: 1
courses:
  - id: ontology-model-101
    title: Intro to the Ontology Model
    description: >-
      What an interface, an object type, and a link type are in this
      platform's ontology, and how they compose into a governed schema.
    lessons:
      - id: interfaces-object-types-and-links
        title: Interfaces, Object Types, and Links
        body: lessons/ontology-model-101/01-interfaces-object-types-and-links.md
        quiz:
          - question: What is an Interface in this ontology model?
            choices:
              - A concrete, instantiable object type like "Customer" or "Order"
              - An abstract shape contract (properties + link constraints) that object types implement
              - A database table
              - A REST endpoint
            answer_index: 1
          - question: >-
              A link with cardinality MANY_TO_MANY that needs its own
              properties (e.g. "role", "allocation") is modeled as a...
            choices:
              - plain LinkType
              - JunctionLinkType (a reified intermediary object type)
              - InterfaceProperty
              - value type
            answer_index: 1
          - question: How does an existing object type "implement" an Interface?
            choices:
              - By subclassing it in Python
              - By being renamed to match the interface
              - Via InterfaceRegistry.implement(), which validates it satisfies every required property and link constraint
              - It cannot — interfaces are documentation only
            answer_index: 2
  - id: querying-with-uql
    title: Querying with UQL
    description: >-
      UQL is the engine's native cross-modal query language: one pipelined
      text query composing graph, vector, lexical, temporal, and epistemic
      reads over a single snapshot.
    lessons:
      - id: your-first-uql-pipeline
        title: Your First UQL Pipeline
        body: lessons/querying-with-uql/01-your-first-uql-pipeline.md
        quiz:
          - question: What must every UQL query start with?
            choices:
              - "RANK BY ~[...]"
              - "MATCH (:Label) [WHERE ...]"
              - "REASON <Class>"
              - "RETURN"
            answer_index: 1
          - question: What does `|>` do in a UQL query?
            choices:
              - Comments out the rest of the line
              - Pipes the current RowSet into the next stage
              - Starts a brand-new, independent query
              - Escapes a string literal
            answer_index: 1
          - question: "RANK BY ~[0.1, 0.9, 0.0] ranks the current RowSet by..."
            choices:
              - Alphabetical order of node id
              - Cosine similarity to a literal embedding-space query vector
              - Recency (how recently the node changed)
              - Node degree (number of edges)
            answer_index: 1
