Vivarium recipes index (v1)

Machine-generated catalogue index of every reproduction this repository hosts. Consumed by the Vivarium MCP server and any other programmatic tool that wants to list, filter, or look up recipes.

At a glance

URL: https://aletheia-works.github.io/vivarium/api/recipes.json

{
  "index": "v1",
  "contract": "v1",
  "recipes": [
    {
      "slug": "pandas-56679",
      "layer": 1,
      "project": "pandas",
      "issue": 56679,
      "title": "pandas-dev/pandas#56679",
      "page_url": "https://aletheia-works.github.io/vivarium/repro/pandas/56679/",
      "source_url": "https://github.com/aletheia-works/vivarium/tree/main/src/layer1_wasm/pandas-56679"
    },
    {
      "slug": "bash-local-shadows-exit",
      "layer": 2,
      "project": "bash",
      "issue": 0,
      "title": "bash `local` shadows command-substitution exit code",
      "page_url": "https://aletheia-works.github.io/vivarium/repro/bash/local-shadows-exit/",
      "verdict_url": "https://aletheia-works.github.io/vivarium/repro/bash/local-shadows-exit/verdict.json",
      "source_url": "https://github.com/aletheia-works/vivarium/tree/main/src/layer2_docker/bash-local-shadows-exit"
    }
  ]
}

Top-level fields

FieldTypeRequiredNotes
index"v1" literalFormat version. New optional fields ship as same-page revisions; breaking changes are v2.
contract"v1" literalThe Contract v1 version that recipes' pages publish.
recipesarray of recipe entriesEvery reproduction this repository hosts, sorted by layer then by slug.

Recipe entry fields

FieldTypeRequiredNotes
slugstring (kebab-case)Recipe directory name under src/layer{N}_*/. Same convention as Manifest v1's slug.
layerinteger (1 | 2 | 3)Layer 1 = WASM in browser; Layer 2 = Docker; Layer 3 = record-replay.
projectstringUpstream project name (e.g. "pandas", "bash").
issueintegerUpstream issue number; 0 if no upstream tracker entry.
titlestringHuman-readable title, from the recipe README's first H1.
page_urlURILive reproduction page (Layer 1: WASM page; Layer 2 / 3: docker-run instructions page).
verdict_urlURILayer 2 / 3 only — deployed verdict.json snapshot. Layer 1 verdicts are produced live in-page and have no static snapshot.
source_urlURIGitHub link to the recipe directory.
languagestringOptional. Primary implementation language, lowercase (e.g. "python", "rust", "shell"). Sourced from the docs/data/recipe-facets.json overlay. Added in the 2026-05-03 revision.
symptomstring (kebab-case)Optional. Short symptom slug used by the error → recipe matcher (e.g. "dtype-mismatch", "ordering-non-transitive"). Sourced from the facet overlay. Added 2026-05-03.
severitystringOptional. Free-form severity bucket (e.g. "bug", "regression", "spec-violation", "footgun"). Sourced from the facet overlay. Added 2026-05-03.
tagsarray of stringsOptional. Free-form tag list scored by the matcher (e.g. ["sqlite3", "pragma", "foreign-keys"]). Sourced from the facet overlay. Added 2026-05-03.

Versioning

The version is carried as index = "v1" on the top-level object.

  • Optional additive fields ship as same-v1 revisions; consumers feature-detect them.
  • Breaking changes (renamed fields, type changes, optional → required) require a v2 schema sibling.

There is no current v2.

Revision history

DateChange
2026-05-03Added optional language, symptom, severity, tags fields to recipe entries. Sourced from a centralised facet overlay (docs/data/recipe-facets.json), not per-recipe frontmatter. Backwards-compatible — v1 consumers ignore.

Generation

The index is built by docs/scripts/generate-recipes-index.ts, wired into the rspress dev and build scripts in docs/package.json. The script walks the recipe directories, parses each recipe README's first H1 for the title, and derives project / issue from the slug pattern (<project>-<digits> for slugs with a trailing issue number; first dash-segment otherwise, with a small override map for recipes whose slug shape diverges).

The output is tracked in git so PRs that add a recipe also show the index update in the diff. The optional facet fields (language, symptom, severity, tags) are merged in from docs/data/recipe-facets.json, a centralised overlay maintained by hand and reviewed in PR diff. The project field stays slug-derived in v1.

Conformance

A recipes.json document conforms to v1 when:

  1. It validates against recipes.schema.json.
  2. index === "v1" and contract === "v1".
  3. Every entry's slug matches ^[a-z0-9]+(-[a-z0-9]+)*$.
  4. Every Layer 2 / 3 entry includes verdict_url; Layer 1 entries omit it.

Clauses 1–3 are mechanically enforceable via schema validation. Clause 4 is a derivation-rule constraint not encoded in the schema's oneOf (kept deliberately permissive: the MCP server treats a missing verdict_url on a Layer 2 / 3 entry the same as verdict_url pointing at a 404 — both are surfaced to the consumer as "no snapshot available").

See also

  • Contract v1 — the runtime verdict surface each recipe page publishes.
  • Manifest v1 — the upstream-side manifest format an external repo ships at .vivarium/manifest.toml. Recipe entries in this index correspond to internal recipes; external repos publish their own per-repo manifest instead of being listed here.