fix(toolchain): python.yaml pyright skip granularity + config-glob + opt-in wording gaps#1025
fix(toolchain): python.yaml pyright skip granularity + config-glob + opt-in wording gaps#1025kyle-sexton wants to merge 1 commit into
Conversation
…opt-in wording gaps Three PR #859 review follow-ups on the bundled python ecosystem default, batched via the #657 triage sweep: - Site 1: document pyright as a hard prerequisite of the python default once ruff config opts the ecosystem in (context/python.md). Tool presence is evaluated per ecosystem, not per tool, so a ruff-configured project with pyright absent reports a whole-ecosystem missing-tool skip that drops ruff coverage — the doc now says to install pyright alongside ruff. Chose the documented-prerequisite option over per-tool skip granularity per the issue's defaulted decision (smaller, reversible; the larger cross-ecosystem skip-mechanism change is not warranted here). - Site 2: add pyrightconfig.json to the python detection globs so a standalone pyright-config-only change is auto-detected by /toolchain:check and /toolchain:lint local runs. - Site 3: reduce the opt-in value to its single ruff-config gating condition. The trailing semicolon-separated pyright-mode clause structurally resembled the multi-clause per-tool opt-in form (per the ecosystem-commands contract), risking a misread of python's single-condition gate as multi-condition. Removed rather than reworded: opt-in is a condition field, not a mode note, and the descriptive pyright-mode text already lives in context/python.md gotchas (SSOT). Version 0.9.0 -> 0.9.1 + CHANGELOG. Verification: check-jsonschema (ecosystem.schema.json) ok; markdownlint 0 errors; typos clean; plugin-manifest schema ok. Closes #1017. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 21s —— View job PR Review
Verdict: Approve with one minor omission noted. All three fixes are correct, internally consistent, and well-scoped. No security concerns. One small gap and two editorial observations below. Site 2 —
|
|
Claude finished @kyle-sexton's task in 1m 26s —— View job Security Review — PR #1025
No security issues found. The four changed files are purely documentation and static configuration — no executable code paths, no injection surfaces, no credential handling, no authorization changes, and no supply chain exposure.
Rationale for each category checked:
|
|
🔒 merge-drive lane claiming this PR for on-branch fix work this cycle (amendment-round: 16, worker tier). Will fix clear branch-owned CI/bot findings, defer non-DEFER-FORBIDDEN items with reply+resolve, push, then re-check the merge gate. |
|
Claude finished @kyle-sexton's task in 1m 21s —— View job PR Review
Verdict: Approve with one minor omission still outstanding. All three fixes are correct and internally consistent. The gap flagged in the previous review cycle (2026-07-22) has not yet been resolved. Outstanding gap —
|
|
Claude finished @kyle-sexton's task in 1m 2s —— View job Security Review — PR #1025
No security issues found. All four changed files are documentation and static configuration — no executable code paths, no injection surfaces, no credential handling, no authorization changes, and no supply-chain exposure.
Rationale per category checked:
|
Summary
Three mature, well-scoped follow-up findings on the bundled python ecosystem default
(
plugins/toolchain/reference/ecosystems/python.yamland its owning check-skill context doc),deferred from PR #859's review threads and batched here via the #657 triage sweep. All three are
scoped to the python ecosystem surface; no cross-ecosystem mechanism changes.
Fix
Site 1 (P1) — pyright skip granularity.
uv run pyrightis the firstcheck-cmdtool whosepresence is not implied by the ruff-config opt-in gate, and tool presence is evaluated per
ecosystem, not per tool (per the check skill's tool-presence rule). So a ruff-configured project
with pyright absent reports a whole-ecosystem missing-tool
skipthat also drops ruff coverage,rather than skipping pyright alone.
Chose the issue's defaulted decision — document pyright as a hard prerequisite of the python
default once ruff opts the ecosystem in (
skills/check/context/python.md, Type-check section) —over a per-tool skip-granularity code change. Rationale: per-tool skip is a larger cross-ecosystem
mechanism change (every
check-cmdtool would need independent-skip semantics); the documentedprerequisite is the smaller, reversible fix that resolves the reported fail-closed surprise without
redesigning the skip model. A maintainer wanting the larger mechanism can veto and redirect.
Site 2 (P2) — detection globs. Added
pyrightconfig.jsonto the pythonglobsso a standalonepyright-config-only change is auto-detected as python-affecting by
/toolchain:checkand/toolchain:lintlocal runs (CI already enforces its own check). The[tool.pyright]table isalready covered by the existing
pyproject.tomlglob.Site 3 (P2) — opt-in wording. Reduced the
opt-invalue to its single ruff-config gatingcondition. The trailing semicolon-separated pyright-mode clause structurally resembled the
multi-clause per-tool
opt-inform (per the ecosystem-commands contract, whose schema definesopt-inas either a single whole-check-cmdcondition or a per-tool multi-clause value), riskinga misread of python's single-condition gate as multi-condition. Removed rather than reworded:
opt-inis a condition field, not a mode note, and the descriptive pyright-mode text already livesverbatim in
skills/check/context/python.mdgotchas (single source of truth — no duplication). Thereduced value is now identical to the contract's own clean example
(
docs/conventions/ecosystem-commands/examples/python.yaml), confirming the intended single-conditionform.
Includes the per-plugin version bump (
0.9.0→0.9.1, patch — scoped bugfix/hardening) and amatching top-inserted
CHANGELOG.mdentry.Verification
Ran against the changed files in the worktree:
(
/toolchain:checkand/toolchain:lintare model-driven skills, not runnable scripts; theecosystem YAML is validated against its published
ecosystem.schema.jsoncontract as the concretestatic gate. No CI lane enforces the ecosystem schema — it is a reference contract — so the schema
run above is the authoritative structural check for the YAML edit.)
Related
🤖 Generated with Claude Code
Work-class: C3 (bug-fix-shaped) — attended triage 2026-07-23, operator-ratified. 🤖