Parent context
User outcome
Maintainers can determine whether several supported terminal MCP clients on one
Mac overload the shared OmniFocus Bridge path, rather than assuming that a
per-process admission lane also coordinates separate FocusRelay processes.
Validation impact
performance — this adds developer-only measurement coverage and sanitized
evidence. It does not change production admission, IPC, queries, mutations, or
the supported client surface.
User-facing acceptance journey
- A maintainer installs the current Bridge plug-in and restarts OmniFocus once.
- The maintainer runs the exact release FocusRelay binary with one, two, and
four independent stdio server processes.
- Every process completes MCP initialization, then all processes issue one
synchronized read or mutation preview against the same ready OmniFocus
session.
- The harness reports only aggregate success, error, timeout, pickup-state,
process-exit, and latency evidence.
- The result either closes the cross-process concern with evidence or provides
a reproduction for a separate transport-reliability product issue.
Current evidence and uncertainty
Bounded implementation
Extend the developer-only focusrelay-dev bridge-burst command with an explicit
--server-count option:
- accepted values:
1, 2, or 4;
- default:
1, preserving the existing single-process behavior and artifacts;
- when greater than one, launch that many copies of the selected
--server-path, initialize every copy, then issue exactly one synchronized
scenario request per process;
- support the existing
task-counts and completion-preview scenarios;
completion-preview remains preview-only and requires
--fixture-task-id;
- correlate responses within each process and terminate every child on success,
failure, cancellation, or timeout;
- do not add an automatic retry or hide a failed/stranded child by replacing it.
Record serverCount in the sanitized summary along with aggregate:
- success, MCP tool error, protocol error, process exit, and timeout counts;
- p50, p95, maximum request latency, and whole-wave elapsed time;
- Bridge pickup-state classifications when FocusRelay already exposes them;
- exact server binary hash, production fingerprint, scenario, profile, and
response deadline.
Do not persist raw MCP arguments or responses, OmniFocus IDs, names, notes,
paths, or process command lines.
Deterministic tests
Use Swift Testing and injected fake subprocess/transports to cover:
- one, two, and four server startup and initialize-before-call ordering;
- synchronized one-request-per-process dispatch;
- response IDs correlated independently when different processes reuse the same
JSON-RPC request ID;
- one child error, timeout, or early exit does not strand the others;
- cancellation and every failure path terminate all owned children;
serverCount and aggregate classifications appear in the artifact;
- the default single-process output remains backward compatible;
- no raw response, fixture ID, private path, or process command leaks into
output or artifacts.
Live diagnostic
- Install the Bridge only with
./scripts/install-plugin.sh.
- Fully restart OmniFocus once at the beginning of the session.
- Run health and semantic gates against that same ready session.
- Build one release binary and run
canary for both scenarios with
--server-count 1, 2, and 4.
- Keep artifacts under
.build/benchmarks and publish only sanitized
aggregates.
Decision rule:
- If all runs remain correct with no errors/timeouts/stranded dispatch and no
material user-relevant tail regression, close this issue without production
architecture work.
- If a repeatable reliability or latency failure appears only as process count
increases, file a separate transport-reliability issue for the smallest
proven fix. Do not select a daemon, broker, lock, or retry policy in this
diagnostic issue.
Acceptance criteria
Non-goals
- Cross-process admission or locking
- A daemon, LaunchAgent, Unix socket, or alternate MCP transport
- Desktop-host/TCC enablement
- Query optimization, cache sharing, mutation changes, or automatic retries
- Running release or stress profiles for an unproven diagnostic question
Parent context
six may queue, and excess or expired work receives a structured retryable
error.
launches one stdio server process.
User outcome
Maintainers can determine whether several supported terminal MCP clients on one
Mac overload the shared OmniFocus Bridge path, rather than assuming that a
per-process admission lane also coordinates separate FocusRelay processes.
Validation impact
performance— this adds developer-only measurement coverage and sanitizedevidence. It does not change production admission, IPC, queries, mutations, or
the supported client surface.
User-facing acceptance journey
four independent stdio server processes.
synchronized read or mutation preview against the same ready OmniFocus
session.
process-exit, and latency evidence.
a reproduction for a separate
transport-reliabilityproduct issue.Current evidence and uncertainty
BridgeRuntime.sharedis shared only by service instances in one executableprocess. Its one-running/six-queued policy therefore multiplies when several
MCP clients each launch
focusrelay serve.bridge-burstharness launches one server process and cannotmeasure that multiplication.
trigger carries the request ID directly. OmniFocus may naturally serialize
URL actions, but FocusRelay has no checked-in cross-process evidence proving
reliability or latency under that load.
contention in a different architecture. PR Kaizen: speed up validation and release flow #96 solved it with a shared Unix
socket daemon. That is a useful hypothesis, not evidence that FocusRelay's
plug-in URL path has the same failure.
Bounded implementation
Extend the developer-only
focusrelay-dev bridge-burstcommand with an explicit--server-countoption:1,2, or4;1, preserving the existing single-process behavior and artifacts;--server-path, initialize every copy, then issue exactly one synchronizedscenario request per process;
task-countsandcompletion-previewscenarios;completion-previewremains preview-only and requires--fixture-task-id;failure, cancellation, or timeout;
Record
serverCountin the sanitized summary along with aggregate:response deadline.
Do not persist raw MCP arguments or responses, OmniFocus IDs, names, notes,
paths, or process command lines.
Deterministic tests
Use Swift Testing and injected fake subprocess/transports to cover:
JSON-RPC request ID;
serverCountand aggregate classifications appear in the artifact;output or artifacts.
Live diagnostic
./scripts/install-plugin.sh.canaryfor both scenarios with--server-count 1,2, and4..build/benchmarksand publish only sanitizedaggregates.
Decision rule:
material user-relevant tail regression, close this issue without production
architecture work.
increases, file a separate
transport-reliabilityissue for the smallestproven fix. Do not select a daemon, broker, lock, or retry policy in this
diagnostic issue.
Acceptance criteria
bridge-burst --server-count 1|2|4exercises independent real stdio serverprocesses with one synchronized request per process.
writes.
binary and installed Bridge.
and separately scoped product issue.
Non-goals