Skip to content

Certify pm CLI 2026.9.21, move merge drivers onto the canonical pm-ops launcher, and fix release visibility - #121

Merged
unbraind merged 6 commits into
mainfrom
pm-cli-2026-9-21-canonical-merge-driver-release-window
Sep 22, 2026
Merged

unbraind merged 6 commits into
mainfrom
pm-cli-2026-9-21-canonical-merge-driver-release-window

Conversation

@unbraind

@unbraind unbraind commented Sep 22, 2026 •

Copy link
Copy Markdown
Owner

Summary

Fleet wave of 2026-09-22 (companion epic pm-cli-website-5s6z), applied by the fleet's deterministic wave script and verified by this repository's own gates.

  • Certify pm CLI 2026.9.21, with exact pins in package.json and package-lock.json: @unbrained/pm-cli 2026.9.17 -> 2026.9.21, pm-changelog 2026.9.16 -> 2026.9.18, pm-ops 2026.9.13 -> 2026.9.18.
  • Canonical merge driver: scripts/prepare-merge-driver.ts is a thin launcher over pm-ops/merge-driver (removed: scripts/prepare-merge-driver.mjs). CI runs pm health --strict-exit --require-merge-drivers right after npm ci, with no separate install step, so the gate proves that the prepare hook installed the drivers. A broken launcher fails CI instead of silently leaving clones that hard-conflict .toon/history files on the next multi-agent merge.
  • Release workflow: 10-minute npm visibility window and a GitHub Release decoupled from bun mirror lag, with a visible gate step for bun failures (companion pm-cli-website-3y5d). The backfill step first proposed here was removed after review; see Review follow-ups.

pm items

Review follow-ups

  • bbffdb2: State the real install contract of the canonical merge-driver launcher
  • 67627f7: Let CI prove that npm ci's prepare hook installs the merge drivers
  • 74e16f1: Drop the release backfill step until it can verify provenance ancestry
  • ed65864: Declare max_attempts before use and correct the wave's pm records
  • 73584bf: Make every closure field of the release Issue match the final scope

Findings tracked centrally rather than fixed per repository (one pm-ops release moves the whole fleet):

  • companion pm-cli-website-xy19: a guarded launcher so that npm ci --omit=dev in a clone no-ops instead of failing
  • companion pm-cli-website-mxrp: the release-workflow recovery harness as a checked-in pm-ops verifier run by every release:check, plus the backfill with provenance-ancestry verification (the attested commit must be an ancestor of the tag; this fleet's provenance names the trigger commit, pm-cli-website-nodo)

Verification

Check Result
git config --get-regexp '^merge\.pm' after npm ci drivers registered
pm health --strict-exit --require-merge-drivers exit 0
npm run release:check exit 0 (verify-release-publish-attestation: every publish invocation is attested.)
changelog:full then changelog:check regenerated after the pm writes, consistent

Dependabot PRs are not absorbed here and will rebase onto this change.

Summary by Sourcery

Certify the updated pm toolchain, centralize merge-driver setup, and make release publication resilient to registry propagation and Bun mirror delays.

Bug Fixes:

  • Prevent npm registry propagation delays and Bun mirror lag from suppressing successful GitHub Releases while keeping Bun verification failures visible.
  • Ensure CI fails when required Git merge drivers are not installed after dependency setup.

Enhancements:

  • Certify the updated pm CLI, pm-changelog, and pm-ops dependency versions and route merge-driver installation through the canonical pm-ops launcher.
  • Document merge-driver installation behavior for development and production clone installs.

CI:

  • Require merge-driver health validation in CI after npm installation.

Documentation:

  • Update the README with the canonical merge-driver launcher and production-install requirements.

Tests:

  • Verify release checks, merge-driver registration, and changelog consistency for the updated release process.

Chores:

  • Record the associated project-management task and issue artifacts and their histories.

Summary by cubic

Certifies pm CLI 2026.9.21, moves merge-driver setup onto the canonical pm-ops launcher, and reworks the release workflow so npm propagation and bun mirror lag no longer cause false failures or skipped GitHub Releases.

Merge drivers

  • Pins @unbrained/pm-cli 2026.9.21, pm-ops 2026.9.18 and pm-changelog 2026.9.18 exactly.
  • Replaces the vendored scripts/prepare-merge-driver.mjs with a thin launcher over pm-ops/merge-driver.
  • CI runs pm health --strict-exit --require-merge-drivers with no explicit install first, so the gate proves the prepare hook installs the drivers on a fresh clone.
  • The README now documents that a production (--omit=dev) install of a clone must pass --ignore-scripts.

Release fixes

  • The npm visibility window is now 10 minutes; a publish that lands late is reported as success, not "failed", and max_attempts is declared before the function that expands it.
  • The GitHub Release is created whenever publish and tag push succeed, regardless of bun verification; a bun failure now fails the job via a visible gate step.
  • The backfill step for missing Releases was dropped: an npm attestation does not prove the tag's commit produced the artifact, so stale or hand-made tags could get a misleading Release. The three historical orphans were backfilled by hand.

Written for commit 73584bf. Summary will update on new commits.

Review in cubic

…cal pm-ops launcher

- Pins @unbrained/pm-cli 2026.9.21, pm-ops 2026.9.18 and pm-changelog 2026.9.18 exactly
  (package.json and package-lock.json).
- scripts/prepare-merge-driver.ts is now a thin launcher over pm-ops/merge-driver, replacing
  the untyped prepare-merge-driver.mjs; one
  canonical, tested installer instead of a private copy per repository.
- CI installs the drivers before `pm health --strict-exit --require-merge-drivers`, so a clone
  without them fails the gate instead of hard-conflicting tracker files on the next merge.
- Release workflow: 10-minute npm visibility window, GitHub Release decoupled from bun mirror lag with a visible gate step, and a best-effort backfill of missing Releases (companion pm-cli-website-3y5d).

pm items: pm-linear-em7w, pm-linear-seq7.
Companion epic pm-cli-website-5s6z. release:check exits 0.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @unbraind, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 4 hours and 38 minutes by commenting @sourcery-ai review. Upgrade to get a review now.

@sourcery-ai

sourcery-ai Bot commented Sep 22, 2026

Copy link
Copy Markdown

Reviewer's Guide

This PR upgrades and pins the pm toolchain, replaces the repository-owned merge-driver setup with the canonical pm-ops launcher and strict CI installation gate, and restructures release automation to recover missing GitHub Releases while separating Bun mirror verification from release creation and making npm visibility failures explicit.

Sequence diagram for release publication and visibility gates

sequenceDiagram
    participant Workflow
    participant NPM
    participant Git
    participant GitHub
    participant Bun

    Workflow->>NPM: Publish npm package
    Workflow->>NPM: Poll version and attestations for 10 minutes
    alt npm version is visible and attested
        Workflow->>Git: Push release tag
        Workflow->>Bun: Verify bun install for 10 minutes
        Workflow->>GitHub: Create GitHub Release
        alt bun verification fails
            Workflow->>Workflow: Fail job on bun verification failure
        end
    else npm visibility or attestation fails
        Workflow->>Workflow: Refuse release and report explicit failure
    end
Loading

Flow diagram for backfilling missing GitHub Releases

flowchart TD
    TAGS[Enumerate release tags] --> EXISTS{GitHub Release exists?}
    EXISTS -->|Yes| NEXT[Continue to next tag]
    EXISTS -->|No| NPMCHECK[Check npm version visibility and attestations]
    NPMCHECK -->|Missing or unattested| SKIP[Skip backfill with warning]
    NPMCHECK -->|Published and attested| NOTES[Generate notes for tag range]
    NOTES --> CREATE[Create GitHub Release]
    CREATE --> CONTINUE[Continue today's release]
    NOTES -. failure .-> CONTINUE
    CREATE -. failure .-> CONTINUE
Loading

File-Level Changes

Change Details Files
Certify the updated pm toolchain and route merge-driver setup through pm-ops.
  • Pin pm CLI, changelog, and operations packages to the 2026.9.21/2026.9.18 releases.
  • Replace the local merge-driver implementation with a TypeScript launcher importing pm-ops/merge-driver.
  • Update the prepare hook and lockfile, and remove the obsolete launcher.
package.json
package-lock.json
scripts/prepare-merge-driver.ts
scripts/prepare-merge-driver.mjs
Make CI fail clearly when required project merge drivers are not installed.
  • Install merge drivers after dependency installation.
  • Require registered merge drivers in strict pm health validation.
.github/workflows/ci.yml
Improve release recovery and visibility around npm propagation and Bun mirror failures.
  • Backfill missing GitHub Releases for eligible tagged, npm-visible, attested versions without blocking the current release.
  • Extend npm and Bun visibility checks to a ten-minute window and use online registry reads.
  • Create the GitHub Release after successful publish and tag push independently of Bun verification.
  • Add an explicit failing gate so Bun verification failures remain visible.
.github/workflows/release.yml
Record the release-certification and release-visibility fixes in project documentation and pm tracking.
  • Add Unreleased changelog entries linked to the pm task and issue.
  • Document the canonical pm-ops merge-driver launcher.
  • Add the associated pm task, issue, and history records.
CHANGELOG.md
README.md
.agents/pm/tasks/pm-linear-em7w.toon
.agents/pm/issues/pm-linear-seq7.toon
.agents/pm/history/pm-linear-em7w.jsonl
.agents/pm/history/pm-linear-seq7.jsonl

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@coderabbitai

coderabbitai Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Advanced

Run ID: e94857e0-6b21-4ece-a9fb-a02dcaa83f0b


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 5/5

The PR appears safe to merge; the latest changes fully correct the remaining planning-record inconsistency without introducing a new actionable defect.

Summary

This PR certifies the updated pm toolchain, delegates merge-driver preparation to the canonical pm-ops launcher, strengthens CI verification, and makes release creation independent of Bun mirror lag while preserving a visible Bun failure.

  • Pins pm CLI 2026.9.21, pm-changelog 2026.9.18, and pm-ops 2026.9.18.
  • Verifies after npm ci that required merge drivers were installed by the prepare hook.
  • Extends npm propagation reconciliation to ten minutes and keeps provenance checks fail-closed.
  • Creates the GitHub Release after successful publication and tag push even if Bun verification fails, then explicitly fails the job to expose that failure.
  • Removes the unsafe release-backfill proposal and brings the planning records into agreement with the final implementation.
Diagram
sequenceDiagram
    participant W as Release workflow
    participant N as npm registry
    participant T as Git tag
    participant B as Bun mirror
    participant R as GitHub Release
    W->>N: Publish with provenance
    W->>N: Reconcile visibility for up to 10 minutes
    N-->>W: Confirm attested version
    W->>T: Push verified release tag
    W->>B: Retry exact-version install
    W->>R: Create release after publish and tag succeed
    alt Bun install fails
        W->>W: Fail visible Bun gate
    end
Loading

Reviews (5) · Last reviewed commit: "Make every closure field of the release ..."

Comment thread scripts/prepare-merge-driver.ts
Comment thread .github/workflows/release.yml Outdated
The prepare launcher statically imports pm-ops, a devDependency, so the
README's promise that production / --omit=dev installs cannot break was
only true for registry installs (npm never runs prepare for a registry
tarball). A production install of a clone omits pm-ops as well and must
pass --ignore-scripts, which is what this fleet's own Dockerfiles do.

Raised by Greptile and Sourcery on pm-starter#113. The canonical guarded
launcher is tracked as companion item pm-cli-website-xy19.
CI ran an explicit pm merge install right before pm health
--require-merge-drivers, so the gate only verified the step before it and
would have passed with a broken prepare hook. Without that step, the
health gate asserts what a fresh clone actually relies on: npm ci runs the
prepare launcher, which installs the drivers through pm-ops/merge-driver.

Verified on a fresh git clone: no merge.pm* keys before npm ci, all of
them after, and pm health --strict-exit --require-merge-drivers exits 1
once they are removed. Raised by Greptile on pm-github#93.
The backfill created a GitHub Release for any fleet-shaped tag whose npm
version carried some attestation, without proving the tag's commit
produced that artifact, so a stale, moved or hand-made tag could get a
misleading Release. Comparing the attested commit with the tag commit is
not the fix either: this fleet's provenance names the workflow trigger
commit, measured as the tag's direct parent on three real releases. The
correct check (same repository and workflow, attested commit an ancestor
of the tag) belongs in the canonical pm-ops release verifier.

The 10-minute npm visibility window and the Release decoupled from bun
mirror lag remain; they fix the root causes. Raised by Greptile on
pm-brief#124 and pm-linear#121.
Comment thread .agents/pm/issues/pm-linear-seq7.toon
- release.yml: max_attempts is declared before refuse_unattested_or_fail,
  which expands it, so its visibility no longer depends on call-time
  reasoning (the fleet's bindings-before-use rule; Greptile on
  pm-todos#99). Behaviour is unchanged.
- pm records: the release Issue no longer claims the backfill that review
  removed, and the certify Task describes CI as it now is (health gate
  right after npm ci, no separate install step).

The final release.yml is byte-identical to a fresh run of the anchored
applier on origin/main (identical).
The resolution, expected result and close reason still described the
backfill step that review removed, and the close reason cited the
earlier 7-scenario harness run. All three now state the two changes that
ship, the 5 applicable harness scenarios, and that the backfill moved to
companion item pm-cli-website-mxrp. Raised by Greptile on pm-slack#115.
@unbraind
unbraind merged commit e613f68 into main Sep 22, 2026
10 checks passed
@unbraind
unbraind deleted the pm-cli-2026-9-21-canonical-merge-driver-release-window branch September 22, 2026 06:33
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