fix(mcp): acquire merger PR lease with structured capability resolution (Fixes #718) #725

Merged
sysadmin merged 6 commits from issue-718-fix-merger-lease into master 2026-07-17 12:52:21 -05:00
Owner

Summary

Fixes #718. Refs #723.

Adds a merger-native lease acquisition path and structured capability resolution so approved mergeable PRs are not deadlocked when the reviewer lease has expired/no_lease.

#718 — merger lease acquire path

Adds native gitea_acquire_merger_pr_lease so mergers can obtain lease proof when no active reviewer lease exists, without calling reviewer-only acquisition.

Hardening:

  • candidate_head required (exact-head scoping)
  • live PR head must match candidate_head
  • POST failure does not record partial session lease
  • requires gitea.read + gitea.pr.comment + gitea.pr.merge
  • foreign active lease still fail-closed
  • workspace binding failures return structured reasons
  • explicit org/repo forwarded into lease/review anti-stomp preflight

#723 — capability map / structured unknown task (partial; Refs only)

  • Map entries: acquire_reviewer_pr_lease / gitea_acquire_reviewer_pr_lease
  • Map aliases: gitea_acquire_merger_pr_lease, gitea_adopt_merger_pr_lease
  • gitea_resolve_task_capability: unknown tasks return reason_code=unknown_task
  • Role-exclusive set includes lease acquire/adopt tasks
  • mutation_performed=false on unknown-task responses

Broader #723 AC map↔router/profile coverage remains out of scope for this PR.

Tests

pytest tests/test_merger_lease_acquire.py \
  tests/test_resolve_task_capability.py \
  tests/test_anti_stomp_preflight.py -q

Head (pinned)

83bc7246ffe0bba45904d4bbb321f1322ab93d6f

Next role

Independent REVIEWER — do not self-review or merge.

## Summary **Fixes #718.** **Refs #723.** Adds a merger-native lease acquisition path and structured capability resolution so approved mergeable PRs are not deadlocked when the reviewer lease has expired/`no_lease`. ### #718 — merger lease acquire path Adds native **`gitea_acquire_merger_pr_lease`** so mergers can obtain lease proof when no active reviewer lease exists, without calling reviewer-only acquisition. Hardening: - **`candidate_head` required** (exact-head scoping) - live PR head must match `candidate_head` - POST failure does **not** record partial session lease - requires `gitea.read` + `gitea.pr.comment` + `gitea.pr.merge` - foreign active lease still fail-closed - workspace binding failures return structured reasons - explicit `org`/`repo` forwarded into lease/review anti-stomp preflight ### #723 — capability map / structured unknown task (partial; Refs only) - Map entries: `acquire_reviewer_pr_lease` / `gitea_acquire_reviewer_pr_lease` - Map aliases: `gitea_acquire_merger_pr_lease`, `gitea_adopt_merger_pr_lease` - `gitea_resolve_task_capability`: unknown tasks return **`reason_code=unknown_task`** - Role-exclusive set includes lease acquire/adopt tasks - `mutation_performed=false` on unknown-task responses Broader #723 AC map↔router/profile coverage remains out of scope for this PR. ### Tests ```text pytest tests/test_merger_lease_acquire.py \ tests/test_resolve_task_capability.py \ tests/test_anti_stomp_preflight.py -q ``` ### Head (pinned) `83bc7246ffe0bba45904d4bbb321f1322ab93d6f` ### Next role **Independent REVIEWER** — do not self-review or merge.
jcwalker3 added 1 commit 2026-07-17 00:44:27 -05:00
This implements the native merger lease acquisition tool to allow a merger session to acquire its own lease when a reviewer lease does not exist or has expired, unblocking #679 adoption.
jcwalker3 added 1 commit 2026-07-17 09:09:40 -05:00
Harden gitea_acquire_merger_pr_lease with required candidate_head, live-head
match, and fail-closed POST handling. Add capability-map aliases for reviewer
and merger lease acquire/adopt. Make unknown tasks return structured
unknown_task (no ValueError escape). Expand tests for roles, head scoping,
aliases, and unknown_task.

Closes #718. Addresses #723 resolver unknown_task and lease task mapping.
jcwalker3 changed title from Fixes #718 and #723: Implement gitea_acquire_merger_pr_lease to fix(mcp): gitea_acquire_merger_pr_lease + structured capability resolve (Closes #718, #723) 2026-07-17 09:10:02 -05:00
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #725
issue: #718
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 24551-4fd8c1c74c89
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-725-4f89400
phase: claimed
candidate_head: 4f894009f6
target_branch: master
target_branch_sha: 67e4a2b5e9
last_activity: 2026-07-17T14:14:50Z
expires_at: 2026-07-17T16:14:50Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #725 issue: #718 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 24551-4fd8c1c74c89 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-725-4f89400 phase: claimed candidate_head: 4f894009f6c49b55d706f0673212e07c1375f7cc target_branch: master target_branch_sha: 67e4a2b5e96b680a1dcb90a20c2ebf87357a3b1f last_activity: 2026-07-17T14:14:50Z expires_at: 2026-07-17T16:14:50Z blocker: none
jcwalker3 added 1 commit 2026-07-17 09:32:02 -05:00
jcwalker3 added 1 commit 2026-07-17 12:21:41 -05:00
jcwalker3 added 1 commit 2026-07-17 12:25:37 -05:00
gitea_acquire_merger_pr_lease previously continued when GET /pulls returned
an empty head SHA. Fail closed so exact-head scoping never proceeds with an
unresolvable live head. Add regression coverage for empty head payloads.

Fixes #718
Refs #723
jcwalker3 added 1 commit 2026-07-17 12:30:57 -05:00
_verify_role_mutation_workspace dropped org/repo, so anti-stomp resolved bare
remote=prgs to Timesheet and failed closed wrong_repo on Gitea-Tools. Forward
explicit org/repo for merger/reviewer lease acquire, adopt, review, merge, and
lease release. Add regression for merger acquire forwarding.

Fixes #718
Refs #723
jcwalker3 changed title from fix(mcp): gitea_acquire_merger_pr_lease + structured capability resolve (Closes #718, #723) to fix(mcp): acquire merger PR lease with structured capability resolution (Fixes #718) 2026-07-17 12:49:59 -05:00
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #725
issue: #718
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 48045-18339f86a5c2
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-725-83bc724
phase: claimed
candidate_head: 83bc7246ff
target_branch: master
target_branch_sha: 14d885b2d2
last_activity: 2026-07-17T17:50:39Z
expires_at: 2026-07-17T19:50:39Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #725 issue: #718 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 48045-18339f86a5c2 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-725-83bc724 phase: claimed candidate_head: 83bc7246ffe0bba45904d4bbb321f1322ab93d6f target_branch: master target_branch_sha: 14d885b2d2c4d9b7cf05136ac2efccb65ecde2de last_activity: 2026-07-17T17:50:39Z expires_at: 2026-07-17T19:50:39Z blocker: none
sysadmin approved these changes 2026-07-17 12:51:53 -05:00
sysadmin left a comment
Owner

Canonical PR State

STATE: approved
WHO_IS_NEXT: merger
NEXT_ACTION: Merger adopts reviewer lease and merges PR #725 at pinned head 83bc7246ff with confirmation MERGE PR 725.
NEXT_PROMPT:

Role: MERGER (prgs-merger / sysadmin)
Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools
Merge PR #725 at expected_head_sha=83bc7246ffe0bba45904d4bbb321f1322ab93d6f.

WHAT_HAPPENED: Independent prgs-reviewer (sysadmin) reviewed exact head 83bc724 in clean detached worktree via native MCP gitea_submit_pr_review. Scope: merger lease acquire + structured capability resolve (Fixes #718; Refs #723). Focused suite 84 passed.
WHY: ACs met: candidate_head required, live-head match, merge capability gate, foreign lease fail-closed, org/repo anti-stomp forward, unknown_task structured. Full #723 map-router out of scope as declared.
ISSUE: #718
HEAD_SHA: 83bc7246ff
REVIEW_STATUS: approved
MERGE_READY: yes
BLOCKERS: none
VALIDATION: pytest tests/test_merger_lease_acquire.py tests/test_resolve_task_capability.py tests/test_anti_stomp_preflight.py -> 84 passed
NATIVE_REVIEW_PROOF: transport=native_mcp; entrypoint=mcp_server; profile=prgs-reviewer; identity=sysadmin; tool=gitea_submit_pr_review; head=83bc7246ffe0bba45904d4bbb321f1322ab93d6f; session=48045-18339f86a5c2
LAST_UPDATED_BY: prgs-reviewer / sysadmin

## Canonical PR State STATE: approved WHO_IS_NEXT: merger NEXT_ACTION: Merger adopts reviewer lease and merges PR #725 at pinned head 83bc7246ffe0bba45904d4bbb321f1322ab93d6f with confirmation MERGE PR 725. NEXT_PROMPT: ```text Role: MERGER (prgs-merger / sysadmin) Repo: prgs / Scaled-Tech-Consulting / Gitea-Tools Merge PR #725 at expected_head_sha=83bc7246ffe0bba45904d4bbb321f1322ab93d6f. ``` WHAT_HAPPENED: Independent prgs-reviewer (sysadmin) reviewed exact head 83bc724 in clean detached worktree via native MCP gitea_submit_pr_review. Scope: merger lease acquire + structured capability resolve (Fixes #718; Refs #723). Focused suite 84 passed. WHY: ACs met: candidate_head required, live-head match, merge capability gate, foreign lease fail-closed, org/repo anti-stomp forward, unknown_task structured. Full #723 map-router out of scope as declared. ISSUE: #718 HEAD_SHA: 83bc7246ffe0bba45904d4bbb321f1322ab93d6f REVIEW_STATUS: approved MERGE_READY: yes BLOCKERS: none VALIDATION: pytest tests/test_merger_lease_acquire.py tests/test_resolve_task_capability.py tests/test_anti_stomp_preflight.py -> 84 passed NATIVE_REVIEW_PROOF: transport=native_mcp; entrypoint=mcp_server; profile=prgs-reviewer; identity=sysadmin; tool=gitea_submit_pr_review; head=83bc7246ffe0bba45904d4bbb321f1322ab93d6f; session=48045-18339f86a5c2 LAST_UPDATED_BY: prgs-reviewer / sysadmin
Owner

adopted_at: 2026-07-17T17:52:07Z
adopted_by_identity: sysadmin
adopted_by_profile: prgs-merger
adopted_from_session_id: 48045-18339f86a5c2
adopted_from_profile: prgs-reviewer
adopted_from_reviewer_identity: sysadmin
adopted_from_comment_id: 12119
adoption_reason: merger-handoff-approved-head

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #725
issue: #718
reviewer_identity: sysadmin
profile: prgs-merger
session_id: 48042-ae15b3d7e7d8
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/merge-pr-725-83bc724
phase: adopted
candidate_head: 83bc7246ff
target_branch: master
target_branch_sha: 14d885b2d2
last_activity: 2026-07-17T17:52:07Z
expires_at: 2026-07-17T19:52:07Z
blocker: none

<!-- mcp-review-lease-adoption:v1 --> adopted_at: 2026-07-17T17:52:07Z adopted_by_identity: sysadmin adopted_by_profile: prgs-merger adopted_from_session_id: 48045-18339f86a5c2 adopted_from_profile: prgs-reviewer adopted_from_reviewer_identity: sysadmin adopted_from_comment_id: 12119 adoption_reason: merger-handoff-approved-head <!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #725 issue: #718 reviewer_identity: sysadmin profile: prgs-merger session_id: 48042-ae15b3d7e7d8 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/merge-pr-725-83bc724 phase: adopted candidate_head: 83bc7246ffe0bba45904d4bbb321f1322ab93d6f target_branch: master target_branch_sha: 14d885b2d2c4d9b7cf05136ac2efccb65ecde2de last_activity: 2026-07-17T17:52:07Z expires_at: 2026-07-17T19:52:07Z blocker: none
sysadmin merged commit fca3296883 into master 2026-07-17 12:52:21 -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#725