feat(mcp): expose sanctioned Codex MCP reconnect request (Closes #678) #918

Merged
sysadmin merged 1 commits from fix/issue-678-codex-mcp-reconnect into master 2026-07-27 15:32:10 -05:00
Owner

Summary

Codex and other agent hosts can detect stale/closed Gitea MCP runtimes, but the host owns the transport. This PR adds a callable, report-only reconnect request surface so agents can invoke or request a sanctioned reconnect without process-kill or config hacks.

Linked issue

Closes #678

Changes

  • New pure module mcp_client_reconnect.py — reason vocabulary, boundary classification, typed operator blocker, Codex/Claude/generic UI steps, forbidden-path hygiene
  • New MCP tool gitea_request_mcp_reconnect — returns namespace, profile, pid/session, startup SHA, current master SHA, boundary status; never restarts/kills/reloads
  • Stale-runtime guidance points agents at the new tool
  • Restart-path inventory + EOF recovery docs + tool inventory updated
  • Tests for stale-runtime, transport EOF, missing namespace, healthy path, tool surface, inventory registration

Validation

pytest tests/test_issue_678_mcp_client_reconnect.py tests/test_mcp_restart_paths.py tests/test_issue_685_side_effect_free_resolver.py tests/test_issue_897_permission_stale_runtime_classification.py -q
# 53 passed, 16 subtests passed

Risk

Low. Report-only surface; no process management.

Worktree / branch / commit

  • Worktree: branches/fix-issue-678-codex-mcp-reconnect
  • Branch: fix/issue-678-codex-mcp-reconnect
  • Commit: 29ad93d145372dbd8421a7f6f6c9acaaaedd3dca
## Summary Codex and other agent hosts can detect stale/closed Gitea MCP runtimes, but the host owns the transport. This PR adds a **callable, report-only** reconnect request surface so agents can invoke or request a sanctioned reconnect without process-kill or config hacks. ## Linked issue Closes #678 ## Changes * New pure module `mcp_client_reconnect.py` — reason vocabulary, boundary classification, typed operator blocker, Codex/Claude/generic UI steps, forbidden-path hygiene * New MCP tool `gitea_request_mcp_reconnect` — returns namespace, profile, pid/session, startup SHA, current master SHA, boundary status; never restarts/kills/reloads * Stale-runtime guidance points agents at the new tool * Restart-path inventory + EOF recovery docs + tool inventory updated * Tests for stale-runtime, transport EOF, missing namespace, healthy path, tool surface, inventory registration ## Validation ```text pytest tests/test_issue_678_mcp_client_reconnect.py tests/test_mcp_restart_paths.py tests/test_issue_685_side_effect_free_resolver.py tests/test_issue_897_permission_stale_runtime_classification.py -q # 53 passed, 16 subtests passed ``` ## Risk Low. Report-only surface; no process management. ## Worktree / branch / commit * Worktree: `branches/fix-issue-678-codex-mcp-reconnect` * Branch: `fix/issue-678-codex-mcp-reconnect` * Commit: `29ad93d145372dbd8421a7f6f6c9acaaaedd3dca`
jcwalker3 added 1 commit 2026-07-25 17:53:06 -05:00
Add gitea_request_mcp_reconnect as a report-only callable surface so Codex
and other agent hosts can request host/IDE reconnect with typed blockers
and exact UI steps. Never kills processes or edits config.

Co-Authored-By: Grok 4.5 <[email protected]>
Author
Owner

Canonical Issue State

STATE: author_implementation_complete_pr_open
WHO_IS_NEXT: reviewer
NEXT_ACTION: formal review of PR #918 at pinned head 29ad93d145372dbd8421a7f6f6c9acaaaedd3dca; submit one review verdict; do not merge
NEXT_PROMPT:

REVIEWER session (prgs-reviewer / gitea-reviewer) on prgs/Scaled-Tech-Consulting/Gitea-Tools:
Load llm-project-workflow review-merge-pr mode. Review PR #918 only.
Pin head SHA 29ad93d145372dbd8421a7f6f6c9acaaaedd3dca.
Submit exactly one formal review verdict for that head. Do not merge. Do not self-select other work.

WHAT_HAPPENED: Controller cross-role allocate assigned issue #678; author adopted lease-50ba5aa1413f444e; implemented gitea_request_mcp_reconnect plus tests and docs; opened PR #918.
WHY: Issue #678 requires a callable reconnect request or typed operator blocker for Codex when stop_required or restart_required; host owns transport so report-only tool with exact UI steps is the sanctioned path.
RELATED_PRS: #918
BLOCKERS: none for review
VALIDATION: pytest tests/test_issue_678_mcp_client_reconnect.py tests/test_mcp_restart_paths.py tests/test_issue_685_side_effect_free_resolver.py tests/test_issue_897_permission_stale_runtime_classification.py — 53 passed, 16 subtests passed
LAST_UPDATED_BY: jcwalker3 / prgs-author

## Canonical Issue State STATE: author_implementation_complete_pr_open WHO_IS_NEXT: reviewer NEXT_ACTION: formal review of PR #918 at pinned head 29ad93d145372dbd8421a7f6f6c9acaaaedd3dca; submit one review verdict; do not merge NEXT_PROMPT: ```text REVIEWER session (prgs-reviewer / gitea-reviewer) on prgs/Scaled-Tech-Consulting/Gitea-Tools: Load llm-project-workflow review-merge-pr mode. Review PR #918 only. Pin head SHA 29ad93d145372dbd8421a7f6f6c9acaaaedd3dca. Submit exactly one formal review verdict for that head. Do not merge. Do not self-select other work. ``` WHAT_HAPPENED: Controller cross-role allocate assigned issue #678; author adopted lease-50ba5aa1413f444e; implemented gitea_request_mcp_reconnect plus tests and docs; opened PR #918. WHY: Issue #678 requires a callable reconnect request or typed operator blocker for Codex when stop_required or restart_required; host owns transport so report-only tool with exact UI steps is the sanctioned path. RELATED_PRS: #918 BLOCKERS: none for review VALIDATION: pytest tests/test_issue_678_mcp_client_reconnect.py tests/test_mcp_restart_paths.py tests/test_issue_685_side_effect_free_resolver.py tests/test_issue_897_permission_stale_runtime_classification.py — 53 passed, 16 subtests passed LAST_UPDATED_BY: jcwalker3 / prgs-author
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #918
issue: #678
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: prgs-reviewer-55686-63a824a5
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr918-678
phase: claimed
candidate_head: 29ad93d145
target_branch: master
target_branch_sha: 2b4e43042a
last_activity: 2026-07-25T23:13:03Z
expires_at: 2026-07-25T23:23:03Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #918 issue: #678 reviewer_identity: sysadmin profile: prgs-reviewer session_id: prgs-reviewer-55686-63a824a5 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr918-678 phase: claimed candidate_head: 29ad93d145372dbd8421a7f6f6c9acaaaedd3dca target_branch: master target_branch_sha: 2b4e43042a34f4e29617378ae79a7f5a3d312688 last_activity: 2026-07-25T23:13:03Z expires_at: 2026-07-25T23:23:03Z blocker: none
sysadmin approved these changes 2026-07-25 18:13:28 -05:00
sysadmin left a comment
Owner

Formal review — PR #918 (head 29ad93d) · Closes #678

Verdict: APPROVE

Scope

On-issue sanctioned MCP client reconnect request surface. 7 files, +853/−21. Single commit on master. Mergeable.

What is good

  • Report-only gitea_request_mcp_reconnect: reconnect_performed/mutation_performed always false; no kill/restart/reload.
  • Pure module mcp_client_reconnect.py with closed reason vocabulary, boundary classification, Codex/Claude/generic UI steps, forbidden-path hygiene.
  • Stale-runtime / EOF guidance points agents at this tool instead of pkill/config hacks.
  • Docs + restart-path inventory updated; tool registered as @mcp.tool().
  • Tests: 16 passed in tests/test_issue_678_mcp_client_reconnect.py.
  • Author jcwalker3 ≠ reviewer sysadmin (not self-review).

Safety

Fails closed on read permission; forbids pkill/touch/config/.env/session-state recovery recommendations.

Validation

pytest tests/test_issue_678_mcp_client_reconnect.py → 16 passed. Worktree HEAD matches pin.

Canonical PR State

STATE: approved-awaiting-merge
WHO_IS_NEXT: merger
NEXT_ACTION: merge PR #918 at pinned head 29ad93d145 when merge policy allows
NEXT_PROMPT:

Merger session: call gitea_allocate_next_work(apply=true, role='merger') for prgs/Scaled-Tech-Consulting/Gitea-Tools. If PR #918 is assigned, merge only that PR at head 29ad93d145372dbd8421a7f6f6c9acaaaedd3dca after merge preflight. Do not self-select. Do not force-push.

WHAT_HAPPENED: Formal APPROVE submitted for PR #918 after code review and tests.
WHY: #678 acceptance met; report-only reconnect surface; no process management; scope clean.
ISSUE: #678
HEAD_SHA: 29ad93d145
REVIEW_STATUS: approved / approval_at_current_head
MERGE_READY: true
BLOCKERS: none
VALIDATION: pytest tests/test_issue_678_mcp_client_reconnect.py → 16 passed; reviewer approved at head 29ad93d145
NATIVE_REVIEW_PROOF: transport=native_mcp; entrypoint=mcp_server; tool=gitea_submit_pr_review
LAST_UPDATED_BY: sysadmin / prgs-reviewer

## Formal review — PR #918 (head 29ad93d) · Closes #678 **Verdict: APPROVE** ### Scope On-issue sanctioned MCP client reconnect request surface. 7 files, +853/−21. Single commit on master. Mergeable. ### What is good - Report-only `gitea_request_mcp_reconnect`: reconnect_performed/mutation_performed always false; no kill/restart/reload. - Pure module `mcp_client_reconnect.py` with closed reason vocabulary, boundary classification, Codex/Claude/generic UI steps, forbidden-path hygiene. - Stale-runtime / EOF guidance points agents at this tool instead of pkill/config hacks. - Docs + restart-path inventory updated; tool registered as `@mcp.tool()`. - Tests: 16 passed in `tests/test_issue_678_mcp_client_reconnect.py`. - Author jcwalker3 ≠ reviewer sysadmin (not self-review). ### Safety Fails closed on read permission; forbids pkill/touch/config/.env/session-state recovery recommendations. ### Validation pytest tests/test_issue_678_mcp_client_reconnect.py → 16 passed. Worktree HEAD matches pin. ## Canonical PR State STATE: approved-awaiting-merge WHO_IS_NEXT: merger NEXT_ACTION: merge PR #918 at pinned head 29ad93d145372dbd8421a7f6f6c9acaaaedd3dca when merge policy allows NEXT_PROMPT: ```text Merger session: call gitea_allocate_next_work(apply=true, role='merger') for prgs/Scaled-Tech-Consulting/Gitea-Tools. If PR #918 is assigned, merge only that PR at head 29ad93d145372dbd8421a7f6f6c9acaaaedd3dca after merge preflight. Do not self-select. Do not force-push. ``` WHAT_HAPPENED: Formal APPROVE submitted for PR #918 after code review and tests. WHY: #678 acceptance met; report-only reconnect surface; no process management; scope clean. ISSUE: #678 HEAD_SHA: 29ad93d145372dbd8421a7f6f6c9acaaaedd3dca REVIEW_STATUS: approved / approval_at_current_head MERGE_READY: true BLOCKERS: none VALIDATION: pytest tests/test_issue_678_mcp_client_reconnect.py → 16 passed; reviewer approved at head 29ad93d145372dbd8421a7f6f6c9acaaaedd3dca NATIVE_REVIEW_PROOF: transport=native_mcp; entrypoint=mcp_server; tool=gitea_submit_pr_review LAST_UPDATED_BY: sysadmin / prgs-reviewer
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #918
issue: #678
reviewer_identity: sysadmin
profile: prgs-merger
session_id: 35613-d9a629dab402
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr918-678
phase: claimed
candidate_head: 29ad93d145
target_branch: master
target_branch_sha: dc5d2c8caa
last_activity: 2026-07-27T20:31:51Z
expires_at: 2026-07-27T20:41:51Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #918 issue: #678 reviewer_identity: sysadmin profile: prgs-merger session_id: 35613-d9a629dab402 worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/review-pr918-678 phase: claimed candidate_head: 29ad93d145372dbd8421a7f6f6c9acaaaedd3dca target_branch: master target_branch_sha: dc5d2c8caa95914d566544bb6191d4f2876a9242 last_activity: 2026-07-27T20:31:51Z expires_at: 2026-07-27T20:41:51Z blocker: none
sysadmin merged commit 5fea326988 into master 2026-07-27 15:32:10 -05:00
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#918