Ingest Gradle Upgrade
SkillDocs & knowledgeIngests a Gradle wrapper upgrade for this repository: reads the release notes, upgrade guides, and linked documentation for the version upgraded to, then updates this repo's own code/tooling and the shipped Gradle MCP skills (src/main/skills/*) so everything stays accurate for that version.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Ingest Gradle Upgrade skill
What this skill tells your AI
The instructions your AI receives, as published by rnett/gradle-mcp in .junie/skills/ingest-gradle-upgrade/SKILL.md and read by ahel’s review.
Post-upgrade maintenance process for this repository. After the Gradle wrapper version is bumped, ingest the release notes, upgrade guides, and linked documentation for the new version, then update (a) this repo's code and tooling, (b) the shipped Gradle MCP skills under src/main/skills/, and (c) the generated best-practices corpus, so everything stays accurate for the new version.
More info: Do all documentation research through gradle_docs pinned to explicit versions: gradle_docs(path="release-notes.md", version="<v>"), gradle_docs(path="userguide/upgrading_version_<N>.md", version="<v>"), and gradle_docs(query="tag:<scope> <term>", version="<v>") with scopes userguide, dsl, release-notes, best-practices, upgrading, javadoc, samples. Version resolution is explicit version → wrapper auto-detection via projectRoot → latest stable; always pass version explicitly here, because old and new behavior must be distinguished. Use gradle_docs(path=".", version="<v>") to list a version's doc page tree. Sourcing boundary: release enumeration (which versions exist and must be read) comes from the official versions metadata endpoint https://services.gradle.org/versions/all (workflow step 2.1) and supplies version metadata only; all documentation content is read exclusively through gradle_docs.
Before You Start
- Confirm the wrapper bump exists (or is part of this task):
gradle/wrapper/gradle-wrapper.propertiesdiffers from the last recorded version. - Establish the OLD version before reading anything — git history of the wrapper properties file is the only reliable source (Workflow step 1).
- Plan for both halves up front: (a) repo code/tooling and (b) shipped skills. Neither half is optional; a "no impact" conclusion for either still requires explicit triage evidence in the ledger.
Scope
In scope:
- This repo's own code and tooling: build scripts, the Tooling API layer, init scripts, docs/version services, tests.
- Shipped skills under
src/main/skills/: SKILL.md bodies, references, compatibility tables, lifecycle language, andgradle_docspointers. - The generated best-practices corpus — regenerated, never hand-edited.
- Records: wrapper version line in
.junie/playbook.md;Build Verificationrecord inAGENTS.md.
Out of scope: the wrapper bump itself; changes to other projects; new feature work discovered while reading the notes (record as follow-ups, do not implement here).
Constitution
- The wrapper properties file is the NEW-version source of truth. Parse NEW from
distributionUrlingradle/wrapper/gradle-wrapper.properties; never take the version from memory, doc prose, or an unrelated Gradle installation. - OLD comes from git history.
git log -p gradle/wrapper/gradle-wrapper.properties(previousdistributionUrl), falling back to.junie/playbook.md; otherwise ask. Never guess. - Pin every docs lookup to an explicit version.
version="<NEW>"for new docs,version="<OLD>"when comparing old behavior; default resolution can silently read the wrong version's docs. - Canonical enumeration only. The release-notes reading set comes from the official final-releases list (step 2.1); upgrade-guide block selection comes from the anchor rule
OLD < T <= NEWapplied within every spanned version-family guide (step 3.1). Never derive either set from heading prose or memory. - Sourcing boundary. All documentation content — release notes, upgrade guides, and linked documentation pages — is read exclusively through
gradle_docs, never from web-search paraphrase. The only sanctioned non-gradle_docssource is the official versions metadata endpointhttps://services.gradle.org/versions/all(step 2.1), which is used solely to enumerate which releases exist; it supplies version metadata and nothing else. - One ledger, one disposition unit. The ledger's row unit is the material item: every material item in every walked source gets exactly one row. Walked source units that contain zero material items — top-level release-notes sections, in-range upgrade-guide blocks, crossed-major guide sections — each get exactly one sentinel row (
no material items — <reason>); sentinel rows are coverage evidence, not dispositions. Every change traces to a ledger row. - Regenerate, don't hand-edit, the best-practices corpus.
generateBestPracticesDocowns that content. - Shipped-skill edits follow the shipped-skill rules. Load Shipped Skills Update Checklist before touching
src/main/skills/. - Ingestion ends in verification.
./gradlew checkgreen (or green except explicitly named known pre-existing failures), plus an updated.junie/playbook.md. - The ingested version is CURRENT, not future. Facts about NEW behavior that describe the current state of Gradle are written as plain current-state guidance, with no version label. Version anchors (
**Gradle N:**/as of N) are reserved for version-specific facts — behavior only true under the ingested version (deprecation/removal timelines, incubating or lifecycle status, version numbers, transitional previews) — and for past notes about older versions. Never writeN+-suffixed future-labelled notes (e.g.**9.7+:**): anN+suffix claims the fact holds for every later version and becomes wrong as soon as the next version ships, while anchored notes age into past notes naturally as later versions ship.
Materiality and the Ledger Contract
The impact ledger is the single work queue. Its row unit is the material item — one row per material item, per walked source:
- Release notes: one row per material entry (a leaf entry in any walked section of any release-notes document read).
- Within-major upgrade-guide blocks: one row per material item inside each in-range
changes_Tblock, across every spanned version-family guide (upgrading_version_<M>.mdfor every majorMwithmajor(OLD) <= M <= major(NEW)). The Source column carries the family page, the block anchor, and the heading text in the formupgrading_version_<M>.md#changes_<T> (<heading text>); for OLD=9.4.1, NEW=9.6.1 the two in-range row groups are sourcedupgrading_version_9.md#changes_9.5.0 (Upgrading from 9.4.0 and earlier)andupgrading_version_9.md#changes_9.6.0 (Upgrading from 9.5.0 and earlier). - Crossed-major guide sections: one row per material item inside each walked section of each crossed-major guide. The Source column carries the guide and section in the form
upgrading_major_version_<N> (<section heading>). - Sentinel rows — the sole exception to the item unit. Every walked source unit that contains zero material items — a top-level release-notes section, an in-range
changes_Tblock, or a crossed-major guide section — gets exactly one row readingno material items — <one-line reason>. Sentinel rows are coverage evidence that the unit was walked, not dispositions; they never replace item rows where material items exist.
An entry is material if it meets ANY of:
- It changes a Gradle, Tooling, or init-script API/behavior that this repo calls or parses (mapped surfaces: Release Notes Impact Map, Tables A and C).
- It changes guidance, a compatibility claim, or a
gradle_docs(path=...)pointer present insrc/main/skills/(Table A skill column, Table B). - It changes a feature's lifecycle status — incubating → stable promotion, deprecation, or removal — for any feature this repo or its shipped skills mention.
- It fixes an issue this repo works around (workaround comments, issue numbers, known-issue caveats in code or skills).
- It introduces a known issue affecting a flow this repo drives (build execution, output parsing, dependency reporting, REPL, docs ingestion).
- It adds, renames, moves, or removes a documentation page that a shipped skill or this skill points to.
Everything else is non-material and needs no row of its own — the sentinel row of its containing unit records that the unit was walked and why nothing in it is material ("Android Studio integration only; no mapped surface" is a typical reason).
Ledger columns:
| # | Source (version + section, or family page + block anchor) | Item | Domain (Table A) | Project-code impact | Shipped-skill impact | Disposition |
Completeness check before leaving step 4: every material item in every walked source has exactly one row, and every walked source unit with zero material items — every top-level section of every release-notes document read, every in-range changes_T block across all spanned version-family guides, every crossed-major guide section walked — has exactly one sentinel row.
Workflows
1. Establish the Version Delta
- Read
gradle/wrapper/gradle-wrapper.propertiesand parse NEW fromdistributionUrl; the distribution filename carries the version, sogradle-9.7.0-bin.zipparses to NEW =9.7.0. - Establish OLD from
git log -p gradle/wrapper/gradle-wrapper.properties(previousdistributionUrl); fall back to the wrapper version recorded in.junie/playbook.md; otherwise ask. Never guess. - Classify the delta — this decides steps 2 and 3:
- patch-only — same major.minor, such as 9.6.0 → 9.6.1: one release-notes page; no upgrade-guide blocks in range; no major guide.
- within-major — such as 9.6.1 → 9.7.0: every final release in
(OLD, NEW]; the in-rangechanges_Tblocks of the single spanned version-family guide. - cross-major — such as 8.14 → 9.6.1: within-major rules applied to every spanned version family (the version-family guide of each major from
major(OLD)throughmajor(NEW)inclusive), plus the major upgrade guide for each crossed major.
- Confirm the bump is effective: run a trivial task through the repo's normal Gradle entry point and confirm the reported version equals NEW.
2. Read the Release Notes (deterministic version walk)
- Enumerate the reading set. Fetch the official versions metadata —
curl.exe -s https://services.gradle.org/versions/all(JSON array; the sameservices.gradle.orghost this repo already uses forversions/current). This endpoint is the sanctioned source for release enumeration and supplies version metadata only; all documentation content still comes fromgradle_docs(Constitution rule 5). Keep only final releases:snapshot == false,nightly == false,releaseNightly == false,rcFor == "",milestoneFor == "",broken == false. Sort semantically (major, minor, patch compared numerically) and select everyVwithOLD < V <= NEW. Never inject RCs/milestones/nightlies into a final-to-final range; never skip patch releases — patches have their own release-notes pages with patch-specific resolved issues. - Read each selected version. For each
Vin ascending order:gradle_docs(path="release-notes.md", version="V"). Patch pages prepend a patch-specific resolved-issues preamble and then carry the feature-release body — read both parts. - Heading tolerance. The canonical section list is a template baseline, not an invariant: ingest whatever headings are actually present. Known variation: some releases have no
Promoted features(such as 9.5.0); documentation children differ (User ManualvsDocumentation/Training);Fixed issues/Known issuesmay be present but empty (record that). There is no separate docs-changelog page — theDocumentation and trainingsection is the docs changelog. - Walk each document in this priority order, flagging material entries for the ledger (definition in Materiality and the Ledger Contract):
Upgrade instructions— note which upgrade-guide pages it points to.New features and usability improvements— walk subsections in this repo's priority order: Configuration Cache improvements; Isolated Projects; CLI, logging, and problem reporting; Test reporting and execution; Core plugin and plugin authoring enhancements; Tooling and IDE integration; Build authoring improvements; Dependency management enhancements; Performance improvements; Security and infrastructure; any other present subsections. For each material entry, follow its linked pages:gradle_docs(path="<linked page>.md", version="V"), orgradle_docs(query="tag:javadoc <type or member>", version="V")for API changes.Promoted features— list every incubating → stable promotion and any removal; these drive lifecycle-language updates in shipped skills.Fixed issues— search repo code and shipped skills for workarounds the fixes obsolete (issue numbers,workaroundmarkers, known-issue phrasing; patterns in the impact map).Known issues— flag new caveats for shipped troubleshooting content or repo docs.Documentation and training— note new, renamed, moved, or removed doc pages, then verify everygradle_docs(path=...)pointer used in shipped skills still resolves at NEW:gradle_docs(path=".", version="NEW")lists the page tree.
3. Read the Upgrade Guides (deterministic block selection)
- Version-family guides — every spanned major. For every major
Mwithmajor(OLD) <= M <= major(NEW), readgradle_docs(path="userguide/upgrading_version_<M>.md", version="NEW"). Within each family guide, blocks are anchored#changes_<T>whereTis the target feature release — the anchor version, NOT the "Upgrading from X and earlier" heading baseline. Include blockchanges_Tif and only ifOLD < T <= NEW(semantic comparison; patch values participate; every block on a family page carries aTof that family's majorM). Never derive the block set from heading text. Extract from each included block:Potential breaking changes(must fix) andDeprecations(fix the warning before it becomes a break). A same-major delta spans exactly one family guide; a cross-major delta spans one family guide per major in the closed range, and the intermediate majors' guides are mandatory, not optional. - Worked examples. Within-major: OLD=9.6.1, NEW=9.7.0 spans
upgrading_version_9.mdonly; readchanges_9.7.0only, noting thatchanges_9.7.0is headed "Upgrading from 9.6.0 and earlier" yet still applies because 9.7.0 > 9.6.1. Cross-major: OLD=7.4.0, NEW=9.6.1 spansupgrading_version_7.md,upgrading_version_8.md, andupgrading_version_9.md; include their blockschanges_Twith 7.4.0 < T <= 9.6.1 — the 7-family page's singlechanges_8.0block (that page is the 7→8 transition at 9.7.0), allchanges_8.xblocks, and thechanges_9.xblocks with T <= 9.6.0 (block anchors target feature releases;9.6.1is a patch and anchors no block) — and also read the step-3.3 transition guideupgrading_major_version_9.md(the 8→9 transition). - Cross-major transition guides. For each major
Nwithmajor(OLD) < N <= major(NEW), read that major's transition guide —gradle_docs(path="userguide/upgrading_major_version_<N>.md", version="NEW")where the page exists (9.7.0:upgrading_major_version_9.mdfor the 8→9 transition); where it does not, the transition content is thechanges_<N>.0block of the previous family page (the 7→8 transition isupgrading_version_7.md#changes_8.0). Read runtime requirements, DSL changes, plugin changes, settings-file changes, task changes, andRemoval of ...sections. These transition guides are in addition to the per-family within-major blocks of step 3.1, not a replacement for them. Same-major upgrades skip this step entirely. - Patch-only deltas have no block in range (no feature release
TsatisfiesOLD < T <= NEW) and span no major boundary — record that and skip this step. - Use
gradle_docs(query="tag:upgrading <term>", version="NEW")for targeted migration detail on a ledger item. - Check embedded Kotlin and Groovy version changes across the delta: init scripts and Kotlin DSL build logic compile against them.
4. Triage Into the Impact Ledger
Load Release Notes Impact Map. Build the ledger per the Materiality and the Ledger Contract:
- Tag each material item with exactly one domain from Table A; the map supplies the project-code surfaces and shipped-skill surfaces to open.
- For project-code impact: open the mapped surfaces (Table C) and look for the affected API, behavior, CLI flag, or output format.
- For shipped-skill impact: open the mapped skill file/section (Tables A and B) and check its claims, compatibility rows, lifecycle language, and
gradle_docspointers against the new docs. - Item matches no domain: run the impact map's discovery grep patterns, then decide.
- Run the completeness check: every material item in every walked source has exactly one ledger row, and every walked source unit with zero material items — every top-level section of every release-notes document read, every in-range
changes_Tblock across all spanned version-family guides, every crossed-major guide section walked — has exactly one sentinel row. No code or skill edits happen before the ledger is complete.
5. Update Project Code and Tooling
Work ledger items with project-code impact:
- Fix breaking changes and migrate removed/changed APIs in the Tooling API layer, build execution/event capture, dependency-report parsing, docs services, and init scripts.
- Resolve deprecations flagged by the in-range upgrade-guide blocks in
build.gradle.kts,settings.gradle.kts, and convention usage. - Update tests that assert version-sensitive behavior; add coverage where a ledger item changed behavior this repo relies on.
- If a change touches an OpenSpec-governed area (build execution, output concurrency, progress reporting, caching/search, multi-reader search), follow the matching spec under
openspec/specs/. - Run targeted tests for changed areas, then
./gradlew test.
6. Update the Shipped Skills
Load Shipped Skills Update Checklist, then work ledger items with shipped-skill impact:
- Update compatibility quick-reference tables,
Version notesblocks, and version-sensitive footguns to match NEW. Describe current-state behavior as plain guidance without a version label; use version anchors (**Gradle N:**/as of N) only for version-specific facts (lifecycle status, deprecations, version numbers, transitional behavior) and past notes. Never useN+labels; when a later version is ingested, prior current notes remain as anchored past notes — noN+relabelling is ever needed. - Apply
Promoted features: remove incubating/experimental hedges for promoted features; delete or rewrite guidance for removed features. - Apply the docs changelog from step 2.4.6: fix or replace
gradle_docs(path=...)pointers whose pages moved or disappeared; add pointers for new doc areas a skill covers. - Add new known-issue caveats to the relevant troubleshooting content; drop caveats made obsolete by fixes.
- Bump frontmatter
metadata.versionfor every skill materially changed; keep any new reference linked from its SKILL.md; respect theafterEvaluatesafety rule.
7. Regenerate the Best-Practices Corpus
Run ./gradlew generateBestPracticesDoc. The task targets -PgradleDocsVersion=<v> when passed, otherwise the running Gradle version (gradle.gradleVersion) — NEW once the wrapper bump is in effect. Regenerates cleanly means:
- The task succeeds against NEW. It fails loudly when the new docs structure breaks extraction: the failure message is
No Gradle best-practices pages were extracted for version <v>. Examined entries include: <examined entries>. If it fails, fix the:best-practices-generatormodule and rerun before proceeding. - Review the regenerated files under
build/generated/skills/authoring-gradle-builds/references/best-practices/(_index.mdplus per-section files) for material drift caused by the upgrade — sections appearing/disappearing or guidance contradicting the new release notes. Nothing is committed from this step: the output lives under the gitignoredbuild/tree and is regenerated on every build;zipSkillsmerges it intoauthoring-gradle-builds/referencesinsideskills.zip. Never hand-edit generated corpus files.
8. Verify and Record
- Run
./gradlew check verifySkillsList— unit tests (including the skill artifact safety test),verifyToolsList, theintegrationTestandtreeSitterTestsuites (both wired intocheck), and the skills-list sync check.verifySkillsListis not wired intocheck, so name it explicitly. - If execution-layer code changed, note that
integrationTestalready runs insidecheck(step 8.1); the pre-existingJavaReplIntegrationTest.initializationError/KotlinReplIntegrationTest.basic execution works()REPL failures are known — name them, don't silently tolerate new ones. - Run
./gradlew :updateToolsListonly if Kotlin tool metadata changed. - Update the records: the wrapper version line in
.junie/playbook.md; theBuild Verificationrecord (date, command, result, context) inAGENTS.md. - Report: the version delta and its class, the ledger with dispositions, skills changed with version bumps, and verification results.
Definition of Done
- Version delta documented with its class (patch-only / within-major / cross-major).
- Enumeration complete: every final release in
(OLD, NEW]read; every material item in every walked source has a ledger row, and every walked source unit with zero material items — every top-level section of every release-notes document read, every in-rangechanges_Tblock across all spanned version-family guides, every crossed-major guide section walked — has exactly one sentinel row. - All material items with project-code impact implemented and covered by tests; deprecations from in-range blocks resolved.
- All material items with shipped-skill impact applied per the shipped-skills checklist;
metadata.versionbumped where material;SkillArtifactSafetyTestandverifySkillsListpass. - Best-practices corpus regenerates cleanly against NEW (task success + drift review; generator fixed if it failed).
./gradlew checkgreen (or green except explicitly named known pre-existing failures).- Records updated: wrapper version line in
.junie/playbook.md;Build Verificationrecord inAGENTS.md.
Reference Discovery
- Load Release Notes Impact Map at step 4 (triage): release-notes domain → repo code surfaces and shipped-skill surfaces, hotspot inventories with file:line evidence, discovery grep patterns, and lifecycle-language rules.
- Load Shipped Skills Update Checklist at step 6, and before any edit under
src/main/skills/: shipping pipeline, edit rules, inventory-change procedure, corpus regeneration, and verification commands.
Signals
- GitHub stars
- 60
- Forks
- 4
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
ingest-gradle-upgrade- Source
- github.com/rnett/gradle-mcp