Skip to content

sandbox_child_nproc_limit` (PR #1497) merged 2026-05-27 but absent from all release binaries through v0.0.82 #2339

Description

@strongchang

Agent Diagnostic

  • Investigated with Claude (agent-driven diagnosis on a 19-sandbox Docker-driver fleet)
  • Tested OpenShell v0.0.72 (CLI/gateway/sandbox from GitHub release assets, x86_64-unknown-linux-gnu)
  • Checked latest releases: downloaded release assets v0.0.74/76/78/80/82 and scanned both
    openshell-gateway and openshell-sandbox binaries with strings — no
    sandbox_child_nproc_limit / nproc_limit / RLIMIT_NPROC-related config token in any of them
    (only Z3 "inprocess" noise in the gateway)
  • Cross-checked GitHub: PR Make sandbox child nproc limit configurable #1497 merged into main 2026-05-27 (commit 9bfcad4); the
    branch_commits/tag-containment view lists it as reachable from v0.0.51+, contradicting the
    binary contents
  • Functional test on v0.0.72: added sandbox_child_nproc_limit = 4096 under
    [openshell.drivers.docker] and [openshell.gateway] — gateway starts either way, but a bogus
    test field is also silently accepted in both tables, so acceptance proves nothing
  • Recreated a sandbox from scratch after the config change: in-sandbox sessions still show
    Max processes 512 in /proc//limits
  • Searched existing issues for sandbox_child_nproc_limit / nproc: found fix(sandbox): use cgroup pids controller instead of RLIMIT_NPROC on K8s #1390 / fix(sandbox): use cgroup pids controller instead of RLIMIT_NPROC on K8s #1325
    (shared-UID fleet reports) and PR Make sandbox child nproc limit configurable #1497 itself, but no issue about the feature missing from
    release binaries
  • Cannot upgrade to a fixed version because no published release contains the feature (verified
    through v0.0.82)

Description

Summary

PR #1497 ("Make sandbox child nproc limit configurable", merged into main on 2026-05-27 as commit 9bfcad4) adds the sandbox_child_nproc_limit setting to lift the hardcoded RLIMIT_NPROC=512 for shared-UID fleet deployments. GitHub's tag-containment view lists the commit as reachable from tags v0.0.51 onward, but the published release binaries do not contain the feature.

Evidence

  1. String scan: strings openshell-gateway | grep -i nproc (and the same for openshell-sandbox) on release assets v0.0.72, v0.0.74, v0.0.76, v0.0.78, v0.0.80, v0.0.82 (*-x86_64-unknown-linux-gnu.tar.gz) shows no nproc_limit / RLIMIT_NPROC / sandbox_child_nproc token — only Z3 inprocess noise in the gateway.
  2. Functional test on v0.0.72 (Docker driver): adding sandbox_child_nproc_limit = 4096 under [openshell.drivers.docker] or [openshell.gateway] is silently accepted (note: a bogus test field is also silently accepted in both tables, so unknown TOML fields appear to be ignored), and a freshly recreated sandbox still shows Max processes 512 for all in-sandbox sessions.

Expected

A published release ships PR #1497, so sandbox_child_nproc_limit = 4096 (or 0 to defer to the container cgroup pids limit) takes effect for newly created sandbox sessions.

Questions

  1. Which release is expected to ship PR Make sandbox child nproc limit configurable #1497?
  2. Are the GitHub release assets built from a branch other than the tagged main history? (Tag-containment view vs. binary content disagree.)
  3. Is the silent acceptance of unknown fields in [openshell.gateway] / [openshell.drivers.docker] intended? v0.0.54 notes say unknown fields in nested gateway config tables are rejected.

Context / impact

19-sandbox single-host fleet (Docker driver); all sandbox inner sessions share one UID. At ~30–50 threads per sandbox the fleet saturates the hardcoded 512 and any new fork fails with EAGAIN (see also #1390 / #1325). We currently mitigate with a periodic prlimit --nproc=8192 systemd timer and would like to retire it.

Environment: openshell 0.0.72 (CLI/gateway/sandbox from GitHub release assets), Docker driver, Ubuntu host, NemoClaw v0.0.81+ (source main).

Reproduction Steps

Summary

PR #1497 ("Make sandbox child nproc limit configurable", merged into main on 2026-05-27 as commit 9bfcad4) adds the sandbox_child_nproc_limit setting to lift the hardcoded RLIMIT_NPROC=512 for shared-UID fleet deployments. GitHub's tag-containment view lists the commit as reachable from tags v0.0.51 onward, but the published release binaries do not contain the feature.

Evidence

  1. String scan: strings openshell-gateway | grep -i nproc and same for openshell-sandbox from release assets v0.0.72, v0.0.74, v0.0.76, v0.0.78, v0.0.80, v0.0.82 (*-x86_64-unknown-linux-gnu.tar.gz) show no nproc_limit / RLIMIT_NPROC / sandbox_child_nproc token (only Z3 inprocess noise in the gateway).
  2. Functional test on v0.0.72 (Docker driver): adding sandbox_child_nproc_limit = 4096 under [openshell.drivers.docker] or [openshell.gateway] is silently accepted (note: unknown TOML fields appear to be silently ignored in both tables — a bogus test field is also accepted), and a freshly recreated sandbox still shows Max processes 512 for all in-sandbox sessions.

Questions

  1. Which release is expected to ship PR Make sandbox child nproc limit configurable #1497?
  2. Are the GitHub release assets built from a branch other than the tagged main history? (Tag-containment view vs. binary content disagree.)
  3. Is the silent acceptance of unknown fields in [openshell.gateway] / [openshell.drivers.docker] intended? v0.0.54 notes say unknown fields in nested gateway config tables are rejected; that made our config validation attempts inconclusive.

Context / impact

19-sandbox single-host fleet, all sandbox inner sessions share one UID; at ~30–50 threads per sandbox the fleet saturates the hardcoded 512 and any new fork fails with EAGAIN (see also #1390 / #1325). We currently mitigate with a periodic prlimit --nproc=8192 systemd timer and would like to retire it.

Environment: openshell 0.0.72 (CLI/gateway/sandbox from GitHub release assets), Docker driver, Ubuntu host, NemoClaw v0.0.81+ (source main).

Environment

Logs

# String scan of v0.0.82 release assets (same result for v0.0.74–v0.0.80 and v0.0.72):
$ strings openshell-gateway | grep -ioE "[a-z_]*nproc[a-z_]*" | sort -u
inprocess
inprocessing
(only Z3 solver noise; no config token)
$ strings openshell-sandbox | grep -ioE "[a-z_]*nproc[a-z_]*" | sort -u
(no matches)
$ grep -ac "nproc_limit" openshell openshell-gateway openshell-sandbox
openshell:0
openshell-gateway:0
openshell-sandbox:0

# Functional test on v0.0.72: config accepted, no effect
$ grep -n nproc openshell-gateway.toml
32:sandbox_child_nproc_limit = 4096
$ pgrep -af openshell-gateway   # gateway starts fine with the field present
2592034 openshell-gateway[nemoclaw=nemoclaw;port=8080]

# Freshly recreated sandbox after the config change:
$ docker exec <sandbox> sh -c 'for p in $(pgrep -f "hermes|socat"|head -3); do grep -i processes /proc/$p/limits; done'
Max processes             512                  512                  processes
Max processes             512                  512                  processes
Max processes             512                  512                  processes

# Bogus-field control test (shows unknown fields are silently ignored, both tables):
$ grep -n bogus openshell-gateway.toml
33:bogus_test_field_xyz = 1
$ pgrep -af openshell-gateway   # still starts
2592100 openshell-gateway[nemoclaw=nemoclaw;port=8080]

Agent-First Checklist

  • I pointed my agent at the repo and had it investigate this issue
  • I loaded relevant skills (e.g., debug-openshell-cluster, debug-inference, openshell-cli)
  • I checked the latest OpenShell release and either reproduced the issue there or explained why I cannot upgrade/test it
  • I searched existing issues for possible duplicates or explained why I could not
  • My agent could not resolve this — the diagnostic above explains why

Metadata

Metadata

Assignees

No one assigned

    Labels

    state:triage-neededOpened without agent diagnostics and needs triage

    Type

    Fields

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions