Renn F
3efc96e402
fix(lifecycle): pr_pass hands ownership to the owning PM — closes the passed-PR completion wedge
...
Removing the awaiting_pm_review re-claim edge (d87e2d9b , the #740
review-loop fix) exposed that the edge was load-bearing: pr_pass
cleared assigned_to/claimed_by to None and the re-claim was the only
way a PM ever re-acquired the task. Since then every assembled task
passing the PR gate wedged: the closure PM's complete rejected with
'not assigned to you', its fallback claim rejected (edge gone), and
its only exit was escalate_up — BLOCKING the task onto main-pm, who
is not the assignee either and burned spawns doing nothing. Live:
PR #741 's task (7 ownership rejections, escalated 13:59Z), plus two
more tasks with 25 and 2 rejections in the same shape.
pr_pass now resolves the owning PM via _revision_pm_for_task and
assigns it, exactly as pr_fail always did — one chokepoint covering
cell (submit_up) and root (submit_root) tasks. mark_pr_created's
ready_for_pm branch (leaf docs-path, PR-arrives-second) had the same
clear-to-None wedge and now resolves via _resolve_pm_for_review like
its docs-first sibling. No claim edge is reintroduced; the #740
parity test is untouched.
Recovery for already-wedged tasks needs no DB surgery: new idempotent
TaskService.assign_review_pm + POST /tasks/{id}/assign-review-pm
(ASSIGN-gated, explicit commit) corrects an unassigned OR mis-assigned
awaiting_pm_review task to its owning PM; _dispatch_pm_review_work
ensures assignment before every spawn (cheap pre-check skips the
round-trip when the fetched assigned_to already matches), replacing
the dead _claim_task_for_agent call whose lifecycle claim the removed
edge now always rejects; _maybe_spawn_pm_closure routes through
_closure_review_pm, which keeps the team-resolved PM whenever the
assign route fails so a transient error can never spawn a stale
assignee.
Gate: 15506 passed, 459 skipped; xenon/ruff/mypy/vulture/bandit/
pip-audit/deptry/import-linter/foundation-check green.
2026-07-31 18:48:45 +02:00
..
2026-07-19 11:50:47 +02:00
2026-07-11 15:51:19 +02:00
2026-07-25 00:41:13 +02:00
2026-05-08 12:18:00 +02:00
2026-07-01 01:11:34 +02:00
2026-07-23 21:09:50 +02:00
2026-07-25 17:13:32 +02:00
2026-07-27 01:28:33 +02:00
2026-06-14 13:43:46 +02:00
2026-06-29 05:38:21 +02:00
2026-06-15 01:23:03 +02:00
2026-07-26 19:11:27 +02:00
2026-07-18 19:11:03 +02:00
2026-07-02 21:05:50 +02:00
2026-06-30 08:08:35 +02:00
2026-07-07 10:09:23 +02:00
2026-07-25 17:13:32 +02:00
2026-07-26 20:01:24 +02:00
2026-07-07 10:09:23 +02:00
2026-05-16 06:20:35 +02:00
2026-06-29 05:38:21 +02:00
2026-07-25 17:13:32 +02:00
2026-07-26 20:01:24 +02:00
2026-07-23 21:09:50 +02:00
2026-06-29 05:38:21 +02:00
2026-06-14 13:43:46 +02:00
2026-07-31 13:56:19 +02:00
2026-07-11 22:54:42 +02:00
2026-07-23 00:05:33 +02:00
2026-07-07 10:09:23 +02:00
2026-06-29 05:38:21 +02:00
2026-07-19 17:38:30 +02:00
2026-06-16 18:01:40 +02:00
2026-06-29 11:32:34 +02:00
2026-07-31 13:56:19 +02:00
2026-07-10 00:15:04 +02:00
2026-07-10 00:15:04 +02:00
2026-06-29 11:32:34 +02:00
2026-07-11 09:21:24 +02:00
2026-07-24 17:50:13 +02:00
2026-07-19 08:12:34 +02:00
2026-07-23 21:54:45 +02:00
2026-06-29 05:38:21 +02:00
2026-06-29 05:38:21 +02:00
2026-07-19 08:12:34 +02:00
2026-07-19 08:12:34 +02:00
2026-06-29 05:38:21 +02:00
2026-07-31 01:53:07 +02:00
2026-06-19 09:15:01 +02:00
2026-06-15 07:03:59 +02:00
2026-07-18 15:55:55 +02:00
2026-07-19 08:12:34 +02:00
2026-07-19 08:12:34 +02:00
2026-07-24 17:50:13 +02:00
2026-07-24 14:34:25 +02:00
2026-07-24 14:34:25 +02:00
2026-07-24 14:34:25 +02:00
2026-06-29 11:32:34 +02:00
2026-07-24 17:50:13 +02:00
2026-06-25 18:35:52 +02:00
2026-06-14 23:18:58 +02:00
2026-06-29 05:38:21 +02:00
2026-07-31 13:56:19 +02:00
2026-07-24 17:50:13 +02:00
2026-07-22 03:31:12 +02:00
2026-07-19 11:50:47 +02:00
2026-07-07 10:09:23 +02:00
2026-07-05 13:37:17 +02:00
2026-05-14 04:21:07 +02:00
2026-07-07 10:09:23 +02:00
2026-07-07 10:09:23 +02:00
2026-07-25 17:13:32 +02:00
2026-07-31 13:56:19 +02:00
2026-07-25 17:13:32 +02:00
2026-06-26 01:43:08 +02:00
2026-06-23 07:26:41 +02:00
2026-07-05 16:12:44 +02:00
2026-07-25 17:13:32 +02:00
2026-07-26 20:01:24 +02:00
2026-07-07 10:09:23 +02:00
2026-07-25 17:13:32 +02:00
2026-07-25 17:13:32 +02:00
2026-07-25 17:13:32 +02:00
2026-07-30 16:35:42 +02:00
2026-07-20 20:59:36 +02:00
2026-07-29 23:23:29 +02:00
2026-07-15 08:25:20 +02:00
2026-06-29 05:38:21 +02:00
2026-07-04 03:10:33 +02:00
2026-06-14 13:43:46 +02:00
2026-06-15 06:12:00 +02:00
2026-07-07 10:09:23 +02:00
2026-07-25 17:13:32 +02:00
2026-07-26 20:01:24 +02:00
2026-07-04 03:10:33 +02:00
2026-07-25 17:13:32 +02:00
2026-07-26 20:01:24 +02:00
2026-06-26 01:43:08 +02:00
2026-07-04 03:10:33 +02:00
2026-06-29 05:38:21 +02:00
2026-06-29 05:38:21 +02:00
2026-07-07 10:09:23 +02:00
2026-07-30 23:37:27 +02:00
2026-07-19 08:12:34 +02:00
2026-07-23 21:09:50 +02:00
2026-07-01 01:11:34 +02:00
2026-07-15 05:45:57 +02:00
2026-07-22 03:31:12 +02:00
2026-07-23 00:06:14 +02:00
2026-07-15 04:34:06 +02:00
2026-07-10 03:59:13 +02:00
2026-07-22 03:31:25 +02:00
2026-07-10 09:38:10 +02:00
2026-07-08 16:03:00 +02:00
2026-06-29 05:38:21 +02:00
2026-06-30 08:08:35 +02:00
2026-06-30 08:08:35 +02:00
2026-06-29 05:38:21 +02:00
2026-07-16 04:30:18 +02:00
2026-07-22 08:11:28 +02:00
2026-07-22 08:11:28 +02:00
2026-07-18 16:35:28 +02:00
2026-07-22 15:53:02 +02:00
2026-07-14 02:22:37 +02:00
2026-07-25 17:13:32 +02:00
2026-07-07 10:09:23 +02:00
2026-07-22 15:53:02 +02:00
2026-07-18 16:48:45 +02:00
2026-07-25 17:13:32 +02:00
2026-07-18 16:48:45 +02:00
2026-07-09 05:26:30 +02:00
2026-06-29 05:38:21 +02:00
2026-07-18 16:41:18 +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-07-26 19:11:27 +02:00
2026-07-25 05:39:44 +02:00
2026-07-26 20:01:24 +02:00
2026-07-25 17:13:32 +02:00
2026-07-26 15:07:28 +02:00
2026-07-04 03:10:33 +02:00
2026-07-07 10:09:23 +02:00
2026-07-02 18:28:07 +02:00
2026-07-25 17:13:32 +02:00
2026-07-26 20:01:24 +02:00
2026-07-24 13:53:29 +02:00
2026-06-29 05:38:21 +02:00
2026-07-22 03:31:01 +02:00
2026-07-25 17:13:32 +02:00
2026-07-26 20:01:24 +02:00
2026-07-25 05:39:44 +02:00
2026-06-21 02:48:07 +02:00
2026-07-23 21:09:50 +02:00
2026-07-11 22:54:42 +02:00
2026-07-23 09:41:27 +02:00
2026-07-19 17:38:30 +02:00
2026-07-18 00:44:48 +02:00
2026-06-29 11:32:34 +02:00
2026-07-11 09:21:24 +02:00
2026-07-13 13:57:14 +02:00
2026-06-03 06:35:03 +02:00
2026-07-07 10:09:23 +02:00
2026-07-31 18:48:45 +02:00
2026-07-19 07:40:18 +02:00
2026-07-18 15:54:49 +02:00
2026-07-23 21:09:50 +02:00
2026-07-25 17:13:32 +02:00
2026-07-18 15:54:49 +02:00
2026-06-17 20:50:07 +02:00
2026-07-23 21:09:50 +02:00
2026-07-07 10:09:23 +02:00
2026-06-22 13:02:59 +02:00
2026-06-30 08:08:35 +02:00
2026-06-12 23:10:21 +02:00
2026-07-25 00:49:13 +02:00
2026-07-11 22:54:42 +02:00
2026-07-11 09:21:12 +02:00
2026-07-11 15:51:19 +02:00
2026-07-11 15:51:19 +02:00
2026-07-11 15:51:19 +02:00
2026-07-11 15:51:19 +02:00
2026-07-11 22:54:42 +02:00
2026-07-22 08:11:28 +02:00
2026-07-22 08:11:28 +02:00
2026-07-16 19:49:26 +02:00
2026-07-25 17:13:32 +02:00
2026-07-07 10:09:23 +02:00
2026-07-07 10:09:23 +02:00
2026-06-22 12:37:46 +02:00
2026-06-11 18:16:20 +02:00
2026-07-31 01:53:07 +02:00
2026-07-31 13:56:19 +02:00
2026-05-12 22:40:15 +02:00
2026-05-12 22:40:15 +02:00
2026-07-31 01:53:07 +02:00
2026-07-10 00:15:04 +02:00
2026-06-08 05:17:15 +02:00
2026-07-07 10:09:23 +02:00
2026-06-05 16:35:22 +02:00
2026-06-22 01:59:41 +02:00
2026-06-29 11:32:34 +02:00
2026-06-30 11:05:22 +02:00
2026-07-24 20:29:20 +02:00
2026-06-29 11:32:34 +02:00
2026-07-30 16:35:42 +02:00
2026-07-25 17:13:32 +02:00
2026-07-28 23:52:04 +02:00
2026-07-28 23:52:04 +02:00
2026-07-05 13:37:17 +02:00