fix: resolve reviewer preflight capability/lease deadlock (Closes #546) #553

Closed
jcwalker3 wants to merge 0 commits from fix/issue-546-reviewer-deadlock into master
Owner

Summary

Fixes the preflight capability/lease token clearance deadlock (Issue #546).

Root Cause

  • When a reviewer session calls gitea_resolve_task_capability(task="review_pr") to refresh its capability token (after it has been consumed by a mutation like gitea_acquire_reviewer_pr_lease), it invokes init_review_decision_lock.
  • init_review_decision_lock unconditionally cleared the session lease (reviewer_pr_lease.clear_session_lease()) and cleared the workflow load.
  • As a result, the session ended up with the resolved capability token but without the in-session lease, causing live review submissions to fail.

Fix

  • Modified init_review_decision_lock to support a force: bool = True parameter. When force=False (used during capability resolution), it checks if the decision lock is already initialized for the current remote, PID, and session profile lock. If it is, it returns early without clearing the active session lease or workflow load.
  • Added a new canonical MCP tool gitea_release_reviewer_pr_lease to allow reviewers to release their active leases on open PRs cleanly when a review fails before submission.
  • Added comprehensive regression tests in tests/test_mcp_server.py (TestIssue546Deadlock) to cover the review sequence and lease release paths.

Closes #546

## Summary Fixes the preflight capability/lease token clearance deadlock (Issue #546). ## Root Cause - When a reviewer session calls `gitea_resolve_task_capability(task="review_pr")` to refresh its capability token (after it has been consumed by a mutation like `gitea_acquire_reviewer_pr_lease`), it invokes `init_review_decision_lock`. - `init_review_decision_lock` unconditionally cleared the session lease (`reviewer_pr_lease.clear_session_lease()`) and cleared the workflow load. - As a result, the session ended up with the resolved capability token but without the in-session lease, causing live review submissions to fail. ## Fix - Modified `init_review_decision_lock` to support a `force: bool = True` parameter. When `force=False` (used during capability resolution), it checks if the decision lock is already initialized for the current remote, PID, and session profile lock. If it is, it returns early without clearing the active session lease or workflow load. - Added a new canonical MCP tool `gitea_release_reviewer_pr_lease` to allow reviewers to release their active leases on open PRs cleanly when a review fails before submission. - Added comprehensive regression tests in `tests/test_mcp_server.py` (`TestIssue546Deadlock`) to cover the review sequence and lease release paths. Closes #546
jcwalker3 added 1 commit 2026-07-08 14:30:33 -05:00
jcwalker3 added 1 commit 2026-07-08 14:40:22 -05:00
Author
Owner

PR #553 Update Comment

  • Old Head SHA: dfbee45309abf42c107a686e041996f9aee34950
  • New Head SHA: 535da1bc5afb273296275bc6cf470ce5f4380232
  • Exact File Changed: tests/test_mcp_server.py
  • Validation Results:
    • git diff --check prgs/master...HEAD: Clean (exit code 0)
    • python -m pytest tests/test_mcp_server.py::TestIssue546Deadlock -q: Passed (2 passed)
    • python -m pytest tests/test_merger_lease_adoption.py -q: Passed (9 passed)
  • Confirmations:
    • Confirmed that no other files or code were changed.
    • Confirmed that this commit only fixes the diff-check EOF blank line blocker.

I request a fresh reviewer approval for PR #553.

### PR #553 Update Comment * **Old Head SHA:** `dfbee45309abf42c107a686e041996f9aee34950` * **New Head SHA:** `535da1bc5afb273296275bc6cf470ce5f4380232` * **Exact File Changed:** `tests/test_mcp_server.py` * **Validation Results:** * `git diff --check prgs/master...HEAD`: **Clean** (exit code 0) * `python -m pytest tests/test_mcp_server.py::TestIssue546Deadlock -q`: **Passed** (2 passed) * `python -m pytest tests/test_merger_lease_adoption.py -q`: **Passed** (9 passed) * **Confirmations:** * Confirmed that no other files or code were changed. * Confirmed that this commit only fixes the diff-check EOF blank line blocker. I request a fresh reviewer approval for PR #553.
Owner

test comment

test comment
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #553
issue: none
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 1215-680c2f2c8d20
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr553
phase: claimed
candidate_head: 535da1bc5a
target_branch: master
target_branch_sha: none
last_activity: 2026-07-08T19:50:49Z
expires_at: 2026-07-08T21:50:49Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #553 issue: none reviewer_identity: sysadmin profile: prgs-reviewer session_id: 1215-680c2f2c8d20 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr553 phase: claimed candidate_head: 535da1bc5afb273296275bc6cf470ce5f4380232 target_branch: master target_branch_sha: none last_activity: 2026-07-08T19:50:49Z expires_at: 2026-07-08T21:50:49Z blocker: none
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #553
issue: none
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 1215-680c2f2c8d20
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr553
phase: claimed
candidate_head: 535da1bc5a
target_branch: master
target_branch_sha: none
last_activity: 2026-07-08T19:52:52Z
expires_at: 2026-07-08T21:52:52Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #553 issue: none reviewer_identity: sysadmin profile: prgs-reviewer session_id: 1215-680c2f2c8d20 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr553 phase: claimed candidate_head: 535da1bc5afb273296275bc6cf470ce5f4380232 target_branch: master target_branch_sha: none last_activity: 2026-07-08T19:52:52Z expires_at: 2026-07-08T21:52:52Z blocker: none
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #553
issue: none
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 1215-680c2f2c8d20
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr553
phase: claimed
candidate_head: 535da1bc5a
target_branch: master
target_branch_sha: none
last_activity: 2026-07-08T19:54:07Z
expires_at: 2026-07-08T21:54:07Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #553 issue: none reviewer_identity: sysadmin profile: prgs-reviewer session_id: 1215-680c2f2c8d20 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr553 phase: claimed candidate_head: 535da1bc5afb273296275bc6cf470ce5f4380232 target_branch: master target_branch_sha: none last_activity: 2026-07-08T19:54:07Z expires_at: 2026-07-08T21:54:07Z blocker: none
Author
Owner

Bootstrap preflight diagnosis for merge of PR #553

Performed per controller bootstrap task for #553 / #546.

Durable authorization check:

  • #557 (bootstrap policy issue): body defines requirement for "explicitly authorized by a controller-approved bootstrap decision record on Gitea". Comments: none.
  • #553 comments: only update, test, and lease metadata (contaminated as noted in query; no authorization text for bootstrap merge).
  • No durable controller authorization for one-off bootstrap merge of PR #553 found in Gitea on #557 or #553.

PR #553 status (live):

  • Open, mergeable: true, head: fix/issue-546-reviewer-deadlock
  • Head SHA (confirmed via list_prs): 535da1bc5a (matches required exactly).
  • No newer commits.
  • Changed files per body: gitea_mcp_server.py, tests/test_mcp_server.py (matches required limit).

Contaminated comments: noted (#7247, #7251, #7252); #7265 clean lease; not used as review proof.

Verification evidence from isolated worktree:

  • Could not execute git diff --check, python -m pytest ... because run_terminal_command fails with "Terminal error: IO Error: No such file or directory (os error 2)" (reproduces #556 blocker).
  • Used MCP + FS inspection only. No shell commands succeeded.

No merge performed (authorization not durably recorded in Gitea; terminal verification unavailable).

States unchanged: PR #553 open; Issue #546 open.

No unsafe fallback used.

Single next action: Post explicit durable authorization on #557 or #553 (e.g. "Controller authorizes bootstrap merge of PR #553 at head 535da1bc5a after verification. Use gitea_merge_pr confirmation='MERGE PR 553', expected_head_sha='535da1bc5afb273296275bc6cf470ce5f4380232'. Narrow exception only per #557."). Fix terminal launcher (see #556). Re-execute bootstrap task once both are resolved. Do not merge until then.

## Bootstrap preflight diagnosis for merge of PR #553 Performed per controller bootstrap task for #553 / #546. **Durable authorization check:** - #557 (bootstrap policy issue): body defines requirement for "explicitly authorized by a controller-approved bootstrap decision record on Gitea". Comments: none. - #553 comments: only update, test, and lease metadata (contaminated as noted in query; no authorization text for bootstrap merge). - No durable controller authorization for one-off bootstrap merge of PR #553 found in Gitea on #557 or #553. **PR #553 status (live):** - Open, mergeable: true, head: fix/issue-546-reviewer-deadlock - Head SHA (confirmed via list_prs): 535da1bc5afb273296275bc6cf470ce5f4380232 (matches required exactly). - No newer commits. - Changed files per body: gitea_mcp_server.py, tests/test_mcp_server.py (matches required limit). **Contaminated comments:** noted (#7247, #7251, #7252); #7265 clean lease; not used as review proof. **Verification evidence from isolated worktree:** - Could not execute `git diff --check`, `python -m pytest ...` because `run_terminal_command` fails with "Terminal error: IO Error: No such file or directory (os error 2)" (reproduces #556 blocker). - Used MCP + FS inspection only. No shell commands succeeded. **No merge performed** (authorization not durably recorded in Gitea; terminal verification unavailable). **States unchanged:** PR #553 open; Issue #546 open. **No unsafe fallback used.** **Single next action:** Post explicit durable authorization on #557 or #553 (e.g. "Controller authorizes bootstrap merge of PR #553 at head 535da1bc5afb273296275bc6cf470ce5f4380232 after verification. Use gitea_merge_pr confirmation='MERGE PR 553', expected_head_sha='535da1bc5afb273296275bc6cf470ce5f4380232'. Narrow exception only per #557."). Fix terminal launcher (see #556). Re-execute bootstrap task once both are resolved. Do not merge until then.
sysadmin closed this pull request 2026-07-08 15:13:13 -05:00

Pull request closed

This pull request cannot be reopened because the branch was deleted.
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#553