Skip to content

docs(specs): correct the renovate design after adversarial review - #11

Merged
maybebyte merged 1 commit into
mainfrom
docs/amend-renovate-design
Aug 4, 2026
Merged

docs(specs): correct the renovate design after adversarial review#11
maybebyte merged 1 commit into
mainfrom
docs/amend-renovate-design

Conversation

@maybebyte

Copy link
Copy Markdown
Owner

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.json is written.

Changes

  • Corrected the packageRules entry from matchDepNames: ["uv"] to matchPackageNames: ["astral-sh/uv"]. matchDepNames matches depName only. Renovate's mise manager surfaces mise.toml's pin as depName uv, but its github-actions manager extracts astral-sh/setup-uv's version: input as astral-sh/uv. The original rule would have silenced the mise.toml site 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.
  • Corrected the claim that a uv manager exists. pep621 is the manager reading pyproject.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.
  • Refreshed premises invalidated by gaps docs(specs): add dependency-inventory design spec #1docs(plans): add dogfooding-gap audit of shipped guardrails #5 and feat(audit): dogfood the pip-audit dependency-audit gate on the maintainer repo #8, and recorded three findings no prior document had: lockFileMaintenance is load-bearing (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 manager can see the template/ 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

  • Docs-only change; no automated tests apply. just policy — 5 passed (the docs-can't-lie and SHA-pin gates read AGENTS.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).
  • Corrections cross-checked against the repo: the five uvx pins (justfile:60,70; test-template.yml:54,106,108), the six uv sites (mise.toml:3; test-template.yml:31,49,65,81,101), the capped dev-dep ranges (pyproject.toml:17-25), and the stale test_generation.py citations (:788/:797/:802:825/:834/:836-839).

Notes for reviewers

  • Inert on merge — this changes a design document only. No renovate.json is added and no Renovate behaviour changes.
  • Two claims are deliberately marked as unconfirmed in the spec rather than asserted: the pre-commit manager'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.
  • Two operator preconditions are now on the critical path and cannot be done from the implementation side: enabling the Mend Renovate app, and adding branch protection to main (confirmed absent — /branches/main/protection returns 404, /rulesets returns []). Without the latter, the parity guards this design relies on are advisory, since nothing blocks a merge past a failing check.

Related

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.
@maybebyte
maybebyte merged commit 67aaeab into main Aug 4, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant