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
queryA query. It reads and changes nothing.
Projections
| Interface | As | Where |
|---|---|---|
| MCP tool | majordomus_web_surfaces | - |
| MCP resource | majordomus://web | - |
| HTTP | GET /api/v1/web/surfaces | Swagger |
| Command line | not 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
{}