Skip to content

A page of the published site written in a reader's language is declared with that language and a reason, and is refused unless the page declares the same language itself

project.english-only binds this repository to one working language, and version 2 names one

declared statusdeclared status: guaranteed Declared deterministic and blocking, implemented, and naming the behavioural test that is to prove it. Whether a recorded run supports it is the evidence verdict, shown beside it.

recorded evidencerecorded evidence: not run Declared guaranteed, and not supported by a recorded run: the test is named, and no passing run of the current inputs is recorded. how evidence is recorded

project.english-only v2 (ADR 0077) keeps the repository's own artifacts English with no exceptions and names one population apart: content published for a reader in that reader's language. The permission costs three declarations that must agree — the path is under site/content-src/ or its projection, the allow list carries the language and a required reason, and the page itself declares the same language. The third is what stops an allow list from being a file an entry can be appended to in order to silence a finding.

What it means

project.english-only binds this repository to one working language, and version 2 names one population apart: a page of the published site written for a reader in that reader's language (ADR 0077). Everything else is unchanged — a comment, a commit message, a rule, a document under docs/ must be English, with no exceptions.

The permission is not "the site tree is exempt". It is per page, and it costs three declarations that must agree with each other.

How it works

scripts/ci/english-only-check allows such a page only when all three hold:

  • It is published content. The path is under site/content-src/, the authored source of the site, or is that page's generated projection under site/content/. A translation entry naming anything else makes the check refuse to run.
  • It is declared with a reason. translation <path> <language> <why> in scripts/ci/english-only-allow.txt, in the same shape as the two older kinds. An entry with no reason is a list entry, not a declaration, and is refused.
  • The page says the same thing. The page's own front matter carries lang = "<language>", and the check compares the two. A page that declares nothing, or declares a different language than the list claims for it, is refused.

The third condition is the one that makes this an exemption rather than a loophole. An allow list is a file anyone can append to in order to silence a finding; requiring the file itself to say what it is means an entry that is not true of its page cannot pass.

How to see it

$ scripts/ci/english-only-check --strict
english-only-check: every authored file is spelled in English (N measured, N declared fixtures, N declared translations)

bash test/run.sh 403_published_translation proves each refusal by mutation: an undeclared page in another language still fails, a declaration without a reason is refused, a declaration outside the published site is refused, a declaration the page does not agree with is refused, and a declared translation exempts its own file and not its neighbour.

What it does not cover

The check is an alphabet test, in version 2 exactly as in version 1. It decides letters that occur in Czech, Slovak or Polish and never in English, and whole non-Latin scripts. English prose carrying a sentence of another language spelled in ASCII passes it, and always will, so the rule stays wider than the gate.

It also does not decide whether a translation is good, whether it says the same thing as its counterpart, or whether the two contradict each other. Nothing in this repository decides that today; it is review.

Why it matters

The alternative to a typed exemption is one of two worse things: a repository that cannot publish a word to a reader who does not work in English, or a baseline file that launders foreign prose into "known debt" and stops meaning anything. Naming the permitted case, and making the page and the list check each other, keeps the gate strict everywhere it was strict before — which is what makes it still worth obeying.

Detail rendered from docs/claims/published-translation-is-declared.md.

From the statement to the proof

  1. 1 · the public statement

    A page of the published site written in a reader's language is declared with that language and a reason, and is refused unless the page declares the same language itself

    No feature or README responsibility names it; this page is where it is stated.

  2. 2 · the canonical claim

    published-translation-is-declareddeclared status: guaranteed in docs/CLAIMS.yaml

    Defined in .ai/repo/rules/project/english-only.v3.md

  3. 3 · the implementation

    scripts/ci/english-only-check

  4. 4 · the test and the scenarios

    Test: test/cases/403_published_translation.sh

  5. 5 · the recorded runs

    recorded evidence: not run how evidence is recorded

Verify it yourself

The test runs in a disposable temporary repository and asserts the behaviour, not a string in the source.

from a clone of the repository
bash test/run.sh 403_published_translation

Related claims same implementation

Searches the titles and descriptions of every page this site publishes.