Default split-executor Copilot manifest + OAuth-local validation
Part of design: #1432 ΓÇö per-component-executor-binding
Design document: https://github.com/JoshuaRowePhantom/Phantom.Workspaces/blob/design/docs/design/per-component-executor-binding.md
Scope
Add defaults/agent-manifests/copilot-split-executor with: one kind:"executor" resource worker (id parameter → worker-profile); a worker-profile parameter (kind executor) + a working-directory parameter; a model with options.executor:"worker"; workspace-gui / workspace-entity tools with no executor (inherit local); a GitHub web MCP tool with no executor (local, for OAuth). Add load-time validation that rejects/warns an OAuth-interactive MCP whose executor is non-local. Cross-check the exact tool/model/connection JSON shapes against features/docs/examples/github-copilot-remote-chat.json.
Files
Phantom.Workspaces.Data.Core/JsonEntities/agent-manifests/copilot-split-executor.json (new); the manifest/validation code that enforces the OAuth-local rule.
Detailed design
Requirement 11 ΓÇö Default split manifest. Ship a default manifest entity (defaults/agent-manifests/...) implementing this split: the Copilot-SDK chat client runs remotely; the chat router, the workspace tools (workspace-gui / workspace-entity), and the GitHub web MCP server run locally.
Requirement 12 ΓÇö No web-vs-non-web distinction. An MCP server with no executor simply runs on the local session executor. There is no special "web tools go remote" rule.
Requirement 13 ΓÇö OAuth interactivity rationale. MCP servers using interactive OAuth (authorization-code with a loopback/localhost redirect + a browser) MUST run on the machine that can open the user's browser and receive the loopback redirect ΓÇö i.e. the local executor. Therefore OAuth-interactive MCP servers MUST be pinned local; the default manifest pins the GitHub web MCP local for this reason (and because that is where the user authenticates). A key/PAT-authenticated web MCP does not strictly require local, but the default ships it local. Validation note: an MCP tool whose connection uses interactive OAuth combined with a non-local executor MUST be rejected or warned at load/validation time.
The worker-profile parameter is of kind executor (see #1434): at launch the user picks the worker executor by choosing either a trust-profile entity or a user-computer-profile entity (the latter synthesizing an implicit trust profile). The worker executor resource's parameter strategy references worker-profile and resolves through the selected/implicit trust profile's DefaultExecutionTarget.
New file (applicable):
Phantom.Workspaces.Data.Core/JsonEntities/agent-manifests/copilot-split-executor.json ΓÇö the default split-executor manifest entity.
Contradiction note (shape reference):
3. github-copilot-remote-chat.json is an AgentDefinition, not a manifest. It is kind:"prompt" and drives remoting via model.options.additionalProperties.trust-profile (features/docs/examples/github-copilot-remote-chat.json:6-22,78-94) ΓÇö the OLD per-kind approach. It is a useful shape reference for tool/model/connection JSON, but it does not use kind:"executor" resources or an executor field.
Tests
CopilotSplitExecutorManifestTests (Phantom.Workspaces.Data.Core.Tests)
Manifest_Loads
Manifest_WorkerProfileParameter_Resolves
Manifest_ModelBoundToWorker_ResolvesRemote
Manifest_WorkspaceToolsAndGithubWebMcp_ResolveLocal
Validation_OAuthInteractiveMcpWithNonLocalExecutor_IsRejected
SplitExecutorIntegrationTests (Phantom.Workspaces.Tests)
DefaultManifest_Session_RecordsExecutorBindings_CopilotWorker_WorkspaceLocal
DefaultManifest_Topology_RoutesComponentsAccordingly
Testing strategy — Default manifest + validation: The default manifest loads; the worker-profile parameter resolves; the model resolves to the remote worker; the workspace tools and the GitHub web MCP resolve local. A validation test asserts that an OAuth-interactive MCP with a non-local executor is rejected/warned at load. → CopilotSplitExecutorManifestTests.
Testing strategy — Full split-executor integration: Using the default manifest, assert the resulting session records executor-bindings with copilot → worker and workspace/github-web → ".", and that the reconstructed topology routes accordingly. → SplitExecutorIntegrationTests.
Dependencies
Depends on: #1433 ΓÇö Executor resource schema + model
Depends on: #1434 ΓÇö executor parameter kind
Depends on: #1435 ΓÇö PhantomMcpTool.Executor field
Depends on: #1436 ΓÇö Executor-resource resolver
Depends on: #1437 ΓÇö Explicit session executor + executor-bindings persistence + resume
Depends on: #1438 ΓÇö Per-tool MCP execution over transport + production remote MCP host
Default split-executor Copilot manifest + OAuth-local validation
Part of design: #1432 ΓÇö per-component-executor-binding
Design document: https://github.com/JoshuaRowePhantom/Phantom.Workspaces/blob/design/docs/design/per-component-executor-binding.md
Scope
Add
defaults/agent-manifests/copilot-split-executorwith: onekind:"executor"resourceworker(idparameter→worker-profile); aworker-profileparameter (kindexecutor) + aworking-directoryparameter; a model withoptions.executor:"worker";workspace-gui/workspace-entitytools with noexecutor(inherit local); a GitHub web MCP tool with noexecutor(local, for OAuth). Add load-time validation that rejects/warns an OAuth-interactive MCP whoseexecutoris non-local. Cross-check the exact tool/model/connection JSON shapes againstfeatures/docs/examples/github-copilot-remote-chat.json.Files
Phantom.Workspaces.Data.Core/JsonEntities/agent-manifests/copilot-split-executor.json(new); the manifest/validation code that enforces the OAuth-local rule.Detailed design
Requirement 11 ΓÇö Default split manifest. Ship a default manifest entity (
defaults/agent-manifests/...) implementing this split: the Copilot-SDK chat client runs remotely; the chat router, the workspace tools (workspace-gui/workspace-entity), and the GitHub web MCP server run locally.Requirement 12 ΓÇö No web-vs-non-web distinction. An MCP server with no
executorsimply runs on the local session executor. There is no special "web tools go remote" rule.Requirement 13 ΓÇö OAuth interactivity rationale. MCP servers using interactive OAuth (authorization-code with a loopback/localhost redirect + a browser) MUST run on the machine that can open the user's browser and receive the loopback redirect ΓÇö i.e. the local executor. Therefore OAuth-interactive MCP servers MUST be pinned local; the default manifest pins the GitHub web MCP local for this reason (and because that is where the user authenticates). A key/PAT-authenticated web MCP does not strictly require local, but the default ships it local. Validation note: an MCP tool whose connection uses interactive OAuth combined with a non-local
executorMUST be rejected or warned at load/validation time.The
worker-profileparameter is of kindexecutor(see #1434): at launch the user picks the worker executor by choosing either a trust-profile entity or a user-computer-profile entity (the latter synthesizing an implicit trust profile). Theworkerexecutor resource'sparameterstrategy referencesworker-profileand resolves through the selected/implicit trust profile'sDefaultExecutionTarget.New file (applicable):
Phantom.Workspaces.Data.Core/JsonEntities/agent-manifests/copilot-split-executor.jsonΓÇö the default split-executor manifest entity.Contradiction note (shape reference):
3.
github-copilot-remote-chat.jsonis an AgentDefinition, not a manifest. It iskind:"prompt"and drives remoting viamodel.options.additionalProperties.trust-profile(features/docs/examples/github-copilot-remote-chat.json:6-22,78-94) ΓÇö the OLD per-kind approach. It is a useful shape reference for tool/model/connection JSON, but it does not usekind:"executor"resources or anexecutorfield.Tests
CopilotSplitExecutorManifestTests(Phantom.Workspaces.Data.Core.Tests)Manifest_LoadsManifest_WorkerProfileParameter_ResolvesManifest_ModelBoundToWorker_ResolvesRemoteManifest_WorkspaceToolsAndGithubWebMcp_ResolveLocalValidation_OAuthInteractiveMcpWithNonLocalExecutor_IsRejectedSplitExecutorIntegrationTests(Phantom.Workspaces.Tests)DefaultManifest_Session_RecordsExecutorBindings_CopilotWorker_WorkspaceLocalDefaultManifest_Topology_RoutesComponentsAccordinglyTesting strategy ΓÇö Default manifest + validation: The default manifest loads; the
worker-profileparameter resolves; the model resolves to the remote worker; the workspace tools and the GitHub web MCP resolve local. A validation test asserts that an OAuth-interactive MCP with a non-localexecutoris rejected/warned at load. →CopilotSplitExecutorManifestTests.Testing strategy — Full split-executor integration: Using the default manifest, assert the resulting session records
executor-bindingswithcopilot → workerandworkspace/github-web → ".", and that the reconstructed topology routes accordingly. →SplitExecutorIntegrationTests.Dependencies
Depends on: #1433 ΓÇö Executor resource schema + model
Depends on: #1434 ΓÇö
executorparameter kindDepends on: #1435 ΓÇö
PhantomMcpTool.ExecutorfieldDepends on: #1436 ΓÇö Executor-resource resolver
Depends on: #1437 ΓÇö Explicit session executor +
executor-bindingspersistence + resumeDepends on: #1438 ΓÇö Per-tool MCP execution over transport + production remote MCP host