Renn F
ccf895dd67
[F062] work_session.merge_pr: idempotency + active-status guard
...
merge_pr unconditionally set pr_status=merged, pr_merged_at, merged_by,
status=COMPLETED on whatever session it loaded — the only session-terminal
transition in WorkSessionService lacking both the active-status guard
(complete/abandon) and the terminal-idempotency guard (close). Two failure
modes: (1) a retried merge after a successful-but-unconfirmed GitHub merge
overwrote merged_by/pr_merged_at with the retry's actor/timestamp, corrupting
the merge audit trail; (2) merge_pr on an ABANDONED session resurrected it to
COMPLETED, undoing the single-active abandonment. Mirrors close()'s guard:
if status != ACTIVE, return the session unchanged. Both git.py callers await
merge_pr and discard the return, so the no-op is safe. TDD: 3 tests
(happy-path + both modes).
2026-06-28 17:02:04 +02:00
..
2026-06-28 16:47:09 +02:00
2026-06-03 06:35:03 +02:00
2026-06-03 06:35:03 +02:00
2026-06-14 13:43:46 +02:00
2026-06-27 00:54:43 +02:00
2026-06-15 01:23:03 +02:00
2026-06-18 03:33:47 +02:00
2026-06-15 20:47:41 +02:00
2026-06-21 20:31:42 +02:00
2026-06-28 17:00:20 +02:00
2026-06-28 17:00:20 +02:00
2026-06-28 16:36:21 +02:00
2026-06-21 02:48:07 +02:00
2026-06-14 13:43:46 +02:00
2026-06-17 16:50:11 +02:00
2026-06-25 18:35:52 +02:00
2026-06-16 18:01:40 +02:00
2026-06-28 15:45:54 +02:00
2026-06-28 17:00:20 +02:00
2026-06-20 19:10:21 +02:00
2026-06-28 17:00:20 +02:00
2026-06-28 16:47:09 +02:00
2026-06-25 18:35:52 +02:00
2026-06-28 16:47:09 +02:00
2026-06-28 16:47:09 +02:00
2026-06-19 09:15:01 +02:00
2026-06-15 07:03:59 +02:00
2026-06-28 16:47:09 +02:00
2026-06-14 13:43:46 +02:00
2026-06-16 18:01:40 +02:00
2026-06-17 06:36:28 +02:00
2026-06-25 18:35:52 +02:00
2026-06-14 23:18:58 +02:00
2026-06-28 16:47:09 +02:00
2026-06-27 07:19:35 +02:00
2026-06-15 20:47:41 +02:00
2026-06-25 01:07:05 +02:00
2026-06-27 20:48:28 +02:00
2026-06-26 01:43:08 +02:00
2026-06-28 16:47:09 +02:00
2026-06-28 16:47:09 +02:00
2026-06-23 07:26:41 +02:00
2026-06-26 01:43:08 +02:00
2026-06-28 10:30:42 +02:00
2026-06-14 13:43:46 +02:00
2026-06-15 06:12:00 +02:00
2026-06-15 08:13:53 +02:00
2026-06-26 01:43:08 +02:00
2026-06-28 16:47:09 +02:00
2026-06-28 16:47:09 +02:00
2026-06-25 07:29:27 +02:00
2026-06-27 07:19:35 +02:00
2026-06-21 02:56:53 +02:00
2026-06-19 09:15:01 +02:00
2026-06-27 19:52:01 +02:00
2026-06-28 17:00:20 +02:00
2026-06-28 02:02:33 +02:00
2026-06-22 03:49:45 +02:00
2026-06-28 17:00:20 +02:00
2026-06-28 16:47:09 +02:00
2026-06-26 01:43:08 +02:00
2026-06-26 01:43:08 +02:00
2026-06-28 16:47:09 +02:00
2026-06-26 01:43:08 +02:00
2026-06-28 16:32:31 +02:00
2026-06-26 01:43:08 +02:00
2026-06-21 02:48:07 +02:00
2026-06-15 20:47:41 +02:00
2026-06-15 20:47:41 +02:00
2026-06-15 20:47:41 +02:00
2026-06-17 20:52:47 +02:00
2026-06-28 16:18:56 +02:00
2026-06-28 04:22:27 +02:00
2026-06-28 17:00:20 +02:00
2026-06-12 23:11:01 +02:00
2026-06-15 20:47:41 +02:00
2026-06-21 02:48:07 +02:00
2026-06-26 22:47:57 +02:00
2026-06-23 07:26:41 +02:00
2026-06-03 06:35:03 +02:00
2026-06-28 16:36:21 +02:00
2026-06-17 20:50:07 +02:00
2026-06-22 13:02:59 +02:00
2026-06-12 23:10:21 +02:00
2026-06-11 23:19:50 +02:00
2026-06-28 17:02:04 +02:00
2026-06-22 12:37:46 +02:00
2026-06-11 18:16:20 +02:00
2026-06-04 00:38:42 +02:00
2026-06-08 05:17:15 +02:00
2026-06-22 22:59:18 +02:00
2026-06-05 16:35:22 +02:00
2026-06-22 01:59:41 +02:00