fix(deps): pin vulture, the last unpinned lint tool — and it never ran - #496
Open
ProtocolWarden wants to merge 1 commit into
Open
fix(deps): pin vulture, the last unpinned lint tool — and it never ran#496ProtocolWarden wants to merge 1 commit into
ProtocolWarden wants to merge 1 commit into
Conversation
Closes the drift class from #492. `.custodian/config.yaml` sets `vulture: true` so the audit gate runs it, but pyproject pinned only ruff, ty and custodian@SHA, and custodian-audit.yml installed vulture separately and unpinned — the same setup that let ruff float to 0.16.1 and red-fail main for a week. `vulture==2.16` now lives in [project.optional-dependencies].dev, and the separate install is gone so it arrives via `pip install -e ".[dev]"` with ruff and ty. One source of truth, no version literal in the workflow. DISCOVERED WHILE VERIFYING: the audit has never actually run vulture. vulture src tests --min-confidence=60 -> exit 3, 621 findings vulture src --min-confidence=60 tests -> exit 2, 0 lines "unrecognized arguments: tests" The second is what OC's gate runs. The SHA-pinned Custodian (d6ba8ab) builds [vulture, src_root, --min-confidence=N, tests_root] — the tests positional lands after the flag, vulture's argparse rejects it, and it exits 2 with empty stdout. That adapter version has no returncode guard, so empty stdout is indistinguishable from a clean repo and the pattern is recorded `status: pass`. The gate has been green for a tool that never analysed a line — the same vacuous-green shape #492 removed `|| true` to prevent, one layer down. NOT fixed here, deliberately. Current Custodian main fixes both halves (paths before options; TOOL_ERROR when returncode is not 0/3 with empty stdout), so bumping the SHA — worth doing anyway, since main now carries the find_tool fix from Custodian#72 — makes those 621 findings real and reds the audit. They are LOW/advisory and read as heavily false-positive (test `side_effect` attributes, pydantic `model_config`, public-API methods vulture cannot see called), so the resolution is a .vulture_whitelist.py, a higher vulture_min_confidence, or vulture: false. That is a decision about what the gate should assert, not one to make inside a pinning change. Recorded in .console/backlog.md under Up Next. Pinning does not make vulture run. It makes it deterministic, so when the SHA is bumped the 621 are a stable number to triage rather than a moving one. Also backfills .console/backlog.md — CLAUDE.md requires updating it after meaningful progress and it had not been touched since #474. Entries added for #491 and #492 alongside this work. Verified: vulture 2.16 / ruff 0.15.13 / ty 0.0.40 all resolve from the dev extras; `ruff check .` passes under the pinned ruff; audit 0 findings, exit 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes the drift class from #492, and turns up something bigger on the way.
The pin
.custodian/config.yamlsetsvulture: true, so the audit gate runs it — butpyproject.tomlpinned onlyruff==0.15.13,ty==0.0.40and custodian@SHA, whilecustodian-audit.ymlinstalled vulture separately and unpinned. That is the same setup that let ruff float to 0.16.1 and red-fail main for a week.vulture==2.16now lives in[project.optional-dependencies].dev, and the separate install is gone so it arrives viapip install -e ".[dev]"alongside ruff and ty. One source of truth, no version literal left in the workflow.What verifying it turned up
The audit has never actually run vulture. It reports
VULTURE: status=pass count=0. The tool itself disagrees:The second is what OC's gate runs. The SHA-pinned Custodian (
d6ba8ab) builds[vulture, src_root, --min-confidence=N, tests_root]— thetestspositional lands after the flag, vulture's argparse rejects it, and it exits 2 with empty stdout. That adapter version has no returncode guard, so empty stdout is indistinguishable from a clean repo and the pattern is recordedstatus: pass.The gate has been green for a tool that never analysed a line. It is the same vacuous-green shape #492 removed
|| trueto prevent — one layer down, and already present.Why this PR does not fix that
Current Custodian main fixes both halves (every path before the options, plus
TOOL_ERRORwhen the returncode is not 0/3 with empty stdout). So bumping the SHA — worth doing anyway, since main now carries thefind_toolfix from ProtocolWarden/Custodian#72 — makes those 621 findings real and reds the audit.They are LOW/advisory and read as heavily false-positive: test
side_effectattributes, pydanticmodel_config, public-API methods vulture cannot see called. The resolution is a.vulture_whitelist.py, a highervulture_min_confidence, orvulture: false. That is a decision about what the gate should assert, not one to make inside a pinning change. It is recorded in.console/backlog.mdunder Up Next.Pinning does not make vulture run. It makes it deterministic — so when the SHA is bumped, the 621 are a stable number to triage rather than a moving one.
Also
Backfills
.console/backlog.md, which CLAUDE.md requires updating after meaningful progress and which had not been touched since #474. Entries added for #491 and #492 alongside this work.Verification
vulture 2.16/ruff 0.15.13/ty 0.0.40all resolve from the dev extras.ruff check .— All checks passed, under the pinned ruff.custodian-audit.ymlparses; pre-push gate passed clean on push.🤖 Generated with Claude Code