feat(config): T-1281 — canvas-version, and typer's other rich path

All five gates now live in the check domain. canvas-version produces
byte-identical output to the original on the live tree.

It is the first real consumer of core/process.run. The git calls pass
check=False deliberately: a git failure here is not an error to report but a
signal that there is nothing to compare, since a fresh clone with no remote is
a legitimate state rather than a broken one. The argv-list and missing-binary
guards still apply.

Its two skips are kept distinct from its pass. NO_BASE and DIFF_FAILED exit 0,
as does CLEAN — but only CLEAN means the gate actually looked at something.
Collapsing them would hide a gate that had silently stopped running, which for
this check in particular is the exact failure it exists to prevent.

Found a second rich path while a NameError was rendering as a full-width
box-drawn traceback: typer's pretty-exception handler is a different mechanism
from rich_markup_mode, and setting one does nothing about the other. Same log
pollution T-1259 thought it had closed, arriving through another door and
landing in the worst place — a hook log at the moment something has already
gone wrong. pretty_exceptions_enable=False now on the root and on every domain
built by cli.domain().

test_canvas_version_check.py moves with the code it guards. It had been loading
the extensionless script through a SourceFileLoader and reaching canvas_sources
by sys.path insert, both only because tooling/ was not importable. Second
instance of that debt evaporating on contact. What it asserts is unchanged,
which is the point: diff_has_version_bump was kept pure in the port so its six
properties still hold without constructing git history.

Also restores an import the check router dropped in T-1267 when it moved to
cli.domain() — caught by running the command rather than by reading it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-31 18:22:25 +02:00
co-authored by Claude Opus 5
parent 05bf1732d4
commit a3cbc478a0
8 changed files with 284 additions and 20 deletions
+7
View File
@@ -84,4 +84,11 @@ def domain(name: str, help: str) -> typer.Typer:
no_args_is_help=True,
add_completion=False,
rich_markup_mode=None,
# A SECOND rich path, separate from rich_markup_mode and easy to miss:
# typer's pretty-exception handler renders unhandled errors as box-art
# with syntax highlighting. That is the same log pollution
# rich_markup_mode=None prevents for help text, arriving through a
# different door — and it lands in the worst place, a hook log at the
# moment something has already gone wrong. Plain tracebacks instead.
pretty_exceptions_enable=False,
)