00.02 — Stack / responsibility / license matrix#

RepositoryRoleLanguageVersionPrimary stackTooling stackDistributionLicense
ocarinaBrowser e2e test frameworkPython3.14+hatchling, python-docx (sole runtime dependency), selenium + playwright (dev only)ruff (ALL), mypy strict, pytest, hypothesis, pytest-mypy-plugins, syrupy, prysk (cram), allure-pytest, pre-commit, twine, buildPyPI, v1.1.10MIT
ocarina-exampleCanonical e2e suite against the IgoristanPython3.14+ocarina, selenium ≥ 4.40, python-dotenv, dogpile.cache, redisruff, mypy, pre-commitSource onlyMIT
ocarina-with-ai-examplee2e suite against CURA Healthcare, co-written with Claude CodePython3.14+ocarina ≥ 1.0.3, selenium ≥ 4.40ruff, mypy, mypy-extensions, typing-extensions, pre-commitSource onlyMIT
igoristanPublic SUT, deliberately chaotic web appTypeScript6.0.xReact 19.2, Vike 0.4.258 (SSG), Vite 7.3, TailwindCSS 4 (alpha), valibot, react-hook-form, react-dropzone, usehooks-ts, throttleit, lucide-react, uuidpnpm 11, Node 24, wireit (orchestrator), eslint 9 (flat), prettier 3.5, husky, lint-staged, commitlint, commitizen, terser, rollup-plugin-visualizer, vite-plugin-compression, @qalisa/vike-plugin-sitemapGitHub Pages (/igoristan/)none
tests-workersOTP / Corsicadex backend, the substrate that exercises parallelization and API testsTypeScript5.9.3Vercel Edge Functions (runtime: "edge"), @upstash/redis, otplib, next types (NextRequest)pnpm 11.x, @vercel/node (types)Vercel: https://tests-workers.vercel.appISC
ocarina-holy-bookPublic documentation + AI skills + PDFsTypeScript6.0.xVitePress 2 alpha, @sugarat/theme, vue 3.5, pagefind, vitepress-plugin-image-optimizepnpm 11, Node 24, eslint 9, prettier 3.8, husky, lint-staged, commitlint, sass-embeddedGitHub Pages (/ocarina-holy-book/)MIT

Python early adopter#

Python 3.12+ featureUse in Ocarina
PEP 695 (class Foo[T]:)Generic signatures everywhere (TestSuite[Driver], Watcher[Driver], Test[Driver], Result[T], Ok[T], Thunk[T], etc.)
PEP 695 type aliases (type X = ...)Every alias: type Result[T] = Ok[T] | Fail, type Effect = Callable[[], None], type Thunk[T] = Callable[[], T], type Mode = Literal[...]
TypeGuard (Python 3.10+)is_ok, is_fail, is_test_result_ok, is_test_result_fail, is_test_result_skipped
Self (3.11+)Fluent returns from POMs, loggers, invariants
@final (3.8+)Locks critical classes (Watcher, Test, TestCycle, ChainRunner, Ok, Fail, …)
Unpack (3.11+)HumanizedDriver signature in ocarina-example
Protocol (3.8+)ScreenshotDriver, SupportsWrite[str]
Literal (3.8+)All enums (SeleniumCliStoreKeys, LOGGERS_CHOICES, Mode)
Never (3.11+)_SilentArgumentParser.error signature

Practical consequence: there is a dedicated CI workflow unstable_python_full_build.yml that pushes Python 3.15-dev monthly (cron: "0 3 1 * *"), because Ocarina aims to be ready for the next interpreter as soon as it ships. See ../10-cicd/02-ocarina-workflows.md

Node, pnpm, browsers#

ComponentVersion usedWhere
Node^24.xigoristan/package.json#engines, ocarina-holy-book/package.json#engines
pnpm11.x (Igoristan, Holy Book), 11.x (tests-workers)package.json#engines, packageManager
Firefoxlatest (via browser-actions/setup-firefox)CI for ocarina-with-ai-example
geckodriver0.35.0 (CI ocarina-example), 0.36.0 (CI ocarina-with-ai-example)Direct download from Mozilla’s GitHub Releases
chromedrivermatched to the ambient Chrome version on ubuntu-latestDownloaded from storage.googleapis.com/chrome-for-testing-public

No dependencies#

Ocarina declares one runtime dependency (python-docx). On purpose.

  • Everything else (Selenium, Redis, dotenv, dogpile…) sits in the user project.
  • Neither Selenium nor Playwright (added in 1.1.3) is a runtime dep of Ocarina. Both sit in the dev group — used by the framework’s tests and shipped adapters, not by the library core itself.
  • The only plugin that “costs” a dependency is generate_docx_proof (the only one pulling python-docx). If that plugin fails to import, the rest keeps running.

Holy Book, chapter “What is Ocarina?”:

The only external dependencies live in the post-execution plugins and if one of them doesn’t fit, it can be removed without breaking anything else.

See ../11-independence/02-auditability.md for the scope of that rule.