fix(author): refresh durable issue-lock head after branch sync; recover merge-sync-drifted dead-session locks (Closes #871) #874

Merged
sysadmin merged 2 commits from fix/issue-871-durable-lock-head-refresh into master 2026-07-24 03:04:25 -05:00
Owner

Summary

Closes #871.

gitea_update_pr_branch_by_merge advances a PR's remote head but never advances the linked durable issue-lock's recorded head (head_sha). After the owning author session dies, the drifted lock can no longer be recovered by gitea_lock_issue, and the PR is stranded behind master. This is a control-plane lifecycle defect. This PR fixes it on both the write side and the read side.

Motivating failure

Surfaced live on PR #866 / Issue #855 (branch fix/issue-855-pr-scoped-merged-cleanup). A second cross-session base-sync deadlocked: the durable lock recorded head 24c52ab… while the live PR head had advanced to 499b87c… through a sanctioned merge-based branch sync, and no dead-session recovery relation covered "remote advanced past the recorded head via a sanctioned merge." PR #866, Issue #855, and their branch, worktree, durable lock, reviews, and leases are NOT modified by this PR.

Changes

  • Write-side durable-lock head refresh — on a successful gitea_update_pr_branch_by_merge, refresh the durable linked-issue lock's recorded head from the exact former head to the resulting head using compare-and-swap with read-after-write. A remote-head advance followed by a durable-lock refresh failure is reported as an explicit partial lifecycle failure, never as a fully successful synchronization.
  • Read-side sanctioned recovery — add a guarded published_owning_pr recovery relation for an already-drifted dead-session lock: recorded head is a proven strict ancestor of the live PR head via sanctioned merge-sync provenance, the former owner is dead, the worktree is clean, and no competing claimant/lease exists. Non-ancestor, rewritten/force-pushed, dirty, or live-foreign states stay protected.
  • Files: gitea_mcp_server.py, issue_lock_recovery.py, issue_lock_store.py, issue_lock_worktree.py, tests/test_issue_871_durable_lock_head_refresh.py.

Tests

New suite: 32 passed. Relevant suites: 272 passed. Full suite: 4,789 passed, 13 baseline-identical failures, 6 skipped.

Concurrent duplicate: #872

Issue #872 was filed concurrently and describes the read-side half of this same deadlock as a separate bug. It is a concurrent duplicate of #871 and is left open for controller or post-review deduplication. This PR makes no claim that #872 was independently fixed or merged, and does not publish #872's alternate uncommitted work.

Provenance disclosure

The single local commit 5d59c57c98a5c8709bbbe1d5d5ed13eab721b14d on this branch was created by a prior author session using a shell git commit, not the sanctioned author commit tool. Per governance the commit was not amended, cherry-picked, recreated, or rewritten to erase that history. It was published only after the native author workflow affirmatively authorized adoption: sanctioned dead-session ownership was read from the durable issue-lock record (recorded claimant jcwalker3 / prgs-author, generation 1); provenance was verified (parent = base master 89657a06…, clean registered worktree, exact head); and gitea_publish_unpublished_issue_branch returned publish_sanctioned before the remote head was created at the pinned SHA.

## Summary Closes #871. `gitea_update_pr_branch_by_merge` advances a PR's **remote** head but never advances the linked **durable issue-lock's recorded head** (`head_sha`). After the owning author session dies, the drifted lock can no longer be recovered by `gitea_lock_issue`, and the PR is stranded behind master. This is a control-plane lifecycle defect. This PR fixes it on both the write side and the read side. ## Motivating failure Surfaced live on PR #866 / Issue #855 (branch `fix/issue-855-pr-scoped-merged-cleanup`). A second cross-session base-sync deadlocked: the durable lock recorded head `24c52ab…` while the live PR head had advanced to `499b87c…` through a sanctioned merge-based branch sync, and no dead-session recovery relation covered "remote advanced past the recorded head via a sanctioned merge." PR #866, Issue #855, and their branch, worktree, durable lock, reviews, and leases are NOT modified by this PR. ## Changes - **Write-side durable-lock head refresh** — on a successful `gitea_update_pr_branch_by_merge`, refresh the durable linked-issue lock's recorded head from the exact former head to the resulting head using compare-and-swap with read-after-write. A remote-head advance followed by a durable-lock refresh failure is reported as an explicit **partial lifecycle failure**, never as a fully successful synchronization. - **Read-side sanctioned recovery** — add a guarded `published_owning_pr` recovery relation for an already-drifted dead-session lock: recorded head is a proven strict ancestor of the live PR head via sanctioned merge-sync provenance, the former owner is dead, the worktree is clean, and no competing claimant/lease exists. Non-ancestor, rewritten/force-pushed, dirty, or live-foreign states stay protected. - Files: `gitea_mcp_server.py`, `issue_lock_recovery.py`, `issue_lock_store.py`, `issue_lock_worktree.py`, `tests/test_issue_871_durable_lock_head_refresh.py`. ## Tests New suite: 32 passed. Relevant suites: 272 passed. Full suite: 4,789 passed, 13 baseline-identical failures, 6 skipped. ## Concurrent duplicate: #872 Issue #872 was filed concurrently and describes the read-side half of this same deadlock as a separate bug. It is a concurrent duplicate of #871 and is left open for controller or post-review deduplication. This PR makes no claim that #872 was independently fixed or merged, and does not publish #872's alternate uncommitted work. ## Provenance disclosure The single local commit `5d59c57c98a5c8709bbbe1d5d5ed13eab721b14d` on this branch was created by a prior author session using a shell `git commit`, not the sanctioned author commit tool. Per governance the commit was not amended, cherry-picked, recreated, or rewritten to erase that history. It was published only after the native author workflow affirmatively authorized adoption: sanctioned dead-session ownership was read from the durable issue-lock record (recorded claimant `jcwalker3` / `prgs-author`, generation 1); provenance was verified (parent = base master `89657a06…`, clean registered worktree, exact head); and `gitea_publish_unpublished_issue_branch` returned `publish_sanctioned` before the remote head was created at the pinned SHA.
jcwalker3 added 1 commit 2026-07-24 02:09:03 -05:00
`gitea_update_pr_branch_by_merge` advanced a PR's remote head but never
advanced the linked durable issue lock's recorded head. After the owning
session died the drifted lock became unrecoverable and no further
synchronization was possible (PR #866 / issue #855).

Write-side (prevents future drift):
- issue_lock_store.assess/apply_durable_lock_head_refresh: on a successful
  sync, CAS-refresh the durable lock's recorded head from the exact expected
  PR head to the resulting head, re-verifying repo/issue/branch/worktree/
  identity/profile/live-session ownership, with read-after-write verification.
- gitea_update_pr_branch_by_merge now refreshes the lock after the remote
  advance and reports a PARTIAL LIFECYCLE FAILURE (success=False) when the
  refresh fails, instead of falsely reporting a full synchronization.

Read-side (recovers already-drifted locks):
- issue_lock_worktree.read_merge_sync_provenance: server-side git observation
  proving a remote head is a sanctioned base-into-branch merge that preserved
  the branch mainline back to the recorded head.
- issue_lock_recovery: new HEAD_RELATION_REMOTE_MERGE_SYNCED accepts a
  dead-session lock whose recorded head is a strict merge-sync ancestor of the
  live PR head — and only that. Rewrites, rebases, force-pushes, non-ancestor
  heads, dirty worktrees, live/competing owners, and wrong repo/issue/branch/
  identity/profile all stay protected.

No existing exact-head, branch-protection, parity, workspace, identity, role,
or mutation-safety gate is weakened. All provenance is server-derived; nothing
is reachable from an MCP caller.

Tests: tests/test_issue_871_durable_lock_head_refresh.py (32 cases) covering
first/second sync, CAS, ownership, partial-failure, merge-sync recovery
happy-path and every fail-closed branch. Full suite: 4789 passed, 13 pre-
existing baseline failures unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01FZPyVh2DGczQrDxtqwGH5p
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #874
issue: #871
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 950-11a3a5205c9f
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-874-5d59c57
phase: claimed
candidate_head: 5d59c57c98
target_branch: master
target_branch_sha: 60df5087e9
last_activity: 2026-07-24T07:40:09Z
expires_at: 2026-07-24T07:50:09Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #874 issue: #871 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 950-11a3a5205c9f worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-874-5d59c57 phase: claimed candidate_head: 5d59c57c98a5c8709bbbe1d5d5ed13eab721b14d target_branch: master target_branch_sha: 60df5087e94e2f0504b5f3b8a6e1b01c976380c3 last_activity: 2026-07-24T07:40:09Z expires_at: 2026-07-24T07:50:09Z blocker: none
jcwalker3 added 1 commit 2026-07-24 02:42:55 -05:00
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #874
issue: #871
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 950-11a3a5205c9f
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-874-5d59c57
phase: released
candidate_head: 5d59c57c98
target_branch: master
target_branch_sha: 60df5087e9
last_activity: 2026-07-24T07:43:22Z
expires_at: 2026-07-24T07:53:22Z
blocker: manual-release

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #874 issue: #871 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 950-11a3a5205c9f worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-874-5d59c57 phase: released candidate_head: 5d59c57c98a5c8709bbbe1d5d5ed13eab721b14d target_branch: master target_branch_sha: 60df5087e94e2f0504b5f3b8a6e1b01c976380c3 last_activity: 2026-07-24T07:43:22Z expires_at: 2026-07-24T07:53:22Z blocker: manual-release
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #874
issue: none
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 3847-094f5a87c66a
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-874-e151759
phase: claimed
candidate_head: none
target_branch: master
target_branch_sha: 60df5087e9
last_activity: 2026-07-24T07:48:51Z
expires_at: 2026-07-24T07:58:51Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #874 issue: none reviewer_identity: sysadmin profile: prgs-reviewer session_id: 3847-094f5a87c66a worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-874-e151759 phase: claimed candidate_head: none target_branch: master target_branch_sha: 60df5087e94e2f0504b5f3b8a6e1b01c976380c3 last_activity: 2026-07-24T07:48:51Z expires_at: 2026-07-24T07:58:51Z blocker: none
sysadmin approved these changes 2026-07-24 02:52:52 -05:00
sysadmin left a comment
Owner

Canonical PR State

STATE: approved-pending-merge
WHO_IS_NEXT: merger
NEXT_ACTION: Merge PR #874 at exact head e151759212 via the sanctioned merger workflow (adopt this reviewer lease; do NOT base-sync — PR is 0 behind and mergeable).
NEXT_PROMPT:

gitea-merger: Merge approved PR #874 (Closes #871) in Scaled-Tech-Consulting/Gitea-Tools @ prgs.
Approved head: e151759212bb70b76daf20519ab58c97508ad747. Base master: 60df5087e94e2f0504b5f3b8a6e1b01c976380c3. commits_behind=0, mergeable=true, no conflicts, checks not required.
Reviewer APPROVE recorded at this exact head (sysadmin/prgs-reviewer). Adopt the reviewer PR lease (session 3847-094f5a87c66a, comment 15572), re-run merge preflight (whoami, resolve merge_pr, author-safety, approval_at_current_head, target fresh), then gitea_merge_pr at the pinned head. After merge, hand off to reconciler for branch/worktree/label cleanup and runtime parity.

WHAT_HAPPENED: Author base-synced PR #874 from former head 5d59c57 to e151759 (sanctioned merge of base master 60df5087). Fresh independent review at the new exact head; prior unrecorded analysis NOT reused. APPROVE recorded via native MCP review mutation.
WHY: Both required behaviors (write-side durable-lock CAS refresh + read-side merge-sync recovery relation) and all 17 acceptance criteria are met; fail-closed throughout (server-derived provenance, live-owner CAS, no self-grant/foreign-lock-renew); scope is exactly the 5 declared files; zero regressions in the touched subsystem at the reviewed head.
ISSUE: #871
HEAD_SHA: e151759212
REVIEW_STATUS: APPROVED
MERGE_READY: true
BLOCKERS: none
VALIDATION: worktree branches/review-pr-874-e151759 @ e151759 (clean before/after); tests/test_issue_871_durable_lock_head_refresh.py = 32 passed; related lock/recovery subsystem (753/755/768/772 + lock_store/worktree/provenance/adoption + #871) = 213 passed + 2 subtests; clean-merge proof: git diff 5d59c57 e151759 -- <5 PR files> empty and git diff 60df5087 e151759 -- <non-PR files> empty. Runner: venv/bin/python -m pytest.
LAST_UPDATED_BY: sysadmin / prgs-reviewer

NATIVE_REVIEW_PROOF: native MCP review mutation via gitea_submit_pr_review on prgs-reviewer; native_mcp_transport=true, production_native_mcp_transport=true, entrypoint=mcp_server (/Users/jasonwalker/Development/Gitea-Tools/gitea_mcp_server.py), native_token_fingerprint=fc2fec9ad753f652, pid=3847; no offline/import/helper path used.

Review detail

  • Base-sync provenance: new head e151759 is a merge commit parent1=5d59c57 (PR head, byte-identical PR content) parent2=60df5087 (base master).
  • Write-side (gitea_update_pr_branch_by_merge): durable-lock head refresh via CAS on expected_old_head; server-derived claimant; read-after-write; refresh failure => explicit partial_lifecycle_failure with success=false. ACs 1/5/6/16.
  • Read-side (_assess_remote_merge_synced / HEAD_RELATION_REMOTE_MERGE_SYNCED): older recorded head accepted ONLY on server-proven merge-sync provenance; provenance prior/synced heads re-validated against heads under assessment (blocks stale/hand-built reuse); requires prior_is_ancestor + is_merge_sync. ACs 3/4/7/8.
  • Git probe (read_merge_sync_provenance): pure server-side git — both-present, strict-ancestor, merge-commit(>=2 parents), first-parent-reaches-prior; every subprocess failure fails closed. Blocks rewrite/rebase/force-push.
  • Store CAS (assess_/apply_durable_lock_head_refresh): full ownership re-verification (repo/issue/branch/worktree-realpath/identity/profile) + live-owner pid required (blocks foreign-lock renewal & self-grant) + synced-head CAS + generation CAS + read-after-write.
  • Scope: exactly 5 declared files (+1325/-18); no unrelated files, secrets, or dangerous artifacts; no weakening of identity/role/parity/mutation-safety gates; protected #866/#855 resources untouched.

Files reviewed: gitea_mcp_server.py, issue_lock_recovery.py, issue_lock_store.py, issue_lock_worktree.py, tests/test_issue_871_durable_lock_head_refresh.py.

## Canonical PR State STATE: approved-pending-merge WHO_IS_NEXT: merger NEXT_ACTION: Merge PR #874 at exact head e151759212bb70b76daf20519ab58c97508ad747 via the sanctioned merger workflow (adopt this reviewer lease; do NOT base-sync — PR is 0 behind and mergeable). NEXT_PROMPT: ```text gitea-merger: Merge approved PR #874 (Closes #871) in Scaled-Tech-Consulting/Gitea-Tools @ prgs. Approved head: e151759212bb70b76daf20519ab58c97508ad747. Base master: 60df5087e94e2f0504b5f3b8a6e1b01c976380c3. commits_behind=0, mergeable=true, no conflicts, checks not required. Reviewer APPROVE recorded at this exact head (sysadmin/prgs-reviewer). Adopt the reviewer PR lease (session 3847-094f5a87c66a, comment 15572), re-run merge preflight (whoami, resolve merge_pr, author-safety, approval_at_current_head, target fresh), then gitea_merge_pr at the pinned head. After merge, hand off to reconciler for branch/worktree/label cleanup and runtime parity. ``` WHAT_HAPPENED: Author base-synced PR #874 from former head 5d59c57 to e151759 (sanctioned merge of base master 60df5087). Fresh independent review at the new exact head; prior unrecorded analysis NOT reused. APPROVE recorded via native MCP review mutation. WHY: Both required behaviors (write-side durable-lock CAS refresh + read-side merge-sync recovery relation) and all 17 acceptance criteria are met; fail-closed throughout (server-derived provenance, live-owner CAS, no self-grant/foreign-lock-renew); scope is exactly the 5 declared files; zero regressions in the touched subsystem at the reviewed head. ISSUE: #871 HEAD_SHA: e151759212bb70b76daf20519ab58c97508ad747 REVIEW_STATUS: APPROVED MERGE_READY: true BLOCKERS: none VALIDATION: worktree branches/review-pr-874-e151759 @ e151759 (clean before/after); tests/test_issue_871_durable_lock_head_refresh.py = 32 passed; related lock/recovery subsystem (753/755/768/772 + lock_store/worktree/provenance/adoption + #871) = 213 passed + 2 subtests; clean-merge proof: `git diff 5d59c57 e151759 -- <5 PR files>` empty and `git diff 60df5087 e151759 -- <non-PR files>` empty. Runner: venv/bin/python -m pytest. LAST_UPDATED_BY: sysadmin / prgs-reviewer NATIVE_REVIEW_PROOF: native MCP review mutation via gitea_submit_pr_review on prgs-reviewer; native_mcp_transport=true, production_native_mcp_transport=true, entrypoint=mcp_server (/Users/jasonwalker/Development/Gitea-Tools/gitea_mcp_server.py), native_token_fingerprint=fc2fec9ad753f652, pid=3847; no offline/import/helper path used. ## Review detail - Base-sync provenance: new head e151759 is a merge commit parent1=5d59c57 (PR head, byte-identical PR content) parent2=60df5087 (base master). - Write-side (`gitea_update_pr_branch_by_merge`): durable-lock head refresh via CAS on expected_old_head; server-derived claimant; read-after-write; refresh failure => explicit partial_lifecycle_failure with success=false. ACs 1/5/6/16. - Read-side (`_assess_remote_merge_synced` / HEAD_RELATION_REMOTE_MERGE_SYNCED): older recorded head accepted ONLY on server-proven merge-sync provenance; provenance prior/synced heads re-validated against heads under assessment (blocks stale/hand-built reuse); requires prior_is_ancestor + is_merge_sync. ACs 3/4/7/8. - Git probe (`read_merge_sync_provenance`): pure server-side git — both-present, strict-ancestor, merge-commit(>=2 parents), first-parent-reaches-prior; every subprocess failure fails closed. Blocks rewrite/rebase/force-push. - Store CAS (`assess_/apply_durable_lock_head_refresh`): full ownership re-verification (repo/issue/branch/worktree-realpath/identity/profile) + live-owner pid required (blocks foreign-lock renewal & self-grant) + synced-head CAS + generation CAS + read-after-write. - Scope: exactly 5 declared files (+1325/-18); no unrelated files, secrets, or dangerous artifacts; no weakening of identity/role/parity/mutation-safety gates; protected #866/#855 resources untouched. Files reviewed: gitea_mcp_server.py, issue_lock_recovery.py, issue_lock_store.py, issue_lock_worktree.py, tests/test_issue_871_durable_lock_head_refresh.py.
Owner

adopted_at: 2026-07-24T07:54:08Z
adopted_by_identity: sysadmin
adopted_by_profile: prgs-merger
adopted_from_session_id: 3847-094f5a87c66a
adopted_from_profile: prgs-reviewer
adopted_from_reviewer_identity: sysadmin
adopted_from_comment_id: 15572
adoption_reason: merger-handoff-approved-head

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #874
issue: none
reviewer_identity: sysadmin
profile: prgs-merger
session_id: 3855-59630be2aa96
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/merge-pr-874
phase: adopted
candidate_head: e151759212
target_branch: master
target_branch_sha: 60df5087e9
last_activity: 2026-07-24T07:54:08Z
expires_at: 2026-07-24T08:04:08Z
blocker: none

<!-- mcp-review-lease-adoption:v1 --> adopted_at: 2026-07-24T07:54:08Z adopted_by_identity: sysadmin adopted_by_profile: prgs-merger adopted_from_session_id: 3847-094f5a87c66a adopted_from_profile: prgs-reviewer adopted_from_reviewer_identity: sysadmin adopted_from_comment_id: 15572 adoption_reason: merger-handoff-approved-head <!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #874 issue: none reviewer_identity: sysadmin profile: prgs-merger session_id: 3855-59630be2aa96 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/merge-pr-874 phase: adopted candidate_head: e151759212bb70b76daf20519ab58c97508ad747 target_branch: master target_branch_sha: 60df5087e94e2f0504b5f3b8a6e1b01c976380c3 last_activity: 2026-07-24T07:54:08Z expires_at: 2026-07-24T08:04:08Z blocker: none
Owner

adopted_at: 2026-07-24T08:03:48Z
adopted_by_identity: sysadmin
adopted_by_profile: prgs-merger
adopted_from_session_id: 3855-59630be2aa96
adopted_from_profile: prgs-merger
adopted_from_reviewer_identity: sysadmin
adopted_from_comment_id: 15575
adoption_reason: merger-handoff-approved-head

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #874
issue: #871
reviewer_identity: sysadmin
profile: prgs-merger
session_id: 66164-bef8359d36bb
worktree: branches/merge-pr-874
phase: adopted
candidate_head: e151759212
target_branch: master
target_branch_sha: 60df5087e9
last_activity: 2026-07-24T08:03:48Z
expires_at: 2026-07-24T08:13:48Z
blocker: none

<!-- mcp-review-lease-adoption:v1 --> adopted_at: 2026-07-24T08:03:48Z adopted_by_identity: sysadmin adopted_by_profile: prgs-merger adopted_from_session_id: 3855-59630be2aa96 adopted_from_profile: prgs-merger adopted_from_reviewer_identity: sysadmin adopted_from_comment_id: 15575 adoption_reason: merger-handoff-approved-head <!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #874 issue: #871 reviewer_identity: sysadmin profile: prgs-merger session_id: 66164-bef8359d36bb worktree: branches/merge-pr-874 phase: adopted candidate_head: e151759212bb70b76daf20519ab58c97508ad747 target_branch: master target_branch_sha: 60df5087e94e2f0504b5f3b8a6e1b01c976380c3 last_activity: 2026-07-24T08:03:48Z expires_at: 2026-07-24T08:13:48Z blocker: none
sysadmin merged commit cc7dc8ac14 into master 2026-07-24 03:04:25 -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-merger` - timestamp: `2026-07-24T08:04:26.927322+00:00` - last terminal: `approve` on PR #874 - PR state: `closed` (merged=True) - merge_commit_sha: `cc7dc8ac1440ac2f6c3eb232ff7b303f885b4bed` - 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.
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #874
issue: #871
reviewer_identity: sysadmin
profile: prgs-merger
session_id: 66164-bef8359d36bb
worktree: branches/merge-pr-874
phase: released
candidate_head: e151759212
target_branch: master
target_branch_sha: 60df5087e9
last_activity: 2026-07-24T08:11:25Z
expires_at: 2026-07-24T08:21:25Z
blocker: post-merge-moot

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #874 issue: #871 reviewer_identity: sysadmin profile: prgs-merger session_id: 66164-bef8359d36bb worktree: branches/merge-pr-874 phase: released candidate_head: e151759212bb70b76daf20519ab58c97508ad747 target_branch: master target_branch_sha: 60df5087e94e2f0504b5f3b8a6e1b01c976380c3 last_activity: 2026-07-24T08:11:25Z expires_at: 2026-07-24T08:21:25Z blocker: post-merge-moot
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#874