Skip to content

Control MCP instances and durable tool runs through Taskand URI - #38

Merged
ifuri-validator-agent[bot] merged 6 commits into
mainfrom
ticket/029-mcp-process-control
Sep 20, 2026
Merged

ifuri-validator-agent[bot] merged 6 commits into
mainfrom
ticket/029-mcp-process-control

Conversation

@tom-sapletta-com

Copy link
Copy Markdown
Contributor

Taskand can now control registered MCP server instances and tool runs from its existing dashboard through proc://taskand.dev/mcp/control/v1. The gateway binds each operation to the authenticated actor and action grant. Operators supply trusted profiles; users discover and admit exact tool schemas before execution.

SQLite receipts preserve run IDs across reloads and disconnects. A repeated identical run ID reads the prior result; a disconnect after an effect produces OUTCOME_UNKNOWN without a blind retry. The panel exposes registration, profile updates, enable/disable, discovery, admission, execution and history. Sessions are bounded per operation; this does not add an autonomous planner, persistent browser sessions or OAuth.

Validation: 125 Python tests with the pinned MCP SDK passed (one existing skip), make test passed, managed governance passed. Real stdio and HTTP servers cover grants, actor isolation, schema drift, configuration CAS, deduplication and uncertain effects. Headless Chrome exercised the deployed pilot with official Filesystem and DBHub: CSV read, SQL sum 830, independently verified report artifact, result recovery and history after reload; no page errors.

The new documentation has no findings under the adopted docs checker. The full docs audit remains red on four unchanged baseline documents (diagnostic-recovery, digital-twin, complementary-runtime, instance-network); this is not claimed as a green global docs gate. Independent exact-head OneDev/Validator review remains required.

Ticket: ticket-029 (IN_PROGRESS / PUBLICATION). Isolated local pilot uses port 8082; concurrent Premesh work and the existing 8077 service are preserved. Source registry is candidate and requires explicit deployment admission.

The dashboard's intentional data-panel switching leaves non-active
sections hidden, so the pre-existing browser pilot timed out on elements
it never unhid. Click the matching data-view link before interacting with
panel elements and wait for the developer-session bootstrap requests
(mesh refresh and MCP reload) before counting API traffic. Assertions are
unchanged.
The telemetria notify flex row overflowed the 390px mobile viewport
(documentElement.scrollWidth 402). flex-wrap keeps the controls inside
the panel. The exact dependency pins already live in pyproject.toml, so
the generated uv.lock is dropped to keep the ticket inside its approved
implementation-file budget.

@ifuri-validator-agent ifuri-validator-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Validator approval after policy checks for exact head 6479c584de5a6a2d4132de4f4dbca548d8eeca5a.

Ticket: ticket-029
Correlation ID: local-semcod-taskand-glm53-pr-38-ticket-029
Model: gemini/gemini-3.8-flash
Reviewed diff chunks: 9
Advisory LLM verdict: APPROVE
Advisory summary: Reviewed all 9 diff chunk(s). Chunk 1/9 updates governance manifests and adds documentation for MCP process control (docs/information/mcp-process-control.md). Changes are well-documented, conform to project conventions, and required CI checks have passed. | Diff chunk 2 introduces the gateway endpoints and authorization logic for MCP control operations and conversation handling. It adds static delivery for index.html with secure headers, grant-checking and HMAC-signing for MCP requests via gateway/handlers/mcp_control.py, bounded upstream proxying for conversational LLM calls with strict localhost validation, and an integrity-checked Node.js wrapper script for the MCP control entry point. | Diff chunk 3 updates index.html to introduce navigation tabs (Conversation, Services, Executions, Telemetry, Diagnostics) and integrates UI controls for MCP server and tool management. No security or functional defects identified in the visible HTML additions. | Chunk 4 contains frontend changes in index.html, wiring up the MCP control panel, monag telemetry polling, and conversation UI. DOM operations properly utilize textContent avoiding XSS, and error/session states are appropriately tracked. | Chunk 5 introduces packages/taskand-mcp-control/control.py, implementing the core bounded MCP control engine with HMAC proof validation, actor isolation, replay protection via nonces, pinned schema validation, and secure process execution parameters. | Reviewed chunk 6 of 9 covering packages/taskand-mcp-control/control.py (execution lifecycle, action dispatcher, and CLI entrypoint with concurrency slots), pyproject.toml, and ticket documentation. Database operations use parameterized queries, lock management is clean, and required checks have passed. | Reviewed chunk 7 containing intent manifest metadata (project/ticket-029/intent.json), a test MCP server fixture (tests/fixtures/mcp_control_server.py), and setup logic for tests/mcp_control_test.py. No security or blocking defects observed. | Reviewed test suite chunk covering MCP control unit and integration tests (receipt deduplication, actor isolation, schema validation, configuration CAS, proof authentication, HTTP transport), dashboard token bootstrap handling, and conversation boundary validation. Tests are robust and align with security requirements. | Visible diff chunk adds unit tests for conversation gateway grant and untrusted endpoint handling, alongside Playwright mesh test updates navigating between views and waiting for idle status.
Advisory findings: none
The LLM output above is advisory and was not used as the approval trust root.
Semantic review prerequisite: satisfied; policy 676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7.

Actual PR impact radar

Exact range: 8804583ef82342ad7870659cf79e9ad8278e2369...6479c584de5a6a2d4132de4f4dbca548d8eeca5a
Change digest: 1281b58256b05eda7215ef6ca7579da14e3e8893b40ba5d68633dba26fc0d890
Score: 76/100 (L), estimated 172 min, split recommended: true
Affected services/components: packages/taskand-mcp-control

Machine-readable radar JSONL and SVG
{"actual_change":{"additions":1382,"base_sha":"8804583ef82342ad7870659cf79e9ad8278e2369","binary_files":0,"categories":{"code":6,"configuration":5,"docs":5,"tests":3},"change_digest":"1281b58256b05eda7215ef6ca7579da14e3e8893b40ba5d68633dba26fc0d890","comparison":"8804583ef82342ad7870659cf79e9ad8278e2369...6479c584de5a6a2d4132de4f4dbca548d8eeca5a","deletions":43,"file_count":19,"files":["governance/manifest.json","docs/README.md","docs/information/mcp-process-control.md","gateway/__init__.py","gateway/handlers/mcp_control.py","gateway/handlers/proc.py","generated/mcp/control/taskand.dev/v1/bin.mjs","generated/mcp/control/taskand.dev/v1/proc.yaml","generated/mcp/registry.json","index.html","packages/taskand-mcp-control/control.py","packages/taskand-mcp-control/pyproject.toml","project/ticket-029/README.md","project/ticket-029/TODO.md","project/ticket-029/ai-2026-09-19.md","project/ticket-029/intent.json","tests/fixtures/mcp_control_server.py","tests/mcp_control_test.py","tests/mesh_test.py"],"head_sha":"6479c584de5a6a2d4132de4f4dbca548d8eeca5a","service_count":1,"services":["packages/taskand-mcp-control"]},"assessment_mode":"observed-pr","axes":{"coupling":5,"delivery":4,"scope":5,"uncertainty":3,"validation":2},"complexity":"L","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":172,"within_budget":false},"impact":{"components":["OneDev","docs","enable","gateway","generated","governance","packages/taskand-mcp-control","project","repository-root","taskand.dev","tests"],"files":["OneDev/Validator","docs/README.md","docs/information/mcp-process-control.md","enable/disable","gateway/__init__.py","gateway/handlers/mcp_control.py","gateway/handlers/proc.py","generated/mcp/control/taskand.dev/v1/bin.mjs","generated/mcp/control/taskand.dev/v1/proc.yaml","generated/mcp/registry.json","governance/manifest.json","index.html","packages/taskand-mcp-control/control.py","packages/taskand-mcp-control/pyproject.toml","project/ticket-029/README.md","project/ticket-029/TODO.md","project/ticket-029/ai-2026-09-19.md","project/ticket-029/intent.json","taskand.dev/mcp/control/v1","tests/fixtures/mcp_control_server.py","tests/mcp_control_test.py","tests/mesh_test.py"],"public_interfaces":[],"runtime_dependencies":1},"schema":"subactor.ticket-radar/v1","score":76,"split":{"parts":[{"estimated_minutes":15,"name":"Implement OneDev","scope":["OneDev"]},{"estimated_minutes":15,"name":"Implement docs","scope":["docs"]},{"estimated_minutes":15,"name":"Implement enable","scope":["enable"]},{"estimated_minutes":15,"name":"Implement gateway","scope":["gateway"]},{"estimated_minutes":15,"name":"Implement generated","scope":["generated"]},{"estimated_minutes":15,"name":"Validate and project to trackers","scope":["tests","planfile","github/gitlab/jira projections"]}],"reason":"estimated_minutes_exceed_budget","recommended":true},"standards":[{"id":"wellmanifest/dsl","revision":"6c60fc4e0dd1f1bb74f46a7745e28019908d1203","version":"0.1.0-dev"},{"id":"wellmanifest/ticket-lifecycle","revision":"5bf581907a87b46a13a73e6c033d3abe4d9a306f","version":"0.1.0-dev"},{"id":"wellmanifest/git-lifecycle","revision":"7d77d4b7af57e69bc75c3a0290b3a4805c5c4438","version":"0.2.0-dev"},{"id":"wellmanifest/logs","revision":"48c284ef7a069055c0bcb6b900147ce5e65f8b43","version":"0.3.0"}],"ticket_ref":"ticket-029"}
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-029: Control MCP instances and durable tool runs through Taskand URI</title><rect width="128" height="128" rx="12" fill="#f8fafc"/><g stroke-width="1"><polygon points="64,55 72,61 69,71 59,71 56,61" fill="none" stroke="#d7dde5"/><polygon points="64,47 80,59 74,78 54,78 48,59" fill="none" stroke="#d7dde5"/><polygon points="64,38 89,56 79,85 49,85 39,56" fill="none" stroke="#d7dde5"/><polygon points="64,30 97,53 84,92 44,92 31,53" fill="none" stroke="#d7dde5"/><polygon points="64,21 105,51 89,99 39,99 23,51" fill="none" stroke="#d7dde5"/><line x1="64" y1="64" x2="64" y2="21" stroke="#aab4c0"/><line x1="64" y1="64" x2="105" y2="51" stroke="#aab4c0"/><line x1="64" y1="64" x2="89" y2="99" stroke="#aab4c0"/><line x1="64" y1="64" x2="39" y2="99" stroke="#aab4c0"/><line x1="64" y1="64" x2="23" y2="51" stroke="#aab4c0"/></g><polygon points="64,21 105,51 79,85 54,78 31,53" fill="#fb923c" fill-opacity="0.45" stroke="#c2410c" stroke-width="2"/><circle cx="64" cy="64" r="3" fill="#c2410c"/><g font-family="sans-serif" font-size="7" fill="#334155"><text x="64" y="11" text-anchor="middle">SCO</text><text x="114" y="48" text-anchor="middle">COU</text><text x="95" y="107" text-anchor="middle">UNC</text><text x="33" y="107" text-anchor="middle">VAL</text><text x="14" y="48" text-anchor="middle">DEL</text></g><text x="64" y="124" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#0f172a">L · 172m</text></svg>
Merge will be attempted after this approval when explicitly authorized. ## Decision record (recomputable)
DECISION D-029-4723
TICKET ticket-029
HEAD_SHA 6479c584de5a6a2d4132de4f4dbca548d8eeca5a
CORRELATION_ID local-semcod-taskand-glm53-pr-38-ticket-029
ACTOR agent:ifuri-validator-agent[bot]
APPLIED_RULE P-CORE-015
INPUT author_login = "tom-sapletta-com"
INPUT observed_checks = ["governance / remote lifecycle=PASS","governance / enforce=PASS","onedev/local-verify=PASS"]
INPUT required_checks = ["onedev/local-verify"]
INPUT required_checks_source = "protected registry (env/request)"
INPUT reviewer_login = "ifuri-validator-agent[bot]"
INPUT semantic_review_assessment = {"schema":"subactor.validator/semantic-review-assessment/v1","subject":{"repository":"semcod/taskand-glm53","pull_request":38,"head_sha":"6479c584de5a6a2d4132de4f4dbca548d8eeca5a","base_sha":"8804583ef82342ad7870659cf79e9ad8278e2369","diff_sha256":"e878cd166f662de5dc3791c64238fe366aaf50c79dafa4f5d2cc573b696c495c"},"policy":{"policy_schema":"subactor.validator/semantic-review-policy/v1","policy_version":1,"policy_sha256":"676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7","required":true,"critical_paths":[".governance/manifest.json"],"observed_paths":[".governance/manifest.json","docs/README.md","docs/information/mcp-process-control.md","gateway/__init__.py","gateway/handlers/mcp_control.py","gateway/handlers/proc.py","generated/mcp/control/taskand.dev/v1/bin.mjs","generated/mcp/control/taskand.dev/v1/proc.yaml","generated/mcp/registry.json","index.html","packages/taskand-mcp-control/control.py","packages/taskand-mcp-control/pyproject.toml","project/ticket-029/README.md","project/ticket-029/TODO.md","project/ticket-029/ai-2026-09-19.md","project/ticket-029/intent.json","tests/fixtures/mcp_control_server.py","tests/mcp_control_test.py","tests/mesh_test.py"]},"grounding":"full-diff-not-per-finding-proof","execution_authority":false,"status":"satisfied","reason":null,"review_sha256":"a5c7413a8b522681df3c7222091e01e2a1bfaf993f95e43d6ea0a65892797eb6","unresolved":[]}
INPUT superseded_checks = []
INPUT ticket_radar_receipt = {"schema":"subactor.ticket-radar/v1","base_sha":"8804583ef82342ad7870659cf79e9ad8278e2369","head_sha":"6479c584de5a6a2d4132de4f4dbca548d8eeca5a","change_digest":"1281b58256b05eda7215ef6ca7579da14e3e8893b40ba5d68633dba26fc0d890","score":76,"complexity":"L","estimated_minutes":172,"split_recommended":true,"services":["packages/taskand-mcp-control"],"authority":"ADVISORY","promotion":"FORBIDDEN"}
VERDICT APPROVE AUTHORITY DETERMINISTIC
REJECTED REQUEST_CHANGES BECAUSE NO_UNSAFE_CHANGE_REASON_FOUND
ADVISORY llm_verdict = "APPROVE" MODEL "gemini/gemini-3.8-flash"
ASSERT VERDICT_AUTHORITY != "ADVISORY"

@ifuri-validator-agent
ifuri-validator-agent Bot merged commit 833c394 into main Sep 20, 2026
3 checks passed
@ifuri-validator-agent
ifuri-validator-agent Bot deleted the ticket/029-mcp-process-control branch September 20, 2026 16:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant