fix(bootstrap): allow author worktree bootstrap from clean control checkout (Closes #892) #926

Merged
sysadmin merged 1 commits from fix/issue-892-author-bootstrap-deadlock into master 2026-07-26 03:25:34 -05:00
Owner

Summary

Breaks the author worktree bootstrap deadlock (#892) so an author session starting from a clean control checkout can obtain a usable branches/ worktree through the sanctioned MCP path.

Root cause

assess_author_issue_bootstrap returned allowed/proven for a clean control checkout, but the shared predicate bootstrap_permits_control_checkout only accepted create_issue assessments (task_scope=create_issue_only, empty reasons, full base-tip field set). Author assessments never satisfied the predicate, so #274/#604 guards kept the ordinary control-checkout block on every gitea_bootstrap_author_issue_worktree call.

Fix

  1. author_issue_bootstrap.assess_author_issue_bootstrap — emit create_issue-compatible proof fields (task_scope=author_issue_bootstrap, empty reasons when allowed, base_tips_verified, binding paths, strict tip proof).
  2. create_issue_bootstrap.bootstrap_permits_control_checkout — accept task_scope=author_issue_bootstrap for author bootstrap tasks (still fail-closed for cross-scope smuggling).
  3. Regression teststests/test_issue_892_author_bootstrap_deadlock.py.

Files

  • author_issue_bootstrap.py
  • create_issue_bootstrap.py
  • tests/test_issue_892_author_bootstrap_deadlock.py

Validation

PYTHONPATH=. venv/bin/python -m pytest \
  tests/test_issue_892_author_bootstrap_deadlock.py \
  tests/test_create_issue_bootstrap.py \
  tests/test_issue_757_bootstrap_guard_agreement.py \
  tests/test_author_issue_bootstrap.py -q
# 105 passed, 31 subtests passed

Worktree / proof

  • Worktree: branches/fix-issue-892-author-bootstrap-deadlock
  • Branch: fix/issue-892-author-bootstrap-deadlock
  • Head: 2066623986df9a05c0f24bb760d7c0abb5bf0d9e
  • Author: jcwalker3 / prgs-author
  • Bootstrap used the documented #892 partial bypass (pre-existing clean worktree + lock) to land this fix; post-merge, clean control → gitea_bootstrap_author_issue_worktree is the primary path.

Risk

Low — narrow waiver remains fail-closed (clean base, tip proof, binding match, empty refusal reasons). Does not widen create_issue scope.

Closes #892

Handoff

WHO_IS_NEXT: reviewer — independent review of PR; do not self-merge.

## Summary Breaks the **author worktree bootstrap deadlock (#892)** so an author session starting from a clean control checkout can obtain a usable `branches/` worktree through the sanctioned MCP path. ### Root cause `assess_author_issue_bootstrap` returned `allowed/proven` for a clean control checkout, but the shared predicate `bootstrap_permits_control_checkout` only accepted **create_issue** assessments (`task_scope=create_issue_only`, empty `reasons`, full base-tip field set). Author assessments never satisfied the predicate, so `#274`/`#604` guards kept the ordinary control-checkout block on every `gitea_bootstrap_author_issue_worktree` call. ### Fix 1. **`author_issue_bootstrap.assess_author_issue_bootstrap`** — emit create_issue-compatible proof fields (`task_scope=author_issue_bootstrap`, empty `reasons` when allowed, `base_tips_verified`, binding paths, strict tip proof). 2. **`create_issue_bootstrap.bootstrap_permits_control_checkout`** — accept `task_scope=author_issue_bootstrap` for author bootstrap tasks (still fail-closed for cross-scope smuggling). 3. **Regression tests** — `tests/test_issue_892_author_bootstrap_deadlock.py`. ### Files - `author_issue_bootstrap.py` - `create_issue_bootstrap.py` - `tests/test_issue_892_author_bootstrap_deadlock.py` ### Validation ``` PYTHONPATH=. venv/bin/python -m pytest \ tests/test_issue_892_author_bootstrap_deadlock.py \ tests/test_create_issue_bootstrap.py \ tests/test_issue_757_bootstrap_guard_agreement.py \ tests/test_author_issue_bootstrap.py -q # 105 passed, 31 subtests passed ``` ### Worktree / proof - Worktree: `branches/fix-issue-892-author-bootstrap-deadlock` - Branch: `fix/issue-892-author-bootstrap-deadlock` - Head: `2066623986df9a05c0f24bb760d7c0abb5bf0d9e` - Author: `jcwalker3` / `prgs-author` - Bootstrap used the documented #892 partial bypass (pre-existing clean worktree + lock) to land this fix; post-merge, clean control → `gitea_bootstrap_author_issue_worktree` is the primary path. ### Risk Low — narrow waiver remains fail-closed (clean base, tip proof, binding match, empty refusal reasons). Does not widen create_issue scope. Closes #892 ## Handoff **WHO_IS_NEXT: reviewer** — independent review of PR; do not self-merge.
jcwalker3 added 1 commit 2026-07-25 18:27:49 -05:00
Align assess_author_issue_bootstrap with bootstrap_permits_control_checkout
so gitea_bootstrap_author_issue_worktree can create the first branches/
worktree without the lock↔worktree deadlock.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #926
issue: #892
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 45657-6b1b84aba2e2
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr926-issue-892-bootstrap
phase: claimed
candidate_head: 2066623986
target_branch: master
target_branch_sha: 2b4e43042a
last_activity: 2026-07-25T23:32:03Z
expires_at: 2026-07-25T23:42:03Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #926 issue: #892 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 45657-6b1b84aba2e2 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr926-issue-892-bootstrap phase: claimed candidate_head: 2066623986df9a05c0f24bb760d7c0abb5bf0d9e target_branch: master target_branch_sha: 2b4e43042a34f4e29617378ae79a7f5a3d312688 last_activity: 2026-07-25T23:32:03Z expires_at: 2026-07-25T23:42:03Z blocker: none
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #926
issue: #892
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 52497-a4b43ab643a5
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr926-issue-892-bootstrap
phase: claimed
candidate_head: 2066623986
target_branch: master
target_branch_sha: 6a56260768
last_activity: 2026-07-26T08:05:18Z
expires_at: 2026-07-26T08:15:18Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #926 issue: #892 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 52497-a4b43ab643a5 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr926-issue-892-bootstrap phase: claimed candidate_head: 2066623986df9a05c0f24bb760d7c0abb5bf0d9e target_branch: master target_branch_sha: 6a56260768ad2f69b773a8b7ab8d460ce821c914 last_activity: 2026-07-26T08:05:18Z expires_at: 2026-07-26T08:15:18Z blocker: none
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #926
issue: #892
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 52497-df4ee80a7322
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr926-issue-892-bootstrap
phase: claimed
candidate_head: 2066623986
target_branch: master
target_branch_sha: 6a56260768
last_activity: 2026-07-26T08:16:07Z
expires_at: 2026-07-26T08:26:07Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #926 issue: #892 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 52497-df4ee80a7322 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr926-issue-892-bootstrap phase: claimed candidate_head: 2066623986df9a05c0f24bb760d7c0abb5bf0d9e target_branch: master target_branch_sha: 6a56260768ad2f69b773a8b7ab8d460ce821c914 last_activity: 2026-07-26T08:16:07Z expires_at: 2026-07-26T08:26:07Z blocker: none
sysadmin approved these changes 2026-07-26 03:19:32 -05:00
sysadmin left a comment
Owner

Canonical PR State

STATE: reviewed-approved
WHO_IS_NEXT: merger
NEXT_ACTION: Merge PR #926 into master from an independent prgs-merger session, then advance the control checkout and restart the MCP fleet.
NEXT_PROMPT:

Invoke the canonical gitea-workflow skill first. Using only the sanctioned gitea-merger namespace with profile prgs-merger and role merger, merge PR #926 in Scaled-Tech-Consulting/Gitea-Tools at head 2066623986df9a05c0f24bb760d7c0abb5bf0d9e into master. Verify before merging: fleet is exactly five MCP servers under one Claude parent, parity green with mutation_safe true, PR #926 open and mergeable, head unchanged at 2066623986df9a05c0f24bb760d7c0abb5bf0d9e, and the sysadmin APPROVE review is visible at that exact head with approval_at_current_head true. Acquire the merger lease, merge, then confirm issue #892 closed and the branch state. Do not author, review, or approve.

WHAT_HAPPENED: Performed an independent review of PR #926 at head 2066623986 in the bound review worktree branches/review-pr926-issue-892-bootstrap. Read issue #892, the complete three-file change set, the surrounding guard source, and the new tests. Confirmed the #892 deadlock is present at the base revision and resolved at this head, with every fail-closed protection preserved.
WHY: The scope proof in create_issue_bootstrap.bootstrap_permits_control_checkout accepted only task_scope create_issue_only, while assess_author_issue_bootstrap emitted no task_scope key at all. The predicate therefore could never return True for an author bootstrap, even though the task gate above it already admitted the author task. This change completes that half-applied fix without widening any other proof obligation.
ISSUE: 892
HEAD_SHA: 2066623986
REVIEW_STATUS: APPROVE
MERGE_READY: yes
BLOCKERS: none
VALIDATION: Focused suites at head (test_issue_892_author_bootstrap_deadlock.py, test_create_issue_bootstrap.py, test_issue_757_bootstrap_guard_agreement.py, test_author_issue_bootstrap.py) = 105 passed, 31 subtests. Broad regression over 33 bootstrap/worktree/guard/preflight suites, identical set at both revisions: base 2b4e430 = 10 failed / 599 passed / 96 subtests; head 2066623 = 10 failed / 613 passed / 96 subtests. Delta is +14 passed, equal to the 14 new tests; zero new failures. The 10 failures share identical test IDs at both revisions, are pre-existing, and each passes when run alone.
LAST_UPDATED_BY: sysadmin / prgs-reviewer

NATIVE_REVIEW_PROOF: transport=native_mcp; entrypoint=mcp_server; token_fingerprint=cb971ff277593f1b

Independence

Reviewer identity sysadmin on profile prgs-reviewer; PR author is jcwalker3. Distinct accounts, no self-review. Base branch master at 6a56260768ad2f69b773a8b7ab8d460ce821c914; merge base 2b4e43042a34f4e29617378ae79a7f5a3d312688.

Scope

Exactly three files, merge base to head:

  • author_issue_bootstrap.py (+157 / −46)
  • create_issue_bootstrap.py (+18 / −6)
  • tests/test_issue_892_author_bootstrap_deadlock.py (+215, new)

Both production modules are byte-identical between the merge base and the current master tip, so this analysis holds against master and the merge is clean on the touched files. Nothing in the change touches role permissions, credential resolution, or process launching, and it adds no manual worktree or branch-creation bypass.

Deadlock present at base, resolved at head

A single scenario matrix was evaluated read-only in the review worktree against both revisions.

# Scenario base 2b4e430 head 2066623
A1 clean control checkout, author bootstrap False True
A2 create_issue bootstrap True True
D1 dirty control checkout False False
D2 non-base branch False False
D3 detached HEAD False False
D4 HEAD does not match live master tip False False
D5 remote tip unresolvable False False
D6 remote tip missing, no error False False
D7 local HEAD sha unknown False False
D8 workspace is not the canonical root False False
D9 under branches/ worktree False False
D10 unrelated task literal False False
D11 ordinary author mutation (commit_files) False False
S1 author scope presented for a create_issue task False False
S2 create_issue_only scope presented for an author task False False
S3 hand-built allowed=True over a dirty tree False False
S4 hand-built base_tips_verified over mismatched tips False False

Exactly one behavior delta, A1. Every denial and every cross-scope or hand-built assertion is refused identically at both revisions.

Fix assessment

bootstrap_permits_control_checkout now applies the scope proof per task branch rather than as a widened disjunction: a create_issue task still requires create_issue_only, an author bootstrap task requires author_issue_bootstrap, and a final else closes unknown tasks. Both directions of cross-scope reuse fail closed (S1, S2). Every other obligation is unchanged and still applies to both branches — bootstrap_path must be clean_canonical_control_checkout, reasons must be empty, dirty_files must be empty, under_branches must be exactly False, tip equality is re-derived rather than trusted from the assessment's own flag, and the assessment must bind to the exact workspace and canonical root.

Ordinary author mutations stay blocked from the control checkout: the task gate admits only bootstrap_author_issue_worktree and gitea_bootstrap_author_issue_worktree, so every other author task leaves the ordinary block in force (D11).

assess_author_issue_bootstrap now produces the full predicate-compatible field set through one constructor. proven and base_tips_verified are derived inside that constructor rather than accepted from callers, and task_scope is fixed to author_issue_bootstrap, so it cannot mint a create_issue-scoped assessment.

The allowed path is strictly tighter than before. The prior logic compared tips only when both were present, so a missing local HEAD or a missing remote tip left reasons empty and yielded allowed=True with no base-equivalence proof. The new logic fails closed on an unknown local HEAD, on a resolver error, and on a missing remote tip (D5, D6, D7), closing a pre-existing fail-open.

The under_branches result changed from allowed=True to not_applicable=True. This is operationally inert: when the workspace is a valid branches/ worktree the ordinary guard does not block and returns before the bootstrap assessment is consulted, and on the durable-block path the predicate refused it at both revisions, since the prior dict carried no under_branches key and the is not False check rejected the resulting None. The new shape simply states the intent correctly.

Two-guard agreement from #757 is preserved: anti_stomp_preflight.py:599 routes the same threaded assessment through the same predicate under the same task name, so the #274 and #604 guards cannot diverge. The waiver stays narrow — only the wrong-worktree verdict is waived, while root-checkout, repo, role, stale-runtime and lease checks are each still evaluated.

The #892 criterion that a refusal must name the missing precondition and the sanctioned call is met: format_create_issue_bootstrap_error at create_issue_bootstrap.py:322-330 surfaces exact_next_action, and author block assessments populate it through EXACT_NEXT_ACTION_AUTHOR_BOOTSTRAP.

Non-blocking findings

  1. tests/test_issue_892_author_bootstrap_deadlock.py:151-211TestAuthorBootstrapPreflightIntegration.test_enforce_branches_only_allows_clean_control_for_bootstrap is described as exercising the real enforcer wiring and binds the server module as srv at line 156, but never calls srv._enforce_branches_only_author_mutation. The durable_block dict built at line 192 is passed to nothing, and the assertion at line 211 holds by construction. The branch at lines 200-208 reduces to the assertion already made at line 113. The net effect is a duplicate unit assertion under an integration name, and no test drives _enforce_branches_only_author_mutation with an author bootstrap task — test_issue_757_bootstrap_guard_agreement.py:349 reaches the real enforcer but only for create_issue tasks. A follow-up should cover that path end to end. Not a blocker here: the enforcer-to-predicate wiring is pre-existing and untouched by this change, and the predicate behavior is established above.
  2. tests/test_issue_892_author_bootstrap_deadlock.py:19 — the unittest.mock binding is unused, as is the server-module binding at line 156.
  3. create_issue_bootstrap.py:328 — author bootstrap refusals carry the prefix Create-issue bootstrap guard (#749): even when the task is the author bootstrap. The text is correct and actionable; only the guard named in the label is wrong.

None of these changes production behavior or the correctness of the fix.

Note for the merger

This branch trails master, but neither production module it edits has changed on master since the merge base, and Gitea reports mergeable: true. After the merge, advance the control checkout and restart the MCP fleet so the daemons load this fix before the author bootstrap path is exercised. Issue #931 remains unclaimed and can be re-allocated once that is done.

## Canonical PR State STATE: reviewed-approved WHO_IS_NEXT: merger NEXT_ACTION: Merge PR #926 into master from an independent prgs-merger session, then advance the control checkout and restart the MCP fleet. NEXT_PROMPT: ```text Invoke the canonical gitea-workflow skill first. Using only the sanctioned gitea-merger namespace with profile prgs-merger and role merger, merge PR #926 in Scaled-Tech-Consulting/Gitea-Tools at head 2066623986df9a05c0f24bb760d7c0abb5bf0d9e into master. Verify before merging: fleet is exactly five MCP servers under one Claude parent, parity green with mutation_safe true, PR #926 open and mergeable, head unchanged at 2066623986df9a05c0f24bb760d7c0abb5bf0d9e, and the sysadmin APPROVE review is visible at that exact head with approval_at_current_head true. Acquire the merger lease, merge, then confirm issue #892 closed and the branch state. Do not author, review, or approve. ``` WHAT_HAPPENED: Performed an independent review of PR #926 at head 2066623986df9a05c0f24bb760d7c0abb5bf0d9e in the bound review worktree branches/review-pr926-issue-892-bootstrap. Read issue #892, the complete three-file change set, the surrounding guard source, and the new tests. Confirmed the #892 deadlock is present at the base revision and resolved at this head, with every fail-closed protection preserved. WHY: The scope proof in create_issue_bootstrap.bootstrap_permits_control_checkout accepted only task_scope create_issue_only, while assess_author_issue_bootstrap emitted no task_scope key at all. The predicate therefore could never return True for an author bootstrap, even though the task gate above it already admitted the author task. This change completes that half-applied fix without widening any other proof obligation. ISSUE: 892 HEAD_SHA: 2066623986df9a05c0f24bb760d7c0abb5bf0d9e REVIEW_STATUS: APPROVE MERGE_READY: yes BLOCKERS: none VALIDATION: Focused suites at head (test_issue_892_author_bootstrap_deadlock.py, test_create_issue_bootstrap.py, test_issue_757_bootstrap_guard_agreement.py, test_author_issue_bootstrap.py) = 105 passed, 31 subtests. Broad regression over 33 bootstrap/worktree/guard/preflight suites, identical set at both revisions: base 2b4e430 = 10 failed / 599 passed / 96 subtests; head 2066623 = 10 failed / 613 passed / 96 subtests. Delta is +14 passed, equal to the 14 new tests; zero new failures. The 10 failures share identical test IDs at both revisions, are pre-existing, and each passes when run alone. LAST_UPDATED_BY: sysadmin / prgs-reviewer NATIVE_REVIEW_PROOF: transport=native_mcp; entrypoint=mcp_server; token_fingerprint=cb971ff277593f1b ## Independence Reviewer identity `sysadmin` on profile `prgs-reviewer`; PR author is `jcwalker3`. Distinct accounts, no self-review. Base branch `master` at `6a56260768ad2f69b773a8b7ab8d460ce821c914`; merge base `2b4e43042a34f4e29617378ae79a7f5a3d312688`. ## Scope Exactly three files, merge base to head: - `author_issue_bootstrap.py` (+157 / −46) - `create_issue_bootstrap.py` (+18 / −6) - `tests/test_issue_892_author_bootstrap_deadlock.py` (+215, new) Both production modules are byte-identical between the merge base and the current `master` tip, so this analysis holds against `master` and the merge is clean on the touched files. Nothing in the change touches role permissions, credential resolution, or process launching, and it adds no manual worktree or branch-creation bypass. ## Deadlock present at base, resolved at head A single scenario matrix was evaluated read-only in the review worktree against both revisions. | # | Scenario | base `2b4e430` | head `2066623` | |---|---|---|---| | A1 | clean control checkout, author bootstrap | `False` | **`True`** | | A2 | create_issue bootstrap | `True` | `True` | | D1 | dirty control checkout | `False` | `False` | | D2 | non-base branch | `False` | `False` | | D3 | detached HEAD | `False` | `False` | | D4 | HEAD does not match live master tip | `False` | `False` | | D5 | remote tip unresolvable | `False` | `False` | | D6 | remote tip missing, no error | `False` | `False` | | D7 | local HEAD sha unknown | `False` | `False` | | D8 | workspace is not the canonical root | `False` | `False` | | D9 | under `branches/` worktree | `False` | `False` | | D10 | unrelated task literal | `False` | `False` | | D11 | ordinary author mutation (`commit_files`) | `False` | `False` | | S1 | author scope presented for a create_issue task | `False` | `False` | | S2 | create_issue_only scope presented for an author task | `False` | `False` | | S3 | hand-built `allowed=True` over a dirty tree | `False` | `False` | | S4 | hand-built `base_tips_verified` over mismatched tips | `False` | `False` | Exactly one behavior delta, A1. Every denial and every cross-scope or hand-built assertion is refused identically at both revisions. ## Fix assessment `bootstrap_permits_control_checkout` now applies the scope proof per task branch rather than as a widened disjunction: a create_issue task still requires `create_issue_only`, an author bootstrap task requires `author_issue_bootstrap`, and a final `else` closes unknown tasks. Both directions of cross-scope reuse fail closed (S1, S2). Every other obligation is unchanged and still applies to both branches — `bootstrap_path` must be `clean_canonical_control_checkout`, `reasons` must be empty, `dirty_files` must be empty, `under_branches` must be exactly `False`, tip equality is re-derived rather than trusted from the assessment's own flag, and the assessment must bind to the exact workspace and canonical root. Ordinary author mutations stay blocked from the control checkout: the task gate admits only `bootstrap_author_issue_worktree` and `gitea_bootstrap_author_issue_worktree`, so every other author task leaves the ordinary block in force (D11). `assess_author_issue_bootstrap` now produces the full predicate-compatible field set through one constructor. `proven` and `base_tips_verified` are derived inside that constructor rather than accepted from callers, and `task_scope` is fixed to `author_issue_bootstrap`, so it cannot mint a create_issue-scoped assessment. The allowed path is strictly tighter than before. The prior logic compared tips only when both were present, so a missing local HEAD or a missing remote tip left `reasons` empty and yielded `allowed=True` with no base-equivalence proof. The new logic fails closed on an unknown local HEAD, on a resolver error, and on a missing remote tip (D5, D6, D7), closing a pre-existing fail-open. The `under_branches` result changed from `allowed=True` to `not_applicable=True`. This is operationally inert: when the workspace is a valid `branches/` worktree the ordinary guard does not block and returns before the bootstrap assessment is consulted, and on the durable-block path the predicate refused it at both revisions, since the prior dict carried no `under_branches` key and the `is not False` check rejected the resulting `None`. The new shape simply states the intent correctly. Two-guard agreement from #757 is preserved: `anti_stomp_preflight.py:599` routes the same threaded assessment through the same predicate under the same task name, so the #274 and #604 guards cannot diverge. The waiver stays narrow — only the wrong-worktree verdict is waived, while root-checkout, repo, role, stale-runtime and lease checks are each still evaluated. The #892 criterion that a refusal must name the missing precondition and the sanctioned call is met: `format_create_issue_bootstrap_error` at `create_issue_bootstrap.py:322-330` surfaces `exact_next_action`, and author block assessments populate it through `EXACT_NEXT_ACTION_AUTHOR_BOOTSTRAP`. ## Non-blocking findings 1. `tests/test_issue_892_author_bootstrap_deadlock.py:151-211` — `TestAuthorBootstrapPreflightIntegration.test_enforce_branches_only_allows_clean_control_for_bootstrap` is described as exercising the real enforcer wiring and binds the server module as `srv` at line 156, but never calls `srv._enforce_branches_only_author_mutation`. The `durable_block` dict built at line 192 is passed to nothing, and the assertion at line 211 holds by construction. The branch at lines 200-208 reduces to the assertion already made at line 113. The net effect is a duplicate unit assertion under an integration name, and no test drives `_enforce_branches_only_author_mutation` with an author bootstrap task — `test_issue_757_bootstrap_guard_agreement.py:349` reaches the real enforcer but only for create_issue tasks. A follow-up should cover that path end to end. Not a blocker here: the enforcer-to-predicate wiring is pre-existing and untouched by this change, and the predicate behavior is established above. 2. `tests/test_issue_892_author_bootstrap_deadlock.py:19` — the `unittest.mock` binding is unused, as is the server-module binding at line 156. 3. `create_issue_bootstrap.py:328` — author bootstrap refusals carry the prefix `Create-issue bootstrap guard (#749):` even when the task is the author bootstrap. The text is correct and actionable; only the guard named in the label is wrong. None of these changes production behavior or the correctness of the fix. ## Note for the merger This branch trails `master`, but neither production module it edits has changed on `master` since the merge base, and Gitea reports `mergeable: true`. After the merge, advance the control checkout and restart the MCP fleet so the daemons load this fix before the author bootstrap path is exercised. Issue #931 remains unclaimed and can be re-allocated once that is done.
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #926
issue: #892
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 52497-df4ee80a7322
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr926-issue-892-bootstrap
phase: released
candidate_head: 2066623986
target_branch: master
target_branch_sha: 6a56260768
last_activity: 2026-07-26T08:19:56Z
expires_at: 2026-07-26T08:29:56Z
blocker: manual-release

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #926 issue: #892 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 52497-df4ee80a7322 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr926-issue-892-bootstrap phase: released candidate_head: 2066623986df9a05c0f24bb760d7c0abb5bf0d9e target_branch: master target_branch_sha: 6a56260768ad2f69b773a8b7ab8d460ce821c914 last_activity: 2026-07-26T08:19:56Z expires_at: 2026-07-26T08:29:56Z blocker: manual-release
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #926
issue: #892
reviewer_identity: sysadmin
profile: prgs-merger
session_id: 52586-294892e2f1d7
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr926-issue-892-bootstrap
phase: claimed
candidate_head: 2066623986
target_branch: master
target_branch_sha: 6a56260768
last_activity: 2026-07-26T08:24:54Z
expires_at: 2026-07-26T08:34:54Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #926 issue: #892 reviewer_identity: sysadmin profile: prgs-merger session_id: 52586-294892e2f1d7 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr926-issue-892-bootstrap phase: claimed candidate_head: 2066623986df9a05c0f24bb760d7c0abb5bf0d9e target_branch: master target_branch_sha: 6a56260768ad2f69b773a8b7ab8d460ce821c914 last_activity: 2026-07-26T08:24:54Z expires_at: 2026-07-26T08:34:54Z blocker: none
sysadmin merged commit 8c1d22a658 into master 2026-07-26 03:25:34 -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-26T08:25:36.220396+00:00` - last terminal: `approve` on PR #926 - PR state: `closed` (merged=True) - merge_commit_sha: `8c1d22a658ecb5715e3f4db6eb7ebb408830c101` - 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

finalized_at: 2026-07-26T08:26:31Z
finalized_by_identity: sysadmin
finalized_by_profile: prgs-merger
finalized_by_session_id: 52586-294892e2f1d7
finalization_outcome: released
finalization_reason: PR #926 merged successfully at 2066623986df9a05c0f24bb760d7c0abb5bf0d9e; merge commit 8c1d22a658
finalized_lease_comment_id: 17362

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #926
issue: #892
reviewer_identity: sysadmin
profile: prgs-merger
session_id: 52586-294892e2f1d7
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr926-issue-892-bootstrap
phase: released
candidate_head: 2066623986
target_branch: master
target_branch_sha: 6a56260768
last_activity: 2026-07-26T08:26:31Z
expires_at: 2026-07-26T08:36:31Z
blocker: PR #926 merged successfully at 2066623986df9a05c0f24bb760d7c0abb5bf0d9e; merge commit 8c1d22a658

<!-- mcp-merger-lease-final:v1 --> finalized_at: 2026-07-26T08:26:31Z finalized_by_identity: sysadmin finalized_by_profile: prgs-merger finalized_by_session_id: 52586-294892e2f1d7 finalization_outcome: released finalization_reason: PR #926 merged successfully at 2066623986df9a05c0f24bb760d7c0abb5bf0d9e; merge commit 8c1d22a658ecb5715e3f4db6eb7ebb408830c101 finalized_lease_comment_id: 17362 <!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #926 issue: #892 reviewer_identity: sysadmin profile: prgs-merger session_id: 52586-294892e2f1d7 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr926-issue-892-bootstrap phase: released candidate_head: 2066623986df9a05c0f24bb760d7c0abb5bf0d9e target_branch: master target_branch_sha: 6a56260768ad2f69b773a8b7ab8d460ce821c914 last_activity: 2026-07-26T08:26:31Z expires_at: 2026-07-26T08:36:31Z blocker: PR #926 merged successfully at 2066623986df9a05c0f24bb760d7c0abb5bf0d9e; merge commit 8c1d22a658ecb5715e3f4db6eb7ebb408830c101
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#926