feat(controller): route outdated and conflicting PRs through synchronization lifecycle #728

Merged
sysadmin merged 3 commits from feat/issue-727-pr-sync-status into master 2026-07-17 12:58:36 -05:00
Owner

Closes #727

Behavior summary

Native PR synchronization lifecycle for open PRs that would otherwise stall after base advances, approvals go stale, or conflicts appear.

  • Pure assessment helper + MCP wiring recommend a single sanctioned next action from live dual-pinned PR/base heads.
  • Author-only update_branch_by_merge merges base into the PR branch (never rebase/force-push).
  • Conflict remediation stays in the existing author worktree under the existing lock.
  • Head changes invalidate prior approvals, leases, and prepared verdicts; route to fresh_review_required.
  • After every master update, remaining open PRs are re-assessed sequentially with fresh pins.

Routing states

Action When
merge_now Approval at current head, mergeable, checks ok, base current enough
update_branch_by_merge Behind live base; author merge of base into PR branch
author_conflict_remediation Conflicts / non-mergeable conflict signal
fresh_review_required Head moved after approval or prepared verdict
blocked Incomplete pins or no safe sanctioned action

Safety guarantees

  • Dual full-SHA pins: PR head + live base head
  • Author-only branch updates; reviewer/merger/reconciler denied
  • Merge-only update style (no rebase, force-push)
  • No direct API / CLI / Web UI fallback when native MCP is available
  • No self-review / self-merge from author profile

Tests and results

cd branches/issue-727-pr-sync-status
pytest tests/test_pr_sync_status.py -q
# 28 passed in 0.65s

Changed files (vs live master f65069d):

  • pr_sync_status.py (new)
  • gitea_mcp_server.py
  • task_capability_map.py
  • skills/llm-project-workflow/templates/merge-pr.md
  • skills/llm-project-workflow/workflows/review-merge-pr.md
  • tests/test_pr_sync_status.py (new)

Exact feature head

98fbfb3de735069dd05670a3d8755e7c14349af1

Next role

Independent REVIEWER — do not self-review or merge from the author profile.

Cleanup handoff (reconciler)

After this PR is proven valid, delete obsolete remote branch feat/pr-sync-status (same tip, pre-issue rename). Do not delete until PR head is verified.

Closes #727 ## Behavior summary Native PR synchronization lifecycle for open PRs that would otherwise stall after base advances, approvals go stale, or conflicts appear. - Pure assessment helper + MCP wiring recommend a single sanctioned next action from live dual-pinned PR/base heads. - Author-only `update_branch_by_merge` merges base into the PR branch (never rebase/force-push). - Conflict remediation stays in the existing author worktree under the existing lock. - Head changes invalidate prior approvals, leases, and prepared verdicts; route to `fresh_review_required`. - After every master update, remaining open PRs are re-assessed **sequentially** with fresh pins. ## Routing states | Action | When | |--------|------| | `merge_now` | Approval at current head, mergeable, checks ok, base current enough | | `update_branch_by_merge` | Behind live base; author merge of base into PR branch | | `author_conflict_remediation` | Conflicts / non-mergeable conflict signal | | `fresh_review_required` | Head moved after approval or prepared verdict | | `blocked` | Incomplete pins or no safe sanctioned action | ## Safety guarantees - Dual full-SHA pins: PR head + live base head - Author-only branch updates; reviewer/merger/reconciler denied - Merge-only update style (no rebase, force-push) - No direct API / CLI / Web UI fallback when native MCP is available - No self-review / self-merge from author profile ## Tests and results ```text cd branches/issue-727-pr-sync-status pytest tests/test_pr_sync_status.py -q # 28 passed in 0.65s ``` Changed files (vs live master `f65069d`): - `pr_sync_status.py` (new) - `gitea_mcp_server.py` - `task_capability_map.py` - `skills/llm-project-workflow/templates/merge-pr.md` - `skills/llm-project-workflow/workflows/review-merge-pr.md` - `tests/test_pr_sync_status.py` (new) ## Exact feature head `98fbfb3de735069dd05670a3d8755e7c14349af1` ## Next role **Independent REVIEWER** — do not self-review or merge from the author profile. ## Cleanup handoff (reconciler) After this PR is proven valid, delete obsolete remote branch `feat/pr-sync-status` (same tip, pre-issue rename). Do not delete until PR head is verified.
jcwalker3 added 1 commit 2026-07-17 09:51:17 -05:00
Prevent approved PRs from stalling when master advances. Add
gitea_assess_pr_sync_status and gitea_update_pr_branch_by_merge with
head/base pinning, author-only updates, conflict handoff, and approval
invalidation after head changes. Wire task capability map, sequential
controller routing in review-merge workflow, and hermetic AC tests.
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #728
issue: #727
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 56032-3c1cd4072ded
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-418
phase: claimed
candidate_head: 98fbfb3de7
target_branch: master
target_branch_sha: f65069d22d
last_activity: 2026-07-17T14:54:24Z
expires_at: 2026-07-17T16:54:24Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #728 issue: #727 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 56032-3c1cd4072ded worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-418 phase: claimed candidate_head: 98fbfb3de735069dd05670a3d8755e7c14349af1 target_branch: master target_branch_sha: f65069d22de8c08486a8f03de7018ae1372bf637 last_activity: 2026-07-17T14:54:24Z expires_at: 2026-07-17T16:54:24Z blocker: none
sysadmin requested changes 2026-07-17 09:56:57 -05:00
Dismissed
sysadmin left a comment
Owner

Canonical PR State

STATE: request_changes
WHO_IS_NEXT: author
NEXT_ACTION: Fix author-lock resolution for tracking-issue vs PR number mismatch; add regression tests; re-request review at new head.
NEXT_PROMPT:

Address REQUEST_CHANGES on PR #728 (Closes #727) at head 98fbfb3. gitea_update_pr_branch_by_merge only accepts author lock when issue_number == pr_number, so tracking issue #727 lock fails for PR #728. Accept live lock for linked tracking issue and/or branch-owning session lock. Add tests for issue_number != pr_number. No rebase/force-push. Independent re-review at new head.

WHAT_HAPPENED: Independent review of PR #728 at 98fbfb3 found blocking author-lock keying defect.
WHY: Author update path cannot run when tracking issue number differs from PR number.
ISSUE: #727
HEAD_SHA: 98fbfb3de7
REVIEW_STATUS: request_changes
MERGE_READY: no
BLOCKERS: Author lock requires issue_number == pr_number only.
VALIDATION: 28 focused tests passed; 117 related regression tests passed.
LAST_UPDATED_BY: sysadmin

## Canonical PR State STATE: request_changes WHO_IS_NEXT: author NEXT_ACTION: Fix author-lock resolution for tracking-issue vs PR number mismatch; add regression tests; re-request review at new head. NEXT_PROMPT: ```text Address REQUEST_CHANGES on PR #728 (Closes #727) at head 98fbfb3. gitea_update_pr_branch_by_merge only accepts author lock when issue_number == pr_number, so tracking issue #727 lock fails for PR #728. Accept live lock for linked tracking issue and/or branch-owning session lock. Add tests for issue_number != pr_number. No rebase/force-push. Independent re-review at new head. ``` WHAT_HAPPENED: Independent review of PR #728 at 98fbfb3 found blocking author-lock keying defect. WHY: Author update path cannot run when tracking issue number differs from PR number. ISSUE: #727 HEAD_SHA: 98fbfb3de735069dd05670a3d8755e7c14349af1 REVIEW_STATUS: request_changes MERGE_READY: no BLOCKERS: Author lock requires issue_number == pr_number only. VALIDATION: 28 focused tests passed; 117 related regression tests passed. LAST_UPDATED_BY: sysadmin
jcwalker3 added 1 commit 2026-07-17 12:30:58 -05:00
jcwalker3 added 1 commit 2026-07-17 12:57:28 -05:00
Resolve task_capability_map conflict by keeping PR-sync entries and #725
merger-lease map entries. Fix author ownership for PR #728 (issue #727):
prove lock via linked issue/session/branch instead of issue_number==pr_number.
Add regression tests for 727/728 ownership and unrelated issue rejection.
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #728
issue: #727
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 55661-26fe51186d16
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-728-c1c61e9
phase: claimed
candidate_head: c1c61e9b15
target_branch: master
target_branch_sha: fca3296883
last_activity: 2026-07-17T17:57:45Z
expires_at: 2026-07-17T19:57:45Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #728 issue: #727 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 55661-26fe51186d16 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-728-c1c61e9 phase: claimed candidate_head: c1c61e9b15f61689978ade90042bdaebe25aa9c4 target_branch: master target_branch_sha: fca32968837cecfbc085047d044919e16dfb6b23 last_activity: 2026-07-17T17:57:45Z expires_at: 2026-07-17T19:57:45Z blocker: none
sysadmin approved these changes 2026-07-17 12:58:02 -05:00
sysadmin left a comment
Owner

Canonical PR State

STATE: approved
WHO_IS_NEXT: merger
NEXT_ACTION: Merger acquires/adopts lease and merges PR #728 at pinned head c1c61e9b15 with confirmation MERGE PR 728.
NEXT_PROMPT:

Role: MERGER (prgs-merger / sysadmin)
Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools
Merge PR #728 at expected_head_sha=c1c61e9b15f61689978ade90042bdaebe25aa9c4.
Use gitea_adopt_merger_pr_lease or gitea_acquire_merger_pr_lease (#725), then gitea_merge_pr confirmation='MERGE PR 728'.

WHAT_HAPPENED: Independent prgs-reviewer (sysadmin) reviewed exact head c1c61e9 in clean detached worktree branches/review-pr-728-c1c61e9 via native MCP. Prior REQUEST_CHANGES (issue_number==pr_number ownership defect) is remediated. Master merged; capability map keeps PR-sync + #725 merger-lease entries. Focused ownership + pr_sync tests 34 passed; broader related suite 150 passed.
WHY: Ownership now uses linked issue/session/durable/branch locks; Issue #727 lock authorizes PR #728; unrelated issues fail closed. No force/rebase. Dual-pin sync lifecycle preserved with #725 lease path.
ISSUE: #727
HEAD_SHA: c1c61e9b15
REVIEW_STATUS: approved
MERGE_READY: yes
BLOCKERS: none
VALIDATION: pytest tests/test_pr_ownership_issue_pr_mismatch.py tests/test_pr_sync_status.py -> 34 passed; related suite 150 passed; mergeable true; eligibility approve ready
NATIVE_REVIEW_PROOF: transport=native_mcp; entrypoint=mcp_server; profile=prgs-reviewer; identity=sysadmin; tool=gitea_submit_pr_review; head=c1c61e9b15f61689978ade90042bdaebe25aa9c4; session=55661-26fe51186d16
LAST_UPDATED_BY: prgs-reviewer / sysadmin

## Canonical PR State STATE: approved WHO_IS_NEXT: merger NEXT_ACTION: Merger acquires/adopts lease and merges PR #728 at pinned head c1c61e9b15f61689978ade90042bdaebe25aa9c4 with confirmation MERGE PR 728. NEXT_PROMPT: ```text Role: MERGER (prgs-merger / sysadmin) Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools Merge PR #728 at expected_head_sha=c1c61e9b15f61689978ade90042bdaebe25aa9c4. Use gitea_adopt_merger_pr_lease or gitea_acquire_merger_pr_lease (#725), then gitea_merge_pr confirmation='MERGE PR 728'. ``` WHAT_HAPPENED: Independent prgs-reviewer (sysadmin) reviewed exact head c1c61e9 in clean detached worktree branches/review-pr-728-c1c61e9 via native MCP. Prior REQUEST_CHANGES (issue_number==pr_number ownership defect) is remediated. Master merged; capability map keeps PR-sync + #725 merger-lease entries. Focused ownership + pr_sync tests 34 passed; broader related suite 150 passed. WHY: Ownership now uses linked issue/session/durable/branch locks; Issue #727 lock authorizes PR #728; unrelated issues fail closed. No force/rebase. Dual-pin sync lifecycle preserved with #725 lease path. ISSUE: #727 HEAD_SHA: c1c61e9b15f61689978ade90042bdaebe25aa9c4 REVIEW_STATUS: approved MERGE_READY: yes BLOCKERS: none VALIDATION: pytest tests/test_pr_ownership_issue_pr_mismatch.py tests/test_pr_sync_status.py -> 34 passed; related suite 150 passed; mergeable true; eligibility approve ready NATIVE_REVIEW_PROOF: transport=native_mcp; entrypoint=mcp_server; profile=prgs-reviewer; identity=sysadmin; tool=gitea_submit_pr_review; head=c1c61e9b15f61689978ade90042bdaebe25aa9c4; session=55661-26fe51186d16 LAST_UPDATED_BY: prgs-reviewer / sysadmin
Owner

adopted_at: 2026-07-17T17:58:24Z
adopted_by_identity: sysadmin
adopted_by_profile: prgs-merger
adopted_from_session_id: 55661-26fe51186d16
adopted_from_profile: prgs-reviewer
adopted_from_reviewer_identity: sysadmin
adopted_from_comment_id: 12133
adoption_reason: merger-handoff-approved-head

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #728
issue: #727
reviewer_identity: sysadmin
profile: prgs-merger
session_id: 55660-13731b027d48
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/merge-pr-728-c1c61e9
phase: adopted
candidate_head: c1c61e9b15
target_branch: master
target_branch_sha: fca3296883
last_activity: 2026-07-17T17:58:24Z
expires_at: 2026-07-17T19:58:24Z
blocker: none

<!-- mcp-review-lease-adoption:v1 --> adopted_at: 2026-07-17T17:58:24Z adopted_by_identity: sysadmin adopted_by_profile: prgs-merger adopted_from_session_id: 55661-26fe51186d16 adopted_from_profile: prgs-reviewer adopted_from_reviewer_identity: sysadmin adopted_from_comment_id: 12133 adoption_reason: merger-handoff-approved-head <!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #728 issue: #727 reviewer_identity: sysadmin profile: prgs-merger session_id: 55660-13731b027d48 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/merge-pr-728-c1c61e9 phase: adopted candidate_head: c1c61e9b15f61689978ade90042bdaebe25aa9c4 target_branch: master target_branch_sha: fca32968837cecfbc085047d044919e16dfb6b23 last_activity: 2026-07-17T17:58:24Z expires_at: 2026-07-17T19:58:24Z blocker: none
sysadmin merged commit 58d6b5844f into master 2026-07-17 12:58:36 -05:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Scaled-Tech-Consulting/Gitea-Tools#728