**Three Claude Code sessions work on this repository at once, and until now nothing here knew
that.** A gate reads the working tree, and the working tree is one session's opinion. Everything
that has gone wrong between sessions went wrong in the gap between *my branch is green* and *my
push is accepted*. This release closes as much of that gap as a repository can, and says plainly
which part it cannot close.

**Gate 36 — no two gates share a number.** Two sessions added gates the same afternoon and both
started at 27. The build was green on each branch and stayed green after the merge, because a gate
number is a comment: nothing reads it, so nothing checked it, and for a while this site had two
gate 27s saying different things. The scan is deliberately tolerant, since three gate files write
their numbers three different ways — and it caught its own author first: the block adding gates
36 to 38 did not match any pattern, so the gate reported «next free: 36» while sitting under a
heading that reads 36-38.

**Gate 37 — a class a component puts on the document has a rule in the stylesheet.** This one is
the interesting failure. `<pt-chat>` sets `pt-chat-aberto` on `<html>` and `assets/site.css` turns
it into a column. The v0.13.0 merge brought a wholesale rewrite of that stylesheet; git auto-merged
it with **no conflict at all**, and the four rules went with it. Nothing failed — the component
still loaded, still reached `pronto`, still had a shadow root full of text — and the panel simply
lay across the article again, the same symptom as the `hidden` bug two releases earlier from an
entirely unrelated cause. **A coupling that crosses a file boundary and is checked by nothing will
eventually be deleted in silence.**

**Gate 38 — the release history is a set, and the version is its newest member.** Two sessions took
v0.13.0 within the hour. The site gate checks the table *has* a row for `version.txt`; it never
checked there was only one, nor that the number was ahead of every other, nor that the note file
named actually exists — and `build/versoes.py` skips a missing note silently, which turns a
mistyped path into a release shipping with an empty row.

**`build/before_push.py`** asks the one question a gate cannot: what is on the release branch that
is not in my hand? It fetches, reports and changes nothing — the released version and whether yours
is free, the highest gate number on each side, and the list of source files the other session
**rewrote wholesale**. Then take your version number, which should be the last thing you do and not
the first.

**That last list was wrong when it was first written, and the wrong version is the instructive
one.** It listed files *both* sides had changed since the merge base — the obvious heuristic.
Checked against the merge that actually destroyed work, that list did not contain `assets/site.css`
at all: the rules had landed two releases earlier, so they were already in the merge base and only
their side had touched the file since. **The heuristic could not have caught the thing it was named
after.** What catches it is churn — their rewrite changed 897 lines of a 411-line file, where the
next busiest source file on the same range changed 31% of itself.

**And the guidance page that holds it together**, at [`docs/guidance/concurrent-sessions.md`](
../docs/guidance/concurrent-sessions.md) and in the back office: what has actually collided, what
each thing cost, which gate catches it now, and the ordering that avoids most of it — claim the
work before you build it, take the version number last, resolve a generated file by rebuilding and
never by hand, and when the other session rewrote a file wholesale, read your own lines in it
afterwards. **A clean merge is not evidence that your work survived.**

*Every one of the three gates was broken on purpose before it was trusted: a second file numbered
from 34, the chat's column rules deleted again, a duplicated release entry, a note file that does
not exist, and a version number already taken. All five go red; all five were restored.*
