GLTron validated analysis pair repair

Base: 55cc37b594fbf3a099ba3d8035c1cf56aafa3b95. This is a source-only repair; fresh independent acceptance is required before integration. Earlier candidate 80f02f5f2235560f0705880544f0403dfda906b4 remains rejected.

The unchanged test/gltron-publication-order-independent-accept-oct28.py first reproduced failed-reanalysis-preserves-published-pair: after successful A, unresolved B retained A's inventory but replaced its closure. That original failure and before/after bytes remain under the task's evidence directory.

analyze now validates before publishing either success file. Rejected import details go to rejected-closure.json, separately from the successful pair. Earlier checksum, malformed PE and other validation exceptions still propagate. A rejected attempt with no previous success leaves both success files absent; an existing successful pair remains byte-for-byte unchanged. Rejection evidence can remain after later success and is not the current successful closure.

Successful publication serializes both documents, prepares new files and any old-byte backups in a private same-filesystem directory, then replaces each success file. Ordinary staging errors affect neither target. A replace failure rolls back already replaced targets from prepared backups (or removes the new file when absent before), then rethrows the original exception. A rollback failure reports both the original cause and retained recovery directory. Fix the filesystem problem before manually replacing the affected target(s) from their .old files; do not treat a rollback failure as successful publication.

This is a single-writer ordinary-error rollback mechanism. The two renames do not give concurrent readers an atomic pair view. There is no lock, fsync-based durability, journal, or power-loss/process-crash recovery guarantee. Temporary files may remain after abrupt termination. Concurrent writers are unsupported.

Validation (tiny synthetic fixtures only; no original copied, downloaded, re-extracted or executed):

Canonical task evidence is scratch/usage-watch/gltron-bounded24-pair-repair-oct28/receipt.json, with evidence/before/decision.json, evidence/after/decision.json, and separate stdout/stderr plus command/exit/cleanup records for each supervised operation. The receipt binds the new delta, resource admission, exact task-branch remote verification and recovery instructions. Main ownership stays with TuxRacer.