fix(mcp): allow create_issue from clean control checkout (Closes #749) #750
Merged
sysadmin
merged 2 commits from 2026-07-18 21:38:07 -05:00
fix/issue-749-create-issue-bootstrap into master
Labels
Clear labels
allocator
anti-stomp
architecture
bug
chore
codex
concurrency
contamination
control-plane
dashboard
database
design
documentation
enhancement
gitea
glitchtip
important
incident
incident-bridge
integration
jenkins
labels
leases
mcp
mcp-health
mcp-menu
multi-project
mutating
nice-to-have
observability
portability
preflight
protected-branch
queue
read-only
reconnect
recovery
refactor
release
reliability
resumable-review
reviewer
roadmap
safety
security
self-hosted
sentry
stale-runtime
status:blocked
status:in-progress
status:pr-open
status:ready
terminal-lock
testing
tracker
type:bug
type:feature
type:feature
type:guardrail
visibility
workflow
workflow-hardening
workflow-hardening
Controller-owned work allocator
Prevent concurrent LLM session stomping
Architecture / structural design
OpenAI Codex client / workflow session surface
Concurrent session safety
Workflow or session contamination incident
MCP control-plane coordination and allocation authority
MCP operational dashboard/queue view
Internal coordination storage (SQLite/Postgres)
Design / investigation, no implementation
Docs / runbooks
New feature or improvement
Gitea MCP workflow
GlitchTip integration
Operational or process incident requiring durable audit trail
Sentry-to-Gitea incident bridging
Integration testing
Jenkins integration
Label taxonomy management
Lease adopt/release/expire lifecycle
MCP server / tooling
MCP namespace and runtime health
MCP menu surface
Work spanning multiple monitoring projects or Gitea repos
Mutating action; requires gating
Observability, metrics, traces, error reporting
Cross-platform / portability
Shared preflight gates before mutation
Protected branch / stable-branch policy concern
Work queue visibility and allocation
Read-only, no mutation
MCP client reconnect/reload recovery path
Recovery paths for stale/foreign leases
Code refactor / restructure
Release / versioning
Reliability / failure handling
Persist and resume prepared review verdicts across sessions
Reviewer workflow tooling
Roadmap / umbrella issue
Safety rails and fail-closed mutation guards
Security / trust boundary
Self-hosted infrastructure integration
Sentry error monitoring integration
Stale backend daemon / runtime-vs-master parity failures
Issue is blocked
Issue is being worked on
Issue has an open pull request
Issue is ready for work
Terminal review lock (#332) path
Tests / test coverage
Issue tracker hygiene / meta
Bug or defect
Feature or enhancement
Feature or enhancement
Safety gate or guardrail
Workflow state visibility for LLMs/operators
Cross-tool workflow
LLM workflow coordination hardening
LLM workflow coordination hardening
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: Scaled-Tech-Consulting/Gitea-Tools#750
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #749.
Base:
fdab6b6c69717d32a0d50e233413cf09be83f6e8Problem
gitea_create_issueis a pure remote mutation, but the #274 branches-only guard required abranches/worktree that the issue-first gate forbids creating before the issue number exists. Sessions improvised with dummy directories or borrowed worktrees.Design (phase-scoped bootstrap — cannot widen)
Treat only
create_issue/gitea_create_issueas a pre-issue bootstrap mutation.Allowed from the exact canonical control checkout when it is:
master/main/dev)Still fail closed for:
branches/mkdir fakes (#713 still applies on the ordinary path)lock_issue, commit, push,create_pr, …)The exemption is gated on
task ∈ {create_issue, gitea_create_issue}andworkspace == canonical_repo_root. No global skip of #274. No bootstrap worktree registry. No change togitea_close_issue(#711 remains out of scope).When bootstrap blocks,
exact_next_actionis satisfiable before an issue number exists (restore clean control; do not inventbranches/issue-<N>-*).Files changed
create_issue_bootstrap.pygitea_mcp_server.pyworkflow_scope_guard.pymutation_tasktests/test_create_issue_bootstrap.pytests/test_create_issue_workspace_guard.pyskills/.../create-issue.md§18adocs/llm-workflow-runbooks.mdResolver / mutation pairing
create_issuegitea_create_issuecreate_issuegitea.issue.create+ authorTests
tests/— 3442 passed, 6 skipped, 2 failed (same 2 as cleanfdab6b6baseline):test_issue_702_review_findings_f1_f6.py::...test_removed_worktree_recovers_before_probetest_reconciler_supersession_close.py::...test_tool_posts_comment_and_closes_superseded_pr_issuegit diff --check— cleanSafety
repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #750
issue: #749
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 59807-58592a30ecdb
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-750
phase: claimed
candidate_head:
e349839fd7target_branch: master
target_branch_sha:
fdab6b6c69last_activity: 2026-07-18T20:24:24Z
expires_at: 2026-07-18T20:34:24Z
blocker: none
repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #750
issue: #749
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 59807-58592a30ecdb
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-750
phase: reviewing
candidate_head:
e349839fd7target_branch: master
target_branch_sha:
fdab6b6c69last_activity: 2026-07-18T20:27:15Z
expires_at: 2026-07-18T20:37:15Z
blocker: none
repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #750
issue: #749
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 59807-58592a30ecdb
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-750
phase: validating
candidate_head:
e349839fd7target_branch: master
target_branch_sha:
fdab6b6c69last_activity: 2026-07-18T20:29:04Z
expires_at: 2026-07-18T20:39:04Z
blocker: none
repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #750
issue: #749
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 59807-58592a30ecdb
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-750
phase: verdict_prepared
candidate_head:
e349839fd7target_branch: master
target_branch_sha:
fdab6b6c69last_activity: 2026-07-18T20:33:33Z
expires_at: 2026-07-18T20:43:33Z
blocker: none
Independent native reviewer verdict: APPROVE at exact head
e349839fd739e10af2df9c0f429ac487e8ca8b9d.Fresh reviewer session (
gitea-reviewer/sysadmin/prgs-reviewer/ rolereviewer, remoteprgs, non-root UID 502). Runtime/master parity verified atfdab6b6c69717d32a0d50e233413cf09be83f6e8. Detached review worktree created at the exact PR head. No merge performed.Scope and correctness
The exemption is genuinely phase-scoped and cannot widen:
CREATE_ISSUE_TASKS = {create_issue, gitea_create_issue}with exact (stripped) membership matching — no prefix or substring match. Every other author task (lock_issue,close_issue, commit, push,create_pr, branch update, review, merge, cleanup) reaches the assessor asnot_applicableand keeps the ordinary fail-closed path.os.path.realpathand are compared withworkspace != root. Symlinked and non-existent paths normalize and fail closed. A repository with a similar name or a path sharing a prefix is rejected.branches/short-circuit tonot_applicablebefore the root check, somkdir-only fakes and unrelated worktrees fall through to the ordinary #274 path plusassess_workspace_repo_membership(git-common-dir identity) rather than receiving the exemption. Verified bytest_arbitrary_branches_directory_not_bootstrap._enforce_root_checkout_guard(#475) runs before_enforce_branches_only_author_mutationin both production branches ofverify_preflight_purityand already blocks dirty tracked files, detached HEAD, non-base branches, and HEAD not equal to tracking master — using the same unwrappedresolve_remote_master_sha. The new bootstrap assessor repeats those checks as defense in depth._enforce_canonical_repository_root(#706) plus the session-context pin; explicitorg/repocontinue to flow only into the permission block and anti-stomp preflight as confirm-only inputs. This PR adds no redirect surface.create_issue, andverify_preflight_purityfail-closes on any resolved-vs-required task mismatch.require_lockis relaxed only forcreate_issue(no lock can exist pre-issue), andEXACT_NEXT_ACTION_POST_CREATEdirects the session to a registeredbranches/issue-<N>-*worktree for all subsequent mutations.BLOCKER_MISSING_WORKTREEblock with anexact_next_actionthat is satisfiable before an issue number exists (restore clean control; never "create branches/issue--*"). Messages carry local root/workspace paths only, matching the existingformat_root_checkout_guard_errorconvention; no credentials or endpoints are emitted.Non-blocking observations
_enforce_branches_only_author_mutationwrapsresolve_remote_master_shain a bareexcept Exception: remote_master_sha = None, which silently degrades the bootstrap's own base-equivalence check. Not exploitable in the composed path — the unwrapped_enforce_root_checkout_guardperforms the same comparison first and raises — but a short comment naming that dependency would prevent a future reorder from turning this into a fail-open.assess_root_source_mutationkeys its create_issue suppression ondirty_source_files(source/test only), which is looser than the assessor's all-trackedparse_dirty_tracked_files. Safe only because the stricter gates run earlier; worth noting the ordering dependency in the docstring._production_guard_block_from_excrecovers the next action viatext.split("exact_next_action:", 1), a fragile string coupling to the message format. Cosmetic.None of these change behavior at this head and none block merge.
Validation performed
fdab6b6c6971: 3425 passed, 6 skipped, 2 failed — the same two tests (test_issue_702_review_findings_f1_f6.py::TestF1RecoveryBeforeTerminalProbe::test_removed_worktree_recovers_before_probe,test_reconciler_supersession_close.py::TestReconcilerSupersessionMcpTool::test_tool_posts_comment_and_closes_superseded_pr_issue). The pre-existing claim is independently reproduced; the PR adds 17 passing tests and introduces no new failure.test_create_issue_stable_checkout_bootstrap_allowed_when_cleanfails on cleanfdab6b6(AssertionError: None != 77) and passes at head;test_create_issue_bootstrap.pycannot even import on baseline (ModuleNotFoundError: create_issue_bootstrap). The tests genuinely exercise the new behavior.git diff --checkover the PR range: clean.create-issue.mdsection 18a andllm-workflow-runbooks.mdmatches the implemented behavior.Canonical PR State
STATE:
approved
WHO_IS_NEXT:
merger
NEXT_ACTION:
A separate merger session must re-verify the approval at exact head
e349839fd739e10af2df9c0f429ac487e8ca8b9d, confirm checks, and merge.NEXT_PROMPT:
Merge PR #750 in Scaled-Tech-Consulting/Gitea-Tools using a fresh gitea-merger session (sysadmin / prgs-merger / merger, remote prgs). Verify runtime/master parity, confirm the APPROVED review is valid at exact head
e349839fd7, confirm no foreign lease, acquire the merger lease, re-check mergeability and checks status, then merge. Do not re-review. Do not modify configuration, launchers, or credentials.WHAT_HAPPENED:
An independent leased reviewer validated the #749 create_issue bootstrap exemption at the exact PR head and posted an APPROVED review to Gitea.
WHY:
The exemption is exactly scoped to create_issue / gitea_create_issue and to the exact canonical control checkout, is double-gated by the pre-existing root-checkout guard, preserves #274 and #713 behavior for every other path, and its new behavior is proven by tests that fail on the clean baseline and pass at head.
ISSUE:
#749
BASE:
master
HEAD:
fix/issue-749-create-issue-bootstrap
HEAD_SHA:
e349839fd7REVIEW_STATUS:
approved
VALIDATION:
Full suite at head 3442 passed / 6 skipped / 2 failed; clean baseline
fdab6b6c69reproduces the identical 2 failures with 3425 passed; new success case fails on baseline and passes at head; 255 focused related tests passed; git diff --check clean.BLOCKERS:
none
SUPERSEDES:
none
SUPERSEDED_BY:
none
MERGE_READY:
yes — approval is valid at the exact current head, base is current (0 commits behind), and no conflicts; the merger must still confirm checks status, which was pending at review time.
LAST_UPDATED_BY:
sysadmin / prgs-reviewer / 2026-07-18
NATIVE_REVIEW_PROOF: transport=native_mcp; namespace=gitea-reviewer; profile=prgs-reviewer; identity=sysadmin; tool=gitea_submit_pr_review; reviewed_head=e349839fd739e10af2df9c0f429ac487e8ca8b9d; parity=fdab6b6c69717d32a0d50e233413cf09be83f6e8; lease_session=59807-58592a30ecdb
[THREAD STATE LEDGER] PR #750 / Issue #749 — APPROVED review posted to Gitea at head e349839f; merge not performed.
What is true now:
e349839fd7fdab6b6c69What changed:
What is blocked:
Who/what acts next:
e349839fd7, confirms checks, acquires the merger lease, and merges.e349839fd7with the reviewer lease terminally released.repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #750
issue: #749
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 59807-58592a30ecdb
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-750
phase: released
candidate_head:
e349839fd7target_branch: master
target_branch_sha:
fdab6b6c69last_activity: 2026-07-18T20:36:42Z
expires_at: 2026-07-18T20:46:42Z
blocker: manual-release
[THREAD STATE LEDGER] PR #750 / Issue #749 — author reconciliation complete; base merge-committed into the PR branch; new exact head
5e0e474350eaf0679a226b539cfb8afc68b01406requires fresh independent review.What is true now:
e349839fd739e10af2df9c0f429ac487e8ca8b9d;approval_visible=true,approval_at_current_head=false,review_feedback_stale=true,has_blocking_change_requests=false. No new review verdict was recorded by this author session.5e0e474350eaf0679a226b539cfb8afc68b01406.043df0f7df220ad67ac1c3fefdcf3897dad9478bin a clean detached worktree, so they are pre-existing and not introduced here. Focused suites: 127 passed (#749 bootstrap, workspace guard, #751 checks assessor, #753 dead-PID recovery, #755 owning-PR recovery); 136 passed + 16 subtests (issue-lock store/worktree/adoption/provenance, workflow scope guards, author-mutation worktree, anti-stomp preflight, PR-ownership mismatch, reviewer worktree ownership).git diff --checkover the PR range clean.py_compileclean on all three changed sources.What changed:
gitea_lock_issuepath deployed by #753 + #755. Prior session pid 48545 was confirmed dead; replacement session pid 55693 now owns the lock with a renewed lease expiring 2026-07-19T06:15:56Z. Recovery provenance recorded:recovered=true, reason "owning MCP session exited; durable ownership evidence matched", with local/remote/PR heads alle349839fat recovery time and PR #750 identified as the exact owning PR. No lock file was hand-edited, no base-equivalence recovery worktree was created, and no stacked-base input was used.gitea_update_pr_branch_by_mergemerge-committed live base043df0f7df220ad67ac1c3fefdcf3897dad9478bintofix/issue-749-create-issue-bootstrapvia the native Gitea API, style=merge.force_push=false,rebase=false. Head advancede349839f->5e0e4743. No rebase, reset, amend, squash, cherry-pick, or force push occurred. No conflict arose.mergeable=true,has_conflicts=false,checks_required=false,checks_status=not_required.create_issue_bootstrap.py,gitea_mcp_server.py,workflow_scope_guard.py,tests/test_create_issue_bootstrap.py,tests/test_create_issue_workspace_guard.py, thecreate-issue.mdworkflow doc,docs/llm-workflow-runbooks.md). The merge commit introduces no duplication or reversion of #751, #753, or #755 — those land as ancestors via master and are therefore absent from the PR diff.What is blocked:
5e0e4743;stale_approval=trueandapproval_valid_for_merge=false. A fresh independent reviewer verdict at the exact new head is required before any merge is attempted.Who/what acts next:
5e0e474350eaf0679a226b539cfb8afc68b01406, must acquire the reviewer PR lease, verify runtime/master parity, review the exact new head, and record a verdict through the native review API.5e0e474350eaf0679a226b539cfb8afc68b01406, base master043df0f7df220ad67ac1c3fefdcf3897dad9478b, no reviewer or merger lease outstanding.Canonical Issue State
STATE:
pr-open-awaiting-fresh-review
WHO_IS_NEXT:
reviewer
NEXT_ACTION:
A fresh independent Grok reviewer session must review PR #750 at exact head
5e0e474350eaf0679a226b539cfb8afc68b01406and record a verdict via the native review API. Review 466 is pinned to the former head and cannot authorize the new one.NEXT_PROMPT:
WHAT_HAPPENED:
The author session recovered the dead-session #749 lock through the newly deployed #753 + #755 native recovery path, then merge-committed live master into the PR branch via the sanctioned author update-by-merge tool. The head advanced from
e349839fto5e0e4743, which invalidated the former-head review verdict and routed the PR to fresh independent review.WHY:
Branch protection required the PR branch to contain the current base, and the PR was 6 commits behind after #751, #753, and #755 landed on master. The author-only update-by-merge path is the sanctioned remedy: it never rebases or force-pushes, it pins both expected heads so a concurrent race fails closed, and it explicitly invalidates the former-head verdict rather than carrying approval across a head change.
RELATED_PRS:
#756 (#755 owning-PR recovery, landed on master and enabling this recovery), #754 (#753 dead-PID recovery, landed on master), #752 (#751 checks assessor, landed on master), #746 (open, unrelated, deliberately untouched by this session)
BLOCKERS:
none for the author phase; the PR itself carries a stale-head gate — review 466 cannot authorize head
5e0e4743, so a fresh reviewer verdict at the exact new head is a precondition for any merge.VALIDATION:
Full suite at head
5e0e4743: 3546 passed, 6 skipped, 2 failed, 365 subtests passed. The identical 2 failures reproduce on pristine master043df0f7in a clean detached worktree (test_issue_702_review_findings_f1_f6.py::TestF1RecoveryBeforeTerminalProbe::test_removed_worktree_recovers_before_probe,test_reconciler_supersession_close.py::TestReconcilerSupersessionMcpTool::test_tool_posts_comment_and_closes_superseded_pr_issue). Focused #749/#751/#753/#755 suites: 127 passed. Ownership, worktree, preflight and scope-guard suites: 136 passed, 16 subtests passed.git diff --checkclean.py_compileclean oncreate_issue_bootstrap.py,gitea_mcp_server.py,workflow_scope_guard.py.MERGE_READY:
no —
approval_valid_for_merge=falseandstale_approval=trueat head5e0e4743; a fresh independent reviewer verdict at that exact head is required first.LAST_UPDATED_BY:
jcwalker3 / prgs-author / 2026-07-18
repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #750
issue: #749
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 82547-548654b3d1f6
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-750
phase: claimed
candidate_head:
5e0e474350target_branch: master
target_branch_sha:
043df0f7dflast_activity: 2026-07-19T02:28:47Z
expires_at: 2026-07-19T02:38:47Z
blocker: none
repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #750
issue: #749
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 82547-548654b3d1f6
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-750
phase: validating
candidate_head:
5e0e474350target_branch: master
target_branch_sha:
043df0f7dflast_activity: 2026-07-19T02:29:46Z
expires_at: 2026-07-19T02:39:46Z
blocker: none
Independent native reviewer verdict: APPROVE at exact head
5e0e474350eaf0679a226b539cfb8afc68b01406.Fresh reviewer session (
gitea-reviewer/sysadmin/prgs-reviewer/ rolereviewer, remoteprgs, non-root UID 502). Runtime/master parity verified at043df0f7df220ad67ac1c3fefdcf3897dad9478b. Detached review worktree re-pinned clean at the exact PR head. Review #466 (former heade349839f…) confirmed stale and was not reused. No merge performed. PR #746 untouched.Scope and correctness (issue #749 ACs)
Independently reviewed the full PR-only diff vs master: exactly 7 files, +781/−35. Merge commit
5e0e4743parentse349839+043df0f; #751/#753/#755 land only as master ancestors and are absent from the PR-only diff (no duplication/reversion).gitea_create_issuewithout inventingbranches/issue-<N>-*(AC2 phase-scoped pure-remote exemption).realpathequality with control root; foreign workspaces block.branches/paths short-circuit to ordinary #274 path (not bootstrap).branches/issue-<N>-*and normal locks.create-issue.md§18a, runbooks) match production.Non-blocking: bare except on remote-master SHA resolution in bootstrap branch remains defended by earlier root-checkout guard; string-split next-action recovery is cosmetic.
Canonical PR State
STATE:
approved
WHO_IS_NEXT:
merger
NEXT_ACTION:
A fresh Grok merger session for PR #750 must re-verify this APPROVED review at exact head
5e0e474350eaf0679a226b539cfb8afc68b01406, confirm mergeability and checks, acquire the merger lease, and merge. Do not re-review unless the head moves.NEXT_PROMPT:
WHAT_HAPPENED:
An independent leased Grok reviewer session validated the #749 create_issue bootstrap exemption at the post-base-merge head and posted an APPROVED review via native MCP.
WHY:
The exemption is exactly scoped to create_issue / gitea_create_issue on the clean canonical control checkout, preserves #274/#713 for every other path, did not duplicate or revert #751/#753/#755, and focused validation passed.
ISSUE:
#749
BASE:
master
HEAD:
fix/issue-749-create-issue-bootstrap
HEAD_SHA:
5e0e474350REVIEW_STATUS:
approved
VALIDATION:
Focused suites: 127 passed (#749 bootstrap, workspace guard, #751, #753, #755); 110 passed + 36 subtests (author mutation, scope guards, anti-stomp, ownership, preflight); 14 create_issue tests passed; py_compile clean; git diff --check clean; live checks not_required.
BLOCKERS:
none
MERGE_READY:
yes — approval is valid at the exact current head, base is current (0 commits behind), mergeable, checks not required; the merger must still re-confirm live state before merge.
LAST_UPDATED_BY:
sysadmin / prgs-reviewer / 2026-07-18
NATIVE_REVIEW_PROOF: transport=native_mcp; namespace=gitea-reviewer; profile=prgs-reviewer; identity=sysadmin; tool=gitea_submit_pr_review; reviewed_head=5e0e474350eaf0679a226b539cfb8afc68b01406; parity=043df0f7df220ad67ac1c3fefdcf3897dad9478b; lease_session=82547-548654b3d1f6
[THREAD STATE LEDGER] PR #750 / Issue #749 — APPROVED review posted at head 5e0e4743; merge not performed.
What is true now:
5e0e4743(Review 466 remains stale ate349839f)Who/what acts next:
repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #750
issue: #749
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 82547-548654b3d1f6
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr-750
phase: released
candidate_head:
5e0e474350target_branch: master
target_branch_sha:
043df0f7dflast_activity: 2026-07-19T02:31:27Z
expires_at: 2026-07-19T02:41:27Z
blocker: manual-release
repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #750
issue: #749
reviewer_identity: sysadmin
profile: prgs-merger
session_id: 86830-c968bf5db6c1
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/merge-pr-750
phase: claimed
candidate_head:
5e0e474350target_branch: master
target_branch_sha:
043df0f7dflast_activity: 2026-07-19T02:37:54Z
expires_at: 2026-07-19T02:47:54Z
blocker: none
Stale #332 review-decision lock cleanup (#594)
Status: APPLIED
sysadminprgs-merger2026-07-19T02:38:08.057380+00:00approveon PR fix(mcp): allow create_issue from clean control checkout (Closes #749) (#750)closed(merged=True)447595b72ba02037db914797bd9ce8dd91fd40281prgs-reviewerManual deletion of session-state files is not the workflow.
This path only clears a lock when the referenced PR is merged/closed.