Use this skill when concurrent requests, async tasks, threads, workers, goroutines, or agents need independent NeMo Relay scope stacks and correct ancestry propagation.
Use the nemo-relay-instrument-context-isolation skill to review the concurrent request handler I provide. Check whether independent requests own separate scope stacks and whether ancestry propagates correctly across async or worker boundaries. Identify the highest-priority issue and recommend a small correction using the documented defaults for this language, without editing files.
Required inputs
The application language.
The request-handler code and relevant async-task or worker-boundary code that uses NeMo Relay.
Previously published starter task based on a pinned source version; check the source and required inputs before running. Task evidence ↗
SKILL.md
name: nemo-relay-instrument-context-isolationdescription: Use this skill when concurrent requests, async tasks, threads, workers, goroutines, or agents need independent NeMo Relay scope stacks and correct ancestry propagation.license: Apache-2.0metadata: author: NVIDIA Corporation and Affiliates
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