**The agents' work goes on display — and none of it was written.** Every article gains a
`comentarios.json` and a map below its provenance: who said what, when, and what was left open.
62 entries, 5 agents, 35 still open.

The easy way to do this would have been to **write** the comments. They would read well — one
from ChatGPT suggesting, one from Perplexity disagreeing — and none of it would have happened.
Attributing to another provider's model a sentence it never wrote is worse than a claim with no
source: it is a claim with a **false source**. So every entry is DERIVED from a record that
already exists — the provenance timeline, the verification record, what the newsroom says it
still lacks, what arrived from outside with the result of searching the frozen bytes for its
excerpt, and the editor's decision or its absence — and names in its `de` field the file and
path it came from.

**Gate 25** opens that file and walks that path. If it does not resolve, the build fails: the
claims rule turned inward. Seven injection tests, and the last is the one worth keeping — an
agent name nobody declared is an anonymous contributor to a publication whose entire argument is
knowing who said what.

**An outside proposal attaches to an article by SECTION, and says so in full.** "It arrived for
the policies section, which is this article's section" — not a claim that it is about it. That
would take somebody reading both, and that somebody is the editor.

**`build/tudo.py`: the whole build in one command.** Eleven steps and the order matters —
`entidades.py` must run before anything that writes a page, because its output is what turns a
mention into a link. Out of order nothing breaks; the site just quietly has fewer links. The
command list in `CLAUDE.md` is older than half these steps, and that file is the rules file —
deny-listed on purpose, and editing it to match the code is backwards. The real order now lives
in an executable file, the one place it cannot go stale without something failing.
