Skip to content

Commit da4a0ab

Browse files
committed
Update directives
1 parent 84e3625 commit da4a0ab

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

.claude/skills/repomatic-ship/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ The checks:
134134
- The usual culprits: path resolution (`Path.resolve()` canonicalizes Windows 8.3 names and POSIX symlinks), home-directory expansion, env-var casing, filesystem case-sensitivity, text-I/O encoding (Windows defaults to cp1252, so a bare `open()`/`read_text()`/`write_text()` breaks on the first non-ASCII character, and only in Windows CI: pass `encoding="utf-8"`, and when the cycle touched file I/O, run the suite once with `PYTHONWARNDEFAULTENCODING=1` to surface calls ruff's inference-limited `PLW1514` cannot see), and direct execution of a generated script (Windows honors neither the executable bit nor the shebang, dispatching on file extension, so a `chmod +x`'d shebang script a test runs by bare path fails with `WinError 193`: emit a `.cmd` launcher beside a `.py` sidecar on Windows, or invoke the interpreter explicitly).
135135
- The structural fix is to **mirror the production transformation, not reconstruct it**: a test asserting on a derived value should run the same pipeline the code runs, so the expectation matches by construction on every platform. Where expectations must diverge by platform, the CI matrix is authoritative: read every cell, not just your OS.
136136
- **Name what the gate cannot run**: grep the cycle's changed test files for pytestmarks that exclude the local platform (`unless_*`, `skip_*`, `skipif`) and diff-review those tests' expectations by hand, since a green local run says nothing about them. Extend the review to the *inputs* those tests consume, not just the test files: new docs prose or docstrings can redden a platform-gated conformance test whose skip list never met that reference class (a reworded docstring a Sphinx test asserts on, a first-ever stdlib cross-reference missing from a skip list). The cycle's earlier pushes already ran those tests in CI, which is why the read of CI's conclusions on `HEAD` above is what actually catches them pre-push.
137-
- **Reproducing a platform-specific failure churns the shared venv, and the wrong re-sync then reddens the rest of the gate with artifacts.** Confirming a free-threaded or version-specific break with `uv run --python <other>` (e.g. `3.14t` for a free-threading race) recreates and repoints `.venv` to that interpreter. Restore it with the CI-matching group set (`uv sync --frozen --all-extras --group test`, mirroring `tests.yaml`), never `--all-groups`: `--all-groups` pulls in the `typing`/`docs` groups whose imports perturb process-global-state-dependent tests (logging config, default theme) into spurious failures, while a default-only `uv sync` instead strips the `test` group (no `pytest`) and the `typing` group that holds mypy's third-party stubs — so a full-scope `<cmd> run mypy` then floods `import-untyped`/`import-not-found` in files the cycle never touched (even `pytest` reads as `import-not-found`). Both are venv-provisioning artifacts, not code regressions: re-sync to the CI-matching groups before re-running the gate, and trust CI's `lint.yaml`/`tests.yaml` over a local gate re-run against a churned venv (`lint.yaml` on the prior `HEAD` reporting exactly the real error set, and none of the stub noise, is the authoritative mypy signal).
137+
- **Reproducing a platform-specific failure churns the shared venv, and the wrong re-sync then reddens the rest of the gate with artifacts.** Confirming a free-threaded or version-specific break with `uv run --python <other>` (e.g. `3.14t` for a free-threading race) recreates and repoints `.venv` to that interpreter. Restore it with `uv sync --frozen --all-extras --group test --group typing`: `test` mirrors `tests.yaml`, and `typing` — stubs-only, so it cannot perturb a test at runtime — is what keeps the gate's own `<cmd> run mypy` honest, since a venv synced without it floods `import-untyped`/`import-not-found` in files the cycle never touched (even `pytest` reads as `import-not-found`), a false red the restore itself manufactures. Never `--all-groups`: it additionally pulls in the `docs` group whose imports perturb process-global-state-dependent tests (logging config, default theme) into spurious failures, while a default-only `uv sync` strips both needed groups (no `pytest` at all). All of these are venv-provisioning artifacts, not code regressions: re-sync to the CI-matching groups before re-running the gate, and trust CI's `lint.yaml`/`tests.yaml` over a local gate re-run against a churned venv (`lint.yaml` on the prior `HEAD` reporting exactly the real error set, and none of the stub noise, is the authoritative mypy signal).
138138

139139
### 3. Version advisory (never bumps, never blocks)
140140

0 commit comments

Comments
 (0)