From 4cc61d566bfef8edbe418877744cead41669bd6b Mon Sep 17 00:00:00 2001 From: Dave Date: Tue, 24 Feb 2026 13:28:34 +0000 Subject: [PATCH] story-kit: create 142_bug_quality_gates_run_after_fast_forward_to_master_instead_of_before --- ...ast_forward_to_master_instead_of_before.md | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 .story_kit/work/1_upcoming/142_bug_quality_gates_run_after_fast_forward_to_master_instead_of_before.md diff --git a/.story_kit/work/1_upcoming/142_bug_quality_gates_run_after_fast_forward_to_master_instead_of_before.md b/.story_kit/work/1_upcoming/142_bug_quality_gates_run_after_fast_forward_to_master_instead_of_before.md new file mode 100644 index 0000000..463a624 --- /dev/null +++ b/.story_kit/work/1_upcoming/142_bug_quality_gates_run_after_fast_forward_to_master_instead_of_before.md @@ -0,0 +1,56 @@ +--- +name: "Quality gates run after fast-forward to master instead of before" +--- + +# Bug 142: Quality gates run after fast-forward to master instead of before + +## Description + +## Bug + +The `merge_agent_work` function in `server/src/agents.rs` runs quality gates AFTER the squash merge has already been fast-forwarded to master. This means broken code lands on master before gates catch it. + +### Current Flow (broken) +1. `run_squash_merge()` creates merge-queue branch + temp worktree +2. Squash merge + conflict resolution in temp worktree +3. **Fast-forward master to merge-queue commit** (line 2522) +4. Clean up temp worktree + branch +5. `run_merge_quality_gates()` runs on master (line 1047) +6. If gates fail, broken code is already on master + +### Expected Flow +1. `run_squash_merge()` creates merge-queue branch + temp worktree +2. Squash merge + conflict resolution in temp worktree +3. **Run quality gates in the merge-queue worktree BEFORE fast-forward** +4. If gates fail: tear down temp worktree + branch, leave master untouched, report failure +5. If gates pass: fast-forward master, clean up + +### Key Files +- `server/src/agents.rs` line 1013: `merge_agent_work()` — orchestrator +- `server/src/agents.rs` line 2367: `run_squash_merge()` — does merge + fast-forward +- `server/src/agents.rs` line 2522: fast-forward step that should happen AFTER gates +- `server/src/agents.rs` line 1047: `run_merge_quality_gates()` — runs too late + +### Impact +Broken merges (conflict markers, missing braces) land on master and break all worktrees that pull from it. Mergemaster then has to fix master directly, adding noise commits. + +## How to Reproduce + +1. Have a feature branch with code that conflicts with master +2. Call merge_agent_work for that story +3. run_squash_merge resolves conflicts (possibly incorrectly) +4. Fast-forwards master to the merge-queue commit BEFORE gates run +5. run_merge_quality_gates runs on master and finds broken code +6. Master is already broken + +## Actual Result + +Broken code (conflict markers, missing braces) lands on master. Mergemaster then fixes master directly, adding noise commits. All active worktrees pulling from master also break. + +## Expected Result + +Quality gates should run in the merge-queue worktree BEFORE fast-forwarding master. If gates fail, master should remain untouched. + +## Acceptance Criteria + +- [ ] Bug is fixed and verified