fix(mcp): accept strict-descendant dead-session recovery (Closes #768)
Permit fail-closed recovery when a clean local head is a strict descendant of the recorded PR/remote head, with server-side ancestry proof. Propagate recovery evidence through commit, push, and PR duplicate gates so an owning PR is not re-blocked as competing work. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
This commit is contained in:
@@ -122,18 +122,30 @@ def _assess_owning_pr_exemption(
|
||||
f"the recovered branch '{token_branch}' (no owning-PR exemption)"
|
||||
)
|
||||
return False, notes
|
||||
if not token_head or not only_sha or only_sha != token_head:
|
||||
# #768: a descendant recovery is measured against the head the PR still
|
||||
# shows, then publishes the local descendant — so the live PR head is the
|
||||
# recorded head before that push and the accepted head after it. Both are
|
||||
# server-derived and name the same owned PR, so both are accepted; anything
|
||||
# else still fails closed.
|
||||
token_accepted = str(recovered_owning_pr.get("accepted_head") or "").strip()
|
||||
acceptable_heads = [head for head in (token_head, token_accepted) if head]
|
||||
if not acceptable_heads or not only_sha or only_sha not in acceptable_heads:
|
||||
notes.append(
|
||||
f"open PR #{only_number} head {only_sha or 'unknown'} does not "
|
||||
f"match the recovered head {token_head or 'unknown'} "
|
||||
"(no owning-PR exemption)"
|
||||
f"match the recovered head {token_head or 'unknown'}"
|
||||
+ (
|
||||
f" or the accepted head {token_accepted}"
|
||||
if token_accepted and token_accepted != token_head
|
||||
else ""
|
||||
)
|
||||
+ " (no owning-PR exemption)"
|
||||
)
|
||||
return False, notes
|
||||
|
||||
return True, [
|
||||
f"open PR #{only_number} is the exact PR already owned by the "
|
||||
f"recovering lock for issue #{issue_number} (branch '{token_branch}', "
|
||||
f"head {token_head}); not duplicate work"
|
||||
f"head {only_sha}); not duplicate work"
|
||||
]
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user