feat: persist MCP workflow proof and decision lock across daemons (Closes #559) #562

Merged
sysadmin merged 1 commits from feat/issue-559-durable-session-state into master 2026-07-08 21:26:57 -05:00
Owner

Summary

Closes #559.

MCP tool calls in IDE session pools often land on different daemon processes. Workflow-load proof and review decision lock were process-local globals, so sequential canonical steps failed closed with missing-load-proof errors even when the tools were called correctly in the same logical session.

Changes

  • Add mcp_session_state.py: user-private durable store under ~/.cache/gitea-tools/session-state (override via GITEA_MCP_SESSION_STATE_DIR), mode 0o700/0o600, flock + atomic write, TTL (default 4h), keyed by kind + profile identity. Not host-global /tmp (#211).
  • Wire review_workflow_load to persist/reload workflow load proof across processes; fail closed on profile-identity mismatch / expiry / stale hashes (PID-only gate removed for pool compatibility).
  • Wire review decision lock load/save in gitea_mcp_server to the same durable store with profile-lock + TTL checks.
  • Tests for store privacy, profile mismatch, and cross-process recovery; conftest isolates state dir per test.

Validation

python -m pytest tests/test_mcp_session_state.py tests/test_review_workflow_load.py tests/test_review_workflow_boundary.py tests/test_terminal_review_hard_stop.py -q
# 37 passed

git diff --check prgs/master...HEAD
# clean

Worktree

/Users/jasonwalker/Development/Gitea-Tools/branches/feat-issue-559-durable-session-state @ 2a3d30f

Notes for reviewer

  • Please verify durable path is not /tmp, files are private, and a second process with the same profile can read a load recorded by the first.
  • Self-review allowed: no (author = jcwalker3).
## Summary Closes #559. MCP tool calls in IDE session pools often land on different daemon processes. Workflow-load proof and review decision lock were process-local globals, so sequential canonical steps failed closed with missing-load-proof errors even when the tools were called correctly in the same logical session. ## Changes - Add `mcp_session_state.py`: user-private durable store under `~/.cache/gitea-tools/session-state` (override via `GITEA_MCP_SESSION_STATE_DIR`), mode `0o700`/`0o600`, flock + atomic write, TTL (default 4h), keyed by kind + profile identity. **Not** host-global `/tmp` (#211). - Wire `review_workflow_load` to persist/reload workflow load proof across processes; fail closed on profile-identity mismatch / expiry / stale hashes (PID-only gate removed for pool compatibility). - Wire review decision lock load/save in `gitea_mcp_server` to the same durable store with profile-lock + TTL checks. - Tests for store privacy, profile mismatch, and cross-process recovery; conftest isolates state dir per test. ## Validation ```bash python -m pytest tests/test_mcp_session_state.py tests/test_review_workflow_load.py tests/test_review_workflow_boundary.py tests/test_terminal_review_hard_stop.py -q # 37 passed git diff --check prgs/master...HEAD # clean ``` ## Worktree `/Users/jasonwalker/Development/Gitea-Tools/branches/feat-issue-559-durable-session-state` @ `2a3d30f` ## Notes for reviewer - Please verify durable path is not `/tmp`, files are private, and a second process with the same profile can read a load recorded by the first. - Self-review allowed: no (author = jcwalker3).
jcwalker3 added 1 commit 2026-07-08 21:22:50 -05:00
Share review-workflow-load and review-decision-lock state across MCP
daemon process pools via a user-private durable store keyed by profile
identity (not host-global /tmp), with TTL and fail-closed profile checks.
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #562
issue: #559
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 82807-ace45b89143b
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/feat-issue-559-durable-session-state
phase: claimed
candidate_head: 2a3d30fb3a
target_branch: master
target_branch_sha: 1ffa911dbc
last_activity: 2026-07-09T02:26:05Z
expires_at: 2026-07-09T04:26:05Z
blocker: none

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #562 issue: #559 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 82807-ace45b89143b worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/feat-issue-559-durable-session-state phase: claimed candidate_head: 2a3d30fb3a0b1ff98b7261aa9eb9cb02705d187c target_branch: master target_branch_sha: 1ffa911dbc20041eb080b3c7304ac4198f73c408 last_activity: 2026-07-09T02:26:05Z expires_at: 2026-07-09T04:26:05Z blocker: none
sysadmin approved these changes 2026-07-08 21:26:43 -05:00
sysadmin left a comment
Owner

APPROVE - PR #562 @ 2a3d30fb3a0b1ff98b7261aa9eb9cb02705d187c

Reviewed from non-root worktree /Users/jasonwalker/Development/Gitea-Tools/branches/feat-issue-559-durable-session-state.

Scope: durable MCP session state for workflow-load proof and review decision lock across daemon processes (#559), using user-private cache storage instead of /tmp, profile identity validation, TTL, and test isolation.

Validation performed:

  • python3 -m pytest tests/test_mcp_session_state.py tests/test_review_workflow_load.py tests/test_review_workflow_boundary.py tests/test_terminal_review_hard_stop.py -q -> 37 passed
  • python3 -m py_compile mcp_session_state.py review_workflow_load.py gitea_mcp_server.py tests/test_mcp_session_state.py tests/test_review_workflow_load.py -> passed
  • git diff --check prgs/master...HEAD -> clean

No self-review: reviewer identity sysadmin; PR author jcwalker3. Ready for gated merge pinned to 2a3d30fb3a0b1ff98b7261aa9eb9cb02705d187c.

## APPROVE - PR #562 @ `2a3d30fb3a0b1ff98b7261aa9eb9cb02705d187c` Reviewed from non-root worktree `/Users/jasonwalker/Development/Gitea-Tools/branches/feat-issue-559-durable-session-state`. Scope: durable MCP session state for workflow-load proof and review decision lock across daemon processes (#559), using user-private cache storage instead of `/tmp`, profile identity validation, TTL, and test isolation. Validation performed: - `python3 -m pytest tests/test_mcp_session_state.py tests/test_review_workflow_load.py tests/test_review_workflow_boundary.py tests/test_terminal_review_hard_stop.py -q` -> 37 passed - `python3 -m py_compile mcp_session_state.py review_workflow_load.py gitea_mcp_server.py tests/test_mcp_session_state.py tests/test_review_workflow_load.py` -> passed - `git diff --check prgs/master...HEAD` -> clean No self-review: reviewer identity `sysadmin`; PR author `jcwalker3`. Ready for gated merge pinned to `2a3d30fb3a0b1ff98b7261aa9eb9cb02705d187c`.
sysadmin merged commit b7e0c537f3 into master 2026-07-08 21:26:57 -05:00
Owner

repo: Scaled-Tech-Consulting/Gitea-Tools
pr: #562
issue: #559
reviewer_identity: sysadmin
profile: prgs-reviewer
session_id: 82807-ace45b89143b
worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/feat-issue-559-durable-session-state
phase: released
candidate_head: 2a3d30fb3a
target_branch: master
target_branch_sha: 1ffa911dbc
last_activity: 2026-07-09T02:31:39Z
expires_at: 2026-07-09T04:31:39Z
blocker: post-merge-moot

<!-- mcp-review-lease:v1 --> repo: Scaled-Tech-Consulting/Gitea-Tools pr: #562 issue: #559 reviewer_identity: sysadmin profile: prgs-reviewer session_id: 82807-ace45b89143b worktree: /Users/jasonwalker/Development/Gitea-Tools/branches/feat-issue-559-durable-session-state phase: released candidate_head: 2a3d30fb3a0b1ff98b7261aa9eb9cb02705d187c target_branch: master target_branch_sha: 1ffa911dbc20041eb080b3c7304ac4198f73c408 last_activity: 2026-07-09T02:31:39Z expires_at: 2026-07-09T04:31:39Z 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#562