ci(changelog): draft flox/flox release copy with Muse Spark - #101
Merged
Merged
Conversation
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Automations to automatically generate PRs for you. |
djsauble
force-pushed
the
daniel/changelog-drafted-copy
branch
from
September 25, 2026 19:13
f315426 to
e138393
Compare
djsauble
marked this pull request as draft
October 1, 2026 15:34
djsauble
force-pushed
the
daniel/changelog-drafted-copy
branch
from
October 1, 2026 23:44
e138393 to
1f84ef8
Compare
djsauble
force-pushed
the
daniel/changelog-drafted-copy
branch
from
October 2, 2026 00:03
1f84ef8 to
b8bbc18
Compare
djsauble
force-pushed
the
daniel/changelog-drafted-copy
branch
from
October 2, 2026 00:17
b8bbc18 to
671e24e
Compare
djsauble
force-pushed
the
daniel/changelog-drafted-copy
branch
from
October 2, 2026 00:28
4cdf415 to
197d0c0
Compare
djsauble
force-pushed
the
daniel/changelog-drafted-copy
branch
from
October 2, 2026 00:32
197d0c0 to
ce1bff0
Compare
djsauble
force-pushed
the
daniel/changelog-drafted-copy
branch
from
October 2, 2026 00:40
ce1bff0 to
599747a
Compare
djsauble
force-pushed
the
daniel/changelog-drafted-copy
branch
from
October 2, 2026 00:55
599747a to
8397435
Compare
djsauble
marked this pull request as ready for review
October 2, 2026 01:26
The changelog stub workflow opens a PR with a placeholder entry for each new release, and a human rewrites it every time. For flox/flox, scripts/changelog-draft.py now drafts the real entry from the release notes. It sends one request to the Meta Model API (muse-spark-1.3-contributor, with the META_MUSE_CI_API_KEY secret) and checks the answer. The model has no tools and runs nothing on the runner. The model writes one line per paragraph and the script wraps the lines, because the model made mistakes when it wrapped them itself. Unsafe MDX or anything credential-shaped rejects the draft, and broken or off-site links keep the PR a draft. A clean entry opens ready for review. Any other failure falls back to the placeholder, and the PR body says why. The API often answers a good request with a 404, so failed requests are retried up to six times within 15 minutes. If the API is still unavailable and the release is under three days old, the run opens no PR and the next daily run drafts again. After three days the release gets the placeholder. Running the workflow by hand with a draft_tag input drafts that release again and shows the result in the run summary without opening a PR. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0119mtrNDJ1mgkQortTt9JJb
djsauble
force-pushed
the
daniel/changelog-drafted-copy
branch
from
October 2, 2026 01:28
8397435 to
b563cf5
Compare
smorin
approved these changes
Oct 2, 2026
This branch was successfully deployed
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
The Changelog release stubs workflow opens a PR for each new flox/flox release with a placeholder entry, and a human rewrites it every time. With this change,
scripts/changelog-draft.pydrafts the real entry from the release notes with Muse Spark, through one direct request to the Meta Model API. When every automated check passes, the PR opens ready for review, so the maintainer only has to review, approve, and merge.This replaces the earlier version of this PR, which used
anthropics/claude-code-actionand needed aCLAUDE_CODE_OAUTH_TOKENsecret. No one needs to run/install-github-appnow.Needs
META_MUSE_CI_API_KEY, which already exists in this repo (it was added for #105). This PR doesn't depend on #105 merging or onMUSE_CI_ENABLED. Without the secret, releases get today's placeholder, and the PR body saysThe copy was not drafted automatically: the META_MUSE_CI_API_KEY secret is not set.Design
One new step, Draft release copy, runs
scripts/changelog-draft.py(Python stdlib only). A failure never fails the job. It falls back to the placeholder, or, when the API is unavailable, waits for the next daily run.developermessage. They are built only from this repo and the validated tag, date, and URL.usermessage, next to an index of docs pages with their Mintlify anchors and every man page.response_formatis a strict JSON schema:{body, reviewer_notes}.https://api.meta.ai/v1/chat/completionswith modelmuse-spark-1.3-contributor, at the API's default reasoning effort.@in the notes is neutralized so they can't ping anyone.changelog-stub.sh, unchanged except for an optionalCHANGELOG_BODY_FILE). It still writes the<Update>wrapper and thechangelog-idmarker, so dedupe is untouched. Placeholder output is byte-identical to before.Scope stays flox/flox only. Private floxhub release notes never reach a public PR unreviewed, and they never reach the model.
Ready vs. draft. A clean draft opens ready for review; a placeholder, or a draft with flagged links, opens as a draft.
Testing input. Running the workflow by hand with
draft_tagset to a flox/flox release tag drafts that release again, whether or not it has an entry, and shows the entry and PR body in the run summary. It opens no PR, and it fails when nothing was drafted.Testing
Live runs of this workflow on this branch. 64
draft_tagruns across six releases (v1.13.0 to v1.17.0), 57 of which produced an entry. The last three ran on the final commit, rebased onto #105, and all three drafted an entry.highused the same reasoning tokens as the default (about 9,200 per draft).xhighused about 14,500 and took longer, with the same kinds of small mistakes. Left at the default.hook.on-deactivatethat the notes never mention. After the prompt told it to use only the notes' own examples: 0 of 4.The API is unreliable. About half of all requests in these runs (50 of 107) came back as
HTTP 404: The requested model was not found, for a model that answered other requests in the same minute. It didn't depend on the release, the reasoning effort, the runner's region, or how many runs were in flight, and it tended to repeat within a run. With one attempt, 1 of 9 runs failed; with three, 3 of 19; with six over 15 minutes, 3 of 36. That is why an unavailable API now puts drafting off to the next daily run instead of settling for the placeholder.I read about half of the entries against their release notes. Claims trace to the notes, with occasional loose wording a reviewer would tighten, such as saying
flox publishno longer sends credentials fromsshremotes when only the password is dropped.Two paths haven't run live, because no release is waiting: the step that opens a real PR, and the deferral to the next daily run. The first is the existing
peter-evans/create-pull-requeststep with three inputs changed (draft,body-path, and the commit message). The second is covered by the offline tests of the script'sdeferoutput, plus one added condition on the insert and PR steps.Other checks:
changelog-stub.sh,mint validatepasses andmint broken-links --check-anchorsreports exactly what it reports onmain.actionlintis clean apart from one existing SC2129 style hint in the untouched "Determine mode" step.Sample output (v1.17.0)
An entry from the final batch (run 36946127744), verbatim:
The model's notes, verbatim as they appear in the PR body:
Risks
draft_tagand paste the entry in. The same applies when the model's answer is rejected, which gets the placeholder at once.changelog.mdx, because aBlockIgnoresrule in.vale.iniskips everything between the page's first{and last}.muse-spark-1.3-contributoris named in the script. When Meta retires it, drafting fails back to the placeholder until the constant is bumped. The PR body names the model that ran.🤖 Generated with Claude Code
https://claude.ai/code/session_0119mtrNDJ1mgkQortTt9JJb