Skip to content

Cross-language parity

Go, Ruby, Rust, Python, JVM, and .NET adapters must reach parity with the JavaScript/TypeScript adapters for core story semantics, the doc model, artifact outputs, and agent-consumable workflows.

DimensionRequired outcomeJS/TS baselineNon-JS status
Behavior semanticsGiven/When/Then/And/But keywords, auto-And for repeated keywords, explicit but()Vitest/Jest/Playwright/Cypress adaptersImplemented; verified via RawRun fixtures and pnpm run verify:*
Doc modelSame doc entry kinds and schema meaning (json, table, code, section, link, mermaid, screenshot, html, custom, note, tag, …)Full surface in JS adaptersImplemented where host allows; gaps must be documented
Artifact outputsRawRun JSON → StoryReport v1 via formatters CLIReporter rawRunPath + formattersRawRun default .executable-stories/raw-run.json; format with executable-stories format
Agent workflowStoryReport JSON + list --list-format json indexAgent artifact contractSame formatter pipeline for all languages
VerificationPer-language verify script + formatter acceptance testsExample apps + pnpm qualityverify:go, verify:pytest, verify:rust, verify:junit5, verify:xunit, verify:ruby

Status values used in release review:

  • required — must match JS/TS unless impossible on the host framework
  • intentional divergence — documented host limitation (must appear in README feature matrix)
  • in progress — tracked gap with owner and target release
AreaJS/TSNon-JSRationale
Init APIstory.init(task) (Vitest), story.init() (Jest), fixture-aware PlaywrightLanguage-native init (es.Init(t, …), ExecutableStories.init, …)Framework-native first — no shared interpreter
Reporter integrationIn-process Node reportersWrite RawRun at end of test runHost runtime differs
ESLint pluginsPer-framework pluginsNone (Ruby/Go use native linters)Host tooling
Cypress doc.story overrideCypress-only title overrideN/ACypress-specific legacy path

From repo root (requires language toolchain):

Terminal window
pnpm run verify:go
pnpm run verify:pytest
pnpm run verify:rust
pnpm run verify:junit5
pnpm run verify:xunit
pnpm run verify:ruby
./scripts/verify-all.sh

Each script:

  1. Runs the adapter example or package tests
  2. Asserts RawRun structure
  3. Validates schema via executable-stories validate
  4. Runs formatter pipeline (HTML + Markdown + StoryReport JSON + list index)

Formatter package tests also load cross-language RawRun fixtures (schemas/examples/go.json, rust.json, pytest.json, junit5.json, dotnet.json) and assert StoryReport v1 validation.

Before releasing adapter or formatter changes:

  1. No regression against this matrix without an explicit intentional divergence note
  2. Update README feature matrix when adding doc kinds or scenario options
  3. Extend verify scripts or acceptance fixtures when adding a new language or artifact field

Agents consume the same artifacts regardless of source language:

Terminal window
executable-stories format .executable-stories/raw-run.json --format story-report-json --output-dir reports --output-name index
executable-stories list .executable-stories/raw-run.json --list-format json > reports/scenarios-index.json

Optional MCP: MCP server guide.