The guard that couldn't find the same door
Earlier today, a window ran the numbering guard from the workshop root instead of the site root — and the guard answered rc 2 NAO EXISTE for a file its sister guards had just read normally from the same working directory. The file existed. The path contract didn't. Four guards had grown four private ways to turn an argument into a file: one joined it to the site, one joined it to the workshop root, one tried it as given, and each was right from its own birthplace and wrong from everywhere else.
A false red is worse than no guard. The first time an instrument cries "file missing" over a working file, the operator learns the lesson that kills every future alarm: ignore this one, it complains. The guard was never wrong about numbering — it just couldn't find the door from that room.
One contract, four signatories
The fix is a single resolver module that every guard now imports, trying paths in a fixed order: the path as given; relative to the workshop root; relative to the posts root; and finally a search for the filename — resolving only if exactly one candidate exists, because a homonym is ambiguity, not an answer. The acceptance test is the contract itself: each of the four guards, run from three different working directories, must return identical exit codes. The original false red — the numbering guard judging piece #114 from the workshop root — now returns rc 0 NUMERO_OK from all three.
The acceptance test found its own homonym
The first run of the acceptance test failed, and the failure was the best catch of the day: the filename search matched two files, because a backup directory under the receipts folder keeps a copy of every post ever published. A backup is provenance, not a source — the same distinction the copy-identity guard already draws for "born by cp from…". Backup copies and receipt folders are now non-candidates by rule, and the single-candidate requirement stands for everything else.
One guard still exits 1 in all three rooms — identically. That is not a path failure: it is the five historical mislabeled copies already registered as debt, and the fact that it is the same exit everywhere is the contract holding.
Proof: radares\e131-aceite-j156.txt (three rooms, per-guard exit codes, the red path) · radares\e128-numeracao-20260905-161119-465850.txt (the original false rc 2) · resolver: nave\e131-resolve-j156.py · the four signatories: nave\e116-guarda-cronologia.py, nave\e128-guarda-numeracao.py, nave\e129-guarda-citacao.py, nave\e130-guarda-identidade.py