Use Context Isolation
Use this skill when an application runs concurrent requests, worker pools, async
tasks, goroutines, or multiple agents in the same process.
Treat scope-stack ownership as part of the request boundary.
Core Rule
Each independent request, agent, or workflow needs its own scope stack. Do not
share one mutable stack across unrelated concurrent work unless you want shared
ancestry and shared scope-local middleware.
Embedded Scope Model
- A root scope is always present, and pushed scopes form a parent-child tree
beneath it.
- Scope hierarchy determines event parentage, lifetime boundaries, and
visibility for scope-local middleware and subscribers.
- Standard scope types include
Agent, Function, Tool, Llm,
Retriever, Embedder, Reranker, Guardrail, Evaluator, Custom, and
Unknown.
- Scope start and end events can carry semantic
input and output payloads
when the scope represents a request, task, or meaningful result boundary.
- Scope-local registrations disappear when the owning scope closes; use them
for behavior that should not outlive a request or agent run.
- Mark events are useful for retries, checkpoints, interrupts, and important
state transitions that are not full spans.
Per-Language Defaults
- Python: rely on task-local behavior via
get_scope_stack() and
contextvars, or explicitly propagate when work leaves the current execution
context
- Rust core: use runtime helpers such as
create_scope_stack(),
current_scope_stack(), and set_thread_scope_stack(...) when an integration
needs explicit stack ownership
- Go: use
NewScopeStack() and ScopeStack.Run(...) for goroutine-safe
usage
- Node.js: create and set a scope stack explicitly for the current execution
path with
createScopeStack() and setThreadScopeStack(...)
Common Failures
- Events from different requests appear under one root UUID
- Scope-local middleware leaks across requests
- Worker-thread work runs without the expected active scope
- Integrations activate NeMo Relay without an explicitly initialized stack
- Relying on a thread-local stack after crossing async tasks, goroutines, or JS
worker boundaries
Related Skills
nemo-relay-instrument-calls
nemo-relay-plugin-observability
nemo-relay-debug-runtime-integration
1---2name: nemo-relay-instrument-context-isolation3description: Use this skill when concurrent requests, async tasks, threads, workers, goroutines, or agents need independent NeMo Relay scope stacks and correct ancestry propagation.4license: Apache-2.05---67# Use Context Isolation89Use this skill when an application runs concurrent requests, worker pools, async10tasks, goroutines, or multiple agents in the same process.11Treat scope-stack ownership as part of the request boundary.1213## Core Rule1415Each independent request, agent, or workflow needs its own scope stack. Do not16share one mutable stack across unrelated concurrent work unless you want shared17ancestry and shared scope-local middleware.1819## Embedded Scope Model2021- A root scope is always present, and pushed scopes form a parent-child tree22 beneath it.23- Scope hierarchy determines event parentage, lifetime boundaries, and24 visibility for scope-local middleware and subscribers.25- Standard scope types include `Agent`, `Function`, `Tool`, `Llm`,26 `Retriever`, `Embedder`, `Reranker`, `Guardrail`, `Evaluator`, `Custom`, and27 `Unknown`.28- Scope start and end events can carry semantic `input` and `output` payloads29 when the scope represents a request, task, or meaningful result boundary.30- Scope-local registrations disappear when the owning scope closes; use them31 for behavior that should not outlive a request or agent run.32- Mark events are useful for retries, checkpoints, interrupts, and important33 state transitions that are not full spans.3435## Per-Language Defaults3637- **Python**: rely on task-local behavior via `get_scope_stack()` and38 `contextvars`, or explicitly propagate when work leaves the current execution39 context40- **Rust core**: use runtime helpers such as `create_scope_stack()`,41 `current_scope_stack()`, and `set_thread_scope_stack(...)` when an integration42 needs explicit stack ownership43- **Go**: use `NewScopeStack()` and `ScopeStack.Run(...)` for goroutine-safe44 usage45- **Node.js**: create and set a scope stack explicitly for the current execution46 path with `createScopeStack()` and `setThreadScopeStack(...)`4748## Common Failures4950- Events from different requests appear under one root UUID51- Scope-local middleware leaks across requests52- Worker-thread work runs without the expected active scope53- Integrations activate NeMo Relay without an explicitly initialized stack54- Relying on a thread-local stack after crossing async tasks, goroutines, or JS55 worker boundaries5657## Related Skills5859- `nemo-relay-instrument-calls`60- `nemo-relay-plugin-observability`61- `nemo-relay-debug-runtime-integration`