Artifacts Reference

Every braised build writes a set of structured JSON files to artifacts/. These are the data source for braised mcp serve — each tool call reads from an in-memory copy loaded at startup. They are also machine-readable directly: any script, CI job, or custom tool can parse them.

artifacts/ is distinct from dist/manifest.jsonl. The manifest is a flat stream of content chunks for embedding pipelines (one record per section). Artifacts are structured documents for deterministic lookups: navigation tree, page metadata, source provenance.

Common envelope

Every artifact file shares the same JSON wrapper:

{
  "artifact_type": "nav-structure",
  "project":       "My Docs",
  "generated_at":  "2026-04-24T12:00:00Z",
  "schema_version": "1",
  "data": { ... }
}
Field Type Description
artifact_type string Identifies the artifact. Built-in values: nav-structure, frontmatter-index, sources-index.
project string Value of site.title from braised.yaml.
generated_at string ISO 8601 UTC timestamp of the build that produced the file.
schema_version string Schema version for the data payload. Currently "1" for all built-in types. Adding optional fields is non-breaking and does not bump this value; removing fields or changing types does.
data object Artifact-type-specific payload. See each section below.

The full site navigation tree as braised resolved it from nav.yaml, after nav_title overrides are applied.

{
  "artifact_type": "nav-structure",
  "schema_version": "1",
  "data": {
    "roots": [
      {
        "label": "Getting Started",
        "url": "",
        "children": [
          {"label": "Installation", "url": "/getting-started/installation/", "children": []},
          {"label": "Your First Site", "url": "/getting-started/first-site/", "children": []}
        ]
      }
    ]
  }
}

data fields:

Field Type Description
roots []NavNode Top-level navigation entries. Never null — empty array when nav is empty.

NavNode:

Field Type Description
label string Display label from nav.yaml or nav_title frontmatter override.
url string Output URL with trailing slash. Empty string for section headers with no page of their own.
children []NavNode Nested entries. Never null — leaf nodes emit [].

frontmatter-index.json

One entry per successfully built page, sorted by URL. Pages with llm_exclude: true are filtered out.

{
  "artifact_type": "frontmatter-index",
  "schema_version": "1",
  "data": {
    "pages": [
      {
        "url":             "/getting-started/installation/",
        "title":           "Installation Guide",
        "layout":          "default",
        "llm_description": "How to install braised on macOS, Linux, and Windows.",
        "llm_exclude":     false,
        "in_nav":          true
      }
    ]
  }
}

data fields:

Field Type Description
pages []PageEntry All non-excluded built pages.

PageEntry:

Field Type Description
url string Output URL with trailing slash.
title string Page title from frontmatter.
layout string Layout template in use. "default" unless overridden in frontmatter.
llm_description string Agent-facing description. Resolved from llm_description frontmatter; falls back to the first paragraph of page content if omitted.
llm_exclude bool Always false here — excluded pages are not written to this artifact.
in_nav bool Whether the page URL appears in the resolved nav tree.

sources-index.json

Provenance index built from :::sources backmatter blocks across the site. Always written — empty maps when no :::sources blocks exist.

{
  "artifact_type": "sources-index",
  "schema_version": "1",
  "data": {
    "by_page": {
      "/agentic/mcp-serve/": ["https://modelcontextprotocol.io/spec/2024-11-05"]
    },
    "by_source": {
      "https://modelcontextprotocol.io/spec/2024-11-05": ["/agentic/mcp-serve/"]
    },
    "coverage": {
      "uncovered_pages": ["/getting-started/installation/", "/getting-started/first-site/"],
      "by_group": {
        "mcp-spec": {"pages_citing": 1},
        "unmatched": {"pages_citing": 0}
      }
    }
  }
}

data fields:

Field Type Description
by_page map[string][]string Maps each page URL to its resolved source URLs. Only pages with at least one :::sources entry are present.
by_source map[string][]string Inverted index — maps each source URL to the page URLs that cite it.
coverage.uncovered_pages []string Page URLs with no :::sources block. Null (not []) when all pages have sources.
coverage.by_group map[string]SourcesGroupCount Per-registry-group citation counts. Omitted when no sources registry is configured in braised.yaml. Key "unmatched" collects source URLs that match no registered prefix.

SourcesGroupCount:

Field Type Description
pages_citing int Number of pages citing at least one source in this group.

See Documentation Provenance for how :::sources blocks work and how to configure the registry.

Inspecting artifacts

All artifact files are pretty-printed JSON — readable directly with any JSON tool.

# Check when the last build ran and what it produced
cat .braised/last_build.json

# Count pages in the index
jq '.data.pages | length' artifacts/frontmatter-index.json

# List all pages not in nav
jq -r '.data.pages[] | select(.in_nav == false) | .url' artifacts/frontmatter-index.json

# Show the full nav tree
jq '.data.roots' artifacts/nav-structure.json

# List pages with no sources declared
jq -r '.data.coverage.uncovered_pages[]?' artifacts/sources-index.json

For inspecting manifest.jsonl — which is a flat NDJSON stream rather than a structured JSON file — see Writing a Pipeline Script and scripts/inspect-manifest.sh.

theme-variables.json (optional)

Not generated by default. When present in artifacts/, braised mcp serve registers it as the get_theme_variables tool. This artifact is produced by an optional CSS extractor pipeline step — until that step is configured, get_theme_variables returns a not-found response and the tool is absent from tools/list.