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:
- `git checkout --ours ` (or `--theirs`) per allowlisted path only
- `git add ` for those paths
- `git commit` — preserving the rest of the merge
- 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.
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:
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.