Skip to content
Cockpit0.29.0
A snapshot: read at commit 707a04c7ce8 on 2026-10-18T00:06:01Z by majordomus 0.29.0. Nothing on this page is read again. See it live

web.surfaces

Every web surface, resolved

What it is

The web topology in route-precedence order, with each surface's mount, category, visibility, kind, producer, artifact, runtime feature and the provenance of every value a reader could be surprised by; and which ids are served, published and offered to a person. Answered from the resolution this process serves from, so it cannot disagree with what the router routes or what the home page lists.

Descriptor

Canonical id
web.surfaces
Module
web
Kind
query
Stability
behaviorallyverified
Provenance
declaredcached
Source
apps/majordomus-cli/src/capability/builtin/web.rs
Cache
process, 2 entries, 5s
Benchmark
required
Tags
webintrospection

Run

query
A query. It reads and changes nothing.

This capability takes no input.

GET /api/v1/web/surfaces

Projections

InterfaceAsWhere
MCP toolmajordomus_web_surfaces-
MCP resourcemajordomus://web-
HTTPGET /api/v1/web/surfacesSwagger
Command linenot exposed-

Schemas

Input · Empty
{
  "type": "object",
  "additionalProperties": false,
  "description": "No input.",
  "title": "Empty"
}
Output · SurfaceReport
{
  "type": "object",
  "properties": {
    "surfaces": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/Surface"
      },
      "description": "Every resolved surface, in route-precedence order: the order a router consults\nthem in, so the first whose mount owns a path is the one that answers it."
    },
    "served": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The ids a process answers for, in the same order. A surface published and not\nserved is absent here."
    },
    "published": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The ids a publication holds, in the same order."
    },
    "public": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The ids offered to a person, which is what the home page lists."
    },
    "findings": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/SurfaceFinding"
      },
      "description": "What validation says about the topology as it stands. Empty is the healthy answer;\na finding here is the same one `majordomus web validate` reports, with its remedy."
    }
  },
  "required": [
    "surfaces",
    "served",
    "published",
    "public",
    "findings"
  ],
  "description": "The web surfaces of this repository, as the process that answers resolved them.",
  "title": "SurfaceReport",
  "$defs": {
    "Surface": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "Identity, unique across the topology; the selector `--only` and `--exclude` use it."
        },
        "title": {
          "type": "string",
          "description": "One line: what a reader sees in a listing."
        },
        "category": {
          "$ref": "#/$defs/SurfaceCategory",
          "description": "What it is for, which is how a listing groups it."
        },
        "visibility": {
          "$ref": "#/$defs/SurfaceVisibility",
          "description": "Whether a person is shown it."
        },
        "kind": {
          "$ref": "#/$defs/SurfaceKind",
          "description": "How it answers."
        },
        "mount": {
          "$ref": "#/$defs/Mount",
          "description": "Where it answers."
        },
        "producer": {
          "type": "string",
          "description": "What produced it: a command, a module, or the generator that writes the directory."
        },
        "feature": {
          "anyOf": [
            {
              "$ref": "#/$defs/Feature"
            },
            {
              "type": "null"
            }
          ],
          "description": "The runtime capability it needs; absent when the process always has it."
        },
        "artifact": {
          "type": [
            "string",
            "null"
          ],
          "description": "The generated directory, repository-relative, for a static surface."
        },
        "index": {
          "type": [
            "string",
            "null"
          ],
          "description": "The file served for the mount itself, when the surface has one."
        },
        "availability": {
          "$ref": "#/$defs/SurfaceAvailability",
          "description": "Where the surface's files go and who answers for it."
        },
        "built_from": {
          "type": [
            "string",
            "null"
          ],
          "description": "The revision the artifact was built from, when its producer recorded one: what\nmakes a stale build a finding rather than a surprise."
        },
        "provenance": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/$defs/Provenance"
          },
          "description": "Where each interesting value came from, by field name."
        }
      },
      "required": [
        "id",
        "title",
        "category",
        "visibility",
        "kind",
        "mount",
        "producer",
        "availability",
        "provenance"
      ],
      "description": "One resolved surface: everything a consumer needs, with the provenance of what it could\nbe surprised by."
    },
    "SurfaceCategory": {
      "oneOf": [
        {
          "type": "string",
          "const": "interface",
          "description": "Something a person opens and looks at: the home page, the Cockpit."
        },
        {
          "type": "string",
          "const": "documentation",
          "description": "Prose and reference written for a person: the site, the Swagger UI."
        },
        {
          "type": "string",
          "const": "api",
          "description": "A machine-readable surface of the capability registry."
        },
        {
          "type": "string",
          "const": "protocol",
          "description": "A wire protocol another program speaks."
        },
        {
          "type": "string",
          "const": "report",
          "description": "Generated evidence of a run: a test report, a benchmark report."
        }
      ],
      "description": "What a surface is for, which is how a reader is shown it.\n\nA category is the one piece of intent that a mount cannot carry: `/openapi.json` and\n`/swagger` sit beside each other and are a document and a viewer for it. Grouping is\nderived from this field and never from a list of paths kept somewhere else."
    },
    "SurfaceVisibility": {
      "oneOf": [
        {
          "type": "string",
          "const": "public",
          "description": "Listed for a person: it appears on the home page."
        },
        {
          "type": "string",
          "const": "internal",
          "description": "Served and introspectable, not advertised: a machine speaks to it, or another\nsurface links to it."
        }
      ],
      "description": "Who a surface is offered to.\n\nTwo values and no more: a surface is either offered for a person to discover, or it is\npart of the topology without being advertised. Both are always in the machine-readable\nanswer — hiding a served route from introspection would only hide it from the people\nmaintaining it."
    },
    "SurfaceKind": {
      "oneOf": [
        {
          "type": "string",
          "const": "static-directory",
          "description": "A generated directory, mounted under its prefix and served from disk."
        },
        {
          "type": "string",
          "const": "native-route",
          "description": "A path the executable answers itself, from its own registry or handlers."
        },
        {
          "type": "string",
          "const": "redirect",
          "description": "A path that answers with a redirect to another one."
        }
      ],
      "description": "How a surface answers a request.\n\nOnly what this repository serves: a directory of generated files, a path the executable\nanswers itself, and a redirect. A new *kind* is a new behaviour, never a new name for\nthe same behaviour with different data."
    },
    "Mount": {
      "type": "string",
      "description": "An absolute mount path, without a trailing slash."
    },
    "Feature": {
      "oneOf": [
        {
          "type": "string",
          "const": "mcp",
          "description": "This process answers MCP over HTTP."
        },
        {
          "type": "string",
          "const": "cockpit",
          "description": "This process serves the Cockpit."
        },
        {
          "type": "string",
          "const": "ui",
          "description": "This process serves the UI: `majordomus ui`, the primary surface (ADR 0135)."
        }
      ],
      "description": "A capability of the running process a surface needs in order to exist.\n\nThe registry describes the effective process, not the maximum one: a build or an\ninvocation that answers no MCP has no MCP surface, and the home page cannot link to\none. Stating the dependency as data is what keeps that automatic."
    },
    "SurfaceAvailability": {
      "oneOf": [
        {
          "type": "string",
          "const": "both",
          "description": "Served by the running executable and published as files."
        },
        {
          "type": "string",
          "const": "served-only",
          "description": "Answered by the running executable and never published: a route the process\ncomputes, or a build made for this server's own mount rather than for deployment."
        },
        {
          "type": "string",
          "const": "published-only",
          "description": "Published as files; the running executable serves it from the same directory."
        }
      ],
      "description": "Whether a surface is part of the static publication, served only while a process runs,\nor both."
    },
    "Provenance": {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "source": {
              "type": "string",
              "const": "registry"
            }
          },
          "required": [
            "source"
          ],
          "description": "Read from the capability registry: the routes the executable already declares once."
        },
        {
          "type": "object",
          "properties": {
            "path": {
              "type": "string",
              "description": "The declaration file, repository-relative."
            },
            "source": {
              "type": "string",
              "const": "producer-declaration"
            }
          },
          "required": [
            "source",
            "path"
          ],
          "description": "Read from a producer's own declaration beside its output (`surface.json`)."
        },
        {
          "type": "object",
          "properties": {
            "path": {
              "type": "string",
              "description": "What was found, repository-relative."
            },
            "source": {
              "type": "string",
              "const": "filesystem"
            }
          },
          "required": [
            "source",
            "path"
          ],
          "description": "Inferred from a file or directory being where the convention says it is."
        },
        {
          "type": "object",
          "properties": {
            "path": {
              "type": "string",
              "description": "The configuration file, repository-relative."
            },
            "source": {
              "type": "string",
              "const": "site-config"
            }
          },
          "required": [
            "source",
            "path"
          ],
          "description": "Inferred from the site generator's own configuration."
        },
        {
          "type": "object",
          "properties": {
            "source": {
              "type": "string",
              "const": "default"
            }
          },
          "required": [
            "source"
          ],
          "description": "The model's documented default for a value nobody stated."
        }
      ],
      "description": "Where a resolved value came from.\n\nKept for every field a consumer can be surprised by, so that `web explain` can answer\n\"why is this mounted here?\" without anybody reading the discovery code."
    },
    "SurfaceFinding": {
      "type": "object",
      "properties": {
        "severity": {
          "$ref": "#/$defs/SurfaceFindingSeverity",
          "description": "How much it matters."
        },
        "rule": {
          "type": "string",
          "description": "The rule that produced it, stable enough to grep for."
        },
        "surface": {
          "type": "string",
          "description": "The surface it is about."
        },
        "message": {
          "type": "string",
          "description": "What is wrong."
        },
        "remedy": {
          "type": "string",
          "description": "What to do about it."
        }
      },
      "required": [
        "severity",
        "rule",
        "surface",
        "message",
        "remedy"
      ],
      "description": "One thing wrong with a topology, said so a person can fix it without reading this file."
    },
    "SurfaceFindingSeverity": {
      "oneOf": [
        {
          "type": "string",
          "const": "warning",
          "description": "Worth reading; serving is still coherent."
        },
        {
          "type": "string",
          "const": "error",
          "description": "The topology may not be served or published in this state."
        }
      ],
      "description": "How much a finding matters."
    }
  }
}

Examples

These are the capability's own benchmark cases: the same inputs the benchmark runs and the OpenAPI document shows.

default
{}