Skip to content

chore: release main - #4028

Open
ryanrozich wants to merge 1 commit into
mainfrom
release-please--branches--main
Open

chore: release main#4028
ryanrozich wants to merge 1 commit into
mainfrom
release-please--branches--main

Conversation

@ryanrozich

@ryanrozich ryanrozich commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

This release is too large to preview in the pull request body. View the full release notes here: https://github.com/coalesce-labs/catalyst/blob/release-please--branches--main--release-notes/release-notes.md

@ryanrozich
ryanrozich force-pushed the release-please--branches--main branch 3 times, most recently from 918055e to add249a Compare August 28, 2026 22:00
ryanrozich added a commit that referenced this pull request Aug 28, 2026
…st (#4079)

## Summary

Phases 2–3 of the [CTL-2266
plan](thoughts/shared/plans/2026-08-28-CTL-2266-mergify-merge-queue-catalyst.md)
— extends the catalyst-cloud Mergify merge-queue trial to
`coalesce-labs/catalyst`. Phase 1 (the monotonic version guard) already
merged as #4077, so AC2's silent version-collision case is already
covered by `check-versions` on `main` — this PR does not touch that
logic again.

- **Phase 2** — `queue:ready` and `hold:hand-steps` labels created on
the repo (colors/descriptions match the catalyst-cloud trial);
`AGENTS.md` documents queue-merge as the PR default once activated.
- **Phase 3** — `.mergify.yml`, validated and simulated against real
open PRs below.

**This PR does not activate the queue and is not merged by the queue
itself** (it touches `.mergify.yml`, which the config's own path
exclusion routes to hand-merge). The coordinator merges this by hand,
then runs the live `@Mergifyio` probe per plan Phase 4 — Ryan has
already activated the repo in the Mergify dashboard.

## One deliberate deviation from the plan: `max_parallel_checks: 3`

The plan as researched specified `max_parallel_checks: 1` (in-place
checks, matching the catalyst-cloud shape). Per Ryan's direction from
today's catalyst-cloud experience, this PR ships with
**`max_parallel_checks: 3`** instead.

**Measured caveat, not fixed by this PR:** `gh api
repos/coalesce-labs/catalyst/rulesets/13503799` still reports the "main
branch protection" ruleset's
`required_status_checks.strict_required_status_checks_policy: true`
(verbatim, re-checked just before opening this PR). Mergify computes
`allow_inplace_checks` automatically, and only enables it when
`max_parallel_checks == 1` + `batch_size == 1` + `merge_conditions ==
queue_conditions` for every queue — setting `max_parallel_checks: 3`
opts OUT of in-place checks, so Mergify will run CI on temporary
merge-queue branches instead of pushing update commits onto the PR
branch. Separately, with `strict_required_status_checks_policy: true`,
each queued PR's required checks are only valid against the exact
current `main`, so **real parallel throughput still needs that ruleset
setting turned off** — otherwise batches serialize behind
rebase-and-recheck regardless of the configured slot count.

**I have not touched branch protection** — that's explicitly out of
scope for me per the dispatch instructions; it's a call for Ryan. The
config comments in `.mergify.yml` spell this out inline so it isn't only
in this PR description.

## Validation

### `mergify config validate`

```
$ mergify config validate -f .mergify.yml
Fetching schema from https://docs.mergify.com…
Configuration file '.mergify.yml' is valid.
```

### `mergify config simulate` — real open PRs, both polarities

**#4070** (`CTL-2240`, Ryan's own PR, all required + non-required checks
green) — real state, no `queue:ready` label:

```
### Rule: enqueue when a lane marks a PR ready (queue)
- [ ] `label=queue:ready`
- [ ] any of: [🔀 queue conditions]
  - [ ] all of: [📌 queue conditions of queue rule `default`]
    - [ ] `#review-threads-unresolved = 0` [🛡 GitHub repository ruleset rule `main branch protection`]
    ...
    - [X] `-check-failure=quality`
    - [X] `-draft`
    - [X] `-files~=^\.github/workflows/publish-`
    - [X] `-files~=^\.mergify\.yml$`
    - [X] `-files~=^plugins/dev/scripts/db-migrations/`
    - [X] `-head~=^release-please--`
    - [X] `base=main`
    - [X] all six required checks (success/neutral/skipped)
    - [X] all three non-required always-on gates
```

Every guard is TRUE except the label — as expected for an unlabeled PR.
**While testing this** (toggling `queue:ready` on and off on #4070 to
get the positive-polarity read, see below), I discovered #4070 genuinely
has unresolved Codex P1 review threads right now
(`#review-threads-unresolved = 0` reads `[ ]` false) — real, not caused
by my testing. That's a live negative-polarity data point for that
specific condition, not a config defect: the guard correctly refuses to
admit a PR with unresolved review threads. Ryan/coordinator: #4070 is
not actually `queue:ready`-eligible today for that reason, independent
of this PR.

**#4066** (`dependabot/bun/eslint-10.9.1`) — I temporarily applied
`queue:ready` (removed immediately after, confirmed back to
`["dependencies","javascript"]`), to get the positive polarity on a real
PR:

```
$ mergify config simulate -f .mergify.yml #4066
1 rule matches

### ✅ Rule: enqueue when a lane marks a PR ready (queue)
- [X] `-closed` [📌 queue requirement]
- [X] `-conflict` [📌 queue requirement]
- [X] `-draft` [📌 queue requirement]
- [X] `base=main`
- [X] `label=queue:ready`
- [X] any of: [🔀 queue conditions]
  - [X] all of: [📌 queue conditions of queue rule `default`]
    - [X] `#review-threads-unresolved = 0` [🛡 GitHub repository ruleset rule `main branch protection`]
    - [X] all path exclusions, all six required checks, all three non-required gates, all TRUE
```

Full green — this dependabot PR would actually enter the queue with the
label applied. This is the genuine positive control the plan's Phase 3
step 3 asks for (not a list of ticks on a PR that was never going to
queue).

**#4028** (`release-please--branches--main`) — real state, read-only, no
label change — negative control for the outward-facing exclusion:

```
- [ ] `-head~=^release-please--`
```

Confirms the head-branch regex correctly refuses a real release-please
PR (this repo has one live right now, since CTL-2263 reinstated
release-please — landed on `main` between this branch's original cut and
this rebase; the `-head~=^release-please--` exclusion already covers it,
no config change needed, matching the plan's "correct under both
futures" claim in decision 3).

### Required-check population, re-confirmed live

`gh api .../commits/<sha>/check-runs` on both #4070 and #4066 shows all
six ruleset-required contexts plus `packaging-gate`, `skills-gate`,
`check-plugin-manifest-parity`, and `quality` present and green on both
— consistent with the plan's check-population table.

## What's not in this PR

- Queue activation (Ryan's one Mergify-dashboard click, plan Phase 4).
- The first end-to-end live merge and post-merge trigger verification
(Phase 4, after activation).
- Negative-control drills (Phase 5) — path-exclusion refusal,
`hold:hand-steps` refusal, pause behavior — run live after activation.
- Any change to branch-protection / the ruleset's
`strict_required_status_checks_policy` — that's Ryan's call, not made
here.

## Linear

CTL-2266 → In Review.

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@ryanrozich

Copy link
Copy Markdown
Contributor Author

@Mergifyio queue

@mergify

mergify Bot commented Aug 28, 2026

Copy link
Copy Markdown

Merge Queue Status

  • 🟠 Waiting for queue conditions
  • ⏳ Enter queue
  • ⏳ Run checks
  • ⏳ Merge
Waiting for
  • label=queue:ready
  • any of:
    • check-neutral=check-versions
    • check-skipped=check-versions
    • check-success=check-versions
  • any of: [🛡 GitHub repository ruleset rule main branch protection]
    • check-neutral = check-versions
    • check-skipped = check-versions
    • check-success = check-versions
All conditions
  • any of [🔀 queue conditions]:
    • all of [📌 queue conditions of queue rule default]:
      • -head~=^release-please--
      • label=queue:ready
      • any of:
        • check-neutral=check-versions
        • check-skipped=check-versions
        • check-success=check-versions
      • any of [🛡 GitHub repository ruleset rule main branch protection]:
        • check-neutral = check-versions
        • check-skipped = check-versions
        • check-success = check-versions
      • #review-threads-unresolved = 0 [🛡 GitHub repository ruleset rule main branch protection]
      • #review-threads-unresolved=0
      • -check-failure=quality
      • -check-pending=quality
      • -draft
      • -files~=^\.github/workflows/publish-
      • -files~=^\.mergify\.yml$
      • -files~=^plugins/dev/scripts/db-migrations/
      • base=main
      • github-review-approved [🛡 GitHub repository ruleset rule main branch protection]
      • label!=hold:hand-steps
      • any of:
        • check-success=docs-gate
        • check-neutral=docs-gate
        • check-skipped=docs-gate
      • any of:
        • check-success=gitleaks
        • check-neutral=gitleaks
        • check-skipped=gitleaks
      • any of:
        • check-success=agents-md-gate
        • check-neutral=agents-md-gate
        • check-skipped=agents-md-gate
      • any of:
        • check-success=audit-references
        • check-neutral=audit-references
        • check-skipped=audit-references
      • any of:
        • check-skipped=execution-core-unit-tests
        • check-neutral=execution-core-unit-tests
        • check-success=execution-core-unit-tests
      • any of:
        • check-success=packaging-gate
        • check-neutral=packaging-gate
        • check-skipped=packaging-gate
      • any of:
        • check-success=skills-gate
        • check-neutral=skills-gate
        • check-skipped=skills-gate
      • any of:
        • check-success=check-plugin-manifest-parity
        • check-neutral=check-plugin-manifest-parity
        • check-skipped=check-plugin-manifest-parity
      • any of [🛡 GitHub repository ruleset rule main branch protection]:
        • check-success = docs-gate
        • check-neutral = docs-gate
        • check-skipped = docs-gate
      • any of [🛡 GitHub repository ruleset rule main branch protection]:
        • check-success = gitleaks
        • check-neutral = gitleaks
        • check-skipped = gitleaks
      • any of [🛡 GitHub repository ruleset rule main branch protection]:
        • check-success = agents-md-gate
        • check-neutral = agents-md-gate
        • check-skipped = agents-md-gate
      • any of [🛡 GitHub repository ruleset rule main branch protection]:
        • check-success = audit-references
        • check-neutral = audit-references
        • check-skipped = audit-references
      • any of [🛡 GitHub repository ruleset rule main branch protection]:
        • check-skipped = execution-core-unit-tests
        • check-neutral = execution-core-unit-tests
        • check-success = execution-core-unit-tests
  • -closed [📌 queue requirement]
  • -conflict [📌 queue requirement]
  • -draft [📌 queue requirement]
  • any of [📌 queue -> configuration change requirements]:
    • -mergify-configuration-changed
    • check-success = Configuration changed

@ryanrozich
ryanrozich force-pushed the release-please--branches--main branch 8 times, most recently from 4eea631 to 17dfc93 Compare August 29, 2026 05:01
@ryanrozich
ryanrozich force-pushed the release-please--branches--main branch from 17dfc93 to 9f905b3 Compare August 29, 2026 14:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant