Skip to content

ci(release): forward-merge 3.0.x → main silently drops all 3.0.x changes since allowlist landed #4306

Description

@bokelley

Symptom

`main` is 465 commits behind `3.0.x`. Every push to `3.0.x` triggers `forward-merge-3.0.yml`, the run reports success, and `peter-evans/create-pull-request` logs `Branch 'forward-merge/3.0.x' no longer differs from base branch 'main'` — so no PR is opened, despite the obvious divergence.

Started showing this no-op behavior around 2026-05-08 15:05 UTC, immediately after PR #4264 landed (`ci(release): backport storyboard-schema.yaml forward-merge allowlist to 3.0.x`). Before that the workflow was failing loudly on conflicts; after it, the workflow auto-resolves everything and the merge commit ends up identical to `main`.

What's happening in the run

From run 25602530744 (push of `5d2e7be` HMAC fix to `3.0.x`, 2026-05-09 13:40):

```
CONFLICT (content): .github/workflows/training-agent-storyboards.yml
CONFLICT (content): package.json
CONFLICT (content): static/compliance/source/universal/runner-output-contract.yaml
CONFLICT (content): static/compliance/source/universal/storyboard-schema.yaml
CONFLICT (content): static/schemas/source/core/error.json
CONFLICT (content): static/schemas/source/enums/error-code.json
CONFLICT (content): static/schemas/source/protocol/get-adcp-capabilities-response.json
Automatic merge failed; fix conflicts and then commit the result.

Auto-resolved divergent metadata

```

Auto-resolution runs and the workflow exits success. But the resulting tree matches `main` HEAD exactly — meaning the non-conflicting changes from `3.0.x` (the actual docs/schemas/skills patches) are being dropped along with the conflicts.

Impact

Hypothesis

The auto-resolution step likely does a `git reset --hard origin/main` (or equivalent) after determining all conflicts are in the allowlist, instead of only touching the conflicted paths. That would explain the all-or-nothing behavior — when there are any allowlist conflicts, the entire merge is reset to main, dropping non-conflict changes.

Repro

Push any commit to `3.0.x` that touches files in the allowlist (e.g., bumping `package.json`). Workflow reports success, no PR opens, `main` remains untouched.

Fix direction

Inspect the bash block in `.github/workflows/forward-merge-3.0.yml` that runs after `Automatic merge failed`. The allowlist resolution should:

  1. `git checkout --ours ` (or `--theirs`) per allowlisted path only
  2. `git add ` for those paths
  3. `git commit` — preserving the rest of the merge
  4. NOT touch the working tree globally

Backfill

Once the workflow is fixed, all queued 3.0.x patches (5/3 onward) will land in a single forward-merge PR — manageable as one review cycle.

Severity

P1.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingclaude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions