ShiftLefter

Quality as a dimension, not a phase.

A typed vocabulary for your app’s behavior — your actors, your actions, your intents, defined once and shared by every human and every AI agent that touches your tests. Scenarios are validated against it before anything runs.

We don’t heal your tests — we name what changed.

Failures arrive in your vocabulary — which actor, which intent, which step — not as a selector timeout.

Open source, actively developed — releases

Install

Java 21+ is the only requirement. No Clojure toolchain.

curl -fsSL https://raw.githubusercontent.com/SHIFT-LEFTER/shiftlefter/main/release/install.sh | bash
export PATH="$PWD/sl:$PATH"
sl --version

A real run report

Every sl run can write a self-contained HTML report — one file, no server, failures expanded. This one is real, failures and all. Its pair: a planning failure — the run that refused to start, and what it teaches at the point of failure.

ShiftLefter HTML run report — scenario results with expanded failure transcripts

In plain terms: a Cucumber-compatible Gherkin test runner — Clojure core, real browsers and SMS, JUnit XML and HTML reports for CI — with a type system for what your tests are allowed to say.

What ShiftLefter does

Where it is, honestly

Solid today

  • Multi-actor browser driving — independent sessions with real isolation.
  • The typed vocabulary discipline — validated at bind time, with suggestions.
  • The sl CLI — run, format, dry-run, diagnose; JUnit XML, HTML, and EDN output; tag filtering; parallel scenarios.
  • Gherkin parsing & lossless formatting — 46/46 official Cucumber test files, usable as a CI formatting gate.
  • Scenario lifecycle hooks — named in the feature file (@hook=), registered next to your config. Befores fail fast before a browser ever opens; afters run while it’s still alive; every hook that ran is in the report.
  • A scenario data plane — regex named captures with {name} interpolation, so a value captured in one step is usable in the next.

Building toward

  • The traceability graph — requirements ↔ use cases ↔ features ↔ the runs that prove them.
  • Semantic diffing of live pages — ships today as a dev/REPL preview (SIEVE), heading for the CLI.
  • Not just what changed — how, and what it puts at risk.
  • First-class fixtures and brownfield suite migration.

The baton pass: agents write good end-to-end tests against this surface now; the same vocabulary is the foundation they’ll use to map tests to requirements, use cases, and provenance. Adopt it for the left column; the right column is why the discipline compounds.

For AI agents

If you’re an agent (or you brought one): install, then ask the tool itself.

curl -fsSL https://raw.githubusercontent.com/SHIFT-LEFTER/shiftlefter/main/release/install.sh | bash
./sl/sl orient        # where am I, what would fail, what to read next
./sl/sl agent-doc --list

The full agent surface is documented in docs/AGENT.md; the installer prints a breadcrumb stanza to paste into your AGENTS.md. A plain-text pointer lives at /llms.txt.