• English
  • 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" literal✅Format version. New optional fields ship as same-page revisions; breaking changes are v2.
    contract"v1" literal✅The Contract v1 version that recipes' pages publish.
    recipesarray of recipe entries✅Every 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 = third way.
    projectstring✅Upstream project name (e.g. "pandas", "bash").
    issueinteger✅Upstream issue number; 0 if no upstream tracker entry.
    titlestring✅Human-readable title, from the recipe README's first H1.
    page_urlURI✅Live reproduction page (Layer 1: WASM page; Layer 2 / 3: docker-run instructions page).
    page_url_jaURI⏳Optional. The Japanese rendering of the same page, under the site's /ja/ tree. Present only when the recipe ships a translation (src/layer*/<slug>/i18n.ja.json); its absence means no Japanese page exists. Do not derive this URL by inserting /ja/ into page_url — an untranslated recipe would 404. Added 2026-09-02.
    verdict_urlURI⏳Layer 2 / 3 only — deployed verdict.json snapshot. Layer 1 verdicts are produced live in-page and have no static snapshot.
    source_urlURI✅GitHub link to the recipe directory.
    languagestring⏳Optional. Primary implementation language, lowercase (e.g. "python", "rust", "shell"). Sourced from the per-recipe recipe.json under src/layer*_*/<slug>/. Added in the 2026-05-03 revision; the 2026-05-18 revision moved the source from the retired docs/site/_data/recipe-facets.json overlay to the per-recipe file.
    symptomstring (kebab-case)⏳Optional. Short symptom slug used by the error → recipe matcher (e.g. "dtype-mismatch", "ordering-non-transitive"). Sourced from recipe.json. Added 2026-05-03.
    severitystring⏳Optional. Free-form severity bucket (e.g. "bug", "regression", "spec-violation", "footgun"). Sourced from recipe.json. Added 2026-05-03.
    tagsarray of strings⏳Optional. Free-form tag list scored by the matcher (e.g. ["sqlite3", "pragma", "foreign-keys"]). Sourced from recipe.json. Added 2026-05-03.
    expected_verdictstring (enum)⏳Optional. Verdict the regression suite expects the recipe page to produce — "reproduced" or "unreproduced". Sourced from recipe.json. Added in the 2026-05-18 revision.
    expected_runtimestring⏳Optional. Runtime identifier the recipe's verdict envelope reports in __VIVARIUM_RESULT__.runtime.name (e.g. "pyodide", "docker-snapshot"). Sourced from recipe.json. Added 2026-05-18.
    path_aboolean⏳Optional. Present and true when the recipe page mounts the Path A "Try a fix" panel, so a consumer can hand a candidate fix to the page. Absent means it does not. Sourced from recipe.json. Added 2026-09-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/site/_data/recipe-facets.json), not per-recipe frontmatter. Backwards-compatible — v1 consumers ignore.
    2026-05-18Added optional expected_verdict / expected_runtime fields, and moved the source of the existing language / symptom / severity / tags fields from the retired docs/site/_data/recipe-facets.json overlay to per-recipe src/layer*_*/<slug>/recipe.json files (schema: recipe.schema.json). Backwards-compatible — v1 consumers ignore the new fields and read the existing ones unchanged.
    2026-09-02Added optional page_url_ja, the Japanese rendering of a recipe's reproduction page. Emitted only for recipes that ship a translation, so its presence is the signal that a Japanese page exists. Backwards-compatible — v1 consumers ignore it.
    2026-09-03Added optional path_a. Layer alone no longer implies a page can run a supplied fix: Layer 1 recipes opt into the panel one at a time, and consumers that used to dispatch on layer === 1 should read this field instead. Backwards-compatible — v1 consumers ignore it.
    2026-10-04recipe.schema.json gains optional upstream, the upstream release a Layer 1 recipe's baseline pins, read by the daily upstream-bump workflow. The index does not export it, so recipe entries are unchanged.
    2026-10-04recipe.schema.json also gains optional fix_candidate, the branch and pinned commit a recipe's fix-candidate pane builds from source, read by the same workflow. Not exported to the index either.
    2026-10-06recipe.schema.json gains optional upstream_pr, the upstream pull request that fixes the recipe's bug, read by the daily retire-merged workflow, which removes the recipe once that pull request is merged. Not exported to the index.

    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, expected_verdict, expected_runtime) are read from the per-recipe src/layer*_*/<slug>/recipe.json file (schema: recipe.schema.json); the recipe ships its own metadata, so adding a recipe is a one-directory change. 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.