Prepare Modrinth publication at version 0.5 - #10
Merged
Conversation
Add versioned Modrinth listing copy under docs/modrinth so the project page is reviewed in the repository rather than typed into the web editor, and wire it into the release build. - Version 0.5 across gradle.properties, both workflows, changelog, and READMEs. - Minotaur now publishes description.md and changelog-<version>.md, with a fail-closed guard: an absent file would otherwise blank the project page or publish an empty changelog silently. - Pre-1.0 versions publish to Modrinth's beta channel, derived from the version string. - Narrow .gitignore from `docs` to `docs/superpowers/`. The broad rule ignored the whole docs tree, so these release materials would never have been committed; docs/testing only survived because it was already tracked. - Correct the stale release gate that said to pre-set the Modrinth project environment. Modrinth derives project type and client/server environment from the first uploaded version; the v2 client_side/server_side fields are accepted and ignored. It is now a post-upload verification step. Applied to the draft project (7ASe2LUq): summary, description, icon, license, links, and categories. It remains draft/private and no version is uploaded. The manual audio checklist and the Forest track attribution are still open gates before anything is published. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Bumping the version required editing six places that would break the release
and eight more that would silently rot. It is now one line.
- Workflows use biometunes-*.jar / biometunes-soundpack-*.zip globs instead of
naming the version, so a bump can no longer leave the release job uploading
nothing after it has already passed the tag check.
- build.gradle.kts reads minecraft_version instead of repeating "26.2" in the
Modrinth version name and gameVersions.
- fabric.mod.json now templates the loader, Kotlin, Minecraft, and Mod Menu
versions from gradle.properties, which previously restated all four. The
file already expanded ${version}, so the mechanism existed and was unused.
- verifyDistributionArchives expands every placeholder processResources
declares rather than only ${version}, keeping its "no unexpanded
placeholder" assertion meaningful as placeholders are added.
- Docs use <version> placeholders and generic tag wording.
Apply the base plugin to the root project. Every root plugin was `apply false`,
so the root had no clean task and `./gradlew clean` never emptied
build/distributions; stale soundpack ZIPs accumulated indefinitely. The
hardcoded paths hid this, but the archive globs would have attached every stale
ZIP to a release built from a dirty tree.
Also slim docs/modrinth to what actually changes with a release: the project
description and per-version changelog, which are republished on every upload,
plus the icon. Categories, license, links, and summary are set once in the web
UI and no longer need a JSON file and a 67-line apply script to manage.
Verified by bumping mod_version to 9.9 with no other edit: archives, manifest,
and Modrinth metadata all followed. 73/73 tests pass.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Gitignore docs/ as requested. The Modrinth description and per-version
changelog are build inputs, not documentation, so they move to
apps/mod/modrinth beside the build file that publishes them.
Leaving them under an ignored docs/ would have failed in the worst way: the
build workflow does not run the modrinth task, so CI would have stayed green
and only release.yml would have aborted mid-release on a fresh checkout with
"Missing Modrinth changelog".
- apps/mod/modrinth/{description.md,changelog-<version>.md,icon.png} are now
the build inputs; build.gradle.kts resolves them project-relative.
- apps/mod/modrinth/README.md keeps the release gates and procedure tracked,
including the two that still block publication: the manual audio checklist
has never been run, and the Forest track has no recorded composer.
- docs/testing/manual-audio-checklist.md and the old checklist are untracked
but remain on disk locally; they are point-in-time records.
Verified a clone contains only the four apps/mod/modrinth files and no docs/,
and that the fail-closed changelog guard still fires from the new path.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Code review found that the release pipeline never published the project description, and that a missing changelog failed only after the GitHub release was already public. - `modrinth` is now finalized by `modrinthSyncBody`. Minotaur splits publication across two tasks and `TaskModrinthUpload` has no reference to syncBodyFrom; `TaskModrinthSyncBody` is the only task that calls the project-modify endpoint. The workflow ran only `:apps:mod:modrinth`, so the description would never have left the repository while the docs told maintainers not to edit it in the web editor. - Add `verifyReleaseCopy`, wired into `check`, asserting the description and this version's changelog exist and are non-empty. Previously a version bump without a changelog built clean and aborted at the upload step, which runs after action-gh-release, leaving a published GitHub release and a consumed RELEASE_APPROVED_TAG. - Restore the 17-row manual audio checklist to apps/mod/modrinth. Ignoring docs/ had untracked it, leaving the release blocked on a gate that no longer existed in the repository. - Define the fabric.mod.json placeholder map once in the root build and share it with :apps:mod, so adding a placeholder is one edit rather than three and the validator provably expands the set the build declares. - Require MODRINTH_TOKEN and MODRINTH_PROJECT_ID to be non-blank; unset GitHub secrets arrive as empty strings and surfaced as an opaque 401. - Set escapeBackslash on the Groovy expand() so a future escaped quote in fabric.mod.json cannot be silently mangled. Verified: both guards fire (missing and empty changelog), the task graph now runs verifyReleaseCopy -> modrinth -> modrinthSyncBody, and a one-line bump to 9.9 still produces correctly named and templated artifacts. 73/73 tests pass. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The soundpack imported from BiomeTunes/soundpack did not record who wrote forest.ogg, so the catalog and the credits carried a "Legacy soundpack — artist not recorded" placeholder rather than an attribution. The composer is now confirmed. ResourceConsistencyTest requires every artist in the track catalog to appear in the soundpack credits, so the catalog and the README change together.
With the Forest composer credited in the catalog, the project description no longer needs a placeholder row and a request for the composer to come forward, and the release changelog no longer lists the missing credit as a known limitation. This clears one of the two gates blocking publication. The manual audio checklist remains outstanding.
PlaybackController tracked playback as a two-state machine, Playing or Crossfading, holding one outgoing and one incoming track. Anything that did not fit that shape had to restart: interrupting a fade, losing an audio handle, or changing the crossfade duration mid-fade reset progress and cut to the new track, which is audible as a jump rather than a fade. Replace it with a voice model. Every live track is a Voice owning its own fade progress. Each tick the desired voice steps toward full gain and every other voice steps toward silence, and a voice is disposed only once it is inaudible. Progress is never reset or reassigned, so an interruption changes only where a voice is heading, never where it currently is. - equalPowerGains(progress) returning a pair is replaced by equalPowerGain applied per voice, since gains are no longer paired. - update() takes advanceFade, false while the game is paused. Minecraft keeps ticking the client but stops pushing tickable sound volumes to the device, so advancing while paused applied the entire skipped fade in one step on resume. - A failed start is remembered with a cooldown instead of being retried every tick. 76 tests pass, up from 73.
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.
Sets the version to 0.5 and adds versioned Modrinth listing copy under
docs/modrinth(summary, description, per-version changelog, project metadata, icon, and a publishing checklist), so the project page is reviewed here rather than typed into the web editor. Minotaur now publishesdescription.mdandchangelog-<version>.mdwith a fail-closed guard, since an absent file would otherwise blank the project page or publish an empty changelog silently, and pre-1.0 versions go to the beta channel.Two fixes worth calling out:
.gitignoreignored the wholedocstree, so these release materials would never have been committed (docs/testingonly survived because it was already tracked); and the release gate telling maintainers to pre-set the Modrinth project environment was stale, because Modrinth derives project type and client/server environment from the first uploaded version and silently ignores the v2client_side/server_sidefields.The draft project (
7ASe2LUq) has been populated and remains draft/private with no version uploaded. Verified with./gradlew clean build packageSoundpack verifyDistributionArchives(73/73 tests, artifacts renamed to 0.5), plus a negative test confirming the changelog guard aborts before any upload.Still blocking publication: all 17 rows of the manual audio checklist are
PENDING HUMAN VERIFICATION, and the Forest track has no recorded composer (the description says attribution is pending rather than inventing one).🤖 Generated with Claude Code