Skip to content

Prepare Modrinth publication at version 0.5 - #10

Merged
hampfh merged 7 commits into
masterfrom
haha/modrinth-datapack-publish
Aug 23, 2026
Merged

Prepare Modrinth publication at version 0.5#10
hampfh merged 7 commits into
masterfrom
haha/modrinth-datapack-publish

Conversation

@hampfh

@hampfh hampfh commented Aug 23, 2026

Copy link
Copy Markdown
Collaborator

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 publishes description.md and changelog-<version>.md with 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: .gitignore ignored the whole docs tree, so these release materials would never have been committed (docs/testing only 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 v2 client_side/server_side fields.

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

hampfh and others added 7 commits August 23, 2026 11:07
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.
@hampfh
hampfh merged commit 6db073a into master Aug 23, 2026
2 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