gitea_reconcile_merged_cleanups should be callable from reconciler without switching to author #524

Closed
opened 2026-07-08 03:39:34 -05:00 by jcwalker3 · 4 comments
Owner

Problem

During post-merge cleanup reconciliation, gitea_reconcile_merged_cleanups is mapped to role: author in task_capability_map.py. This forces the reconciler to switch to the prgs-author profile to execute cleanup, which then triggers the branches-only mutation guard because the active role is author and the workspace is the stable control checkout.

Required behavior

gitea_reconcile_merged_cleanups should be callable directly from the reconciler role without switching profiles, or reconcilers should be permitted to resolve and execute it without triggering the author-role workspace guard.

Acceptance Criteria

  • reconcile_merged_cleanups task mapping in task_capability_map.py is updated to allow role: reconciler or both roles.
  • Reconcilers can invoke gitea_reconcile_merged_cleanups directly.
## Problem During post-merge cleanup reconciliation, `gitea_reconcile_merged_cleanups` is mapped to `role: author` in `task_capability_map.py`. This forces the reconciler to switch to the `prgs-author` profile to execute cleanup, which then triggers the branches-only mutation guard because the active role is `author` and the workspace is the stable control checkout. ## Required behavior `gitea_reconcile_merged_cleanups` should be callable directly from the `reconciler` role without switching profiles, or reconcilers should be permitted to resolve and execute it without triggering the author-role workspace guard. ## Acceptance Criteria - `reconcile_merged_cleanups` task mapping in `task_capability_map.py` is updated to allow `role: reconciler` or both roles. - Reconcilers can invoke `gitea_reconcile_merged_cleanups` directly.
Author
Owner

Canonical Issue State

STATE: implemented-on-master; ready to close
WHO_IS_NEXT: controller
NEXT_ACTION: close issue #524 as already implemented
NEXT_PROMPT:

No follow-up prompt required. Issue #524 is satisfied on master: reconcile_merged_cleanups is reconciler-routed and tested.

WHAT_HAPPENED: Author session checked issue #524 and found the required behavior already present on current master. task_capability_map.py maps reconcile_merged_cleanups to role: reconciler with permission: gitea.read, and maps reconciliation_cleanup to role: reconciler with permission: gitea.branch.delete. tests/test_reconciler_cleanup_integration.py includes test_capability_map_routes_merged_cleanup_to_reconciler and test_reconciler_can_run_reconcile_merged_cleanups_directly. gitea_mcp_server.py gates gitea_reconcile_merged_cleanups through verify_preflight_purity(remote, task="reconcile_merged_cleanups").
WHY: The issue requested that gitea_reconcile_merged_cleanups be callable from a reconciler without switching to author. The current code and tests already prove that behavior, so no code change or PR is needed for this issue.
RELATED_PRS: none created for this closeout; implementation appears to have landed in earlier reconciler cleanup work.
BLOCKERS: none for closeout; no code mutation performed.
VALIDATION: gitea_assess_work_issue_duplicate(issue_number=524, branch_name="fix/issue-524-reconciler-cleanup-callable", phase="lock") returned block: false; live author lock acquired for #524; worktree /Users/jasonwalker/Development/Gitea-Tools/branches/issue-524-reconciler-cleanup-callable remained clean at fix/issue-524-reconciler-cleanup-callable...prgs/master.
LAST_UPDATED_BY: jcwalker3 / prgs-author

## Canonical Issue State STATE: implemented-on-master; ready to close WHO_IS_NEXT: controller NEXT_ACTION: close issue #524 as already implemented NEXT_PROMPT: ```text No follow-up prompt required. Issue #524 is satisfied on master: reconcile_merged_cleanups is reconciler-routed and tested. ``` WHAT_HAPPENED: Author session checked issue #524 and found the required behavior already present on current master. `task_capability_map.py` maps `reconcile_merged_cleanups` to `role: reconciler` with `permission: gitea.read`, and maps `reconciliation_cleanup` to `role: reconciler` with `permission: gitea.branch.delete`. `tests/test_reconciler_cleanup_integration.py` includes `test_capability_map_routes_merged_cleanup_to_reconciler` and `test_reconciler_can_run_reconcile_merged_cleanups_directly`. `gitea_mcp_server.py` gates `gitea_reconcile_merged_cleanups` through `verify_preflight_purity(remote, task="reconcile_merged_cleanups")`. WHY: The issue requested that `gitea_reconcile_merged_cleanups` be callable from a reconciler without switching to author. The current code and tests already prove that behavior, so no code change or PR is needed for this issue. RELATED_PRS: none created for this closeout; implementation appears to have landed in earlier reconciler cleanup work. BLOCKERS: none for closeout; no code mutation performed. VALIDATION: `gitea_assess_work_issue_duplicate(issue_number=524, branch_name="fix/issue-524-reconciler-cleanup-callable", phase="lock")` returned `block: false`; live author lock acquired for #524; worktree `/Users/jasonwalker/Development/Gitea-Tools/branches/issue-524-reconciler-cleanup-callable` remained clean at `fix/issue-524-reconciler-cleanup-callable...prgs/master`. LAST_UPDATED_BY: jcwalker3 / prgs-author
Author
Owner

Canonical Issue State

STATE: blocked-after-proof-comment
WHO_IS_NEXT: controller
NEXT_ACTION: unblock the closeout path, then close issue #524 using a guarded MCP mutation
NEXT_PROMPT:

Resolve the closeout blocker for issue #524: `gitea_close_issue` must accept/prove a branches-only author worktree, or the controller must authorize a documented recovery path. Comment 8155 contains proof that #524 is implemented on master. Do not bypass the guard with raw API.

WHAT_HAPPENED: Author posted proof comment 8155 showing #524 appears implemented on master. A subsequent gitea_close_issue(issue_number=524, remote=prgs, org=Scaled-Tech-Consulting, repo=Gitea-Tools) attempt failed closed because the exposed close tool schema has no worktree_path parameter and the branches-only mutation guard bound the mutation to the stable control checkout.
WHY: The close mutation cannot currently prove the active author worktree path through the exposed MCP schema, so continuing would require a bypass. The workflow requires stopping on guard failure.
RELATED_PRS: none created in this run.
BLOCKERS: Blocked by Branches-only mutation guard (#274). Unblock condition: provide a gitea_close_issue path that accepts/proves the session-owned worktree /Users/jasonwalker/Development/Gitea-Tools/branches/issue-524-reconciler-cleanup-callable, or controller-authorize a documented recovery closeout path; until then, do not close with raw API.
VALIDATION: #524 duplicate gate returned clear; live issue lock acquired; issue worktree remained clean; no file edits or commits were made.
LAST_UPDATED_BY: jcwalker3 / prgs-author

## Canonical Issue State STATE: blocked-after-proof-comment WHO_IS_NEXT: controller NEXT_ACTION: unblock the closeout path, then close issue #524 using a guarded MCP mutation NEXT_PROMPT: ```text Resolve the closeout blocker for issue #524: `gitea_close_issue` must accept/prove a branches-only author worktree, or the controller must authorize a documented recovery path. Comment 8155 contains proof that #524 is implemented on master. Do not bypass the guard with raw API. ``` WHAT_HAPPENED: Author posted proof comment 8155 showing #524 appears implemented on master. A subsequent `gitea_close_issue(issue_number=524, remote=prgs, org=Scaled-Tech-Consulting, repo=Gitea-Tools)` attempt failed closed because the exposed close tool schema has no `worktree_path` parameter and the branches-only mutation guard bound the mutation to the stable control checkout. WHY: The close mutation cannot currently prove the active author worktree path through the exposed MCP schema, so continuing would require a bypass. The workflow requires stopping on guard failure. RELATED_PRS: none created in this run. BLOCKERS: Blocked by Branches-only mutation guard (#274). Unblock condition: provide a `gitea_close_issue` path that accepts/proves the session-owned worktree `/Users/jasonwalker/Development/Gitea-Tools/branches/issue-524-reconciler-cleanup-callable`, or controller-authorize a documented recovery closeout path; until then, do not close with raw API. VALIDATION: #524 duplicate gate returned clear; live issue lock acquired; issue worktree remained clean; no file edits or commits were made. LAST_UPDATED_BY: jcwalker3 / prgs-author
Author
Owner

Canonical Issue State

STATE:
closed

WHO_IS_NEXT:
controller

NEXT_ACTION:
No further implementation; issue is satisfied on master and will be closed.

NEXT_PROMPT:

Controller: treat issue #524 as completed. reconcile_merged_cleanups is already role=reconciler on master; no code change required.

WHAT_HAPPENED:
Verified on master: task_capability_map.reconcile_merged_cleanups maps to role: reconciler with permission gitea.read. Integration tests assert reconciler can invoke gitea_reconcile_merged_cleanups directly.

WHY:
Acceptance criteria already satisfied by earlier landings; closing as completed without new code.

RELATED_PRS:
none for this close

BLOCKERS:
none

VALIDATION:
grep task_capability_map role=reconciler; test_reconciler_cleanup_integration present

LAST_UPDATED_BY:
jcwalker3 / prgs-author / 2026-07-09

## Canonical Issue State STATE: closed WHO_IS_NEXT: controller NEXT_ACTION: No further implementation; issue is satisfied on master and will be closed. NEXT_PROMPT: ```text Controller: treat issue #524 as completed. reconcile_merged_cleanups is already role=reconciler on master; no code change required. ``` WHAT_HAPPENED: Verified on master: `task_capability_map.reconcile_merged_cleanups` maps to `role: reconciler` with permission `gitea.read`. Integration tests assert reconciler can invoke `gitea_reconcile_merged_cleanups` directly. WHY: Acceptance criteria already satisfied by earlier landings; closing as completed without new code. RELATED_PRS: none for this close BLOCKERS: none VALIDATION: grep task_capability_map role=reconciler; test_reconciler_cleanup_integration present LAST_UPDATED_BY: jcwalker3 / prgs-author / 2026-07-09
Author
Owner

Canonical Issue State

STATE:
resolved-duplicate / already-landed-on-master; closing.

WHO_IS_NEXT:
controller

NEXT_ACTION:
None. Behavior required by #524 is present and tested on master; issue is being closed as a resolved duplicate of #523.

NEXT_PROMPT:

No follow-up required. #524 is satisfied on master: gitea_reconcile_merged_cleanups is reconciler-routed (gitea.read), author/root stays blocked, and the integration acceptance tests pass. Landed via PR #567 (Closes #523).

WHAT_HAPPENED:
Live verification on master @ c738e5b.

  1. PR #567 ("feat: allow reconciler profile to run merged cleanup directly (Closes #523)") is merged — merged_at set, merge_commit_sha e8947438c9, state closed. Issue #523 is closed. #524 requests the identical behavior, so it is a duplicate of #523.
  2. task_capability_map.py on master maps reconcile_merged_cleanups -> permission gitea.read, role reconciler, and reconciliation_cleanup -> permission gitea.branch.delete, role reconciler. No author-profile switch is required to resolve/execute merged cleanup.
  3. Author/root checkout remains blocked: verify_preflight_purity(task="reconcile_merged_cleanups") fails closed for the author role on the stable control (root) checkout, while the reconciler role bypasses the branches-only mutation guard.
  4. Acceptance tests in tests/test_reconciler_cleanup_integration.py were run against a clean detached worktree at master c738e5b — 5 passed:
test_author_role_remains_blocked_on_root_checkout ................ PASSED
test_capability_map_routes_merged_cleanup_to_reconciler ......... PASSED
test_open_unmerged_pr_heads_are_not_safe_cleanup_targets ........ PASSED
test_reconciler_can_run_reconcile_merged_cleanups_directly ...... PASSED
test_reconciler_role_bypasses_branches_only_mutation_guard ...... PASSED
5 passed

WHY:
The #524 acceptance criteria (mapping updated so reconciler can run merged cleanup directly, callable without switching to author) are already satisfied by earlier work that landed via PR #567 / #523. No new code or PR is warranted; #524 is a duplicate/already-landed scope.

RELATED_PRS:
#567 (merged, Closes #523)

BLOCKERS:
None. Closeout performed via guarded MCP gitea_close_issue from a properly-bound author worktree (branches/mcp-author-clean-ns) — no raw API, no CLI/script fallback, no bypass. The earlier #274 branches-only guard block (comment 8158) does not recur because this session is bound to a valid author worktree, not the root checkout.

VALIDATION:
Live reads of #524, #523, and PR #567 from Gitea prgs; task_capability_map.py and tests/test_reconciler_cleanup_integration.py read from Gitea master; acceptance tests executed at master HEAD c738e5b (5 passed).

LAST_UPDATED_BY:
jcwalker3 / prgs-author / 2026-07-09

## Canonical Issue State STATE: resolved-duplicate / already-landed-on-master; closing. WHO_IS_NEXT: controller NEXT_ACTION: None. Behavior required by #524 is present and tested on master; issue is being closed as a resolved duplicate of #523. NEXT_PROMPT: ```text No follow-up required. #524 is satisfied on master: gitea_reconcile_merged_cleanups is reconciler-routed (gitea.read), author/root stays blocked, and the integration acceptance tests pass. Landed via PR #567 (Closes #523). ``` WHAT_HAPPENED: Live verification on master @ c738e5b. 1. PR #567 ("feat: allow reconciler profile to run merged cleanup directly (Closes #523)") is merged — merged_at set, merge_commit_sha e8947438c9d93c854564c054c65f99ecdfa48390, state closed. Issue #523 is closed. #524 requests the identical behavior, so it is a duplicate of #523. 2. task_capability_map.py on master maps `reconcile_merged_cleanups` -> permission `gitea.read`, role `reconciler`, and `reconciliation_cleanup` -> permission `gitea.branch.delete`, role `reconciler`. No author-profile switch is required to resolve/execute merged cleanup. 3. Author/root checkout remains blocked: verify_preflight_purity(task="reconcile_merged_cleanups") fails closed for the author role on the stable control (root) checkout, while the reconciler role bypasses the branches-only mutation guard. 4. Acceptance tests in tests/test_reconciler_cleanup_integration.py were run against a clean detached worktree at master c738e5b — 5 passed: ``` test_author_role_remains_blocked_on_root_checkout ................ PASSED test_capability_map_routes_merged_cleanup_to_reconciler ......... PASSED test_open_unmerged_pr_heads_are_not_safe_cleanup_targets ........ PASSED test_reconciler_can_run_reconcile_merged_cleanups_directly ...... PASSED test_reconciler_role_bypasses_branches_only_mutation_guard ...... PASSED 5 passed ``` WHY: The #524 acceptance criteria (mapping updated so reconciler can run merged cleanup directly, callable without switching to author) are already satisfied by earlier work that landed via PR #567 / #523. No new code or PR is warranted; #524 is a duplicate/already-landed scope. RELATED_PRS: #567 (merged, Closes #523) BLOCKERS: None. Closeout performed via guarded MCP gitea_close_issue from a properly-bound author worktree (branches/mcp-author-clean-ns) — no raw API, no CLI/script fallback, no bypass. The earlier #274 branches-only guard block (comment 8158) does not recur because this session is bound to a valid author worktree, not the root checkout. VALIDATION: Live reads of #524, #523, and PR #567 from Gitea prgs; task_capability_map.py and tests/test_reconciler_cleanup_integration.py read from Gitea master; acceptance tests executed at master HEAD c738e5b (5 passed). LAST_UPDATED_BY: jcwalker3 / prgs-author / 2026-07-09
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Scaled-Tech-Consulting/Gitea-Tools#524