09.02 — I18n FR/EN/RU#
Every Holy Book page exists in three versions. EN at the root of
docs/, FR underdocs/fr/, RU underdocs/ru/. VitePress routes automatically.
File structure#
docs/
├── index.md # EN home
├── what-is-it.md
├── first-feedbacks.md
├── setup.md
├── scenarios-composability.md
├── datasets-smoke-tests-setup-teardown-proxy-api-and-caching.md
├── handling-flakiness.md
├── extensibility.md
├── using-ocarina-with-ai.md
│
├── fr/
│ ├── index.md # FR home
│ ├── what-is-it.md
│ ├── first-feedbacks.md
│ ├── setup.md
│ ├── scenarios-composability.md
│ ├── datasets-smoke-tests-setup-teardown-proxy-api-and-caching.md
│ ├── handling-flakiness.md
│ ├── extensibility.md
│ └── using-ocarina-with-ai.md
│
├── ru/
│ ├── index.md # RU home
│ ├── what-is-it.md
│ ├── first-feedbacks.md
│ ├── setup.md
│ ├── scenarios-composability.md
│ ├── datasets-smoke-tests-setup-teardown-proxy-api-and-caching.md
│ ├── handling-flakiness.md
│ ├── extensibility.md
│ └── using-ocarina-with-ai.md
│
├── public/
│ ├── favicon.ico
│ ├── logo.png
│ ├── robots.txt
│ ├── .nojekyll
│ ├── .spa
│ └── assets/
│ └── content/
│ └── ... # shared EN+FR+RU images
│
└── .vitepress/
├── config.mts
├── blog-theme.ts
├── shims.d.ts
├── plugins/
│ ├── llm.ts
│ ├── pub.ts
│ ├── skills.ts
│ └── webp.ts
└── theme/
├── index.ts
├── style.css
├── user-theme.css
├── components/
│ ├── Pagination.vue
│ ├── BlogHomeBanner.vue
│ └── NotFound.vue
└── assets/
└── bg.pngRouting#
| Page | URL EN | URL FR | URL RU |
|---|---|---|---|
| Home | / | /fr/ | /ru/ |
| Pitch | /what-is-it | /fr/what-is-it | /ru/what-is-it |
| Rant | /first-feedbacks | /fr/first-feedbacks | /ru/first-feedbacks |
| Setup | /setup | /fr/setup | /ru/setup |
| … | … | … | … |
VitePress auto-builds the language switcher (top right). Clicking “FR” from /setup takes you to /fr/setup.
Frontmatter#
---
sticky: 1
pagefind-indexed: false
description: Test frameworks all made the same bad bet. Ocarina does the opposite. Learn why.
date: 2026-04-24
head:
- - meta
- property: og:image
content: http://mojo-molotov.github.io/ocarina-holy-book/assets/content/what-is-it/creatives/the-children-tools-battle.png
---| Field | Role |
|---|---|
sticky: 1 | Obscure theme config, implementation detail (@sugarat/theme) |
pagefind-indexed: false | Exclude from the Pagefind index (often for “philosophy” pages we don’t want polluting technical search) |
description | Meta description (SEO + Open Graph) |
date | Publication date (displayed + used for sort + drives chapter order in PDF generation) |
head.meta.og:image | Cover image (social previews / OG previews when shared in chats + article cards) |
Human translation#
FR pages are not auto-translated from EN.
They are written separately, with:
- Idiomatic phrasing.
- Cultural references ("paquet de clopes", “r/AntiTaff”).
- Original quotes kept as-is on both FR and RU (like “In the Lulzboat, salute, bitch, and show some respect.” stays in English).
The structure and technical substance are identical.
Pages#
index.md#
---
layout: home
blog:
name: "The Ocarina Holy Book"
minScreenAvatar: false
pageSize: 6
analysis: false
---Layout home = blog landing (article cards). 6 cards per page. Strips some “fancy” theme features. No analytics.
what-is-it.md#
The manifesto:
- “Yet another one!” (Them, Us)
- “The cultural problem” (ISTQB)
- “The real pain point” (creativity, science)
- “Vision” (sovereign grammar, born in the field, adoption)
See ../01-philosophy/01-flip-the-problem.md, ../01-philosophy/02-istqb-vs-pytest.md
first-feedbacks.md#
The pamphlet:
- “First grievances”
- “Ostentatious complexity”
- “Philosophy” (KISS, anti-narcissism, etc.)
- “Secession” (anti-no-code, anti-startup-nation, anti-hype, anti-slipologues)
- “First relevant interaction”
See ../01-philosophy/03-kiss-and-complexity.md, ../01-philosophy/05-political-stance.md
setup.md#
The first onboarding tutorial:
- Warning (“this manual helps you get familiar with
ocarina-example, which remains the source of truth, but nothing replaces practice”). - Project setup.
- The adapters (EnvGetters, Act, TestCampaign, TestSuite, MatchPage).
- Writing a first POM.
- Writing connectors.
- Writing a first scenario.
- Creating a suite.
- Creating a campaign.
- Creating a cycle.
- Bootstrapping the project.
See ../07-ocarina-example/02-adapters.md
scenarios-composability.md#
Another tutorial to help understand your “first scenarios”:
- “The end of invalid states” (act, drive_page, match_page).
- “Immune system” (every mypy error we’ve seen:
../02-ocarina/03-railway/02-action-chain-states.md). - “Repetitions” (
[...] * 5). - “Fragments” (pre/post).
- “Aliasing”.
datasets-smoke-tests-setup-teardown-proxy-api-and-caching.md#
Digs deeper — framed as “First jutsus" — detailing what Ocarina does and doesn’t do:
- Datasets (data-driven).
- Smoke tests.
- Setup and teardown.
- Proxy pattern (HumanizedDriver).
- Reactive programming: NO.
- API calls and locks.
- Browser profile.
handling-flakiness.md#
A field report — "First real-world hurdles" — focused on flakiness:
- Server hazards (
on_failurehook). - Test step hazards (POM-internal retries).
- Selenium hazards (
WebDriverExceptionintransient_errors). - Discrete random errors (Watcher).
- Concurrency heisenbugs (saturate_workers).
extensibility.md#
Zooms out to present “Extensibility”:
- ValidationChain (invariant chaining, chainvalidations, custom assertions, _type safety).
- Success and failure (handlers).
- Post-exec plugins.
- Extensible grammar ("the only extension-point constraint: return a
ChainRunner”).
using-ocarina-with-ai.md#
Zooms out further — how to “Use Ocarina with AI”. Opens the road to vibe testing:
- The three ancestral stones.
CLAUDE.md(full and slim).skills/(9 families, 40+ skills).- Recurring chains.
- Discipline.
- What this setup is not.
- Exposed resources.