**English is live at `/en-gb/`, the back office speaks English in its addresses too, and the
masthead says beta.** Four things the editor asked for, and the third of them — *"it's ok to publish
this and put it live, since this is still a beta newspaper"* — is what let the first one out of the
gate it was sitting behind.

**The beta tag, beside the wordmark, the way Google carried one for years.** A superscript on the
masthead rather than a banner across the page, because it is a standing fact about the publication
and not an alert. It is a **link** — to `/sobre/`, the page that says what is real on this site today
and what is not yet — because a beta tag that does not say what is unfinished is decoration. The word
is the same in every language, which is why it is not a translatable segment: `build/i18n.py` sends
nothing shorter than two words.

**`/redacao/` is now `/desk/` and `/entregas/` is now `/admin/deliveries/`.** The editor: *"these
back office links/names still count in some words in Portuguese, and they should all be in
English."* The desk moved without trouble. The deliveries could not move anywhere: gate 13, the
delivery quarantine, allows unapproved research items to be shown WITH THEIR STATE on exactly three
path prefixes — `/entregas/`, `/redacao/` and `/admin/` — and `build/gates.py` is deny-listed, so no
session here may add a fourth. It was proved rather than assumed: the index page passed at a new
path and the two delivery detail pages went red on six items. `/admin/` is one of the three, it is
already English, and `build/build.py` already puts `/admin/review/` there for exactly this reason. So
the deliveries went under it. `redacao/issues/`, `redacao/runs/` and `redacao/correio/` stay where
they are — the same file pins those three paths in the write-boundary gate — and `redacao/` is
therefore still a folder name in the console's file links. That is the honest remainder, and issue
008 already asks for the one line that finishes it.

**`/en-gb/` is 224 pages at 100% coverage, and the number on each page is the real one.** The
interesting part of this release is not the translation, it is what the coverage figure had to
survive to become true. It said 100.0% three separate times while an English page still read
«Empresas Protagonistas Instituições Políticas», and each time the cause was a different class of
blindness:

* **A metric that could not see what a reader complains about.** A single accented word is not
  translatable by the rules — one word is usually a name — so it never reached the substitution and
  was never counted as anything at all. `i18n.parece_portugues()` now counts what a reader would SEE,
  whether or not the pipeline is willing to translate it. Coverage fell from 100% to 78.3% and became
  worth reading.
* **`generated` used as a dustbin.** A date line, a count and a byte total are formatted rather than
  translated — but «there is a template and nobody has translated it yet» is a MISS, and filing it
  under the column that does not count against coverage is how a report reaches 100% with a
  Portuguese page in front of it. `generated` now means only: no template exists.
* **A machine-fact test that matched «Aviso».** The pattern allowed «any single token», which is
  every one-word label on the site. All of them were classified as identifiers and left Portuguese in
  every locale, and the report counted them as correct. A machine fact now needs a machine shape: a
  separator, a digit, or hexadecimal length.
* **A name harvest that swallowed the site's own vocabulary.** `nome` and `rotulo` were taken from
  every data file — and the three departments are agents whose `nome` is «Pesquisa», «Redação» and
  «Verificação», the eight sections carry a `rotulo` in the ontology, `grafo.json` labels this site's
  own headlines, and `lexico.json` labels the themes. 16 858 runs were classified verbatim, including
  the masthead. A name is a name because a SOURCE published it, not because a field is called `nome`.

**Generated text is now formatted rather than left alone, and that is one segment per template for
ever.** `i18n.mascarar()` replaces every run of digits with `#` and every month or weekday name with
`@`; the masked form is the segment, and the values are put back at render time from the page itself.
«Lisboa · segunda-feira, 14 de setembro de 2026» is one template that serves every date this site
will ever print, and each locale carries its own month and weekday names in
`dados/i18n/locales.json`. Ordering matters and was got wrong twice: the mask has to be tried before
the «is this prose?» test, because «mais 3 entidades» is not prose by that test and was being reported
missing with its own translated template sitting unread in the memory.

**Two masking mistakes worth remembering, because both produced hundreds of junk segments.**
Identifiers were masked too — `2026-09-14/oradores/luis-valente` became a «template» and 465 version
badges became `v#.#.#` — which buried the fifty templates that are real. And a sentence that STARTS
with a name is one entity's sentence, not a template: «Nina Chandé — Pessoa no grafo do ecossistema
português de IA. 4 arestas» masks to something still different for all 198 entities. Both are now
refused by shape.

**The language switcher points at THIS page in the other language, not at the other language's front
door.** A switcher that always lands on the home page makes a reader four levels deep pay for
changing language by losing their place, and it is the commonest way multilingual navigation is got
wrong. The hrefs are relative and correct in the Portuguese tree; `build/locales.py` recomputes them
per locale from `data-lang`, because a relative link cannot be right in both trees at once and the
site gate cannot resolve a root-absolute one. Codes, not flags: a flag is a country and a language is
not a country.

**Four defects the gates caught before a reader could.**

* **An orphan translation was being served.** Gate 44's own comment claimed orphans are «kept for
  reuse, never served», and substitution looks up the hash of the text ON THE PAGE, so a translation
  left behind by a rule change was still being found. «sessão de arranque (Claude Code, Opus 5)» went
  out translated on 224 pages and the gate named it. Serving only keys the CURRENT extraction knows
  makes the claim a property of the code instead of a comment.
* **The entity linker was inventing links.** Running it over a translated block added links the
  Portuguese page does not have, and each call carried its own «already linked» set, so one name
  became four links to one entity on a page whose published formula allows one. Gate 24 caught it on
  four pages. A block is now a segment only when its content is plain text — which also stopped the
  footer's hand-made link to `/aviso/` being deleted by a translation, a link gate 14 requires.
* **The link rewriter broke sibling files.** It prepended one `../` to anything leaving the localised
  set, which is right for a link written from the root and wrong for `comentarios.json` beside an
  article. Resolving to a root-relative path and re-relativising is right in both cases.
* **The boxed language badge moved the chrome.** It added 3px to the paper's utility strip and not
  the console's, and gate 33 requires the two to be identical — the panel must not move when a reader
  crosses between them. The browser gate measured 36 against 33. No border, no padding, and the
  console gets the run too.

**`build/chrome.py` now runs a second time, after the locales.** It writes `llms.txt` and
`sitemap.xml` by globbing the pages that exist, and on a first build of a clone the locale tree does
not exist yet — the site gate then reports that `llms.txt` does not name `/en-gb/`, and rule 7 says
the sitemap agrees with the tree.

**What is still Portuguese on an English page, and why.** Every excerpt, every name, every verb of
the graph — by rule, and gate 44 asserts they are byte-identical. The article headline of a story is
translated; the frozen excerpt inside it is not, and the page says which is which. French and German
sit at `preparado` with the machinery proved and the words not yet written.

**`CLAUDE.md` still says «Everything a reader sees is European Portuguese under AO90».** The editor
authorised publishing in conversation and the deny list means the file itself is theirs to amend. The
wording is in `redacao/issues/010` and the site is now ahead of its own constitution — which is worth
saying plainly rather than leaving for somebody to notice.
