docs(specs): correct the renovate design after adversarial review - #11
Merged
Conversation
An adversarial re-verification pass over the Renovate deliverable (four claim reviews, each independently re-derived then refuted, plus a completeness critique) found two defects that would have shipped: - The packageRules entry was under-scoped. matchDepNames matches depName only; the mise manager surfaces mise.toml's pin as depName `uv` while the github-actions manager extracts setup-uv's `version:` input as `astral-sh/uv`. The rule would have silenced the mise side and left all five workflow inputs free to bump, causing the desync it was written to prevent. Corrected to matchPackageNames: ["astral-sh/uv"], which covers both without touching the action's own digest pin. - Renovate has no manager named `uv`; pep621 reads pyproject.toml and uv.lock and must stay enabled. A top-level "uv" key is an invalid option that aborts the repository run rather than disabling anything. The spec also predates gaps #1-#5 and #8, so several premises had gone stale: the harness now has a pre-commit config, a `just ci`, a `just audit` with a pinned pip-audit, and five uvx pins rather than one. Every test_generation.py citation was stale. Records three findings no prior document had: lockFileMaintenance is the load-bearing line (all dev deps are capped ranges, so pep621's `replace` strategy opens no PRs for in-range releases, including the spec's own motivating examples); no Renovate manager can see the template layer because every file there is .jinja, so a pin-parity policy test is a precondition rather than a follow-up; and the template ships "pre-commit": {enabled: true} alongside bare-SHA revs, which now needs an explicit decision. Resequences accordingly — tag, parity test, enable the app for its reversible onboarding dry run, branch protection, then the config. The app was confirmed never enabled and main carries no branch protection, both of which the sequence previously assumed away.
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.
Summary
Gap #6 of the dogfooding-gap audit (adopt Renovate on the maintainer repo) was about to be implemented from a design whose two central config decisions were wrong. This amends the design spec before any
renovate.jsonis written.Changes
packageRulesentry frommatchDepNames: ["uv"]tomatchPackageNames: ["astral-sh/uv"].matchDepNamesmatches depName only. Renovate'smisemanager surfacesmise.toml's pin as depNameuv, but itsgithub-actionsmanager extractsastral-sh/setup-uv'sversion:input asastral-sh/uv. The original rule would have silenced themise.tomlsite while leaving all five workflow inputs free to bump — causing the desync it was written to prevent. The shared packageName covers both, and does not touch the action's own digest pin.uvmanager exists.pep621is the manager readingpyproject.toml/uv.lock, and it must stay enabled. A top-level"uv"key is an invalid configuration option that aborts the repository run, so the config would have looked like it closed the gap while producing zero PRs.lockFileMaintenanceis load-bearing (all dev deps are capped ranges, sopep621'sreplacestrategy opens no PRs for in-range releases — including the spec's own motivating examples); no manager can see thetemplate/layer because every file there is.jinja, promoting a pin-parity test from follow-up to precondition; and the template ships"pre-commit": {enabled: true}alongside bare-SHA revs, which now needs an explicit decision. Sequence reordered to tag → parity test → enable app → branch protection → config.Testing
just policy— 5 passed (the docs-can't-lie and SHA-pin gates readAGENTS.md, untouched here).uv run pre-commit run --all-files— merge-conflict, end-of-file, and trailing-whitespace hooks passed; ruff hooks skipped (no Python files).uvxpins (justfile:60,70;test-template.yml:54,106,108), the sixuvsites (mise.toml:3;test-template.yml:31,49,65,81,101), the capped dev-dep ranges (pyproject.toml:17-25), and the staletest_generation.pycitations (:788/:797/:802→:825/:834/:836-839).Notes for reviewers
renovate.jsonis added and no Renovate behaviour changes.pre-commitmanager's bare-SHA handling is a static source trace, not an executed run (a second, independent reason to keep that manager off is recorded, which holds regardless); and "the Mend app has never been enabled" is an argument from absence, since direct installation queries are blocked by token scope.main(confirmed absent —/branches/main/protectionreturns 404,/rulesetsreturns[]). Without the latter, the parity guards this design relies on are advisory, since nothing blocks a merge past a failing check.Related
docs/superpowers/specs/2026-06-25-dependency-inventory-design.md; implements no part of it.docs/superpowers/plans/2026-07-01-dogfood-gap-audit.md, whose wiring bullets carry the same two defects and should be corrected when that gap is implemented.