**A session starting work on this repository now lands on something.** There was no briefing:
Claude Code loads `CLAUDE.md` and nothing else, the guidance existed only as markdown in
`docs/guidance/`, and the one route to it on the site was
`/backoffice/docs.html#docs/guidance/language.md` — a fragment, which is not an address. It cannot
be cited in a commit message, it is not in the sitemap, and anything fetching it gets the shell of
a document browser rather than the document. **`llms.txt`, the file this site tells machines to
read first, mentioned the guidance zero times** — an agent arriving to *change* the site found no
route to the rules it was about to break.

**Every guidance document now has a page of its own**, at `/backoffice/guidance/<name>.html`,
rendered from the markdown by `build/guia.py` on every build. They are in the back office because
that is where English pages live and where gate 19 already checks they carry `lang="en"` and the
box saying they are not the publication. `llms.txt` gains a section pointing at all five — in
English, unlike the rest of that file, and it says why in the file itself.

**`.claude/ONBOARDING.md`** is the short form, and `build/briefing.py` prints it from the
`SessionStart` hook, so it reaches every session without being asked. It reads the version, the
next free gate number, the agent register and the last run record off disk rather than restating
them — a briefing with a number typed into it goes stale on the day it matters most. *The
`permissions` block of `.claude/settings.json` was not touched, and the change asserts that rather
than promising it: `CLAUDE.md` forbids a run from widening its own permissions, and a hook is not a
permission.*

**Gate 41** keeps it true: every document under `docs/guidance/` has a page, `llms.txt` points at
them, and every link in the briefing resolves. A briefing whose links have rotted is worse than no
briefing, because it reads as current.

**Three bugs in the shared inline renderer, found by rendering prose that had never been
rendered.** Backticks were not handled at all, so every `like this` reached the page as literal
backticks — invisible on an article, which rarely uses them, and everywhere on guidance pages,
which are mostly file names. Because nothing protected a code span, a `[[fonte:…]]` written *inside*
one, the syntax being discussed, became a live chip pointing into the register at an id that does
not exist: **a page explaining how a citation works was making one.** And `*italics*` came through
as asterisks. Fixed in `paginas.inline()` for every page on this site, not worked around in the new
renderer.

**Gate 19 got narrower, which made it more accurate.** It failed the guidance page for carrying a
source mark — correctly, by its old reading. A mark inside `<code>` is the syntax being quoted, not
a citation being made, so it is now skipped; an unquoted mark still fails, and the check that
matters — a back-office page linking into the register — was never in question. Verified by
injection: an unquoted `[[fonte:dados-gov]]` on a console page still turns the build red.

*Markdown links were rendering for the first time, and the site gate immediately found nine broken
ones — links that had been correct between two markdown files and were wrong the moment one of them
became a page two directories away. One, `llms.txt` in `index.md`, had simply been wrong since it
was written and nothing had ever rendered it.*

*And the gate that catches what this release is about caught this release.* **Gate 36 — added four
versions ago and never yet fired in anger — went red on the merge: another session had taken 39 in
`build/gates_desenho.py` while this one took 39 in `build/gates_artigos.py`.** Theirs shipped
first, so this one renumbered; then 40 was taken too, in `admin/build/render.mjs`, because that
session had **extended gate 36's own registry to cover the browser gate and the site gate** — a
registry covering some of the addresses is one that hands out addresses twice. This gate is 41.

---

**Three things found on the way that were nobody's intent.**

**The browser gate caught two pages that drag sideways on a phone**, both from the console rewrite
two releases ago — it is a local check, not a CI one, so a session that does not run it ships
without knowing. On the board, a status pill carrying a whole sentence («blocked on `build/pdf.py`
está na lista de recusa; nenhum agente…») was `white-space: nowrap` and 538px wide on a 390px
screen. On the mail page it was three pixels, from a URL long enough to have nowhere to break —
and three pixels is enough, because the reader still has to pull the page back to read the next
line. The back office is mostly paths and URLs, so long words now wrap there by rule rather than
by luck.

**Two article folders were left as orphan pages.** `uma-captura-nao-mostra-movimento` and
`registo-nacional-nao-devolve-texto` had their `artigo.json`, `artigo.md`, claims and provenance
removed on the release branch when the article set was replaced, but their generated `index.html`
survived this merge — two pages on the live site with a stale version badge and every link inside
them broken. They are gone. **The article gates could not have seen this**: gate 16 walks
`artigos/**/artigo.json`, so a folder with no `artigo.json` is invisible to it, and the derived
index had already dropped both. The site gate found it, by following the links.

**The `min-width: auto` trap, twice in one afternoon.** A flex or grid child refuses to shrink
below its content unless `min-width: 0` is set, so no amount of wrapping downstream helps until it
is. It is the load-bearing half of the status-pill fix, and it is worth knowing before the next
thing on this site overflows.


*Renumbered twice on the way out.* Another session released v0.20.0 while this note was being
written, and had written its own `admin/versions/v0.20.0.md`; the same merge also turned up
`backoffice/viewer.html`, a page whose generator they deleted in v0.17.0 and which this side's
build had faithfully recreated — the third orphan of the day, and the same shape as the two article
folders. And a release note from v0.16.0 pointed at `/backoffice/desenho.html`, renamed to
`design.html` in their v0.20.0: historical notes keep their prose and get a working address, since
it is the same page. **`build/before_push.py` named the collision before the push rather than after
it, which is the whole of what it is for.**
