ms-tau-sdk 1.2.8.dev13__tar.gz → 1.2.8.dev14__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/CHANGELOG.md +9 -0
  2. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/PKG-INFO +6 -6
  3. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/README.md +5 -5
  4. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/pyproject.toml +1 -1
  5. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/agent_skills/tau_project_customization/SKILL.md +29 -2
  6. ms_tau_sdk-1.2.8.dev14/src/ms_tau_sdk/resources/SYSTEM.md +11 -0
  7. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/runtime/extensions.py +32 -0
  8. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/runtime/manager.py +50 -15
  9. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/runtime/session.py +14 -0
  10. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/settings.py +5 -0
  11. ms_tau_sdk-1.2.8.dev13/src/ms_tau_sdk/resources/SYSTEM.md +0 -12
  12. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/.gitignore +0 -0
  13. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/packages/tau-board/src/ms_tau_board/__init__.py +0 -0
  14. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/packages/tau-board/src/ms_tau_board/app.py +0 -0
  15. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/packages/tau-board/src/ms_tau_board/cli.py +0 -0
  16. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/packages/tau-board/src/ms_tau_board/config.py +0 -0
  17. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/packages/tau-board/src/ms_tau_board/env_file.py +0 -0
  18. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/packages/tau-board/src/ms_tau_board/logs.py +0 -0
  19. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/packages/tau-board/src/ms_tau_board/proxy.py +0 -0
  20. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/packages/tau-board/src/ms_tau_board/state.py +0 -0
  21. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/packages/tau-board/src/ms_tau_board/static/BULMA-LICENSE.txt +0 -0
  22. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/packages/tau-board/src/ms_tau_board/static/app.js +0 -0
  23. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/packages/tau-board/src/ms_tau_board/static/board.css +0 -0
  24. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/packages/tau-board/src/ms_tau_board/static/bulma.min.css +0 -0
  25. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/packages/tau-board/src/ms_tau_board/static/index.html +0 -0
  26. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/__init__.py +0 -0
  27. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/agent_skills/tau_a2a_runtime_adapter/SKILL.md +0 -0
  28. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/agent_skills/tau_local_development/SKILL.md +0 -0
  29. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/agent_skills/tau_repository_integration/SKILL.md +0 -0
  30. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/api/__init__.py +0 -0
  31. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/api/a2a.py +0 -0
  32. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/api/chat.py +0 -0
  33. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/api/dependencies.py +0 -0
  34. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/api/health.py +0 -0
  35. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/api/models.py +0 -0
  36. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/api/sessions.py +0 -0
  37. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/app.py +0 -0
  38. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/application.py +0 -0
  39. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/backend/__init__.py +0 -0
  40. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/backend/auth.py +0 -0
  41. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/backend/client.py +0 -0
  42. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/backend/local.py +0 -0
  43. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/backend/mcp.py +0 -0
  44. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/backend/models.py +0 -0
  45. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/backend/routes.py +0 -0
  46. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/cli.py +0 -0
  47. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/errors.py +0 -0
  48. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/logging.py +0 -0
  49. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/protocols/__init__.py +0 -0
  50. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/protocols/a2a_message.py +0 -0
  51. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/protocols/a2a_roles.py +0 -0
  52. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/protocols/assistant_ui.py +0 -0
  53. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/protocols/strict_json.py +0 -0
  54. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/providers/__init__.py +0 -0
  55. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/providers/definitions.py +0 -0
  56. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/providers/factory.py +0 -0
  57. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/resources/__init__.py +0 -0
  58. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/resources/loader.py +0 -0
  59. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/resources/prompts/review-code-repository.md +0 -0
  60. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/runtime/__init__.py +0 -0
  61. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/runtime/deployment_health.py +0 -0
  62. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/runtime/events.py +0 -0
  63. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/runtime/failures.py +0 -0
  64. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/runtime/observability.py +0 -0
  65. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/runtime/provenance.py +0 -0
  66. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/runtime/snapshots.py +0 -0
  67. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/runtime/task_context.py +0 -0
  68. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/sessions/__init__.py +0 -0
  69. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/sessions/storage.py +0 -0
  70. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/skills.py +0 -0
  71. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/tools/__init__.py +0 -0
  72. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/tools/mainsequence_mcp.py +0 -0
  73. {ms_tau_sdk-1.2.8.dev13 → ms_tau_sdk-1.2.8.dev14}/src/ms_tau_sdk/tools/task_control.py +0 -0
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.2.8 — 2026-09-24
4
+
5
+ - Added independent `TAU_EXCLUDE_BASE_TOOLS` and `TAU_EXCLUDE_MAINSEQUENCE_MCP` process settings.
6
+ Deployments can expose only project extension tools plus the two required A2A Task controls.
7
+ The runtime skips MCP connection and resource guidance when excluded, rejects project overrides
8
+ of the Task controls, and checks the effective catalog on load and after extension reload.
9
+ - Documented the settings for managed workflow `env_vars` and local runtimes in ADR 0011, the
10
+ reference guides, and the version-matched `tau-project-customization` skill.
11
+
3
12
  ## 1.2.7 — 2026-09-21
4
13
 
5
14
  - Bundle the local Tau Board command, Python package, and UI assets in the `ms-tau-sdk` wheel.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ms-tau-sdk
3
- Version: 1.2.8.dev13
3
+ Version: 1.2.8.dev14
4
4
  Summary: Workspace-bound Tau application primitives for Main Sequence projects
5
5
  Project-URL: Changelog, https://github.com/mainsequence-sdk/ms-tau-sdk/blob/development/CHANGELOG.md
6
6
  Project-URL: Documentation, https://github.com/mainsequence-sdk/ms-tau-sdk/tree/development/docs
@@ -169,10 +169,10 @@ the board process's safe environment values and edits named non-secret variables
169
169
  file; Tau or the board must restart before saved startup values take effect.
170
170
 
171
171
  Platform discovery of the unregistered process, internal backend dispatch/caller-delivery hooks,
172
- push notifications, and `resume_caller` remain unavailable. Outbound A2A through Main Sequence MCP
173
- supports Messages and Tasks with polling under authenticated-user semantics. Local mode binds to
174
- `127.0.0.1` unless a host was explicitly configured. Main Sequence MCP remains live, so its tools
175
- can still read or mutate real platform resources.
172
+ push notifications, and `resume_caller` remain unavailable. When Main Sequence MCP is enabled,
173
+ outbound A2A supports Messages and Tasks with polling under authenticated-user semantics, and MCP
174
+ tools can read or mutate real platform resources. Local mode binds to `127.0.0.1` unless a host was
175
+ explicitly configured.
176
176
 
177
177
  ## Workspace-owned Tau behavior
178
178
 
@@ -201,7 +201,7 @@ are not bundled into the SDK. Main Sequence transport and protocol behavior rema
201
201
  - durable Tau sessions, leases, restore, persistence, cancellation, eviction, and shutdown
202
202
  - local Tau execution without backend AgentSession pre-creation
203
203
  - chat, SSE, A2A, health, and readiness transports
204
- - Main Sequence MCP and protocol-required task controls
204
+ - optional Main Sequence MCP and always-present protocol-required task controls
205
205
  - packaged defaults that participate in Tau's normal workspace configuration
206
206
  - explicit, version-matched development skills for repository integration, local debugging,
207
207
  project customization, and TAU's A2A host adapter
@@ -138,10 +138,10 @@ the board process's safe environment values and edits named non-secret variables
138
138
  file; Tau or the board must restart before saved startup values take effect.
139
139
 
140
140
  Platform discovery of the unregistered process, internal backend dispatch/caller-delivery hooks,
141
- push notifications, and `resume_caller` remain unavailable. Outbound A2A through Main Sequence MCP
142
- supports Messages and Tasks with polling under authenticated-user semantics. Local mode binds to
143
- `127.0.0.1` unless a host was explicitly configured. Main Sequence MCP remains live, so its tools
144
- can still read or mutate real platform resources.
141
+ push notifications, and `resume_caller` remain unavailable. When Main Sequence MCP is enabled,
142
+ outbound A2A supports Messages and Tasks with polling under authenticated-user semantics, and MCP
143
+ tools can read or mutate real platform resources. Local mode binds to `127.0.0.1` unless a host was
144
+ explicitly configured.
145
145
 
146
146
  ## Workspace-owned Tau behavior
147
147
 
@@ -170,7 +170,7 @@ are not bundled into the SDK. Main Sequence transport and protocol behavior rema
170
170
  - durable Tau sessions, leases, restore, persistence, cancellation, eviction, and shutdown
171
171
  - local Tau execution without backend AgentSession pre-creation
172
172
  - chat, SSE, A2A, health, and readiness transports
173
- - Main Sequence MCP and protocol-required task controls
173
+ - optional Main Sequence MCP and always-present protocol-required task controls
174
174
  - packaged defaults that participate in Tau's normal workspace configuration
175
175
  - explicit, version-matched development skills for repository integration, local debugging,
176
176
  project customization, and TAU's A2A host adapter
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ms-tau-sdk"
7
- version = "1.2.8.dev13"
7
+ version = "1.2.8.dev14"
8
8
  description = "Workspace-bound Tau application primitives for Main Sequence projects"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -46,6 +46,33 @@ The project author owns:
46
46
  The SDK does not sandbox these extensions. Web, fetch, search, browser, video, and other optional
47
47
  tools are project choices and are not part of the base SDK.
48
48
 
49
+ ## Runtime tool composition
50
+
51
+ Two independent process settings select the host-provided tools. Both default to `false`:
52
+
53
+ | Setting | Effect when `true` |
54
+ | --- | --- |
55
+ | `TAU_EXCLUDE_BASE_TOOLS` | Omit Tau's `read`, `write`, `edit`, and `bash`. |
56
+ | `TAU_EXCLUDE_MAINSEQUENCE_MCP` | Skip Main Sequence MCP connection, tools, resources, and resource prompt. |
57
+
58
+ Set them in `harness_agent.spec.env_vars` in a managed repository workflow, in the process
59
+ environment for local `ms-tau`, or through explicit `TauSDKSettings` fields in a Python host. They
60
+ apply to all sessions in that process; neither Agent Card skills nor prompt text removes tools.
61
+
62
+ | Exclude base tools | Exclude Main Sequence MCP | Model-facing sources |
63
+ | --- | --- | --- |
64
+ | `false` | `false` | Coding tools, Main Sequence MCP, project extension tools, A2A Task controls. |
65
+ | `true` | `false` | Main Sequence MCP, project extension tools, A2A Task controls. |
66
+ | `false` | `true` | Coding tools, project extension tools, A2A Task controls. |
67
+ | `true` | `true` | Project extension tools and A2A Task controls. |
68
+
69
+ The A2A Task controls are `task_request_input` and `task_request_authorization`. They remain
70
+ available in every mode for the agent's own Task; extensions must not register those names.
71
+ Register project tools under `.tau/extensions/` and verify the effective catalog after loading.
72
+ With `read` excluded, Tau 0.4.2 does not insert discovered skills into the system prompt. Put
73
+ needed guidance in the effective `.tau/SYSTEM.md` or expose it through a declared retrieval tool.
74
+ Excluding coding tools does not sandbox extension Python code.
75
+
49
76
  ## Invariants extensions must not replace
50
77
 
51
78
  Extensions may change effective agent capabilities, but they must not replace or bypass:
@@ -57,8 +84,8 @@ Extensions may change effective agent capabilities, but they must not replace or
57
84
  - secret redaction and payload limits; or
58
85
  - HTTP, SSE, Responses, and A2A wire validation.
59
86
 
60
- Use canonical Main Sequence MCP operations for live platform state. Project tools do not grant new
61
- platform permissions merely because they run inside TAU.
87
+ When Main Sequence MCP is enabled, use its canonical operations for live platform state. Project
88
+ tools do not grant new platform permissions merely because they run inside TAU.
62
89
 
63
90
  ## Validation
64
91
 
@@ -0,0 +1,11 @@
1
+ You are an agent running through the Main Sequence TAU SDK in the current project workspace.
2
+
3
+ Work directly toward the user's requested outcome. Follow relevant project instructions, keep
4
+ changes focused, preserve unrelated work, and verify material changes when appropriate tools exist.
5
+
6
+ Use the tools available in this runtime for the work they support. When Main Sequence MCP tools and
7
+ resources are available, use them for Main Sequence platform knowledge and operations. Never expose runtime
8
+ credentials, access tokens, or other secrets in code, logs, diagnostics, or responses.
9
+
10
+ Project-owned Tau configuration, instructions, skills, hooks, and extensions are authoritative for
11
+ project behavior within the host's safety and protocol boundaries.
@@ -7,8 +7,40 @@ from dataclasses import dataclass
7
7
  from tau_agent.types import JSONValue
8
8
  from tau_coding import CodingSession
9
9
 
10
+ from ms_tau_sdk.errors import ConfigurationError
10
11
  from ms_tau_sdk.runtime.snapshots import sha256_json
11
12
 
13
+ TASK_CONTROL_TOOL_NAMES = frozenset({"task_request_input", "task_request_authorization"})
14
+
15
+
16
+ def validate_tool_catalog(
17
+ session: CodingSession,
18
+ *,
19
+ sdk_tool_names: frozenset[str],
20
+ require_complete_project_catalog: bool,
21
+ ) -> None:
22
+ """Reject extension overrides and catalog drift before a model can use tools."""
23
+ sources = session.extension_tool_sources
24
+ reserved = TASK_CONTROL_TOOL_NAMES & sources.keys()
25
+ if reserved:
26
+ raise ConfigurationError(
27
+ "Project extensions cannot replace A2A Task controls: " + ", ".join(sorted(reserved))
28
+ )
29
+ names = [tool.name for tool in session.tools]
30
+ expected = sdk_tool_names | sources.keys()
31
+ if len(names) != len(set(names)) or set(names) != expected:
32
+ raise ConfigurationError("Effective Tau tool catalog differs from configured tool sources")
33
+ if require_complete_project_catalog:
34
+ metadata = session.extension_runtime.extension_metadata
35
+ for owner in set(sources.values()):
36
+ matches = [item for item in metadata if item.name == owner]
37
+ if len(matches) != 1 or matches[0].source != "project":
38
+ raise ConfigurationError("Tool-only runtime includes a non-project extension tool")
39
+ if require_complete_project_catalog and any(
40
+ diagnostic.severity == "error" for diagnostic in session.extension_runtime.diagnostics
41
+ ):
42
+ raise ConfigurationError("Project extension loading failed in tool-only runtime mode")
43
+
12
44
 
13
45
  @dataclass(slots=True)
14
46
  class ProjectExtensionState:
@@ -38,7 +38,7 @@ from ms_tau_sdk.logging import conversation_log_fields
38
38
  from ms_tau_sdk.providers.factory import ProviderFactory
39
39
  from ms_tau_sdk.resources.loader import tau_resource_paths
40
40
  from ms_tau_sdk.runtime.events import TauRuntimeEvent
41
- from ms_tau_sdk.runtime.extensions import ProjectExtensionState
41
+ from ms_tau_sdk.runtime.extensions import ProjectExtensionState, validate_tool_catalog
42
42
  from ms_tau_sdk.runtime.observability import TauTurnObserver
43
43
  from ms_tau_sdk.runtime.provenance import TurnProvenance
44
44
  from ms_tau_sdk.runtime.snapshots import (
@@ -139,7 +139,8 @@ class SessionRuntimeManager:
139
139
  if prefetch_provider is not None:
140
140
  await prefetch_provider()
141
141
  self._provider_control_ready = True
142
- await self._get_mcp_client()
142
+ if not self.settings.exclude_mainsequence_mcp:
143
+ await self._get_mcp_client()
143
144
  self._startup_ready = True
144
145
  if self._eviction_task is None:
145
146
  self._eviction_task = asyncio.create_task(
@@ -158,6 +159,10 @@ class SessionRuntimeManager:
158
159
  }
159
160
  return {
160
161
  "mode": "local" if self.settings.local_mode else "managed",
162
+ "exclude_base_tools": self.settings.exclude_base_tools,
163
+ "exclude_mainsequence_mcp": self.settings.exclude_mainsequence_mcp,
164
+ "base_tool_count": 0 if self.settings.exclude_base_tools else 4,
165
+ "task_control_tool_count": 2,
161
166
  "workspace_digest": self.settings.workspace_digest,
162
167
  "holder_id": self.holder_id,
163
168
  "loaded_sessions": len(self._runtimes),
@@ -396,7 +401,9 @@ class SessionRuntimeManager:
396
401
  provider_control=bootstrap.provider_control,
397
402
  ),
398
403
  )
399
- mcp_client = await self._get_mcp_client()
404
+ mcp_client = (
405
+ None if self.settings.exclude_mainsequence_mcp else await self._get_mcp_client()
406
+ )
400
407
  cwd = self._resolve_cwd()
401
408
  project_extension_state = ProjectExtensionState(enabled=True)
402
409
  caller_session_proof = None
@@ -406,15 +413,32 @@ class SessionRuntimeManager:
406
413
  "lease_holder_id": lease.holder_id,
407
414
  "lease_token": lease.lease_token,
408
415
  }
409
- tools = [
410
- *create_coding_tools(cwd=cwd),
411
- *create_mainsequence_mcp_tools(
412
- mcp_client,
413
- caller_session_proof=caller_session_proof,
414
- allow_missing_session_proof=self.settings.local_mode,
415
- ),
416
- *create_task_control_tools(),
417
- ]
416
+ tools = []
417
+ if not self.settings.exclude_base_tools:
418
+ tools.extend(create_coding_tools(cwd=cwd))
419
+ if mcp_client is not None:
420
+ tools.extend(
421
+ create_mainsequence_mcp_tools(
422
+ mcp_client,
423
+ caller_session_proof=caller_session_proof,
424
+ allow_missing_session_proof=self.settings.local_mode,
425
+ )
426
+ )
427
+ tools.extend(create_task_control_tools())
428
+ sdk_tool_names = frozenset(tool.name for tool in tools)
429
+ if len(sdk_tool_names) != len(tools):
430
+ raise ConfigurationError("SDK tool sources contain duplicate names")
431
+ require_complete_project_catalog = (
432
+ self.settings.exclude_base_tools and self.settings.exclude_mainsequence_mcp
433
+ )
434
+
435
+ def check_catalog(session: CodingSession) -> None:
436
+ validate_tool_catalog(
437
+ session,
438
+ sdk_tool_names=sdk_tool_names,
439
+ require_complete_project_catalog=require_complete_project_catalog,
440
+ )
441
+
418
442
  coding_session = await CodingSession.load(
419
443
  CodingSessionConfig(
420
444
  provider=provider_runtime.provider,
@@ -425,7 +449,11 @@ class SessionRuntimeManager:
425
449
  cwd=cwd,
426
450
  tools=tools,
427
451
  session_id=session_uid,
428
- append_system_prompt=mainsequence_mcp_resource_prompt(mcp_client),
452
+ append_system_prompt=(
453
+ mainsequence_mcp_resource_prompt(mcp_client)
454
+ if mcp_client is not None
455
+ else None
456
+ ),
429
457
  resource_paths=tau_resource_paths(
430
458
  cwd,
431
459
  state_home=self.settings.tau_state_home,
@@ -434,6 +462,12 @@ class SessionRuntimeManager:
434
462
  trust_override="approve",
435
463
  )
436
464
  )
465
+ try:
466
+ check_catalog(coding_session)
467
+ except BaseException:
468
+ with contextlib.suppress(Exception):
469
+ await coding_session.aclose()
470
+ raise
437
471
  project_extension_state.update_from_session(coding_session)
438
472
  self._log_project_extension_diagnostics(
439
473
  session_uid=session_uid,
@@ -454,6 +488,7 @@ class SessionRuntimeManager:
454
488
  provider_control_schema=bootstrap.provider_control.schema_version,
455
489
  catalog_digest=bootstrap.provider_control.catalog_digest,
456
490
  project_extension_state=project_extension_state,
491
+ validate_tool_catalog=check_catalog,
457
492
  )
458
493
  state = bootstrap.runtime_state
459
494
  runtime.runtime_activity = state.runtime_activity or "loading"
@@ -479,8 +514,8 @@ class SessionRuntimeManager:
479
514
  snapshot_selected=snapshot_selected,
480
515
  snapshot_fallback_reason=fallback_reason,
481
516
  history_entry_count=len(initial_entries),
482
- mcp_tool_count=len(mcp_client.tools),
483
- mcp_resource_count=len(mcp_client.resources),
517
+ mcp_tool_count=len(mcp_client.tools) if mcp_client is not None else 0,
518
+ mcp_resource_count=len(mcp_client.resources) if mcp_client is not None else 0,
484
519
  provider_control_schema=bootstrap.provider_control.schema_version,
485
520
  catalog_digest=bootstrap.provider_control.catalog_digest,
486
521
  project_extensions_enabled=project_extension_state.enabled,
@@ -9,6 +9,7 @@ from dataclasses import dataclass, field
9
9
 
10
10
  from tau_agent.types import JSONValue
11
11
  from tau_coding import CodingSession
12
+ from tau_coding.reload import CodingReloadSummary
12
13
 
13
14
  from ms_tau_sdk.backend.mcp import MainSequenceMCPClient
14
15
  from ms_tau_sdk.backend.models import TauTurnCommit
@@ -46,6 +47,17 @@ class ActiveSessionRuntime:
46
47
  provider_control_schema: int = 0
47
48
  catalog_digest: str = ""
48
49
  project_extension_state: ProjectExtensionState | None = None
50
+ validate_tool_catalog: Callable[[CodingSession], None] | None = None
51
+
52
+ async def reload(self) -> CodingReloadSummary:
53
+ """Reload Tau resources and reject an invalid replacement catalog."""
54
+ async with self.lock:
55
+ summary = await self.coding_session.reload()
56
+ if self.validate_tool_catalog is not None:
57
+ self.validate_tool_catalog(self.coding_session)
58
+ if self.project_extension_state is not None:
59
+ self.project_extension_state.update_from_session(self.coding_session)
60
+ return summary
49
61
 
50
62
  async def prompt(
51
63
  self,
@@ -64,6 +76,8 @@ class ActiveSessionRuntime:
64
76
  async with self.lock:
65
77
  if self.evicting:
66
78
  raise RuntimeError("Session runtime is being reconfigured")
79
+ if self.validate_tool_catalog is not None:
80
+ self.validate_tool_catalog(self.coding_session)
67
81
  self.last_used_at = time.monotonic()
68
82
  settled_event: TauRuntimeEvent | None = None
69
83
  if provenance:
@@ -55,6 +55,11 @@ class TauSDKSettings(BaseSettings):
55
55
  validation_alias="MAINSEQUENCE_REFRESH_TOKEN",
56
56
  )
57
57
  local_mode: bool = Field(default=False, validation_alias="TAU_LOCAL_MODE")
58
+ exclude_base_tools: bool = Field(default=False, validation_alias="TAU_EXCLUDE_BASE_TOOLS")
59
+ exclude_mainsequence_mcp: bool = Field(
60
+ default=False,
61
+ validation_alias="TAU_EXCLUDE_MAINSEQUENCE_MCP",
62
+ )
58
63
  local_provider: str | None = Field(default=None, validation_alias="TAU_LOCAL_PROVIDER")
59
64
  local_model: str | None = Field(default=None, validation_alias="TAU_LOCAL_MODEL")
60
65
  local_thinking: (
@@ -1,12 +0,0 @@
1
- You are a coding agent running through the Main Sequence TAU SDK in the current project workspace.
2
-
3
- Work directly toward the user's requested outcome. Inspect relevant project instructions and files
4
- before editing, keep changes focused, preserve unrelated work, and verify material changes with the
5
- project's available tests or checks.
6
-
7
- Use the available coding tools for workspace work. Use the injected Main Sequence MCP tools and
8
- advertised resources for Main Sequence platform knowledge and operations. Never expose runtime
9
- credentials, access tokens, or other secrets in code, logs, diagnostics, or responses.
10
-
11
- Project-owned Tau configuration, instructions, skills, hooks, and extensions are authoritative for
12
- project behavior within the host's safety and protocol boundaries.