You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Add an opt-in Kubernetes session runtime in which each Discord or Slack thread gets its own isolated worker Pod. The core requirement is that the ACP/CLI process for one thread cannot enumerate, read, write, or delete another thread's local worktree or other session-owned mutable state, even if it knows that state's path.
The desired operator experience is configuration-first. An operator should be able to select a Kubernetes session runtime, or a named cluster-owned runtime profile, without writing a custom dispatcher. The exact configuration schema is open for discussion; the important contract is one logical OAB session to at most one active worker Pod.
This boundary applies to execution and mutable session state. It still permits administrator-managed read-only inputs, including centrally managed skills, and explicitly configured shared services or caches.
Requirement boundary
This RFC concerns OS/runtime-enforced filesystem isolation between ACP/CLI execution sessions, not ingress-level isolation of Discord or Slack events. OAB may receive a bot mention, inspect it, and route it by thread. Preventing the raw event from entering the OAB event-handling process is out of scope.
When thread A maps to session A and thread B maps to session B, session A's ACP/CLI process must be unable to enumerate, read, write, or delete session B's local checkout or worktree, uncommitted files, mutable Git metadata, HOME, credentials, ACP/CLI state, scratch space, mutable caches, or other session-owned mutable state. The same requirement applies in reverse, even if either session knows the other session's absolute paths.
This boundary must exist before the first prompt reaches ACP/CLI and must be enforced by the OS/runtime. Branch naming, Git worktree conventions, skills, prompt instructions, or admission filtering inside OAB are not substitutes for the boundary.
"Branch isolation" in this RFC means isolation of each session's local checkout or worktree, uncommitted changes, and mutable Git state. It does not require hiding committed history or remote branches that the session's repository credentials are already authorized to fetch. Administrator-managed skills and other common inputs may remain shared when exposed read-only.
Current problem and required boundary
The target topology below is illustrative. The broker and controller may be separate or combined; the required property is the OS/runtime-enforced absence of a path between session-private writable states.
CURRENT (insufficient): logical sessions share one filesystem boundary
Discord thread A Discord thread B
| |
v v
+--------------------------------------------------------------------+
| One long-lived OAB Pod |
| Shared mount namespace, writable HOME, repository/PVC and Git data |
| |
| +------------------------+ +------------------------+ |
| | ACP/CLI session A | | ACP/CLI session B | |
| | worktree / branch A | | worktree / branch B | |
| +------------------------+ +------------------------+ |
| |
| Same mount namespace; no per-session filesystem access boundary. |
| A can enumerate/read/write/delete B's state, and vice versa. |
+--------------------------------------------------------------------+
REQUIRED: the runtime boundary exists before ACP/CLI receives prompt 1
Discord / Slack event
|
v
+--------------------------------------------------------------------+
| OAB event handling / session routing |
| - receives events and maps thread ID -> logical OAB session |
| - establishes the runtime boundary before ACP/CLI starts |
+-------------------------------+------------------------------------+
|
+-------------+-------------+
| |
thread A -> session A thread B -> session B
| |
v v
+--------------------------+ +--------------------------+
| Worker Pod A | | Worker Pod B |
| ACP/CLI session A | | ACP/CLI session B |
| private writable state: | | private writable state: |
| - checkout/worktree A | | - checkout/worktree B |
| - HOME/Git/ACP state A | | - HOME/Git/ACP state B |
| OS/runtime-isolated FS | | OS/runtime-isolated FS |
+--------------------------+ +--------------------------+
^ ^
| read-only / authorized |
+-------------+-------------+
|
+-------------------------------------+
| Allowed shared platform resources |
| - skills/policies: read-only |
| - services/caches: controlled API |
| and namespaced where mutable |
+-------------------------------------+
--X--> means denied by the OS/runtime, not discouraged by a prompt:
Worker A --X--> Worker B's private writable state
Worker B --X--> Worker A's private writable state
Shared resources must never reveal or mutate another session's private
writable state.
The RFC was initially shared in #general based on earlier project guidance, then reposted in #contributing after reviewing the current contribution-discussion convention. Any decisions or scope changes from the canonical discussion will be summarized in this issue so GitHub remains the source of truth.
Organizational use case
A large group in my organization is replacing the foundational agent-execution infrastructure of an internal system inspired by Stripe's Minions. We are evaluating OAB as the chat-facing broker while preserving the existing operational boundary: one isolated, disposable runtime per work session.
This is not a request to copy Stripe's implementation. It explains why separate ACP processes, branches, or working directories inside one shared Pod are not a sufficient boundary for this migration.
Why worktrees alone are insufficient
Each Git-backed session should receive a Pod-local writable checkout or worktree and its own working branch. This is a required layer of repository isolation, but it cannot by itself provide the requested runtime boundary in current OAB. For a first message, the dispatcher creates or obtains the session before forwarding the prompt; unless the user selects an existing workspace with a [[ws:...]] directive, SessionPool starts and initializes the ACP child in the agent-wide working directory and calls session/new (pool.rs). A branch/worktree skill runs only after that process has started and after the first prompt reaches the agent, so even perfect compliance cannot retroactively isolate startup.
Git documents linked worktrees as sharing everything except certain per-worktree files such as HEAD and index; common refs, repository configuration, objects, and $GIT_COMMON_DIR remain shared. A worktree therefore provides workflow separation, not an access-control boundary.
There is therefore a pre-worktree window in which a session can load steering or configuration from a shared checkout and writable HOME. Even after separate worktrees are created, processes in the same Pod can still observe or alter shared PVC contents, Git common metadata, filesystem-backed credentials, CLI configuration, hooks, plugins, and caches. They also remain inside the same resource and network boundary. This does not mean that every broker environment variable is inherited: OAB uses env_clear() and restores only baseline plus configured or selected inherited variables. The required boundary must be enforced by the runtime before the ACP process is created and before it begins handling the first human message; it cannot depend on an agent following a skill or instruction.
Isolation and intentional sharing model
The worker Pod is the per-thread execution and mutable-state boundary, not a requirement to duplicate every platform resource. The intended invariant is: shared platform inputs and services are acceptable; shared mutable session state is not.
Session-exclusive mutable state: Each session owns its writable checkout or worktree, working branch, index and other mutable Git metadata, HOME, ACP/CLI state, configuration overlays, scratch space, session storage, credentials, and mutable caches. Other session Pods must not be able to read or modify that state.
Centrally managed read-only inputs: Every eligible worker Pod may consume the same organization-managed skills, policies, templates, and baseline configuration from a centrally governed repository. A cluster-owned runtime profile selects an observable, preferably version-pinned revision and delivers it through an image layer, read-only initialization copy, or read-only mount. Workers cannot modify the canonical source; generated skill state and session-specific overrides remain session-local.
Explicit shared resources: To control storage, startup, and compute cost, the profile may expose shared resources such as a source mirror, dependency or model cache, artifact store, model gateway, or another network service. Access is opt-in, least-privilege, and namespaced where mutable. A shared facility must not expose or accept another session's writable worktree, branch state, HOME, credentials, ACP/conversation state, session storage, or behavior-affecting mutable cache entries.
Worker Pods may share cluster nodes and deliberately multi-tenant services while retaining distinct Pods, cgroups, network namespaces, resource limits, and workload identities. Multiple session identities may receive the same scoped permission to a shared resource without becoming one shared identity.
Current behavior
I reviewed current main at 53061d6. My understanding is:
A first-message [[ws:...]] directive can choose a session working directory, but all of an agent's sessions still run inside the same long-lived OAB Pod. They share the Pod's mounted HOME/PVC, resource cgroup, network namespace, and workload identity boundary.
The Helm chart deliberately creates one Deployment replica per agent and hardcodes replicas: 1.
oabctl has a Kubernetes runtime schema, but both create and apply reject it as not implemented. Draft PR #1181 proposes an agent-level Deployment with one replica, rather than a dynamic worker Pod per session.
The ECS/oabctl shape is likewise one Fargate service/task per agent, with multiple ACP sessions inside that task.
Among the built-in/documented paths, AgentCore is the existing precedent for a remote, isolated session runtime: the broker still sees an ACP subprocess, while each session is backed by an independent microVM.
Therefore, I do not see a supported configuration today that maps each chat thread to a separate Kubernetes Pod. In particular, message_processing_mode = "per-thread" controls dispatch/batching rather than runtime isolation. Please correct any part of this reading that is wrong.
Required isolation and lifecycle contract
For this use case:
one Discord or Slack thread maps to one logical OABSession;
an OABSession owns at most one active Kubernetes worker Pod;
before an ACP process is created or initialized, the runtime provisions its session-exclusive writable HOME, checkout or worktree, working branch and mutable Git metadata, ACP/CLI state, and session storage and, on Kubernetes, its exclusive worker Pod and session-writable PVC;
no two sessions share a worker Pod, session-owned writable state, resource cgroup, network namespace, or workload identity/worker ServiceAccount; identical administrator-owned read-only inputs are allowed;
no ACP/CLI process belonging to one session can enumerate, read, write, or delete another session's local worktree or session-owned mutable state, whether by scanning the filesystem or using a known absolute path; this is enforced by the OS/runtime rather than agent instructions, and each ACP process starts with its own session checkout or worktree as cwd;
centrally managed skills, policies, templates, and baseline configuration may be supplied to every eligible Pod as administrator-controlled read-only inputs with an observable version;
explicitly configured shared resources are allowed for efficiency only through controlled interfaces whose authorization and namespacing prevent cross-session state leakage or influence;
isolation is enforced by the runtime and does not depend on an agent following branch, worktree, skill, or prompt instructions;
worker Pods do not receive Kubernetes API credentials (automountServiceAccountToken: false); only a trusted controller receives narrowly scoped create/delete/watch permissions;
a failed worker Pod may be replaced, but the logical session identity and thread mapping survive;
idle sessions stop after a configurable TTL;
cancel stops the in-flight ACP turn, while an explicit close terminates the worker and applies a configurable storage-retention policy.
Minimum acceptance test
Start sessions A and B from two different chat threads and confirm that the runtime assigns different worker Pod identities.
In A, create uniquely named, uncommitted sentinel files in the local worktree and HOME. Record their absolute paths and content hashes.
In A, create a local-only Git ref or branch that is not pushed to the remote.
From B's actual ACP/CLI execution environment, attempt to:
discover the sentinel files by scanning every writable mount;
run stat and cat against A's recorded absolute paths;
overwrite or delete those paths; and
discover or modify A's local-only Git ref.
B must receive ENOENT or EACCES, must not discover the sentinel contents or local-only ref, and must not change A's original content hashes.
Repeat the test with A and B reversed.
If centrally managed skills are shared, both sessions may read the same version, but a write attempt from either worker must fail with EROFS or EACCES.
Passing because the agent was instructed not to inspect another session is not acceptable. Isolation must hold for direct shell-level access attempts.
Desired configuration experience
The user-facing configuration could be as small as the following illustrative shape:
[session_runtime]
type = "kubernetes"profile = "isolated-worker"
The referenced profile would be owned by the cluster administrator and define the worker image/template, resource requests and limits, per-session storage, network policy, worker ServiceAccount policy, idle TTL, and optional runtimeClassName. It would classify resources as session-exclusive mutable state, administrator-owned versioned read-only inputs, or explicitly allowed shared resources with a declared access policy. Keeping those security-sensitive choices in a named cluster-side profile prevents an untrusted chat session from selecting its own identity, resource policy, or cross-session sharing boundary.
I am not attached to this schema. If an ACP bridge configured under [agent] is a better fit for OAB's thin-broker model, that would also meet the configuration-first goal.
Suggested incremental design
The lowest-risk first step appears to mirror the AgentCore bridge pattern:
Discord / Slack
-> OAB broker
-> per-thread kubernetes-acp stdio bridge
-> trusted session controller
-> one ACP worker Pod
From OAB's perspective, kubernetes-acp remains an ordinary ACP subprocess. The bridge calls a controller API using the OAB session key. The controller owns Pod/PVC reconciliation and narrow Kubernetes RBAC; the worker only speaks ACP through a relay and has no Kubernetes credentials.
This could start out of tree to validate cold-start latency, streaming, replacement, cleanup, and persistence semantics without committing OAB to a new core abstraction. If the contract proves generally useful, it could later become a first-class SessionRuntime abstraction with local-process, AgentCore, and Kubernetes implementations.
One caveat is that the current pool does not expose every lifecycle distinction to a bridge: idle eviction and hard reset can both eventually look like bridge process termination. A proof of concept can begin out of tree, but reliable close-versus-suspend semantics may require a small explicit lifecycle hook in core or the first-class runtime abstraction.
My preference would be to keep OABService agent/broker-level, as proposed in #1181, and introduce a separate session-level resource/controller only if durable in-cluster reconciliation is needed. An OABSession CRD could then persist the logical session key, generation, worker/PVC references, phase, and last-active time without changing the single-replica bot connection model.
Proposed persistence semantics
A minimal persistence contract could be:
The thread-to-logical-session mapping and runtime generation survive broker and controller restarts.
Reconciliation never leaves more than one active worker Pod for one logical session.
A replacement Pod reuses the session's retained PVC when storage retention is enabled.
ACP conversation restoration remains capability-dependent: use session/load when the agent supports it, and report a visible context reset when it does not.
Idle TTL removes compute first. Session metadata and storage may have a separate retention TTL.
Explicit close removes compute immediately and deletes or retains storage according to policy.
An in-flight turn is not assumed durable across worker failure; replacement restores the last durable ACP/workspace state and reports the interrupted turn clearly.
Questions for maintainers
Is session-level Kubernetes isolation within OAB's intended scope?
Would you prefer an out-of-tree ACP bridge/controller first, or a first-class runtime backend in openab-core?
Should the proposed OABService Kubernetes backend remain agent-level, with a separate OABSession resource/controller for dynamic session Pods?
Does the persistence contract above match how OAB wants session identity and session/load recovery to work?
Would a runtime profile that distinguishes session-exclusive mutable state, centrally managed read-only inputs such as skills, and explicitly allowed shared resources fit OAB's configuration model?
Would optional runtimeClassName support for Kata Containers or gVisor be acceptable as defense in depth for untrusted workers?
Related work
chaodu-agent (2026a) Session pool leaks memory: orphaned kiro-cli processes and no eviction [GitHub issue 309]. openabdev/openab, GitHub. Available at: Session pool leaks memory: orphaned kiro-cli processes and no eviction #309 (Accessed: 30 July 2026). This completed issue improved local-process lifecycle; its industry comparison also identifies container-per-session as the stronger long-term boundary.
chaodu-agent (2026b) docs: add docs/firecracker.md — Kata Containers + Firecracker microVM isolation [GitHub issue 736]. openabdev/openab, GitHub. Available at: docs: add docs/firecracker.md — Kata Containers + Firecracker microVM isolation #736 (Accessed: 30 July 2026). This open issue concerns complementary runtime hardening at the Pod boundary.
chaodu-agent (2026c) feat: agentcore-acp adapter + ADR for AgentCore Runtime backend [GitHub pull request 1069]. openabdev/openab, GitHub. Available at: feat: agentcore-acp adapter + ADR for AgentCore Runtime backend #1069 (Accessed: 30 July 2026). This merged pull request is the closest architectural precedent.
chaodu-agent (2026d) docs(adr): oabctl Kubernetes backend [GitHub pull request 1181]. openabdev/openab, GitHub. Available at: docs(adr): oabctl Kubernetes backend #1181 (Accessed: 30 July 2026). This open draft addresses agent-level deployment rather than session-level workers.
qijie850 (2026) feat: per-thread isolated working directories [GitHub issue 38]. openabdev/openab, GitHub. Available at: feat: per-thread isolated working directories #38 (Accessed: 30 July 2026). This open issue separates working-directory paths, not Pods, PVCs, cgroups, networks, or identities.
Proposal
Add an opt-in Kubernetes session runtime in which each Discord or Slack thread gets its own isolated worker Pod. The core requirement is that the ACP/CLI process for one thread cannot enumerate, read, write, or delete another thread's local worktree or other session-owned mutable state, even if it knows that state's path.
The desired operator experience is configuration-first. An operator should be able to select a Kubernetes session runtime, or a named cluster-owned runtime profile, without writing a custom dispatcher. The exact configuration schema is open for discussion; the important contract is one logical OAB session to at most one active worker Pod.
This boundary applies to execution and mutable session state. It still permits administrator-managed read-only inputs, including centrally managed skills, and explicitly configured shared services or caches.
Requirement boundary
This RFC concerns OS/runtime-enforced filesystem isolation between ACP/CLI execution sessions, not ingress-level isolation of Discord or Slack events. OAB may receive a bot mention, inspect it, and route it by thread. Preventing the raw event from entering the OAB event-handling process is out of scope.
When thread A maps to session A and thread B maps to session B, session A's ACP/CLI process must be unable to enumerate, read, write, or delete session B's local checkout or worktree, uncommitted files, mutable Git metadata, HOME, credentials, ACP/CLI state, scratch space, mutable caches, or other session-owned mutable state. The same requirement applies in reverse, even if either session knows the other session's absolute paths.
This boundary must exist before the first prompt reaches ACP/CLI and must be enforced by the OS/runtime. Branch naming, Git worktree conventions, skills, prompt instructions, or admission filtering inside OAB are not substitutes for the boundary.
"Branch isolation" in this RFC means isolation of each session's local checkout or worktree, uncommitted changes, and mutable Git state. It does not require hiding committed history or remote branches that the session's repository credentials are already authorized to fetch. Administrator-managed skills and other common inputs may remain shared when exposed read-only.
Current problem and required boundary
The target topology below is illustrative. The broker and controller may be separate or combined; the required property is the OS/runtime-enforced absence of a path between session-private writable states.
Community discussion
Canonical Discord discussion in
#contributingInitial announcement in
#general(superseded as the discussion venue)The RFC was initially shared in
#generalbased on earlier project guidance, then reposted in#contributingafter reviewing the current contribution-discussion convention. Any decisions or scope changes from the canonical discussion will be summarized in this issue so GitHub remains the source of truth.Organizational use case
A large group in my organization is replacing the foundational agent-execution infrastructure of an internal system inspired by Stripe's Minions. We are evaluating OAB as the chat-facing broker while preserving the existing operational boundary: one isolated, disposable runtime per work session.
This is not a request to copy Stripe's implementation. It explains why separate ACP processes, branches, or working directories inside one shared Pod are not a sufficient boundary for this migration.
Why worktrees alone are insufficient
Each Git-backed session should receive a Pod-local writable checkout or worktree and its own working branch. This is a required layer of repository isolation, but it cannot by itself provide the requested runtime boundary in current OAB. For a first message, the dispatcher creates or obtains the session before forwarding the prompt; unless the user selects an existing workspace with a
[[ws:...]]directive,SessionPoolstarts and initializes the ACP child in the agent-wide working directory and callssession/new(pool.rs). A branch/worktree skill runs only after that process has started and after the first prompt reaches the agent, so even perfect compliance cannot retroactively isolate startup.Git documents linked worktrees as sharing everything except certain per-worktree files such as
HEADandindex; common refs, repository configuration, objects, and$GIT_COMMON_DIRremain shared. A worktree therefore provides workflow separation, not an access-control boundary.There is therefore a pre-worktree window in which a session can load steering or configuration from a shared checkout and writable HOME. Even after separate worktrees are created, processes in the same Pod can still observe or alter shared PVC contents, Git common metadata, filesystem-backed credentials, CLI configuration, hooks, plugins, and caches. They also remain inside the same resource and network boundary. This does not mean that every broker environment variable is inherited: OAB uses
env_clear()and restores only baseline plus configured or selected inherited variables. The required boundary must be enforced by the runtime before the ACP process is created and before it begins handling the first human message; it cannot depend on an agent following a skill or instruction.Isolation and intentional sharing model
The worker Pod is the per-thread execution and mutable-state boundary, not a requirement to duplicate every platform resource. The intended invariant is: shared platform inputs and services are acceptable; shared mutable session state is not.
Worker Pods may share cluster nodes and deliberately multi-tenant services while retaining distinct Pods, cgroups, network namespaces, resource limits, and workload identities. Multiple session identities may receive the same scoped permission to a shared resource without becoming one shared identity.
Current behavior
I reviewed current
mainat53061d6. My understanding is:<platform>:<thread_id>.SessionPoolcreates oneAcpConnectionand local CLI subprocess per thread.[[ws:...]]directive can choose a session working directory, but all of an agent's sessions still run inside the same long-lived OAB Pod. They share the Pod's mounted HOME/PVC, resource cgroup, network namespace, and workload identity boundary.SessionPoolalready persists thread-to-ACP-session mappings, attemptssession/loadwhen supported, and has idle TTL, cancel, and reset lifecycle paths. These manage local ACP processes and IDs; they do not persist or reconcile a Kubernetes worker mapping.replicas: 1.oabctlhas a Kubernetes runtime schema, but bothcreateandapplyreject it as not implemented. Draft PR #1181 proposes an agent-level Deployment with one replica, rather than a dynamic worker Pod per session.Therefore, I do not see a supported configuration today that maps each chat thread to a separate Kubernetes Pod. In particular,
message_processing_mode = "per-thread"controls dispatch/batching rather than runtime isolation. Please correct any part of this reading that is wrong.Required isolation and lifecycle contract
For this use case:
OABSession;OABSessionowns at most one active Kubernetes worker Pod;cwd;automountServiceAccountToken: false); only a trusted controller receives narrowly scoped create/delete/watch permissions;Minimum acceptance test
statandcatagainst A's recorded absolute paths;ENOENTorEACCES, must not discover the sentinel contents or local-only ref, and must not change A's original content hashes.EROFSorEACCES.Passing because the agent was instructed not to inspect another session is not acceptable. Isolation must hold for direct shell-level access attempts.
Desired configuration experience
The user-facing configuration could be as small as the following illustrative shape:
The referenced profile would be owned by the cluster administrator and define the worker image/template, resource requests and limits, per-session storage, network policy, worker ServiceAccount policy, idle TTL, and optional
runtimeClassName. It would classify resources as session-exclusive mutable state, administrator-owned versioned read-only inputs, or explicitly allowed shared resources with a declared access policy. Keeping those security-sensitive choices in a named cluster-side profile prevents an untrusted chat session from selecting its own identity, resource policy, or cross-session sharing boundary.I am not attached to this schema. If an ACP bridge configured under
[agent]is a better fit for OAB's thin-broker model, that would also meet the configuration-first goal.Suggested incremental design
The lowest-risk first step appears to mirror the AgentCore bridge pattern:
From OAB's perspective,
kubernetes-acpremains an ordinary ACP subprocess. The bridge calls a controller API using the OAB session key. The controller owns Pod/PVC reconciliation and narrow Kubernetes RBAC; the worker only speaks ACP through a relay and has no Kubernetes credentials.This could start out of tree to validate cold-start latency, streaming, replacement, cleanup, and persistence semantics without committing OAB to a new core abstraction. If the contract proves generally useful, it could later become a first-class
SessionRuntimeabstraction with local-process, AgentCore, and Kubernetes implementations.One caveat is that the current pool does not expose every lifecycle distinction to a bridge: idle eviction and hard reset can both eventually look like bridge process termination. A proof of concept can begin out of tree, but reliable close-versus-suspend semantics may require a small explicit lifecycle hook in core or the first-class runtime abstraction.
My preference would be to keep
OABServiceagent/broker-level, as proposed in #1181, and introduce a separate session-level resource/controller only if durable in-cluster reconciliation is needed. AnOABSessionCRD could then persist the logical session key, generation, worker/PVC references, phase, and last-active time without changing the single-replica bot connection model.Proposed persistence semantics
A minimal persistence contract could be:
session/loadwhen the agent supports it, and report a visible context reset when it does not.Questions for maintainers
openab-core?OABServiceKubernetes backend remain agent-level, with a separateOABSessionresource/controller for dynamic session Pods?session/loadrecovery to work?runtimeClassNamesupport for Kata Containers or gVisor be acceptable as defense in depth for untrusted workers?Related work
openabdev/openab, GitHub. Available at: Session pool leaks memory: orphaned kiro-cli processes and no eviction #309 (Accessed: 30 July 2026). This completed issue improved local-process lifecycle; its industry comparison also identifies container-per-session as the stronger long-term boundary.openabdev/openab, GitHub. Available at: docs: add docs/firecracker.md — Kata Containers + Firecracker microVM isolation #736 (Accessed: 30 July 2026). This open issue concerns complementary runtime hardening at the Pod boundary.openabdev/openab, GitHub. Available at: feat: agentcore-acp adapter + ADR for AgentCore Runtime backend #1069 (Accessed: 30 July 2026). This merged pull request is the closest architectural precedent.openabdev/openab, GitHub. Available at: docs(adr): oabctl Kubernetes backend #1181 (Accessed: 30 July 2026). This open draft addresses agent-level deployment rather than session-level workers.openabdev/openab, GitHub. Available at: feat: per-thread isolated working directories #38 (Accessed: 30 July 2026). This open issue separates working-directory paths, not Pods, PVCs, cgroups, networks, or identities.