machine-bridge-mcp 3.0.0-beta.205 → 3.0.0-beta.206

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 (116) hide show
  1. package/CHANGELOG.md +20 -15
  2. package/README.md +1 -1
  3. package/browser-extension/manifest.json +1 -1
  4. package/docs/AUDIT.md +1 -1
  5. package/docs/CLIENTS.md +134 -33
  6. package/docs/COMPUTER_USE.md +408 -96
  7. package/docs/LOGGING.md +210 -53
  8. package/docs/OPERATIONS.md +792 -154
  9. package/docs/OVERVIEW.md +14 -0
  10. package/docs/TOOL_REFERENCE.md +1 -1
  11. package/docs/UPGRADING.md +15 -2
  12. package/package.json +14 -1
  13. package/scripts/sync-worker-version.mjs +16 -0
  14. package/src/local/agent-context.mjs +1 -1
  15. package/src/local/agent-contract.mjs +2 -2
  16. package/src/local/application-capability-match.mjs +10 -0
  17. package/src/local/autostart-log-maintenance.mjs +1 -6
  18. package/src/local/call-registry.mjs +1 -6
  19. package/src/local/cli-idle-sleep.mjs +2 -0
  20. package/src/local/cli-options.mjs +2 -7
  21. package/src/local/cli.mjs +1 -6
  22. package/src/local/daemon-http-relay-connection.mjs +1 -5
  23. package/src/local/daemon-http-retry-policy.mjs +4 -0
  24. package/src/local/delegated-process-sandbox.mjs +7 -2
  25. package/src/local/errors.mjs +15 -0
  26. package/src/local/git-content-service.mjs +1 -1
  27. package/src/local/git-service.mjs +1 -1
  28. package/src/local/git-version.mjs +6 -0
  29. package/src/local/idle-sleep-mode.mjs +7 -2
  30. package/src/local/managed-job-capacity.mjs +2 -0
  31. package/src/local/managed-job-dependency-metadata.mjs +4 -0
  32. package/src/local/managed-job-hosted-reconcile.mjs +2 -0
  33. package/src/local/managed-job-listing.mjs +1 -1
  34. package/src/local/managed-job-plan-integrity.mjs +8 -0
  35. package/src/local/managed-job-read-policy.mjs +1 -1
  36. package/src/local/managed-job-resource-context.mjs +4 -0
  37. package/src/local/owner-state-lock.mjs +1 -5
  38. package/src/local/package-identity.mjs +1 -0
  39. package/src/local/process-error-message.mjs +6 -0
  40. package/src/local/process-lock-read-retry.mjs +8 -1
  41. package/src/local/process-session-read.mjs +1 -1
  42. package/src/local/process-session-remote-activity.mjs +3 -0
  43. package/src/local/process-sessions.mjs +1 -1
  44. package/src/local/process-tree.mjs +1 -0
  45. package/src/local/progress-reporter.mjs +3 -0
  46. package/src/local/project-package.mjs +1 -1
  47. package/src/local/relay-call-recovery.mjs +1 -1
  48. package/src/local/relay-heartbeat-options.mjs +13 -4
  49. package/src/local/relay-peer-diagnostics.mjs +2 -2
  50. package/src/local/relay-recovery-admission.mjs +2 -0
  51. package/src/local/relay-transport-confirmation.mjs +1 -4
  52. package/src/local/release-runtime-lock.mjs +8 -0
  53. package/src/local/resilient-relay-connection.mjs +1 -5
  54. package/src/local/resource-cpu-window.mjs +4 -1
  55. package/src/local/resource-disk-headroom.mjs +9 -0
  56. package/src/local/resource-elastic-memory.mjs +3 -0
  57. package/src/local/resource-host-sample-file.mjs +6 -0
  58. package/src/local/resource-process-priority.mjs +8 -0
  59. package/src/local/resource-release-control-classification.mjs +2 -0
  60. package/src/local/resource-transaction-lock.mjs +1 -1
  61. package/src/local/resource-xcode-command.mjs +5 -0
  62. package/src/local/resource-xcode-non-build.mjs +3 -0
  63. package/src/local/runtime-relay-acknowledgements.mjs +2 -0
  64. package/src/local/runtime-relay.mjs +1 -1
  65. package/src/local/runtime-tool-handlers.mjs +1 -1
  66. package/src/local/runtime.mjs +1 -1
  67. package/src/local/security-audit-warning.mjs +13 -5
  68. package/src/local/service-ownership.mjs +10 -0
  69. package/src/local/service-restartability.mjs +3 -1
  70. package/src/local/short-identifiers.mjs +3 -0
  71. package/src/local/state.mjs +1 -1
  72. package/src/local/stdio.mjs +304 -91
  73. package/src/local/systemd-removal.mjs +2 -0
  74. package/src/local/tool-result-boundary.mjs +10 -5
  75. package/src/local/worker-identity-contract.mjs +4 -0
  76. package/src/local/workspace-file-service.mjs +1 -1
  77. package/src/local/workspace-search-service.mjs +1 -1
  78. package/src/local/wrangler-toolchain.mjs +1 -5
  79. package/src/shared/mcp-protocol.d.mts +2 -0
  80. package/src/shared/mcp-protocol.mjs +17 -0
  81. package/src/shared/mcp-task-contract.d.mts +8 -0
  82. package/src/shared/mcp-task-contract.mjs +33 -0
  83. package/src/shared/progress-reporter.d.mts +10 -0
  84. package/src/shared/progress-reporter.mjs +63 -0
  85. package/src/shared/sensitive-value-patterns.mjs +4 -2
  86. package/src/shared/server-metadata.json +1 -1
  87. package/src/shared/tool-catalog.json +1 -1
  88. package/src/worker/access.ts +2 -1
  89. package/src/worker/daemon-http-channel.ts +2 -2
  90. package/src/worker/dpop.ts +7 -6
  91. package/src/worker/http.ts +2 -1
  92. package/src/worker/index.ts +16 -16
  93. package/src/worker/managed-job-hosted-schema.ts +1 -0
  94. package/src/worker/mcp-controller.ts +41 -83
  95. package/src/worker/mcp-http-contract.ts +8 -4
  96. package/src/worker/mcp-job-monitor-store.ts +1 -1
  97. package/src/worker/mcp-prompts.ts +118 -0
  98. package/src/worker/mcp-response-stream.ts +14 -1
  99. package/src/worker/mcp-streamed-tool-dispatch.ts +43 -0
  100. package/src/worker/mcp-streamed-tool-response.ts +4 -2
  101. package/src/worker/mcp-task-dispatch.ts +115 -0
  102. package/src/worker/mcp-task-projection.ts +53 -0
  103. package/src/worker/mcp-task-result-codec.ts +44 -0
  104. package/src/worker/mcp-task-seed.ts +33 -0
  105. package/src/worker/mcp-task-service.ts +33 -0
  106. package/src/worker/mcp-task-store.ts +275 -0
  107. package/src/worker/mcp-tasks.ts +4 -0
  108. package/src/worker/mcp-tool-call-dispatch.ts +81 -0
  109. package/src/worker/oauth-controller.ts +2 -2
  110. package/src/worker/oauth-refresh-persistence.ts +12 -4
  111. package/src/worker/tool-catalog.ts +4 -4
  112. package/src/worker/worker-mcp-config.ts +6 -1
  113. package/tsconfig.json +3 -0
  114. package/tsconfig.local.json +38 -3
  115. package/src/local/numbers.mjs +0 -3
  116. package/src/local/records.mjs +0 -3
package/CHANGELOG.md CHANGED
@@ -1,21 +1,26 @@
1
1
  # Changelog
2
2
 
3
- ## 3.0.0-beta.205 - 2026-10-19
4
-
5
- - Supersede beta.203 after its Windows atomic-replacement and macOS resource CLI checks failed, and beta.204 after review reproduced an external-generation overwrite during a replacement retry. Repeat exact-package activation and deployed OAuth acceptance for the new candidate.
6
- - Revalidate the expected content digest before every atomic-replacement attempt so an external edit after a transient sharing failure returns a conflict and retains the external generation; regression coverage also verifies staging cleanup.
7
- - Preserve an absent coverage environment variable in uninstrumented CLI test children so an exact-runtime version probe retains its light resource classification; assert the actual CLI environment before submission.
8
-
9
- - Keep one bridge Durable Object per deployment. The `x-mbm-workspace` / `?workspace=` shard selector is removed: it had no producer, and an unauthenticated request header could fork OAuth clients, tokens, the daemon registry, and pending calls into a second consistency domain.
10
- - Add an opt-in `--compat` stdio mode for legacy hosts that refuse to start without `initialize`. It accepts the removed handshake and `notifications/initialized` without creating a session, advertises the server's own protocol version instead of echoing the client's, and fills request metadata only when fields are absent; explicit retired, future, or malformed metadata remains subject to normal rejection. `client-config` no longer injects the flag, and `--help` documents it.
11
- - Make `browser_screenshot.allow_tab_switch` reachable over MCP: the catalog now declares the option and the service parses it as a strict boolean, so non-disruptive capture can fail on an inactive target instead of activating it.
12
- - Replace the `MBM_DEBUG`-driven verbose error projection with an explicit per-call option. `MBM_DEBUG` no longer widens tool error output, the stdio server opts in per process with `MBM_VERBOSE_ERRORS=1`, the relay never opts in, and verbose messages and causes share the single sanitized 2000-character ceiling of the public message field.
13
- - Drop the placeholder Desktop Automation and Power Management abstraction classes; capability reporting is now a plain function over the platform.
14
- - Align `cloudflare.config.ts`, `wrangler.config.ts`, and `wrangler.jsonc` on the documented deployment topology, and relax `devEngines.packageManager` to `warn` so older npm setups do not hard-fail initialization.
15
- - Bound stdio response backlog and output-buffer copying; harden protected-path resolution, terminal-job evidence checks, file-transaction cleanup reporting, and default instruction-context payloads. Add regression tests for the associated security, settlement, and performance boundaries.
16
- - Retry bounded transient filesystem sharing errors during atomic file replacement so concurrent Windows readers do not cause a premature update failure; preserve the original error after exhaustion and reject non-transient failures immediately.
17
- - Repository hygiene: ignore the generated `.workflow/` directory and drop cached review artifacts and intermediate backups from the local workspace.
3
+ ## 3.0.0-beta.206 - 2026-10-20
18
4
 
5
+ - Fix minute-boundary calculation in progress reporter elapsed formatting to prevent overflow past 60 seconds.
6
+ - Wire progressToken through Worker MCP HTTP contract handling and streamed response dispatch.
7
+ - Remove redundant duplicate self-comparison import in records test suite.
8
+ - Enforce `package.json`/`package-lock.json` root version parity in the version-sync gate and package test.
9
+ - Run progress reporter unit tests against the shared production module, retaining only a local compatibility re-export.
10
+ - Remove the legacy stdio handshake and metadata-normalization mode, including the CLI option and environment switch.
11
+ - Document that multi-file patch rollback covers ordinary operation failures but is not crash-atomic across files; single-file write/edit visibility remains atomic.
12
+ - Add a child-process regression that reproduces the multi-file patch crash window and verifies retained backup/staging artifacts.
13
+ - Expand recursive-search control-plane filtering tests to cover security, browser-pairing, and service-control roots, and test stdio EOF cancellation and output-write failure.
14
+ - Add regression coverage for bounded stdio error responses and serialized concurrent task-state updates.
15
+ - Expand stdio output queue limit and reservation to safely process concurrent maximum-size tool results without dropping the transport.
16
+ - Implement remote Worker MCP Tasks operations (`tasks/get`, `tasks/update`, `tasks/cancel`) for clients that advertise the Tasks extension; local stdio intentionally does not advertise it, `tasks/list`/`tasks/result` aliases are unsupported, project cleanup/interrupted recovery states as active tasks, and tasks without a persisted terminal result fail explicitly if their backing job record disappears before result capture.
17
+ - Centralize MCP task job-ID validation in the shared task contract so task creation, dispatch and durable-record validation use one pattern.
18
+ - Add actionable error guidance (actionable_remedy) for agent reflexion on tool execution failures.
19
+ - Expand local TypeScript type checking coverage to 74 checked modules with strict JSDoc typing.
20
+ - Consolidate cross-module integer validation helpers into shared runtime modules.
21
+ - Add standard npm test script mapped to the verification runner.
22
+ - Tighten TypeScript compiler checks with noFallthroughCasesInSwitch, noImplicitReturns, and noUncheckedIndexedAccess.
23
+ - Include previously orphaned tests into the check runner plan.
19
24
 
20
25
  ## Historical releases
21
26
 
package/README.md CHANGED
@@ -50,7 +50,7 @@ The complete component and trust-boundary diagram is in [docs/OVERVIEW.md](docs/
50
50
 
51
51
  ## MCP protocol model
52
52
 
53
- Machine Bridge uses MCP `2026-07-28` for both stdio and remote HTTP under one current request-scoped protocol contract. The default stdio path and remote HTTP require current request-scoped metadata. The opt-in stdio `--compat` shim answers only the legacy initialization handshake and fills metadata fields only when absent; explicit retired, future, or malformed versions remain rejected. It does not restore sessions or replay behavior.
53
+ Machine Bridge uses MCP `2026-07-28` for both stdio and remote HTTP under one request-scoped protocol contract. Both transports require current request-scoped metadata and reject the removed initialization/session/replay behavior. Stdio has no compatibility shim, and neither a CLI flag nor an environment variable can fill missing request metadata.
54
54
  Removed protocol requests fail closed with bounded upgrade guidance; hosted clients must reconnect with MCP `2026-07-28` and use `server/discover` rather than initialization.
55
55
  - **HTTP streams are request-scoped and non-resumable.** Closing the response stream cancels that request. There is no recovery GET, SSE event-ID replay, or session-bound delivery store.
56
56
  - **Removed session/replay semantics never execute.** Unsupported protocol dates and requests for the retired session/recovery model receive bounded rejection or upgrade guidance rather than legacy state or replay behavior.
@@ -29,6 +29,6 @@
29
29
  "action": {
30
30
  "default_title": "Machine Bridge Browser"
31
31
  },
32
- "version_name": "3.0.0-beta.205",
32
+ "version_name": "3.0.0-beta.206",
33
33
  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxryYkpZhq8+VAQLHcGS9BAHQcyKX8RHGIpIwvtIVRU/rcOcE0bNdnM0aZJ/h6xWQsGDHlhvjT2+1aJaAn/9k8473BRWajzVXld961CdHYVFVHoce2hHiSJ0xydWrHMMZhAm0mN0UzjEpgZ0tMw209efcZHIvSwuxhteZMRy4kyiVjwFlOf5oXFCxRuCJnPj3AK9CmCf4XgEBuPIJ0TZmjGHOOdBvJmbCNnAWXYEo5/mf7MfCGhV4IJ1hNuhpoNQfOFKMUcw9/v/IpT62XpfXdGYTfGYCmCjC+gntK1spbkr2P4/2+sYMQtLpse71mpSNGXfcf3abU55Vpn+gncSxRQIDAQAB"
34
34
  }
package/docs/AUDIT.md CHANGED
@@ -21,7 +21,7 @@ This review is scoped to source contracts, risk-bearing control paths, isolated
21
21
  - **Workspace replacement retries remain bounded and atomic.** Transient sharing errors retry the staging-file rename without unlinking the visible destination. The expected content digest is rechecked before each attempt, so an external change after a sharing failure returns a conflict and preserves that generation. Exhausted and non-transient failures preserve the original error. Injected success/exhaustion/non-transient and retry-generation regressions supplement the concurrent-reader fixture; Windows CI remains the provider-level proof. This optimistic check does not provide an operating-system compare-and-swap against uncoordinated external writers.
22
22
 
23
23
  - **Authority remains an intersection, never an accumulation.** Effective MCP authority is bounded by authenticated account role, daemon capability ceiling, and tool-specific policy. Reconnects, retries, stale host schemas, browser focus changes, or recovery metadata do not expand authority.
24
- - **Removed protocol behavior stays removed.** Remote HTTP and normal stdio use the current MCP protocol only. The sole exception is the opt-in stdio `--compat` handshake: it answers the removed `initialize`/`notifications/initialized` exchange with the supported version and creates no session or replay state. It supplies request metadata only when fields are absent; explicit retired/future versions and malformed metadata remain rejected, and the shim is never reachable from the remote relay.
24
+ - **Removed protocol behavior stays removed.** Remote HTTP and stdio use the current MCP protocol only. `initialize` is rejected, `notifications/initialized` has no handshake effect, and neither a CLI option nor an environment variable can normalize missing request metadata. Clients must supply the current protocol version and capability metadata on every supported request.
25
25
  - **State publication is atomic, type-exact and identity-sensitive.** Security-sensitive state readers reject symlinks, unexpected hard links, malformed content, permission failures, persistent identity changes, and coercible PID/token/timestamp fields. Persisted strings, arrays, booleans or objects cannot become process, cleanup, lock, lease, waiter or termination authority through JavaScript conversion. Bounded retries are reserved for explicitly classified atomic-publication races; durable state is complete before it becomes visible.
26
26
  - **Durable execution owns continuity explicitly.** Managed jobs persist recovery state independently of the hosted MCP response. Idempotency keys bind uncertain acceptance retries only while the retained record exists; cancellation, dependency state, cleanup, output budgets, and terminal persistence have explicit fail-closed boundaries. Terminal evidence validation is bound to stable status/result file generations, and a live runner retains ownership of its final cleanup-status write. Routine inventory throttles full retention scans to 30 seconds, while capacity pressure, unreadable state, expired staged plans, and dependency-bearing active/staged jobs force maintenance. Callers recover the same accepted job instead of replaying its side effect.
27
27
  - **Daemon-owned Node children use a verified runtime launcher.** A live concrete runtime executable is preferred; if it disappears after a package-manager upgrade, only the original absolute Node launcher is eligible as fallback. Diagnostics expose provenance booleans rather than executable paths, and an unavailable launcher requires service restart instead of PATH guessing.
package/docs/CLIENTS.md CHANGED
@@ -2,23 +2,28 @@
2
2
 
3
3
  ## The central distinction
4
4
 
5
- An MCP server is not a model provider. It exposes tools, resources, or prompts. The MCP host is the AI application that owns the conversation, chooses or supplies the model, decides when a tool should be called, sends the tool request, and adds the result back to the model context.
5
+ An MCP server is not a model provider.
6
+ It exposes tools, resources, or prompts.
7
+ The MCP host is the AI application that owns the conversation, chooses or supplies the model, decides when a tool should be called, sends the tool request, and adds the result back to the model context.
6
8
 
7
9
  For this project:
8
10
 
9
11
 
10
- A local stdio connection does **not** use the model running in a separate ChatGPT web conversation. It uses whatever model/session the local host is configured to use:
12
+ A local stdio connection does **not** use the model running in a separate ChatGPT web conversation.
13
+ It uses whatever model/session the local host is configured to use:
11
14
 
12
15
  - Claude Desktop uses the Claude account/model available to that application.
13
16
  - Cursor uses the model/provider configured in Cursor.
14
17
  - Codex CLI and the Codex IDE integration use their own authenticated Codex/OpenAI configuration.
15
18
  - ChatGPT Desktop can use its signed-in ChatGPT/Codex host session and can launch local stdio servers on supported hosts.
16
19
 
17
- The MCP protocol itself intentionally does not dictate how the host obtains an LLM. The optional MCP sampling primitive can let a server ask a capable host for a completion, but `machine-bridge-mcp` does not depend on sampling and does not bundle a model SDK.
20
+ The MCP protocol itself intentionally does not dictate how the host obtains an LLM.
21
+ The optional MCP sampling primitive can let a server ask a capable host for a completion, but `machine-bridge-mcp` does not depend on sampling and does not bundle a model SDK.
18
22
 
19
23
  ## Why keep stdio when coding clients already have tools?
20
24
 
21
- For many users, the client's native filesystem, patch, terminal, and approval system is sufficient. In that case, adding Machine Bridge over stdio is redundant and should be skipped.
25
+ For many users, the client's native filesystem, patch, terminal, and approval system is sufficient.
26
+ In that case, adding Machine Bridge over stdio is redundant and should be skipped.
22
27
 
23
28
  The stdio mode exists for narrower cases:
24
29
 
@@ -41,19 +46,35 @@ It is therefore an optional compatibility and reuse surface, not a replacement f
41
46
  | Several local clients should share identical tool semantics | stdio |
42
47
  | Access is required from another device or hosted agent | Remote Worker |
43
48
 
44
- The MCP specification defines stdio and Streamable HTTP as standard transports. In stdio, the host launches the server as a subprocess and exchanges newline-delimited JSON-RPC through stdin/stdout. Streamable HTTP runs the server independently behind an HTTP endpoint.
49
+ The MCP specification defines stdio and Streamable HTTP as standard transports.
50
+ In stdio, the host launches the server as a subprocess and exchanges newline-delimited JSON-RPC through stdin/stdout.
51
+ Streamable HTTP runs the server independently behind an HTTP endpoint.
45
52
 
46
- Machine Bridge uses MCP `2026-07-28` for both stdio and remote Streamable HTTP. Requests carry version and capabilities in `_meta`; `server/discover` replaces initialization, there is no MCP protocol session, and an HTTP response stream belongs to exactly one request. Under default protocol handling, `initialize`, `Mcp-Session-Id`, `Last-Event-ID`, replay markers, and other explicit removed protocol-session markers receive bounded upgrade guidance and cannot dispatch tool work; the opt-in stdio `--compat` shim is the only exception for the initialization handshake. Remote `/mcp` is POST-only, so GET returns 405 rather than acting as a recovery channel. Closing a current request stream cancels that request, and a connection, process, OAuth token, or stdio lifetime is never treated as conversation identity.
53
+ Machine Bridge uses MCP `2026-07-28` for both stdio and remote Streamable HTTP.
54
+ Requests carry version and capabilities in `_meta`; `server/discover` replaces initialization, there is no MCP protocol session, and an HTTP response stream belongs to exactly one request.
55
+ `initialize`, `Mcp-Session-Id`, `Last-Event-ID`, replay markers, and other removed protocol-session markers receive bounded upgrade guidance and cannot dispatch tool work. There is no stdio compatibility shim; clients must use request-scoped metadata and `server/discover`.
56
+ Remote `/mcp` is POST-only, so GET returns 405 rather than acting as a recovery channel.
57
+ Closing a current request stream cancels that request, and a connection, process, OAuth token, or stdio lifetime is never treated as conversation identity.
47
58
 
48
59
  ## Automatic capability selection
49
60
 
50
- `server/discover` supplies conservative static server guidance, while `session_bootstrap` and `resolve_task_capabilities` explicitly refresh bounded project facts, authority-permitted instructions, skills, explicit/automatic package commands, applications, browser capability, and task-specific execution routes. Use the resolver when that refreshed context or route selection is material; straightforward file, Git, and shell work should use the already exposed tools directly rather than paying an extra discovery round trip. The resolver scores route bundles instead of forcing a single tool: registered commands, Bash/direct argv, process sessions, managed jobs, files/Git, browser, applications, resources, and diagnostics may appear together with ambiguity and fallback metadata. This advice never removes a policy-visible tool; direct Bash remains available under shell-capable authority.
61
+ `server/discover` supplies conservative static server guidance, while `session_bootstrap` and `resolve_task_capabilities` explicitly refresh bounded project facts, authority-permitted instructions, skills, explicit/automatic package commands, applications, browser capability, and task-specific execution routes.
62
+ Use the resolver when that refreshed context or route selection is material; straightforward file, Git, and shell work should use the already exposed tools directly rather than paying an extra discovery round trip.
63
+ The resolver scores route bundles instead of forcing a single tool: registered commands, Bash/direct argv, process sessions, managed jobs, files/Git, browser, applications, resources, and diagnostics may appear together with ambiguity and fallback metadata.
64
+ This advice never removes a policy-visible tool; direct Bash remains available under shell-capable authority.
51
65
 
52
- The resolver always rescans task-specific metadata. A client that already holds `refresh.fingerprint` may send it as `known_refresh_fingerprint`; if the static instruction/skill/command identity is unchanged, the response omits that repeated material but still returns fresh skill/command matches, application results, ranked tools, and route advice. Capability results are filtered by effective account authority, so a restricted role does not receive hidden application/browser/shell metadata from a fuller daemon. No instruction file is required for the default layers, and no repository file is written automatically.
66
+ The resolver always rescans task-specific metadata.
67
+ A client that already holds `refresh.fingerprint` may send it as `known_refresh_fingerprint`; if the static instruction/skill/command identity is unchanged, the response omits that repeated material but still returns fresh skill/command matches, application results, ranked tools, and route advice.
68
+ Capability results are filtered by effective account authority, so a restricted role does not receive hidden application/browser/shell metadata from a fuller daemon.
69
+ No instruction file is required for the default layers, and no repository file is written automatically.
53
70
 
54
- The host still owns the agent loop. A hosted client may use the recommendation automatically, ask for confirmation, expose only part of the catalog, or ignore server instructions. No MCP implementation can guarantee automatic invocation from the server side. Machine Bridge models that limitation explicitly instead of treating a recommendation as execution.
71
+ The host still owns the agent loop.
72
+ A hosted client may use the recommendation automatically, ask for confirmation, expose only part of the catalog, or ignore server instructions.
73
+ No MCP implementation can guarantee automatic invocation from the server side.
74
+ Machine Bridge models that limitation explicitly instead of treating a recommendation as execution.
55
75
 
56
- For browser tasks, the remote host reaches the local extension through the Worker and daemon. The extension controls the existing Chromium profile; it is not a separate Playwright profile.
76
+ For browser tasks, the remote host reaches the local extension through the Worker and daemon.
77
+ The extension controls the existing Chromium profile; it is not a separate Playwright profile.
57
78
 
58
79
  ## Generate local configuration
59
80
 
@@ -75,7 +96,9 @@ machine-mcp client-config --client all --workspace /path/to/project --profile re
75
96
 
76
97
  ## Current protocol requirements
77
98
 
78
- Use a client that sends the current protocol version and client capabilities in request metadata on every supported request. The default stdio path and remote HTTP reject `initialize` and missing or unsupported request metadata. A narrow, opt-in stdio `--compat` shim answers `initialize`/`notifications/initialized` for hosts that require the handshake and fills metadata fields only when they are absent. It does not support older protocol versions: explicit retired, future, or malformed metadata is still rejected. The environment variable `MBM_MCP_COMPAT=1` enables the same stdio-only shim unless an explicit CLI value overrides it.
99
+ Use a client that sends the current protocol version and client capabilities in request metadata on every supported request.
100
+ The default stdio path and remote HTTP reject `initialize` and missing or unsupported request metadata.
101
+ Stdio has no legacy handshake or metadata-normalization mode. `--compat` is an unsupported option, and `MBM_MCP_COMPAT` is ignored; requests missing the current version or capability metadata are rejected just as they are over remote HTTP.
79
102
 
80
103
  ## JSON stdio configuration
81
104
 
@@ -111,7 +134,8 @@ command = "/absolute/path/to/node"
111
134
  args = ["/absolute/path/to/machine-mcp.mjs", "stdio", "--workspace", "/path/to/project", "--profile", "full"]
112
135
  ```
113
136
 
114
- Codex CLI, the Codex IDE extension, and supported ChatGPT Desktop Codex hosts can share MCP configuration on the same Codex host. ChatGPT web does not read local Codex configuration files; web use requires a hosted plugin/connector or a reachable remote MCP endpoint.
137
+ Codex CLI, the Codex IDE extension, and supported ChatGPT Desktop Codex hosts can share MCP configuration on the same Codex host.
138
+ ChatGPT web does not read local Codex configuration files; web use requires a hosted plugin/connector or a reachable remote MCP endpoint.
115
139
 
116
140
  ## Remote hosted-client connection
117
141
 
@@ -121,7 +145,9 @@ Run:
121
145
  machine-mcp --workspace /path/to/project
122
146
  ```
123
147
 
124
- Enter the printed `/mcp` URL in the remote MCP connector. During OAuth authorization, verify the displayed client name and redirect URI before entering a Machine Bridge account name and password. The Worker exposes Streamable HTTP plus protected-resource discovery, authorization-server discovery, dynamic client registration, PKCE S256, `offline_access`, and rotating refresh tokens.
148
+ Enter the printed `/mcp` URL in the remote MCP connector.
149
+ During OAuth authorization, verify the displayed client name and redirect URI before entering a Machine Bridge account name and password.
150
+ The Worker exposes Streamable HTTP plus protected-resource discovery, authorization-server discovery, dynamic client registration, PKCE S256, `offline_access`, and rotating refresh tokens.
125
151
 
126
152
  Supported configuration paths are:
127
153
 
@@ -129,9 +155,15 @@ Supported configuration paths are:
129
155
  - **Claude custom connectors:** add the exact `/mcp` URL under Claude's connector settings and leave static OAuth client credentials empty so Claude can use DCR. Hosted Claude surfaces use `https://claude.ai/api/mcp/auth_callback`; the Worker accepts that exact registered redirect and rotates refresh tokens for the public client. See Anthropic's [remote custom connector guide](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp) and [authentication contract](https://claude.com/docs/connectors/building/authentication).
130
156
  - **Microsoft Copilot Studio:** from the agent's **Tools** page, select **Add a tool > New tool > Model Context Protocol**, enter the `/mcp` URL, then select **OAuth 2.0 > Dynamic discovery**. Create the connection and add it to the agent. See Microsoft's [existing MCP server guide](https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-add-existing-server-to-agent).
131
157
 
132
- OAuth navigations and form submissions from opaque or client-specific browser containers are routed normally but receive no cross-origin response-sharing permission unless their exact origin is allowed. The authorization page permits form navigation only to itself and the validated redirect origin. For a validated Microsoft `consent.azure-apim.net` callback, the form policy also permits HTTPS subdomains of that same Microsoft consent domain and the exact Copilot Studio origin because Power Platform redirects its global callback to a regional endpoint and then back to Copilot Studio. Claude remote connectors originate from Anthropic infrastructure, while Copilot Studio connectivity runs through Power Platform connectors, so neither is a reason to broaden the browser CORS allowlist.
158
+ OAuth navigations and form submissions from opaque or client-specific browser containers are routed normally but receive no cross-origin response-sharing permission unless their exact origin is allowed.
159
+ The authorization page permits form navigation only to itself and the validated redirect origin.
160
+ For a validated Microsoft `consent.azure-apim.net` callback, the form policy also permits HTTPS subdomains of that same Microsoft consent domain and the exact Copilot Studio origin because Power Platform redirects its global callback to a regional endpoint and then back to Copilot Studio.
161
+ Claude remote connectors originate from Anthropic infrastructure, while Copilot Studio connectivity runs through Power Platform connectors, so neither is a reason to broaden the browser CORS allowlist.
133
162
 
134
- Several OAuth clients and named accounts can coexist. Accounts have independent passwords, roles, active state, versions, authorization codes, access tokens, refresh tokens, and targeted revocation. Their effective tool sets are intersected with the connected daemon policy. All accounts still share one daemon and OS user, so hard tenant isolation requires separate deployments; see [MULTI_ACCOUNT.md](MULTI_ACCOUNT.md).
163
+ Several OAuth clients and named accounts can coexist.
164
+ Accounts have independent passwords, roles, active state, versions, authorization codes, access tokens, refresh tokens, and targeted revocation.
165
+ Their effective tool sets are intersected with the connected daemon policy.
166
+ All accounts still share one daemon and OS user, so hard tenant isolation requires separate deployments; see [MULTI_ACCOUNT.md](MULTI_ACCOUNT.md).
135
167
 
136
168
  ## Profile guidance
137
169
 
@@ -148,31 +180,100 @@ Before connecting a host, verify the local implementation directly:
148
180
  machine-mcp full-test --workspace /path/to/project
149
181
  ```
150
182
 
151
- A passing result proves that Machine Bridge and the local OS allowed its temporary file/process/shell/key/job probes at that time. It does not prove that a hosted MCP connector will expose every relay-advertised tool, deliver a later request, or that a cloud/remote account will authorize it.
183
+ A passing result proves that Machine Bridge and the local OS allowed its temporary file/process/shell/key/job probes at that time.
184
+ It does not prove that a hosted MCP connector will expose every relay-advertised tool, deliver a later request, or that a cloud/remote account will authorize it.
152
185
 
153
- For SSH automation, prefer `generate_ssh_key_resource` under canonical full, or `machine-mcp resource generate-ssh-key` from the terminal. The private key remains a local resource; private bytes and local paths are omitted by default, while metadata and the bare public fingerprint are returned. Paths require an explicit disclosure option. Installation of the public key into Google OS Login or a remote `authorized_keys` file remains an explicit external action.
186
+ For SSH automation, prefer `generate_ssh_key_resource` under canonical full, or `machine-mcp resource generate-ssh-key` from the terminal.
187
+ The private key remains a local resource; private bytes and local paths are omitted by default, while metadata and the bare public fingerprint are returned.
188
+ Paths require an explicit disclosure option.
189
+ Installation of the public key into Google OS Login or a remote `authorized_keys` file remains an explicit external action.
154
190
 
155
191
  ## Host-side safety rules
156
192
 
157
- The local `full` profile controls Machine Bridge's own tool catalog, path resolver, path display, process environment, and shell availability. For remote transport, the local transaction gate additionally controls when high-impact effects may run. It does not control the MCP host's model policy, approval UI, connector gateway, or platform execution filters. See [LOCAL_AUTHORIZATION.md](LOCAL_AUTHORIZATION.md).
158
-
159
- Host-rendered tool invocation chips, status lines, or labels such as “called tool” are presentation owned by the MCP host, not Machine Bridge log records. Machine Bridge can suppress its own routine per-tool logs outside debug and can reduce unnecessary calls, but it cannot hide or restyle host-owned tool indicators. A host-side UI setting, if one exists, is the only layer that can change that presentation. Prefer fewer, coarser calls and avoid unnecessary capability-resolution calls when direct tools already suffice.
160
-
161
- Hosts may cache MCP discovery metadata, input schemas, conversation/surface routing, and workspace-approved app actions independently of the running server. For routine health checks, call `server_info` with `detail: "summary"`; it keeps the effective policy/count, account role without account ID, daemon readiness/relay state, pending/socket capacity, and foreground/settlement limits while omitting OAuth metadata, exact tool arrays, and full observability. The empty/default call returns the current `full` projection and is the cold path when an exact effective-tool list, account identity, or detailed counters are required. `server_info.tool_delivery` reports the current remote foreground maximum, process one-shot maximum, ordinary daemon-tool ceiling, process blocking-poll wait/cooldown ceilings, and Worker settlement overhead. If an already-open host appears to advertise older/larger values, compare the live `server_info` contract with a harmless invocation-validator/behavior probe and, when the deployment uses a frozen ChatGPT workspace app snapshot, the Workspace **Action control** view after the supported refresh/review path. Product-level remediation is warranted only when the governed Workspace approved snapshot itself remains stale/partial/mixed or separate workspace policy requires review. Opaque host-internal cache inspection is intentionally excluded from release and upgrade verification. Product-control-plane actions follow the repository's [authorization contract](https://github.com/YuLeiFuYun/machine-bridge-mcp/blob/main/AGENTS.md#sole-explicit-user-authorization-boundary). The Worker handles known maximum-only version skew as a structured no-side-effect tool error.
162
-
163
- For routine workspace inventory, prefer `project_overview` with `detail: "summary"`. It keeps workspace/Git identity, effective and daemon policy/tool counts, compact capability-routing status, and up to 40 top-level names/types, while omitting account ID, exact tool arrays, routing fingerprints, and repeated entry paths/sizes. Request full detail only when those exact diagnostic fields are needed. As with `server_info`, summary is a presentation projection after authorization, not a lower-authority mode. `server_info(detail="summary")` likewise keeps the established hot-path delivery/readiness fields but does not grow with every new exact timing diagnostic; the exact hosted nonterminal progress-coalescing interval is available in full detail while the tool contract and documentation carry the behavioral guarantee.
164
-
165
-
166
- Machine Bridge itself does not block files because their names look sensitive. In remote mode, use the compact projection to inspect `server_info.authorization.effective_policy`; request full detail when exact `effective_tools` membership is required. `daemon.policy` is only the local ceiling. If the effective profile is `full` and the effective tool is present but a direct call is rejected before a structured result, Machine Bridge has no observation of that rejected request and cannot identify the cause from server-side evidence alone; conversation/surface app-routing state, a stale host action/tool snapshot, host tool filtering, connector-gateway policy, client routing, and platform policy are possibilities, not a diagnosis. Conversely, a successful `diagnose_runtime` response proves that request reached the local daemon through the currently used connector path and therefore does not support a blanket claim that Machine Bridge is currently disabled by the platform. A successful same-tool invocation in a fresh supported conversation is additional host-side evidence against a blanket outage when an older conversation still fails before dispatch; treat the difference as a host conversation/surface/snapshot issue until stronger evidence identifies the exact layer. If `diagnose_runtime` arrives but its fixed process or shell probe fails, the likely source moves downstream to local OS policy, endpoint-security software, permissions, shell configuration, or Machine Bridge policy. If an execution tool instead returns a child exit code plus bounded stdout/stderr, the child did start; for nested commands such as `ssh`, a remote forced-command usage screen or allowlist refusal in that output is target-side authorization evidence, not a local spawn or Machine Bridge policy denial. Changing `--profile`, `--unrestricted-paths`, or `--absolute-paths` cannot override host-side, operating-system, or remote-target enforcement.
167
-
168
- Expected file-operation failures arrive as ordinary MCP tool-error results, not JSON-RPC transport failures. Clients should branch first on `structuredContent.error.code`, then optionally on the bounded `details.reason`. For example, `conflict/already_exists`, `conflict/hash_mismatch`, `conflict/text_ambiguous`, and `conflict/context_not_found` require a fresh read and reconciliation; `not_found/text_not_found` means the requested edit fragment is absent; `invalid_request` means the request or patch syntax must change. Do not log or display tool arguments to reconstruct diagnostics: public error details intentionally omit paths, file content, edit fragments, and compared hashes.
169
-
170
- Remote configurable browser/application foreground tools default to 20 seconds, compound `computer_observe`/`computer_act` default to 30 seconds, and all configurable foreground tools advertise a 45-second maximum. Hosted browser content/action calls require an explicit `tab_id` obtained from `browser_list_tabs`, and hosted `computer_observe(surface="browser")` requires the same explicit target before it issues a snapshot; they do not silently retarget to whichever shared Chromium tab happens to be active. Those values bound daemon execution; the Worker records its settlement deadline five seconds later. Remote `exec_command`, `run_process`, and `run_local_command` use a separate durable 10-second acceptance contract with independently bounded detached execution. Hosted `read_process` supports paced same-response follow-up: the actual output/exit blocking wait is at most one second, while a repeated would-block request inside the fifteen-second cooldown remains inside that same MCP call until output/exit or the cooldown boundary instead of returning a rapid running checkpoint. A live result reports `status_polling_mode=paced_followup` plus `next_blocking_poll_after_ms`; callers may continue reading when the current task needs output or terminal state, but must not busy-loop. Admission and transport latency may consume part of an individual request interval, and none of these values guarantees host receipt. They are not evidence for a guessed whole-assistant-turn deadline: clients must not stop merely because some number of wall-clock minutes has elapsed. Missing or role-hidden tools, non-object arguments, and requests above current limits fail at the shared Worker schema boundary before daemon dispatch; schema failures include `side_effects_started=false`. SSE-capable current requests receive the same pre-dispatch validation as JSON responses and never allocate a recovery stream. Do not treat this as a retry invitation for the same oversized mutation, and do not attempt to evade a host refusal by renaming, encoding, or switching to another arbitrary execution tool. Durable acceptance does not force a hosted-turn handoff. When the current task needs terminal state, a known active job may be followed through bounded same-response `read_job` calls while calls continue to be accepted; relay reads report `status_polling_mode=bounded_followup` and `host_turn_handoff_recommended=false`. Hosted active `read_job` defaults to a 40-second server-side long-poll. Terminal settlement returns on the next bounded five-second internal poll; nonterminal status/phase/dependency progress is coalesced for at least 30 seconds by default, and `current_step`-only churn does not wake the hosted call. `wait_ms=0` requests an immediate checkpoint, while public hosted `wait_ms` is capped at 60 seconds. The default is deliberately 40 seconds rather than equal to that maximum: live acceptance must prove that the target host carries the omitted-parameter default without terminating the tool call, and longer jobs continue through another paced read of the same `job_id` rather than a longer single HTTP request. Per-call survival does not establish aggregate assistant-response lifetime; a host may still impose a real boundary after many individually successful reads. Do not replace server-side pacing with a rapid host-side checkpoint loop. Handoff is justified only after an actual host/tool boundary is observed, external input or authorization is required, or the user explicitly requested a checkpoint. After a real host boundary, resume the same durable `job_id` rather than resubmitting the operation. For a coherent non-interactive workflow with several local commands, prefer a repository umbrella command or one multi-step `start_job` rather than a chain of one-step process carriers; this is a host-event-density control, not a task-duration limit. A valid job ID that is no longer retained returns typed `not_found`; this is missing recovery evidence, not proof that its side effect never executed. Completed one-step process carriers use lower-priority terminal retention than explicit managed jobs, so removable helper history is reclaimed first within the shared 512-state durable store. Hosted `list_jobs` is an aggregate-only inventory surface: the Worker removes job IDs, names, and `recent_process_recovery` handles, while local CLI/stdio retains the detailed bounded inventory for administration. The same pacing principle applies to read-only status/diagnostic surfaces such as `server_info` and `diagnose_runtime`: use them to capture relevant evidence rather than switching surfaces merely to wait on the same background state. `server/discover` and `tools/list` both advertise `ttlMs=0`; discovery instructions therefore refresh alongside the tool contract, every host-visible tool description carries `Tool schema generation N`, and `server_info.tool_delivery` exposes the current generation/version plus `discovery_ttl_ms=0` and `tool_list_ttl_ms=0` while reporting that the server cannot know which generation an external host has cached. `host_turn_deadline_observable=false` means Machine Bridge also cannot predict when the external host will terminate an assistant turn; `managed_jobs_detached_from_mcp_response=true` means that boundary does not itself cancel an already accepted durable job. A release that changes tool semantics therefore verifies the live Machine Bridge runtime/discovery contract and harmless changed-generation invocation behavior after activation. When ChatGPT workspace governance freezes approved actions, use the Workspace Action control snapshot after automation performs the supported refresh/review path as the product-level publication evidence. Opaque host-internal cache inspection is intentionally excluded from release acceptance and must not trigger reconnect, refresh, recreation, or republication. For durable workflows that must survive a later host boundary:
193
+ The local `full` profile controls Machine Bridge's own tool catalog, path resolver, path display, process environment, and shell availability.
194
+ For remote transport, the local transaction gate additionally controls when high-impact effects may run.
195
+ It does not control the MCP host's model policy, approval UI, connector gateway, or platform execution filters.
196
+ See [LOCAL_AUTHORIZATION.md](LOCAL_AUTHORIZATION.md).
197
+
198
+ Host-rendered tool invocation chips, status lines, or labels such as “called tool” are presentation owned by the MCP host, not Machine Bridge log records.
199
+ Machine Bridge can suppress its own routine per-tool logs outside debug and can reduce unnecessary calls, but it cannot hide or restyle host-owned tool indicators.
200
+ A host-side UI setting, if one exists, is the only layer that can change that presentation.
201
+ Prefer fewer, coarser calls and avoid unnecessary capability-resolution calls when direct tools already suffice.
202
+
203
+ Hosts may cache MCP discovery metadata, input schemas, conversation/surface routing, and workspace-approved app actions independently of the running server.
204
+ For routine health checks, call `server_info` with `detail: "summary"`; it keeps the effective policy/count, account role without account ID, daemon readiness/relay state, pending/socket capacity, and foreground/settlement limits while omitting OAuth metadata, exact tool arrays, and full observability.
205
+ The empty/default call returns the current `full` projection and is the cold path when an exact effective-tool list, account identity, or detailed counters are required.
206
+ `server_info.tool_delivery` reports the current remote foreground maximum, process one-shot maximum, ordinary daemon-tool ceiling, process blocking-poll wait/cooldown ceilings, and Worker settlement overhead.
207
+ If an already-open host appears to advertise older/larger values, compare the live `server_info` contract with a harmless invocation-validator/behavior probe and, when the deployment uses a frozen ChatGPT workspace app snapshot, the Workspace **Action control** view after the supported refresh/review path.
208
+ Product-level remediation is warranted only when the governed Workspace approved snapshot itself remains stale/partial/mixed or separate workspace policy requires review.
209
+ Opaque host-internal cache inspection is intentionally excluded from release and upgrade verification.
210
+ Product-control-plane actions follow the repository's [authorization contract](https://github.com/YuLeiFuYun/machine-bridge-mcp/blob/main/AGENTS.md#sole-explicit-user-authorization-boundary).
211
+ The Worker handles known maximum-only version skew as a structured no-side-effect tool error.
212
+
213
+ For routine workspace inventory, prefer `project_overview` with `detail: "summary"`.
214
+ It keeps workspace/Git identity, effective and daemon policy/tool counts, compact capability-routing status, and up to 40 top-level names/types, while omitting account ID, exact tool arrays, routing fingerprints, and repeated entry paths/sizes.
215
+ Request full detail only when those exact diagnostic fields are needed.
216
+ As with `server_info`, summary is a presentation projection after authorization, not a lower-authority mode.
217
+ `server_info(detail="summary")` likewise keeps the established hot-path delivery/readiness fields but does not grow with every new exact timing diagnostic; the exact hosted nonterminal progress-coalescing interval is available in full detail while the tool contract and documentation carry the behavioral guarantee.
218
+
219
+
220
+ Machine Bridge itself does not block files because their names look sensitive.
221
+ In remote mode, use the compact projection to inspect `server_info.authorization.effective_policy`; request full detail when exact `effective_tools` membership is required.
222
+ `daemon.policy` is only the local ceiling.
223
+ If the effective profile is `full` and the effective tool is present but a direct call is rejected before a structured result, Machine Bridge has no observation of that rejected request and cannot identify the cause from server-side evidence alone; conversation/surface app-routing state, a stale host action/tool snapshot, host tool filtering, connector-gateway policy, client routing, and platform policy are possibilities, not a diagnosis.
224
+ Conversely, a successful `diagnose_runtime` response proves that request reached the local daemon through the currently used connector path and therefore does not support a blanket claim that Machine Bridge is currently disabled by the platform.
225
+ A successful same-tool invocation in a fresh supported conversation is additional host-side evidence against a blanket outage when an older conversation still fails before dispatch; treat the difference as a host conversation/surface/snapshot issue until stronger evidence identifies the exact layer.
226
+ If `diagnose_runtime` arrives but its fixed process or shell probe fails, the likely source moves downstream to local OS policy, endpoint-security software, permissions, shell configuration, or Machine Bridge policy.
227
+ If an execution tool instead returns a child exit code plus bounded stdout/stderr, the child did start; for nested commands such as `ssh`, a remote forced-command usage screen or allowlist refusal in that output is target-side authorization evidence, not a local spawn or Machine Bridge policy denial.
228
+ Changing `--profile`, `--unrestricted-paths`, or `--absolute-paths` cannot override host-side, operating-system, or remote-target enforcement.
229
+
230
+ Expected file-operation failures arrive as ordinary MCP tool-error results, not JSON-RPC transport failures.
231
+ Clients should branch first on `structuredContent.error.code`, then optionally on the bounded `details.reason`.
232
+ For example, `conflict/already_exists`, `conflict/hash_mismatch`, `conflict/text_ambiguous`, and `conflict/context_not_found` require a fresh read and reconciliation; `not_found/text_not_found` means the requested edit fragment is absent; `invalid_request` means the request or patch syntax must change.
233
+ Do not log or display tool arguments to reconstruct diagnostics: public error details intentionally omit paths, file content, edit fragments, and compared hashes.
234
+
235
+ Remote configurable browser/application foreground tools default to 20 seconds, compound `computer_observe`/`computer_act` default to 30 seconds, and all configurable foreground tools advertise a 45-second maximum.
236
+ Hosted browser content/action calls require an explicit `tab_id` obtained from `browser_list_tabs`, and hosted `computer_observe(surface="browser")` requires the same explicit target before it issues a snapshot; they do not silently retarget to whichever shared Chromium tab happens to be active.
237
+ Those values bound daemon execution; the Worker records its settlement deadline five seconds later.
238
+ Remote `exec_command`, `run_process`, and `run_local_command` use a separate durable 10-second acceptance contract with independently bounded detached execution.
239
+ Hosted `read_process` supports paced same-response follow-up: the actual output/exit blocking wait is at most one second, while a repeated would-block request inside the fifteen-second cooldown remains inside that same MCP call until output/exit or the cooldown boundary instead of returning a rapid running checkpoint.
240
+ A live result reports `status_polling_mode=paced_followup` plus `next_blocking_poll_after_ms`; callers may continue reading when the current task needs output or terminal state, but must not busy-loop.
241
+ Admission and transport latency may consume part of an individual request interval, and none of these values guarantees host receipt.
242
+ They are not evidence for a guessed whole-assistant-turn deadline: clients must not stop merely because some number of wall-clock minutes has elapsed.
243
+ Missing or role-hidden tools, non-object arguments, and requests above current limits fail at the shared Worker schema boundary before daemon dispatch; schema failures include `side_effects_started=false`.
244
+ SSE-capable current requests receive the same pre-dispatch validation as JSON responses and never allocate a recovery stream.
245
+ Do not treat this as a retry invitation for the same oversized mutation, and do not attempt to evade a host refusal by renaming, encoding, or switching to another arbitrary execution tool.
246
+ Durable acceptance does not force a hosted-turn handoff.
247
+ When the current task needs terminal state, a known active job may be followed through bounded same-response `read_job` calls while calls continue to be accepted; relay reads report `status_polling_mode=bounded_followup` and `host_turn_handoff_recommended=false`.
248
+ Hosted active `read_job` defaults to a 40-second server-side long-poll.
249
+ Terminal settlement returns on the next bounded five-second internal poll; nonterminal status/phase/dependency progress is coalesced for at least 30 seconds by default, and `current_step`-only churn does not wake the hosted call.
250
+ `wait_ms=0` requests an immediate checkpoint, while public hosted `wait_ms` is capped at 60 seconds.
251
+ The default is deliberately 40 seconds rather than equal to that maximum: live acceptance must prove that the target host carries the omitted-parameter default without terminating the tool call, and longer jobs continue through another paced read of the same `job_id` rather than a longer single HTTP request.
252
+ Per-call survival does not establish aggregate assistant-response lifetime; a host may still impose a real boundary after many individually successful reads.
253
+ Do not replace server-side pacing with a rapid host-side checkpoint loop.
254
+ Handoff is justified only after an actual host/tool boundary is observed, external input or authorization is required, or the user explicitly requested a checkpoint.
255
+ After a real host boundary, resume the same durable `job_id` rather than resubmitting the operation.
256
+ For a coherent non-interactive workflow with several local commands, prefer a repository umbrella command or one multi-step `start_job` rather than a chain of one-step process carriers; this is a host-event-density control, not a task-duration limit.
257
+ A valid job ID that is no longer retained returns typed `not_found`; this is missing recovery evidence, not proof that its side effect never executed.
258
+ Completed one-step process carriers use lower-priority terminal retention than explicit managed jobs, so removable helper history is reclaimed first within the shared 512-state durable store.
259
+ Hosted `list_jobs` is an aggregate-only inventory surface: the Worker removes job IDs, names, and `recent_process_recovery` handles, while local CLI/stdio retains the detailed bounded inventory for administration.
260
+ The same pacing principle applies to read-only status/diagnostic surfaces such as `server_info` and `diagnose_runtime`: use them to capture relevant evidence rather than switching surfaces merely to wait on the same background state.
261
+ `server/discover` and `tools/list` both advertise `ttlMs=0`; discovery instructions therefore refresh alongside the tool contract, every host-visible tool description carries `Tool schema generation N`, and `server_info.tool_delivery` exposes the current generation/version plus `discovery_ttl_ms=0` and `tool_list_ttl_ms=0` while reporting that the server cannot know which generation an external host has cached.
262
+ `host_turn_deadline_observable=false` means Machine Bridge also cannot predict when the external host will terminate an assistant turn; `managed_jobs_detached_from_mcp_response=true` means that boundary does not itself cancel an already accepted durable job.
263
+ A release that changes tool semantics therefore verifies the live Machine Bridge runtime/discovery contract and harmless changed-generation invocation behavior after activation.
264
+ When ChatGPT workspace governance freezes approved actions, use the Workspace Action control snapshot after automation performs the supported refresh/review path as the product-level publication evidence.
265
+ Opaque host-internal cache inspection is intentionally excluded from release acceptance and must not trigger reconnect, refresh, recreation, or republication.
266
+ For durable workflows that must survive a later host boundary:
171
267
 
172
268
  1. register credentials locally as resource aliases so their values never enter MCP arguments;
173
- 2. choose a fresh `idempotency_key` and submit a complete policy-authorized `start_job` plan before the workflow depends on later cleanup calls; hosted `start_job` requires that key before dispatch so an ambiguous acceptance response can be retried with the same logical arguments instead of creating a second job. Preserve the returned `job_id`, `recovery_key`, and `control_key` together: hosted `read_job` requires `recovery_key`, `cancel_job` requires `control_key`, and `depends_on` requires an exact `dependency_recovery` mapping. These capabilities are purpose/principal bound and are not discoverable through hosted `list_jobs`; batch coherent non-interactive local commands into that managed plan (or a repository umbrella command) instead of creating a one-step tool event for every small probe; `stage_job` is only a non-running draft, while an explicit local operator may use `machine-mcp job submit PLAN.json`;
269
+ 2. choose a fresh `idempotency_key` and submit a complete policy-authorized `start_job` plan before the workflow depends on later cleanup calls; hosted `start_job` requires that key before dispatch so an ambiguous acceptance response can be retried with the same logical arguments instead of creating a second job.
270
+ Preserve the returned `job_id`, `recovery_key`, and `control_key` together: hosted `read_job` requires `recovery_key`, `cancel_job` requires `control_key`, and `depends_on` requires an exact `dependency_recovery` mapping.
271
+ These capabilities are purpose/principal bound and are not discoverable through hosted `list_jobs`; batch coherent non-interactive local commands into that managed plan (or a repository umbrella command) instead of creating a one-step tool event for every small probe; `stage_job` is only a non-running draft, while an explicit local operator may use `machine-mcp job submit PLAN.json`;
174
272
  3. use job-scoped temporary files or remote stdin scripts;
175
273
  4. put idempotent cleanup in `finally_steps`;
176
274
  5. inspect/cancel through `machine-mcp job ...` if the host later denies tools.
177
275
 
178
- The initial `start_job` request is still subject to host approval. If it is blocked before dispatch, the operator can review and submit the same JSON plan locally with `machine-mcp job submit plan.json`. If the hosted acceptance outcome is **unknown** rather than definitely blocked, do not switch to a second submission path: retry the same hosted arguments with the same `idempotency_key` while the retained recovery window is still valid. See [MANAGED_JOBS.md](MANAGED_JOBS.md).
276
+ The initial `start_job` request is still subject to host approval.
277
+ If it is blocked before dispatch, the operator can review and submit the same JSON plan locally with `machine-mcp job submit plan.json`.
278
+ If the hosted acceptance outcome is **unknown** rather than definitely blocked, do not switch to a second submission path: retry the same hosted arguments with the same `idempotency_key` while the retained recovery window is still valid.
279
+ See [MANAGED_JOBS.md](MANAGED_JOBS.md).