let s = import "../schema.ncl" in

# Rustelo domain — full-stack Rust framework (Leptos + Axum).
# Authority: rustelo project. Schemas queried via schema_cmd.
# Consumers declare the bond carrier .domains-ontoref/rustelo/ (bond model, ADR-073).

s.Domain & {
  id          = "rustelo",
  name        = "Rustelo Framework",
  repo_kinds  = ["RusteloApp"],
  description = "Full-stack Rust framework based on Leptos and Axum. Provides schemas for app layers, WASM targets, plugin system, and routing contracts.",
  short_alias = "rs",

  # NCL schemas live in the rustelo project — not in ontoref.
  # Resolves to the rustelo project root via the global registry so consumers
  # import as: import "%{schema_root}/domains/rustelo/ontology/schema.ncl".
  schema_cmd  = "ontoref project root rustelo",

  commands = [
    { id = "layers",    description = "List application layers declared in catalog" },
    { id = "plugins",   description = "Plugin registry: registered, active, interface contracts" },
    # Declared from the start and answering `not yet implemented` for its entire life — the
    # project's own pathogen on its own domain surface: a capability announced on a queryable
    # protocol surface, doing nothing, with nothing noticing. Now it is the WITNESS across the
    # three levels a rustelo page spans, and each seam it checks is one that fails SILENTLY:
    #
    #   route → page_id → FTL   a route with no FTL keys does NOT 404. `static.j2` renders
    #                           `texts[page_id ~ "-page-title"] | default(page_id)`, so the page
    #                           comes back 200 with its own id as the title. Seven of them are
    #                           live. A broken page that returns 200 is worse than a 404: nothing
    #                           alerts, and no log records it.
    #   content → route         `content/pages/**` is NOT a content-kind and NO Rust code reads
    #                           it. A .md there is dead by construction — and it looks like the
    #                           obvious place to edit. The privacy policy lives in BOTH the FTL
    #                           (served) and the markdown (dead), and nothing checks they agree.
    #                           A legal document, declared twice, no witness.
    { id = "routes",
      description = "Route manifest, and the witness across the three levels: routes (framework/build) → page_id → FTL text (instance), plus orphan markdown in the content tree",
      usage = "ore rustelo routes [--check]",
      examples = [
        "ore rustelo routes           # report the manifest and every seam",
        "ore rustelo routes --check   # exit 1 on a broken seam (CI gate)",
      ] },
    { id = "wasm",      description = "WASM build targets and feature flags" },
    { id = "publish-contract", description = "Content-publisher consumption contract: the 6 answers + their oracles, declared once on the producer" },
    { id = "probe",     description = "Run the end-to-end publish->activate->index oracle in this RusteloApp (ADR-056 witnessed verification)" },
  ],

  pages = [],
}
