From 6e69d8957f69d169805f524ba45db14c27bf43ed Mon Sep 17 00:00:00 2001 From: Brett Heap <1513478+brettheap@users.noreply.github.com> Date: Sun, 11 Oct 2026 21:39:06 +0000 Subject: [PATCH 1/3] shape-doctor.py: a validator row that ran the standard's TEMPLATE copy prints the `PYTHONPATH` it ran it under in its NEXT, in sh's or PowerShell's dialect, so pasting the `manifest`, `pins` or `family` row's NEXT prints the validator's own finding and exits with `detail.exit` instead of dying on `ModuleNotFoundError: No module named 'repo_shape'` with exit 1, a finding's code (#238) A root with no `scripts/validate-.py` of its own is checked by the standard's template copy, and the row's NEXT named that template as a bare command. The template imports `repo_shape` from beside itself, and `repo_shape.py` is copied INTO a project out of the standard's `scripts/`, so the doctor's own child ran it only because `run_validator` puts `/scripts` on the child's `PYTHONPATH`. The printed line was a different process from the one whose output the row quoted: pasted from any directory with no `PYTHONPATH` in the environment it printed a traceback and exited 1, which is also what a validator exits with for "findings", so anything keyed on the exit code read a crash as the finding the row had already reported. A reader whose shell exported a `PYTHONPATH` reaching the standard never saw it. The fix is in the one definition #205 split out, not in a row. `validator_for` now also returns whether the validator is the root's own copy, and a new `validator_command` spells the line from that, for the reader's platform, the way `copy_command` and `scaffold_command` already do (`platform` is passed on, `None` is the host): sh PYTHONPATH=/scripts python3