feat: diagnose reviewer lease handoff next actions (Closes #599) #608

Merged
sysadmin merged 1 commits from feat/issue-599-reviewer-lease-handoff into master 2026-07-09 16:47:24 -05:00
Owner

Summary

Implements #599: a reviewer-safe, read-only diagnosis path for open-PR lease handoffs so agents get an explicit canonical next action when leases are foreign, expired, replaced, or worktree-bound incorrectly.

Changes

  • reviewer_pr_lease.diagnose_reviewer_pr_lease_handoff — pure classifier emitting:
    • classification: no_lease / own_active / own_expired / foreign_active / foreign_reclaimable / foreign_expired / instructed_lease_missing_with_replacement / worktree_binding_mismatch
    • next_action: acquire | wait | resume_exact_owner_session | release_expired_lease | repair_worktree_binding
    • lease identity fields (comment_id, session_id, phase, candidate_head, expires_at, freshness, worktree)
    • worktree binding match details
    • instructed-lease replacement flags (PR #592-style)
  • MCP tool gitea_diagnose_reviewer_pr_lease_handoff (read-only, gitea.read)
  • Tests covering foreign active wait, reclaimable release, own resume, binding mismatch, and instructed-lease replacement

Non-goals (unchanged)

  • No silent foreign lease steal
  • No merger adoption (#536) or post-merge moot cleanup (#515) scope changes
  • Forbidden: manual lock deletion, raw API bypass, mtime manipulation, _SESSION_LEASE seeding

Validation

  • pytest tests/test_reviewer_pr_lease.py -q16 passed
  • pytest tests/test_reviewer_pr_lease.py tests/test_post_merge_moot_lease.py tests/test_merger_lease_adoption.py -q43 passed

Closes #599

## Summary Implements #599: a reviewer-safe, read-only diagnosis path for open-PR lease handoffs so agents get an explicit canonical next action when leases are foreign, expired, replaced, or worktree-bound incorrectly. ## Changes - `reviewer_pr_lease.diagnose_reviewer_pr_lease_handoff` — pure classifier emitting: - `classification`: no_lease / own_active / own_expired / foreign_active / foreign_reclaimable / foreign_expired / instructed_lease_missing_with_replacement / worktree_binding_mismatch - `next_action`: acquire | wait | resume_exact_owner_session | release_expired_lease | repair_worktree_binding - lease identity fields (comment_id, session_id, phase, candidate_head, expires_at, freshness, worktree) - worktree binding match details - instructed-lease replacement flags (PR #592-style) - MCP tool `gitea_diagnose_reviewer_pr_lease_handoff` (read-only, `gitea.read`) - Tests covering foreign active wait, reclaimable release, own resume, binding mismatch, and instructed-lease replacement ## Non-goals (unchanged) - No silent foreign lease steal - No merger adoption (#536) or post-merge moot cleanup (#515) scope changes - Forbidden: manual lock deletion, raw API bypass, mtime manipulation, `_SESSION_LEASE` seeding ## Validation - `pytest tests/test_reviewer_pr_lease.py -q` → **16 passed** - `pytest tests/test_reviewer_pr_lease.py tests/test_post_merge_moot_lease.py tests/test_merger_lease_adoption.py -q` → **43 passed** Closes #599
jcwalker3 added 1 commit 2026-07-09 16:31:57 -05:00
Add read-only diagnose_reviewer_pr_lease_handoff and MCP tool
gitea_diagnose_reviewer_pr_lease_handoff so open-PR foreign leases,
instructed-lease replacement, reclaimable release, and worktree
binding mismatch return a canonical next_action without steal paths.

Closes #599
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #608
issue: #599
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 12847-d9fdcc12d780
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-608-issue-599
phase: claimed
candidate_head: 964505654f
target_branch: master
target_branch_sha: 7186718cfd
last_activity: 2026-07-09T21:37:07Z
expires_at: 2026-07-09T23:37:07Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #608 issue: #599 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 12847-d9fdcc12d780 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-608-issue-599 phase: claimed candidate_head: 964505654f0187f9a1763ddfc2c14070b38cfe51 target_branch: master target_branch_sha: 7186718cfd482179362b8e4aa3e180f2f97b0831 last_activity: 2026-07-09T21:37:07Z expires_at: 2026-07-09T23:37:07Z blocker: none
sysadmin approved these changes 2026-07-09 16:41:53 -05:00
sysadmin left a comment
Owner

Canonical PR State

STATE: open / mergeable / validated — formal APPROVE
WHO_IS_NEXT: merger
NEXT_ACTION: Merge PR #608 at head 964505654f with expected_head_sha pin after clean approval.
NEXT_PROMPT:

Merger: merge Scaled-Tech-Consulting/Gitea-Tools PR #608 at expected_head_sha=964505654f0187f9a1763ddfc2c14070b38cfe51 (remote=prgs, org=Scaled-Tech-Consulting, repo=Gitea-Tools). Do not re-review. Stay out of Timesheet.

WHAT_HAPPENED: Independent reviewer sysadmin/prgs-reviewer validated PR #608 (author jcwalker3). Scope: diagnose_reviewer_pr_lease_handoff + MCP tool + tests for #599. mergeable=true; merge-tree clean vs master 7186718. Lease suites 43 passed.
WHY: Acceptance for #599 met: canonical next_action for foreign/own/expired/instructed-replacement/worktree-mismatch; no steal paths; fail-closed acquisition intact.
ISSUE: #599 (PR #608)
HEAD_SHA: 964505654f
REVIEW_STATUS: APPROVE
MERGE_READY: yes (pending merger)
BLOCKERS: none
VALIDATION: pytest tests/test_reviewer_pr_lease.py tests/test_post_merge_moot_lease.py tests/test_merger_lease_adoption.py -q → 43 passed; py_compile clean; merge-tree clean
LAST_UPDATED_BY: prgs-reviewer (sysadmin)

## Canonical PR State STATE: open / mergeable / validated — formal APPROVE WHO_IS_NEXT: merger NEXT_ACTION: Merge PR #608 at head 964505654f0187f9a1763ddfc2c14070b38cfe51 with expected_head_sha pin after clean approval. NEXT_PROMPT: ```text Merger: merge Scaled-Tech-Consulting/Gitea-Tools PR #608 at expected_head_sha=964505654f0187f9a1763ddfc2c14070b38cfe51 (remote=prgs, org=Scaled-Tech-Consulting, repo=Gitea-Tools). Do not re-review. Stay out of Timesheet. ``` WHAT_HAPPENED: Independent reviewer sysadmin/prgs-reviewer validated PR #608 (author jcwalker3). Scope: diagnose_reviewer_pr_lease_handoff + MCP tool + tests for #599. mergeable=true; merge-tree clean vs master 7186718. Lease suites 43 passed. WHY: Acceptance for #599 met: canonical next_action for foreign/own/expired/instructed-replacement/worktree-mismatch; no steal paths; fail-closed acquisition intact. ISSUE: #599 (PR #608) HEAD_SHA: 964505654f0187f9a1763ddfc2c14070b38cfe51 REVIEW_STATUS: APPROVE MERGE_READY: yes (pending merger) BLOCKERS: none VALIDATION: pytest tests/test_reviewer_pr_lease.py tests/test_post_merge_moot_lease.py tests/test_merger_lease_adoption.py -q → 43 passed; py_compile clean; merge-tree clean LAST_UPDATED_BY: prgs-reviewer (sysadmin)
Owner

adopted_at: 2026-07-09T21:46:35Z
adopted_by_identity: sysadmin
adopted_by_profile: prgs-merger
adopted_from_session_id: 12847-d9fdcc12d780
adopted_from_profile: prgs-reviewer
adopted_from_reviewer_identity: sysadmin
adopted_from_comment_id: 8913
adoption_reason: merger-handoff-approved-head

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #608
issue: #599
reviewer_identity: sysadmin
profile: prgs-merger
session_id: 25531-6d7e9885d694
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/merge-pr-608
phase: adopted
candidate_head: 964505654f
target_branch: master
target_branch_sha: 7186718cfd
last_activity: 2026-07-09T21:46:35Z
expires_at: 2026-07-09T23:46:35Z
blocker: none

<!-- mcp-review-lease-adoption:v1 --> adopted_at: 2026-07-09T21:46:35Z adopted_by_identity: sysadmin adopted_by_profile: prgs-merger adopted_from_session_id: 12847-d9fdcc12d780 adopted_from_profile: prgs-reviewer adopted_from_reviewer_identity: sysadmin adopted_from_comment_id: 8913 adoption_reason: merger-handoff-approved-head <!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #608 issue: #599 reviewer_identity: sysadmin profile: prgs-merger session_id: 25531-6d7e9885d694 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/merge-pr-608 phase: adopted candidate_head: 964505654f0187f9a1763ddfc2c14070b38cfe51 target_branch: master target_branch_sha: 7186718cfd482179362b8e4aa3e180f2f97b0831 last_activity: 2026-07-09T21:46:35Z expires_at: 2026-07-09T23:46:35Z blocker: none
sysadmin merged commit a32c68e24b into master 2026-07-09 16:47:24 -05:00
Owner

Stale #332 review-decision lock cleanup (#594)

Status: APPLIED

Manual deletion of session-state files is not the workflow.
This path only clears a lock when the referenced PR is merged/closed.

## Stale #332 review-decision lock cleanup (#594) Status: **APPLIED** - actor: `sysadmin` - profile: `prgs-reviewer` - timestamp: `2026-07-09T21:48:01.191308+00:00` - last terminal: `approve` on PR #608 - PR state: `closed` (merged=True) - merge_commit_sha: `a32c68e24b4528c9c1ee321bbc61c5ec733c3d6d` - prior live_mutations_count: `1` - prior profile_identity: `prgs-reviewer` Manual deletion of session-state files is **not** the workflow. This path only clears a lock when the referenced PR is merged/closed.
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#608