Repository navigation
feat(release): fragment phase 3 prerequisites: Dependabot fragments, gate hints, em-dash guard - #6419
Conversation
…ent-mode plugins ADR 0048 phase 3 lists high-churn plugins in scripts/fragment-plugins.txt. Before that flip: - dependabot-plugin-bump.sh writes a patch fragment (named by new-changelog-fragment.sh, the update under ### Changed) for a fragment-mode plugin instead of bumping plugin.json and CHANGELOG.md, skips a plugin whose branch already added one, and self-checks it with check-changelog-fragments.sh --check. pr-bump-plugin-version.yml stages .changes/, which git add -u skips. - sync-shared-copies.sh, check-vendor-version-bump.sh and check-standards-contract-bump.sh tell a fragment-mode plugin to run scripts/new-changelog-fragment.sh <plugin> patch instead of bumping its version. Legacy messages are unchanged. - changelog_fragments::validate rejects an em dash outside code in a release fragment whose plugin CHANGELOG.md is in em-dash-purged-paths.txt, which the release would copy in and fail. - release-plugins.sh skips a plugin with an invalid fragment, reports it and leaves its fragments in place, and releases the rest. Part of #6006 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
PR body contract — issue linkage This PR body does not yet satisfy the issue-linkage contract:
Edit the body and this comment updates itself on the next run. |
…nd em-dash checks - The em-dash guard rejects U+2014 anywhere in a release fragment for a purged CHANGELOG.md, code included. A second fence parser missed four shapes the detector flags (tab or deep indent, mixed fence characters, list-item fences), and a miss fails the release PR. - dependabot-plugin-bump.sh treats a branch without scripts/lib/changelog-fragments.sh as all legacy instead of exiting 1, since the workflow runs main's script against the PR branch's scripts/. - In fragment mode it compares the fork point's version, so a release of the plugin on main after the fork no longer suppresses the fragment. - The fragment-count assertions no longer pass on an unmatched glob. Part of #6006 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Claude finished @kyle-sexton's task in 5m 0s —— View job Review complete
Note on base ref: the checkout is shallow and No findings to report. I read every changed script and its paired test file:
Unverified (author-claimed): I was not able to execute the test suites or |
|
Claude finished @kyle-sexton's task in 2m 48s —— View job Security review complete
No security issues found. Scope reviewed (diff only,
Instruction-surface check: this PR touches no No command/path/template injection, no secret-handling issue, and no authorization gap found in the changed files. |
|
claude-security-review has reviewed this pull request through 4597d96; a later push is reviewed from there. |
|
claude-review has reviewed this pull request through 4597d96; a later push is reviewed from there. |
…face skipped plugins The step piped release-plugins.sh into tee without pipefail, so a failed release script never failed the job. Set pipefail and keep the script's exit code. release-plugins.sh now skips a plugin whose fragments fail validation (#6419); emit a ::warning:: for each skipped plugin and list them in the release pull request body. The body's merge note now says the workflow queues the pull request itself. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Part of #6006 (ADR 0048 phase 3, part A). This lands before phase 3 adds about 10 high-churn plugins to
scripts/fragment-plugins.txt, so those plugins keep working on Dependabot PRs, in the bump gates and in the release.Changes
Dependabot (
scripts/dependabot-plugin-bump.sh,.github/workflows/pr-bump-plugin-version.yml)patchfragment throughscripts/new-changelog-fragment.sh(so it gets the same name), with### Changedfollowed by the same update lines. It does not bumpplugin.jsonorCHANGELOG.md.changelog_fragments::bump_delivered, compared against the fork point's version), so a rerun does nothing.check-changelog-fragments.sh --checkon the fragment it wrote.--check-requiredreads only the committed change set, so it cannot see the new file yet..changes/, becausegit add -uskips new files. I keptgit add -u -- pluginsas it was and added.changes/with-Aonly when that directory exists. Runninggit add -A -- plugins .changesfails withfatal: pathspec '.changes' did not match any fileswhen there is no fragment, which would break every legacy-only run.harness-ops(the dependabot.yml npm entry forplugins/harness-ops/skills/inventory/scripts/js) is the case this is for.Gate messages (
sync-shared-copies.sh,check-vendor-version-bump.sh,check-standards-contract-bump.sh)Run scripts/new-changelog-fragment.sh <plugin> patchinstead of telling you to bump the version. Plugins not in fragment mode get exactly the same messages as before.Em dash guard (
scripts/lib/changelog-fragments.sh,scripts/release-plugins.sh)changelog_fragments::validatenow rejects an em dash (U+2014) anywhere in a release fragment, code included, whenplugins/<p>/CHANGELOG.mdmatches an entry inscripts/em-dash-purged-paths.txt. It reads list entries the waycheck-purged-em-dashes.shdoes, where*matches within one path component. It does not try to copy the detector's fence parsing: a second parser missed fence shapes the detector flags, and rejecting too much is the safe direction. Without this, the release copies the em dash into the CHANGELOG and fails the release PR for every plugin.bump: nonereasons are exempt because no release copies them.release-plugins.sh: if one of a plugin's fragments is invalid, the script skips that plugin, reports it on stderr and leaves all of its fragments in place. The other plugins still release. If every plugin is skipped, it exits 0 and writes nothing.Before the flip
Dependabot PRs opened before phase 3 lists a plugin were built from a branch with the old list, so they bump the version, and
--check-bumpthen rejects that as a FRAGMENT-MODE RELEASE. Comment@dependabot rebaseon each one after the flip.Tests
Each new case failed against the
origin/mainscripts and passes now:scripts/check-changelog-fragments.test.sh: 43 passscripts/release-plugins.test.sh: 19 pass. The two cases that expected exit 2 on an invalid fragment now expect the plugin to be skipped.scripts/sync-shared-copies.test.sh,scripts/check-vendor-version-bump.test.sh(25 pass),scripts/check-standards-contract-bump.test.sh(14 pass)scripts/dependabot-plugin-bump.test.sh: 18 pass. This includes a base-side release after the fork, and a branch older than the fragment library (that branch is treated as all legacy; before this fix the script exited 1)The unchanged suites
scripts/lib/changelog-fragments.test.sh,scripts/new-changelog-fragment.test.shandscripts/check-changelog-parity.test.shalso pass. shellcheck, shfmt and actionlint are clean. The 3 executable-bit cases insync-shared-copies.test.shfail on Windows NTFS only; they fail the same way onorigin/main.Follow-ups (outside this PR's file scope)
release-plugins.ymlrunsscripts/release-plugins.sh | tee. With noshell: bash, the step has no pipefail, so the script's exit 2 never failed the job, either before or after this change. Skipped plugins are reported only on stderr, not as::warning::and not in the release PR body.dependabot-plugin-release.yml. Another lane is fixing that.🤖 Generated with Claude Code